Files
HeroesStone_PRC8/_module/nss/corpse_spell.nss
Jaysyn904 1eefc84201 Initial Commit
Initial Commit.
2025-09-14 15:40:46 -04:00

113 lines
4.0 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Name corpse_spell
//:: FileName
//::
//:://////////////////////////////////////////////
/*
Responds to the onspellcastat event of the placeable.
Handles the resurrection and the raise of dead creatures/PC.
*/
//:://////////////////////////////////////////////
//:: Created By: Alexandre Brunel
//:: Created On: 21/04/2003
//:://////////////////////////////////////////////
#include "corpse_lib"
void next2(object corpse,string script);
void next1(object PC,int spell)
{
location moveTo = GetLocation(OBJECT_SELF);
effect resurrection = EffectResurrection();
ApplyEffectToObject(DURATION_TYPE_INSTANT,resurrection,PC);
object corpse = OBJECT_SELF;
AssignCommand(PC,ClearAllActions(TRUE));
AssignCommand(PC,ActionJumpToLocation(moveTo));
//AssignCommand(PC,ActionDoCommand(next2(corpse,script)));
AssignCommand(PC,ActionDoCommand(SetCommandable(TRUE)));
AssignCommand(PC,SetCommandable(FALSE));
effect eVis = EffectVisualEffect(VFX_IMP_RAISE_DEAD);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,eVis,GetLocation(OBJECT_SELF));
if(spell == SPELL_RESURRECTION)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(PC)),PC);
}
DeleteLocalObject(PC,CorpsePCCorpse);
giveBackItems(PC,TRUE,TRUE,TRUE);
}
void next2(object corpse,string script)
{
object PC = OBJECT_SELF;
effect death = EffectDeath(FALSE,FALSE);
SetLocalObject(PC,CorpsePCCorpse,PC);
ApplyEffectToObject(DURATION_TYPE_INSTANT,death,PC);
//AssignCommand(corpse,SetLocalObject(OBJECT_SELF,CorpseCreatureCorpse,PC));
AssignCommand(corpse,giveBackItems(PC,TRUE,TRUE,TRUE));
AssignCommand(corpse,SetCommandable(TRUE));
//AssignCommand(corpse,ActionWait(3.0));
AssignCommand(corpse,ActionDoCommand(ExecuteScript(script,OBJECT_SELF)));
//AssignCommand(corpse,ActionDoCommand(DeleteLocalObject(PC,CorpsePCCorpse)));
AssignCommand(corpse,ActionDoCommand(SetCommandable(TRUE)));
AssignCommand(corpse,SetCommandable(FALSE));
}
void main()
{
int spell = GetLastSpell();
object this = OBJECT_SELF;
object caster = GetLastSpellCaster();
object target = GetLocalObject(OBJECT_SELF,CorpseCreatureCorpse);
object PC = GetLocalObject(target,CorpsePCCorpse);
SetLocalObject(OBJECT_SELF,CorpseSpellCaster,caster);
//WriteTimestampedLogEntry("Spell casted on corpse: "+IntToString(spell));
if(!GetCorpseIsNotResurectable(target) && GetLocalString(target,CorpseDeadPCLeftID) == "")
{
if(SPELL_RESURRECTION == spell)
{
if(GetIsObjectValid(PC))
{
//target = PC;
DestroyEquipment(target);
//GetItemsInInventory(target,0,FALSE,OBJECT_INVALID,TRUE);
SetCommandable(TRUE);
ActionDoCommand(SetLocalObject(OBJECT_SELF,CorpseCreatureCorpse,PC));
ActionDoCommand(next1(PC,spell));
ActionDoCommand(SetCommandable(TRUE));
SetCommandable(FALSE);
}
else
{
AssignCommand(target,giveBackItems(OBJECT_SELF,TRUE,TRUE));
ExecuteScript(ResurectionScriptName,OBJECT_SELF);
giveBackItems(target,TRUE,TRUE,TRUE);
}
}
else if(SPELL_RAISE_DEAD == spell)
{
if(GetIsObjectValid(PC))
{
//target = PC;
DestroyEquipment(target);
//GetItemsInInventory(target,0,FALSE,OBJECT_INVALID,TRUE);
SetCommandable(TRUE);
ActionDoCommand(next1(PC,spell));
ActionDoCommand(SetCommandable(TRUE));
SetCommandable(FALSE);
}
else
{
AssignCommand(target,giveBackItems(OBJECT_SELF,TRUE,TRUE));
ExecuteScript(RaiseDeadScriptName,OBJECT_SELF);
giveBackItems(target,TRUE,TRUE,TRUE);
}
}
}
}