Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
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)
|
|
}
|
|
|