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.
		
			
				
	
	
		
			199 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*:://////////////////////////////////////////////
 | ||
| //:: Spell Name Warding Whip
 | ||
| //:: Spell FileName XXX_S_WardingWhi
 | ||
| //:://////////////////////////////////////////////
 | ||
| //:: In Game Spell desctiption
 | ||
| //:://////////////////////////////////////////////
 | ||
|     Transmutation
 | ||
|     Also known as: Luskaris’ Warding Whip
 | ||
|     Level: Sor/Wiz 8
 | ||
|     Components: V, S
 | ||
|     Casting Time: 1 standard action
 | ||
|     Range: Long (40M)
 | ||
|     Target: A single creature
 | ||
|     Duration: 1 round/5 levels
 | ||
|     Saving Throw: No
 | ||
|     Spell Resistance: No
 | ||
|     Source: Various (rmilsop)
 | ||
| 
 | ||
|     This spell strips a creature of its magical protections, removing one
 | ||
|     protection of up to 7th level for each round it is active. It always removes
 | ||
|     the highest level protection that it can. Protections removed by this spell
 | ||
|     include spell turning, globe of invulnerability, repulsion, stoneskin, minor
 | ||
|     globe of invulnerability and similar spells.
 | ||
| 
 | ||
|     Only one whip from one caster can affect a target at once. This spell
 | ||
|     bypasses spell turning and similar effects.
 | ||
| //:://////////////////////////////////////////////
 | ||
| //:: Spell Effects Applied / Notes
 | ||
| //:://////////////////////////////////////////////
 | ||
|     Sort of like Spell Breach.
 | ||
| 
 | ||
|     It strips effects - 1 per 5 levels, highest first.
 | ||
| 
 | ||
|     Powerful, because it doesn't dispel bad effects, nor need any kind
 | ||
|     of dispel check.
 | ||
| 
 | ||
|     Spells "Dispelled" in order:
 | ||
| X 9 - Absolute Immunity (9)
 | ||
| X 8 - Greater Guardian Mantal (8)
 | ||
| X   - Iron Body (8)
 | ||
| X   - Mind Blank (8)
 | ||
| / 7 - Spell turning (7)
 | ||
|     - Guardian Mantal (7)
 | ||
|     - Repulstion (7)
 | ||
|     - Antilife Shell (6)
 | ||
|   6 - Globe of Invulnerability (6)
 | ||
|   4 - Stoneskin (4)
 | ||
|     - Fire Shield (4)
 | ||
|     - Lesser Globe of Invunrability (4)
 | ||
|   3 - Protection from Energy (3)
 | ||
|   2 - Protection from Arrows (2)
 | ||
|     - Blur (2)
 | ||
|     - Resist Energy (2)
 | ||
|   1 - Shield (1)
 | ||
|     - Mage Armor (1)
 | ||
|     - Protection from Chaos (1)
 | ||
|     - Protection from Evil (1)
 | ||
|     - Protection from Good (1)
 | ||
|     - Protection from Law (1)
 | ||
|   0 - Resistance (0)
 | ||
| //:://////////////////////////////////////////////
 | ||
| //:: Created By: Jasperre
 | ||
| //::////////////////////////////////////////////*/
 | ||
| 
 | ||
| #include "SMP_INC_SPELLS"
 | ||
| 
 | ||
| // Delayed for 6 seconds, this runs itself until oTarget is dead,
 | ||
| // or they don't have the spell's effect anymore.
 | ||
| void SMP_RunWhipImpact(object oTarget, object oCaster);
 | ||
| // Get the spell from this list, best to worst, 1 = best.
 | ||
| // * MAX_SPELLS_IN_LIST is the limit of nListNo.
 | ||
| // Returns SPELL_INVALID on none found.
 | ||
| int GetSpellFromList(int nListNo);
 | ||
| 
 | ||
| const int MAX_SPELLS_IN_LIST = 19;
 | ||
| 
 | ||
| void main()
 | ||
