Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Мод на ХотА
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic III > Моды
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
DedMorozzz
Код
int __stdcall setTacticsUnitSpeed(LoHook* h, HookContext* c)
{
    *(int*)(c->esi+80) += 2;
    
    return EXEC_DEFAULT;
}


Код
_PI->WriteLoHook(0x4E666A, setTacticsUnitSpeed);


Напал архом, дало +2 скорости!
AlexSpl
Попробуйте поставить LoHook на 43D492h:

Код
{
    ++*(int*)(c->edi + 80); // увеличиваем скрость всех отрядов на +1
    return EXEC_DEFAULT;
}


Цитата
Напал архом, дало +2 скорости!

Ага, и там тоже можно добавлять.
DedMorozzz
Код
int __stdcall setTacticsUnitSpeed(LoHook* h, HookContext* c)
{
    if(*(int*)(c->ecx + 201 + 19) > 0) {
        *(int*)(c->esi+80) += 2;
    }
    
    return EXEC_DEFAULT;
}


А вот так с учётом тактики. Ща буду искать как на 2м ходе убрать бонус
AlexSpl
Цитата
А вот так с учётом тактики.

Ага.

Только бонус на все отряды, наверное, действует.
DedMorozzz
Цитата(AlexSpl @ 28 Dec 2016, 22:10) *
Цитата
А вот так с учётом тактики.

Ага.

Только бонус на все отряды, наверное, действует.

ну да, на все. Мне ж так и надо...
Финальная цель - всем отрядам, при нападении на банк, при наличии тактики выдавать +1/2/3 скорости на 1й раунд боя
AlexSpl
А отряды противника получают бонус к скорости?
DedMorozzz
Цитата(AlexSpl @ 28 Dec 2016, 22:18) *
А отряды противника получают бонус к скорости?

нет, только если напасть на вражеского героя (проверял, когда ещё ограничение на тактику не добавил)
перепроверил с тактикой. Только герою у которого она есть (у 2го не было тактики. И бонуса тоже)
AlexSpl
Так вообще логично.

Интересно, как узнать, что бой в банке проходит? Указатель на combatManager у нас есть.
DedMorozzz
Цитата(AlexSpl @ 28 Dec 2016, 22:34) *
Так вообще логично.

Интересно, как узнать, что бой в банке проходит? Указатель на combatManager у нас есть.

Есть такая идея: если сторона левая и левый верхний гекс занят врагом - значит бой в банке (во время 1го раунда)

PS: Но я так понимаю, как-то по другому можно. Ибо и балисты нету и тактики и прочих моментов. И в центр кидает... явно можно как-то "правильнО" узнать
AlexSpl
Можно ещё так.

Указатель на героя у нас тоже есть, значит, мы знаем

Цитата
// miu = map_item under hero
_dword_ miu_object_type; // +12


Т.е.
Код
if ( *(int*)(c->ecx + 12) == _банк_ ) { ... }


Попробуйте для сокровищницы гномов:

Код
int __stdcall setTacticsUnitSpeed(LoHook* h, HookContext* c)
{
    if ((*(int*)(c->ecx + 201 + 19) > 0) && (*(int*)(c->ecx + 12) == 16)) {
        *(int*)(c->esi + 80) += 2;
    }
    
    return EXEC_DEFAULT;
}
DedMorozzz
Цитата(AlexSpl @ 28 Dec 2016, 22:46) *
Можно ещё так.

Указатель на героя у нас тоже есть, значит, мы знаем

Цитата
// miu = map_item under hero
_dword_ miu_object_type; // +12


Т.е.
Код
if ( *(int*)(c->ecx + 12) == _банк_ ) { ... }


Непонял пока что, что в _банк_ находится?))

Так же не пойму как взять скорость юнита (своего)
Этот код отвечает за новый раунд
Код
.text:00446E40; void __thiscall combatMonster_SetUpNewRound(_CombatMonster_ *this)


