IL-GSC/BO2/PC/MP/maps/mp/_destructible.gsc
2023-10-28 00:17:17 -04:00

511 lines
11 KiB
Plaintext

/*******************************************************************
* Decompiled By: Bog
* Decompiled File: maps\mp\_destructible.gsc
* Game: Call of Duty: Black Ops 2
* Platform: PC
* Function Count: 21
* Decompile Time: 5 ms
* Timestamp: 10/28/2023 12:10:54 AM
*******************************************************************/
#include common_scripts/utility;
#include maps/mp/_challenges;
#include maps/mp/_utility;
#include maps/mp/gametypes/_globallogic_player;
#using_animtree( "mp_vehicles" );
//Function Number: 1
init()
{
level.destructible_callbacks = [];
destructibles = getentarray("destructible","targetname");
if(destructibles.size <= 0)
{
return;
}
precacheitem("destructible_car_mp");
precacheitem("explodable_barrel_mp");
for(i = 0;i < destructibles.size;i++)
{
if(getsubstr(destructibles[i].destructibledef,0,4) == "veh_")
{
destructibles[i] thread destructible_car_death_think();
destructibles[i] thread destructible_car_grenade_stuck_think();
}
else if(issubstr(destructibles[i].destructibledef,"barrel"))
{
destructibles[i] thread destructible_barrel_death_think();
}
else if(issubstr(destructibles[i].destructibledef,"gaspump"))
{
destructibles[i] thread destructible_barrel_death_think();
}
else if(destructibles[i].destructibledef == "fxdest_upl_metal_tank_01")
{
destructibles[i] thread destructible_tank_grenade_stuck_think();
}
}
destructible_anims = [];
destructible_anims["car"] = %veh_car_destroy;
}
//Function Number: 2
destructible_event_callback(destructible_event,attacker,weapon)
{
explosion_radius = 0;
if(issubstr(destructible_event,"explode") && destructible_event != "explode")
{
tokens = strtok(destructible_event,"_");
explosion_radius = tokens[1];
if(explosion_radius == "sm")
{
explosion_radius = 150;
}
else if(explosion_radius == "lg")
{
explosion_radius = 450;
}
else
{
explosion_radius = int(explosion_radius);
}
destructible_event = "explode_complex";
}
if(issubstr(destructible_event,"simple_timed_explosion"))
{
self thread simple_timed_explosion(destructible_event,attacker);
return;
}
switch(destructible_event)
{
case "destructible_car_explosion":
self destructible_car_explosion(attacker);
self.destroyingweapon = weapon;
break;
IsDefined(weapon)
break;
case "destructible_car_fire":
self thread destructible_car_fire_think(attacker);
self.destroyingweapon = weapon;
break;
IsDefined(weapon)
break;
case "destructible_barrel_fire":
self thread destructible_barrel_fire_think(attacker);
break;
case "destructible_barrel_explosion":
self destructible_barrel_explosion(attacker);
break;
case "explode":
self thread simple_explosion(attacker);
break;
case "explode_complex":
self thread complex_explosion(attacker,explosion_radius);
break;
default:
break;
}
if(IsDefined(level.destructible_callbacks[destructible_event]))
{
self thread [[ level.destructible_callbacks[destructible_event] ]](destructible_event,attacker);
}
}
//Function Number: 3
simple_explosion(attacker)
{
if(is_true(self.exploded))
{
return;
}
self.exploded = 1;
offset = VectorScale((0,0,1));
self radiusdamage(self.origin + offset,256,300,75,attacker,"MOD_EXPLOSIVE","explodable_barrel_mp");
physicsexplosionsphere(self.origin,255,254,0.3,400,25);
if(IsDefined(attacker))
{
self dodamage(self.health + 10000,self.origin + offset,attacker);
}
else
{
self dodamage(self.health + 10000,self.origin + offset);
}
}
//Function Number: 4
simple_timed_explosion(destructible_event,attacker)
{
self endon("death");
wait_times = [];
str = getsubstr(destructible_event,23);
tokens = strtok(str,"_");
for(i = 0;i < tokens.size;i++)
{
wait_times[wait_times.size] = int(tokens[i]);
}
if(wait_times.size <= 0)
{
wait_times[0] = 5;
wait_times[1] = 10;
}
wait(randomintrange(wait_times[0],wait_times[1]));
simple_explosion(attacker);
}
//Function Number: 5
complex_explosion(attacker,max_radius)
{
offset = VectorScale((0,0,1));
if(IsDefined(attacker))
{
self radiusdamage(self.origin + offset,max_radius,300,100,attacker);
}
else
{
self radiusdamage(self.origin + offset,max_radius,300,100);
}
playrumbleonposition("grenade_rumble",self.origin);
earthquake(0.5,0.5,self.origin,max_radius);
physicsexplosionsphere(self.origin + offset,max_radius,max_radius - 1,0.3);
if(IsDefined(attacker))
{
self dodamage(20000,self.origin + offset,attacker);
}
else
{
self dodamage(20000,self.origin + offset);
}
}
//Function Number: 6
destructible_car_explosion(attacker,physics_explosion)
{
if(self.car_dead)
{
return;
}
if(!(IsDefined(physics_explosion)))
{
physics_explosion = 1;
}
players = get_players();
for(i = 0;i < players.size;i++)
{
body = players[i].body;
if(!(IsDefined(body)))
{
}
else if(distancesquared(body.origin,self.origin) > 9216)
{
}
else
{
if(body.origin[2] - self.origin[2] + 32 > 0)
{
body.origin = (body.origin[0],body.origin[1],body.origin[2] + 16);
}
body maps/mp/gametypes/_globallogic_player::start_explosive_ragdoll();
}
}
self notify("car_dead");
self.car_dead = 1;
self thread destructible_car_explosion_animate();
if(IsDefined(attacker))
{
self radiusdamage(self.origin,256,300,75,attacker,"MOD_EXPLOSIVE","destructible_car_mp");
}
else
{
self radiusdamage(self.origin,256,300,75);
}
playrumbleonposition("grenade_rumble",self.origin);
earthquake(0.5,0.5,self.origin,800);
if(physics_explosion)
{
physicsexplosionsphere(self.origin,255,254,0.3,400,25);
}
if(IsDefined(attacker))
{
attacker thread maps/mp/_challenges::destroyed_car();
}
level.globalcarsdestroyed++;
if(IsDefined(attacker))
{
self dodamage(self.health + 10000,self.origin + (0,0,1),attacker);
}
else
{
self dodamage(self.health + 10000,self.origin + (0,0,1));
}
self setclientflag(3);
}
//Function Number: 7
destructible_tank_grenade_stuck_think()
{
self endon("destructible_base_piece_death");
self endon("death");
for(;;)
{
self waittill("grenade_stuck",missile);
if(!IsDefined(missile) || !IsDefined(missile.model))
{
continue;
}
if(missile.model == "t5_weapon_crossbow_bolt" || missile.model == "t6_wpn_grenade_semtex_projectile" || missile.model == "t6_wpn_c4_world")
{
self thread destructible_tank_grenade_stuck_explode(missile);
}
}
}
//Function Number: 8
destructible_tank_grenade_stuck_explode(missile)
{
self endon("destructible_base_piece_death");
self endon("death");
owner = getmissileowner(missile);
if(IsDefined(owner) && missile.model == "t6_wpn_c4_world")
{
owner endon("disconnect");
owner endon("weapon_object_destroyed");
missile endon("picked_up");
missile thread destructible_tank_hacked_c4(self);
}
missile waittill("explode");
if(IsDefined(owner))
{
self dodamage(self.health + 10000,self.origin + (0,0,1),owner);
}
else
{
self dodamage(self.health + 10000,self.origin + (0,0,1));
}
}
//Function Number: 9
destructible_tank_hacked_c4(tank)
{
tank endon("destructible_base_piece_death");
tank endon("death");
self endon("death");
self waittill("hacked");
self notify("picked_up");
tank thread destructible_tank_grenade_stuck_explode(self);
}
//Function Number: 10
destructible_car_death_think()
{
self endon("car_dead");
self.car_dead = 0;
self thread destructible_car_death_notify();
self waittill("destructible_base_piece_death",attacker);
if(IsDefined(self))
{
self thread destructible_car_explosion(attacker,0);
}
}
//Function Number: 11
destructible_car_grenade_stuck_think()
{
self endon("destructible_base_piece_death");
self endon("car_dead");
self endon("death");
for(;;)
{
self waittill("grenade_stuck",missile);
if(!IsDefined(missile) || !IsDefined(missile.model))
{
continue;
}
if(missile.model == "t5_weapon_crossbow_bolt" || missile.model == "t6_wpn_grenade_semtex_projectile" || missile.model == "t6_wpn_c4_world")
{
self thread destructible_car_grenade_stuck_explode(missile);
}
}
}
//Function Number: 12
destructible_car_grenade_stuck_explode(missile)
{
self endon("destructible_base_piece_death");
self endon("car_dead");
self endon("death");
owner = getmissileowner(missile);
if(IsDefined(owner) && missile.model == "t6_wpn_c4_world")
{
owner endon("disconnect");
owner endon("weapon_object_destroyed");
missile endon("picked_up");
missile thread destructible_car_hacked_c4(self);
}
missile waittill("explode");
if(IsDefined(owner))
{
self dodamage(self.health + 10000,self.origin + (0,0,1),owner);
}
else
{
self dodamage(self.health + 10000,self.origin + (0,0,1));
}
}
//Function Number: 13
destructible_car_hacked_c4(car)
{
car endon("destructible_base_piece_death");
car endon("car_dead");
car endon("death");
self endon("death");
self waittill("hacked");
self notify("picked_up");
car thread destructible_car_grenade_stuck_explode(self);
}
//Function Number: 14
destructible_car_death_notify()
{
self endon("car_dead");
self waittill("death",attacker);
self notify("destructible_base_piece_death",attacker);
}
//Function Number: 15
destructible_car_explosion_animate()
{
self setclientflag(12);
end_origin = self.origin;
self.origin = (self.origin[0],self.origin[1],self.origin[2] + 16);
wait(0.3);
items = getdroppedweapons();
for(i = 0;i < items.size;i++)
{
if(distancesquared(end_origin,items[i].origin) < 16384)
{
if(items[i].origin[2] - end_origin[2] + 32 > 0)
{
items[i] delete();
}
}
}
self moveto(end_origin,0.3,0.15);
self clearclientflag(12);
}
//Function Number: 16
destructible_car_fire_think(attacker)
{
self endon("death");
wait(randomintrange(7,10));
self thread destructible_car_explosion(attacker);
}
//Function Number: 17
codecallback_destructibleevent(event,param1,param2,param3)
{
if(event == "broken")
{
notify_type = param1;
attacker = param2;
weapon = param3;
destructible_event_callback(notify_type,attacker,weapon);
self notify(event,notify_type,attacker);
}
else if(event == "breakafter")
{
piece = param1;
time = param2;
damage = param3;
self thread breakafter(time,damage,piece);
}
}
//Function Number: 18
breakafter(time,damage,piece)
{
self notify("breakafter");
self endon("breakafter");
wait(time);
self dodamage(damage,self.origin,undefined,undefined);
}
//Function Number: 19
destructible_barrel_death_think()
{
self endon("barrel_dead");
self waittill("death",attacker);
if(IsDefined(self))
{
self thread destructible_barrel_explosion(attacker,0);
}
}
//Function Number: 20
destructible_barrel_fire_think(attacker)
{
self endon("barrel_dead");
self endon("explode");
self endon("death");
wait(randomintrange(7,10));
self thread destructible_barrel_explosion(attacker);
}
//Function Number: 21
destructible_barrel_explosion(attacker,physics_explosion)
{
if(!(IsDefined(physics_explosion)))
{
physics_explosion = 1;
}
self notify("barrel_dead");
if(IsDefined(self.target))
{
dest_clip = getent(self.target,"targetname");
dest_clip delete();
}
self radiusdamage(self.origin,256,300,75,attacker,"MOD_EXPLOSIVE","explodable_barrel_mp");
playrumbleonposition("grenade_rumble",self.origin);
earthquake(0.5,0.5,self.origin,800);
if(physics_explosion)
{
physicsexplosionsphere(self.origin,255,254,0.3,400,25);
}
level.globalbarrelsdestroyed++;
self dodamage(self.health + 10000,self.origin + (0,0,1),attacker);
self setclientflag(3);
}