Preferably they would take random 'arcs' towards the opponent. That would look awesome.
Scriptname TestMEScript extends ActiveMagicEffect FormList Property AimedSpellsList AutoActivator Property DummyObject AutoInt Property ProjectilesMax AutoInt Property ProjectilesMin AutoFloat Property CastingDistance AutoObjectReference[] DummiesEvent OnEffectStart(Actor akTarget, Actor akCaster) Dummies = New ObjectReference[128] int Count = Utility.RandomInt(ProjectilesMin, ProjectilesMax) int index = 0 while (index < Count) Dummies[index] = PlaceInFrontOfMeRandom(akCaster, DummyObject, CastingDistance) index += 1 endwhile Spell TempSpell index = 0 while (index < Count) TempSpell = AimedSpellsList.GetAt(Utility.RandomInt(0, AimedSpellsList.GetSize() - 1)) as Spell TempSpell.RemoteCast(Dummies[index], akCaster, akTarget) Dummies[index].Delete() index += 1 endwhileEndEventObjectReference Function PlaceInFrontOfMeRandom(ObjectReference Target, Form akObject, Float Distance) ObjectReference PlacedObject = Target.PlaceAtMe(akObject, 1, false, true) Float AngleZ = Target.GetAngleZ() AngleZ = Utility.RandomFloat(AngleZ - 30.0, AngleZ + 30.0) Float AngleX = Utility.RandomFloat(-30.0, 30.0) Float OffsetZ = Distance * Math.Sin(AngleX) Float DistanceXY = Distance * Math.Cos(AngleX) Float OffsetX = DistanceXY * Math.Sin(AngleZ) Float OffsetY = DistanceXY * Math.Cos(AngleZ) PlacedObject.MoveTo(Target, OffsetX, OffsetY, OffsetZ) Return PlacedObjectEndFunction