Пробовал разные варианты, включая все закоменченые (и ещё несколько дополнительно):
Код
int __stdcall resetTacticsUnitSpeedBonus(LoHook* h, HookContext* c)
{
    //ecx+52
    //*(int*)(c->esi+80) += 5;
    //*(int*)(c->esi+80+1224) += 5;
    //*(int*)(c->esi+52) += 5;
    //ebx, eax
    //*(int*)(c->eax+1224) += 5;
    //*(int*)(c->ebx+1224) += 5;

    int cmAddr = *(int*)0x699420;
    int x = *(int*)(cmAddr + 0x132B8);
    int y = *(int*)(cmAddr + 0x132BC); // или наоборот ))
    int creatureAddr = cmAddr + 1352 * (x + 21 * y) + 21708;
    *(int*)(creatureAddr + 1224) +=5;
    

    return EXEC_DEFAULT;
}

Не работает
Хук на адрес: 0x446E40
igrik
Цитата(AlexSpl @ 28 Dec 2016, 23:34) *
Интересно, как узнать, что бой в банке проходит?

if ( (*(char*)(0x699420 + 0x53C5)) == 1 )
AlexSpl
Ну, я потестил, если битва в сокровищнице (не знаю, любой ли), то см. мой предыдущий пост. Тестил на консерве и гномятне.

Цитата
if ( (*(char*)(0x699420 + 0x53C5)) == 1 )

Это условие выполняется, только когда юниты вокруг нашей армии становятся?
DedMorozzz
Цитата(igrik @ 28 Dec 2016, 23:09) *
Цитата(AlexSpl @ 28 Dec 2016, 23:34) *
Интересно, как узнать, что бой в банке проходит?

if ( (*(char*)(0x699420 + 0x53C5)) == 1 )

Проверил, не работает ):
AlexSpl
Наверное, так правильно:

Код
if ( *(char*)(*(int*)0x699420 + 0x53C5) == 1 )
?
DedMorozzz
Цитата(AlexSpl @ 28 Dec 2016, 23:16) *
Наверное, так правильно:

Код
if ( *(char*)(*(int*)0x699420 + 0x53C5) == 1 )
?

Да, так работает
igrik
Цитата(AlexSpl @ 29 Dec 2016, 00:14) *
Это условие выполняется, только когда юниты вокруг нашей армии становятся?

Да, от этого зависит расстановка стеков защищающейся стороны (функция 0x4631E0).
Адреса позиций прописаны тут:
0x63D0A8 - обычная битва;
0x63D0E0 - битва в банке.
DedMorozzz
Как с функой нового раунда быть.
Каким образом там изменить скорость юнитов? Чуть выше писал что пробовал, что нашел, но пока что без результата
Если я правильно понимаю необходимо 3 критерия:
1. скорость своих юнитов
2. сам герой (что бы проверку на тактику добавить)
3. получить номер раунда

Раунд скорее всего смогу найти (перебрав параметры, которые перед функцией), а вот 2 других - не знаю как
igrik
Цитата(DedMorozzz @ 29 Dec 2016, 00:34) *
2. сам герой (что бы проверку на тактику добавить)

так же понятнее:
Код
char heroAtt_Tactic = o_BattleMgr->hero[0]->second_skill[HSS_TACTICS];

чем так:
Код
char heroAtt_Tactic = *(char*)(*(int*)(*(int*)0x699420 + 0x53CC) + 201 + 19);

это код навскидку, я его не проверял.
igrik
Цитата(DedMorozzz @ 29 Dec 2016, 00:34) *
1. скорость своих юнитов

Что-то в таком духе
Код
for (char i = 0; i < 21; i++) // только для стеков атакующей стороны (стеки № 0...20)
{
    if(o_BattleMgr->stack[0][i].count_current > 0)  // если стек жив
    {
        o_BattleMgr->stack[0][i].creature.speed += 2; // увеличить его скорость
    }
}

DedMorozzz
Цитата(igrik @ 29 Dec 2016, 10:30) *
Цитата(DedMorozzz @ 29 Dec 2016, 00:34) *
2. сам герой (что бы проверку на тактику добавить)

так же понятнее:
Код
char heroAtt_Tactic = o_BattleMgr->hero[0]->second_skill[HSS_TACTICS];

чем так:
Код
char heroAtt_Tactic = *(char*)(*(int*)(*(int*)0x699420 + 0x53CC) + 201 + 19);

это код навскидку, я его не проверял.


Всё накрылось так, если подключил HotA/homm3.h
Код
1>.\dllmain.cpp(391) : error C2227: left of '->ecx' must point to class/struct/union/generic type
1>.\dllmain.cpp(391) : error C2027: use of undefined type 'HookContext'


