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.
		
			
				
	
	
		
			161 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*:://////////////////////////////////////////////
 | ||
| //:: Spell Name Meteor Swarm
 | ||
| //:: Spell FileName PHS_S_MeteorSwrm
 | ||
| //:://////////////////////////////////////////////
 | ||
| //:: In Game Spell desctiption
 | ||
| //:://////////////////////////////////////////////
 | ||
|     Evocation [Fire]
 | ||
|     Level: Sor/Wiz 9
 | ||
|     Components: V, S
 | ||
|     Casting Time: 1 standard action
 | ||
|     Range: Long (40M)
 | ||
|     Area: Four 13.33-M.-radius spreads; see text
 | ||
|     Duration: Instantaneous
 | ||
|     Saving Throw: None or Reflex half; see text
 | ||
|     Spell Resistance: Yes
 | ||
| 
 | ||
|     Meteor swarm is a very powerful and spectacular spell that is similar to
 | ||
|     fireball in many aspects. When you cast it, four flaming spheres spring from
 | ||
|     your outstretched hand and streak in straight lines to the spots you select.
 | ||
|     The meteor spheres leave a fiery trail of sparks.
 | ||
| 
 | ||
|     Once cast, the other flaming spheres will be targeted at 3 different targets
 | ||
|     other then the target selected (if one is valid), in a 10-M radius sphere.
 | ||
| 
 | ||
|     If you aim a sphere at a specific creature, you may make a ranged touch
 | ||
|     attack to strike the target with the meteor. Any creature struck by one of
 | ||
|     these spheres takes 2d6 points of bludgeoning damage (no save) and receives
 | ||
|     no saving throw against the sphere’s fire damage (see below). If a targeted
 | ||
|     sphere misses its target, it simply explodes at the location of the target.
 | ||
| 
 | ||
|     Once a sphere reaches its destination, it explodes in a 13.33-meter-radius
 | ||
|     spread, dealing 6d6 points of fire damage to each creature in the area. If
 | ||
|     a creature is within the area of more than one sphere, it must save
 | ||
|     separately against each. (Fire resistance applies to each sphere’s damage
 | ||
|     individually.)
 | ||
| //:://////////////////////////////////////////////
 | ||
| //:: Spell Effects Applied / Notes
 | ||
| //:://////////////////////////////////////////////
 | ||
|     Ok:
 | ||
| 
 | ||
|     - We target one, and it explodes as normal, if a target is selected,
 | ||
|       it won't be targeted by another.
 | ||
|     - Then, 3 other "missiles" may be fired, up to 3, as long as it isn't us,
 | ||
|       or the target just targeted.
 | ||
| //:://////////////////////////////////////////////
 | ||
| //:: Created By: Jasperre
 | ||
| //::////////////////////////////////////////////*/
 | ||
| 
 | ||
| #include "PHS_INC_SPELLS"
 | ||
| 
 | ||
| // Constant used just in this spell
 | ||
| const string PHS_METEOR_SWARM_ONLY_BLAST = "PHS_METEOR_SWARM_ONLY_BLAST";
 | ||
| 
 | ||
| void main()
 | ||
