PRC8/nwn/nwnprc/trunk/scripts/prc_blight_unbnd.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
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.
2024-02-11 14:01:05 -05:00

69 lines
2.8 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Unsummon
//:: prc_tn_unsum.nss
//:://////////////////////////////////////////////
/*
Unsummons a True Necromancer or Hathran summon.
*/
//:://////////////////////////////////////////////
//:: Created By: Stratovarius
//:: Created On: June 26 , 2004
//:://////////////////////////////////////////////
#include "prc_alterations"
#include "inc_npc"
int PRCCanCreatureBeDestroyed(object oTarget)
{
if (GetPlotFlag(oTarget) == FALSE && GetImmortal(oTarget) == FALSE)
{
return TRUE;
}
return FALSE;
}
void main()
{
object oCaster = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
object oMaster = GetMaster(oTarget);
int nDC = GetLevelByClass(CLASS_TYPE_BLIGHTER, oCaster) + 10 + GetAbilityModifier(ABILITY_WISDOM, oCaster);
effect eVis = EffectVisualEffect(VFX_IMP_UNSUMMON);
if (oMaster == OBJECT_INVALID)
{
oMaster = OBJECT_SELF; // TO prevent problems with invalid objects
// passed into GetAssociate
}
// * Is the creature a summoned associate
// * or is the creature an outsider
// * and is there enough points in the pool
if( // A familiar
GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oMaster) == oTarget ||
// A Bonded Summoner familiar
GetTag(OBJECT_SELF) == "BONDFAMILIAR" ||
// An animal companion
GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oMaster) == oTarget
)// End - Target validity tests
{
if (!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_NONE))
{
//Apply the VFX and delay the destruction of the summoned monster so
//that the script and VFX can play.
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetLocation(oTarget));
if(PRCCanCreatureBeDestroyed(oTarget) == TRUE)
{
//bugfix: Simply destroying the object won't fire it's OnDeath script.
//Which is bad when you have plot-specific things being done in that
//OnDeath script... so lets kill it.
effect eKill = EffectDamage(GetCurrentHitPoints(oTarget));
//just to be extra-sure... :)
effect eDeath = EffectDeath(FALSE, FALSE);
DelayCommand(0.25, ApplyEffectToObject(DURATION_TYPE_INSTANT, eKill, oTarget));
DelayCommand(0.25, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget));
DeathlessFrenzyCheck(oTarget);
}
}
}
}