Всё надо переписывать... Так что пока что отключил

А вот так, спасибо, завелось:
Код
char heroLevel = *(char*)(*(int*)(*(int*)0x699420 + 0x53CC) + 85);
проверял на том что легко отследить, уровень героя

Функа combatMonster_SetUpNewRound вызывается столько раз, сколько юнитов.
Так что как-то по другому надо ловить 1й раунд. Ну или сильно усложнять логику. Аля проверять наличие артов (+скорость) что бы их не отнять
Да и в целом побрутфорсил многие параметры, не подошло под "номер раунда" ничего.

Зато реализовал бонусы к статам от артиллерии и первой помощи в банках. Суммарно функа боя в банке выглядит так:

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

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

        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) * 2;
            }
        }
    }

    return EXEC_DEFAULT;
}

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


Руководстовался следующей логикой: есть навыки которые дают бонус в бою. Но в банке, в силу определёных обстоятельств этих бонусов нету
Т.о. выдаю альтернативные. Для артилерии +1/2/3 атаки. Для палатки +2/4/6 защиты
А для тактики +1/2/3 скорости. В идеале на 1й раунд только (т.к. тактика в обычном бою действует только в начале). Но пока что всегда +2 сделал

PS: вот тут Феаноровский архив пригодился! Как базу знаний использовал. Повытягивал из него смещения для атаки/защиты монстров. Хоть там и не верные смещения для первичных навыков героя
AlexSpl
Не знаю, что это за поле такое: *(int*)(cmAddr + 0x132A0), но увеличивается в начале каждого раунда на 1. Причём стартовое значение у меня равно 30000.

База IDA от sergroj не открывается. Похоже, работает только в версии 6.5.

Цитата
Функа combatMonster_SetUpNewRound вызывается столько раз, сколько юнитов.
Так что как-то по другому надо ловить 1й раунд.

Если по смещению 0х132A0 всегда находится (номер_раунда - 30000), то

Код
int cmAddr =  *(int*)0x699420;
int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000; // начиная с 0.
if ( roundNumber == 0 ) { // дать бонус скорости }
if ( roundNumber == 1 ) { // отнять бонус скорости }


* * *
Проверил. Инициализируется счётчик здесь:
Код
.text:004636F0 mov     dword ptr [ebx+0DDF8h], 30000


Затем увеличивается на 1 после каждого раунда. Проблема только с тактикой (счётчик работает в тактической фазе тоже), поэтому перед первым раундом нужно читать его стартовое значение.
DedMorozzz
Код
0х132A0
не хватает 1го символа. не верный адрес
А если смешение, то оно аж ‭78496‬ получается. Не слишком большое?

Проверил код выше с хуком на 004636F0 - не работает.

Что касается тактической фазы - дык её в банках нету же
AlexSpl
Т.е. код примерно такой. Убрать старый хук на скорость и поставить новый на 475A42h (а лучше до: 475A3Dh). Так мы только по по отрядам с ID != -1 проходить будем.

Цитата
Что касается тактической фазы - дык её в банках нету же

Тогда проще:
Код
{
   int cmAddr =  *(int*)0x699420;
   int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000;
   if ( roundNumber == 0 ) *(int*)(с->ecx + 80) += 2;
   if ( roundNumber == 1 ) *(int*)(c->ecx + 80) -= 2;
   return EXEC_DEFAULT;
}


Все характеристики отрядов и героев доступны из combatManager.

UPD Обновил пост. Попробуйте пока без героя. Просто дайте +2 скорости и посмотрите, что будет во 2-м раунде.
DedMorozzz
Скорости нету. Пропускаю ход и звук яда. И сообщение в логе боя "ангел пропускает ход, получая +8 защиты, корчась от боли, пока яд растекается по венам"
Дерусь против триглодитов... и вылетает через какое-то время
PS: убрал всё лишнее - вроде яда нету... хз откуда он взялся. Но бонуса тоже нет (и не отняло ничего в след. раундах)
AlexSpl
Я обновил пост. Попробуйте точно такой код написать.
DedMorozzz
Цитата(AlexSpl @ 29 Dec 2016, 17:39) *
Я обновил пост. Попробуйте точно такой код написать.

я именноего и пробовал. В условиях увеличил 0 до 1, а 1 до 2х, снова яд был! Чушь какая-то
AlexSpl
Старый хук на скорость убрали? Напиши Ваш код (вместе с хуком).
DedMorozzz

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

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

        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) * 2;
            }
        }
    }

    return EXEC_DEFAULT;
}

