IPB

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

29 страниц V  « < 27 28 29  
Reply to this topicStart new topic
> Мод на ХотА
DedMorozzz
сообщение 29 Jan 2017, 23:25
Сообщение #561

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




Да, всё верно.. при этом хуке
Код
_PI->WriteHexPatch(0x4738B1, "EB");

палаткой могу управлять. Даже тогда когда фух хп у всех. Но хилять не могу
А без навыка игра виснет. Ну как виснет... музыка идёт, ожидается ход палатки, которая ничего не делает
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Jan 2017, 23:46
Сообщение #562

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




Цитата
палаткой могу управлять. Даже тогда когда фух хп у всех. Но хилять не могу

А этот патч прописали:
Код
_PI->WriteHexPatch(0x47609A, "9090");
?

Цитата
А без навыка игра виснет.

Я ж так и написал, что виснет. Нужен критерий, определяющий, на кого вешать щит в случае автохила.
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 29 Jan 2017, 23:52 (Сообщение отредактировал DedMorozzz - 29 Jan 2017, 23:59)
Сообщение #563

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




не, патч не прописал. С ним хиляет целые отряды корректно
А насчёт автохила достаточно сделать проверку на наличие навыка. Ибо щит без навыка не должен вешаться.
Вот и будет тот самый критерий

------------------------------
Сделал такую штуку - вылетакт при попытке запуска игры:
Код
int cmAddr =  *(int*)0x699420;
            int currentSide = *(int*)(cmAddr + 0x132C0);
            int heroAddr = *(int*)(cmAddr + currentSide * 4 + 0x53CC); // адрес героя с учётом стороны
            char firstAidLevel = *(char*)(heroAddr + 201 + 27);

            if (firstAidLevel > 0) {
                _PI->WriteHexPatch(0x47609A, "9090");
                _PI->WriteHexPatch(0x4738B1, "EB");
            }


Этот код естесно там, где все хуки прописаны. Обёртку над хуком сделал, мол не нужен если навык отсутствует
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 29 Jan 2017, 23:57 (Сообщение отредактировал AlexSpl - 30 Jan 2017, 00:03)
Сообщение #564

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




Цитата
А насчёт автохила достаточно сделать проверку на наличие навыка. Ибо щит без навыка не должен вешаться.

Так это вообще просто ) Удаляем патч 0x4738B1. Вместо него ставим LoHook на тот же адрес.

Цитата
Сделал такую штуку - вылетакт при попытке запуска игры:

Патчи прописывайте ВНЕ функций.
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Jan 2017, 00:17 (Сообщение отредактировал AlexSpl - 30 Jan 2017, 00:23)
Сообщение #565

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




Например, так:

Код
{
    int cmAddr = *(int*)699420;
    int currentSide = *(int*)(cmAddr + 0x132C0);
    int heroAddr = *(int*)(cmAddr + currentSide * 4 + 0x53CC); // адрес героя с учётом стороны
    
    if ( *(char*)(heroAddr + 201 + 27) == 0 ) return EXEC_DEFAULT;

    c->return_address = 0x4738C3;
    return NO_EXEC_DEFAULT;
}


Т.е. пишем первый патч ("9090"). Потом LoHook на 0x4738B1, и код выше.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Jan 2017, 00:35
Сообщение #566

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




Код
int __stdcall checkAllowHeal(LoHook* h, HookContext* c)
{
    int cmAddr = *(int*)699420;
    int currentSide = *(int*)(cmAddr + 0x132C0);
    int heroAddr = *(int*)(cmAddr + currentSide * 4 + 0x53CC); // адрес героя с учётом стороны
    
    if (*(char*)(heroAddr + 201 + 27) == 0) {
        return EXEC_DEFAULT;
    }

    c->return_address = 0x4738C3;

    return NO_EXEC_DEFAULT;
}

Код
_PI->WriteHexPatch(0x47609A, "9090");
            _PI->WriteLoHook(0x4738B1, checkAllowHeal);


вылетает когда ход переходит палатке
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Jan 2017, 00:43 (Сообщение отредактировал AlexSpl - 30 Jan 2017, 00:44)
Сообщение #567

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




Давайте выясним где. Закомментите вот это:
Код
c->return_address = 0x4738C3;
return NO_EXEC_DEFAULT;


Т.е. код хука:
Код
int __stdcall checkAllowHeal(LoHook* h, HookContext* c)
{
    int cmAddr = *(int*)699420;
    int currentSide = *(int*)(cmAddr + 0x132C0);
    int heroAddr = *(int*)(cmAddr + currentSide * 4 + 0x53CC); // адрес героя с учётом стороны
    
    // if (*(char*)(heroAddr + 201 + 27) == 0) {
        return EXEC_DEFAULT;
    // }

    // c->return_address = 0x4738C3;

    // return NO_EXEC_DEFAULT;
}
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Jan 2017, 01:18 (Сообщение отредактировал DedMorozzz - 30 Jan 2017, 01:23)
Сообщение #568

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




Код
int __stdcall checkAllowHeal(LoHook* h, HookContext* c)
{
    int cmAddr = *(int*)699420;
    int currentSide = *(int*)(cmAddr + 0x132C0);
    int heroAddr = *(int*)(cmAddr + currentSide * 4 + 0x53CC); // адрес героя с учётом стороны
    
    if (*(char*)(heroAddr + 201 + 27) == 0) {
        return EXEC_DEFAULT;
    }

    //c->return_address = 0x4738C3;

    //return NO_EXEC_DEFAULT;
    return EXEC_DEFAULT;

}


