23
« dnia: 2019-11-30, 23:37 »
Hej. Takie pytanie - gdzie można zmienić/stworzyć skrypt podobny do skryptu bryły lodu/lodowej fali dla konkretnej instancji czaru? Chodzi mi dokładnie o coś takiego, że npc po oberwaniu czarem załącza animację S_FIRE_VICTIM na powiedzmy 10 sekund, w tym czasie traci 10 hp(czyli po 1 hp/s) i atakuje nas? Próbowałem przerobić ZS_MagicFreeze, ale coś nie wyszło.
// *****************
// B_StopMagicFreeze1
// *****************
func void B_RestartFreeze1()
{
if (Npc_GetLastHitSpellID(self) == SPL_IceCube)
|| (Npc_GetLastHitSpellID(self) == SPL_IceWave)
{
Npc_SetStateTime(self,0);
};
};
func void B_StopMagicFreeze1()
{
Npc_PercEnable (self, PERC_ASSESSMAGIC, B_AssessMagic);
Npc_ClearAIQueue(self);
AI_StandUp (self);
if (self.guild < GIL_SEPERATOR_HUM)
{
B_AssessDamage();
}
else
{
Npc_SetTempAttitude (self, ATT_HOSTILE); //falls nicht schon Gilden-Attitüde hostile ist
};
// nach Aufruf dieses Befehles wird die Loop über return LOOP_END beendet
};
// **************
// ZS_MagicFreeze1
// **************
func int ZS_MagicFreeze1()
{
Npc_PercEnable (self, PERC_ASSESSMAGIC, B_RestartFreeze1); // falls ein NSC nochmal von einem Freezespell getroffen wurde, so muss die State Time reseted werden
Npc_StopAni(self, "S_FIRE_VICTIM"); // falls der NSC am Zappeln ist, brich die Ani ab
// Opfer wird in Bodystate Unconscious versetzt
if (!C_BodyStateContains(self, BS_UNCONSCIOUS))
{
AI_PlayAniBS (self, "T_STAND_2_FREEZE_VICTIM", BS_UNCONSCIOUS);
Wld_PlayEffect("VOB_MAGICBURN", self, self, 0, 0, 0, FALSE );
};
self.aivar[AIV_FreezeStateTime] = 0;
};
func int ZS_MagicFreeze1_Loop ()
{
// EXIT LOOP IF...
if (Npc_GetStateTime(self) >= 10)
{
B_StopMagicFreeze1();
return LOOP_END;
};
// LOOP FUNC
if (Npc_GetStateTime(self) != self.aivar[AIV_FreezeStateTime])
{
self.aivar[AIV_FreezeStateTime] = Npc_GetStateTime(self);
// ------ Damage abziehen, aber NICHT sterben (immer mindeststens 1 LE behalten) ------
if (self.attribute[ATR_HITPOINTS] > (self.attribute[ATR_HITPOINTS] - SPL_Damage_ChargeFireball1))
{
// feuer wesen erhalten doppelten schaden
if (self.guild == GIL_FIREGOLEM)
|| (self.aivar[AIV_MM_REAL_ID] == ID_FIREWARAN)
|| (self.aivar[AIV_MM_REAL_ID] == ID_DRAGON_FIRE)
{
B_MagicHurtNpc (other, self, SPL_Damage_ChargeFireball1/2);
return LOOP_CONTINUE;
};
// eis wesen erhalten halben schaden
if (self.guild == GIL_ICEGOLEM)
|| (self.aivar[AIV_MM_REAL_ID]==ID_DRAGON_ICE)
{
B_MagicHurtNpc (other, self, SPL_Damage_ChargeFireball1*2);
return LOOP_CONTINUE;
};
// rest ganz normal
B_MagicHurtNpc (other, self, 5);
};
};
return LOOP_CONTINUE;
};
func void ZS_MagicFreeze1_End()
{
};
Skrypt przerobionego ZS'a. Do tego skrypt czaru:
// ******************
// SPL_ChargeFireball1
// ******************
const int SPL_Cost_ChargeFireball1 = 20; //4*40
const int STEP_ChargeFireball1 = 5;
const int SPL_Damage_ChargeFireball1 = 30;
INSTANCE Spell_ChargeFireball1 (C_Spell_Proto)
{
time_per_mana = 100;
damage_per_level = SPL_Damage_ChargeFireball1;
damageType = DAM_MAGIC;
canTurnDuringInvest = TRUE;
};
func int Spell_Logic_ChargeFireball1 (var int manaInvested)
{
if (self.attribute[ATR_MANA]<STEP_ChargeFireball1)
{
return SPL_DONTINVEST;
};
if (manaInvested <= STEP_ChargeFireball1*1)
{
self.aivar[AIV_SpellLevel] = 1; //Start mit Level 1
return SPL_STATUS_CANINVEST_NO_MANADEC;
}
else if (manaInvested > (STEP_ChargeFireball1*1))
&& (self.aivar[AIV_SpellLevel] <= 1)
{
self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_ChargeFireball1);
if (self.attribute[ATR_MANA]<0)
{
self.attribute[ATR_MANA]=0;
};
self.aivar[AIV_SpellLevel] = 2;
return SPL_NEXTLEVEL; //Lev2 erreicht
}
else if (manaInvested > (STEP_ChargeFireball1*2))
&& (self.aivar[AIV_SpellLevel] <= 2)
{
self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_ChargeFireball1);
if (self.attribute[ATR_MANA]<0)
{
self.attribute[ATR_MANA]=0;
};
self.aivar[AIV_SpellLevel] = 3;
return SPL_NEXTLEVEL; //Lev3 erreicht
}
else if (manaInvested > (STEP_ChargeFireball1*3))
&& (self.aivar[AIV_SpellLevel] <= 3)
{
self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_ChargeFireball1);
if (self.attribute[ATR_MANA]<0)
{
self.attribute[ATR_MANA]=0;
};
self.aivar[AIV_SpellLevel] = 4;
return SPL_NEXTLEVEL; //Lev4 erreicht
}
else if (manaInvested > (STEP_ChargeFireball1*3))
&& (self.aivar[AIV_SpellLevel] == 4)
{
return SPL_SENDCAST;
};
return SPL_STATUS_CANINVEST_NO_MANADEC;
};
func void Spell_Cast_ChargeFireball1(var int spellLevel)
{
self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_ChargeFireball1);
if (self.attribute[ATR_MANA]<0)
{
self.attribute[ATR_MANA]=0;
};
self.aivar[AIV_SelectSpell] += 1;
};
No i wpis do B_AssessMagic:
if (Npc_GetLastHitSpellID(self) == SPL_ChargeFireball1)
{
Npc_ClearAIQueue (self);
//B_ClearPerceptions (self); //Sonst reagiert der NPC nicht!
AI_StartState(self, ZS_MagicFreeze1, 0, "");
return;
};
Problem jest tego typu, że po drugim trafieniu dopiero odgrywana jest animacja, która trwa w nieskończoność. Do tego na npc nie pojawia się efekt ognia(czyt. nie płonie) i nie zabiera mu tych dodatkowych hp[czyli zamiast dostać powiedzmy 40 dmg otrzymuje 30).