16
« dnia: 2021-11-19, 20:23 »
Do 3 razy sztuka..
Próbuję zrobić system, który poprawia AIV_ITEMSCHWEIN, aby nie reagował na przedmioty na które nie powinien reagować. Oczywiscie hookuję funkcję ikarusem/lego. Udało mi się zrobić już upuszczanie przedmiotu przy NPC, zostało jeszcze upuszczanie broni czy co tam osoba trzyma w dłoni przy śmierci/unconscious. Niestety nie jestem w stanie określić która z funkcji to określa
Próby z róznymi funkcjami wygląda tak:
func void Hook_oCNPC_DropFromSlot()
{
const int oCNpc__DropFromSlotAddr = 6972016; //006A6270
HookEngineF(oCNpc__DropFromSlotAddr, 6, EVT_oCNPC_DropFromSlot);
};
func void EVT_oCNPC_DropFromSlot()
{
var c_npc slf; slf = MEM_PtrToInst(ECX);
if(Npc_GetInvItemBySlot(slf, INV_WEAPON, 1))
{
item.change_atr[0] = 99;
PrintScreen (ConcatStrings(ConcatStrings(slf.name, ": DROPFROMSLOT, flage AIV_ITEMSCHWEIN przedmiotu: "), item.name), 15,40,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
} else
{
PrintScreen (ConcatStrings(slf.name, ": DROPFROMSLOTNIC NIE MA NA SLOT1"), 15,42,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
};
if(Npc_GetInvItemBySlot(slf, INV_WEAPON, 2))
{
item.change_atr[0] = 99;
PrintScreen (ConcatStrings(ConcatStrings(slf.name, ": DROPFROMSLOT, flage AIV_ITEMSCHWEIN przedmiotu: "), item.name), 15,44,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
} else
{
PrintScreen (ConcatStrings(slf.name, ": DROPFROMSLOTNIC NIE MA NA SLOT2"), 15,46,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
};
};
func void Hook_oCNPC_DropAllInHand()
{
const int oCDropAllInHandAddr = 6898224; //694230
HookEngineF(oCDropAllInHandAddr, 1, EVT_oCNPC_DropAllInHand);
};
func void EVT_oCNPC_DropAllInHand()
{
var c_npc slf; slf = MEM_PtrToInst(ECX);
PrintScreen (ConcatStrings(slf.name, "DropAllInHand, enter:"), 65,5,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
if(Npc_GetInvItemBySlot(slf, INV_WEAPON, 1))
{
item.change_atr[0] = 99;
PrintScreen (ConcatStrings(ConcatStrings(slf.name, ": DROPALLI HAND, fl AIV_ITEMSCHWEIN SLOT1 ITEMOWI:"), item.name), 15,70,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
} else
{
PrintScreen (ConcatStrings(slf.name, ": DROPALLI NIC NIE MA NA SLOT1"), 15,72,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
};
if(Npc_GetInvItemBySlot(slf, INV_WEAPON, 2))
{
item.change_atr[0] = 99;
PrintScreen (ConcatStrings(ConcatStrings(slf.name, ": DROPALLINHAND, fl AIV_ITEMSCHWEIN SLOT2 ITEMOWI:"), item.name), 15,70,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
} else
{
PrintScreen (ConcatStrings(slf.name, ": DROPALLI NIC NIE MA NA SLOT2"), 15,74,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
};
};
func void Hook_oCNpc_EquipWeapon()
{
const int oCNpc_EquipWeaponAddr = 6908960; //696C20
HookEngineF(oCNpc_EquipWeaponAddr, 1, EVT_oCNpc_EquipWeapon);
};
func void EVT_oCNpc_EquipWeapon()
{
var c_npc slf; slf = MEM_PtrToInst(ECX);
var C_ITEM itm; itm = MEM_PtrToInst(MEM_ReadInt(ESP + 8));
PrintScreen ("wchodzenie w equip wepaon", 15,60,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
if (!Hlp_IsValidItem (itm))
{
PrintScreen ("ZLY ITEM", 15,62,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
return;
};
PrintScreen ("EquipWeapon: ZMIENIAMY ITEMSWINIE", 15,62,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
itm.change_atr[0] = 99;
};
func void Hook_oCNpc_Equip()
{
const int oCNpc_EquipAddr = 6908144; //6968F0
HookEngineF(oCNpc_EquipAddr, 3, EVT_oCNpc_Equip);
};
func void EVT_oCNpc_Equip()
{
var c_npc slf; slf = MEM_PtrToInst(ECX);
var C_ITEM itm; itm = MEM_PtrToInst(MEM_ReadInt(ESP + 8));
PrintScreen ("wchodzenie w equip", 15,64,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
if (!Hlp_IsValidItem (itm))
{
PrintScreen ("ZLY ITEM", 15,66,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
return;
};
PrintScreen ("Equip: ZMIENIAMY ITEMSWINIE", 15,66,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
itm.change_atr[0] = 99;
};
func void Hook_oCNpc_EquipItem()
{
const int oCNpc_EquipItemAddr = 6879552; //68F940
HookEngineF(oCNpc_EquipItemAddr, 2, EVT_oCNpc_EquipItem);
};
func void EVT_oCNpc_EquipItem()
{
var c_npc slf; slf = MEM_PtrToInst(ECX);
var C_ITEM itm; itm = MEM_PtrToInst(MEM_ReadInt(ESP+48+4));
PrintScreen ("wchodzenie w equipITEM", 15,60,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
if (!Hlp_IsValidItem (itm))
{
PrintScreen ("ZLY ITEM", 15,62,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
return;
};
PrintScreen ("ZMIENIAMY ITEMSWINIE", 15,62,"FONT_OLD_10_WHITE.TGA",_TIME_MESSAGE_GIVEN);
itm.change_atr[0] = 99;
};
Nie wiem czy wszędzie są itemy poprawnie przekazane (jak ktoś wie jak to robić, i jest w stanie wytłumaczyć, można używać stricte programistycznego jezyka bo zawodowo jestem programistą cepa; starałem się sledzić skąd po kolei w danym rejestrze brał się itemek, ale nie wiem czy jest to dobrze zrobione, prawdopodobnie moznaby jakieś funkcje powywoływać ręcznie i pobrać ten item), ale ogólnie te funkcje.. w ogóle się nie wywołują. Np żadna z tych z rodziny "equip" nie pokazuje się ani razu, przy zakladaniu czegokolwiek przez kogokolwiek. Jedyna funkcja, jaka sie wywołuje to DropFromSlot(), ale nie mam pojęcia kiedy, bo zdaje się robić to dość losowo, czasem gdy przejdę koło NPC, czasem gdy przyzwę NPC insertem, gdy postać zginie zazwyczaj sie wywołuje, ale nie zawsze itp.
Generalnie w systemie rozchodzi się o to, zeby ustawić itemowi change_atr[0] = 99;
. Najłatwiej i najsensowniej wydaje mi sie ze w funkcjach equip, bo potem by to nie lagowało ewentualnie przy zabijaniu wiekszej ilości NPC na raz, ale tak jak mówiłem nie działa to.