Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
112 lines
4.1 KiB
Plaintext
112 lines
4.1 KiB
Plaintext
//:://////////////////////////////////////////////
|
|
//:: FileName: "ss_ep_cont_resur"
|
|
/* Purpose: Contingent Resurrection - sets a variable on the target, so that
|
|
in the case of their death, they will automatically resurrect.
|
|
NOTE: This contingency will last indefinitely, unless it triggers or the
|
|
player dispels it in the pre-rest conversation.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Boneshank
|
|
//:: Last Updated On: March 13, 2004
|
|
//:://////////////////////////////////////////////
|
|
#include "prc_alterations"
|
|
#include "inc_epicspells"
|
|
|
|
// Brings oPC back to life, via the contingency of 'Contingent Resurrection'.
|
|
void ContingencyResurrect(object oTarget, int nCount, object oCaster);
|
|
|
|
void main()
|
|
{
|
|
object oCaster = OBJECT_SELF;
|
|
|
|
DeleteLocalInt(oCaster, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|
SetLocalInt(oCaster, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_CONJURATION);
|
|
|
|
if (!X2PreSpellCastCode())
|
|
{
|
|
DeleteLocalInt(oCaster, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|
return;
|
|
}
|
|
|
|
if (GetCanCastSpell(oCaster, SPELL_EPIC_CON_RES))
|
|
{
|
|
object oTarget = PRCGetSpellTargetObject();
|
|
location lTarget = GetLocation(oTarget);
|
|
effect eVis = EffectVisualEffect(VFX_FNF_LOS_HOLY_20);
|
|
effect eVisFail = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY);
|
|
// If the target is of a race that could be resurrected, go ahead.
|
|
int bRaise = FALSE;
|
|
|
|
|
|
int nMyRace = MyPRCGetRacialType(oTarget);
|
|
int nRace = GetRacialType(oTarget);
|
|
|
|
// PRC Shifting Polymorph -caused racial type override. Stored with offset +1 to differentiate value 0 from non-existence
|
|
int nShiftingTrueRace = GetPersistantLocalInt(oCaster, "PRC_ShiftingTrue_Race");
|
|
if(nShiftingTrueRace)
|
|
nMyRace = nShiftingTrueRace - 1;
|
|
|
|
if(nMyRace == RACIAL_TYPE_UNDEAD || nMyRace == RACIAL_TYPE_CONSTRUCT)
|
|
bRaise = FALSE;
|
|
else
|
|
bRaise = TRUE;
|
|
|
|
|
|
if(bRaise)
|
|
{
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, lTarget);
|
|
PenalizeSpellSlotForCaster(oCaster);
|
|
// Start the contingency.
|
|
SetLocalInt(oCaster, "nContingentRez", GetLocalInt(oCaster, "nContingentRez") + 1);
|
|
ContingencyResurrect(oTarget, 1, oCaster);
|
|
}
|
|
else
|
|
{
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVisFail, lTarget);
|
|
SendMessageToPC(oCaster, "Spell failed - Invalid target!");
|
|
}
|
|
}
|
|
DeleteLocalInt(oCaster, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|
}
|
|
|
|
void ContingencyResurrect(object oTarget, int nCount, object oCaster)
|
|
{
|
|
// If the contingency has been turned off, terminate HB
|
|
if(!GetLocalInt(oCaster, "nContingentRez"))
|
|
return;
|
|
|
|
// If the target isn't dead, just toss out a notice that the heartbeat is running
|
|
if(!GetIsDead(oTarget))
|
|
{
|
|
nCount++;
|
|
if((nCount % 20) == 0)
|
|
FloatingTextStringOnCreature("*Contingency active*", oTarget, FALSE);
|
|
}
|
|
else // Resurrect the target, and end the contingency.
|
|
{
|
|
nCount = 0;
|
|
|
|
effect eRez = EffectResurrection();
|
|
effect eHea = EffectHeal(GetMaxHitPoints(oTarget) + 10);
|
|
effect eVis = EffectVisualEffect(VFX_IMP_RAISE_DEAD);
|
|
|
|
// Resurrect the target
|
|
FloatingTextStringOnCreature("*Contingency triggered*", oTarget);
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetLocation(oTarget));
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eRez, oTarget);
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eHea, oTarget);
|
|
|
|
// Bookkeeping of epic spell slots in contingent use
|
|
RestoreSpellSlotForCaster(oCaster);
|
|
SetLocalInt(oCaster, "nContingentRez", GetLocalInt(oCaster, "nContingentRez") - 1);
|
|
|
|
// PW death stuff
|
|
ExecuteScript("prc_pw_contress", oTarget);
|
|
if(GetPRCSwitch(PRC_PW_DEATH_TRACKING) && GetIsPC(oTarget))
|
|
SetPersistantLocalInt(oTarget, "persist_dead", FALSE);
|
|
}
|
|
|
|
DelayCommand(6.0, ContingencyResurrect(oTarget, nCount, oCaster)); //Schedule next heartbeat (it will terminate itself if no longer needed)
|
|
}
|
|
|