| {
 | ||
|     // Spell hook check
 | ||
|     if(!PHS_SpellHookCheck(PHS_SPELL_METEOR_SWARM)) return;
 | ||
| 
 | ||
|     // Declare major variables
 | ||
|     object oCaster = OBJECT_SELF;
 | ||
|     object oSpellTarget = GetSpellTargetObject();
 | ||
|     object oTarget;
 | ||
|     location lTarget = GetSpellTargetLocation();
 | ||
|     int nSpellSaveDC = PHS_GetSpellSaveDC(); // Special - see below
 | ||
|     int nDam;
 | ||
|     float fDelay;
 | ||
|     // Compared to those in loop. If any == oTargetHit, no save!
 | ||
|     object oTargetHit;
 | ||
| 
 | ||
|     // The old (and proper) stored DC is used if nOnlyBlast is > 0
 | ||
|     // It is stored to it (onyl one variable needed then)
 | ||
|     int nOnlyBlast = GetLocalInt(oCaster, PHS_METEOR_SWARM_ONLY_BLAST);
 | ||
|     if(nOnlyBlast > 0)
 | ||
|     {
 | ||
|         nSpellSaveDC = nOnlyBlast;
 | ||
|     }
 | ||
| 
 | ||
|     // Declare effects
 | ||
|     effect eImpact = EffectVisualEffect(PHS_VFX_FNF_METEOR_SWARM);
 | ||
| 
 | ||
|     // Apply AOE visual
 | ||
|     PHS_ApplyLocationVFX(lTarget, eImpact);
 | ||
| 
 | ||
|     // If oTarget is valid, we check if we hit them for extra damage
 | ||
|     if(GetIsObjectValid(oSpellTarget))
 | ||
|     {
 | ||
|         // Make a touch attack
 | ||
|         if(PHS_SpellTouchAttack(PHS_TOUCH_RANGED, oSpellTarget))
 | ||
|         {
 | ||
|             // Do some bludgeoning damage to this target
 | ||
|             nDam = PHS_MaximizeOrEmpower(6, 2, FALSE);
 | ||
|             // No delay to this damage as it should be the impact of the spell!
 | ||
|             PHS_ApplyDamageToObject(oSpellTarget, nDam, DAMAGE_TYPE_BLUDGEONING);
 | ||
|             // This target now gets no save against this blast!
 | ||
|             oTargetHit = oSpellTarget;
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     // Always do damage for this script - the integer below specifices if we
 | ||
|     // do more targets with it. Target all objects that can be damaged in 40ft radius.
 | ||
|     oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 13.33, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
 | ||
|     while(GetIsObjectValid(oTarget))
 | ||
|     {
 | ||
|         // PvP Check
 | ||
|         if(!GetIsReactionTypeFriendly(oTarget, oCaster))
 | ||
|         {
 | ||
|             //Fire cast spell at event for the specified target
 | ||
|             PHS_SignalSpellCastAt(oTarget, PHS_SPELL_METEOR_SWARM);
 | ||
| 
 | ||
|             //Get the distance between the explosion and the target to calculate delay
 | ||
|             fDelay = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget))/20;
 | ||
| 
 | ||
|             // Spell resistance And immunity checking.
 | ||
|             if(!PHS_SpellResistanceCheck(oCaster, oTarget, fDelay))
 | ||
|             {
 | ||
|                 // Roll damage for each target - 6d6
 | ||
|                 nDam = PHS_MaximizeOrEmpower(6, 6, FALSE);
 | ||
| 
 | ||
|                 // Only do reflex save if not hit
 | ||
|                 if(oTarget != oTargetHit)
 | ||
|                 {
 | ||
|                     // Adjust the damage based on the Reflex Save, Evasion and Improved Evasion.
 | ||
|                     nDam = PHS_GetAdjustedDamage(SAVING_THROW_REFLEX, nDam, oTarget, nSpellSaveDC, SAVING_THROW_TYPE_FIRE);
 | ||
|                 }
 | ||
|                 // Need to do damage to apply visuals
 | ||
|                 if(nDam > 0)
 | ||
|                 {
 | ||
|                     // Apply effects to the currently selected target.
 | ||
|                     DelayCommand(fDelay, PHS_ApplyDamageToObject(oTarget, nDam, DAMAGE_TYPE_FIRE));
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         // Get next target
 | ||
|         oTarget = GetNextObjectInShape(SHAPE_SPHERE, 13.33, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
 | ||
|     }
 | ||
| 
 | ||
|     // Check if we do more blasts
 | ||
|     if(!nOnlyBlast) // PHS_METEOR_SWARM_ONLY_BLAST
 | ||
|     {
 | ||
|         // Stop what we are doing
 | ||
|         ClearAllActions();
 | ||
|         // Set so that the next 3 will only do damage, thats it.
 | ||
|         SetLocalInt(OBJECT_SELF, PHS_METEOR_SWARM_ONLY_BLAST, nSpellSaveDC);
 | ||
|         DelayCommand(2.5, DeleteLocalInt(OBJECT_SELF, PHS_METEOR_SWARM_ONLY_BLAST));
 | ||
| 
 | ||
|         // Get the targets
 | ||
|         int nCnt = 0;
 | ||
|         oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 10.0, lTarget, TRUE);
 | ||
|         // Max of 3 more, up to 10M from original location.
 | ||
|         while(GetIsObjectValid(oTarget) && nCnt <= 3)
 | ||
|         {
 | ||
|             if(oTarget != OBJECT_SELF && oTarget != oSpellTarget)
 | ||
|             {
 | ||
|                 nCnt++;
 | ||
|                 ActionCastSpellAtObject(PHS_SPELL_METEOR_SWARM, oTarget, METAMAGIC_NONE, TRUE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);
 | ||
|             }
 | ||
|             oTarget = GetNextObjectInShape(SHAPE_SPHERE, 10.0, lTarget, TRUE);
 | ||
|         }
 | ||
|     }
 | ||
| }
 |