1 #using scripts\shared\challenges_shared;
2 #using scripts\shared\clientfield_shared;
3 #using scripts\shared\system_shared;
4 #using scripts\shared\util_shared;
6 #insert scripts\shared\shared.gsh;
7 #insert scripts\shared\version.gsh;
8 #insert scripts\mp\_destructible.gsh;
10 #using scripts\mp\gametypes\_battlechatter;
11 #using scripts\mp\gametypes\_globallogic_player;
13 #using scripts\mp\_challenges;
15 #insert scripts\shared\clientfields.gsh;
17 #namespace destructible;
21 #using_animtree ( "mp_vehicles" );
27 level.destructible_callbacks = [];
28 destructibles = GetEntArray(
"destructible",
"targetname" );
31 if( destructibles.size <= 0 )
38 for ( i = 0; i < destructibles.size; i++ )
40 if ( GetSubStr( destructibles[i].destructibledef, 0, 4 ) ==
"veh_" )
45 else if ( destructibles[i].destructibledef ==
"fxdest_upl_metal_tank_01" )
56 level.explosion_manager = SpawnStruct();
57 level.explosion_manager.count = 0;
58 level.explosion_manager.a_explosions = [];
63 sExplosion =
Spawn(
"script_model", (0,0,0) );
64 ARRAY_ADD( level.explosion_manager.a_explosions, sExplosion );
71 foreach( explosion
in level.explosion_manager.a_explosions )
78 return level.explosion_manager.a_explosions[0];
85 sExplosion.in_use =
true;
86 sExplosion.origin = origin;
99 sExplosion.in_use =
false;
104 explosion_radius = 0;
105 if(IsSubStr(destructible_event,
"explode") && destructible_event !=
"explode")
107 tokens = StrTok(destructible_event,
"_");
108 explosion_radius = tokens[1];
110 if(explosion_radius ==
"sm")
112 explosion_radius = 150;
114 else if(explosion_radius ==
"lg")
116 explosion_radius = 450;
120 explosion_radius = Int(explosion_radius);
123 destructible_event =
"explode_complex";
126 if( IsSubStr( destructible_event,
"explosive" ) )
128 tokens = StrTok(destructible_event,
"_");
129 explosion_radius_type = tokens[3];
131 if(explosion_radius_type ==
"small")
133 explosion_radius = 150;
135 else if(explosion_radius_type ==
"large")
137 explosion_radius = 450;
141 explosion_radius = 300;
145 if ( IsSubStr( destructible_event,
"simple_timed_explosion" ) )
151 switch ( destructible_event )
153 case "destructible_car_explosion":
155 if ( isdefined( weapon ) )
157 self.destroyingWeapon = weapon;
161 case "destructible_car_fire":
164 if ( isdefined( weapon ) )
166 self.destroyingWeapon = weapon;
174 case "explode_complex":
178 case "destructible_explosive_incendiary_small":
179 case "destructible_explosive_incendiary_large":
181 if ( isdefined( weapon ) )
183 self.destroyingWeapon = weapon;
187 case "destructible_explosive_electrical_small":
188 case "destructible_explosive_electrical_large":
190 if ( isdefined( weapon ) )
192 self.destroyingWeapon = weapon;
196 case "destructible_explosive_concussive_small":
197 case "destructible_explosive_concussive_large":
199 if ( isdefined( weapon ) )
201 self.destroyingWeapon = weapon;
210 if ( isdefined( level.destructible_callbacks[ destructible_event ] ) )
212 self thread [[level.destructible_callbacks[ destructible_event ]]]( destructible_event, attacker, weapon );
223 self.exploded =
true;
226 self RadiusDamage(
self.origin + offset, 256, 300, 75, attacker,
"MOD_EXPLOSIVE", GetWeapon(
"explodable_barrel" ) );
229 if ( isdefined( attacker ) )
231 self DoDamage(
self.health + 10000,
self.origin + offset, attacker );
235 self DoDamage(
self.health + 10000,
self.origin + offset );
241 self endon(
"death" );
245 str = GetSubStr( destructible_event, 23 );
246 tokens = StrTok( str,
"_" );
248 for ( i = 0; i < tokens.size; i++ )
250 wait_times[ wait_times.size ] = Int( tokens[i] );
253 if ( wait_times.size <= 0 )
256 wait_times[ 1 ] = 10;
259 wait( RandomIntRange( wait_times[0], wait_times[1] ) );
267 if( isdefined( attacker ) )
269 self RadiusDamage(
self.origin + offset, max_radius, 300, 100, attacker );
273 self RadiusDamage(
self.origin + offset, max_radius, 300, 100 );
277 if( isdefined( attacker ) )
279 self DoDamage( 20000,
self.origin + offset, attacker );
283 self DoDamage( 20000,
self.origin + offset );
290 if ( isdefined(
self.car_dead ) &&
self.car_dead )
296 if ( !isdefined( physics_explosion ) )
298 physics_explosion =
true;
301 self notify(
"car_dead" );
302 self.car_dead =
true;
304 if ( isdefined( attacker ))
306 self RadiusDamage(
self.origin, 256, 300, 75, attacker,
"MOD_EXPLOSIVE", GetWeapon(
"destructible_car" ) );
310 self RadiusDamage(
self.origin, 256, 300, 75 );
315 if ( isdefined ( attacker ) )
318 level.globalCarsDestroyed++;
319 if ( isdefined ( attacker ) )
321 self DoDamage(
self.health + 10000,
self.origin + (0, 0, 1), attacker );
325 self DoDamage(
self.health + 10000,
self.origin + (0, 0, 1));
328 self MarkDestructibleDestroyed();
333 self endon(
"destructible_base_piece_death" );
334 self endon(
"death" );
338 self waittill(
"grenade_stuck", missile );
340 if ( !IsDefined( missile ) || !IsDefined( missile.model ) )
345 if ( missile.model ==
"t5_weapon_crossbow_bolt" || missile.model ==
"t6_wpn_grenade_semtex_projectile" || missile.model ==
"wpn_t7_c4_world" )
354 self endon(
"destructible_base_piece_death" );
355 self endon(
"death" );
357 owner = GetMissileOwner( missile );
359 if ( IsDefined( owner ) && missile.model ==
"wpn_t7_c4_world" )
361 owner endon(
"disconnect" );
362 owner endon(
"weapon_object_destroyed" );
363 missile endon(
"picked_up" );
368 missile waittill(
"explode" );
370 if ( IsDefined( owner ) )
372 self DoDamage(
self.health + 10000,
self.origin + (0, 0, 1), owner );
376 self DoDamage(
self.health + 10000,
self.origin + (0, 0, 1) );
382 tank endon(
"destructible_base_piece_death" );
383 tank endon(
"death" );
384 self endon(
"death" );
386 self waittill(
"hacked" );
388 self notify(
"picked_up" );
394 self endon(
"car_dead" );
395 self.car_dead =
false;
399 self waittill(
"destructible_base_piece_death", attacker );
401 if ( isdefined(
self ) )
409 self endon(
"destructible_base_piece_death" );
410 self endon(
"car_dead" );
411 self endon(
"death" );
415 self waittill(
"grenade_stuck", missile );
417 if ( !isdefined( missile ) || !isdefined( missile.model ) )
422 if ( missile.model ==
"t5_weapon_crossbow_bolt" || missile.model ==
"t6_wpn_grenade_semtex_projectile" || missile.model ==
"wpn_t7_c4_world" )
431 self endon(
"destructible_base_piece_death" );
432 self endon(
"car_dead" );
433 self endon(
"death" );
435 owner = GetMissileOwner( missile );
437 if ( isdefined( owner ) && missile.model ==
"wpn_t7_c4_world" )
439 owner endon(
"disconnect" );
440 owner endon(
"weapon_object_destroyed" );
441 missile endon(
"picked_up" );
446 missile waittill(
"explode" );
448 if ( isdefined( owner ) )
450 self DoDamage(
self.health + 10000,
self.origin + (0, 0, 1), owner );
454 self DoDamage(
self.health + 10000,
self.origin + (0, 0, 1) );
460 car endon(
"destructible_base_piece_death" );
461 car endon(
"car_dead" );
462 car endon(
"death" );
463 self endon(
"death" );
465 self waittill(
"hacked" );
467 self notify(
"picked_up" );
473 self endon(
"car_dead" );
475 self waittill(
"death", attacker );
476 self notify(
"destructible_base_piece_death", attacker );
481 self endon(
"death" );
483 wait( RandomIntRange( 7, 10 ) );
490 if( event ==
"broken" )
492 notify_type = param1;
499 self notify( event, notify_type, attacker );
501 else if( event ==
"breakafter" )
512 self notify(
"breakafter" );
513 self endon(
"breakafter" );
518 self dodamage(
damage,
self.origin, undefined, undefined );
523 if ( !IsVehicle(
self ) )
526 if ( isdefined( attacker ))
528 self RadiusDamage(
self.origin + offset, explosion_radius, 256, 75, attacker,
"MOD_BURNED", GetWeapon(
"incendiary_fire" ) );
532 self RadiusDamage(
self.origin + offset, explosion_radius, 256, 75 );
540 if( isdefined(
self.target ) )
542 dest_clip = GetEnt(
self.target,
"targetname" );
543 if( isDefined( dest_clip ) )
549 self MarkDestructibleDestroyed();
554 if ( !IsVehicle(
self ) )
557 if ( isdefined( attacker ))
559 self RadiusDamage(
self.origin + offset, explosion_radius, 256, 75, attacker,
"MOD_ELECTROCUTED" );
563 self RadiusDamage(
self.origin + offset, explosion_radius, 256, 75 );
570 if( isdefined(
self.target ) )
572 dest_clip = GetEnt(
self.target,
"targetname" );
573 if( isDefined( dest_clip ) )
579 self MarkDestructibleDestroyed();
584 if ( !IsVehicle(
self ) )
587 if ( isdefined( attacker ))
589 self RadiusDamage(
self.origin + offset, explosion_radius, 256, 75, attacker,
"MOD_GRENADE" );
593 self RadiusDamage(
self.origin + offset, explosion_radius, 256, 75 );
600 if( isdefined(
self.target ) )
602 dest_clip = GetEnt(
self.target,
"targetname" );
603 if( isDefined( dest_clip ) )
609 self MarkDestructibleDestroyed();