IPB

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

29 страниц V  « < 19 20 21 22 23 > »   
Reply to this topicStart new topic
> Мод на ХотА
AlexSpl
сообщение 29 Dec 2016, 20:31 (Сообщение отредактировал AlexSpl - 29 Dec 2016, 20:32)
Сообщение #401

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




Если бы контекст возвращался неверный, то и вот это:

Код
c->ebx == cmAddr + 0x132A0;

тоже бы не работало. Так что реально вопрос.

Код
.text:00475A28                 mov     eax, [ebx]
.text:00475A2A                 inc     eax; инкрементируем счётчик
.text:00475A2B                 mov     [ebp+var_4], ecx
.text:00475A2E                 mov     [ebx], eax; пишем значение счётчика по адресу ebx
.text:00475A30                 mov     [ebp+var_8], 20
.text:00475A37
.text:00475A37 loc_475A37:
.text:00475A37                 cmp     dword ptr [ecx+34h], -1
.text:00475A3B                 jz      short loc_475A45
.text:00475A3D                 call    sub_446E40; до выполнения этой инструкции - хук, соответсвенно, в c->eax - счётчик
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 29 Dec 2016, 20:41
Сообщение #402

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




Цитата(AlexSpl @ 29 Dec 2016, 19:08) *
Цитата
Вот это не работает, если c->eax - 30000 использовать. Не отнимается скорость

Это я уже не знаю, почему. В контексте хука (c->eax - 30000) - это номер раунда. Нужно у baratorch'а спрашивать, почему не работает. У меня в ассемблере - работает.


на 16й странице похожая проблема была smile.gif
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Dec 2016, 20:48 (Сообщение отредактировал AlexSpl - 29 Dec 2016, 20:50)
Сообщение #403

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




Тут нужно смотреть на контекст. Попробуйте в хуке написать не просто

Код
int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000;
,

а
Код
int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000;
int roundNumberAlt = c->eax - 30000;

if ( roundNumber != roundNumberAlt ) return EXEC_DEFAULT;


Если эти значения действительно не равны скорость уменьшена не будет. Хотя они должны *быть* равны для левой стороны.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 29 Dec 2016, 20:56
Сообщение #404

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




Цитата(AlexSpl @ 29 Dec 2016, 19:48) *
Тут нужно смотреть на контекст. Попробуйте в хуке написать не просто

Код
int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000;
,

а
Код
int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000;
int roundNumberAlt = c->eax - 30000;

if ( roundNumber != roundNumberAlt ) return EXEC_DEFAULT;


Если эти значения действительно не равны скорость уменьшена не будет. Хотя они должны *быть* равны для левой стороны.

Не уменьшается. Бонус в начале даётся. Во 2м раунде - бонус остаётся
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Dec 2016, 21:11 (Сообщение отредактировал AlexSpl - 29 Dec 2016, 21:07)
Сообщение #405

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




Это может означать только то, что контекст возвращается неправильный, т.к. c->eax это и есть *(int*)c->ebx.

Посмотрим ещё раз на код:
Код
.text:00475A2E                 mov     [ebx], eax; [ebx] = eax !!
.text:00475A30                 mov     [ebp+var_8], 20
.text:00475A37
.text:00475A37 loc_475A37:
.text:00475A37                 cmp     dword ptr [ecx+34h], 0FFFFFFFFh
.text:00475A3B                 jz      short loc_475A45
.text:00475A3D                 call    sub_446E40; хук выполняется до этой инструкции


Какая у Вас версия патчера, кстати?

Так! Стоп ) Я разобрался, похоже )

Мы ставим хук *внутри* цикла. И действительно c->eax в нём меняется. Так что вопрос снят.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 29 Dec 2016, 21:12
Сообщение #406

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




Цитата(AlexSpl @ 29 Dec 2016, 20:05) *
Какая у Вас версия патчера, кстати?

Версия 4.2

И сейчас столкнулся с проблемой:
Код
if(*(int*)(c->ecx + 201 + 27) > 0) { //проверка на палатку
            if ( *(int*)(c->ecx + 301 + (15 << 3)) == 6 ) { //15 - слот на кукле для палатки. 6 - айди палатки
                *(int*)(c->esi + 88) += *(int*)(c->ecx + 201 + 27);
            }
        }

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

Цитата(AlexSpl @ 29 Dec 2016, 20:11) *
Мы ставим хук *внутри* цикла. И действительно c->eax в нём меняется. Так что вопрос снят.

