Wake of Gods Forum | Форум Во Имя Богов

Full Version: Вопросы по моддингу
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Raistlin, странно, что не срабатывает генерация ивента. Может нужны дополнительные настройки после UN:I с помощью !!LE#1/#2/#3:XXXX;
Ещё, как вариант, можно попробовать пометить клетку в !!PO и потом через !?HM вызвать код скрипта, если событие активирует герой.
SergOz, я подозреваю, что триггеры регистрируются до инциализации переменных, а потому там происходит интерпретация мусора, которая не ведет ни к чему хорошему. Если же самостоятельно задавать координаты триггера, то все работает нормально, из чего, кстати, можно сделать вывод, что установка события с помощью UN:I работает корректно.

Quote:Ещё, как вариант, можно попробовать пометить клетку в !!PO и потом через !?HM вызвать код скрипта, если событие активирует герой.
Использование !!PO - это так себе вариант, лучше будет координаты проверять. Правда, я бы очень не хотел использовать !?HM, так как он медленно работает. Пару команд повесишь - и все, фризы. Было бы крайне желательно найти альтернативное решение.
Raistlin, а что за задача стоит?
После генерации карты специальный алгоритм выберет несколько мест (в зависимости от ландшафта), где должно будет появляться некоторое событие (игроку будет предложено сразиться, и наградой будет особый артефакт). Как это все организовать, я знаю, единственное, что пока непонятно, - это как реализовать срабатывание триггера. Сейчас у меня есть идея, но я не уверен, что она сработает: возможно мне надо в плагине вызвать функцию RegisterHandler внутри "триггера" PI (функции OnAfterErmInstructions), до этого сгенерировав координаты и передав их ей в качестве второго параметра ("OnLocalEvent" + _X "/" + _Y + "/" + _Z). Вы случайно не знаете, будет такой способ работать, или вызывать функцию RegisterHandler на этом этапе уже нельзя?

P.S. Конкатенация строк, разумеется, будет происходить не так, я это для удобства написал 96-copy
(09.02.2021 21:48)Raistlin Wrote: [ -> ]Правда, я бы очень не хотел использовать !?HM, так как он медленно работает. Пару команд повесишь - и все, фризы. Было бы крайне желательно найти альтернативное решение.

Альтернатива - только встраивание кода на примере триггера вог-функции 30400 из WERD. Либо полностью отказаться от медленного ERM в пользу, например, lua или создания оригинальных игровых событий на карте с последующим их хуком.
Raistlin, будет, но это плохая затея. Обработчики глобальные. Здесь скорее нужно мне добавлять глобальный триггер OnLocalEvent, в который параметрами передавать координаты.
Raistlin, так а что мешает поместить в эти места арты или другие объекты, взаимодействие с которыми и будет триггером? Или это место должно быть типа тайным?
XEPOMAHT, с хуками я разобрался - раньше тупил, конечно, но сейчас уже понимаю, что к чему. Помните мой бредокод, "добавляющий" Колизей Магов? Глядите, как он похорошел 96-copy
Реализация Колизея Магов в моем плагине (Click to View)

Если Вы знаете, какая функция в WERD способна разрешить мою проблему, то не могли бы Вы прислать ее код прямо сюда, чтобы я не тратил на поиск в три раза больше времени? Кстати, вопрос не по скриптам, мне просто интересно понять стоящую за этим логику: почему код любой функции начинается с команды PUSH? Подскажите пожалуйста. Ab

Berserker, если Вы добавите, будет здорово 132

SergOz, проблема не в помещении объекта, а в создании для него триггера. И, да, такие места действительно должны быть тайными, чтобы игрок в начале игры не знал, где их искать.
(10.02.2021 13:46)Raistlin Wrote: [ -> ]Помните мой бредокод, "добавляющий" Колизей Магов? Глядите, как он похорошел 96-copy

Стало лучше, но есть что лучше всё-таки доработать:

1. Например избавиться от ExecErmCmd. Считаю, что применение ERM должно быть в ERM-скриптах, но не в коде на Си.
2. Читаемость так же не очень, например не видны проверки на ИИ. Аббревиатуры типа "xyz" тоже не известно о чём.
3. Хук на 49E440 не должен портить регистры оригинального вызова. Т.е. в _MapItem_ должен оставаться _MapItem_ и там не должно быть мусора.

(10.02.2021 13:46)Raistlin Wrote: [ -> ]Если Вы знаете, какая функция в WERD способна разрешить мою проблему, то не могли бы Вы прислать ее код прямо сюда, чтобы я не тратил на поиск в три раза больше времени?

WERD - хук на все триггеры в WoG с проверкой номера триггера и выполнением ассемблерного кода на его основе. Берсеркер против этого, но в ERA+ уже так сделано (по идее, нужно переделывать под эровские события, но я боюсь, что после этого код сыпанётся, т.к. опыта работе с эровскими событиями у меня нет никакого). Номер триггера на передвижения героя - 30400 (т.е. на ERM это !?FU30400).

(10.02.2021 13:46)Raistlin Wrote: [ -> ]почему код любой функции начинается с команды PUSH?

Не любой, а только той, в которой используется стек. Если стек функция не меняет, то команды PUSH в ней нет.
(10.02.2021 15:02)XEPOMAHT Wrote: [ -> ]Стало лучше, но есть что лучше всё-таки доработать:

