Botpack
Class ShockWave

source: e:\games\UnrealTournament\Botpack\Classes\ShockWave.uc
Core.Object
   |
   +--Engine.Actor
      |
      +--Engine.Effects
         |
         +--Botpack.ShockWave
Direct Known Subclasses:None

class ShockWave
extends Engine.Effects

//============================================================================= // ShockWave. //=============================================================================
Variables
 int ICount
 OldShockDistance, ShockSize


Function Summary
 
simulated
PostBeginPlay()
 
simulated
SpawnEffects()
 
simulated
Tick(float DeltaTime)
 
simulated
Timer()



Source Code


00001	//=============================================================================
00002	// ShockWave.
00003	//=============================================================================
00004	class ShockWave extends Effects;
00005	
00006	#exec MESH IMPORT MESH=ShockWavem ANIVFILE=MODELS\SW_a.3D DATAFILE=MODELS\SW_d.3D X=0 Y=0 Z=0 
00007	#exec MESH ORIGIN MESH=ShockWavem X=0 Y=0 Z=0 YAW=0 PITCH=64
00008	#exec MESH SEQUENCE MESH=ShockWavem SEQ=All       STARTFRAME=0   NUMFRAMES=2
00009	#exec MESH SEQUENCE MESH=ShockWavem SEQ=Explosion STARTFRAME=0   NUMFRAMES=2
00010	#exec MESH SEQUENCE MESH=ShockWavem SEQ=Implode   STARTFRAME=0   NUMFRAMES=1
00011	#exec TEXTURE IMPORT NAME=Shockt1 FILE=MODELS\shockw.PCX GROUP="Skins"
00012	#exec MESHMAP SCALE MESHMAP=ShockWavem X=1.0 Y=1.0 Z=2.0 
00013	#exec MESHMAP SETTEXTURE MESHMAP=ShockWavem NUM=1 TEXTURE=Shockt1
00014	
00015	var float OldShockDistance, ShockSize;
00016	var int ICount;
00017	
00018	simulated function Tick( float DeltaTime )
00019	{
00020		if ( Level.NetMode != NM_DedicatedServer )
00021		{
00022			ShockSize =  13 * (Default.LifeSpan - LifeSpan) + 3.5/(LifeSpan/Default.LifeSpan+0.05);
00023			ScaleGlow = Lifespan;
00024			AmbientGlow = ScaleGlow * 255;
00025			DrawScale = ShockSize;
00026		}
00027	}
00028	
00029	simulated function Timer()
00030	{
00031	
00032		local actor Victims;
00033		local float damageScale, dist, MoScale;
00034		local vector dir;
00035	
00036		ShockSize =  13 * (Default.LifeSpan - LifeSpan) + 3.5/(LifeSpan/Default.LifeSpan+0.05);
00037		if ( Level.NetMode != NM_DedicatedServer )
00038		{
00039			if (ICount==4) spawn(class'WarExplosion2',,,Location);
00040			ICount++;
00041	
00042			if ( Level.NetMode == NM_Client )
00043			{
00044				foreach VisibleCollidingActors( class 'Actor', Victims, ShockSize*29, Location )
00045					if ( Victims.Role == ROLE_Authority )
00046					{
00047						dir = Victims.Location - Location;
00048						dist = FMax(1,VSize(dir));
00049						dir = dir/dist +vect(0,0,0.3); 
00050						if ( (dist> OldShockDistance) || (dir dot Victims.Velocity <= 0))
00051						{
00052							MoScale = FMax(0, 1100 - 1.1 * Dist);
00053							Victims.Velocity = Victims.Velocity + dir * (MoScale + 20);	
00054							Victims.TakeDamage
00055							(
00056								MoScale,
00057								Instigator, 
00058								Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir,
00059								(1000 * dir),
00060								'RedeemerDeath'
00061							);
00062						}
00063					}	
00064				return;
00065			}
00066		}
00067	
00068		foreach VisibleCollidingActors( class 'Actor', Victims, ShockSize*29, Location )
00069		{
00070			dir = Victims.Location - Location;
00071			dist = FMax(1,VSize(dir));
00072			dir = dir/dist + vect(0,0,0.3); 
00073			if (dist> OldShockDistance || (dir dot Victims.Velocity < 0))
00074			{
00075				MoScale = FMax(0, 1100 - 1.1 * Dist);
00076				if ( Victims.bIsPawn )
00077					Pawn(Victims).AddVelocity(dir * (MoScale + 20));
00078				else
00079					Victims.Velocity = Victims.Velocity + dir * (MoScale + 20);	
00080				Victims.TakeDamage
00081				(
00082					MoScale,
00083					Instigator, 
00084					Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir,
00085					(1000 * dir),
00086					'RedeemerDeath'
00087				);
00088			}
00089		}	
00090		OldShockDistance = ShockSize*29;	
00091	}
00092	
00093	simulated function PostBeginPlay()
00094	{
00095		local Pawn P;
00096	
00097		if ( Role == ROLE_Authority ) 
00098		{
00099			for ( P=Level.PawnList; P!=None; P=P.NextPawn )
00100				if ( P.IsA('PlayerPawn') && (VSize(P.Location - Location) < 3000) )
00101					PlayerPawn(P).ShakeView(0.5, 600000.0/VSize(P.Location - Location), 10);
00102	
00103			if ( Instigator != None )
00104				MakeNoise(10.0);
00105		}
00106	
00107		SetTimer(0.1, True);
00108	
00109		if ( Level.NetMode != NM_DedicatedServer )
00110			SpawnEffects();
00111	}
00112	
00113	simulated function SpawnEffects()
00114	{
00115		 local WarExplosion W;
00116	
00117		 PlaySound(Sound'Expl03', SLOT_Interface, 16.0);
00118		 PlaySound(Sound'Expl03', SLOT_None, 16.0);
00119		 PlaySound(Sound'Expl03', SLOT_Misc, 16.0);
00120		 PlaySound(Sound'Expl03', SLOT_Talk, 16.0);
00121		 W = spawn(class'WarExplosion',,,Location);
00122		 W.RemoteRole = ROLE_None;
00123	}
00124	
00125	defaultproperties
00126	{
00127	     bAlwaysRelevant=True
00128	     RemoteRole=ROLE_SimulatedProxy
00129	     LifeSpan=1.500000
00130	     DrawType=DT_Mesh
00131	     Style=STY_Translucent
00132	     Mesh=LodMesh'Botpack.ShockWavem'
00133	     AmbientGlow=255
00134	     bUnlit=True
00135	}

End Source Code