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;" затёр. Если кому нужно, вот исходник. Код, на самом-то деле, ничтожен, но приятно, что хоть это сумел...
Code:
PROCEDURE HOOK_Error_HeroMeeting; ASSEMBLER; {$FRAME-}
ASM
PUSHAD
PUSH 90002
MOV EAX, $74CE30
CALL EAX
ADD ESP, 4
POPAD
CMP DWORD PTR SS:[EBP-108],-1
PUSH $74AE59
END;
Подскажите, пожалуйста, как всё-таки искать оригинальный триггер !?HE. Часа четыре пытался что-нибудь сообразить, но никак.
GhostManSD, такие вещи проще и универсальнее через бинарные патчи делать. Например, нужно занопить 5 байт: адрес 9090909090.
Berserker, спасибо! Осталось теперь узнать, как это делать...
Добавлено:
А с поиском триггера никто не подскажет?
Quote:Осталось теперь узнать, как это делать...
Создаёшь txt файл, в котором пишешь: адрес байты в хекс-формате. Далее BinGen.exe file.txt => file.bin. Бинарный файл просто кидаешь в папку EraPlugins.