Current time: 23.11.2024, 03:37 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Вопросы по моддингу
» (обсуждаем моддинг здесь)
Author Message
SergOz Offline

Posts: 1315
Post: #1711

Raistlin, странно, что не срабатывает генерация ивента. Может нужны дополнительные настройки после UN:I с помощью !!LE#1/#2/#3:XXXX;
Ещё, как вариант, можно попробовать пометить клетку в !!PO и потом через !?HM вызвать код скрипта, если событие активирует герой.


Карта-мод "Война на Холсте"
09.02.2021 20:38
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1349
Post: #1712

SergOz, я подозреваю, что триггеры регистрируются до инциализации переменных, а потому там происходит интерпретация мусора, которая не ведет ни к чему хорошему. Если же самостоятельно задавать координаты триггера, то все работает нормально, из чего, кстати, можно сделать вывод, что установка события с помощью UN:I работает корректно.

Quote:Ещё, как вариант, можно попробовать пометить клетку в !!PO и потом через !?HM вызвать код скрипта, если событие активирует герой.
Использование !!PO - это так себе вариант, лучше будет координаты проверять. Правда, я бы очень не хотел использовать !?HM, так как он медленно работает. Пару команд повесишь - и все, фризы. Было бы крайне желательно найти альтернативное решение.


Создал новый глобальный мод: WoG Ultra Edition
09.02.2021 21:48
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #1713

Raistlin, а что за задача стоит?


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
09.02.2021 23:46
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1349
Post: #1714

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

P.S. Конкатенация строк, разумеется, будет происходить не так, я это для удобства написал 96-copy


Создал новый глобальный мод: WoG Ultra Edition
10.02.2021 00:58
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2356
Post: #1715

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

Альтернатива - только встраивание кода на примере триггера вог-функции 30400 из WERD. Либо полностью отказаться от медленного ERM в пользу, например, lua или создания оригинальных игровых событий на карте с последующим их хуком.
10.02.2021 01:19
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #1716

Raistlin, будет, но это плохая затея. Обработчики глобальные. Здесь скорее нужно мне добавлять глобальный триггер OnLocalEvent, в который параметрами передавать координаты.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
10.02.2021 01:25
Find all posts by this user Quote this message in a reply
SergOz Offline

Posts: 1315
Post: #1717

Raistlin, так а что мешает поместить в эти места арты или другие объекты, взаимодействие с которыми и будет триггером? Или это место должно быть типа тайным?


Карта-мод "Война на Холсте"
10.02.2021 01:28
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1349
Post: #1718

XEPOMAHT, с хуками я разобрался - раньше тупил, конечно, но сейчас уже понимаю, что к чему. Помните мой бредокод, "добавляющий" Колизей Магов? Глядите, как он похорошел 96-copy
Реализация Колизея Магов в моем плагине (Click to View)

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

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

SergOz, проблема не в помещении объекта, а в создании для него триггера. И, да, такие места действительно должны быть тайными, чтобы игрок в начале игры не знал, где их искать.


Создал новый глобальный мод: WoG Ultra Edition
(This post was last modified: 10.02.2021 13:50 by Raistlin.)
10.02.2021 13:46
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2356
Post: #1719

(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
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1349
Post: #1720

(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 в ней нет.
А что делает эта команда в данном контексте? Служит индикатором по типу "далее идет то, что для каких-то нужд "сохранялось" в функции"?


Создал новый глобальный мод: WoG Ultra Edition
10.02.2021 15:25
Find all posts by this user Quote this message in a reply
igrik Offline

Posts: 2819
Post: #1721

(10.02.2021 15:02)XEPOMAHT Wrote:  1. Например избавиться от ExecErmCmd. Считаю, что применение ERM должно быть в ERM-скриптах, но не в коде на Си.
2. Читаемость так же не очень, например не видны проверки на ИИ. Аббревиатуры типа "xyz" тоже не известно о чём.
1. Полностью согласен. Не нужно мешать мухи и котлеты.
2. "xyz" в публичной версии базы это пакованные координаты.


game bug fixes extended.dll || My Plugins || My GitHub
10.02.2021 15:42
Visit this user's website Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1349
Post: #1722

igrik, я тоже согласен, честное слово! Изначально у меня это место вообще вот так выглядело: bool isMagical = obj.os_type; //0 или 1
Когда удастся найти причину проблемы, я, разумеется, все переделаю.

Quote:2. "xyz" в публичной версии базы это пакованные координаты.
Спасибо, буду знать. Кстати, а что Вы подразумевали под публичной версией?


Создал новый глобальный мод: WoG Ultra Edition
10.02.2021 16:13
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2356
Post: #1723

(10.02.2021 15:25)Raistlin Wrote:  По идее не должен, но получить данные я не могу...

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

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

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

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

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

Пишет что-нибудь в стек. Например содержимое каких-нибудь регистров.
(This post was last modified: 10.02.2021 16:19 by XEPOMAHT.)
10.02.2021 16:15
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1349
Post: #1724

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

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

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

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

Quote:Пишет что-нибудь в стек. Например содержимое каких-нибудь регистров.
Это я знаю, мой вопрос заключался немного в другом: почему до выполнения кода функции, работающей со стеком, нужно записывать туда какие-то данные, например, из какого-то регистра?
10.02.2021 17:00
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1349
Post: #1725

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


Создал новый глобальный мод: WoG Ultra Edition
10.02.2021 17:10
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group