Definitely possible. In my Quake and Tremor spells, I plant an invisible activator underneath each actor and use PushActorAway to knock them up away from it with diminishing force based on how far they are from the player. For Quake, nearby actors are flung a fair distance, far away ones are just knocked over. With Tremor, nearby enemies are flung a short distance, far away ones are just staggered using a short-range KnockAreaEffect. Each activator also has a timer set based on the distance from the player, so there's the sense of a shockwave actually traveling through the ground.
Here's the code for the stagger effect (this is attached to a Self-targeted Spell with a large Area):
Spoiler Scriptname ELEM_Earth_Shock_Effect_Script extends activemagiceffect{Shockwave Effect that staggers all enemies within a large radius with a delay based on the distance};--=== Imports ===--Import UtilityImport Game;--=== Properties ===--Activator Property FXEmptyActivator autoActor Property PlayerRef AutoExplosion Property FXdustDropMedExplosion AutoImpactDataSet Property FXDragonLandingImpactSet AutoImpactDataSet Property VOCShoutPush01ImpactSet Auto;--=== Variables ===--Actor Player;--=== Events ===--Event OnInit()Player = PlayerRefEndEventEvent onEffectStart(Actor akTarget, Actor akCaster);Debug.Trace(self + ": started!")ObjectReference PushPoint = akTarget.PlaceAtMe(FXEmptyActivator)Float WaitTime; 1 km = ~70000 units, so say the shockwave travels at 0.1km/s (1/50 the speed in real life)Float Distance = akTarget.GetDistance(akCaster); Debug.Trace(self + ": Distance: " + Distance)WaitTime = Distance / 7000; Debug.Trace(self + ": Wait: " + WaitTime)Float StaggerMag = ((21333.333 - Distance) / 21333.333)Float PushMag = StaggerMag * 5; Debug.Trace(self + ": PushMag: " + PushMag)Wait(WaitTime)akTarget.PlaceAtMe(FXdustDropMedExplosion)PushPoint.MoveTo(akTarget)PushPoint.KnockAreaEffect(StaggerMag,50)PushPoint.MoveTo(akTarget,0,0,50)PushPoint.PlaceAtMe(FXdustDropMedExplosion)PushPoint.Delete()EndEventEvent onEffectFinish(Actor akTarget, Actor akCaster);Debug.Trace(self + ": Finished!")EndEvent To actually knock the actors up in the air or to the ground, replace
PushPoint.KnockAreaEffect(StaggerMag,50)
with
PushPoint.PushActorAway(akTarget,PushMag)
Just FYI, you have to tune PushMag carefully. Even 0 will ragdoll the actor, 15 will fling most NPCs high enough to take fall damage, and 50 will send even a Giant flying high enough to probably kill it. Negative values will pull the actor toward the pushpoint instead of pushing them away (see Actor Magnet, Midas Magic Black Hole, etc).
Here's the fling-away-from-the-caster effect (a general purpose script with a tunable range):
Spoiler Scriptname ELEMPushActorBlastScript extends ActiveMagicEffect{Pushes actors away based on radius.}Float Property AreaOfEffect autoInt Property PushForce autoBool Property KnockOut = False autoFloat Property KnockOutTime = 1.5 autoSpell Property ELEM_Cond_Stunned AutoActor TargetActor CasterBool Finished = FalseEvent OnEffectStart(actor akTarget, actor akCaster)Target = akTargetCaster = akCasterIf Target == Game.GetPlayer() ReturnEndIfFloat Radius = AreaOfEffect / 2Radius = Radius * 21.33333 ; Convert Feet to UnitsFloat Distance = Caster.GetDistance(Target)If Distance < Radius Float PushMag = ((Radius - Distance) / Radius) * PushForce Debug.Trace(self + ": Blast Radius is " + Radius + ". Distance to target" + Target + " is " + Distance + ". Applying PushMag " + PushMag + ".") Caster.PushActorAway(Target, PushForce) If KnockOut RegisterForSingleUpdate(KnockOutTime) Target.AddSpell(ELEM_Cond_Stunned) EndIfElse Debug.Trace(self + ": Blast Radius is " + Radius + ". Distance to target" + Target + " is " + Distance + ". No force applied.")EndIfEndEventEvent onUpdate()Finished = TrueEndEventEvent OnEffectFinish(actor akTarget, actor akCaster)Finished = TrueEndEvent Here is the effect:
http://www.youtube.com/watch?v=oHJJXzA3e5o