1 #using scripts\codescripts\struct;
3 #using scripts\shared\challenges_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\system_shared;
7 #insert scripts\shared\shared.gsh;
8 #insert scripts\shared\version.gsh;
9 #insert scripts\zm\_destructible.gsh;
11 #using scripts\zm\gametypes\_globallogic_player;
13 #using scripts\zm\_challenges;
15 #insert scripts\shared\clientfields.gsh;
17 #namespace destructible;
19 #using_animtree ( "mp_vehicles" );
21 #define EXPLODE_COMPLEX 300
22 #define CONCUSSIVE_DAMAGE_RADIUS_LG 280
23 #define CONCUSSIVE_DAMAGE_RADIUS_SM 220
24 #define ELECTRICAL_DAMAGE_RADIUS_LG 60
25 #define ELECTRICAL_DAMAGE_RADIUS_SM 210
26 #define INCENDIARY_DAMAGE_RADIUS_LG 250
27 #define INCENDIARY_DAMAGE_RADIUS_SM 200
29 #define CONCUSSIVE_EXPLOSION_DMG_MIN 50
30 #define CONCUSSIVE_EXPLOSION_DMG_MAX 300
31 #define ELECTRICAL_EXPLOSION_DMG_MIN 80
32 #define ELECTRICAL_EXPLOSION_DMG_MAX 350
33 #define INCENDIARY_EXPLOSION_DMG_MIN 95
34 #define INCENDIARY_EXPLOSION_DMG_MAX 380
40 level.destructible_callbacks = [];
41 destructibles = GetEntArray(
"destructible",
"targetname" );
46 if( destructibles.size <= 0 )
51 for ( i = 0; i < destructibles.size; i++ )
53 if ( GetSubStr( destructibles[i].destructibledef, 0, 4 ) ==
"veh_" )
65 level.explosion_manager = SpawnStruct();
66 level.explosion_manager.count = 0;
67 level.explosion_manager.a_explosions = [];
72 sExplosion =
Spawn(
"script_model", (0,0,0) );
73 ARRAY_ADD( level.explosion_manager.a_explosions, sExplosion );
80 foreach( explosion
in level.explosion_manager.a_explosions )
87 return level.explosion_manager.a_explosions[0];
93 sExplosion.in_use =
true;
94 sExplosion.origin = origin;
107 sExplosion.in_use =
false;
112 explosion_radius = 0;
113 if(IsSubStr(destructible_event,
"explode") && destructible_event !=
"explode")
115 tokens = StrTok(destructible_event,
"_");
116 explosion_radius = tokens[1];
118 if(explosion_radius ==
"sm")
120 explosion_radius = 150;
122 else if(explosion_radius ==
"lg")
124 explosion_radius = 450;
128 explosion_radius = Int(explosion_radius);
131 destructible_event =
"explode_complex";
137 if( IsSubStr( destructible_event,
"explosive" ) )
140 tokens = StrTok(destructible_event,
"_");
141 damage_type = tokens[2];
142 explosion_radius_type = tokens[3];
145 explosion_radius = 300;
148 switch ( damage_type )
151 if(explosion_radius_type ==
"large")
164 if(explosion_radius_type ==
"large")
175 if(explosion_radius_type ==
"large")
187 if ( IsSubStr( destructible_event,
"simple_timed_explosion" ) )
193 switch ( destructible_event )
195 case "destructible_car_explosion":
197 if ( isdefined( weapon ) )
199 self.destroyingWeapon = weapon;
203 case "destructible_car_fire":
205 if ( isdefined( weapon ) )
207 self.destroyingWeapon = weapon;
215 case "explode_complex":
219 case "destructible_explosive_incendiary_small":
220 case "destructible_explosive_incendiary_large":
222 if ( isdefined( weapon ) )
224 self.destroyingWeapon = weapon;
228 case "destructible_explosive_electrical_small":
229 case "destructible_explosive_electrical_large":
231 if ( isdefined( weapon ) )
233 self.destroyingWeapon = weapon;
237 case "destructible_explosive_concussive_small":
238 case "destructible_explosive_concussive_large":
240 if ( isdefined( weapon ) )
242 self.destroyingWeapon = weapon;
251 if ( isdefined( level.destructible_callbacks[ destructible_event ] ) )
253 self thread [[level.destructible_callbacks[ destructible_event ]]]( destructible_event, attacker );
260 self RadiusDamage(
self.origin + offset, 256, 300, 75, attacker,
"MOD_EXPLOSIVE", GetWeapon(
"explodable_barrel" ) );
262 if ( isdefined( attacker ) )
264 self DoDamage(
self.health + 10000,
self.origin + offset, attacker );
268 self DoDamage(
self.health + 10000,
self.origin + offset );
274 self endon(
"death" );
278 str = GetSubStr( destructible_event, 23 );
279 tokens = StrTok( str,
"_" );
281 for ( i = 0; i < tokens.size; i++ )
283 wait_times[ wait_times.size ] = Int( tokens[i] );
286 if ( wait_times.size <= 0 )
289 wait_times[ 1 ] = 10;
292 wait( RandomIntRange( wait_times[0], wait_times[1] ) );
300 if( isdefined( attacker ) )
302 self RadiusDamage(
self.origin + offset, max_radius, 300, 100, attacker );
306 self RadiusDamage(
self.origin + offset, max_radius, 300, 100 );
311 if( isdefined( attacker ) )
313 self DoDamage( 20000,
self.origin + offset, attacker );
317 self DoDamage( 20000,
self.origin + offset );
330 if ( !isdefined( physics_explosion ) )
332 physics_explosion =
true;
335 self notify(
"car_dead" );
336 self.car_dead =
true;
338 if ( isdefined( attacker ))
340 self RadiusDamage(
self.origin, 256, 300, 75, attacker,
"MOD_EXPLOSIVE", GetWeapon(
"destructible_car" ) );
344 self RadiusDamage(
self.origin, 256, 300, 75 );
348 level.globalCarsDestroyed++;
349 if ( isdefined ( attacker ) )
351 self DoDamage(
self.health + 10000,
self.origin + (0, 0, 1), attacker );
355 self DoDamage(
self.health + 10000,
self.origin + (0, 0, 1));
358 self MarkDestructibleDestroyed();
363 self endon(
"car_dead" );
364 self.car_dead =
false;
368 self waittill(
"destructible_base_piece_death", attacker );
370 if ( isdefined(
self ) )
378 self endon(
"destructible_base_piece_death" );
379 self endon(
"car_dead" );
380 self endon(
"death" );
384 self waittill(
"grenade_stuck", missile );
386 if ( !isdefined( missile ) || !isdefined( missile.model ) )
391 if ( missile.model ==
"t5_weapon_crossbow_bolt" || missile.model ==
"t6_wpn_grenade_semtex_projectile" || missile.model ==
"wpn_t7_c4_world" )
400 self endon(
"destructible_base_piece_death" );
401 self endon(
"car_dead" );
402 self endon(
"death" );
404 owner = GetMissileOwner( missile );
406 if ( isdefined( owner ) && missile.model ==
"wpn_t7_c4_world" )
408 owner endon(
"disconnect" );
409 owner endon(
"weapon_object_destroyed" );
410 missile endon(
"picked_up" );
415 missile waittill(
"explode" );
417 if ( isdefined( owner ) )
419 self DoDamage(
self.health + 10000,
self.origin + (0, 0, 1), owner );
423 self DoDamage(
self.health + 10000,
self.origin + (0, 0, 1) );
429 car endon(
"destructible_base_piece_death" );
430 car endon(
"car_dead" );
431 car endon(
"death" );
432 self endon(
"death" );
434 self waittill(
"hacked" );
436 self notify(
"picked_up" );
442 self endon(
"car_dead" );
444 self waittill(
"death", attacker );
445 self notify(
"destructible_base_piece_death", attacker );
450 self endon(
"death" );
452 wait( RandomIntRange( 7, 10 ) );
459 if( event ==
"broken" )
461 notify_type = param1;
468 self notify( event, notify_type, attacker );
470 else if( event ==
"breakafter" )
481 self notify(
"breakafter" );
482 self endon(
"breakafter" );
487 self dodamage(
damage,
self.origin, undefined, undefined );
492 if ( !IsVehicle(
self ) )
495 if ( isdefined( attacker ))
509 if( isdefined(
self.target ) )
511 dest_clip = GetEnt(
self.target,
"targetname" );
512 if( isDefined( dest_clip ) )
518 self MarkDestructibleDestroyed();
523 if ( !IsVehicle(
self ) )
526 if ( isdefined( attacker ))
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 ))
570 if( isdefined(
self.target ) )
572 dest_clip = GetEnt(
self.target,
"targetname" );
573 if( isDefined( dest_clip ) )
579 self MarkDestructibleDestroyed();