Core.Object | +--Engine.Actor | +--Engine.Effects | +--Engine.Fragment
ImpactSound,
AltImpactSound
MESH
Fragments[11]
float
SplashTime
bool
bFirstHit
int
numFragmentTypes
simulated
CalcVelocity(vector Momentum)
CanSplash()
HitWall(vector HitNormal, Actor HitWall)
void
RandSpin(float spinRate)
PhysicsVolumeChange(PhysicsVolume NewVolume)
00001 //============================================================================= 00002 // Fragment. 00003 //============================================================================= 00004 class Fragment extends Effects; 00005 00006 var() MESH Fragments[11]; 00007 var int numFragmentTypes; 00008 var bool bFirstHit; 00009 var() sound ImpactSound, AltImpactSound; 00010 var() float SplashTime; 00011 00012 function bool CanSplash() 00013 { 00014 if ( (Level.TimeSeconds - SplashTime > 0.25) 00015 && (Physics == PHYS_Falling) 00016 && (Abs(Velocity.Z) > 100) ) 00017 { 00018 SplashTime = Level.TimeSeconds; 00019 return true; 00020 } 00021 return false; 00022 } 00023 00024 00025 simulated function CalcVelocity(vector Momentum) 00026 { 00027 local float ExplosionSize; 00028 00029 ExplosionSize = 0.011 * VSize(Momentum); 00030 Velocity = 0.0033 * Momentum + 0.7 * VRand()*(ExplosionSize+FRand()*100.0+100.0); 00031 Velocity.z += 0.5 * ExplosionSize; 00032 } 00033 00034 simulated function HitWall (vector HitNormal, actor HitWall) 00035 { 00036 local float speed; 00037 00038 Velocity = 0.5*(( Velocity dot HitNormal ) * HitNormal * (-2.0) + Velocity); // Reflect off Wall w/damping 00039 speed = VSize(Velocity); 00040 if (bFirstHit && speed<400) 00041 { 00042 bFirstHit=False; 00043 bRotatetoDesired=True; 00044 bFixedRotationDir=False; 00045 DesiredRotation.Pitch=0; 00046 DesiredRotation.Yaw=FRand()*65536; 00047 DesiredRotation.roll=0; 00048 } 00049 RotationRate.Yaw = RotationRate.Yaw*0.75; 00050 RotationRate.Roll = RotationRate.Roll*0.75; 00051 RotationRate.Pitch = RotationRate.Pitch*0.75; 00052 if ( (speed < 60) && (HitNormal.Z > 0.7) ) 00053 { 00054 SetPhysics(PHYS_none); 00055 bBounce = false; 00056 GoToState('Dying'); 00057 } 00058 else if (speed > 80) 00059 { 00060 if (FRand()<0.5) 00061 PlaySound(ImpactSound); 00062 else 00063 PlaySound(AltImpactSound); 00064 } 00065 } 00066 00067 simulated final function RandSpin(float spinRate) 00068 { 00069 DesiredRotation = RotRand(); 00070 RotationRate.Yaw = spinRate * 2 *FRand() - spinRate; 00071 RotationRate.Pitch = spinRate * 2 *FRand() - spinRate; 00072 RotationRate.Roll = spinRate * 2 *FRand() - spinRate; 00073 } 00074 00075 auto state Flying 00076 { 00077 simulated function timer() 00078 { 00079 GoToState('Dying'); 00080 } 00081 00082 simulated singular function PhysicsVolumeChange( PhysicsVolume NewVolume ) 00083 { 00084 if ( NewVolume.bWaterVolume ) 00085 { 00086 Velocity = 0.2 * Velocity; 00087 if (bFirstHit) 00088 { 00089 bFirstHit=False; 00090 bRotatetoDesired=True; 00091 bFixedRotationDir=False; 00092 DesiredRotation.Pitch=0; 00093 DesiredRotation.Yaw=FRand()*65536; 00094 DesiredRotation.roll=0; 00095 } 00096 00097 RotationRate = 0.2 * RotationRate; 00098 GotoState('Dying'); 00099 } 00100 } 00101 00102 simulated function BeginState() 00103 { 00104 RandSpin(125000); 00105 if (abs(RotationRate.Pitch)<10000) 00106 RotationRate.Pitch=10000; 00107 if (abs(RotationRate.Roll)<10000) 00108 RotationRate.Roll=10000; 00109 Mesh = Fragments[int(FRand()*numFragmentTypes)]; 00110 if ( Level.NetMode == NM_Standalone ) 00111 LifeSpan = 20 + 40 * FRand(); 00112 SetTimer(5.0,True); 00113 } 00114 } 00115 00116 state Dying 00117 { 00118 function TakeDamage( int Dam, Pawn instigatedBy, Vector hitlocation, 00119 Vector momentum, class<DamageType> damageType) 00120 { 00121 Destroy(); 00122 } 00123 00124 simulated function timer() 00125 { 00126 if ( !PlayerCanSeeMe() ) 00127 Destroy(); 00128 } 00129 00130 simulated function BeginState() 00131 { 00132 SetTimer(1 + FRand(),True); 00133 SetCollision(true, false, false); 00134 } 00135 } 00136 00137 defaultproperties 00138 { 00139 bFirstHit=True 00140 bDestroyInPainVolume=True 00141 bCollideWorld=True 00142 bBounce=True 00143 bFixedRotationDir=True 00144 Physics=PHYS_Falling 00145 DrawType=DT_Mesh 00146 LifeSpan=20.000000 00147 CollisionRadius=18.000000 00148 CollisionHeight=4.000000 00149 }