[G2]Efekt czaru na npc i czas trwania animacji postaci 1107 1

O temacie

Autor Graveir

Zaczęty 30.11.2019 roku

Wyświetleń 1107

Odpowiedzi 1

Graveir

Graveir

Użytkownicy
Avatar Twilight Sparkle / Pożeracz serc
posty1275
Propsy235
ProfesjaGracz
  • Użytkownicy
  • Avatar Twilight Sparkle / Pożeracz serc
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).
 
Mój obecny sprzęt PC:
Intel core i5-4590
8 gb ram
Geforce GTX 1050Ti

Graveir

Graveir

Użytkownicy
Avatar Twilight Sparkle / Pożeracz serc
posty1275
Propsy235
ProfesjaGracz
  • Użytkownicy
  • Avatar Twilight Sparkle / Pożeracz serc
Dodam, że jak użyję "AI_PlayAniBS       (self, "T_STAND_2_FREEZE_VICTIM", BS_UNCONSCIOUS); " to postać unieruchamia się na parę sekund + traci hp czasowo, ale dziwnie to wygląda, żeby npc po oberwaniu czarem ognia zamarzał.
 
Mój obecny sprzęt PC:
Intel core i5-4590
8 gb ram
Geforce GTX 1050Ti


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry