Объявления

Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

Как создать плагин для HD мода

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1316
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 13 сен 2017, 15:22

Поставил новую операционку. Как только освоюсь - потестю.
Насчет дефолтного механизма EagleEye - действительно, ни к чему он, наверно.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1316
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 13 сен 2017, 19:02

AlexSpl писал(а):

Странно, что у Вас owner_id не работает. У меня возвращает корректный номер игрока. Может, у Вас в свойствах проекта (Configuration Properties > C/C++ > Code Generation) Struct Member Alignment (выравнивание членов структур) в 1 байт не выставлено?


Да, не выставлено.
Выставил. И Ваш последний код у меня заработал.

Но сетевая версия не работает (как и моя собственная попытка пару дней назад).
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1316
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 13 сен 2017, 19:09

Код в районе 476B37 выполняется как на сервере, так и на клиенте, так получается ?
(если оба героя с орлоглазом)

Код: Выделить всё
.text:004771A9                     mov al, GoAvtoSolo
.text:004771AE                     test al, al                             ; Logical Compare
.text:004771B0                     jz  short loc_004771C1                  ; Jump if Zero (ZF=1)
.text:004771B2                     call timeGetTime                        ; Call Procedure
.text:004771B7                     add eax, 7D0h                           ; Add
.text:004771BC                     mov dword_006977D4, eax
.text:004771C1
.text:004771C1 loc_004771C1:                                               ; CODE XREF: sub_00476DA0+410j
.text:004771C1                     cmp edi, 0FFFFFFFFh                     ; Compare Two Operands
.text:004771C4                     jz  loc_00477294                        ; Jump if Zero (ZF=1)
.text:004771CA                     mov eax, [esi+edi*4+54A8h]
.text:004771D1                     cmp eax, 0FFFFFFFFh                     ; Compare Two Operands
.text:004771D4                     jz  loc_00477294                        ; Jump if Zero (ZF=1)
.text:004771DA                     mov ecx, Main_Structure                 ; MainStructPo
.text:004771E0                     push eax                                ; PlayerIndex
.text:004771E1                     call IsThisGamer                        ; Call Procedure
.text:004771E6                     test al, al                             ; Logical Compare
.text:004771E8                     jz  loc_00477294                        ; Jump if Zero


Может быть, данный код из оригинальной игры как-то может способствовать в реализации сетевого плагина ?

Код: Выделить всё
.text:00477178                     mov eax, NetworkGame
.text:0047717D                     mov ebx, 3A98h
.text:00477182                     test eax, eax                           ; Logical Compare
.text:00477184                     jz  short loc_0047719D                  ; Jump if Zero (ZF=1)
.text:00477186                     mov eax, dword_006977D8
.text:0047718B                     test eax, eax                           ; Logical Compare
.text:0047718D                     jnz short loc_0047719D                  ; Jump if Not Zero (ZF=0)
.text:0047718F                     call timeGetTime                        ; Call Procedure
.text:00477194                     add eax, ebx                            ; Add
.text:00477196                     mov dword_006977D4, eax
.text:0047719B                     jmp short loc_004771A9                  ; Jump


Ну и это тоже.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1316
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 13 сен 2017, 19:15

Тестировал с помощью связки комп-хост + виртуальная машина на нем.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1316
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 13 сен 2017, 20:12

Заметил, что диалог появляется только для хоста, не зависимо от того, сервер это, или клиент.

Попробую соорудить реальное соединение комп - комп.

Тестовый диалог, кстати, использовал такой:
CALL_12(void, __fastcall, 0x4F6C00, Text, 1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0);
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1316
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 13 сен 2017, 20:19

Может быть, у Вас есть возможность протестировать ?
(комп + хаб + ноутбук)
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5570
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2169 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 13 сен 2017, 21:12

Да на виртуалке тоже должно работать. Может быть, гость без плагина был? Если с плагином, то, возможно, ещё один хук нужен.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1316
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 14 сен 2017, 03:34

Да, дело то действительно в том, что плагин вообще не работает на виртуалке.
Возможно, потому что там Windows XP стоит. Или еще в чем-то, посмотрю.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5570
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2169 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 14 сен 2017, 19:41

Попробовал потестировать плагин на виртуалках. На виртуалках Windows 7 и Windows Server 2008 R2 плагин вообще не работает (даже после отключения DEP). На Windows 10 всё OK. Надо теперь вторую Windows 10 поставить и проверить сетевую игру.

* * *
Проверил. Всё работает в сетевой игре. Обоим игрокам показываются корректные диалоги. Единственная проблема: если один игрок нажмёт OK в диалоге Eagle Eye и походит до того, как второй игрок нажмёт OK, случится рассинхрон. Одно из решений - учить заклинания и показывать диалоги непосредственно перед ходом первого отряда каждой из сторон. Тут нужно завести две глобальные переменные типа bool (чтобы диалоги показывались только один раз) и переместить хук в функцию хода отряда. После этого плагин можно смело публиковать в теме на DF2. Думаю, многим недовольным навыком Eagle Eye он придётся по душе :smile2:
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5570
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2169 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 15 сен 2017, 07:50

Посмотрел Ваш код для Town Portal. Нашёл ошибку в этом хуке:

Код: Выделить всё
int __stdcall mpointsEarth_2(LoHook* h, HookContext* c) {
   int level = c->eax;
   int mpoints[] = {1200, 1200, 1000, 800};
   c->eax = mpoints[level];
   c->ecx = *(int*)(c->esi) + 0x4D;
   
   c->return_address = 0x430532;
   return NO_EXEC_DEFAULT;
}


mov ecx, [esi+4Dh] это c->ecx = *(int*)(c->esi + 0x4D), а не c->ecx = *(int*)(c->esi) + 0x4D; Сейчас Вы читаете x координату героя (указатель на героя в esi) и прибавляете к этому значению число 77.
Вернуться к началу

Пред.След.

Вернуться в Общий раздел

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2