Core.Object | +--Engine.Actor | +--Engine.Mover | +--XIII.XIIIMover | +--XIDCine.BreakableMover
E_BreakType
BreakType
Name
BreakedMeshAnim
array
BreakedMiddleStateSM
STATICMESH
BreakedStaticMesh
bool
CollisionWhenBreaked
class
DecoPickupGenerated
float
DelayDamage
DelayToUse
DelayTrigger
VECTOR
Fragment_Center
int
InitialHealth
LastDamage
EDrawType
MemoDrawType
Texture
OnomatopTextures[6]
XIIIPlayerController
PC
ParticlesUseCollision
RelativeBlow
StruckEmitter
TempsContact
Pawn
Walker
bDisperseInBoundingBox
bMustShakeWhileDelay
mesh
breakingmesh
particles_speed
simulated
Breaked()
Breaking(float fDelay)
ComputeDispersal()
void
EffectiveTakeDamage()
FastBreak()
InitDazzleAndShake(bool bBroken)
InitializeEmitters()
IsBreakableByPlayer()
MakeGroupReturn()
NonDestructiveParticles(vector pos)
//_____________________________________________________________________________
Reset()
00001 //----------------------------------------------------------- 00002 // BreakableMover 00003 // Created by iKi 00004 // Last Modification by iKi 00005 //----------------------------------------------------------- 00006 class BreakableMover extends XIIIMover 00007 hidecategories(Force,LightColor,Lighting,Mover,Porte,MoverSound); 00008 00009 ENUM E_BreakType { BT_Always, BT_TriggerOnly, BT_DamageOnly }; 00010 00011 ENUM E_FireType { FT_None, FT_DontUseIt1, FT_DontUseIt2, FT_DontUseIt3 }; 00012 00013 ENUM E_SmokeType { ST_None, ST_DontUseIt1, ST_DontUseIt2, ST_DontUseIt3, ST_DontUseIt4, ST_DontUseIt5 }; 00014 00015 ENUM E_OnomatopType { OT_None, OT_Baommm, OT_Aahh, OT_Crac, OT_Cling, OT_Blam }; 00016 00017 STRUCT C_MeshParticles 00018 { 00019 VAR() class<Emitter> Type; 00020 VAR() Vector Eparpillement; 00021 VAR() int Number; 00022 VAR() float ScaleMin; 00023 VAR() float ScaleMax; 00024 VAR() Vector Offset; 00025 VAR() StaticMesh StaticMesh; 00026 VAR() Vector Blow; 00027 VAR() bool FadeOut; 00028 VAR() float FadeOutBegin; 00029 VAR() float FadeOutEnd; 00030 }; 00031 00032 STRUCT BMState 00033 { 00034 VAR() int DamagePercentage; 00035 VAR() StaticMesh StateStaticMesh; 00036 VAR() Texture StateTexture; 00037 VAR() Sound StateSound; 00038 VAR() name StateEvent; 00039 }; 00040 00041 STRUCT C_FireSprites 00042 { 00043 VAR() E_FireType Type; 00044 VAR() Vector Dispersal; 00045 VAR() int Number; 00046 VAR() float ScaleMin; 00047 VAR() float ScaleMax; 00048 VAR() Vector Offset; 00049 VAR() ParticleEmitter.EParticleDrawStyle DrawStyle; 00050 VAR() float LifeTime; 00051 VAR() bool OneTextureAnimOnly; 00052 VAR() bool FadeOut; 00053 VAR() float FadeOutBegin; 00054 }; 00055 00056 STRUCT C_SmokeSprites 00057 { 00058 VAR() E_SmokeType Type; 00059 VAR() Vector Dispersal; 00060 VAR() int Number; 00061 VAR() float ScaleMin; 00062 VAR() float ScaleMax; 00063 VAR() Vector Offset; 00064 VAR() ParticleEmitter.EParticleDrawStyle DrawStyle; 00065 VAR() float LifeTime; 00066 VAR() bool OneTextureAnimOnly; 00067 VAR() bool FadeOut; 00068 VAR() float FadeOutBegin; 00069 }; 00070 00071 STRUCT C_OnomatopSprites 00072 { 00073 VAR() E_OnomatopType Type; 00074 VAR() Vector Dispersal; 00075 VAR() int Number; 00076 VAR() float ScaleMin; 00077 VAR() float ScaleMax; 00078 VAR() Vector Offset; 00079 VAR() ParticleEmitter.EParticleDrawStyle DrawStyle; 00080 VAR() float LifeTime; 00081 VAR() bool OneTextureAnimOnly; 00082 }; 00083 00084 VAR() bool CollisionWhenBreaked; 00085 VAR() bool ParticlesUseCollision; 00086 VAR() bool bMustShakeWhileDelay; 00087 VAR() bool bDisperseInBoundingBox; 00088 VAR(BM_Vulnerability) bool bVulnerableBladeCut; 00089 VAR(BM_Vulnerability) bool bVulnerableGrenade; 00090 VAR(BM_Vulnerability) bool bVulnerableGun; 00091 VAR(BM_Vulnerability) bool bVulnerableShotgun; 00092 VAR(BM_Vulnerability) bool bVulnerableStunning; 00093 VAR(BM_Vulnerability) bool bVulnerablePiercing; 00094 VAR(BM_Vulnerability) bool bVulnerableToFist; 00095 VAR(Fragments2D) bool Fragments_FadeOut; 00096 VAR(Fragments3D) bool Fragments3DIgnoreDynLight; 00097 VAR(Fragments3D) bool CollisionTime; 00098 VAR bool bBreaking; 00099 VAR bool bBroken; 00100 VAR bool bToBeDestroyed; 00101 VAR(ShakeCamera) bool SC_bActive; 00102 VAR(ShakeCamera) bool SC_StartAfterBreakingAnim; 00103 VAR bool SC_bRunning; 00104 VAR(FlashDazzle) bool FD_bActive; 00105 VAR(FlashDazzle) bool FD_StartAfterBreakingAnim; 00106 VAR bool FD_bRunning; 00107 VAR bool bMemoColActors; 00108 VAR bool bMemoBlockActors; 00109 VAR bool bMemoBlockPlayers; 00110 00111 VAR() float DelayDamage; 00112 VAR() float DelayTrigger; 00113 VAR() float RelativeBlow; // Blow induce from player location 00114 VAR(Fragments2D) float Fragments_ScaleMin; 00115 VAR(Fragments2D) float Fragments_ScaleMax; 00116 VAR(Fragments2D) float Fragments_FadeOutBegin; 00117 VAR(Fragments2D) float Fragments_FadeOutEnd; 00118 VAR TRANSIENT float DelayToUse; 00119 VAR TRANSIENT float TempsContact; 00120 VAR TRANSIENT float TimeStamp; 00121 VAR(ShakeCamera) float SC_lifetime; 00122 VAR(ShakeCamera) float SC_delay; 00123 VAR(ShakeCamera) float SC_intensity; 00124 VAR(ShakeCamera) float SC_distance_start; 00125 VAR(ShakeCamera) float SC_distance_end; 00126 VAR float SC_localintensity; 00127 VAR float SC_starttime; 00128 VAR(FlashDazzle) float FD_lifetime; 00129 VAR(FlashDazzle) float FD_delay; // TODEL : Always be ZERO 00130 VAR(FlashDazzle) float FD_intensity; 00131 VAR(FlashDazzle) float FD_distance_start; 00132 VAR(FlashDazzle) float FD_distance_end; 00133 VAR float FD_localintensity; 00134 VAR float FD_starttime; 00135 00136 VAR(Fragments2D) int FragmentTextureUSubdivisions; 00137 VAR(Fragments2D) int FragmentTextureVSubdivisions; 00138 VAR(Fragments2D) int Fragments_Number; 00139 VAR(Save) int BreakPoint; 00140 VAR(Sound) int ExplosiveType; // for SoundWhenBreaked parameter 00141 VAR TRANSIENT int InitialHealth; 00142 VAR TRANSIENT int LastDamage; 00143 00144 VAR(Fragments2D) VECTOR Fragments_Eparpillement; 00145 VAR(Fragments2D) VECTOR Fragments_Offset; 00146 VAR(Fragments2D) VECTOR Fragments_Blow; 00147 VAR TRANSIENT VECTOR particles_speed; 00148 VAR TRANSIENT VECTOR Fragment_Center; 00149 VAR VECTOR ExplosiveEmitterOffset; 00150 VAR VECTOR FD_vectorcolor; 00151 00152 VAR(Fragments2D) TEXTURE FragmentTexture; 00153 VAR(Explosif) TEXTURE FireTexture; 00154 VAR(Explosif) TEXTURE SmokeTexture; 00155 VAR(Explosif) TEXTURE OnomatopTexture; 00156 VAR CONST TEXTURE OnomatopTextures[6]; 00157 00158 VAR() STATICMESH BreakedStaticMesh; 00159 VAR STATICMESH InitialStaticMesh; 00160 00161 VAR() E_BreakType BreakType; 00162 VAR() Name BreakedMeshAnim; 00163 VAR(Sound) Sound SoundWhenBroken; 00164 00165 VAR(FlashDazzle) color FD_color; 00166 00167 VAR TRANSIENT Pawn Walker; 00168 00169 VAR TRANSIENT mesh breakingmesh; 00170 00171 VAR(Fragments2D) class<Emitter> Fragments_Type; 00172 00173 VAR(Fragments2D) ParticleEmitter.EParticleDrawStyle FragmentDrawStyle; 00174 00175 VAR TRANSIENT EDrawType MemoDrawType; 00176 00177 VAR(Fragments3D) C_MeshParticles Fragments3D; 00178 00179 VAR() array<BMState> BreakedMiddleStateSM; 00180 00181 VAR(Explosif) C_FireSprites Fire; 00182 00183 VAR(Explosif) C_SmokeSprites Smoke; 00184 00185 VAR(Explosif) C_OnomatopSprites Onomatop; 00186 00187 VAR(Explosif) class<Emitter> ExplosiveEmitter; 00188 00189 VAR() class<XIIIDecoPickup> DecoPickupGenerated; 00190 00191 VAR() class<Emitter> StruckEmitter; 00192 00193 VAR XIIIPlayerController PC; 00194 00195 00196 replication 00197 { 00198 reliable if( Role==ROLE_Authority ) 00199 bBroken, Walker, SoundWhenBroken, ExplosiveType; 00200 } 00201 00202 FUNCTION Reset() 00203 { 00204 if ( bBroken ) 00205 { 00206 StaticMesh=InitialStaticMesh; 00207 bHidden=false; 00208 RefreshDisplaying(); 00209 SetCollision(bMemoColActors,bMemoBlockActors,bMemoBlockPlayers); 00210 bBroken=false; 00211 bBreaking=false; 00212 bToBeDestroyed=false; 00213 } 00214 } 00215 00216 simulated EVENT Tick(float dt) 00217 { 00218 LOCAL float time; 00219 00220 TimeStamp+=dt; 00221 00222 if ( Level.NetMode == NM_Client ) 00223 { 00224 if ( bBroken ) 00225 { 00226 Breaked(); 00227 Disable('Tick'); 00228 } 00229 } 00230 else 00231 if (FD_bRunning) 00232 { 00233 time=(TimeStamp-FD_starttime)/FD_lifetime; 00234 if (time>=0 && time<=1.0) 00235 PC.ClientInstantFlash( Lerp(time,-FD_localintensity,0), FD_VectorColor);/*vect(1000,1000,1000));*/ 00236 else 00237 { 00238 if (time>1) 00239 { 00240 if (bToBeDestroyed) 00241 Destroy(); 00242 FD_bRunning=false; 00243 } 00244 } 00245 } 00246 } 00247 00248 simulated FUNCTION InitDazzleAndShake(bool bBroken) 00249 { 00250 LOCAL float dist; 00251 00252 if ( !Level.bLonePlayer ) 00253 return; 00254 00255 PC=XIIIGameInfo(Level.Game).MapInfo.XIIIController; 00256 00257 dist=VSize(Location-XIIIGameInfo(Level.Game).MapInfo.XIIIPawn.Location); 00258 00259 if (FD_bActive && (FD_StartAfterBreakingAnim==bBroken)) 00260 { 00261 FD_starttime=TimeStamp+FD_delay; 00262 00263 FD_VectorColor.X=FD_Color.R*3.9; 00264 FD_VectorColor.Y=FD_Color.G*3.9; 00265 FD_VectorColor.Z=FD_Color.B*3.9; 00266 00267 if (dist<FD_distance_start) 00268 { 00269 FD_bRunning=true; 00270 FD_localintensity=FD_intensity; 00271 } 00272 else 00273 { 00274 if (dist<FD_distance_end) 00275 { 00276 FD_localintensity=(FD_distance_end-dist)/(FD_distance_end-FD_distance_start)*FD_intensity; 00277 FD_bRunning=true; 00278 } 00279 else 00280 FD_bRunning=false; 00281 } 00282 } 00283 00284 if (SC_bActive && (SC_StartAfterBreakingAnim==bBroken)) 00285 { 00286 if (dist<SC_distance_start) 00287 { 00288 SC_bRunning=true; 00289 SC_localintensity=SC_intensity; 00290 } 00291 else 00292 { 00293 if (dist<SC_distance_end) 00294 { 00295 SC_localintensity=(SC_distance_end-dist)/(SC_distance_end-SC_distance_start)*SC_intensity; 00296 SC_bRunning=true; 00297 } 00298 else 00299 { 00300 SC_bRunning=false; 00301 } 00302 } 00303 if (SC_bRunning) 00304 { 00305 PC.ShakeView( SC_LifeTime*25.6, SC_localintensity*1600.000000, vect(0,0,30), SC_localintensity*120000, vect(0,0,0), 0) ; 00306 SC_bRunning=false; 00307 } 00308 00309 } 00310 00311 if (FD_bRunning) 00312 enable('Tick'); 00313 } 00314 00315 //_____________________________________________________________________________ 00316 simulated FUNCTION NonDestructiveParticles(vector pos) 00317 { 00318 LOCAL emitter e; 00319 00320 if ( StruckEmitter!=none ) 00321 e = SPAWN( StruckEmitter, self, ,pos ); 00322 } 00323 00324 FUNCTION MakeGroupReturn() 00325 { 00326 } 00327 00328 EVENT TakeDamage( int Damage, Pawn EventInstigator, vector HitLocation, vector Momentum, class<DamageType> DamageType) 00329 { 00330 LOCAL int i,stage; 00331 00332 if ( BreakType == BT_TriggerOnly ) 00333 return; 00334 00335 Instigator=EventInstigator; 00336 00337 switch (DamageType) 00338 { 00339 case class'DTBladeCut': 00340 if (!bVulnerableBladeCut) 00341 { 00342 NonDestructiveParticles(HitLocation); 00343 return; 00344 } 00345 break; 00346 case class'DTGrenaded': 00347 if (!bVulnerableGrenade) 00348 { 00349 NonDestructiveParticles(HitLocation); 00350 return; 00351 } 00352 break; 00353 case class'DTRocketed': 00354 if (!bVulnerableGrenade) 00355 { 00356 NonDestructiveParticles(HitLocation); 00357 return; 00358 } 00359 break; 00360 case class'DTGunned': 00361 if (!bVulnerableGun) 00362 { 00363 NonDestructiveParticles(HitLocation); 00364 return; 00365 } 00366 break; 00367 case class'DTShotgunned': 00368 if (!bVulnerableShotgun) 00369 { 00370 NonDestructiveParticles(HitLocation); 00371 return; 00372 } 00373 break; 00374 case class'DTSniped': 00375 if (!bVulnerableShotgun) 00376 { 00377 NonDestructiveParticles(HitLocation); 00378 return; 00379 } 00380 break; 00381 case class'DTStunned': 00382 if (!bVulnerableStunning) 00383 { 00384 NonDestructiveParticles(HitLocation); 00385 return; 00386 } 00387 break; 00388 case class'DTPierced': 00389 if (!bVulnerablePiercing) 00390 { 00391 NonDestructiveParticles(HitLocation); 00392 return; 00393 } 00394 break; 00395 case class'DTFisted': 00396 if (!bVulnerableToFist) 00397 { 00398 NonDestructiveParticles(HitLocation); 00399 return; 00400 } 00401 break; 00402 } 00403 00404 LastDamage = Damage; 00405 Health -= Damage; 00406 00407 if ( Health <= 0 ) 00408 { 00409 Walker=EventInstigator; 00410 // DebugLog("BreakableMover::TakeDamage Instigator : "$EventInstigator); 00411 particles_speed=Normal(HitLocation - Walker.Location); 00412 00413 if (IsA('Explosif') && ((DamageType == class'DTGrenaded')||(DamageType == class'DTRocketed'))) 00414 { 00415 SetTimer2(fRand()*0.8, false); 00416 } 00417 else 00418 { 00419 EffectiveTakeDamage(); 00420 } 00421 } 00422 else 00423 { 00424 stage=-1; 00425 for (i=0;i<BreakedMiddleStateSM.Length;++i) 00426 { 00427 if ( ( BreakedMiddleStateSM[i].DamagePercentage * InitialHealth < ( InitialHealth - Health ) * 100 ) && ( stage==-1 || BreakedMiddleStateSM[stage].DamagePercentage<BreakedMiddleStateSM[i].DamagePercentage) ) 00428 stage=i; 00429 } 00430 if ( stage!=-1 ) 00431 { 00432 if ( BreakedMiddleStateSM[stage].StateStaticMesh!=none ) 00433 StaticMesh = BreakedMiddleStateSM[stage].StateStaticMesh; 00434 if ( BreakedMiddleStateSM[stage].StateEvent!='' && BreakedMiddleStateSM[stage].StateEvent!='none' ) 00435 TriggerEvent(BreakedMiddleStateSM[stage].StateEvent,self,EventInstigator); 00436 if ( BreakedMiddleStateSM[stage].StateSound!=none ) 00437 PlaySound( BreakedMiddleStateSM[stage].StateSound ); 00438 } 00439 NonDestructiveParticles(HitLocation); 00440 } 00441 } 00442 00443 EVENT Timer2() 00444 { 00445 EffectiveTakeDamage(); 00446 } 00447 00448 SIMULATED FUNCTION bool IsBreakableByPlayer() 00449 { 00450 return ( BreakType != BT_TriggerOnly ); 00451 } 00452 00453 EVENT Bump( actor Other ) 00454 { 00455 } 00456 00457 EVENT SetInitialState() 00458 { 00459 // Dont't touch my state 00460 bScriptInitialized = true; 00461 InitialHealth = Health; 00462 breakingmesh=mesh; 00463 mesh=none; 00464 if ( Level.NetMode == NM_Client ) 00465 enable( 'Tick' ); 00466 else 00467 Disable('Tick'); 00468 Disable('Bump'); 00469 00470 if ( BreakType==BT_DamageOnly ) 00471 Disable('Trigger'); 00472 /* 00473 switch(BreakType) 00474 { 00475 case BT_TriggerOnly: 00476 // Disable('TakeDamage'); 00477 break; 00478 case BT_DamageOnly: 00479 Disable('Trigger'); 00480 break; 00481 }*/ 00482 } 00483 00484 EVENT PostBeginPlay() 00485 { 00486 Super.PostBeginPlay(); 00487 InitialStaticMesh=StaticMesh; 00488 bMemoColActors = bCollideActors; 00489 bMemoBlockActors = bBlockActors; 00490 bMemoBlockPlayers = bBlockPlayers; 00491 00492 if ( Level.bLonePlayer ) 00493 SetTimer( 0.06, false ); 00494 else 00495 LOG( self@"POSTBEGINPLAY called" ); 00496 } 00497 00498 EVENT Timer( ) 00499 { 00500 if ( (BreakPoint>=0) && (XIIIGameInfo(Level.Game).CheckPointNumber-2>=BreakPoint) ) 00501 FastBreak(); 00502 } 00503 00504 FUNCTION EffectiveTakeDamage() 00505 { 00506 if (((BreakType==BT_Always) || (BreakType==BT_DamageOnly)) && !bBroken) 00507 { 00508 // DebugLog("BreakableMover::EffectiveTakeDamage Calling Breaking"); 00509 Breaking(DelayDamage); 00510 } 00511 // else 00512 // LOG("ERROR : TAKEDAMAGE on a TriggerOnly BreakableMover !!"); 00513 } 00514 00515 EVENT Trigger(actor Other, pawn EventInstigator) 00516 { 00517 if (((BreakType==BreakType) || (BreakType==BT_TriggerOnly)) && !bBroken) 00518 Breaking(DelayTrigger); 00519 } 00520 00521 SIMULATED FUNCTION ComputeDispersal() 00522 { 00523 LOCAL Box MyBoundingBox; 00524 00525 if (bDisperseInBoundingBox) 00526 { 00527 MyBoundingBox=GetBoundingBox(); 00528 if ( MyBoundingBox.IsValid!=0) 00529 { 00530 Fragment_Center=0.5*(MyBoundingBox.Min+MyBoundingBox.Max); 00531 Fragments_Eparpillement=0.5*(MyBoundingBox.Max-MyBoundingBox.Min); 00532 return; 00533 } 00534 } 00535 Fragment_Center=Location; 00536 } 00537 00538 SIMULATED FUNCTION InitializeEmitters() 00539 { 00540 LOCAL Emitter emit, emit2; 00541 LOCAL MeshEmitter meshemit; 00542 00543 if ( Fragments_Type != None ) 00544 { 00545 if ( Walker!=none) 00546 emit=Spawn(Fragments_Type,self,,Fragment_Center+Fragments_Offset,Walker.Rotation); 00547 else 00548 emit=Spawn(Fragments_Type,self,,Fragment_Center+Fragments_Offset); 00549 00550 if (emit!=none) 00551 { 00552 emit.Emitters[0].StartVelocityRange.X.Min=-100+(3*LastDamage*particles_speed.X)*RelativeBlow+Fragments_Blow.X; 00553 emit.Emitters[0].StartVelocityRange.X.Max=100+(3*LastDamage*particles_speed.X)*RelativeBlow+Fragments_Blow.X; 00554 emit.Emitters[0].StartVelocityRange.Y.Min=-100+(3*LastDamage*particles_speed.Y)*RelativeBlow+Fragments_Blow.Y; 00555 emit.Emitters[0].StartVelocityRange.Y.Max=100+(3*LastDamage*particles_speed.Y)*RelativeBlow+Fragments_Blow.Y; 00556 emit.Emitters[0].StartVelocityRange.Z.Min=Fragments_Blow.Z; 00557 emit.Emitters[0].StartVelocityRange.Z.Max=Fragments_Blow.Z; 00558 00559 emit.Emitters[0].StartLocationRange.X.Min=-Fragments_Eparpillement.X; 00560 emit.Emitters[0].StartLocationRange.X.Max=Fragments_Eparpillement.X; 00561 emit.Emitters[0].StartLocationRange.Y.Min=-Fragments_Eparpillement.Y; 00562 emit.Emitters[0].StartLocationRange.Y.Max=Fragments_Eparpillement.Y; 00563 emit.Emitters[0].StartLocationRange.Z.Min=-Fragments_Eparpillement.Z; 00564 emit.Emitters[0].StartLocationRange.Z.Max=Fragments_Eparpillement.Z; 00565 00566 emit.Emitters[0].SetMaxParticles(Fragments_Number); 00567 00568 emit.Emitters[0].StartSizeRange.X.Max=Fragments_ScaleMax; 00569 emit.Emitters[0].StartSizeRange.X.Min=Fragments_ScaleMin; 00570 emit.Emitters[0].StartSizeRange.Y.Max=Fragments_ScaleMax; 00571 emit.Emitters[0].StartSizeRange.Y.Min=Fragments_ScaleMin; 00572 00573 emit.Emitters[0].Texture=FragmentTexture; 00574 emit.Emitters[0].TextureUSubdivisions=FragmentTextureUSubdivisions; 00575 emit.Emitters[0].TextureVSubdivisions=FragmentTextureVSubdivisions; 00576 emit.Emitters[0].DrawStyle=FragmentDrawStyle; 00577 00578 emit.Emitters[0].UseCollision=ParticlesUseCollision; 00579 00580 if ( Fragments_FadeOut ) 00581 { 00582 emit.Emitters[0].FadeOut=true; 00583 emit.Emitters[0].FadeOutStartTime=Fragments_FadeOutBegin; 00584 emit.Emitters[0].LifeTimeRange.Min=Fragments_FadeOutEnd; 00585 emit.Emitters[0].LifeTimeRange.Max=Fragments_FadeOutEnd; 00586 } 00587 } 00588 } 00589 00590 if ((Fragments3D.Type!=None) && (Fragments3D.StaticMesh!=none)) 00591 { 00592 if (Walker!=none) 00593 emit2=Spawn(Fragments3D.Type,self,,Fragment_Center+Fragments3D.Offset,Walker.Rotation); 00594 else 00595 emit2=Spawn(Fragments3D.Type,self,,Fragment_Center+Fragments3D.Offset); 00596 00597 if (emit2!=none) 00598 { 00599 emit2.Emitters[0].StartVelocityRange.X.Min=-100+(3*LastDamage*particles_speed.X)*RelativeBlow+Fragments3D.Blow.X; 00600 emit2.Emitters[0].StartVelocityRange.X.Max=100+(3*LastDamage*particles_speed.X)*RelativeBlow+Fragments3D.Blow.X; 00601 emit2.Emitters[0].StartVelocityRange.Y.Min=-100+(3*LastDamage*particles_speed.Y)*RelativeBlow+Fragments3D.Blow.Y; 00602 emit2.Emitters[0].StartVelocityRange.Y.Max=100+(3*LastDamage*particles_speed.Y)*RelativeBlow+Fragments3D.Blow.Y; 00603 emit2.Emitters[0].StartVelocityRange.Z.Max=Fragments3D.Blow.Z; 00604 emit2.Emitters[0].StartVelocityRange.Z.Min=Fragments3D.Blow.Z; 00605 00606 emit2.Emitters[0].StartLocationRange.X.Min=-Fragments3D.Eparpillement.X; 00607 emit2.Emitters[0].StartLocationRange.X.Max=Fragments3D.Eparpillement.X; 00608 emit2.Emitters[0].StartLocationRange.Y.Min=-Fragments3D.Eparpillement.Y; 00609 emit2.Emitters[0].StartLocationRange.Y.Max=Fragments3D.Eparpillement.Y; 00610 emit2.Emitters[0].StartLocationRange.Z.Min=-Fragments3D.Eparpillement.Z; 00611 emit2.Emitters[0].StartLocationRange.Z.Max=Fragments3D.Eparpillement.Z; 00612 00613 emit2.Emitters[0].SetMaxParticles(Fragments3D.Number); 00614 00615 emit2.Emitters[0].StartSizeRange.X.Max=Fragments3D.ScaleMax; 00616 emit2.Emitters[0].StartSizeRange.X.Min=Fragments3D.ScaleMin; 00617 emit2.Emitters[0].StartSizeRange.Y.Max=Fragments3D.ScaleMax; 00618 emit2.Emitters[0].StartSizeRange.Y.Min=Fragments3D.ScaleMin; 00619 emit2.Emitters[0].StartSizeRange.Z.Max=Fragments3D.ScaleMax; 00620 emit2.Emitters[0].StartSizeRange.Z.Min=Fragments3D.ScaleMin; 00621 00622 emit2.Emitters[0].UseCollision=ParticlesUseCollision; 00623 emit2.bIgnoreDynLight = Fragments3DIgnoreDynLight; 00624 00625 meshemit= MeshEmitter(emit2.Emitters[0]); 00626 00627 if (Fragments3D.FadeOut) 00628 { 00629 emit2.Emitters[0].FadeOut=true; 00630 emit2.Emitters[0].FadeOutStartTime=Fragments3D.FadeOutBegin; 00631 emit2.Emitters[0].LifeTimeRange.Min=Fragments3D.FadeOutEnd; 00632 emit2.Emitters[0].LifeTimeRange.Max=Fragments3D.FadeOutEnd; 00633 if (meshemit!=none) 00634 meshemit.UseMeshBlendMode=false; 00635 emit2.Emitters[0].DrawStyle=PTDS_AlphaBlend; 00636 } 00637 00638 if (meshemit!=none) 00639 meshemit.StaticMesh=Fragments3D.StaticMesh; 00640 } 00641 } 00642 00643 if (ExplosiveEmitter!=none) 00644 { 00645 if (ExplosiveEmitter!=class'XIIIExplosiveEmitter') 00646 { 00647 if ( Walker!=none ) 00648 emit=Spawn(ExplosiveEmitter,self,,Location+ExplosiveEmitterOffset,Walker.Rotation); 00649 else 00650 emit=Spawn(ExplosiveEmitter,self,,Location+ExplosiveEmitterOffset); 00651 } 00652 else 00653 { 00654 if ((Fire.Type!=FT_None) || (Smoke.Type!=ST_None) || (Onomatop.Type!=OT_None) 00655 || (FireTexture!=None) || (SmokeTexture!=None) || (OnomatopTexture!=None) 00656 ) 00657 { 00658 if ( Walker!=none ) 00659 emit=Spawn(ExplosiveEmitter,self,,Location+ExplosiveEmitterOffset,Walker.Rotation); 00660 else 00661 emit=Spawn(ExplosiveEmitter,self,,Location+ExplosiveEmitterOffset); 00662 } 00663 00664 if ( FireTexture!=None ) 00665 { 00666 emit.Emitters[0].Texture = FireTexture; 00667 emit.Emitters[0].StartLocationRange.X.Min=-Fire.Dispersal.X; 00668 emit.Emitters[0].StartLocationRange.X.Max=Fire.Dispersal.X; 00669 emit.Emitters[0].StartLocationRange.Y.Min=-Fire.Dispersal.Y; 00670 emit.Emitters[0].StartLocationRange.Y.Max=Fire.Dispersal.Y; 00671 emit.Emitters[0].StartLocationRange.Z.Min=-Fire.Dispersal.Z; 00672 emit.Emitters[0].StartLocationRange.Z.Max=Fire.Dispersal.Z; 00673 emit.Emitters[0].StartLocationOffset=Fire.Offset; 00674 00675 emit.Emitters[0].SetMaxParticles(Fire.Number); 00676 emit.Emitters[0].NoSynchroAnim=true; 00677 emit.Emitters[0].RespawnDeadParticles=False; 00678 emit.Emitters[0].UseRotationFrom=PTRS_Actor; 00679 00680 emit.Emitters[0].OnceTextureAnim=Fire.OneTextureAnimOnly; 00681 emit.Emitters[0].InitialParticlesPerSecond=10.0; 00682 emit.Emitters[0].AutomaticInitialSpawning=False; 00683 if (Fire.LifeTime==0.0) 00684 Fire.LifeTime=0.1; 00685 emit.Emitters[0].LifetimeRange.Min=Fire.LifeTime; 00686 emit.Emitters[0].LifetimeRange.Max=Fire.LifeTime; 00687 00688 if (Fire.FadeOut) 00689 { 00690 emit.Emitters[0].FadeOut=true; 00691 emit.Emitters[0].FadeOutStartTime=Fire.FadeOutBegin; 00692 } 00693 00694 emit.Emitters[0].DrawStyle=Fire.DrawStyle; 00695 00696 emit.Emitters[0].StartSizeRange.X.Max=Fire.ScaleMax; 00697 emit.Emitters[0].StartSizeRange.X.Min=Fire.ScaleMin; 00698 emit.Emitters[0].Disabled=false; 00699 } 00700 if ( SmokeTexture!=None ) 00701 { 00702 emit.Emitters[1].Texture = SmokeTexture; 00703 emit.Emitters[1].StartLocationRange.X.Min=-Smoke.Dispersal.X; 00704 emit.Emitters[1].StartLocationRange.X.Max=Smoke.Dispersal.X; 00705 emit.Emitters[1].StartLocationRange.Y.Min=-Smoke.Dispersal.Y; 00706 emit.Emitters[1].StartLocationRange.Y.Max=Smoke.Dispersal.Y; 00707 emit.Emitters[1].StartLocationRange.Z.Min=-Smoke.Dispersal.Z; 00708 emit.Emitters[1].StartLocationRange.Z.Max=Smoke.Dispersal.Z; 00709 emit.Emitters[1].StartLocationOffset=Smoke.Offset; 00710 00711 emit.Emitters[1].SetMaxParticles(Smoke.Number); 00712 emit.Emitters[1].NoSynchroAnim=true; 00713 emit.Emitters[1].RespawnDeadParticles=False; 00714 emit.Emitters[1].UseRotationFrom=PTRS_Actor; 00715 00716 emit.Emitters[1].OnceTextureAnim=Smoke.OneTextureAnimOnly; 00717 emit.Emitters[1].InitialParticlesPerSecond=10.0; 00718 emit.Emitters[1].AutomaticInitialSpawning=False; 00719 if (Smoke.LifeTime==0.0) 00720 Smoke.LifeTime=0.1; 00721 emit.Emitters[1].LifetimeRange.Min=Smoke.LifeTime; 00722 emit.Emitters[1].LifetimeRange.Max=Smoke.LifeTime; 00723 if (Smoke.FadeOut) 00724 { 00725 emit.Emitters[1].FadeOut=true; 00726 emit.Emitters[1].FadeOutStartTime=Smoke.FadeOutBegin; 00727 } 00728 00729 emit.Emitters[1].DrawStyle=Smoke.DrawStyle; 00730 00731 emit.Emitters[1].StartSizeRange.X.Max=Smoke.ScaleMax; 00732 emit.Emitters[1].StartSizeRange.X.Min=Smoke.ScaleMin; 00733 emit.Emitters[1].Disabled=false; 00734 } 00735 00736 if ((Onomatop.Type!=OT_None) || (OnomatopTexture!=None)) 00737 { 00738 if (OnomatopTexture!=None) 00739 emit.Emitters[2].Texture = OnomatopTexture; 00740 else 00741 emit.Emitters[2].Texture = OnomatopTextures[Onomatop.Type]; 00742 emit.Emitters[2].StartLocationRange.X.Min=-Onomatop.Dispersal.X; 00743 emit.Emitters[2].StartLocationRange.X.Max=Onomatop.Dispersal.X; 00744 emit.Emitters[2].StartLocationRange.Y.Min=-Onomatop.Dispersal.Y; 00745 emit.Emitters[2].StartLocationRange.Y.Max=Onomatop.Dispersal.Y; 00746 emit.Emitters[2].StartLocationRange.Z.Min=-Onomatop.Dispersal.Z; 00747 emit.Emitters[2].StartLocationRange.Z.Max=Onomatop.Dispersal.Z; 00748 emit.Emitters[2].StartLocationOffset=Onomatop.Offset; 00749 00750 emit.Emitters[2].SetMaxParticles(Onomatop.Number); 00751 if (Onomatop.LifeTime==0.0) 00752 Onomatop.LifeTime=0.1; 00753 emit.Emitters[2].LifetimeRange.Min=Onomatop.LifeTime; 00754 emit.Emitters[2].LifetimeRange.Max=Onomatop.LifeTime; 00755 00756 emit.Emitters[2].DrawStyle=Onomatop.DrawStyle; 00757 00758 emit.Emitters[2].StartSizeRange.X.Max=Onomatop.ScaleMax; 00759 emit.Emitters[2].StartSizeRange.X.Min=Onomatop.ScaleMin; 00760 emit.Emitters[2].Disabled=false; 00761 } 00762 } 00763 } 00764 } 00765 00766 SIMULATED FUNCTION Breaking( float fDelay ) 00767 { 00768 Disable('Bump'); 00769 00770 DelayToUse=fDelay; 00771 00772 if (Level.NetMode == NM_StandAlone) 00773 InitDazzleAndShake(false); 00774 00775 if ( ((DrawType==DT_StaticMesh) && (breakingmesh!=none)) || (DrawType==DT_Mesh) ) 00776 { 00777 GotoState('STA_BreakingAnim'); 00778 return; 00779 } 00780 00781 if (fDelay==0.0) 00782 Breaked(); 00783 else 00784 GotoState('STA_Breaking'); 00785 } 00786 00787 FUNCTION FastBreak() 00788 { 00789 LOG( "FASTBREAK"@self ); 00790 bBreaking = false; 00791 bBroken = true; 00792 bNoInteractionIcon = true; 00793 if(BreakedStaticMesh!=none) 00794 { 00795 StaticMesh=BreakedStaticMesh; 00796 } 00797 else 00798 Destroy(); 00799 } 00800 00801 simulated FUNCTION Breaked() 00802 { 00803 Local Pickup TheDecoPickupGenerated; // ELR the deco thing to pickup 00804 00805 ComputeDispersal(); 00806 if (event!='') 00807 TriggerEvent(event,self,none); 00808 00809 bBreaking = false; 00810 bBroken = true; 00811 bNoInteractionIcon = true; 00812 PlaySound( SoundWhenBroken, ExplosiveType ); 00813 if (Level.NetMode == NM_StandAlone) 00814 InitDazzleAndShake(true); 00815 InitializeEmitters(); 00816 00817 if ( DecoPickupGenerated != none ) 00818 { 00819 TheDecoPickupGenerated = Spawn(DecoPickupGenerated,,,Location); 00820 TheDecoPickupGenerated.InitDroppedPickupFor(none); 00821 } 00822 00823 switch (DrawType) 00824 { 00825 case DT_StaticMesh: 00826 if(BreakedStaticMesh!=none) 00827 { 00828 StaticMesh=BreakedStaticMesh; 00829 } 00830 else 00831 if (FD_bRunning || Level.NetMode != NM_StandAlone) 00832 { 00833 bHidden=true; 00834 RefreshDisplaying(); 00835 // SetCollision(false,false,false); 00836 bToBeDestroyed=true; 00837 } 00838 else 00839 Destroy(); 00840 break; 00841 default: 00842 if (FD_bRunning || Level.NetMode != NM_StandAlone) 00843 { 00844 bHidden=true; 00845 RefreshDisplaying(); 00846 // SetCollision(false,false,false); 00847 bToBeDestroyed=true; 00848 } 00849 else 00850 Destroy(); 00851 break; 00852 } 00853 00854 // if (CollisionWhenBreaked==false) 00855 SetCollision(CollisionWhenBreaked,CollisionWhenBreaked,CollisionWhenBreaked); 00856 00857 if ( Walker!=none && Walker.Base==self ) 00858 { 00859 Walker.DropToGround(); 00860 Walker.Acceleration = vect(0,0,0); 00861 } 00862 00863 GotoState(''); 00864 } 00865 00866 STATE STA_BreakingAnim 00867 { 00868 EVENT AnimEnd(int Channel) 00869 { 00870 SetDrawType(MemoDrawType); 00871 Breaked(); 00872 Mesh=none; 00873 } 00874 begin: 00875 Sleep(DelayToUse); 00876 Mesh=breakingmesh; 00877 StaticMesh=none; 00878 MemoDrawType=DrawType; 00879 SetDrawType(DT_Mesh); 00880 PlayAnim( BreakedMeshAnim ); 00881 stop; 00882 00883 } 00884 00885 STATE STA_Breaking 00886 { 00887 IGNORES Bump,TakeDamage; 00888 00889 EVENT BeginState() 00890 { 00891 bBreaking=true; 00892 TempsContact=0; 00893 } 00894 00895 EVENT Tick(float dt) 00896 { 00897 LOCAL ROTATOR r; 00898 00899 Global.Tick(dt); 00900 00901 if ( bMustShakeWhileDelay ) 00902 { 00903 r.Yaw=0; 00904 r.Pitch=FRand()*128-64; 00905 r.Roll=FRand()*128-64; 00906 SetRotation(r); 00907 } 00908 TempsContact+=dt; 00909 if (TempsContact>DelayToUse) 00910 Breaked(); 00911 } 00912 } 00913 00914 00915 00916 defaultproperties 00917 { 00918 ParticlesUseCollision=True 00919 bDisperseInBoundingBox=True 00920 bVulnerableBladeCut=True 00921 bVulnerableGrenade=True 00922 bVulnerableGun=True 00923 bVulnerableShotgun=True 00924 bVulnerableStunning=True 00925 bVulnerablePiercing=True 00926 bVulnerableToFist=True 00927 Fragments_FadeOut=True 00928 Fragments3DIgnoreDynLight=True 00929 RelativeBlow=1.000000 00930 Fragments_ScaleMin=10.000000 00931 Fragments_ScaleMax=10.000000 00932 Fragments_FadeOutBegin=3.000000 00933 Fragments_FadeOutEnd=5.000000 00934 SC_lifetime=3.000000 00935 SC_intensity=1.000000 00936 SC_distance_end=1024.000000 00937 FD_lifetime=0.400000 00938 FD_intensity=1.100000 00939 FD_distance_start=512.000000 00940 FD_distance_end=1024.000000 00941 FragmentTextureUSubdivisions=1 00942 FragmentTextureVSubdivisions=1 00943 Fragments_Number=50 00944 BreakPoint=-1 00945 Fragments_Eparpillement=(X=100.000000,Y=100.000000,Z=100.000000) 00946 FragmentTexture=Texture'XIIICine.effets.glass13' 00947 OnomatopTextures(1)=Texture'XIIICine.effets.Baommm' 00948 OnomatopTextures(3)=Texture'XIIICine.effets.crac' 00949 OnomatopTextures(4)=Texture'XIIICine.effets.cling' 00950 OnomatopTextures(5)=Texture'XIIICine.effets.Blam' 00951 FD_color=(B=255,G=255,R=255) 00952 Fragments_Type=Class'XIDCine.XIIIBreakingGlassEmitter' 00953 FragmentDrawStyle=PTDS_Translucent 00954 Fragments3D=(Number=10,ScaleMin=1.000000,ScaleMax=1.000000,FadeOutBegin=1.000000,FadeOutEnd=2.000000) 00955 Fire=(Number=1,ScaleMin=100.000000,ScaleMax=100.000000) 00956 Smoke=(Number=1,ScaleMin=100.000000,ScaleMax=100.000000) 00957 Onomatop=(Number=1,ScaleMin=100.000000,ScaleMax=100.000000) 00958 ExplosiveEmitter=Class'XIDCine.XIIIExplosiveEmitter' 00959 Health=10 00960 bBreakable=True 00961 bNoDelete=False 00962 bMovable=False 00963 Physics=PHYS_None 00964 InitialState="None" 00965 bPathColliding=True 00966 }