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

Full Version: Исследование героев
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Quote:+) Добавлено новое событие 77010: Any Hero Interruction (аналог !?HE для всех героев). Параметры события: Герой-Инициатор, Герой-Цель.
Событие, как и оригинальное !?HL, возникает дважды: до и после взаимодействия.
Пример:
!?FU77010;
!!SN:X?y1/?y2;
!!IF:M^Initiator: %Y1, Target: %Y2^;
Не то?
Гм, откуда это? Из Era.chm? Мне сейчас интересна не сама функция, а принцип поиска нужных значений для самой функции и ее создание. Пытаюсь учиться.
Из хэлпа по изменениям в Эре 1.8. А так верно идёшь, находишь триггер !?HE ZVS, там он генерит событие в зависимости от нового героя. Ищешь, в каких регистрах герой-источник, герой-приёмник и пишешь свою реализацию. Код из Эры:

Code:
PROCEDURE Hook_HeroesMeet_Call; ASSEMBLER; {$FRAME-}
ASM
    // Если триггер - !?OB, то возвращаемся
    CMP DWORD [EBP+$1C], 34
    JNE @@Exit
    // Получаем номер героя-инициатора
    MOV EAX, [$69CCFC]
    MOV EAX, [EAX+4]
    MOV DWORD [General.EventParams], EAX
    // Получаем номер цели
    LEA ECX, [ECX-30100]
    MOV DWORD [General.EventParams+4], ECX
    // Генерируем ЕРМ-событие
    PUSHAD
    PUSH General.C_ERA_EVENT_HEROMEET
    CALL General.GenerateCustomErmEvent
    POPAD
    // Возвращаем управление ZVS
    @@Exit:
    PUSH $74D760
    PUSH $74C816
END; // .procedure Hook_HeroesMeet_Call

// Патчим вызов триггера !?HE
General.HookCode(POINTER($74D75B), @Hook_HeroesMeet_Call, General.C_HOOKTYPE_JUMP, 5);
Bers, я сейчас писал, что я нашел место, где сравнивается номер героя с 0 и со 155. Но это для того, чтобы игра знала, выдавать или не выдавать сообщение об ошибке в духе "баран, героя номер -1 в природе не существует!!111". А мне теперь нужно от этого перейти непосредственно к триггеру !?HE... Вот это-то и представляет сложность: я не знаю соли.
Что-то я не понял, как вообще написать dll для создания триггера?

В смысле что надо сделать, чтобы она работала, и по известному мне адресу выполнялся написанный мной код?
См. исходник MoP'a. Мне вот куда интереснее, как найти адрес для хука.
GhostManSD Wrote:См. исходник MoPa.
Там есть какие-то непонятные мне константы.
А когда я попробовал просто заменить адрес и код на свой, это работать отказалось.
Так адрес не любой нужен, а тот, что нарыт в ассемблере.
Так я и нарыл.
Посмотри ещё исходники Эры.
Всё, получилось.
Так, ошибку при чтении игрой команды "!?HE-1;" затёр. Если кому нужно, вот исходник. Код, на самом-то деле, ничтожен, но приятно, что хоть это сумел...
Подскажите, пожалуйста, как всё-таки искать оригинальный триггер !?HE. Часа четыре пытался что-нибудь сообразить, но никак.
GhostManSD, такие вещи проще и универсальнее через бинарные патчи делать. Например, нужно занопить 5 байт: адрес 9090909090.
Berserker, спасибо! Осталось теперь узнать, как это делать...
Добавлено:
А с поиском триггера никто не подскажет?
Quote:Осталось теперь узнать, как это делать...
Создаёшь txt файл, в котором пишешь: адрес байты в хекс-формате. Далее BinGen.exe file.txt => file.bin. Бинарный файл просто кидаешь в папку EraPlugins.
Reference URL's