Alangara_PRC8/_removed/NW_S0_MORDDISJ.nss
Jaysyn904 86feb9ca6f Initial commit
Initial commit.
2024-06-05 21:21:06 -04:00

178 lines
6.5 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Mordenkainen's Disjunction
//:: NW_S0_MordDisj.nss
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Massive Dispel Magic and Spell Breach rolled into one
If the target is a general area of effect they lose
6 spell protections. If it is an area of effect everyone
in the area loses 2 spells protections.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Jan 7, 2002
//:://////////////////////////////////////////////
void StripEffects(int nNumber, object oTarget);
#include "X0_I0_SPELLS"
#include "inc_dispel"
void main()
{
// START ON HIT Hak -> Essential to call onactivate for Item
object oItem = GetSpellCastItem();
object oTarget = GetSpellTargetObject();
location lLocal = GetSpellTargetLocation();
if (GetIsObjectValid(oItem) && GetCurrentAction(OBJECT_SELF) == ACTION_ATTACKOBJECT
&& GetItemHasItemProperty(oItem,ITEM_PROPERTY_ON_HIT_PROPERTIES))
{
SignalEvent(GetModule(),EventActivateItem(oItem,lLocal,oTarget));
return;
}
// END ON HIT Hak.
//Declare major variables
effect eVis = EffectVisualEffect(VFX_IMP_BREACH);
effect eImpact = EffectVisualEffect(VFX_FNF_DISPEL_DISJUNCTION);
effect eSR = EffectSpellResistanceDecrease(10);
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
effect eLink = EffectLinkEffects(eDur, eSR);
int nCasterLevel = GetCasterLevel(OBJECT_SELF);
float fDelay;
if(nCasterLevel > 20)
{
nCasterLevel = 20;
}
if (GetIsObjectValid(oTarget))
{
//if (GetHasEffect(EFFECT_TYPE_PETRIFY, oTarget) == FALSE)
{
AltspellsDispelMagic(oTarget, nCasterLevel, eVis, eImpact);
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF))
{
StripEffects(6, oTarget);
}
}
}
else
{
//Apply the VFX impact and effects
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, GetSpellTargetLocation());
oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, lLocal, FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_AREA_OF_EFFECT);
while (GetIsObjectValid(oTarget))
{
if(GetObjectType(oTarget) == OBJECT_TYPE_AREA_OF_EFFECT)
{
DestroyObject(oTarget, 0.0);
}
//if (GetHasEffect(EFFECT_TYPE_PETRIFY, oTarget) == FALSE)
{
AltspellsDispelMagic(oTarget, nCasterLevel, eVis, eImpact);
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF))
{
StripEffects(2, oTarget);
}
}
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE,lLocal, FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_AREA_OF_EFFECT);
}
}
}
/*
//Apply the VFX impact and effects
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, GetSpellTargetLocation());
effect eDispel;
if (GetIsObjectValid(oTarget))
{
fDelay = GetRandomDelay(1.0, 2.0);
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF))
{
//Fire cast spell at event for the specified target
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_MORDENKAINENS_DISJUNCTION));
StripEffects(6, oTarget);
}
else
{
//Fire cast spell at event for the specified target
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_MORDENKAINENS_DISJUNCTION, FALSE));
}
//if (GetHasEffect(EFFECT_TYPE_PETRIFY, oTarget) == TRUE || GetLocalInt(oTarget, "X1_L_IMMUNE_TO_DISPEL") == 10)
//{
//}
//else
{
//Apply the VFX impact and effects
eDispel = EffectDispelMagicAll(nCasterLevel);
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDispel, oTarget));
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(10)));
}
}
else
{
eDispel = EffectDispelMagicBest(nCasterLevel);
oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, lLocal, FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_AREA_OF_EFFECT);
while (GetIsObjectValid(oTarget))
{
if(GetObjectType(oTarget) == OBJECT_TYPE_AREA_OF_EFFECT)
{
DestroyObject(oTarget, 0.0);
}
fDelay = GetRandomDelay(1.0, 2.0);
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF))
{
//Fire cast spell at event for the specified target
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_MORDENKAINENS_DISJUNCTION));
StripEffects(2, oTarget);
}
else
{
//Fire cast spell at event for the specified target
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_MORDENKAINENS_DISJUNCTION, FALSE));
}
//if (GetHasEffect(EFFECT_TYPE_PETRIFY, oTarget) == TRUE || GetLocalInt(oTarget, "X1_L_IMMUNE_TO_DISPEL") == 10)
//{
//}
//else
{
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDispel, oTarget));
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(10)));
}
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE,lLocal, FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_AREA_OF_EFFECT);
}
}
*/
void StripEffects(int nNumber, object oTarget)
{
//Declare major variables
effect eVis = EffectVisualEffect(VFX_IMP_BREACH);
int nCnt = 0;
int nIdx = 0;
int nTotal = nNumber;
if(GetIsEnemy(oTarget))
{
//Fire cast spell at event for the specified target
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId()));
//Search through and remove protections.
while(nCnt <= 17 && nIdx < nTotal)
{
nIdx = nIdx + RemoveProtections(GetSpellBreachProtection(nCnt), oTarget, nCnt);
nCnt++;
}
}
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}