int __stdcall resetTacticsUnitSpeedBonus(LoHook* h, HookContext* c)
{
    int cmAddr =  *(int*)0x699420;
    int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000;
    if ( roundNumber == 2 ) *(int*)(c->ecx + 80) += 2;
    if ( roundNumber == 1 ) *(int*)(c->ecx + 80) -= 2;

    return EXEC_DEFAULT;
}


Код
_PI->WriteLoHook(0x4E666A, setBankUnitBonus);
_PI->WriteLoHook(0x475A42, resetTacticsUnitSpeedBonus);
AlexSpl
Ага, кажется, понятно. (int*)(c->ecx + 80) не указывает на скорость. Счас гляну.

Код
int __stdcall resetTacticsUnitSpeedBonus(LoHook* h, HookContext* c)
{
    int cmAddr =  *(int*)0x699420;
    int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000;
    if ( roundNumber == 1 ) *(int*)(c->ecx + 196) -= 2;

    return EXEC_DEFAULT;
}

...
_PI->WriteLoHook(0x4E666A, setBankUnitBonus);
_PI->WriteLoHook(0x475A3D /* ! */, resetTacticsUnitSpeedBonus);


UPD Поправил. Ведь хук срабатывает в конце раунда, так что старый тоже нужно оставить: он инициализирует скорость.
DedMorozzz
Работает! Снижает, правда всем юнитам, но уже чётко по раундам. Проверил и на 1м и на 2м что бы снижал, дважды отнимает всем. В общем всё ок
AlexSpl
Осталось только доп. условие (проверку уровня тактики героя) на это повесить:

Код
if ( roundNumber == 1 ) *(int*)(c->ecx + 196) -= 2;

DedMorozzz
Цитата(AlexSpl @ 29 Dec 2016, 18:07) *
Осталось только доп. условие (проверку уровня тактики героя) на это повесить:

Код
if ( roundNumber == 1 ) *(int*)(c->ecx + 196) -= 2;

Если правильно понимаю, то и только союзника уменьшать скорость smile.gif Врагам не надо
Сейчас всем юнитам

Т.е. такой код сейчас:

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

        if (tacticLevel > 0) {

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

    return EXEC_DEFAULT;
}


И у врага отнимает 2 еденицы скорости на 2й ход. И у того у кого есть тактика
AlexSpl
Цитата
Проверил и на 1м и на 2м что бы снижал, дважды отнимает всем.

Дважды не надо. Первый хук добавляет 2 к скорости. В конце 1-го раунда (roundNumber == 1) мы эти 2 ед. забираем.
DedMorozzz
Цитата(AlexSpl @ 29 Dec 2016, 18:09) *
Цитата
Проверил и на 1м и на 2м что бы снижал, дважды отнимает всем.

Дважды не надо. Первый хук добавляет 2 к скорости. В конце 1-го раунда (roundNumber == 1) мы эти 2 ед. забираем.

не, я спецом. Проверить что это именно раунд и что всё работает корректно. Я часто для тестов добавляю доп условия, когда что-то настраиваю.
В финале этого не будет, само собой
AlexSpl
Теперь нужно "выцепить" из combatManager уровень тактики героя левой (0) стороны и всё будет работать.
DedMorozzz
Цитата(AlexSpl @ 29 Dec 2016, 18:13) *
Теперь нужно "выцепить" из combatManager уровень тактики героя левой (0) стороны и всё будет работать.

так вот же:
Код
char tacticLevel = *(char*)(*(int*)(*(int*)0x699420 + 0x53CC) + 201 + 19);

Но всё равно, даже с этим условием у врага отнимает тоже скорость
AlexSpl
Цитата
И у врага отнимает 2 еденицы скорости на 2й ход

Это просто исправить. Там цикл сначала по отрядам стороны 0, а потом - стороны 1. Нужно ещё одно условие.

