// modified by Deva Winblood //:://///////////////////////////////////////////// //:: Animate Dead //:: NW_S0_AnimDead.nss //:: Copyright (c) 2001 Bioware Corp. //::////////////////////////////////////////////// /* Summons a powerful skeleton or zombie depending on caster level. */ //::////////////////////////////////////////////// //:: Created By: Preston Watamaniuk //:: Created On: April 11, 2001 //::////////////////////////////////////////////// #include "x2_inc_spellhook" void fnWatch(object oMaster) { // PURPOSE: For summone critter to know when to despawn effect eUnsum=EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_1); object oMe=OBJECT_SELF; SetLocalInt(oMe,"bWatcher",TRUE); //SendMessageToPC(oMaster,"DEBUG: '"+GetName(oMe)+"' Watching"); if (GetIsObjectValid(oMaster)==TRUE) { // valid master if (GetIsDead(oMaster)||GetCurrentAction(oMaster)==ACTION_REST||GetLocalInt(oMe,"bUnsummon")) { // despawn ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY,eUnsum,GetLocation(oMe),4.0); RemoveHenchman(oMaster,oMe); SetIsDestroyable(TRUE,FALSE,FALSE); DelayCommand(1.0,DestroyObject(oMe)); } // despawn DelayCommand(6.0,fnWatch(oMaster)); } // valid master else { // destroy self ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY,eUnsum,GetLocation(oMe),4.0); RemoveHenchman(oMaster,oMe); SetIsDestroyable(TRUE,FALSE,FALSE); DelayCommand(1.0,DestroyObject(oMe)); DelayCommand(6.0,fnWatch(oMaster)); } // destroy self } // fnWatch() void fnSetWatchers(object oMaster,float fDur) { // PURPOSE: Fire the watcher routines int nN=1; object oSum; oSum=GetAssociate(ASSOCIATE_TYPE_SUMMONED,oMaster,nN); while(GetIsObjectValid(oSum)) { // check for watch //SendMessageToPC(oMaster,"DEBUG: Summoned '"+GetName(oSum)+"'"); if (GetLocalInt(oSum,"bWatcher")!=TRUE) { // fire watch AssignCommand(oSum,fnWatch(oMaster)); DelayCommand(fDur,SetLocalInt(oSum,"bUnsummon",TRUE)); } // fire watch nN++; oSum=GetAssociate(ASSOCIATE_TYPE_SUMMONED,oMaster,nN); } // check for watch } // fnSetWatchers() void main() { /* Spellcast Hook Code Added 2003-06-23 by GeorgZ If you want to make changes to all spells, check x2_inc_spellhook.nss to find out more */ if (!X2PreSpellCastCode()) { // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell return; } // End of Spell Cast Hook //Declare major variables int nMetaMagic = GetMetaMagicFeat(); int nCasterLevel = GetCasterLevel(OBJECT_SELF); int nDuration = GetCasterLevel(OBJECT_SELF); if (nDuration<4) nDuration=4; //effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_UNDEAD); effect eSummon; //Metamagic extension if needed if (nMetaMagic == METAMAGIC_EXTEND) { nDuration = nDuration * 2; //Duration is +100% } if (nDuration>24) nDuration=24; //Summon the appropriate creature based on the summoner level if (nCasterLevel <= 5) { //Tyrant Fog Zombie eSummon = EffectSummonCreature("sumtyrzombie",VFX_FNF_SUMMON_UNDEAD); } else if ((nCasterLevel >= 6) && (nCasterLevel <= 9)) { //Skeleton Warrior eSummon = EffectSummonCreature("sumskelwar",VFX_FNF_SUMMON_UNDEAD); } else { //Skeleton Chieftain eSummon = EffectSummonCreature("sumskelchief",VFX_FNF_SUMMON_UNDEAD); } //Apply the summon visual and summon the two undead. //ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetSpellTargetLocation()); ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, GetSpellTargetLocation(), HoursToSeconds(nDuration)); DelayCommand(3.0,fnSetWatchers(OBJECT_SELF,HoursToSeconds(nDuration))); }