| 
 
				XEPOMAHT, с хуками я разобрался - раньше тупил, конечно, но сейчас уже понимаю, что к чему. Помните мой бредокод, "добавляющий" Колизей Магов? Глядите, как он похорошел    Основная функция: 
Code:
 char __stdcall AdvMng_4_Arena(HiHook* hook, void* AvdMng, _Hero_* hero, _MapItem_* obj, char xyz){
 _AdvMgr_* AvdMan = (_AdvMgr_*)AvdMng;
 char result = xyz;
 int SelectedSkill;
 bool isMagical;
 //Получение подтипа объекта через obj не работает, на выходе мусор
 ExecErmCmd("HE-1:P?y1/?y2/?y3");
 ExecErmCmd("OBy1/y2/y3:U?y4");
 
 if (y[4] == 0)
 isMagical = false;
 else
 isMagical = true;
 
 if (!CALL_2(int, __thiscall, 0x4E5630, hero, obj)) //check if visited
 {
 if (xyz)
 {
 CALL_3(int, __thiscall, 0x415CC0, AvdMan, 0, -1); //AdvMgr_SetTimer
 CALL_4(void, __thiscall, 0x415D40, AvdMan, 0, 1, 1); //AdvMgr_UpdateInfoPanel
 
 if (!isMagical)
 b_MsgBoxQ(o_Advevent_TXT->GetString(0), 10, -1, -1, 31, 2, 32, 2, -1, 0, -1, 0);
 else
 b_MsgBoxQ((char*)o_Advevent_2[0].c_str(), 10, -1, -1, 33, 2, 34, 2, -1, 0, -1, 0);
 
 if (o_WndMgr->result_dlg_item_id == 30729)
 {
 SelectedSkill = 0;
 }
 else if (o_WndMgr->result_dlg_item_id == 30730)
 {
 SelectedSkill = 1;
 }
 else
 return result;
 
 if (isMagical)
 SelectedSkill += 2;
 
 switch (SelectedSkill)
 {
 case 0:
 hero->attack += 2;
 if (hero->attack > 99)
 hero->attack = 99;
 break;
 case 1:
 hero->defence += 2;
 if (hero->defence > 99)
 hero->defence = 99;
 break;
 case 2:
 hero->power += 2;
 if (hero->power > 99)
 hero->power = 99;
 break;
 case 3:
 hero->knowledge += 2;
 if (hero->knowledge > 99)
 hero->knowledge = 99;
 break;
 default:
 break;
 }
 return CALL_2(int, __thiscall, 0x4E5650, hero, obj); //set as visited
 }
 }
 if (xyz)
 {
 if (!isMagical)
 b_MsgBoxQ(o_Advevent_TXT->GetString(1), 1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0);
 else
 b_MsgBoxQ((char*)o_Advevent_2[1].c_str(), 1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0);
 result = (o_WndMgr->result_dlg_item_id == DIID_OK);
 }
 return result;
 }
 
В DllMain также должно стоять вот это:  
Code:
 Magic->WriteHiHook(0x49E440, SPLICE_, EXTENDED_, THISCALL_, AdvMng_4_Arena);
 
P.S. Magic - это моя PatсherInstance
Если Вы знаете, какая функция в WERD способна разрешить мою проблему, то не могли бы Вы прислать ее код прямо сюда, чтобы я не тратил на поиск в три раза больше времени? Кстати, вопрос не по скриптам, мне просто интересно понять стоящую за этим логику: почему код любой функции начинается с команды PUSH? Подскажите пожалуйста.   Berserker , если Вы добавите, будет здорово   SergOz , проблема не в помещении объекта, а в создании для него триггера. И, да, такие места действительно должны быть тайными, чтобы игрок в начале игры не знал, где их искать.
			 
 Создал новый глобальный мод: WoG Ultra Edition
 
				
(This post was last modified: 10.02.2021 13:50 by Raistlin.)
 |