(01.11.2020 19:09)SergOz Wrote: Возможно ли сделать так, чтобы в бою с нейтралами можно было откупиться и сохранить армию?
Если да, то подскажите, плиз, как это сделать.
На ERM это технически сложно сделать.
Я делал когда-то (уже не помню кому и зачем. Вроде Армагу(стример такой) и вроде на SoD), да и то плагином.
Code:
_bool_ isRunAwayOfMonstre = false;
int __stdcall Y_RunAwayOfMonstreQ(LoHook* h, HookContext* c)
{
_BattleMgr_* bm = o_BattleMgr;
*(int*)0x695080 = c->eax; // сохраняем кол-во денег для уплаты выкупа
char* name; // будет хранить имя героя или монстра
isRunAwayOfMonstre = false; // переменная от кого сбегает герой (false == от героя противника, true == от монстра)
if(!bm->hero[1] && bm->current_side == 0) {
int cr_id = 149; // если в описании будет указана Стрелковая Башня, то есть ошибка в нижеидущем цикле
int value = 0;
for (int i=0; i<20; i++) {
if (bm->stack[1][i].creature_id != -1 && bm->stack[1][i].creature_id != 149 && bm->stack[1][i].count_current > 0) {
if (bm->stack[1][i].creature.AI_value > value) { // вычисляем наилучший живой стек у нейтралов (если есть улучшенный стек)
cr_id = bm->stack[1][i].creature_id;
value = bm->stack[1][i].creature.AI_value;
// break;
}
}
}
name = o_pCreatureInfo[cr_id].name_single;
isRunAwayOfMonstre = true;
} else {
name = bm->hero[1 - bm->current_side]->name;
}
sprintf(o_TextBuffer, o_GENRLTXT_TXT->GetString(34), name, c->eax);
c->return_address = 0x4749EB;
return NO_EXEC_DEFAULT;
}
int __stdcall Y_RunAwayOfMonstreBG(LoHook* h, HookContext* c)
{
// если герой сбегает за плату от нейтралов
// то пропускаем код передачи денег другому игроку
// при этом вычет денег у сбегающего игрока действует
if (isRunAwayOfMonstre) {
c->return_address = 0x478FA1;
return NO_EXEC_DEFAULT;
}
return EXEC_DEFAULT;
}
// делаем откуп в бою с нейтралами
_PI->WriteCodePatch(0x477EA9, "%n", 12);
_PI->WriteLoHook(0x4749B4, Y_RunAwayOfMonstreQ);
_PI->WriteHexPatch(0x478F77, "8918 BA 2B150000"); // меняем местами 2 инструкции кода, чтобы корректно устновить хук и сохранить код вычета денег при сбегании
_PI->WriteLoHook(0x478F77+2, Y_RunAwayOfMonstreBG);
}
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}