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.
90 lines
3.8 KiB
Plaintext
90 lines
3.8 KiB
Plaintext
//:://////////////////////////////////////////////
|
|
//:: FileName: "ss_ep_singsunder"
|
|
/* Purpose: Singular Sunder - spell target's an enemy's equipment, and
|
|
irrevocably destroys a single item, on a failed will save.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Boneshank
|
|
//:: Last Updated On: March 11, 2004
|
|
//:://////////////////////////////////////////////
|
|
#include "prc_alterations"
|
|
#include "inc_epicspells"
|
|
|
|
object GetSunderTarget(object oTarget);
|
|
|
|
void main()
|
|
{
|
|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_TRANSMUTATION);
|
|
|
|
if (!X2PreSpellCastCode())
|
|
{
|
|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|
return;
|
|
}
|
|
if (GetCanCastSpell(OBJECT_SELF, SPELL_EPIC_SINGSUN))
|
|
{
|
|
object oTarget = PRCGetSpellTargetObject();
|
|
effect eImp = EffectVisualEffect(VFX_IMP_BREACH);
|
|
effect eVis = EffectVisualEffect(VFX_IMP_LIGHTNING_S);
|
|
object oItem = GetSunderTarget(oTarget);
|
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId()));
|
|
// Does the target have an equipped item to sunder?
|
|
if (oItem != OBJECT_INVALID)
|
|
{
|
|
// SR check.
|
|
if (!PRCDoResistSpell(OBJECT_SELF, oTarget, GetTotalCastingLevel(OBJECT_SELF)+SPGetPenetr(OBJECT_SELF)))
|
|
{
|
|
// Will save.
|
|
if (!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, GetEpicSpellSaveDC(OBJECT_SELF, oTarget)))
|
|
{
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eImp, oTarget);
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
|
DestroyObject(oItem, 1.0);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
SendMessageToPC(OBJECT_SELF,
|
|
"That creature has nothing equipped to sunder!");
|
|
}
|
|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|
}
|
|
|
|
object GetSunderTarget(object oTarget)
|
|
{
|
|
object oItem = OBJECT_INVALID;
|
|
object oTemp;
|
|
// Search for item hierarchy, lowest to highest priority, and non-plot.
|
|
oTemp = GetItemInSlot(12, oTarget); // Bullets
|
|
if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
|
|
oTemp = GetItemInSlot(13, oTarget); // Bolts
|
|
if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
|
|
oTemp = GetItemInSlot(11, oTarget); // Arrows
|
|
if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
|
|
oTemp = GetItemInSlot(7, oTarget); // Left ring
|
|
if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
|
|
oTemp = GetItemInSlot(8, oTarget); // Right ring
|
|
if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
|
|
oTemp = GetItemInSlot(0, oTarget); // Helmet
|
|
if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
|
|
oTemp = GetItemInSlot(10, oTarget); // Belt
|
|
if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
|
|
oTemp = GetItemInSlot(2, oTarget); // Boots
|
|
if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
|
|
oTemp = GetItemInSlot(6, oTarget); // Cloak
|
|
if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
|
|
oTemp = GetItemInSlot(9, oTarget); // Neck
|
|
if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
|
|
oTemp = GetItemInSlot(3, oTarget); // Arms (gauntlets)
|
|
if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
|
|
oTemp = GetItemInSlot(5, oTarget); // Left (off) hand
|
|
if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
|
|
oTemp = GetItemInSlot(1, oTarget); // Armor
|
|
if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
|
|
oTemp = GetItemInSlot(4, oTarget); // Right (main) hand
|
|
if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
|
|
return oItem;
|
|
}
|
|
|