1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\fx_shared;
5 #using scripts\shared\sound_shared;
6 #using scripts\shared\system_shared;
8 #insert scripts\shared\shared.gsh;
16 if( SessionModeIsCampaignGame() )
25 script_exploders = [];
33 for( i = 0; i < smodels.size; i++ )
35 ents[ents.size] = smodels[i];
38 for( i = 0; i < ents.size; i++ )
40 if( isdefined( ents[i].script_prefab_exploder ) )
42 ents[i].script_exploder = ents[i].script_prefab_exploder;
49 for( i = 0; i < potentialExploders.size; i++ )
51 if( isdefined( potentialExploders[i].script_prefab_exploder ) )
53 potentialExploders[i].script_exploder = potentialExploders[i].script_prefab_exploder;
56 if( isdefined( potentialExploders[i].script_exploder ) )
58 script_exploders[script_exploders.size] = potentialExploders[i];
65 for( i = 0; i < potentialExploders.size; i++ )
67 if( isdefined( potentialExploders[i].script_prefab_exploder ) )
69 potentialExploders[i].script_exploder = potentialExploders[i].script_prefab_exploder;
72 if( isdefined( potentialExploders[i].script_exploder ) )
74 script_exploders[script_exploders.size] = potentialExploders[i];
79 for( i = 0; i < level.struct.size; i++ )
81 if( isdefined( level.struct[i].script_prefab_exploder ) )
83 level.struct[i].script_exploder = level.struct[i].script_prefab_exploder;
86 if( isdefined( level.struct[i].script_exploder ) )
88 script_exploders[script_exploders.size] = level.struct[i];
92 if( !isdefined( level.createFXent ) )
94 level.createFXent = [];
97 acceptableTargetnames = [];
98 acceptableTargetnames[
"exploderchunk visible"] =
true;
99 acceptableTargetnames[
"exploderchunk"] =
true;
100 acceptableTargetnames[
"exploder"] =
true;
104 for( i = 0; i < script_exploders.size; i++ )
118 ent.v[
"firefx"] =
exploder.script_firefx;
119 ent.v[
"firefxdelay"] =
exploder.script_firefxdelay;
120 ent.v[
"firefxsound"] =
exploder.script_firefxsound;
121 ent.v[
"firefxtimeout"] =
exploder.script_firefxtimeout;
122 ent.v[
"trailfx"] =
exploder.script_trailfx;
123 ent.v[
"trailfxtag"] =
exploder.script_trailfxtag;
124 ent.v[
"trailfxdelay"] =
exploder.script_trailfxdelay;
125 ent.v[
"trailfxsound"] =
exploder.script_trailfxsound;
126 ent.v[
"trailfxtimeout"] =
exploder.script_firefxtimeout;
127 ent.v[
"earthquake"] =
exploder.script_earthquake;
128 ent.v[
"rumble"] =
exploder.script_rumble;
129 ent.v[
"damage"] =
exploder.script_damage;
130 ent.v[
"damage_radius"] =
exploder.script_radius;
131 ent.v[
"repeat"] =
exploder.script_repeat;
132 ent.v[
"delay_min"] =
exploder.script_delay_min;
133 ent.v[
"delay_max"] =
exploder.script_delay_max;
136 ent.v[
"physics"] =
exploder.script_physics;
137 ent.v[
"type"] =
"exploder";
140 if( !isdefined(
exploder.script_fxid ) )
142 ent.v[
"fxid"] =
"No FX";
148 ent.v[
"exploder"] =
exploder.script_exploder;
151 if( !isdefined( ent.v[
"delay"] ) )
158 if( isdefined(
exploder.script_sound ) )
160 ent.v[
"soundalias"] =
exploder.script_sound;
162 else if( ent.v[
"fxid"] !=
"No FX" )
164 if( isdefined( level.scr_sound ) && isdefined( level.scr_sound[ent.v[
"fxid"]] ) )
166 ent.v[
"soundalias"] = level.scr_sound[ent.v[
"fxid"]];
172 if(isdefined(ent.v[
"target"]))
174 ent.needs_fixup = exploder_id;
185 temp_ent =
struct::get( ent.v[
"target"],
"targetname" );
186 if (isdefined(temp_ent) )
188 org = temp_ent.origin;
194 ent.v[
"angles"] = VectorToAngles( org - ent.v[
"origin"] );
201 if(isdefined(ent.v[
"angles"]))
222 if(fixup_set ==
false)
224 ent.needs_fixup = exploder_id;
229 if( isdefined(
exploder.targetname ) && isdefined( acceptableTargetnames[
exploder.targetname] ) )
231 ent.v[
"exploder_type"] =
exploder.targetname;
235 ent.v[
"exploder_type"] =
"normal";
239 level.createFXexploders = [];
241 for(i = 0; i < level.createFXent.size;i ++ )
243 ent = level.createFXent[i];
245 if(ent.v[
"type"] !=
"exploder")
248 ent.v[
"exploder_id"] = exploder::getexploderid( ent );
250 if(!isdefined(level.createFXexploders[ent.v[
"exploder"]]))
252 level.createFXexploders[ent.v[
"exploder"]] = [];
255 level.createFXexploders[ent.v[
"exploder"]][level.createFXexploders[ent.v[
"exploder"]].size] = ent;
267 if(!isdefined(level._exploder_ids))
269 level._exploder_ids = [];
270 level._exploder_id = 1;
273 if(!isdefined(level._exploder_ids[ent.v[
"exploder"]]))
275 level._exploder_ids[ent.v[
"exploder"]] = level._exploder_id;
276 level._exploder_id ++;
279 return level._exploder_ids[ent.v[
"exploder"]];
284 if(!isdefined(level._exploder_ids))
287 keys = GetArrayKeys( level._exploder_ids );
299 if( IsInt( exploder_id ) )
313 if(isdefined(level.createFXexploders) && isdefined(level.createFXexploders[num]))
315 for(i = 0; i < level.createFXexploders[num].size; i ++)
323 if(isdefined(level.lightningNormalFunc) && isdefined(level.lightningFlashFunc))
325 thread
fx::lightning(level.lightningNormalFunc, level.lightningFlashFunc);
333 if(!isdefined(
self.v[
"angles"]))
335 self.v[
"angles"] = (0,0,0);
339 if( isdefined(
self.v[
"firefx" ] ) )
342 if( isdefined(
self.v[
"fxid" ] ) &&
self.v[
"fxid" ] !=
"No FX" )
345 if( isdefined(
self.v[
"earthquake" ] ) )
354 if( isdefined( n_localclientnumber ) )
356 PlayRadiantExploder( n_localclientnumber,
string );
360 for ( localClientNum = 0; localClientNum < level.localPlayers.size; localClientNum++ )
362 PlayRadiantExploder( localClientNum,
string );
371 if( IsString( exploder_id ) )
373 if( isdefined( n_localclientnumber ) )
375 StopRadiantExploder( n_localclientnumber, exploder_id );
379 for ( localClientNum = 0; localClientNum < level.localPlayers.size; localClientNum++ )
381 StopRadiantExploder( localClientNum, exploder_id );
387 num = int( exploder_id );
389 if(isdefined(level.createFXexploders[exploder_id]))
391 for(i = 0; i < level.createFXexploders[exploder_id].size; i ++)
393 ent = level.createFXexploders[exploder_id][i];
395 if( isdefined(ent.loopFX) )
397 for(j = 0; j < ent.loopFX.size; j ++)
399 if( isdefined( ent.loopFX[j] ) )
401 StopFX( j, ent.loopFX[j] );
402 ent.loopFX[j] = undefined;
415 if( IsString( exploder_id ) )
417 for ( localClientNum = 0; localClientNum < level.localPlayers.size; localClientNum++ )
419 KillRadiantExploder( localClientNum, exploder_id );
423 assertmsg(
"unhandled exploder type, only radiant exploders are handled: " + exploder_id );
428 if( !isdefined(
self.v[
"delay" ] ) )
429 self.v[
"delay" ] = 0;
431 min_delay =
self.v[
"delay" ];
432 max_delay =
self.v[
"delay" ] + 0.001;
433 if( isdefined(
self.v[
"delay_min" ] ) )
434 min_delay =
self.v[
"delay_min" ];
436 if( isdefined(
self.v[
"delay_max" ] ) )
437 max_delay =
self.v[
"delay_max" ];
440 waitrealtime( randomfloatrange( min_delay, max_delay ) );
445 if( !isdefined(
self.v[
"soundalias" ] ) ||
self.v[
"soundalias" ] ==
"nil" )
454 eq = level.earthquake[
self.v[
"earthquake" ] ];
458 GetLocalPlayers()[0]
earthquake( eq[
"magnitude" ], eq[
"duration" ],
self.v[
"origin" ], eq[
"radius" ] );
464 if (isdefined(level.lightningExploder))
466 for(i = 0; i < level.lightningExploder.size; i ++)
468 if(level.lightningExploder[i] == num)
480 num = Int(exploderIndex);
482 if(isdefined(level.createFXexploders[num]))
484 for(i = 0; i < level.createFXexploders[num].size; i ++)
486 ent = level.createFXexploders[num][i];
488 if ( !isdefined( ent.looperFX ) )
493 for( clientNum = 0; clientNum < level.max_local_clients; clientNum++ )
495 if( localClientActive( clientNum ) )
497 if ( isdefined( ent.looperFX[clientNum] ) )
499 for( looperFXCount = 0; looperFXCount < ent.looperFX[clientNum].size; looperFXCount++ )
501 deletefx( clientNum, ent.looperFX[clientNum][looperFXCount] );
506 ent.looperFX[clientNum] = [];
516 num = Int(exploderIndex);
518 if(isdefined(level.createFXexploders[num]))
520 for(i = 0; i < level.createFXexploders[num].size; i ++)
522 ent = level.createFXexploders[num][i];
524 if ( !isdefined( ent.looperFX ) )
529 for( clientNum = 0; clientNum < level.max_local_clients; clientNum++ )
531 if( localClientActive( clientNum ) )
533 if ( !isdefined( ent.looperFX[clientNum] ) )
535 ent.looperFX[clientNum] = [];
537 ent.looperFX[clientNum][ent.looperFX[clientNum].size] = ent
playExploderFX( clientNum );
547 ent.v[
"delay" ] = 0;
548 ent.v[
"exploder_type" ] =
"normal";
554 if( isdefined(
self.v[
"repeat" ] ) )
556 for( i = 0;i <
self.v[
"repeat" ];i ++ )
558 players = getlocalplayers();
560 for(player = 0; player < players.size; player ++)
562 PlayFX( player, level._effect[
self.v[
"fxid" ] ],
self.v[
"origin" ],
self.v[
"forward" ],
self.v[
"up" ] );
572 players = getlocalplayers();
574 if ( isdefined(
self.loopFX ) )
576 for(i = 0; i <
self.loopFX.size; i ++)
578 StopFX( i,
self.loopFX[i] );
584 if(!isdefined(
self.loopFX))
589 if(!isdefined(level._effect[
self.v[
"fxid"]]))
591 assertmsg(
"*** Client : Effect " +
self.v[
"fxid"] +
" not precached in level_fx.csc.");
595 for(i = 0; i < players.size; i ++)
597 if( isdefined(
self.v[
"fxid"] ) )
599 self.loopFX[i] = PlayFX( i , level._effect[
self.v[
"fxid" ] ],
self.v[
"origin" ],
self.v[
"forward" ],
self.v[
"up" ] );
608 forward =
self.v[
"forward" ];
609 if( !isdefined( forward ) )
611 forward = anglestoforward(
self.v[
"angles"] );
614 if( !isdefined( up ) )
616 up = anglestoup(
self.v[
"angles"] );
621 firefxSound =
self.v[
"firefxsound" ];
622 origin =
self.v[
"origin" ];
623 firefx =
self.v[
"firefx" ];
624 ender =
self.v[
"ender" ];
625 if( !isdefined( ender ) )
626 ender =
"createfx_effectStopper";
629 if( isdefined(
self.v[
"firefxdelay" ] ) )
630 fireFxDelay =
self.v[
"firefxdelay" ];
634 players = GetLocalPlayers();
636 for(i = 0; i < players.size; i ++)
638 if( isdefined( firefxSound ) )
642 playfx( i, level._effect[ firefx ],
self.v[
"origin" ], forward, up, 0,
self.v[
"primlightfrac" ],
self.v[
"lightoriginoffs" ] );
649 return playfx( clientNum, level._effect[
self.v[
"fxid" ] ],
self.v[
"origin" ],
self.v[
"forward" ],
self.v[
"up" ], 0,
self.v[
"primlightfrac" ],
self.v[
"lightoriginoffs" ] );