IPB

Здравствуйте, гость ( Вход | Регистрация )

29 страниц V  « < 22 23 24 25 26 > »   
Reply to this topicStart new topic
> Мод на ХотА
DedMorozzz
сообщение 30 Dec 2016, 22:44
Сообщение #461

God
Сообщений: 267
Спасибо сказали: 25 раз




Кого скачать? Хедеры к монстрам?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 22:55
Сообщение #462

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Короче, вот тут раздают минимальные и максимальные уроны: loc_442EC7.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 23:09
Сообщение #463

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 30 Dec 2016, 21:55) *
Короче, вот тут раздают минимальные и максимальные уроны: 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);


Не меняется урон
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 23:10
Сообщение #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
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 23:18 (Сообщение отредактировал DedMorozzz - 30 Dec 2016, 23:22)
Сообщение #465

God
Сообщений: 267
Спасибо сказали: 25 раз




Мне кажется всё равно надо будет найти статус у моба. Какие спелы висят. Ибо если по ним логика считается, то это будет проще
более того я в дальнейшем планирую "волшебное зеркало" вешать на эксперте воздуха на всех. Я думаю там так же, провесить всем своим юнитам статус и всё...

PS: а не, всё равно... даже найду условный адрес АААА для где вешается статус. ИХ же несколько может быть. Соотв. это какой-то массив. В общем пока не понятно как этим управлять smile.gif
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 23:58 (Сообщение отредактировал AlexSpl - 30 Dec 2016, 23:59)
Сообщение #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.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 31 Dec 2016, 00:08
Сообщение #467

God
Сообщений: 267
Спасибо сказали: 25 раз




Работает! Пишется что урон с разбросом. Но по факту наносит всегда максимальный
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 00:11 (Сообщение отредактировал AlexSpl - 31 Dec 2016, 00:12)
Сообщение #468

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




В окне стека так и должно ведь быть? Нет?

А что в статусной строке при включённой опции "Показывать всё" или как-то так.

Ещё неплохо бы проверить зависимость от уровня школы воды. Возможно, ещё бонус +458h учесть нужно, если он автоматом не учёлся.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 31 Dec 2016, 00:15 (Сообщение отредактировал DedMorozzz - 31 Dec 2016, 00:16)
Сообщение #469

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 30 Dec 2016, 23:11) *
В окне стека так и должно ведь быть? Нет?

А что в статусной строке при включённой опции "Показывать всё" или как-то так.

Ещё неплохо бы проверить зависимость от уровня школы воды. Возможно, ещё бонус +458h учесть нужно, если он автоматом не учёлся.

В статусе стека блага нету. И +1 урона с улучшенной водой не наносится

Так же если кастануть благо, то снизу будет писаться урон без разброса. Сейчас он по факту без разброса, но пишется с ним
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 00:21
Сообщение #470

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Цитата
В статусе стека блага нету.

Ну блага и не будет, мы же не вешаем Благо. А разброс уронов - так и должно быть. Счас кастанул Bless с экпертной водой на горгулий. Урон пишется 2-3.

В статусной строке тоже писаться должен урон фиксированный при наведении курсора на отряд противника.

Цитата
И +1 урона с улучшенной водой не наносится

А это, видимо, и есть универсальный бонус +458h )
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 31 Dec 2016, 00:25
Сообщение #471

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата(AlexSpl @ 30 Dec 2016, 23:21) *
Цитата
В статусе стека блага нету.

Ну блага и не будет, мы же не вешаем Благо. А разброс уронов - так и должно быть. Счас кастанул Bless с экпертной водой на горгулий. Урон пишется 2-3.

В статусной строке тоже писаться должен урон фиксированный при наведении курсора на отряд противника.

Цитата
И +1 урона с улучшенной водой не наносится

А это, видимо, и есть универсальный бонус +458h )

Вот с низу урон пишется с разбросом (в статусной строке, там где лог боя)
Как бонус добавить +458h?
Если я правильно понимаю, то сейчас просто включаем благо, если есть молитва. Куда бонус приписать?

И ещё момент - как получить тип юнита? Т.е. сейчас андеды получают бонус блага, хотя не должны
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 00:35 (Сообщение отредактировал AlexSpl - 31 Dec 2016, 00:43)
Сообщение #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. Только осторожно: для Молитвы свой бонус.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 31 Dec 2016, 00:45
Сообщение #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]

Не завелось. Я так понимаю что универсальный бонус как раз для молитвы дал
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 00:49 (Сообщение отредактировал AlexSpl - 31 Dec 2016, 01:09)
Сообщение #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;
}


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 31 Dec 2016, 01:03 (Сообщение отредактировал DedMorozzz - 31 Dec 2016, 01:04)
Сообщение #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;
}


Тестовый нужен для того, что бы понять что наносится не усиленный урон. Для этого убираю бонус к статам для молитвы
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 01:05
Сообщение #476

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Опередили ) Можно героя и через combatManager получать, конечно.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 31 Dec 2016, 01:07 (Сообщение отредактировал DedMorozzz - 31 Dec 2016, 01:08)
Сообщение #477

God
Сообщений: 267
Спасибо сказали: 25 раз




Через комбат менеджер более универсально получается. Всегда одинаково и не надо гадать "как же в этом случае получить героя..."
Да и вообще в дальнейшем сделаю ф-ю "getHeroOffset" которая по комбат менеджеру всегда оффсет героя вернёт
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 01:11
Сообщение #478

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Ага, поправил уровень Water Magic.

Идеально, когда с оффсетами разберётесь, ибо это очень полезный скилл - находить их и понимать, подключайте хедер homm3.h и работайте прямо со структурами.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 31 Dec 2016, 01:12
Сообщение #479

God
Сообщений: 267
Спасибо сказали: 25 раз




Цитата
Тип юнита там же, в c-ecx: *(int*)(c->ecx+ 0x34). Но есть более правильный способ: маска. С помощью неё андедов сразу отличить можно.


Я так понимаю как-то так:
Код
if (*(int*)(c->ecx+ 0x34) == 262144) {//не вешаем благо

Где 262144 взял из "флаги существ", в erm-helper
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 31 Dec 2016, 01:16
Сообщение #480

Immortal
Сообщений: 798
Спасибо сказали: 555 раз




Не, не то. Почему благо не работает на андедах в первую очередь? Потому что при касте не устанавливается *(int*)(c->ecx + 0x23C). Нужно посмотреть, как работает каст Bless. Оттуда уже можно взять правильный код.
Go to the top of the pageAdd Nick
 
+Quote Post

29 страниц V  « < 22 23 24 25 26 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 5 October 2025 - 06:11
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика