Mam dwa problemy z wymienionym tematem. A mianowicie:
1)Wyciągam czar, który ma zmienione nazwy visualfx i pfx(różniące się od "nazwy czaru") i npc mają wywalone na fakt ich wyciągnięcia. Więc zamiast powiedzieć "Skończ z tą magią" po prostu nie reagują. Jednak czar "wyświetla" się poprawnie w ręce.
2)Wyciągam czar, który ma takie same nazwy(przykładowo Firerain2 w każdym skrypcie) i npc na niego reagują, jednak zamiast pojawić się odpowiedni efekt w ręce, jest trzymana runa.
Dodatkowo za ubicie czarem nie dostaję expa, a npc zamiast oglądać walkę i przykładowo zaatakować nas po zabiciu innego npc'a, mówią tylko "O walka" i wracają do swoich rutyn(nawet nie atakują).
Skrypt czaru(lekkie zmiany w stosunku do tego, co podrzucał Nefario z Rozdroży)
const int SPL_COST_Pyrokinesis1 = 10;
const int SPL_DAMAGE_Pyrokinesis1 = 30;
instance Spell_Pyrokinesis1(C_Spell_Proto)
{
time_per_mana = 500;
damage_per_level = SPL_DAMAGE_Pyrokinesis1;
spellType = SPELL_BAD;
damagetype = DAM_MAGIC;
targetCollectAlgo = TARGET_COLLECT_FOCUS;
targetCollectRange = 1000;
targetCollectType = TARGET_TYPE_NPCS;
};
func int Spell_Logic_Pyrokinesis1(var int manaInvested)
{
if(!Npc_IsInState(other,zs_psidefense) || Npc_IsPlayer(other))
{
if(self.attribute[ATR_MANA] < SPL_COST_Pyrokinesis1)
{
return SPL_DONTINVEST;
};
if(Npc_GetActiveSpellIsScroll(self))
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
}
else
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_COST_Pyrokinesis1;
};
Npc_ClearAIQueue(other);
AI_StandupQuick(other);
AI_StartState(other,zs_psidefense,1,"");
B_MagicHurtNpc(self,other,SPL_DAMAGE_Pyrokinesis1);
if(other.attribute[ATR_Hitpoints] <= 0)
{
Npc_ClearAIQueue(other);
AI_Standup(other);
return SPL_SENDCAST;
};
}
else if(Npc_IsInState(other,zs_psidefense))
{
if(self.attribute[ATR_MANA] < SPL_COST_Pyrokinesis1)
{
return SPL_DONTINVEST;
};
if(Npc_GetActiveSpellIsScroll(self))
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
}
else
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_COST_Pyrokinesis1;
};
Npc_ClearAIQueue(other);
AI_StandupQuick(other);
AI_StartState(other,zs_psidefense,1,"");
B_MagicHurtNpc(self,other,SPL_DAMAGE_Pyrokinesis1);
if(other.attribute[ATR_Hitpoints] <= 0)
{
Npc_ClearAIQueue(other);
AI_Standup(other);
return SPL_SENDCAST;
};
};
/* if(self.attribute[ATR_MANA] < SPL_COST_Pyrokinesis1)
{
return SPL_DONTINVEST;
};
*/
/* if(Npc_GetStateTime(other) >= 1)
{
Npc_SetStateTime(other,0);
//B_MagicHurtNpc(self,other,SPL_DAMAGE_Pyrokinesis1);
if(Npc_GetActiveSpellIsScroll(self))
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
}
else
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_COST_Pyrokinesis1;
};
if(other.attribute[ATR_Hitpoints] <= 0)
{
Npc_ClearAIQueue(other);
AI_Standup(other);
return SPL_SENDCAST;
};
};
*/
return SPL_NEXTLEVEL;
};
func void Spell_Cast_Pyrokinesis1(var int spellLevel)
{
self.aivar[AIV_SelectSpell] += 1;
};
Wpisy do Constants.d
const int SPL_Pyrokinesis1 = 125;
"Pyrokinesis1" // 125 SPL_Pirokineza
Wpis do Spell_ProcessMana.d
if (activeSpell == SPL_Pyrokinesis1 ) { return Spell_Logic_Pyrokinesis1 (manaInvested); };
ZS_Psidefense.d
func void ZS_PsiDefense()
{
PrintDebugNpc (PD_ZS_CHECK, "ZS_PsiDefense");
Npc_PercEnable (self, PERC_ASSESSDAMAGE , ZS_ReactToDamage);
Npc_PercEnable (self, PERC_ASSESSSTOPMAGIC, B_StopPsiDefense);
if ( !Npc_HasBodyFlag(self, BS_FLAG_INTERRUPTABLE) )
{
PrintDebugNpc (PD_MAGIC, "bodystate not interuptable, standing up...");
AI_StandUp (self);
};
};
func void ZS_PsiDefense_Loop()
{
PrintDebugNpc (PD_ZS_LOOP, "ZS_PsiDefense Loop");
if ( !Npc_IsDead(self) && !Npc_IsInState(self, ZS_Unconscious) && !C_BodystateContains(self,BS_SWIM) && !C_BodystateContains(self,BS_DIVE) )
{
PrintDebugNpc (PD_MAGIC, "...NSC ist nicht bewußtlos / tot / schwimmend / tauchend");
AI_PlayAni (other, "S_CON_VICTIM");
};
};
func void ZS_PsiDefense_End()
{
PrintDebugNpc (PD_ZS_CHECK, "ZS_PsiDefense End");
};
func void B_StopPsiDefense ()
{
Npc_PercEnable (self, PERC_ASSESSMAGIC, B_AssessMagic); //falls in diesem Frame (während des Ausführens des B_) noch ein neuer Spruch wirkt
Npc_ClearAIQueue(self);
AI_StandUp (self);
if (self.guild < GIL_SEPERATOR_HUM)
{
B_AssessDamage();
AI_ContinueRoutine (self);
}
else
{
Npc_SetTempAttitude (self, ATT_HOSTILE);
AI_ContinueRoutine (self);
};
};
VisualFXInst.d
INSTANCE spellFX_Pyrokinesis1(CFx_Base_Proto)
{
visname_S = "MFX_Pyrokinesis1_INIT";
visAlpha = 1;
emtrjmode_s = "FIXED";
emTrjOriginNode = "ZS_RIGHTHAND";
emtrjtargetnode = "BIP01 HEAD";
emtrjnumkeys = 1;
emtrjnumkeysvar = 1;
emtrjangleelevvar = 15;
emtrjangleheadvar = 0;
emtrjdynupdatedelay = 0;
emFXInvestTarget_S = "spellFX_Pyrokinesis1_target";
emTrjTargetRange = 0;
emTrjTargetElev = 0;
};
INSTANCE spellFX_Pyrokinesis1_KEY_CAST (C_ParticleFXEmitKey)
{
pfx_ppsIsLoopingChg = 1;
};
INSTANCE spellFX_Pyrokinesis1_TARGET(CFx_Base_Proto)
{
visname_S = "MFX_Pyrokinesis1_TARGET";
emtrjmode_s = "FIXED";
emTrjOriginNode = "BIP01 HEAD";
lightPresetname = "FIRESMALL";
emTrjTargetRange = 0;
emTrjTargetElev = 0;
sendAssessMagic = 1;
emtrjdynupdatedelay = 0.01;
sfxid = "MFX_Telekinesis_target";
sfxisambient = 1;
};
PFXInstMagic.d
INSTANCE MFX_Pyrokinesis1_INIT (C_PARTICLEFX)
{
ppsvalue = 800.000000000;
ppsscalekeys_s = "1";
ppsislooping = 1;
ppsissmooth = 1;
ppsfps = 1.000000000;
shptype_s = "SPHERE";
shpfor_s = "object";
shpoffsetvec_s = "0 0 0";
shpdistribtype_s = "RAND";
shpdim_s = "15";
shpscalekeys_s = "1";
shpscaleislooping = 1;
shpscaleissmooth = 1;
shpscalefps = 2.000000000;
dirmode_s = "NONE";
dirfor_s = "object";
dirmodetargetfor_s = "OBJECT";
dirmodetargetpos_s = "0 0 0";
dirangleheadvar = 180.000000000;
dirangleelevvar = 180.000000000;
velavg = 0.010000000;
lsppartavg = 150.000000000;
flygravity_s = "0 0 0";
flycolldet_b = 0;
visname_s = "HUMANBURN.TGA";
visorientation_s = "VELO";
vistexisquadpoly = 1;
vistexanifps = 18.000000000;
vistexaniislooping = 1;
vistexcolorstart_s = "255 255 255";
vistexcolorend_s = "255 150 0";
vissizestart_s = "5 5";
vissizeendscale = 8.000000000;
visalphafunc_s = "ADD";
visalphastart = 255.000000000;
};
INSTANCE MFX_Pyrokinesis1_ORIGIN (C_PARTICLEFX)
{
ppsvalue = 20.000000000;
ppsscalekeys_s = "3 2 1";
ppsislooping = 1;
ppsissmooth = 1;
ppsfps = 2.000000000;
shptype_s = "SPHERE";
shpfor_s = "object";
shpoffsetvec_s = "0 0 0";
shpdistribtype_s = "RAND";
shpisvolume = 1;
shpdim_s = "30";
shpscalekeys_s = "1";
shpscaleislooping = 1;
shpscaleissmooth = 1;
shpscalefps = 2.000000000;
dirmode_s = "TARGET";
dirfor_s = "object";
dirmodetargetfor_s = "OBJECT";
dirmodetargetpos_s = "0 0 0";
dirangleheadvar = 180.000000000;
dirangleelevvar = 180.000000000;
velavg = 0.008000000;
velvar = 0.029999999;
lsppartavg = 2000.000000000;
flygravity_s = "0 0 0";
flycolldet_b = 0;
visname_s = "FIREFLARE.TGA";
visorientation_s = "NONE";
vistexanifps = 18.000000000;
vistexaniislooping = 1;
vistexcolorstart_s = "255 220 220";
vistexcolorend_s = "255 220 220";
vissizestart_s = "10 10";
vissizeendscale = 8.000000000;
visalphafunc_s = "ADD";
visalphastart = 100.000000000;
};
INSTANCE MFX_Pyrokinesis1_TARGET (C_PARTICLEFX)
{
ppsvalue = 50.000000000;
ppsscalekeys_s = "1";
ppsislooping = 1;
ppsissmooth = 1;
ppsfps = 2.000000000;
shptype_s = "SPHERE";
shpfor_s = "WORLD";
shpoffsetvec_s = "0 0 0";
shpdistribtype_s = "RAND";
shpdim_s = "200";
shpscalekeys_s = "1";
shpscaleislooping = 1;
shpscaleissmooth = 1;
shpscalefps = 2.000000000;
dirmode_s = "TARGET";
dirfor_s = "object";
dirmodetargetfor_s = "OBJECT";
dirmodetargetpos_s = "0 0 0";
dirangleheadvar = 180.000000000;
dirangleelevvar = 180.000000000;
velavg = 0.300000012;
lsppartavg = 1000.000000000;
flygravity_s = "0 0 0";
flycolldet_b = 0;
visname_s = "FIREFLARE.TGA";
visorientation_s = "NONE";
vistexanifps = 18.000000000;
vistexaniislooping = 1;
vistexcolorstart_s = "20 0 0";
vistexcolorend_s = "255 200 200";
vissizestart_s = "10 10";
vissizeendscale = 20.000000000;
visalphafunc_s = "ADD";
visalphastart = 255.000000000;
visalphaend = 50.000000000;
trlfadespeed = 0.400000006;
trltexture_s = "MFX_PYROKINESIS_TARGETTRAIL.TGA";
trlwidth = 4.000000000;
};
Więc przy tym, co jest teraz, wywołuje się "akcja" problemu nr 2.