Хук на 49E440 не должен портить регистры оригинального вызова. Т.е. в _MapItem_ должен оставаться _MapItem_ и там не должно быть мусора.
По идее не должен, но получить данные я не могу... Если бы мог, то конечно отказался бы от ERM'а. Изначально, кстати, его и не было даже, но потом я заметил, что там что-то не клеится...

Quote:Читаемость так же не очень, например не видны проверки на ИИ.
А ведь верно, надо добавить.

Quote:Аббревиатуры типа "xyz" тоже не известно о чём.
Я сам не знаю, что это за параметр, я просто скопировал его из базы для IDA. Ab

Quote:WERD - хук на все триггеры в WoG с проверкой номера триггера и выполнением ассемблерного кода на его основе. Берсеркер против этого, но в ERA+ уже так сделано (по идее, нужно переделывать под эровские события, но я боюсь, что после этого код сыпанётся, т.к. опыта работе с эровскими событиями у меня нет никакого). Номер триггера на передвижения героя - 30400 (т.е. на ERM это !?FU30400).
Я понял, спасибо!

Quote:Не любой, а только той, в которой используется стек. Если стек функция не меняет, то команды PUSH в ней нет.
А что делает эта команда в данном контексте? Служит индикатором по типу "далее идет то, что для каких-то нужд "сохранялось" в функции"?
(10.02.2021 15:02)XEPOMAHT Wrote: [ -> ]1. Например избавиться от ExecErmCmd. Считаю, что применение ERM должно быть в ERM-скриптах, но не в коде на Си.
2. Читаемость так же не очень, например не видны проверки на ИИ. Аббревиатуры типа "xyz" тоже не известно о чём.
1. Полностью согласен. Не нужно мешать мухи и котлеты.
2. "xyz" в публичной версии базы это пакованные координаты.
igrik, я тоже согласен, честное слово! Изначально у меня это место вообще вот так выглядело: bool isMagical = obj.os_type; //0 или 1
Когда удастся найти причину проблемы, я, разумеется, все переделаю.

Quote:2. "xyz" в публичной версии базы это пакованные координаты.
Спасибо, буду знать. Кстати, а что Вы подразумевали под публичной версией?
(10.02.2021 15:25)Raistlin Wrote: [ -> ]По идее не должен, но получить данные я не могу...

Значит хук установлен неправильно. В таком виде, в, котором он установлен сейчас, он должен находится совсем в другом месте. Намекаю, что нельзя так бездумно ставить хуки прямо на любой код.

Вообще, установка хуков прямо на начало функций - удел либо профессиональных программистов, либо бессовестных лентяев. Т.к. при этом можно очень легко испортить стек и словить утечки памяти и разнообразные нарушения работы родительских функций.

(10.02.2021 15:25)Raistlin Wrote: [ -> ]Я сам не знаю, что это за параметр, я просто скопировал его из базы для IDA. Ab

Учитесь разбирать код. Всё то, что написано в базе IDA - не всё правда. Т.к. в одну и ту же переменную могут быть записываться совершенно разные данные (т.к. на самом деле это не переменная, а участок стековой памяти). В данном случае никакие пакованные координаты на функцию посещения арены не передаются (они там и не нужны).

(10.02.2021 15:25)Raistlin Wrote: [ -> ]А что делает эта команда в данном контексте? Служит индикатором по типу "далее идет то, что для каких-то нужд "сохранялось" в функции"?

Пишет что-нибудь в стек. Например содержимое каких-нибудь регистров.
(10.02.2021 16:15)XEPOMAHT Wrote: [ -> ]Намекаю, что нельзя так бездумно ставить хуки прямо на любой код.
Замётано Ab

Quote:Значит хук установлен неправильно. В таком виде, в, котором он установлен сейчас, он должен находится совсем в другом месте.

Вообще, установка хуков прямо на начало функций - удел либо профессиональных программистов, либо бессовестных лентяев. Т.к. при этом можно очень легко испортить стек и словить утечки памяти и разнообразные нарушения работы родительских функций.
Я пользуюсь готовым API, где, по идее, все потенциальные проблемы уже решены. Впрочем, я только что поигрался с перемещением и изменением хука, но мне это мало что дало. Если Вы знаете, куда нужно ставить хук (хотя-бы примерно, я разберусь), то я очень прошу Вас поделиться со мной этой информацией.

Quote:Учитесь разбирать код. Всё то, что написано в базе IDA - не всё правда. Т.к. в одну и ту же переменную могут быть записываться совершенно разные данные (т.к. на самом деле это не переменная, а участок стековой памяти). В данном случае никакие пакованные координаты на функцию посещения арены не передаются (они там и не нужны).
Я учусь... Просто в данном случае эта переменная показалась мне неважной, вот я и оставил все как есть...

Quote:Пишет что-нибудь в стек. Например содержимое каких-нибудь регистров.
Это я знаю, мой вопрос заключался немного в другом: почему до выполнения кода функции, работающей со стеком, нужно записывать туда какие-то данные, например, из какого-то регистра?
Quote:почему до выполнения кода функции, работающей со стеком, нужно записывать туда какие-то данные, например, из какого-то регистра?
Погуглил и разобрался. Ab
Reference URL's