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.
		
			
				
	
	
		
			116 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
//::///////////////////////////////////////////////
 | 
						|
//:: Name      Spellslayer Arrow
 | 
						|
//:: FileName  sp_spslay_arrow.nss
 | 
						|
//:://////////////////////////////////////////////
 | 
						|
/**@file Spellslayer Arrow
 | 
						|
Transmutation
 | 
						|
Level: Assassin 2, ranger 2
 | 
						|
Components: V, S, M
 | 
						|
Casting Time: 1 swift action
 | 
						|
Range: Long
 | 
						|
Target: One creature
 | 
						|
Duration: Instantaneous
 | 
						|
Saving Throw: None
 | 
						|
Spell Resistance: Yes
 | 
						|
 | 
						|
As you cast this spell, your fire a masterwork or 
 | 
						|
magical arrow or bolt, and transform it into a glowing
 | 
						|
missile that destabilizes other forms of magic.In 
 | 
						|
addition to dealing normal damage, a spellslayer arrow
 | 
						|
deals an extra 1d4 points of damage for the highest level
 | 
						|
spell currently in effect on the target. 
 | 
						|
 | 
						|
Material Component: Masterwork arrow or bolt.
 | 
						|
 | 
						|
Author:    Tenjac
 | 
						|
Created:   
 | 
						|
*/
 | 
						|
//:://////////////////////////////////////////////
 | 
						|
//:://////////////////////////////////////////////
 | 
						|
 | 
						|
#include "prc_inc_spells"
 | 
						|
#include "prc_craft_inc"
 | 
						|
#include "prc_inc_combat"
 | 
						|
 | 
						|
int GetHighestSpellLevel(object oTarget);
 | 
						|
 | 
						|
void main()
 | 
						|
{
 | 
						|
       if(!X2PreSpellCastCode()) return;
 | 
						|
 | 
						|
       PRCSetSchool(SPELL_SCHOOL_TRANSMUTATION);
 | 
						|
 | 
						|
       object oPC = OBJECT_SELF;
 | 
						|
       object oTarget = PRCGetSpellTargetObject();
 | 
						|
       int nCasterLvl = PRCGetCasterLevel(oPC);
 | 
						|
       object oWeap = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
 | 
						|
       int nType = GetBaseItemType(oWeap);
 | 
						|
       object oAmmo;
 | 
						|
       int nDam;
 | 
						|
       effect eVis;
 | 
						|
 | 
						|
       //Has to be a bow of some sort
 | 
						|
       if(nType != BASE_ITEM_LONGBOW &&
 | 
						|
          nType != BASE_ITEM_SHORTBOW &&
 | 
						|
          nType != BASE_ITEM_LIGHTCROSSBOW &&
 | 
						|
          nType != BASE_ITEM_HEAVYCROSSBOW)
 | 
						|
       {
 | 
						|
               PRCSetSchool();
 | 
						|
               return;
 | 
						|
       }
 | 
						|
 | 
						|
       if(nType == BASE_ITEM_LONGBOW || nType == BASE_ITEM_SHORTBOW)
 | 
						|
       {
 | 
						|
	       oAmmo = GetItemInSlot(INVENTORY_SLOT_ARROWS, oPC);
 | 
						|
       }
 | 
						|
       
 | 
						|
       else if (nType == BASE_ITEM_LIGHTCROSSBOW || nType == BASE_ITEM_HEAVYCROSSBOW)
 | 
						|
       {
 | 
						|
	       oAmmo = GetItemInSlot(INVENTORY_SLOT_BOLTS, oPC);
 | 
						|
       }
 | 
						|
 | 
						|
       //Check for Masterwork or magical
 | 
						|
       string sMaterial = GetStringLeft(GetTag(oAmmo), 3);
 | 
						|
 | 
						|
       if((!(GetMaterialString(StringToInt(sMaterial)) == sMaterial && sMaterial != "000") && !GetIsMagicItem(oAmmo)))
 | 
						|
       {
 | 
						|
               PRCSetSchool();
 | 
						|
               SendMessageToPC(oPC, "Invalid ammo type.");
 | 
						|
               return;
 | 
						|
       }
 | 
						|
 | 
						|
       //The meat
 | 
						|
       PerformAttack(oTarget, oPC, eVis);
 | 
						|
 | 
						|
       //if hit
 | 
						|
       if(GetLocalInt(oTarget, "PRCCombat_StruckByAttack"))
 | 
						|
       {
 | 
						|
               if(!PRCDoResistSpell(oPC, oTarget, nCasterLvl + SPGetPenetr()))
 | 
						|
               {
 | 
						|
                       int nHighest = GetHighestSpellLevel(oTarget);
 | 
						|
                       nDam = d4(nHighest);
 | 
						|
                       nDam += SpellDamagePerDice(oPC, nHighest);
 | 
						|
                       ApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_MAGICAL), oTarget);
 | 
						|
               }
 | 
						|
       }
 | 
						|
 | 
						|
       PRCSetSchool();
 | 
						|
}
 | 
						|
 | 
						|
int GetHighestSpellLevel(object oTarget)
 | 
						|
{
 | 
						|
        effect eTest = GetFirstEffect(oTarget);
 | 
						|
        int nMax = 1;
 | 
						|
        
 | 
						|
        while(GetIsEffectValid(eTest))
 | 
						|
        {
 | 
						|
                int nSpell = GetEffectSpellId(eTest);
 | 
						|
                int nSpellLevel = StringToInt(Get2DACache("spells", "Innate", nSpell)); 
 | 
						|
                
 | 
						|
                if(nSpellLevel > nMax) nMax = nSpellLevel;
 | 
						|
                                
 | 
						|
                eTest = GetNextEffect(oTarget);
 | 
						|
        }
 | 
						|
        
 | 
						|
        return nMax;
 | 
						|
} |