| {
 | ||
|     // Spell hook check.
 | ||
|     if(!SMP_SpellHookCheck(SMP_SPELL_WARDING_WHIP)) return;
 | ||
| 
 | ||
|     // Declare Major Variables
 | ||
|     object oCaster = OBJECT_SELF;
 | ||
|     object oTarget = GetSpellTargetObject();
 | ||
|     int nCasterLevel = SMP_GetCasterLevel();
 | ||
| 
 | ||
|     // Duration is 1 round/5 levels..
 | ||
|     float fDuration = 0.5 + SMP_GetDuration(SMP_ROUNDS, nCasterLevel/5, FALSE);
 | ||
| 
 | ||
|     // Delcare Effects
 | ||
|     effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
 | ||
| 
 | ||
|     // PvP Check
 | ||
|     if(!GetIsReactionTypeFriendly(oTarget) &&
 | ||
|     // Make sure they are not immune to spells
 | ||
|        !SMP_TotalSpellImmunity(oTarget))
 | ||
|     {
 | ||
|         //Fire spell cast at event for target
 | ||
|         SMP_SignalSpellCastAt(oTarget, SMP_SPELL_WARDING_WHIP);
 | ||
| 
 | ||
|         // Duration effect. Cannot stack
 | ||
|         if(!SMP_GetHasSpellEffectFromCaster(SMP_SPELL_WARDING_WHIP, oTarget, oCaster))
 | ||
|         {
 | ||
|             // Apply new one
 | ||
|             SMP_ApplyDuration(oTarget, eDur, fDuration);
 | ||
| 
 | ||
|             // Run impact now.
 | ||
|             SMP_RunWhipImpact(oTarget, oCaster);
 | ||
|         }
 | ||
|         else
 | ||
|         {
 | ||
|             // Cannot affect again. Only imact is done.
 | ||
|             FloatingTextStringOnCreature("*You cannot have more then one whip on a target at once*", oTarget, FALSE);
 | ||
|             return;
 | ||
|         }
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| // Delayed for 6 seconds, this runs itself until oTarget is dead,
 | ||
| // or they don't have the spell's effect anymore.
 | ||
| void SMP_RunWhipImpact(object oTarget, object oCaster)
 | ||
| {
 | ||
|     // Check if dead or validity of oTarget.
 | ||
|     if(!GetIsDead(oTarget) && GetIsObjectValid(oTarget))
 | ||
|     {
 | ||
|         // Check the caster.
 | ||
|         if(GetIsObjectValid(oCaster))
 | ||
|         {
 | ||
|             // Check if they have the effect
 | ||
|             if(SMP_GetHasSpellEffectFromCaster(SMP_SPELL_WARDING_WHIP, oTarget, oCaster))
 | ||
|             {
 | ||
|                 // Fire spell cast at event for target
 | ||
|                 SMP_SignalSpellCastAt(oTarget, SMP_SPELL_WARDING_WHIP);
 | ||
| 
 | ||
|                 // Remove the highest spell on the target.
 | ||
|                 // List is above.
 | ||
|                 int nCnt, nSpellRemove, bBreak;
 | ||
|                 for(nCnt = 1; nCnt <= MAX_SPELLS_IN_LIST && bBreak != TRUE; nCnt++)
 | ||
|                 {
 | ||
|                     nSpellRemove = GetSpellFromList(nCnt);
 | ||
|                     if(nSpellRemove == SPELL_INVALID)
 | ||
|                     {
 | ||
|                         bBreak = TRUE;
 | ||
|                     }
 | ||
|                     else
 | ||
|                     {
 | ||
|                         // Remove the next one
 | ||
|                         bBreak = SMP_RemoveSpellEffectsFromTarget(GetSpellFromList(nCnt), oTarget);
 | ||
|                     }
 | ||
|                 }
 | ||
|                 // Run it again in 6 seconds.
 | ||
|                 DelayCommand(6.0, SMP_RunWhipImpact(oTarget, oCaster));
 | ||
|             }
 | ||
|         }
 | ||
|         else
 | ||
|         {
 | ||
|             // Remove the spells effects
 | ||
|             SMP_PRCRemoveSpellEffects(SMP_SPELL_WARDING_WHIP, oCaster, oTarget);
 | ||
|         }
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| // Get the spell from this list, best to worst, 1 = best.
 | ||
| // * MAX_SPELLS_IN_LIST is the limit of nListNo.
 | ||
| // Returns SPELL_INVALID on none found.
 | ||
| int GetSpellFromList(int nListNo)
 | ||
| {
 | ||
|     switch(nListNo)
 | ||
|     {
 | ||
|         // Note: These are levels 8 and 9, so not included, but might be useful
 | ||
|         // another time.
 | ||
|         //case 1:  { return SMP_SPELL_ABSOLUTE_IMMUNITY; } break;
 | ||
|         //case 2:  { return SMP_SPELL_GUARDIAN_MANTLE_GREATER; } break;
 | ||
|         //case 3:  { return SMP_SPELL_IRON_BODY; } break;
 | ||
|         //case 4:  { return SMP_SPELL_MIND_BLANK; } break;
 | ||
|         // Start of level 7 and below spells.
 | ||
|         case 1:  { return SMP_SPELL_SPELL_TURNING; } break;
 | ||
|         case 2:  { return SMP_SPELL_GUARDIAN_MANTLE; } break;
 | ||
|         case 3:  { return SMP_SPELL_REPULSION; } break;
 | ||
|         case 4:  { return SMP_SPELL_ANTILIFE_SHELL; } break;
 | ||
|         case 5:  { return SMP_SPELL_GLOBE_OF_INVUNRABILITY; } break;
 | ||
|         case 6:  { return SMP_SPELL_GLOBE_OF_INVUNRABILITY_LESSER; } break;
 | ||
|         case 7: { return SMP_SPELL_STONESKIN; } break;
 | ||
|         case 8: { return SMP_SPELL_FIRE_SHIELD; } break;// Note: Check if it removes any sub-spells.
 | ||
|         case 9: { return SMP_SPELL_PROTECTION_FROM_ENERGY; } break;// Note: Check if it removes any sub-spells.
 | ||
|         case 10: { return SMP_SPELL_RESIST_ENERGY; } break;// Note: Check if it removes any sub-spells.
 | ||
|         case 11: { return SMP_SPELL_PROTECTION_FROM_ARROWS; } break;
 | ||
|         case 12: { return SMP_SPELL_BLUR; } break;
 | ||
|         case 13: { return SMP_SPELL_SHIELD; } break;
 | ||
|         case 14: { return SMP_SPELL_MAGE_ARMOR; } break;
 | ||
|         case 15: { return SMP_SPELL_PROTECTION_FROM_EVIL; } break;// Note: all seperate anyway.
 | ||
|         case 16: { return SMP_SPELL_PROTECTION_FROM_GOOD; } break;
 | ||
|         case 17: { return SMP_SPELL_PROTECTION_FROM_LAW; } break;
 | ||
|         case 18: { return SMP_SPELL_PROTECTION_FROM_CHAOS; } break;
 | ||
|         case 19: { return SMP_SPELL_RESISTANCE; } break;
 | ||
|     }
 | ||
|     return SPELL_INVALID;
 | ||
| }
 |