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.
		
			
				
	
	
		
			147 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*
 | ||
| 11/02/19 by Stratovarius
 | ||
| 
 | ||
| Apprentice, Eyes of Darkness 
 | ||
| Level/School: 1st/Divination (Scrying) 
 | ||
| Range: Personal 
 | ||
| Target: You 
 | ||
| Duration: 1 minute/level (D)
 | ||
| 
 | ||
| You send your vision through shadows and into planar re? ections, altering your point of view.
 | ||
| 
 | ||
| You view the world as though you were standing in a different spot, up to a maximum distance of 25 feet plus 5 feet per two caster levels. 
 | ||
| You cannot see through solid objects. You can, however, look around corners or over barriers, obtain a bird’s-eye view of your area, and 
 | ||
| the like. Essentially, you shift your perspective as though you were located at any spot in range to which you have line of effect. You 
 | ||
| can switch back and forth between your own eyes and your alternate viewpoint as a swift action. You can move your alternate perspective, 
 | ||
| as in the spell arcane eye. Its speed is only 10 feet per round, however, and every round of such movement decreases the mystery’s 
 | ||
| duration by 1 minute (if you move the perspective in the last minute of the duration, you gain a few seconds of vision at the new position 
 | ||
| before the effect expires).
 | ||
| 
 | ||
| In the PRC, this is just a copy of Arcane Eye with 1 round/level duration to account for constantly moving about
 | ||
| */
 | ||
| 
 | ||
| #include "shd_inc_shdfunc"
 | ||
| #include "shd_mysthook"
 | ||
| #include "prc_inc_scry"
 | ||
| 
 | ||
| void ApplyScryEffects(object oShadow)
 | ||
| {
 | ||
|     if(DEBUG) DoDebug("prc_inc_scry: ApplyScryEffects():\n"
 | ||
|                     + "oShadow = '" + GetName(oShadow) + "'"
 | ||
|                       );
 | ||
|     // 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, EffectMovementSpeedDecrease(66));
 | ||
|                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), oShadow, GetLocalFloat(oShadow, "ScryDuration") + 6.0);
 | ||
| 
 | ||
|     // Create array for storing a list of the nerfed weapons in
 | ||
|     array_create(oShadow, "Scry_Nerfed");
 | ||
| 
 | ||
|     object oWeapon;
 | ||
|     itemproperty ipNoDam = ItemPropertyNoDamage();
 | ||
|     oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oShadow);
 | ||
|     if(IPGetIsMeleeWeapon(oWeapon)){
 | ||
|         if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
 | ||
|             //SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
 | ||
|             AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
 | ||
|             array_set_object(oShadow, "Scry_Nerfed", array_get_size(oShadow, "Scry_Nerfed"), oWeapon);
 | ||
|         }
 | ||
|         // Check left hand only if right hand had a weapon
 | ||
|         oWeapon = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oShadow);
 | ||
|         if(IPGetIsMeleeWeapon(oWeapon)){
 | ||
|             if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
 | ||
|                 //SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
 | ||
|                 AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
 | ||
|                 array_set_object(oShadow, "Scry_Nerfed", array_get_size(oShadow, "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(oShadow, "Scry_Nerfed", array_get_size(oShadow, "Scry_Nerfed"), oWeapon);
 | ||
|     }}
 | ||
| 
 | ||
|     oWeapon = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oShadow);
 | ||
|     if(GetIsObjectValid(oWeapon)){
 | ||
|         if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
 | ||
|             //SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
 | ||
|             AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
 | ||
|             array_set_object(oShadow, "Scry_Nerfed", array_get_size(oShadow, "Scry_Nerfed"), oWeapon);
 | ||
|     }}
 | ||
|     oWeapon = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oShadow);
 | ||
|     if(GetIsObjectValid(oWeapon)){
 | ||
|         if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
 | ||
|             //SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
 | ||
|             AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
 | ||
|             array_set_object(oShadow, "Scry_Nerfed", array_get_size(oShadow, "Scry_Nerfed"), oWeapon);
 | ||
|     }}
 | ||
|     oWeapon = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oShadow);
 | ||
|     if(GetIsObjectValid(oWeapon)){
 | ||
|         if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
 | ||
|             //SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
 | ||
|             AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
 | ||
|             array_set_object(oShadow, "Scry_Nerfed", array_get_size(oShadow, "Scry_Nerfed"), oWeapon);
 | ||
|     }}
 | ||
| }
 | ||
| 
 | ||
| void main()
 | ||
| {
 | ||
|     if(!ShadPreMystCastCode()) return;
 | ||
| 
 | ||
|     object oShadow      = OBJECT_SELF;
 | ||
|     object oTarget      = PRCGetSpellTargetObject();
 | ||
|     struct mystery myst = EvaluateMystery(oShadow, oTarget, METASHADOW_EXTEND);
 | ||
| 
 | ||
|     if(myst.bCanMyst)
 | ||
|     {
 | ||
|         //Declare major variables
 | ||
|         myst.fDur = RoundsToSeconds(myst.nShadowcasterLevel);
 | ||
|         if(myst.bExtend) myst.fDur *= 2;
 | ||
|         
 | ||
|         SetLocalInt(oShadow, "ScryCasterLevel", myst.nShadowcasterLevel);
 | ||
|         SetLocalInt(oShadow, "ScrySpellId", myst.nMystId);
 | ||
|         SetLocalInt(oShadow, "ScrySpellDC", 0);
 | ||
|         SetLocalFloat(oShadow, "ScryDuration", myst.fDur);       
 | ||
|         
 | ||
|         // Apply the immunity effects
 | ||
|         ApplyScryEffects(oShadow);
 | ||
|         // Now do the rest of the spell.
 | ||
|         ScryMain(oShadow, oShadow);               
 | ||
|     }
 | ||
| } |