![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#381
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Работает! Снижает, правда всем юнитам, но уже чётко по раундам. Проверил и на 1м и на 2м что бы снижал, дважды отнимает всем. В общем всё ок
|
|
|
![]()
Сообщение
#382
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Осталось только доп. условие (проверку уровня тактики героя) на это повесить:
Код if ( roundNumber == 1 ) *(int*)(c->ecx + 196) -= 2; |
|
|
![]()
Сообщение
#383
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Осталось только доп. условие (проверку уровня тактики героя) на это повесить: Код if ( roundNumber == 1 ) *(int*)(c->ecx + 196) -= 2; Если правильно понимаю, то и только союзника уменьшать скорость ![]() Сейчас всем юнитам Т.е. такой код сейчас: Код 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й ход. И у того у кого есть тактика |
|
|
![]()
Сообщение
#384
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата Проверил и на 1м и на 2м что бы снижал, дважды отнимает всем. Дважды не надо. Первый хук добавляет 2 к скорости. В конце 1-го раунда (roundNumber == 1) мы эти 2 ед. забираем. |
|
|
![]()
Сообщение
#385
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Цитата Проверил и на 1м и на 2м что бы снижал, дважды отнимает всем. Дважды не надо. Первый хук добавляет 2 к скорости. В конце 1-го раунда (roundNumber == 1) мы эти 2 ед. забираем. не, я спецом. Проверить что это именно раунд и что всё работает корректно. Я часто для тестов добавляю доп условия, когда что-то настраиваю. В финале этого не будет, само собой |
|
|
![]()
Сообщение
#386
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Теперь нужно "выцепить" из combatManager уровень тактики героя левой (0) стороны и всё будет работать.
|
|
|
![]()
Сообщение
#387
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#388
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата И у врага отнимает 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, реально путаюсь ) |
|
|
![]()
Сообщение
#389
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Код int side = *(int*)(cmAddr + 0x132B8); ?
if (side == 0) { // отнять скорость } |
|
|
![]()
Сообщение
#390
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Не, мы проверяем: если наша сторона левая (0) и у героя есть тактика, отнять скорость в конце первого раунда.
Хотя может и не сработать. Тогда есть запасной вариант. |
|
|
![]()
Сообщение
#391
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
у меня слегка по другому получилось, но смысл тот же:
Код 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; } И отнимает всё равно у всех |
|
|
![]()
Сообщение
#392
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Я уже понял. Счас исправим.
|
|
|
![]()
Сообщение
#393
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
в банке перепроверил. site==0 не отнимает. ==1 отнимает у всех. 1 мин ещё раз перепроверю, но вроде так
PS: да, при site==1 в банке отнимает точно у всех |
|
|
![]()
Сообщение
#394
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Код 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; } |
|
|
![]()
Сообщение
#395
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
Силач! Всё работает, спасибо
![]() Итого финальный код, который будет давать +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); |
|
|
![]()
Сообщение
#396
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Проверь ещё боевые машины на всякий. Что у них со скоростью?
|
|
|
![]()
Сообщение
#397
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#398
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Ещё *(int*)0x699420 можно заменить на cmAddr, раз уж определили переменную. А раунд проще так получить:
Код int roundNumber = c->eax - 30000; // *(int*)(cmAddr + 0x132A0) - 30000;
|
|
|
![]()
Сообщение
#399
|
|
![]() God Сообщений: 267 Спасибо сказали: 25 раз ![]() |
|
|
|
![]()
Сообщение
#400
|
|
Immortal Сообщений: 798 Спасибо сказали: 555 раз ![]() |
Цитата Вот это не работает, если c->eax - 30000 использовать. Не отнимается скорость Это я уже не знаю, почему. В контексте хука (c->eax - 30000) - это номер раунда. Нужно у baratorch'а спрашивать, почему не работает. У меня в ассемблере - работает. |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 4 October 2025 - 21:29 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|