Scriptname DnDMagicMissileScript extends ObjectReference Import UtilityFloat Property XOff AutoFloat Property YOff AutoFloat Property ZOff Auto ; The offset coordinates for the missile's "Standby" hover preference location.Float MySpeed = 1000.0 ; How fast do magic missiles move?Bool Property IsMoving = False Auto ; Am I currently in motion?Actor Property MyCaster Auto ; Whose magic missile am I?LinkedListControls Property MyNode AutoEvent OnInit() RegisterForSingleUpdate(RandomFloat(1.0,5.0))EndEventEvent OnUpdate() if !IsMoving if Gvar.MissileTarget && GetDistance(Gvar.MissileTarget) < 500.0 && !(Gvar.MissileTarget as Actor).IsDead() DealDamage() TranslateToRef(Gvar.MissileTarget,MySpeed) Disable(True) Delete() elseif Gvar.MissileTarget && !(Gvar.MissileTarget as actor).IsDead() IsMoving = True TranslateToRef(Gvar.MissileTarget,MySpeed) elseif GetDistance(MyCaster) > 600.0 TranslateTo(MyCaster.X+Xoff,MyCaster.Y+Yoff,MyCaster.Z+Zoff,0.0,0.0,0.0,MySpeed) endif endif RegisterForSingleUpdate(RandomFloat(1.0,5.0)) ; Makes it unlikely that multiple missiles will reach the target at the same timeEndEventFunction DealDamage() actor Target = Gvar.MissileTarget as Actor int Damage = RandomInt(2,5) if Target Target.DamageAV("Health",Damage) PushActorAway(Target,Damage) if Target.IsDead() Gvar.MissileTarget = None ; Prevent wastage of more missiles. endif else ; Target is not an actor. Gvar.MissileTarget.ApplyHavokImpulse(0.0,0.0,-500,Damage*10) endifEndFunctionEvent OnTranslationComplete() IsMoving = False if Gvar.MissileTarget && GetDistance(Gvar.MissileTarget) < 500.0 && !(Gvar.MissileTarget as Actor).IsDead() IsMoving = True ; Don't wait for update. DealDamage() TranslateToRef(Gvar.MissileTarget,MySpeed) Disable(True) Delete() elseif Gvar.MissileTarget && !(Gvar.MissileTarget as Actor).IsDead() IsMoving = True TranslateToRef(Gvar.MissileTarget,MySpeed) endifEndEventDnDGlobalScript Property Gvar AutoScriptname DnDMissileControllerScript extends ObjectReference import UtilityFunction NewMissiles(int N, actor Caster)Debug.Notification("Creating " + N + " Missiles.") int Count = 0 DnDMagicMissileScript Missile While Count < N Missile = (Caster.PlaceAtme(Gvar.MagicMissileType,1) as DnDMagicMissileScript) Missile.XOff = RandomFloat(-250.0,250.0) Missile.YOff = RandomFloat(-250.0,250.0) Missile.ZOff = RandomFloat(-250.0,250.0) + 300 ; Store the missile's holding position. Missile.MyCaster = Caster Missile.MoveTo(Caster ,Missile.XOff,Missile.YOff,Missile.ZOff) Count += 1 EndWhileEndFunctionEvent OnInit() if Gvar.MissileController Disable() Delete() else Gvar.MissileController = Self endifEndEventDnDGlobalScript Property Gvar AutoScriptname DnDMMIssileFireScript extends activemagiceffectReferenceAlias Property DnDMMissileTarget autoMiscObject Property DnDMMissileLight autoSpell Property DnDMMissileFireSPell autoevent OnEffectStart(Actor akTarget, Actor akCaster) DnDMMissileTarget.ForceRefTo(akTarget as ObjectReference) int MMissileCount = akCaster.GetItemCount(DnDMMissileLight) int MissileDropper = 0 while MissileDropper<= MMissileCount akCaster.DropObject(DnDMMissileLight) MissileDropper = MissileDropper+1 Utility.Wait(0.30) endWhile akCaster.RemoveSpell(DnDMMissileFireSpell)endEvent
Scriptname DnDMMissileLightScript extends ObjectReferenceReferenceAlias Property DnDMMissileTarget autoEvent OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer) if akNewContainer==None (self as ObjectReference).SplineTranslateToRef(DnDMMissileTarget.GetReference(), 2.0, 1000.00, 0.0)endIfendEventevent OnTranslationComplete() Actor HitActor = DnDMMissileTarget.GetReference() as actor int MMissileDam = Utility.RandomInt(2,5) HitActor.DamageAV("Health", MMissileDam) Utility.Wait(2) DnDMMissileTarget.Clear() self.disable()endEventScriptname DnDMMIssileFireScript extends activemagiceffectReferenceAlias Property DnDMMissileTarget autoMiscObject Property DnDMMissileLight autoSpell Property DnDMMissileFireSPell autoevent OnEffectStart(Actor akTarget, Actor akCaster) DnDMMissileTarget.ForceRefTo(akTarget as ObjectReference) int MMissileCount = akCaster.GetItemCount(DnDMMissileLight) int MissileDropper = 0 while MissileDropper<= MMissileCount akCaster.DropObject(DnDMMissileLight) MissileDropper = MissileDropper+1 Utility.Wait(0.30) endWhile akCaster.RemoveSpell(DnDMMissileFireSpell)endEvent
Scriptname DnDMMissileLightScript extends ObjectReferenceReferenceAlias Property DnDMMissileTarget autoEvent OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer) if akNewContainer==None (self as ObjectReference).SplineTranslateToRef(DnDMMissileTarget.GetReference(), 2.0, 1000.00, 0.0)endIfendEventevent OnTranslationComplete() Actor HitActor = DnDMMissileTarget.GetReference() as actor int MMissileDam = Utility.RandomInt(2,5) HitActor.DamageAV("Health", MMissileDam) Utility.Wait(2) DnDMMissileTarget.Clear() self.disable()endEvent