forked from Jaysyn/PRC8
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.
150 lines
7.8 KiB
Plaintext
150 lines
7.8 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Scrying
|
|
//:: sp_scrying.nss
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
A spell that allows the caster to scry either
|
|
on any creature in the area they're in, or to
|
|
scry on any PC.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Stratovarius
|
|
//:: Created On: April 30, 2007
|
|
//:://////////////////////////////////////////////
|
|
|
|
//#include "prc_alterations"
|
|
#include "prc_inc_assoc"
|
|
#include "prc_inc_scry"
|
|
#include "prc_add_spell_dc"
|
|
|
|
void ApplyScryEffects(object oPC)
|
|
{
|
|
if(DEBUG) DoDebug("prc_inc_scry: ApplyScryEffects():\n"
|
|
+ "oPC = '" + GetName(oPC) + "'"
|
|
);
|
|
// The Scryer is not supposed to be visible, nor can he move or cast
|
|
// He also can't take damage from scrying
|
|
effect eLink = EffectSpellImmunity(SPELL_ALL_SPELLS);
|
|
// Damage immunities
|
|
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_ACID, 100));
|
|
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_BLUDGEONING, 100));
|
|
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_COLD, 100));
|
|
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_DIVINE, 100));
|
|
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_ELECTRICAL, 100));
|
|
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_FIRE, 100));
|
|
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_MAGICAL, 100));
|
|
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_NEGATIVE, 100));
|
|
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_PIERCING, 100));
|
|
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_POSITIVE, 100));
|
|
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_SLASHING, 100));
|
|
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_SONIC, 100));
|
|
// Specific immunities
|
|
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_ABILITY_DECREASE));
|
|
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_BLINDNESS));
|
|
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_DEAFNESS));
|
|
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_CRITICAL_HIT));
|
|
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_DEATH));
|
|
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_DISEASE));
|
|
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_ENTANGLE));
|
|
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_SLOW));
|
|
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_KNOCKDOWN));
|
|
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_NEGATIVE_LEVEL));
|
|
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_PARALYSIS));
|
|
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_SILENCE));
|
|
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_SNEAK_ATTACK));
|
|
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_TRAP));
|
|
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_MIND_SPELLS));
|
|
// Random stuff
|
|
eLink = EffectLinkEffects(eLink, EffectCutsceneGhost());
|
|
eLink = EffectLinkEffects(eLink, EffectCutsceneImmobilize());
|
|
eLink = EffectLinkEffects(eLink, EffectEthereal());
|
|
eLink = EffectLinkEffects(eLink, EffectAttackDecrease(50));
|
|
eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY));
|
|
// Permanent until Scry ends
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(eLink), oPC, GetLocalFloat(oPC, "ScryDuration") + 6.0);
|
|
|
|
// Create array for storing a list of the nerfed weapons in
|
|
array_create(oPC, "Scry_Nerfed");
|
|
|
|
object oWeapon;
|
|
itemproperty ipNoDam = ItemPropertyNoDamage();
|
|
oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
|
if(IPGetIsMeleeWeapon(oWeapon)){
|
|
if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
|
|
//SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
|
|
array_set_object(oPC, "Scry_Nerfed", array_get_size(oPC, "Scry_Nerfed"), oWeapon);
|
|
}
|
|
// Check left hand only if right hand had a weapon
|
|
oWeapon = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC);
|
|
if(IPGetIsMeleeWeapon(oWeapon)){
|
|
if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
|
|
//SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
|
|
array_set_object(oPC, "Scry_Nerfed", array_get_size(oPC, "Scry_Nerfed"), oWeapon);
|
|
}}
|
|
}else if(IPGetIsRangedWeapon(oWeapon)){
|
|
if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
|
|
//SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
|
|
array_set_object(oPC, "Scry_Nerfed", array_get_size(oPC, "Scry_Nerfed"), oWeapon);
|
|
}}
|
|
|
|
oWeapon = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oPC);
|
|
if(GetIsObjectValid(oWeapon)){
|
|
if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
|
|
//SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
|
|
array_set_object(oPC, "Scry_Nerfed", array_get_size(oPC, "Scry_Nerfed"), oWeapon);
|
|
}}
|
|
oWeapon = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oPC);
|
|
if(GetIsObjectValid(oWeapon)){
|
|
if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
|
|
//SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
|
|
array_set_object(oPC, "Scry_Nerfed", array_get_size(oPC, "Scry_Nerfed"), oWeapon);
|
|
}}
|
|
oWeapon = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oPC);
|
|
if(GetIsObjectValid(oWeapon)){
|
|
if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
|
|
//SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
|
|
AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
|
|
array_set_object(oPC, "Scry_Nerfed", array_get_size(oPC, "Scry_Nerfed"), oWeapon);
|
|
}}
|
|
}
|
|
|
|
void main()
|
|
{
|
|
object oPC = OBJECT_SELF;
|
|
|
|
//Declare major variables
|
|
object oFam = GetAssociateNPC(ASSOCIATE_TYPE_FAMILIAR, oPC, NPC_PNP_FAMILIAR);
|
|
if(!GetIsObjectValid(oFam))
|
|
return;
|
|
|
|
if(GetLocalInt(oPC, "Scry_Familiar"))
|
|
{
|
|
FloatingTextStringOnCreature("You have already used this ability today.", oPC, FALSE);
|
|
return;
|
|
}
|
|
|
|
int nFamLvl = GetHitDice(oFam);
|
|
if(nFamLvl > 12)
|
|
{
|
|
int nCasterLvl = PRCGetCasterLevel(oPC);
|
|
int nSpell = PRCGetSpellId();
|
|
int nDC = PRCGetSaveDC(oFam, oPC) + 10;
|
|
float fDur = 60.0 * nCasterLvl;
|
|
|
|
SetLocalInt(oPC, "ScryCasterLevel", nCasterLvl);
|
|
SetLocalInt(oPC, "ScrySpellId", nSpell);
|
|
SetLocalFloat(oPC, "ScryDuration", fDur);
|
|
|
|
// Apply effects
|
|
ApplyScryEffects(oPC);
|
|
ScryMain(oPC, oFam);
|
|
SetLocalInt(oPC, "Scry_Familiar", 1);
|
|
}
|
|
else
|
|
FloatingTextStringOnCreature("The bond with your familiar is not strong enough yet.", oPC, FALSE);
|
|
} |