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.)
 
			 
		 |