Rozwiązałem problem z zacinającymi się oCMobSwitcher'ami w G1.
Potrzebny Ikarus/LeGo.
Init_Swata: ( lub użyć Tick Tocka / hooka )
FF_Apply(FixStuckedSwitchers);
Gdzieś pod spodem:
func int Hlp_Is_oCMobSwitch (var int ptr) {
if (!ptr) { return 0; };
const int oCMobSwitch_vtbl = 8245988; // Yea, it doesn't exist in Ikarus :/
var int vtbl; vtbl = MEM_ReadInt (ptr);
return (vtbl == oCMobSwitch_vtbl);
};
func void FixStuckedSwitchers() {
var oCNpc her; her = Hlp_GetNpc (hero);
if (!Hlp_IsValidNpc (hero))
|| (!her.focus_vob) { return; };
if (Hlp_Is_oCMobSwitch (her.focus_vob)) {
var oCMobInter mob; mob = _^ (her.focus_vob);
if (Hlp_StrCmp (mob.triggerTarget, "")) { return; };
var zCMover mov; mov = _^ (MEM_SearchVobByName (mob.triggerTarget));
if (mob.state == 0)
&& (mov.moverState == 0) {
mob.state = 1;
mob.state_target = 1;
};
};
};
I tyle, nic nie trzeba więcej robić.
Chciałem na początku z przeszukiwaniem listy oCMobSwitcher'ów, ale to za długo by trwało.
Tutaj wersja dla rutyn:
func void FixStuckedSwitchers(var C_Npc slf) {
var oCNpc her; her = Hlp_GetNpc (slf);
if (!Hlp_IsValidNpc (slf))
|| (!her.focus_vob) { return; };
if (Hlp_Is_oCMobSwitch (her.focus_vob)) {
var oCMobInter mob; mob = _^ (her.focus_vob);
if (Hlp_StrCmp (mob.triggerTarget, "")) { return; };
var zCMover mov; mov = _^ (MEM_SearchVobByName (mob.triggerTarget));
if (mob.state == 0)
&& (mov.moverState == 0) {
mob.state = 1;
mob.state_target = 1;
};
};
};