Вот так всё ок, но палатка не ходит. с NO_EXEC_DEFAULT вылетате

явно проблема тут - c->return_address = 0x4738C3;
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Jan 2017, 01:26
Сообщение #569

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




Интересно. А если хук поднять выше (на 4738ACh)?

Код
int __stdcall checkAllowHeal(LoHook* h, HookContext* c)
{
    int cmAddr = *(int*)699420;
    int currentSide = *(int*)(cmAddr + 0x132C0);
    int heroAddr = *(int*)(cmAddr + currentSide * 4 + 0x53CC); // адрес героя с учётом стороны
    
    if (*(char*)(heroAddr + 201 + 27) == 0) {
        return EXEC_DEFAULT;
    }

    c->return_address = 0x4738C3;

    return NO_EXEC_DEFAULT;
}


Код
_PI->WriteLoHook(0x4738AC, checkAllowHeal);


Патч "EB", естественно, должен быть удалён.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 30 Jan 2017, 01:28
Сообщение #570

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




Не, вылетает. Патч удалил
Go to the top of the pageAdd Nick
 
+Quote Post
AlexSpl
сообщение 30 Jan 2017, 02:09 (Сообщение отредактировал AlexSpl - 30 Jan 2017, 02:29)
Сообщение #571

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




А если поправить
Код
int cmAddr = *(int*)699420;

на
Код
int cmAddr = *(int*)0x699420;
?

Хотя Вы вряд ли просто скопировали мой код с ошибкой...

* * *
Если не поможет, предлагаю проверить следующие два варианта на герое, у которого есть First Aid:

1-й вариант (патч):
Код
_PI->WriteHexPatch(0x4738B1, "EB");

Хук 0x4738B1 удаляем.

2-й вариант (хук):

Код
int __stdcall checkAllowHeal(LoHook* h, HookContext* c)
{
    c->return_address = 0x4738C3;
    return NO_EXEC_DEFAULT;
}

(в коде хука оставляем только джамп по адресу 0x4738C3).

Код
_PI->WriteLoHook(0x4738B1, checkAllowHeal);

Патч 0x4738B1 удаляем.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 31 Jan 2017, 23:17 (Сообщение отредактировал DedMorozzz - 31 Jan 2017, 23:18)
Сообщение #572

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




Скомпоновал оба варианта с постов выше. Получилось так:

Код
int __stdcall checkAllowHeal(LoHook* h, HookContext* c)
{
    int cmAddr = *(int*)0x699420;
    int currentSide = *(int*)(cmAddr + 0x132C0);
    int heroAddr = *(int*)(cmAddr + currentSide * 4 + 0x53CC); // адрес героя с учётом стороны
    
    if (*(char*)(heroAddr + 201 + 27) == 0) {
        return EXEC_DEFAULT;
    }

    c->return_address = 0x4738C3;

    return NO_EXEC_DEFAULT;
}


Код
_PI->WriteHexPatch(0x47609A, "9090");
_PI->WriteLoHook(0x4738AC, checkAllowHeal);


Что было не так, checkAllowHeal был ок. Но не работал потому что патча 0x47609A не было. В общем всё ок ща
Итого добавил щит в половину силы на целых юнитов. А у героя со специализацией фул щит всегда

Итого код расчёта щита получился таким:
Код
int __stdcall setFirstAidShield(LoHook* h, HookContext* c)
{
    int cmAddr =  *(int*)0x699420;
    float stackBonusModificator = 5.0f;
    

    int currentSide = *(int*)(cmAddr + 0x132C0);
    int heroAddr = *(int*)(cmAddr + currentSide * 4 + 0x53CC); // адрес героя с учётом стороны
    char firstAidLevel = *(char*)(heroAddr + 201 + 27);

    int heroID = *(int*)(heroAddr + 26);
    int specInfoAddr = *(int*)0x679C80;
    bool firstAidSpec = *(int*)(specInfoAddr + heroID * 40) == 0 && *(int*)(specInfoAddr + heroID * 40 + 4) == 27;


    int specBonus = 0;
    if (firstAidSpec) {
        specBonus += 1;
    }

    int unitLevel = *(int*)(c->esi + 0x78) + 1 + specBonus;

    int firstAidBonus = (5 + firstAidLevel * 5) * unitLevel;
    
    int countMonsters = *(int*)(c->esi + 0x4C);
    float countUnitsForShield = ceil(countMonsters / stackBonusModificator);
    int countUnitBonus = countUnitsForShield * unitLevel;

    int totalSheildCount = firstAidBonus + countUnitBonus;
    if (*(int*)(c->esi + 0x58) == 0 && !firstAidSpec) {
        totalSheildCount = totalSheildCount / 2;
    }

    *(int*)(c->esi + 0x94) = totalSheildCount;
    
    return EXEC_DEFAULT;
}


А вообще весь фул код переделанной первой помощи вот:
Go to the top of the pageAdd Nick
 
+Quote Post
DedMorozzz
сообщение 05 Feb 2017, 00:06
Сообщение #573

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




Выложил код в этой темке - http://forum.df2.ru/index.php?showtopic=36605


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post

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

 



Текстовая версия Сейчас: 29 March 2024 - 15:46
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика