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.
88 lines
2.7 KiB
Plaintext
88 lines
2.7 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Name Endure Exposure
|
|
//:: FileName inv_dra_endrexp.nss
|
|
//::///////////////////////////////////////////////
|
|
/*
|
|
|
|
Least Invocation
|
|
3rd Level Spell
|
|
|
|
With a touch, you grant a creature (or yourself)
|
|
the ability to withstand hot or cold environments,
|
|
but doesn't protect against actual fire or cold
|
|
damage. In addition, the target is immune to your
|
|
breath weapon's effects. This invocation lasts for
|
|
24 hours.
|
|
|
|
*/
|
|
//::///////////////////////////////////////////////
|
|
|
|
#include "inv_inc_invfunc"
|
|
#include "inv_invokehook"
|
|
|
|
void DispelMonitor(object oCaster, object oTarget, int nSpellID);
|
|
|
|
void main()
|
|
{
|
|
if (!PreInvocationCastCode()) return;
|
|
|
|
object oCaster = OBJECT_SELF;
|
|
object oTarget = PRCGetSpellTargetObject();
|
|
int nCasterLevel = GetInvokerLevel(oCaster, GetInvokingClass());
|
|
int bValid = FALSE;
|
|
int nBPIndex = 0;
|
|
int nBPTIndex = 0;
|
|
|
|
effect eVis = EffectVisualEffect(VFX_IMP_ELEMENTAL_PROTECTION);
|
|
|
|
//Add to array on target of breaths they're protected from
|
|
|
|
if(!array_exists(oTarget, "BreathProtected"))
|
|
array_create(oTarget, "BreathProtected");
|
|
|
|
while(!bValid)
|
|
{
|
|
//find the first empty spot and add it
|
|
if(array_get_object(oTarget, "BreathProtected", nBPIndex) == OBJECT_INVALID)
|
|
{
|
|
array_set_object(oTarget, "BreathProtected", nBPIndex, oCaster);
|
|
bValid = TRUE;
|
|
}
|
|
else
|
|
nBPIndex++;
|
|
}
|
|
|
|
//add to array on caster of targets protected by their spell for resting cleanup
|
|
|
|
if(!array_exists(oCaster, "BreathProtectTargets"))
|
|
array_create(oCaster, "BreathProtectTargets");
|
|
|
|
while(!bValid)
|
|
{
|
|
//find the first empty spot and add it
|
|
if(array_get_object(oCaster, "BreathProtectTargets", nBPTIndex) == OBJECT_INVALID)
|
|
{
|
|
array_set_object(oCaster, "BreathProtectTargets", nBPTIndex, oTarget);
|
|
if(DEBUG) DoDebug("Storing target: " + GetName(array_get_object(oCaster, "BreathProtectTargets", nBPTIndex)));
|
|
bValid = TRUE;
|
|
}
|
|
else
|
|
nBPTIndex++;
|
|
}
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
|
DispelMonitor(oCaster, oTarget, INVOKE_ENDURE_EXPOSURE);
|
|
}
|
|
|
|
void DispelMonitor(object oCaster, object oTarget, int nSpellID)
|
|
{
|
|
// Has the power ended since the last beat, or does the duration run out now
|
|
if(PRCGetDelayedSpellEffectsExpired(nSpellID, oTarget, oCaster))
|
|
{
|
|
if(DEBUG) DoDebug("inv_dra_endexp: The protection effect has been removed");
|
|
array_delete(oCaster, "BreathProtected");
|
|
DeleteLocalInt(oCaster, "DragonWard");
|
|
}
|
|
else
|
|
DelayCommand(6.0f, DispelMonitor(oCaster, oTarget, nSpellID));
|
|
} |