![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#441
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
если я правильно понимаю, теперь надо на адрес 00444928 поставить лоу хук
в ф-ии сделать другие цифры. И вернуть дефолтное? |
|
|
![]()
Сообщение
#442
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Теперь LoHook на 44493Ch и пишете свой код.
|
|
|
![]()
Сообщение
#443
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
c->esi это у нас монстр?
Ибо не работает так: Код int __stdcall spellPray(LoHook* h, HookContext* c) { *(int*)(c->esi + 200) += 2; return EXEC_DEFAULT; } Код _PI->WriteLoHook(0x44493C, spellPray);
|
|
|
![]()
Сообщение
#444
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Например, безусловно увеличиваем атаку дополнительно на +2:
Код { c->ecx +=2; return EXEC_DEFAULT; } Если нужно не дополнительно (т.е. без стандартного бонуса к атаке), а прописать значение, то LoHook ставить нужно выше: 44493A. И скиповать инструкцию add ecx, eax. Код { c->ecx =10; c->return_address = 0x44493C; return NO_EXEC_DEFAULT; } Ещё нужно учесть, чтобы бонус корректно снимался. Просто кастуете молитву и ждёте, пока не сработает второй брейкпоинт: там бонус убирается. Соответственно, туда тоже LoHook. Например, Код {
c->ecx -=2; return EXEC_DEFAULT; } |
|
|
![]()
Сообщение
#445
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
А как проверить школу и уровень школы кастуемого заклинания?
Как я понимаю благо надо будет прописывать в ручную. И если герой кастует молитву базовую то и давать базовое благо И ещё ... улучшеное благо это: 1. максимальная атака += 1; 2. минимальная атака = максимальная атака? Или какая-то другая логика |
|
|
![]()
Сообщение
#446
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Если удобнее через указатель на отряд, то вот код, который добавляет +6 к атаке:
Код { *(int*)(c->esi + 200) += 6; c->return_address = 0x444942; return NO_EXEC_DEFAULT; } LoHook на 44493Ch (!) Поправил. Стандартный бонус нужно пропустить. |
|
|
![]()
Сообщение
#447
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Если удобнее через указатель на отряд, то вот код, который добавляет +6 к атаке: Код { *(int*)(c->esi + 200) += 6; c->return_address = 0x444942; return NO_EXEC_DEFAULT; } LoHook на 44493Ch (!) Поправил. Стандартный бонус нужно пропустить. Вот если пропускаем стандартный бонус то возникает вопрос проверки школы.. Ибо базовый должен давать +4/4/2, улучшеный +6/6/4, эксперта то же самое что и улучшеный, но на всех |
|
|
![]()
Сообщение
#448
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
А вот простейшее решение, если нужно поднять атаку и защиту одновременно, как это делает игра:
Код { c->eax = bonus; // не += ! return EXEC_DEFAULT; } LoHook на 44492Eh. * * * Цитата Вот если пропускаем стандартный бонус то возникает вопрос проверки школы.. Ибо базовый должен давать +4/4/2, улучшеный +6/6/4, эксперта то же самое что и улучшеный, но на всех Тогда так: Код { c->eax += relative bonus; return EXEC_DEFAULT; } LoHook на 44492Eh. |
|
|
![]()
Сообщение
#449
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Так как школу(точнее уровень 0-1-2-3. Где 3 - эксперт, 0 - нет школы даже базовой) каста узнать то?
![]() |
|
|
![]()
Сообщение
#450
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата Так как школу(точнее уровень 0-1-2-3. Где 3 - эксперт, 0 - нет школы даже базовой) каста узнать то? Лучше всего поставить брейкпоинт на +478h и найти место, где этот бонус прописывается. Тогда, наверное, и массовая версия работать будет нормально. Вот там школу будет проще получить. Т.е. тот же алгоритм, только смещение добавляйте +478h, а не +0С8h. Кстати, перед тем как ставить новый брейкпоинт на память рекомендую удалить старые: Ctrl+Alt+B. Иначе при следующем запуске игры будем получать останов в рандомном месте кода. Короче, тут и искать не надо ) Всё рядом. |
|
|
![]()
Сообщение
#451
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Честно говоря пока что не понял про определение левела школы. Но массовая версия работает верно.
Вот кстати код отвечающий за снятие бонусов: Код .text:004443DF loc_004443DF: ; CODE XREF: combatMonster_ResetSpellFromStack+4Ej .text:004443DF ; DATA XREF: .text:off_004445C4o .text:004443DF mov eax, [esi+478h] ; jumptable 0044427E case 3 .text:004443E5 mov ecx, [esi+0C8h] .text:004443EB mov ebx, [esi+0CCh] .text:004443F1 sub ecx, eax ; Integer Subtraction .text:004443F3 mov [esi+0C8h], ecx .text:004443F9 mov ecx, [esi+84h] .text:004443FF shr ecx, 6 ; Shift Logical Right .text:00444402 sub ebx, eax ; Integer Subtraction .text:00444404 test cl, 1 ; Logical Compare .text:00444407 mov [esi+0CCh], ebx .text:0044440D jnz loc_004444E1 ; default .text:0044440D ; jumptable 0044427E cases 2,4-7,10-14,16-26,29 .text:00444413 sub [esi+0C4h], eax ; Integer Subtraction .text:00444419 jmp loc_004444E1 ; default Но я не до конца разобрался на какие адресса лоу хуки ставить... этот - 004443F1? Т.е. адерес после всех переменных |
|
|
![]()
Сообщение
#452
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
* * *
LoHook на 44490Ah. В контексте хука c->ecx - указатель (адрес) на героя. Соответственно, скиллы доступны. с->edi - бонус Молитвы. Т.е. задаём бонусы Молитвы: Код { if ( *(char*)(c->ecx + 201 + оффсет_школы_воды) == _уровень_ ) bonus = _такой-то_; // здесь идея, а не реализация ) c->edi = bonus; return EXEC_DEFAULT; } LoHook на 44490Ah. |
|
|
![]()
Сообщение
#453
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
* * * LoHook на 44490Ah. В контексте хука c->ecx - указатель (адрес) на героя. Соответственно, скиллы доступны. с->edi - бонус Молитвы. Т.е. задаём бонусы Молитвы: Код { if ( *(char*)(c->ecx + 201 + оффсет_школы_воды) == _уровень_ ) bonus = _такой-то_; // здесь идея, а не реализация ) c->edi = bonus; return EXEC_DEFAULT; } LoHook на 44490Ah. ну... если герой есть, тогда да, не вопрос как взять школу, то я уже поспешил. Даже из комбат менеджера можно было бы взять |
|
|
![]()
Сообщение
#454
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Но c->edi - это бонус сразу к атаке, защите и скорости. Если нужно дифференцировать бонусы, то придётся повозиться немного.
В любом случае, весь код, который добавляет бонусы Молитвы здесь: |
|
|
![]()
Сообщение
#455
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Пока что так получилось:
Код int __stdcall spellPray(LoHook* h, HookContext* c) { c->ecx += 2; c->ebx += 2; return EXEC_DEFAULT; } int __stdcall spellPrayEnd(LoHook* h, HookContext* c) { c->ecx -= 2; c->ebx -= 2; return EXEC_DEFAULT; } Код _PI->WriteLoHook(0x44493C, spellPray); _PI->WriteLoHook(0x4443F1, spellPrayEnd); Вроде работает PS: А вот и смещения для благо: //_int_ damage_min; //+208 0xD0 //_int_ damage_max; //+212 0xD4 ----------- хм... не пойму пока как сделать благо Как оно работает- все атаки наносят максимальный урон. Если улучшеное и выше, то макс. урон +1. т.е. урон 4-7, после улучшеного блага всегда 8 Соотв. Как сделать благо - понятно, а как вернуть?) |
|
|
![]()
Сообщение
#456
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Да, так должно работать. Метод есть. Дерзайте )
Цитата хм... не пойму пока как сделать благо У отряда есть поле, где хранится инфа о всех висящих на нём заклах. Попробуйте найти его и в коде для Молитвы добавить Bless. Хотя тогда в инфе об отряде Bless видно будет. Есть ещё поля мин. урон и макс. урон - их изменить будет проще и правильнее. Если, конечно, не нужны фишки Bless типа +1 урону. Но и это реализовать можно, если проверять навык воды. |
|
|
![]()
Сообщение
#457
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Цитата хм... не пойму пока как сделать благо У отряда есть поле, где хранится инфа о всех висящих на нём заклах. Попробуйте найти его и в коде для Молитвы добавить Bless. Хотя тогда в инфе об отряде Bless видно будет. Есть ещё поля мин. урон и макс. урон - их изменить будет проще и правильнее. Если, конечно, не нужны фишки Bless типа +1 урону. Я ж выше написал. Даже +1 сделать не проблема Вопрос в том как это вернуть после окончания действия Ибо значения переписаны, я не знаю на сколько изменилось оно. Ибо может и не изменится вовсе (аля ангел). А может сильно (гидра 25-45 урон) После блесса получится "46" и минимальный и максимальный. Максимальный какой понятно. Если улучшеный и выше - тогда текущий максимальный -1 А вот как минимальный получить? |
|
|
![]()
Сообщение
#458
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
На отряде и другие модификаторы атаки/защиты висеть могут. Тогда либо вешать одновременно с Mолитвой Блесс. Либо искать код, который считает урон и изменять условие:
if ( spell == Bless ) на if ( (spell == Bless) || (spell == Prayer) ) По опыту исследования кода Героев 2 скажу, что, вероятнее всего, игра так и делает. Т.е. не модифицирует мин. и макс. урон, а именно проверяет, висит ли Bless, и просто использует изменённые значения при расчёте урона или если требуется в окошке урон показать. |
|
|
![]()
Сообщение
#459
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
На отряде и другие модификаторы атаки/защиты висеть могут. Тогда либо вешать одновременно с Mолитвой Блесс. Либо искать код, который считает урон и изменять условие: if ( spell == Bless ) на if ( (spell == Bless) || (spell == Prayer) ) По опыту исследования кода Героев 2 скажу, что, вероятнее всего, игра так и делает. Т.е. не модифицирует мин. и макс. урон, а именно проверяет, висит ли Bless, и просто использует изменённые значения при расчёте урона или если требуется в окошке урон показать. попробую найти где ставится статус заклинаний. И добавить туда благо Есть ещё, на крайняк идея - найти пустое место и туда записать минимальный урон каждого юнита. Всего надо 42 значения. По 21 на каждую сторону Во время каста молитвы - это поля предварительно очищать. А когда отрабатывает код завершение бонусов молитвы - из этого места брать оригиналы минимального урона Но это слишком сложное и муторное решение Или вариант 3: по анналогии со скоростью. Есть скорость а есть модификатор скорости. Может так же существует минимальный урон и модификатор миниального урона. Но в базе Феанора этого не нашел. Да и модификатора скорости тоже ![]() |
|
|
![]()
Сообщение
#460
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
А хедерах нет описания структуры стека? Счас посмотрю.
Не, куда-то я их засунул, теперь не помню куда. Можно скачать на WoG-форуме. |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 5 October 2025 - 03:07 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|