на 16й странице тоже самое? smile.gif
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Dec 2016, 21:15
Сообщение #407

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




Всё, я разобрался. Читай предыдущий пост.

Ну, как бы весь код я набираю здесь )) Я не проверяю его работоспособность, так что извиняйте )
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 29 Dec 2016, 21:20
Сообщение #408

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




Не, вылетает не из-за моего кода) Ща ковыряю в общем
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Dec 2016, 21:49 (Сообщение отредактировал AlexSpl - 29 Dec 2016, 21:43)
Сообщение #409

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




Цитата
При нападении с палаткой и навыком - вылетает игра...

Код
*(int*)(c->esi + 88) += *(int*)(c->ecx + 201 + 27);

Это дефенс так повышаете? Там контекст другой. Пример со скоростью: +80 и +196. М.б. в этом проблема?

Ладно, немного посмотрел. Я давал код на инициализацию. Туда нужно было хук ставить. Попробуйте несколько раз кликнуть правой кнопкой мыши на отряде на экране окна героя. Каждый раз сработает хук, что не есть правильно.

Т.е. уже скорость отрядов отображается завышенной.

Попробуйте раздавать "плюшки" здесь: 43D492h (LoHook).

Т.е. после выполнения инструкции rep movsd отряд инициализирован. Самое время добавить бонусы к параметрам.
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Dec 2016, 22:11
Сообщение #410

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




Код
.text:0043D47F lea     edi, [ebx+74h]
.text:0043D482 lea     edx, [eax+edx*4]
.text:0043D485 shl     edx, 2
.text:0043D488 lea     esi, [edx+ecx]
.text:0043D48B mov     ecx, 29
.text:0043D490 rep movsd
.text:0043D492 mov     ecx, dword_699538

LoHook на 43D492h. Все бонусы раздавать только здесь.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 29 Dec 2016, 22:49 (Сообщение отредактировал igrik - 29 Dec 2016, 23:06)
Сообщение #411

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




Цитата(DedMorozzz @ 29 Dec 2016, 21:12) *
При нападении с палаткой и навыком - вылетает игра...

Известная проблема, особенно по WOGy. У палатки скорость всегда должна быть =0. Иначе - вылет при получении хода (как, впрочем, и у всех боевых машин). Проверку делайте на флаг "боевой машины" (64), либо на тип монстров (146 ... 150).
Код
!(o_BattleMgr->stack[0][номер стека текущей стороны].creature.flags & 64)


И смещение 0x132A0 - это что-то связанное с автокастом Чародеев (там идет проверка на каждый третий раунд). Очень сомнительно использовать в качестве номера раунда битвы.

