![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#461
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Кого скачать? Хедеры к монстрам?
|
|
|
![]()
Сообщение
#462
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Короче, вот тут раздают минимальные и максимальные уроны: loc_442EC7.
|
|
|
![]()
Сообщение
#463
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Короче, вот тут раздают минимальные и максимальные уроны: loc_442EC7. Код .text:00442EC7 loc_00442EC7: ; CODE XREF: combatMonster_RandomizeBasicDamage+3Fj .text:00442EC7 mov eax, [ecx+34h] .text:00442ECA push ebx .text:00442ECB push esi .text:00442ECC cmp eax, 92h ; Compare Two Operands .text:00442ED1 push edi .text:00442ED2 jnz loc_00442F58 ; Jump if Not Zero (ZF=0) .text:00442ED8 mov eax, [ecx+288h] .text:00442EDE test eax, eax ; Logical Compare .text:00442EE0 jz short loc_00442EF1 ; Jump if Zero (ZF=1) .text:00442EE2 mov esi, [ecx+0F4h] .text:00442EE8 mov eax, 1 .text:00442EED sub eax, esi ; Integer Subtraction .text:00442EEF jmp short loc_00442EF7 ; Jump Делаю так: Код int __stdcall spellPrayBonus(LoHook* h, HookContext* c) { //c->ebx += 300; c->eax += 300; return EXEC_DEFAULT; } Хуку сюда Код _PI->WriteLoHook(0x442ED8, spellPrayBonus); Не меняется урон |
|
|
![]()
Сообщение
#464
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
442F64h - проверка на Bless.
Код .text:00442F6C jz short loc_442F84
.text:00442F6E mov ecx, [ecx+458h] .text:00442F74 pop edi .text:00442F75 add ecx, ebx .text:00442F77 pop esi .text:00442F78 imul ecx, edx; здесь максимальный урон умножается на кол-во .text:00442F7B mov eax, ecx .text:00442F7D pop ebx .text:00442F7E mov esp, ebp .text:00442F80 pop ebp .text:00442F81 retn 4 |
|
|
![]()
Сообщение
#465
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Мне кажется всё равно надо будет найти статус у моба. Какие спелы висят. Ибо если по ним логика считается, то это будет проще
более того я в дальнейшем планирую "волшебное зеркало" вешать на эксперте воздуха на всех. Я думаю там так же, провесить всем своим юнитам статус и всё... PS: а не, всё равно... даже найду условный адрес АААА для где вешается статус. ИХ же несколько может быть. Соотв. это какой-то массив. В общем пока не понятно как этим управлять ![]() |
|
|
![]()
Сообщение
#466
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Походу, c->ecx - указатель на стек, а *(int*)(c->ecx + 0x23C) - флаг заклинания (висит = 1, нет = 0).
Тогда хук на 442F6Ah. Код { c->eax = 0; // наличие закла: 0 - нет, 1 есть; нужно для test eax, eax if ( *(int*)(c->ecx + 0x23C) != 0 ) c->eax = 1; // проверяем Bless if ( *(int*)(c->ecx + offset_prayer) != 0 ) c->eax = 1; // проверяем Prayer return EXEC_DEFAULT; } UPD Обновил. Осталось подставить offset_prayer. Можно проще, т.к. Bless уже проверили до хука: Код { if ( *(int*)(c->ecx + offset_prayer) != 0 ) c->eax = 1; // проверяем Prayer return EXEC_DEFAULT; } Если тупо взять: 41 Bless 48 Prayer То offset_prayer = 0x23C + (48 - 41) = 0x243. Попробуйте ) * * * Хотя ведь и длительность закла должна где-то храниться. В любом случае, нужен оффсет Prayer, если идея верная. * * * UPD2 Вроде как разобрался. *(int*)(c->ecx + 0x23C) - это не флаг, а длительность заклинания, во-первых. Во-вторых, оффсет Prayer = 0x23C + (48 - 41) * 4 (инт же) = 0x258. Финальный код: Код { if ( *(int*)(c->ecx + 0x258) != 0 ) c->eax = 1; // проверяем Prayer return EXEC_DEFAULT; LoHook на 442F6Ah. |
|
|
![]()
Сообщение
#467
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Работает! Пишется что урон с разбросом. Но по факту наносит всегда максимальный
|
|
|
![]()
Сообщение
#468
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
В окне стека так и должно ведь быть? Нет?
А что в статусной строке при включённой опции "Показывать всё" или как-то так. Ещё неплохо бы проверить зависимость от уровня школы воды. Возможно, ещё бонус +458h учесть нужно, если он автоматом не учёлся. |
|
|
![]()
Сообщение
#469
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
В окне стека так и должно ведь быть? Нет? А что в статусной строке при включённой опции "Показывать всё" или как-то так. Ещё неплохо бы проверить зависимость от уровня школы воды. Возможно, ещё бонус +458h учесть нужно, если он автоматом не учёлся. В статусе стека блага нету. И +1 урона с улучшенной водой не наносится Так же если кастануть благо, то снизу будет писаться урон без разброса. Сейчас он по факту без разброса, но пишется с ним |
|
|
![]()
Сообщение
#470
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата В статусе стека блага нету. Ну блага и не будет, мы же не вешаем Благо. А разброс уронов - так и должно быть. Счас кастанул Bless с экпертной водой на горгулий. Урон пишется 2-3. В статусной строке тоже писаться должен урон фиксированный при наведении курсора на отряд противника. Цитата И +1 урона с улучшенной водой не наносится А это, видимо, и есть универсальный бонус +458h ) |
|
|
![]()
Сообщение
#471
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Цитата В статусе стека блага нету. Ну блага и не будет, мы же не вешаем Благо. А разброс уронов - так и должно быть. Счас кастанул Bless с экпертной водой на горгулий. Урон пишется 2-3. В статусной строке тоже писаться должен урон фиксированный при наведении курсора на отряд противника. Цитата И +1 урона с улучшенной водой не наносится А это, видимо, и есть универсальный бонус +458h ) Вот с низу урон пишется с разбросом (в статусной строке, там где лог боя) Как бонус добавить +458h? Если я правильно понимаю, то сейчас просто включаем благо, если есть молитва. Куда бонус приписать? И ещё момент - как получить тип юнита? Т.е. сейчас андеды получают бонус блага, хотя не должны |
|
|
![]()
Сообщение
#472
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Есть два пути: вешать Bless в дополнение к Prayer, но это неправильно, т.к. один закл будет вешать сразу два. Другой - полностью переделать логику. Тип юнита там же, в c-ecx: *(int*)(c->ecx+ 0x34). Но есть более правильный способ: маска. С помощью неё андедов сразу отличить можно.
Цитата Как бонус добавить +458h? Да просто прописать его в касте. Там где бонусы Молитвы меняли. * * * Хотя +1 макс. урону может и не он добавляет. Так что сначала с андедами разобраться нужно. Ан нет, он родимый ) вот тут: Код .text:00442F6E mov ecx, [ecx+458h] .text:00442F74 pop edi .text:00442F75 add ecx, ebx .text:00442F77 pop esi .text:00442F78 imul ecx, edx .text:00442F7B mov eax, ecx .text:00442F7D pop ebx .text:00442F7E mov esp, ebp .text:00442F80 pop ebp .text:00442F81 retn 4 Так что в касте при наличии у героя экспертной воды, ставим этот бонус в 1. Только осторожно: для Молитвы свой бонус. |
|
|
![]()
Сообщение
#473
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Для молитвы добавил так:
Код c->eax = 1; Ибо код вот: Код .text:00444928 mov eax, [esi+478h] .text:0044492E mov ecx, [esi+0C8h] .text:00444934 mov ebx, [esi+0CCh] Не завелось. Я так понимаю что универсальный бонус как раз для молитвы дал |
|
|
![]()
Сообщение
#474
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Нужно в этом хуке добавлять для Bless, так как бонус для Молитвы уже не нужен.
Например, так: Код int __stdcall spellPray(LoHook* h, HookContext* c)
{ c->ecx += 2; c->ebx += 2; int heroOffset = *(int*)(c->ebp + 20); if ( *(char*)(heroOffset + 201 + 16) > 1 ) *(int*)(c->esi + 0x458) = 1; return EXEC_DEFAULT; } |
|
|
![]()
Сообщение
#475
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Да, работает. Тестовый код такой:
Код int __stdcall spellPray(LoHook* h, HookContext* c) { int cmAddr = *(int*)0x699420; char waterLevel = *(char*)(*(int*)(cmAddr + 0x53CC) + 201 + 16); if (waterLevel > 1) { c->ecx -= 4; c->ebx -= 4; *(int*)(c->esi + 0x458) = 1; } else { c->ecx -= 2; c->ebx -= 2; } return EXEC_DEFAULT; } Фактический такой: Код int __stdcall spellPray(LoHook* h, HookContext* c) { c->ecx += 2; c->ebx += 2; int cmAddr = *(int*)0x699420; char waterLevel = *(char*)(*(int*)(cmAddr + 0x53CC) + 201 + 16); if (waterLevel > 1) { *(int*)(c->esi + 0x458) = 1; } return EXEC_DEFAULT; } Тестовый нужен для того, что бы понять что наносится не усиленный урон. Для этого убираю бонус к статам для молитвы |
|
|
![]()
Сообщение
#476
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Опередили ) Можно героя и через combatManager получать, конечно.
|
|
|
![]()
Сообщение
#477
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Через комбат менеджер более универсально получается. Всегда одинаково и не надо гадать "как же в этом случае получить героя..."
Да и вообще в дальнейшем сделаю ф-ю "getHeroOffset" которая по комбат менеджеру всегда оффсет героя вернёт |
|
|
![]()
Сообщение
#478
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Ага, поправил уровень Water Magic.
Идеально, когда с оффсетами разберётесь, ибо это очень полезный скилл - находить их и понимать, подключайте хедер homm3.h и работайте прямо со структурами. |
|
|
![]()
Сообщение
#479
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Цитата Тип юнита там же, в c-ecx: *(int*)(c->ecx+ 0x34). Но есть более правильный способ: маска. С помощью неё андедов сразу отличить можно. Я так понимаю как-то так: Код if (*(int*)(c->ecx+ 0x34) == 262144) {//не вешаем благо Где 262144 взял из "флаги существ", в erm-helper |
|
|
![]()
Сообщение
#480
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Не, не то. Почему благо не работает на андедах в первую очередь? Потому что при касте не устанавливается *(int*)(c->ecx + 0x23C). Нужно посмотреть, как работает каст Bless. Оттуда уже можно взять правильный код.
|
|
|
![]() ![]() |
Текстовая версия | Сейчас: 5 October 2025 - 06:11 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|