Код
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 side = *(int*)(cmAddr + 0x132B8);

        if ( (side == 0) && (tacticLevel > 0) ) {

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

    return EXEC_DEFAULT;
}


Так же попробуйте side = 1, реально путаюсь )
DedMorozzz
Код
int side = *(int*)(cmAddr + 0x132B8);
if (side == 0) { // отнять скорость }
?
AlexSpl
Не, мы проверяем: если наша сторона левая (0) и у героя есть тактика, отнять скорость в конце первого раунда.

Хотя может и не сработать. Тогда есть запасной вариант.
DedMorozzz
у меня слегка по другому получилось, но смысл тот же:
Код
int __stdcall resetTacticsUnitSpeedBonus(LoHook* h, HookContext* c)
{
    int cmAddr =  *(int*)0x699420;
    if ( *(char*)(cmAddr + 0x53C5) == 1) { // проверка что бой в банке существ
        char tacticLevel = *(char*)(*(int*)(*(int*)0x699420 + 0x53CC) + 201 + 19);
        int roundNumber = *(int*)(cmAddr + 0x132A0) - 30000;

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

    return EXEC_DEFAULT;
}

И отнимает всё равно у всех
AlexSpl
Я уже понял. Счас исправим.
DedMorozzz
в банке перепроверил. site==0 не отнимает. ==1 отнимает у всех. 1 мин ещё раз перепроверю, но вроде так
PS: да, при site==1 в банке отнимает точно у всех
AlexSpl
Код
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 = c->eax - 30000;

        if ( (tacticLevel > 0) && (roundNumber == 1) ) {
            if ( c->ebx == cmAddr + 0x132A0 ) { // проверяем, что цикл по отрядам левой стороны
                *(int*)(c->ecx + 196) -= 2;
            }
        }
    }

    return EXEC_DEFAULT;
}
DedMorozzz
Силач! Всё работает, спасибо smile.gif

Итого финальный код, который будет давать +1/2/3 скорости для 1го хода, по уровням тактики, при нападении на банк существ, выглядит так:

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

    return EXEC_DEFAULT;
}

int __stdcall resetTacticsUnitSpeedBonus(LoHook* h, HookContext* c)
{
    int cmAddr =  *(int*)0x699420;
    if ( *(char*)(cmAddr + 0x53C5) == 1) { // проверка что бой в банке существ
        char tacticLevel = *(char*)(*(int*)(*(int*)0x699420 + 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;
}


Ну или полная ф-я, которая даёт бонусы атаки/защиты при наличии навыков артиллерия и первая помощь + боевые машины что бы были

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

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

        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) * 2;
            }
        }
    }

    return EXEC_DEFAULT;
}

int __stdcall resetTacticsUnitSpeedBonus(LoHook* h, HookContext* c)
{
    int cmAddr =  *(int*)0x699420;
    if ( *(char*)(cmAddr + 0x53C5) == 1) { // проверка что бой в банке существ
        char tacticLevel = *(char*)(*(int*)(*(int*)0x699420 + 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(0x4E666A, setBankUnitBonus);
_PI->WriteLoHook(0x475A3D, resetTacticsUnitSpeedBonus);
AlexSpl
Проверь ещё боевые машины на всякий. Что у них со скоростью?
DedMorozzz
Цитата(AlexSpl @ 29 Dec 2016, 18:50) *
Проверь ещё боевые машины на всякий. Что у них со скоростью?

а что их проверять то? У них скорость 0 и их нету во время боя в банке существ smile.gif
AlexSpl
Ещё *(int*)0x699420 можно заменить на cmAddr, раз уж определили переменную. А раунд проще так получить:

Код
int roundNumber = c->eax - 30000; // *(int*)(cmAddr + 0x132A0) - 30000;
DedMorozzz
Цитата(AlexSpl @ 29 Dec 2016, 18:53) *
Код
int roundNumber = c->eax - 30000; // *(int*)(cmAddr + 0x132A0) - 30000;


Вот это не работает, если c->eax - 30000 использовать. Не отнимается скорость
AlexSpl
Цитата
Вот это не работает, если c->eax - 30000 использовать. Не отнимается скорость

Это я уже не знаю, почему. В контексте хука (c->eax - 30000) - это номер раунда. Нужно у baratorch'а спрашивать, почему не работает. У меня в ассемблере - работает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.