Цитата
if(*(int*)(c->ecx + 201 + 27) > 0) { //проверка на палатку

Это проверка не на палатку, а на навык "Первая Помощь". И там вроде байт, а не четыре байта. Вылезаете за границы, что тоже может приводить в лучшем случае к вылету, в худшем - к трудноуловимым багам.

Цитата
И отнимает скорость всё равно у всех
Потому что нет правильной проверки на сторону стека. Как-то вообще у вас все слишком замудрёно получилось.
Кстате в ИДЕ есть отличная кнопка "tab", которая показывает псевдо сишный код.


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Dec 2016, 22:53
Сообщение #412

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




О, об этом не знал, но всё равно хук на 43D492h.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 14:36 (Сообщение отредактировал DedMorozzz - 30 Dec 2016, 16:08)
Сообщение #413

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




Цитата
И смещение 0x132A0 - это что-то связанное с автокастом Чародеев (там идет проверка на каждый третий раунд). Очень сомнительно использовать в качестве номера раунда битвы.

А как проверить номер раунда?

Всё равно вылетает...
Странно очень, я когда это писал - проверял. Работало. И с баллистой проверял и без. И цифры менял, что бы +10 давало
То же самое с палаткой и тактикой...
Пока что не понимаю что добавилось, почему вылетает игра. Причём на сейвах, на которых всё тестил

Цитата
Это дефенс так повышаете? Там контекст другой. Пример со скоростью: +80 и +196. М.б. в этом проблема?

Да, оно так работало. Почему атака/защита = 84/88. Потому что мы знаем смещение скорости, это +80 в данном контексте
А "базовое" смещение для скорости/атаки/защиты такое - 196/200/204
Код
//_int_ speed;  //+196 0xC4  
//_int_ attack;  //+200 0xC8
//_int_ defence;  //+204 0xCC


Учитывая что 80 это скорость, а атака на 4 (байта?) дальше. Защита на 4 дальше от атаки. Получается так:
80/84/88

Текущий код, с которым не всё ладно (может проблема и в другом, а не в этом коде) такой:

Код
int __stdcall setBankUnitBonus(LoHook* h, HookContext* c)
{
    if ( *(char*)(*(int*)0x699420 + 0x53C5) == 1) { // проверка что бой в банке существ
        
        if(*(char*)(c->ecx + 201 + 19) > 0) { // проверка на тактику
            *(int*)(c->esi+80) += *(int*)(c->ecx + 201 + 19);
            //*(int*)(c->esi+80) += 2;
        }

        if(*(char*)(c->ecx + 201 + 20) > 0) { //проверка на артиллерию
            if ( *(char*)(c->ecx + 301 + (13 << 3)) == 4 ) { //13 - слот на кукле для баллисты. 4 - айди баллисты
                *(int*)(c->esi + 84) += *(int*)(c->ecx + 201 + 20);
                //*(int*)(c->esi + 84) += 10;
            }
        }

        if(*(char*)(c->ecx + 201 + 27) > 0) { //проверка на первую помощь
            if ( *(char*)(c->ecx + 301 + (15 << 3)) == 6 ) { //15 - слот на кукле для палатки. 6 - айди палатки
                *(int*)(c->esi + 88) += *(int*)(c->ecx + 201 + 27) * 2;
                //*(int*)(c->esi + 88) += 10;
            }
        }
        
    }

    return EXEC_DEFAULT;
}

Код
_PI->WriteLoHook(0x43D492, setBankUnitBonus);


закоменченые варианты тоже пробовал. Всё равно вылетает

PS: если вешать хук на "0x43D492", то скорость уже не c->esi+80
PPS: походу скорость по этому адресу получается так: *(int*)(c->ebx + 196)
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 15:54 (Сообщение отредактировал DedMorozzz - 30 Dec 2016, 16:03)
Сообщение #414

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




Пока что получилось такое:
Код
int __stdcall setBankUnitBonus(LoHook* h, HookContext* c)
{
    int cmAddr =  *(int*)0x699420;
    int heroOffset = *(int*)(cmAddr + 0x53CC);

    if ( *(char*)(*(int*)0x699420 + 0x53C5) == 1) { // проверка что бой в банке существ
        if(*(char*)(heroOffset + 201 + 19) > 0) { // проверка на тактику
            *(int*)(c->ebx + 196) += *(char*)(heroOffset + 201 + 19);
        }

        if(*(char*)(heroOffset + 201 + 20) > 0) { //проверка на артиллерию
            if ( *(char*)(heroOffset + 301 + (13 << 3)) == 4 ) { //13 - слот на кукле для баллисты. 4 - айди баллисты
                *(int*)(c->ebx + 200) += *(char*)(heroOffset + 201 + 20);
            }
        }

        if(*(char*)(heroOffset + 201 + 27) > 0) { //проверка на первую помощь
            if ( *(char*)(heroOffset + 301 + (15 << 3)) == 6 ) { //15 - слот на кукле для палатки. 6 - айди палатки
                *(int*)(c->ebx + 204) += *(char*)(heroOffset + 201 + 27) * 2;
            }
        }
        
    }

    return EXEC_DEFAULT;
}


Код
_PI->WriteLoHook(0x43D492, setBankUnitBonus);


Работает, но снова таки - на всех... пока что сторону ещё не понять как определить и не работает бонус в банке при наличии пушки (а не баллисты), что ожидаемо. Какой айди у пушки?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 16:41
Сообщение #415

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




Цитата
Работает, но снова таки - на всех... пока что сторону ещё не понять как определить

arg_8 есть как раз указатель на героя.

Цитата
на 16й странице тоже самое?

Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 16:47
Сообщение #416

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




Цитата(AlexSpl @ 30 Dec 2016, 15:41) *
Цитата
Работает, но снова таки - на всех... пока что сторону ещё не понять как определить

arg_8 есть как раз указатель на героя.


Я ж уже знаю указатель на героя. Вот:
Код
    int heroOffset = *(int*)(cmAddr + 0x53CC);

А как понять, юнитам каким давать/отнимать бонус, а каким нет?
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 16:49
Сообщение #417

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




Цитата
Я ж уже знаю указатель на героя. Вот:
Код
int heroOffset = *(int*)(cmAddr + 0x53CC);


А как понять, юнитам каким давать/отнимать бонус, а каким нет?

Просто сравнить *(int*)(c->ebp + 16) == heroOffset. Условие выполняется, только если проходим по нашим отрядам.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 17:05 (Сообщение отредактировал DedMorozzz - 30 Dec 2016, 17:09)
Сообщение #418

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




Код
int __stdcall setBankUnitBonus(LoHook* h, HookContext* c)
{
    int cmAddr =  *(int*)0x699420;
    int heroOffset = *(int*)(cmAddr + 0x53CC);

    if (*(int*)(c->ebp + 16) != heroOffset) {
        return EXEC_DEFAULT;
    }

    if ( *(char*)(*(int*)0x699420 + 0x53C5) == 1) { // проверка что бой в банке существ

        if(*(char*)(heroOffset + 201 + 19) > 0) { // проверка на тактику
            *(int*)(c->ebx + 196) += *(char*)(heroOffset + 201 + 19);
        }

        if(*(char*)(heroOffset + 201 + 20) > 0) { //проверка на артиллерию
            if ( *(char*)(heroOffset + 301 + (13 << 3)) == 4 ) { //13 - слот на кукле для баллисты. 4 - айди баллисты
                *(int*)(c->ebx + 200) += *(char*)(heroOffset + 201 + 20);
            }
        }

        if(*(char*)(heroOffset + 201 + 27) > 0) { //проверка на первую помощь
            if ( *(char*)(heroOffset + 301 + (15 << 3)) == 6 ) { //15 - слот на кукле для палатки. 6 - айди палатки
                *(int*)(c->ebx + 204) += *(char*)(heroOffset + 201 + 27) * 2;
            }
        }
    }

    return EXEC_DEFAULT;
}

int __stdcall resetTacticsUnitSpeedBonus(LoHook* h, HookContext* c)
{
    int cmAddr =  *(int*)0x699420;
    if ( *(char*)(cmAddr + 0x53C5) == 1) { // проверка что бой в банке существ
        char tacticLevel = *(char*)(*(int*)(cmAddr + 0x53CC) + 201 + 19);
        int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000;

        if ((tacticLevel > 0) && (roundNumber == 1)) {
            if ( c->ebx == cmAddr + 0x132A0 ) {
                *(int*)(c->ecx + 196) -= tacticLevel;
            }
        }
    }

    return EXEC_DEFAULT;
}


Код
_PI->WriteLoHook(0x43D492, setBankUnitBonus);
_PI->WriteLoHook(0x475A3D, resetTacticsUnitSpeedBonus);


Вот так получилось. Но 2 проблемы имеется:
1.
менял
if ( *(char*)(heroOffset + 301 + (13 << 3)) == 4 ) {
на
if ( *(char*)(heroOffset + 301 + (13 << 3)) > 0 ) {

что бы просто проверить что слот под баллисту занят - не завелось. Пушка бонуса не даёт. Какое значение при пустом слоте?

2. При режиме "ПВП битве а нейтралами" - вылетает на ходу нейтралов (какой код разбираю, но точно не бонус при бое в банке)

PS: пункт 2 определил. Логика сбегания от нейтралов. Надо поставить проверку, что ходит герой, тогда кнопку разблокировтаь
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Dec 2016, 17:12 (Сообщение отредактировал AlexSpl - 30 Dec 2016, 17:14)
Сообщение #419

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




Цитата
Какое значение при пустом слоте?

-1

Да, ещё
Код
*(int*)(heroOffset + 301 + (slot << 3))

или
Код
*(int*)(heroOffset + 301 + slot * 8)

Как удобнее.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Dec 2016, 17:14 (Сообщение отредактировал DedMorozzz - 30 Dec 2016, 17:16)
Сообщение #420

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




Цитата(AlexSpl @ 30 Dec 2016, 16:12) *
Цитата
Какое значение при пустом слоте?

-1

я тоже так думал... потому и поставил проверку > 0. Но не завелось. Перепроверю.

По поводу пункта 2, исправил. Получилось так:



Новый блок добавил такой, в начало:



----------------------------
Цитата
slot * 8

Во! Ибо я погуглил в С++ что значит <<, нашел инфу, но не сильно понял. Прочитал что менят сдвиг..
а *8 что даёт?
Go to the top of the pageAdd Nick
 
+Quote Post

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

 



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