mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-07 17:17:50 -05:00
511 lines
11 KiB
Plaintext
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);
|
|
} |