Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
255 lines
9.9 KiB
Plaintext
255 lines
9.9 KiB
Plaintext
/*
|
|
----------------
|
|
Null Psionics Field - OnEnter
|
|
|
|
psi_pow_npfent
|
|
----------------
|
|
|
|
6/10/05 by Stratovarius
|
|
Modified: Nov 1, 2007 - Flaming_Sword
|
|
*/ /** @file
|
|
|
|
Null Psionics Field - OnEnter
|
|
|
|
Psychokinesis
|
|
Level: Kineticist 6
|
|
Manifesting Time: 1 standard action
|
|
Range: 10 ft.
|
|
Area: 10-ft.-radius emanation centered on you
|
|
Duration: 10 min./level(D)
|
|
Saving Throw: None
|
|
Power Resistance: See text
|
|
Power Points: 11
|
|
Metapsionics: Extend, Widen
|
|
|
|
An invisible barrier surrounds you and moves with you. The space within this
|
|
barrier is impervious to most psionic effects, including powers, psi-like
|
|
abilities, and supernatural abilities. Likewise, it prevents the functioning
|
|
of any psionic items or powers within its confines. A null psionics field
|
|
negates any power or psionic effect used within, brought into, or manifested
|
|
into its area.
|
|
|
|
Dispel psionics does not remove the field. Two or more null psionics fields
|
|
sharing any of the same space have no effect on each other. Certain powers
|
|
may be unaffected by null psionics field (see the individual power
|
|
descriptions).
|
|
|
|
|
|
Implementation note: To dismiss the power, use the control feat again. If
|
|
the power is active, that will end it instead of
|
|
manifesting it.
|
|
*/
|
|
|
|
#include "prc_craft_inc"
|
|
#include "inc_npc"
|
|
|
|
int GetIsExempt(object oItem)
|
|
{
|
|
itemproperty ip = GetFirstItemProperty(oItem);
|
|
int nIPType = GetItemPropertyType(ip);
|
|
int nIPSubType = GetItemPropertySubType(ip);
|
|
|
|
int nType = GetBaseItemType(oItem);
|
|
switch(nType)
|
|
{
|
|
case BASE_ITEM_TORCH:
|
|
case BASE_ITEM_TRAPKIT:
|
|
case BASE_ITEM_HEALERSKIT:
|
|
case BASE_ITEM_GRENADE:
|
|
case BASE_ITEM_THIEVESTOOLS:
|
|
case BASE_ITEM_CRAFTMATERIALMED:
|
|
case BASE_ITEM_CRAFTMATERIALSML:
|
|
case 112://craftbase
|
|
return TRUE;
|
|
case BASE_ITEM_POTIONS:
|
|
{
|
|
if(nIPType == ITEM_PROPERTY_CAST_SPELL)
|
|
{
|
|
if(nIPSubType == IP_CONST_CASTSPELL_SPECIAL_ALCOHOL_BEER
|
|
|| nIPSubType == IP_CONST_CASTSPELL_SPECIAL_ALCOHOL_SPIRITS
|
|
|| nIPSubType == IP_CONST_CASTSPELL_SPECIAL_ALCOHOL_WINE)
|
|
return TRUE;
|
|
}
|
|
}
|
|
case BASE_ITEM_MISCSMALL:
|
|
{
|
|
if(nIPType == ITEM_PROPERTY_CAST_SPELL)
|
|
{
|
|
//Dye Kits/Poison Weapon
|
|
if(nIPSubType >= 490 && nIPSubType <= 497)
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
// if there is more than 1 property then this item should be stripped
|
|
if(GetIsItemPropertyValid(GetNextItemProperty(oItem)))
|
|
return FALSE;
|
|
|
|
if(nIPType == ITEM_PROPERTY_ON_HIT_PROPERTIES
|
|
&& nIPSubType == IP_CONST_ONHIT_ITEMPOISON)
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void RemoveEffectsNPF(object oObject)
|
|
{
|
|
effect eEff = GetFirstEffect(oObject);
|
|
while(GetIsEffectValid(eEff))
|
|
{
|
|
int nType = GetEffectType(eEff);
|
|
int nSubType = GetEffectSubType(eEff);
|
|
if(nSubType != SUBTYPE_EXTRAORDINARY &&
|
|
nSubType != SUBTYPE_SUPERNATURAL &&
|
|
(nType == EFFECT_TYPE_ABILITY_INCREASE ||
|
|
nType == EFFECT_TYPE_AC_INCREASE ||
|
|
nType == EFFECT_TYPE_ATTACK_INCREASE ||
|
|
nType == EFFECT_TYPE_BLINDNESS ||
|
|
nType == EFFECT_TYPE_CHARMED ||
|
|
nType == EFFECT_TYPE_CONCEALMENT ||
|
|
nType == EFFECT_TYPE_CONFUSED ||
|
|
nType == EFFECT_TYPE_CURSE ||
|
|
nType == EFFECT_TYPE_DAMAGE_IMMUNITY_INCREASE ||
|
|
nType == EFFECT_TYPE_DAMAGE_INCREASE ||
|
|
nType == EFFECT_TYPE_DAMAGE_REDUCTION ||
|
|
nType == EFFECT_TYPE_DAMAGE_RESISTANCE ||
|
|
nType == EFFECT_TYPE_DAZED ||
|
|
nType == EFFECT_TYPE_DEAF ||
|
|
nType == EFFECT_TYPE_DOMINATED ||
|
|
nType == EFFECT_TYPE_ELEMENTALSHIELD ||
|
|
nType == EFFECT_TYPE_ETHEREAL ||
|
|
nType == EFFECT_TYPE_FRIGHTENED ||
|
|
nType == EFFECT_TYPE_HASTE ||
|
|
nType == EFFECT_TYPE_IMMUNITY ||
|
|
nType == EFFECT_TYPE_IMPROVEDINVISIBILITY ||
|
|
nType == EFFECT_TYPE_INVISIBILITY ||
|
|
nType == EFFECT_TYPE_INVULNERABLE ||
|
|
nType == EFFECT_TYPE_ABILITY_INCREASE ||
|
|
nType == EFFECT_TYPE_NEGATIVELEVEL ||
|
|
nType == EFFECT_TYPE_PARALYZE ||
|
|
nType == EFFECT_TYPE_POLYMORPH ||
|
|
nType == EFFECT_TYPE_REGENERATE ||
|
|
nType == EFFECT_TYPE_SANCTUARY ||
|
|
nType == EFFECT_TYPE_SAVING_THROW_INCREASE ||
|
|
nType == EFFECT_TYPE_SEEINVISIBLE ||
|
|
nType == EFFECT_TYPE_SILENCE ||
|
|
nType == EFFECT_TYPE_SKILL_INCREASE ||
|
|
nType == EFFECT_TYPE_SLOW ||
|
|
nType == EFFECT_TYPE_SPELL_IMMUNITY ||
|
|
nType == EFFECT_TYPE_SPELL_RESISTANCE_INCREASE ||
|
|
nType == EFFECT_TYPE_SPELLLEVELABSORPTION ||
|
|
nType == EFFECT_TYPE_TEMPORARY_HITPOINTS ||
|
|
nType == EFFECT_TYPE_TRUESEEING ||
|
|
nType == EFFECT_TYPE_ULTRAVISION ||
|
|
nType == EFFECT_TYPE_INVULNERABLE
|
|
)
|
|
)
|
|
RemoveEffect(oObject, eEff);
|
|
|
|
eEff = GetNextEffect(oObject);
|
|
}
|
|
}
|
|
|
|
//Stores the itemprops of an item in a persistent array
|
|
void StoreItemprops(object oItem, int bRemove)
|
|
{
|
|
if(DEBUG) DoDebug("StoreItemprops: " + GetName(GetItemPossessor(oItem)) + ", " + GetName(oItem) + ", " + ObjectToString(oItem));
|
|
|
|
string sIP;
|
|
int nIpCount;
|
|
persistant_array_create(oItem, "PRC_NPF_ItemList"); //stores object strings
|
|
itemproperty ip = GetFirstItemProperty(oItem);
|
|
while(GetIsItemPropertyValid(ip))
|
|
{
|
|
if(GetItemPropertyDurationType(ip) == DURATION_TYPE_PERMANENT)
|
|
{ //only store the permanent ones as underscore delimited strings
|
|
sIP = IntToString(GetItemPropertyType(ip)) + "_" +
|
|
IntToString(GetItemPropertySubType(ip)) + "_" +
|
|
IntToString(GetItemPropertyCostTableValue(ip)) + "_" +
|
|
IntToString(GetItemPropertyParam1Value(ip));
|
|
if(DEBUG) DoDebug("StoreItemprops: " + GetName(GetItemPossessor(oItem)) + ", " + ObjectToString(oItem) + ", " + sIP);
|
|
array_set_string(oItem, "PRC_NPF_ItemList", nIpCount++, sIP);
|
|
}
|
|
if(bRemove)
|
|
RemoveItemProperty(oItem, ip);
|
|
ip = GetNextItemProperty(oItem);
|
|
}
|
|
}
|
|
|
|
//Stores an array of objects and their itemprops
|
|
void StoreObjects(object oCreature, int bRemove = TRUE)
|
|
{
|
|
int i, nSlotMax = INVENTORY_SLOT_CWEAPON_L; //INVENTORY_SLOT_ARROWS; //max slot number, to exempt creature items //ammo placeholders (?)
|
|
object oItem;
|
|
|
|
for(i = 0; i < nSlotMax; i++) //equipped items
|
|
{
|
|
oItem = GetItemInSlot(i, oCreature);
|
|
if(GetIsObjectValid(oItem))
|
|
{
|
|
if(!GetIsExempt(oItem))
|
|
StoreItemprops(oItem, bRemove);
|
|
}
|
|
}
|
|
|
|
oItem = GetFirstItemInInventory(oCreature);
|
|
while(GetIsObjectValid(oItem))
|
|
{
|
|
if(!GetIsExempt(oItem))
|
|
StoreItemprops(oItem, bRemove);
|
|
|
|
oItem = GetNextItemInInventory(oCreature);
|
|
}
|
|
}
|
|
|
|
void main()
|
|
{ //testing code
|
|
object oEnter = GetEnteringObject();
|
|
if(GetObjectType(oEnter) == OBJECT_TYPE_CREATURE && !GetPlotFlag(oEnter) && !GetIsDM(oEnter) && !GetPersistantLocalInt(oEnter, "NullPsionicsField"))
|
|
{
|
|
if(DEBUG) DoDebug("psi_pow_npfent: Creatured entered Null Psionics Field: " + DebugObject2Str(oEnter));
|
|
|
|
object oCaster = GetAreaOfEffectCreator();
|
|
|
|
// Set the marker variable
|
|
SetPersistantLocalInt(oEnter, "NullPsionicsField", TRUE);
|
|
|
|
//Fire cast spell at event for the target
|
|
SignalEvent(oEnter, EventSpellCastAt(oCaster, GetLocalInt(OBJECT_SELF, "X2_AoE_SpellID"), FALSE));
|
|
|
|
// Remove all non-extraordinary effects
|
|
RemoveEffectsNPF(oEnter);
|
|
|
|
// Apply absolute spell failure and spell immunity
|
|
effect eLink = EffectSpellResistanceIncrease(100);
|
|
//eLink = EffectLinkEffects(eLink, EffectSpellFailure(100, SPELL_SCHOOL_GENERAL));
|
|
eLink = ExtraordinaryEffect(eLink);
|
|
//ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oEnter);
|
|
|
|
if(GetAssociateTypeNPC(oEnter) == ASSOCIATE_TYPE_SUMMONED ||
|
|
(MyPRCGetRacialType(oEnter) == RACIAL_TYPE_UNDEAD &&
|
|
GetLocalInt(oEnter, "X2_L_IS_INCORPOREAL") || GetHasFeat(FEAT_INCORPOREAL, oEnter)))
|
|
{
|
|
int nPenetr = SPGetPenetrAOE(OBJECT_SELF);
|
|
//Spell resistance check
|
|
if(!PRCDoResistSpell(oCaster, oEnter, nPenetr))
|
|
{
|
|
effect eInvis = EffectDamageImmunityAll();
|
|
eInvis = EffectLinkEffects(eInvis, EffectImmunityMiscAll());
|
|
eInvis = EffectLinkEffects(eInvis, EffectCutsceneGhost());
|
|
eInvis = EffectLinkEffects(eInvis, EffectCutsceneParalyze());
|
|
eInvis = EffectLinkEffects(eInvis, EffectEthereal());
|
|
eInvis = EffectLinkEffects(eInvis, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY));
|
|
eInvis = ExtraordinaryEffect(eInvis);
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eInvis, oEnter);
|
|
}
|
|
}
|
|
else
|
|
// Store itemproperties and remove them from objects
|
|
StoreObjects(oEnter);
|
|
|
|
// Apply vfx
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_BREACH), oEnter);
|
|
}
|
|
} |