Core.Object | +--Engine.Actor | +--Engine.Effects | +--Botpack.ShockWave
int
ICount
OldShockDistance,
ShockSize
simulated
PostBeginPlay()
SpawnEffects()
Tick(float DeltaTime)
Timer()
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 }