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

1714 lines
40 KiB
Plaintext

/*******************************************************************
* Decompiled By: Bog
* Decompiled File: maps\mp\_vehicles.gsc
* Game: Call of Duty: Black Ops 2
* Platform: PC
* Function Count: 86
* Decompile Time: 29 ms
* Timestamp: 10/28/2023 12:11:05 AM
*******************************************************************/
#include common_scripts/utility;
#include maps/mp/_utility;
#include maps/mp/gametypes/_hud_util;
#include maps/mp/gametypes/_spawning;
#include maps/mp/killstreaks/_qrdrone;
#include maps/mp/killstreaks/_rcbomb;
#using_animtree( "mp_vehicles" );
//Function Number: 1
init()
{
precachevehicle(get_default_vehicle_name());
setdvar("scr_veh_cleanupdebugprint","0");
setdvar("scr_veh_driversarehidden","1");
setdvar("scr_veh_driversareinvulnerable","1");
setdvar("scr_veh_alive_cleanuptimemin","119");
setdvar("scr_veh_alive_cleanuptimemax","120");
setdvar("scr_veh_dead_cleanuptimemin","20");
setdvar("scr_veh_dead_cleanuptimemax","30");
setdvar("scr_veh_cleanuptime_dmgfactor_min","0.33");
setdvar("scr_veh_cleanuptime_dmgfactor_max","1.0");
setdvar("scr_veh_cleanuptime_dmgfactor_deadtread","0.25");
setdvar("scr_veh_cleanuptime_dmgfraction_curve_begin","0.0");
setdvar("scr_veh_cleanuptime_dmgfraction_curve_end","1.0");
setdvar("scr_veh_cleanupabandoned","1");
setdvar("scr_veh_cleanupdrifted","1");
setdvar("scr_veh_cleanupmaxspeedmph","1");
setdvar("scr_veh_cleanupmindistancefeet","75");
setdvar("scr_veh_waittillstoppedandmindist_maxtime","10");
setdvar("scr_veh_waittillstoppedandmindist_maxtimeenabledistfeet","5");
setdvar("scr_veh_respawnafterhuskcleanup","1");
setdvar("scr_veh_respawntimemin","50");
setdvar("scr_veh_respawntimemax","90");
setdvar("scr_veh_respawnwait_maxiterations","30");
setdvar("scr_veh_respawnwait_iterationwaitseconds","1");
setdvar("scr_veh_disablerespawn","0");
setdvar("scr_veh_disableoverturndamage","0");
setdvar("scr_veh_explosion_spawnfx","1");
setdvar("scr_veh_explosion_doradiusdamage","1");
setdvar("scr_veh_explosion_radius","256");
setdvar("scr_veh_explosion_mindamage","20");
setdvar("scr_veh_explosion_maxdamage","200");
setdvar("scr_veh_ondeath_createhusk","1");
setdvar("scr_veh_ondeath_usevehicleashusk","1");
setdvar("scr_veh_explosion_husk_forcepointvariance","30");
setdvar("scr_veh_explosion_husk_horzvelocityvariance","25");
setdvar("scr_veh_explosion_husk_vertvelocitymin","100");
setdvar("scr_veh_explosion_husk_vertvelocitymax","200");
setdvar("scr_veh_explode_on_cleanup","1");
setdvar("scr_veh_disappear_maxwaittime","60");
setdvar("scr_veh_disappear_maxpreventdistancefeet","30");
setdvar("scr_veh_disappear_maxpreventvisibilityfeet","150");
setdvar("scr_veh_health_tank","1350");
level.vehicle_drivers_are_invulnerable = GetDvarInt(#"27D6F6C");
level.onejectoccupants = ::vehicle_eject_all_occupants;
level.vehiclehealths["panzer4_mp"] = 2600;
level.vehiclehealths["t34_mp"] = 2600;
setdvar("scr_veh_health_jeep","700");
if(init_vehicle_entities())
{
level.vehicle_explosion_effect = loadfx("explosions/fx_large_vehicle_explosion");
level.veh_husk_models = [];
if(IsDefined(level.use_new_veh_husks))
{
level.veh_husk_models["t34_mp"] = "veh_t34_destroyed_mp";
}
if(IsDefined(level.onaddvehiclehusks))
{
[[ level.onaddvehiclehusks ]]();
}
keys = getarraykeys(level.veh_husk_models);
for(i = 0;i < keys.size;i++)
{
precachemodel(level.veh_husk_models[keys[i]]);
}
precacherumble("tank_damage_light_mp");
precacherumble("tank_damage_heavy_mp");
level._effect["tanksquish"] = loadfx("maps/see2/fx_body_blood_splat");
}
chopper_player_get_on_gun = %int_huey_gunner_on;
chopper_door_open = %v_huey_door_open;
chopper_door_open_state = %v_huey_door_open_state;
chopper_door_closed_state = %v_huey_door_close_state;
killbrushes = getentarray("water_killbrush","targetname");
foreach(brush in killbrushes)
{
brush thread water_killbrush_think();
}
}
//Function Number: 2
water_killbrush_think()
{
for(;;)
{
self waittill("trigger",entity);
if(IsDefined(entity))
{
if(IsDefined(entity.targetname))
{
if(entity.targetname == "rcbomb")
{
entity maps/mp/killstreaks/_rcbomb::rcbomb_force_explode();
}
else if(entity.targetname == "talon" && !is_true(entity.dead))
{
entity notify("death");
}
}
if(IsDefined(entity.helitype) && entity.helitype == "qrdrone")
{
entity maps/mp/killstreaks/_qrdrone::qrdrone_force_destroy();
}
}
}
}
//Function Number: 3
initialize_vehicle_damage_effects_for_level()
{
k_mild_damage_index = 0;
k_moderate_damage_index = 1;
k_severe_damage_index = 2;
k_total_damage_index = 3;
k_mild_damage_health_percentage = 0.85;
k_moderate_damage_health_percentage = 0.55;
k_severe_damage_health_percentage = 0.35;
k_total_damage_health_percentage = 0;
level.k_mild_damage_health_percentage = k_mild_damage_health_percentage;
level.k_moderate_damage_health_percentage = k_moderate_damage_health_percentage;
level.k_severe_damage_health_percentage = k_severe_damage_health_percentage;
level.k_total_damage_health_percentage = k_total_damage_health_percentage;
level.vehicles_damage_states = [];
level.vehicles_husk_effects = [];
level.vehicles_damage_treadfx = [];
vehicle_name = get_default_vehicle_name();
level.vehicles_damage_states[vehicle_name] = [];
level.vehicles_damage_treadfx[vehicle_name] = [];
level.vehicles_damage_states[vehicle_name][k_mild_damage_index] = spawnstruct();
level.vehicles_damage_states[vehicle_name][k_mild_damage_index].health_percentage = k_mild_damage_health_percentage;
level.vehicles_damage_states[vehicle_name][k_mild_damage_index].effect_array = [];
level.vehicles_damage_states[vehicle_name][k_mild_damage_index].effect_array[0] = spawnstruct();
level.vehicles_damage_states[vehicle_name][k_mild_damage_index].effect_array[0].damage_effect = loadfx("vehicle/vfire/fx_tank_sherman_smldr");
level.vehicles_damage_states[vehicle_name][k_mild_damage_index].effect_array[0].sound_effect = undefined;
level.vehicles_damage_states[vehicle_name][k_mild_damage_index].effect_array[0].vehicle_tag = "tag_origin";
level.vehicles_damage_states[vehicle_name][k_moderate_damage_index] = spawnstruct();
level.vehicles_damage_states[vehicle_name][k_moderate_damage_index].health_percentage = k_moderate_damage_health_percentage;
level.vehicles_damage_states[vehicle_name][k_moderate_damage_index].effect_array = [];
level.vehicles_damage_states[vehicle_name][k_moderate_damage_index].effect_array[0] = spawnstruct();
level.vehicles_damage_states[vehicle_name][k_moderate_damage_index].effect_array[0].damage_effect = loadfx("vehicle/vfire/fx_vfire_med_12");
level.vehicles_damage_states[vehicle_name][k_moderate_damage_index].effect_array[0].sound_effect = undefined;
level.vehicles_damage_states[vehicle_name][k_moderate_damage_index].effect_array[0].vehicle_tag = "tag_origin";
level.vehicles_damage_states[vehicle_name][k_severe_damage_index] = spawnstruct();
level.vehicles_damage_states[vehicle_name][k_severe_damage_index].health_percentage = k_severe_damage_health_percentage;
level.vehicles_damage_states[vehicle_name][k_severe_damage_index].effect_array = [];
level.vehicles_damage_states[vehicle_name][k_severe_damage_index].effect_array[0] = spawnstruct();
level.vehicles_damage_states[vehicle_name][k_severe_damage_index].effect_array[0].damage_effect = loadfx("vehicle/vfire/fx_vfire_sherman");
level.vehicles_damage_states[vehicle_name][k_severe_damage_index].effect_array[0].sound_effect = undefined;
level.vehicles_damage_states[vehicle_name][k_severe_damage_index].effect_array[0].vehicle_tag = "tag_origin";
level.vehicles_damage_states[vehicle_name][k_total_damage_index] = spawnstruct();
level.vehicles_damage_states[vehicle_name][k_total_damage_index].health_percentage = k_total_damage_health_percentage;
level.vehicles_damage_states[vehicle_name][k_total_damage_index].effect_array = [];
level.vehicles_damage_states[vehicle_name][k_total_damage_index].effect_array[0] = spawnstruct();
level.vehicles_damage_states[vehicle_name][k_total_damage_index].effect_array[0].damage_effect = loadfx("explosions/fx_large_vehicle_explosion");
level.vehicles_damage_states[vehicle_name][k_total_damage_index].effect_array[0].sound_effect = "vehicle_explo";
level.vehicles_damage_states[vehicle_name][k_total_damage_index].effect_array[0].vehicle_tag = "tag_origin";
default_husk_effects = spawnstruct();
default_husk_effects.damage_effect = undefined;
default_husk_effects.sound_effect = undefined;
default_husk_effects.vehicle_tag = "tag_origin";
level.vehicles_husk_effects[vehicle_name] = default_husk_effects;
}
//Function Number: 4
get_vehicle_name(vehicle)
{
name = "";
if(IsDefined(vehicle))
{
if(IsDefined(vehicle.vehicletype))
{
name = vehicle.vehicletype;
}
}
return name;
}
//Function Number: 5
get_default_vehicle_name()
{
return "defaultvehicle_mp";
}
//Function Number: 6
get_vehicle_name_key_for_damage_states(vehicle)
{
vehicle_name = get_vehicle_name(vehicle);
if(!(IsDefined(level.vehicles_damage_states[vehicle_name])))
{
vehicle_name = get_default_vehicle_name();
}
return vehicle_name;
}
//Function Number: 7
get_vehicle_damage_state_index_from_health_percentage(vehicle)
{
damage_state_index = -1;
vehicle_name = get_vehicle_name_key_for_damage_states();
for(test_index = 0;test_index < level.vehicles_damage_states[vehicle_name].size;test_index++)
{
if(vehicle.current_health_percentage <= level.vehicles_damage_states[vehicle_name][test_index].health_percentage)
{
damage_state_index = test_index;
}
else
{
break;
}
}
return damage_state_index;
}
//Function Number: 8
update_damage_effects(vehicle,attacker)
{
if(vehicle.initial_state.health > 0)
{
previous_damage_state_index = get_vehicle_damage_state_index_from_health_percentage(vehicle);
vehicle.current_health_percentage = vehicle.health / vehicle.initial_state.health;
current_damage_state_index = get_vehicle_damage_state_index_from_health_percentage(vehicle);
if(previous_damage_state_index != current_damage_state_index)
{
vehicle notify("damage_state_changed");
if(previous_damage_state_index < 0)
{
start_damage_state_index = 0;
}
else
{
start_damage_state_index = previous_damage_state_index + 1;
}
play_damage_state_effects(vehicle,start_damage_state_index,current_damage_state_index);
if(vehicle.health <= 0)
{
vehicle kill_vehicle(attacker);
}
}
}
}
//Function Number: 9
play_damage_state_effects(vehicle,start_damage_state_index,end_damage_state_index)
{
vehicle_name = get_vehicle_name_key_for_damage_states(vehicle);
for(damage_state_index = start_damage_state_index;damage_state_index <= end_damage_state_index;damage_state_index++)
{
for(effect_index = 0;effect_index < level.vehicles_damage_states[vehicle_name][damage_state_index].effect_array.size;effect_index++)
{
effects = level.vehicles_damage_states[vehicle_name][damage_state_index].effect_array[effect_index];
vehicle thread play_vehicle_effects(effects);
}
}
}
//Function Number: 10
play_vehicle_effects(effects,isdamagedtread)
{
self endon("delete");
self endon("removed");
if(!IsDefined(isdamagedtread) || isdamagedtread == 0)
{
self endon("damage_state_changed");
}
if(IsDefined(effects.sound_effect))
{
self playsound(effects.sound_effect);
}
waittime = 0;
if(IsDefined(effects.damage_effect_loop_time))
{
waittime = effects.damage_effect_loop_time;
}
while(waittime > 0)
{
if(IsDefined(effects.damage_effect))
{
playfxontag(effects.damage_effect,self,effects.vehicle_tag);
}
wait(waittime);
}
}
//Function Number: 11
init_vehicle_entities()
{
vehicles = getentarray("script_vehicle","classname");
array_thread(vehicles,::init_original_vehicle);
if(IsDefined(vehicles))
{
return vehicles.size;
}
}
//Function Number: 12
precache_vehicles()
{
}
//Function Number: 13
register_vehicle()
{
if(!(IsDefined(level.vehicles_list)))
{
level.vehicles_list = [];
}
level.vehicles_list[level.vehicles_list.size] = self;
}
//Function Number: 14
manage_vehicles()
{
if(!(IsDefined(level.vehicles_list)))
{
return 1;
}
else
{
max_vehicles = getmaxvehicles();
newarray = [];
for(i = 0;i < level.vehicles_list.size;i++)
{
if(IsDefined(level.vehicles_list[i]))
{
newarray[newarray.size] = level.vehicles_list[i];
}
}
level.vehicles_list = newarray;
vehiclestodelete = level.vehicles_list.size + 1 - max_vehicles;
if(vehiclestodelete > 0)
{
newarray = [];
for(i = 0;i < level.vehicles_list.size;i++)
{
vehicle = level.vehicles_list[i];
if(vehiclestodelete > 0)
{
if(IsDefined(vehicle.is_husk) && !IsDefined(vehicle.permanentlyremoved))
{
deleted = vehicle husk_do_cleanup();
if(deleted)
{
vehiclestodelete--;
}
else
{
newarray[newarray.size] = vehicle;
}
}
}
}
level.vehicles_list = newarray;
}
return level.vehicles_list.size < max_vehicles;
}
}
//Function Number: 15
init_vehicle()
{
self register_vehicle();
if(IsDefined(level.vehiclehealths) && IsDefined(level.vehiclehealths[self.vehicletype]))
{
self.maxhealth = level.vehiclehealths[self.vehicletype];
}
else
{
self.maxhealth = GetDvarInt(#"20E17551");
/#
println("No health specified for vehicle type " + self.vehicletype + "! Using default...");
}
#/
self.health = self.maxhealth;
self vehicle_record_initial_values();
self init_vehicle_threads();
self maps/mp/gametypes/_spawning::create_vehicle_influencers();
}
//Function Number: 16
initialize_vehicle_damage_state_data()
{
if(self.initial_state.health > 0)
{
self.current_health_percentage = self.health / self.initial_state.health;
self.previous_health_percentage = self.health / self.initial_state.health;
}
else
{
self.current_health_percentage = 1;
self.previous_health_percentage = 1;
}
}
//Function Number: 17
init_original_vehicle()
{
self.original_vehicle = 1;
self init_vehicle();
}
//Function Number: 18
vehicle_wait_player_enter_t()
{
self endon("transmute");
self endon("death");
self endon("delete");
while(1)
{
self waittill("enter_vehicle",player);
player thread player_wait_exit_vehicle_t();
player player_update_vehicle_hud(1,self);
}
}
//Function Number: 19
player_wait_exit_vehicle_t()
{
self endon("disconnect");
self waittill("exit_vehicle",vehicle);
self player_update_vehicle_hud(0,vehicle);
}
//Function Number: 20
vehicle_wait_damage_t()
{
self endon("transmute");
self endon("death");
self endon("delete");
while(1)
{
self waittill("damage");
occupants = self getvehoccupants();
if(IsDefined(occupants))
{
for(i = 0;i < occupants.size;i++)
{
occupants[i] player_update_vehicle_hud(1,self);
}
}
}
}
//Function Number: 21
player_update_vehicle_hud(show,vehicle)
{
if(show)
{
if(!(IsDefined(self.vehiclehud)))
{
self.vehiclehud = createbar((1,1,1),64,16);
self.vehiclehud setpoint("CENTER","BOTTOM",0,-40);
self.vehiclehud.alpha = 0.75;
}
self.vehiclehud updatebar(vehicle.health / vehicle.initial_state.health);
}
else if(IsDefined(self.vehiclehud))
{
self.vehiclehud destroyelem();
}
if(GetDvar(#"480B1A1D") != "")
{
if(GetDvarInt(#"480B1A1D") != 0)
{
if(show)
{
if(!(IsDefined(self.vehiclehudhealthnumbers)))
{
self.vehiclehudhealthnumbers = createfontstring("default",2);
self.vehiclehudhealthnumbers setparent(self.vehiclehud);
self.vehiclehudhealthnumbers setpoint("LEFT","RIGHT",8,0);
self.vehiclehudhealthnumbers.alpha = 0.75;
self.vehiclehudhealthnumbers.hidewheninmenu = 0;
self.vehiclehudhealthnumbers.archived = 0;
}
self.vehiclehudhealthnumbers setvalue(vehicle.health);
}
else if(IsDefined(self.vehiclehudhealthnumbers))
{
self.vehiclehudhealthnumbers destroyelem();
}
}
}
}
//Function Number: 22
init_vehicle_threads()
{
self thread vehicle_fireweapon_t();
self thread vehicle_abandoned_by_drift_t();
self thread vehicle_abandoned_by_occupants_t();
self thread vehicle_damage_t();
self thread vehicle_ghost_entering_occupants_t();
self thread vehicle_recycle_spawner_t();
self thread vehicle_disconnect_paths();
if(IsDefined(level.enablevehiclehealthbar) && level.enablevehiclehealthbar)
{
self thread vehicle_wait_player_enter_t();
self thread vehicle_wait_damage_t();
}
self thread vehicle_wait_tread_damage();
self thread vehicle_overturn_eject_occupants();
if(GetDvarInt(#"63AF17E6") == 0)
{
self thread vehicle_overturn_suicide();
}
/#
self thread cleanup_debug_print_t();
self thread cleanup_debug_print_clearmsg_t();
#/
}
//Function Number: 23
build_template(type,model,typeoverride)
{
if(IsDefined(typeoverride))
{
type = typeoverride;
}
if(!(IsDefined(level.vehicle_death_fx)))
{
level.vehicle_death_fx = [];
}
if(!(IsDefined(level.vehicle_death_fx[type])))
{
level.vehicle_death_fx[type] = [];
}
level.vehicle_compassicon[type] = 0;
level.vehicle_team[type] = "axis";
level.vehicle_life[type] = 999;
level.vehicle_hasmainturret[model] = 0;
level.vehicle_mainturrets[model] = [];
level.vtmodel = model;
level.vttype = type;
}
//Function Number: 24
build_rumble(rumble,scale,duration,radius,basetime,randomaditionaltime)
{
if(!(IsDefined(level.vehicle_rumble)))
{
level.vehicle_rumble = [];
}
struct = build_quake(scale,duration,radius,basetime,randomaditionaltime);
/#
assert(IsDefined(rumble));
#/
precacherumble(rumble);
struct.rumble = rumble;
level.vehicle_rumble[level.vttype] = struct;
precacherumble("tank_damaged_rumble_mp");
}
//Function Number: 25
build_quake(scale,duration,radius,basetime,randomaditionaltime)
{
struct = spawnstruct();
struct.scale = scale;
struct.duration = duration;
struct.radius = radius;
if(IsDefined(basetime))
{
struct.basetime = basetime;
}
if(IsDefined(randomaditionaltime))
{
struct.randomaditionaltime = randomaditionaltime;
}
return struct;
}
//Function Number: 26
build_exhaust(effect)
{
level.vehicle_exhaust[level.vtmodel] = loadfx(effect);
}
//Function Number: 27
cleanup_debug_print_t()
{
self endon("transmute");
self endon("death");
self endon("delete");
/#
while(1)
{
if(IsDefined(self.debug_message) && GetDvarInt(#"AAD1512A") != 0)
{
print3d(150 + VectorScale((0,0,1)),self.origin,self.debug_message,(0,1,0),1,1);
}
wait(0.01);
}
#/
}
//Function Number: 28
cleanup_debug_print_clearmsg_t()
{
self endon("transmute");
self endon("death");
self endon("delete");
/#
while(1)
{
self waittill("enter_vehicle");
self.debug_message = undefined;
}
#/
}
//Function Number: 29
cleanup_debug_print(message)
{
/#
self.debug_message = message;
#/
}
//Function Number: 30
vehicle_abandoned_by_drift_t()
{
self endon("transmute");
self endon("death");
self endon("delete");
self wait_then_cleanup_vehicle("Drift Test","scr_veh_cleanupdrifted");
}
//Function Number: 31
vehicle_abandoned_by_occupants_timeout_t()
{
self endon("transmute");
self endon("death");
self endon("delete");
self wait_then_cleanup_vehicle("Abandon Test","scr_veh_cleanupabandoned");
}
//Function Number: 32
wait_then_cleanup_vehicle(test_name,cleanup_dvar_name)
{
self endon("enter_vehicle");
self wait_until_severely_damaged();
self do_alive_cleanup_wait(test_name);
self wait_for_vehicle_to_stop_outside_min_radius();
self cleanup(test_name,cleanup_dvar_name,::vehicle_recycle);
}
//Function Number: 33
wait_until_severely_damaged()
{
while(1)
{
health_percentage = self.health / self.initial_state.health;
if(IsDefined(level.k_severe_damage_health_percentage))
{
self cleanup_debug_print("Damage Test: Still healthy - (" + health_percentage + " >= " + level.k_severe_damage_health_percentage + ") and working treads");
}
else
{
self cleanup_debug_print("Damage Test: Still healthy and working treads");
}
self waittill("damage");
health_percentage = self.health / self.initial_state.health;
if(health_percentage < level.k_severe_damage_health_percentage)
{
break;
}
}
}
//Function Number: 34
get_random_cleanup_wait_time(state)
{
varnameprefix = "scr_veh_" + state + "_cleanuptime";
mintime = GetDvarFloat(varnameprefix + "min");
maxtime = GetDvarFloat(varnameprefix + "max");
if(maxtime > mintime)
{
return randomfloatrange(mintime,maxtime);
}
else
{
return maxtime;
}
}
//Function Number: 35
do_alive_cleanup_wait(test_name)
{
initialrandomwaitseconds = get_random_cleanup_wait_time("alive");
secondswaited = 0;
seconds_per_iteration = 1;
while(1)
{
curve_begin = GetDvarFloat(#"EF99099A");
curve_end = GetDvarFloat(#"7CCFC4CC");
factor_min = GetDvarFloat(#"D921389E");
factor_max = GetDvarFloat(#"D92137A0");
treaddeaddamagefactor = GetDvarFloat(#"ED378BD8");
damagefraction = 0;
if(self is_vehicle())
{
damagefraction = self.initial_state.health - self.health / self.initial_state.health;
}
else
{
damagefraction = 1;
}
damagefactor = 0;
if(damagefraction <= curve_begin)
{
damagefactor = factor_max;
}
else if(damagefraction >= curve_end)
{
damagefactor = factor_min;
}
else
{
dydx = factor_min - factor_max / curve_end - curve_begin;
damagefactor = factor_max + damagefraction - curve_begin * dydx;
}
totalsecstowait = initialrandomwaitseconds * damagefactor;
if(secondswaited >= totalsecstowait)
{
break;
}
self cleanup_debug_print(test_name + ": Waiting " + totalsecstowait - secondswaited + "s");
wait(seconds_per_iteration);
secondswaited = secondswaited + seconds_per_iteration;
}
}
//Function Number: 36
do_dead_cleanup_wait(test_name)
{
total_secs_to_wait = get_random_cleanup_wait_time("dead");
seconds_waited = 0;
seconds_per_iteration = 1;
while(seconds_waited < total_secs_to_wait)
{
self cleanup_debug_print(test_name + ": Waiting " + total_secs_to_wait - seconds_waited + "s");
wait(seconds_per_iteration);
seconds_waited = seconds_waited + seconds_per_iteration;
}
}
//Function Number: 37
cleanup(test_name,cleanup_dvar_name,cleanup_func)
{
keep_waiting = 1;
while(keep_waiting)
{
cleanupenabled = !IsDefined(cleanup_dvar_name) || GetDvarInt(cleanup_dvar_name) != 0;
if(cleanupenabled != 0)
{
self [[ cleanup_func ]]();
break;
}
keep_waiting = 0;
/#
self cleanup_debug_print("Cleanup disabled for " + test_name + " ( dvar = " + cleanup_dvar_name + " )");
wait(5);
keep_waiting = 1;
#/
}
}
//Function Number: 38
vehicle_wait_tread_damage()
{
self endon("death");
self endon("delete");
vehicle_name = get_vehicle_name(self);
while(1)
{
self waittill("broken",brokennotify);
if(brokennotify == "left_tread_destroyed")
{
if(IsDefined(level.vehicles_damage_treadfx[vehicle_name]) && IsDefined(level.vehicles_damage_treadfx[vehicle_name][0]))
{
self thread play_vehicle_effects(level.vehicles_damage_treadfx[vehicle_name][0],1);
}
continue;
}
if(brokennotify == "right_tread_destroyed")
{
if(IsDefined(level.vehicles_damage_treadfx[vehicle_name]) && IsDefined(level.vehicles_damage_treadfx[vehicle_name][1]))
{
self thread play_vehicle_effects(level.vehicles_damage_treadfx[vehicle_name][1],1);
}
}
}
}
//Function Number: 39
wait_for_vehicle_to_stop_outside_min_radius()
{
maxwaittime = GetDvarFloat(#"49F6FDB6");
iterationwaitseconds = 1;
maxwaittimeenabledistinches = 12 * GetDvarFloat(#"DC2C41B5");
initialorigin = self.initial_state.origin;
for(totalsecondswaited = 0;totalsecondswaited < maxwaittime;totalsecondswaited = totalsecondswaited + iterationwaitseconds)
{
speedmph = self getspeedmph();
cutoffmph = GetDvarFloat(#"69770092");
if(speedmph > cutoffmph)
{
cleanup_debug_print("(" + maxwaittime - totalsecondswaited + "s) Speed: " + speedmph + ">" + cutoffmph);
}
else
{
break;
}
wait(iterationwaitseconds);
}
}
//Function Number: 40
vehicle_abandoned_by_occupants_t()
{
self endon("transmute");
self endon("death");
self endon("delete");
while(1)
{
self waittill("exit_vehicle");
occupants = self getvehoccupants();
if(occupants.size == 0)
{
self play_start_stop_sound("tank_shutdown_sfx");
self thread vehicle_abandoned_by_occupants_timeout_t();
}
}
}
//Function Number: 41
play_start_stop_sound(sound_alias,modulation)
{
if(IsDefined(self.start_stop_sfxid))
{
}
self.start_stop_sfxid = self playsound(sound_alias);
}
//Function Number: 42
vehicle_ghost_entering_occupants_t()
{
self endon("transmute");
self endon("death");
self endon("delete");
while(1)
{
self waittill("enter_vehicle",player,seat);
isdriver = seat == 0;
if(GetDvarInt(#"8AB44691") != 0 && isdriver)
{
player ghost();
}
occupants = self getvehoccupants();
if(occupants.size == 1)
{
self play_start_stop_sound("tank_startup_sfx");
}
player thread player_change_seat_handler_t(self);
player thread player_leave_vehicle_cleanup_t(self);
}
}
//Function Number: 43
player_is_occupant_invulnerable(smeansofdeath)
{
if(self isremotecontrolling())
{
return 0;
}
if(!(IsDefined(level.vehicle_drivers_are_invulnerable)))
{
level.vehicle_drivers_are_invulnerable = 0;
}
invulnerable = level.vehicle_drivers_are_invulnerable && self player_is_driver();
return invulnerable;
}
//Function Number: 44
player_is_driver()
{
if(!(isalive(self)))
{
return 0;
}
vehicle = self getvehicleoccupied();
if(IsDefined(vehicle))
{
seat = vehicle getoccupantseat(self);
if(IsDefined(seat) && seat == 0)
{
return 1;
}
}
}
//Function Number: 45
player_change_seat_handler_t(vehicle)
{
self endon("disconnect");
self endon("exit_vehicle");
while(1)
{
self waittill("change_seat",vehicle,oldseat,newseat);
isdriver = newseat == 0;
if(isdriver)
{
if(GetDvarInt(#"8AB44691") != 0)
{
self ghost();
}
continue;
}
self show();
}
}
//Function Number: 46
player_leave_vehicle_cleanup_t(vehicle)
{
self endon("disconnect");
self waittill("exit_vehicle");
currentweapon = self getcurrentweapon();
if(self.lastweapon != currentweapon && self.lastweapon != "none")
{
self switchtoweapon(self.lastweapon);
}
self show();
}
//Function Number: 47
vehicle_is_tank()
{
return self.vehicletype == "sherman_mp" || self.vehicletype == "panzer4_mp" || self.vehicletype == "type97_mp" || self.vehicletype == "t34_mp";
}
//Function Number: 48
vehicle_record_initial_values()
{
if(!(IsDefined(self.initial_state)))
{
self.initial_state = spawnstruct();
}
if(IsDefined(self.origin))
{
self.initial_state.origin = self.origin;
}
if(IsDefined(self.angles))
{
self.initial_state.angles = self.angles;
}
if(IsDefined(self.health))
{
self.initial_state.health = self.health;
}
self initialize_vehicle_damage_state_data();
}
//Function Number: 49
vehicle_fireweapon_t()
{
self endon("transmute");
self endon("death");
self endon("delete");
for(;;)
{
self waittill("turret_fire",player);
if(IsDefined(player) && isalive(player) && player isinvehicle())
{
self fireweapon();
}
}
}
//Function Number: 50
vehicle_should_explode_on_cleanup()
{
return GetDvarInt(#"A0CE2AC2") != 0;
}
//Function Number: 51
vehicle_recycle()
{
self wait_for_unnoticeable_cleanup_opportunity();
self.recycling = 1;
self suicide();
}
//Function Number: 52
wait_for_vehicle_overturn()
{
self endon("transmute");
self endon("death");
self endon("delete");
worldup = AnglesToUp(VectorScale((0,1,0)));
overturned = 0;
while(!(overturned))
{
if(IsDefined(self.angles))
{
up = AnglesToUp(self.angles);
dot = vectordot(up,worldup);
if(dot <= 0)
{
overturned = 1;
}
}
if(!(overturned))
{
wait(1);
}
}
}
//Function Number: 53
vehicle_overturn_eject_occupants()
{
self endon("transmute");
self endon("death");
self endon("delete");
for(;;)
{
self waittill("veh_ejectoccupants");
if(IsDefined(level.onejectoccupants))
{
[[ level.onejectoccupants ]]();
}
wait(0.25);
}
}
//Function Number: 54
vehicle_eject_all_occupants()
{
occupants = self getvehoccupants();
if(IsDefined(occupants))
{
for(i = 0;i < occupants.size;i++)
{
if(IsDefined(occupants[i]))
{
occupants[i] unlink();
}
}
}
}
//Function Number: 55
vehicle_overturn_suicide()
{
self endon("transmute");
self endon("death");
self endon("delete");
self wait_for_vehicle_overturn();
seconds = randomfloatrange(5,7);
wait(seconds);
damageorigin = 25 + VectorScale((0,0,1));
self finishvehicleradiusdamage(self,self,32000,32000,32000,0,"MOD_EXPLOSIVE","defaultweapon_mp",damageorigin,400,-1,(0,0,1),0);
}
//Function Number: 56
suicide()
{
self kill_vehicle(self);
}
//Function Number: 57
kill_vehicle(attacker)
{
damageorigin = self.origin + (0,0,1);
self finishvehicleradiusdamage(attacker,attacker,32000,32000,10,0,"MOD_EXPLOSIVE","defaultweapon_mp",damageorigin,400,-1,(0,0,1),0);
}
//Function Number: 58
value_with_default(preferred_value,default_value)
{
if(IsDefined(preferred_value))
{
return preferred_value;
}
return default_value;
}
//Function Number: 59
vehicle_transmute(attacker)
{
deathorigin = self.origin;
deathangles = self.angles;
modelname = self vehgetmodel();
vehicle_name = get_vehicle_name_key_for_damage_states(self);
respawn_parameters = spawnstruct();
respawn_parameters.origin = self.initial_state.origin;
respawn_parameters.angles = self.initial_state.angles;
respawn_parameters.health = self.initial_state.health;
respawn_parameters.modelname = modelname;
respawn_parameters.targetname = value_with_default(self.targetname,"");
respawn_parameters.vehicletype = value_with_default(self.vehicletype,"");
respawn_parameters.destructibledef = self.destructibledef;
vehiclewasdestroyed = !IsDefined(self.recycling);
if(vehiclewasdestroyed || vehicle_should_explode_on_cleanup())
{
_spawn_explosion(deathorigin);
if(vehiclewasdestroyed && GetDvarInt(#"1A397FE8") != 0)
{
explosionradius = GetDvarInt(#"2CC23AB6");
explosionmindamage = GetDvarInt(#"3E054351");
explosionmaxdamage = GetDvarInt(#"DDBCFBD3");
self kill_vehicle(attacker);
self radiusdamage(deathorigin,explosionradius,explosionmaxdamage,explosionmindamage,attacker,"MOD_EXPLOSIVE",self.vehicletype + "_explosion_mp");
}
}
self notify("transmute");
respawn_vehicle_now = 1;
if(vehiclewasdestroyed && GetDvarInt(#"16B521FF") != 0)
{
if(GetDvarInt(#"A770BB2C") != 0)
{
husk = self;
self.is_husk = 1;
}
else
{
husk = _spawn_husk(deathorigin,deathangles,modelname);
}
husk _init_husk(vehicle_name,respawn_parameters);
if(GetDvarInt(#"A85448C3") != 0)
{
respawn_vehicle_now = 0;
}
}
if(!(IsDefined(self.is_husk)))
{
self remove_vehicle_from_world();
}
if(GetDvarInt(#"4AAF6102") != 0)
{
respawn_vehicle_now = 0;
}
if(respawn_vehicle_now)
{
respawn_vehicle(respawn_parameters);
}
}
//Function Number: 60
respawn_vehicle(respawn_parameters)
{
mintime = GetDvarInt(#"99A7881");
maxtime = GetDvarInt(#"99A7783");
seconds = randomfloatrange(mintime,maxtime);
wait(seconds);
wait_until_vehicle_position_wont_telefrag(respawn_parameters.origin);
if(!(manage_vehicles()))
{
/#
iprintln("Vehicle can\'t respawn because MAX_VEHICLES has been reached and none of the vehicles could be cleaned up.");
#/
}
else
{
if(IsDefined(respawn_parameters.destructibledef))
{
vehicle = spawnvehicle(respawn_parameters.modelname,respawn_parameters.targetname,respawn_parameters.vehicletype,respawn_parameters.origin,respawn_parameters.angles,respawn_parameters.destructibledef);
}
else
{
vehicle = spawnvehicle(respawn_parameters.modelname,respawn_parameters.targetname,respawn_parameters.vehicletype,respawn_parameters.origin,respawn_parameters.angles);
}
vehicle.vehicletype = respawn_parameters.vehicletype;
vehicle.destructibledef = respawn_parameters.destructibledef;
vehicle.health = respawn_parameters.health;
vehicle init_vehicle();
vehicle vehicle_telefrag_griefers_at_position(respawn_parameters.origin);
}
}
//Function Number: 61
remove_vehicle_from_world()
{
self notify("removed");
if(IsDefined(self.original_vehicle))
{
if(!(IsDefined(self.permanentlyremoved)))
{
self.permanentlyremoved = 1;
self thread hide_vehicle();
}
return 0;
}
else
{
self _delete_entity();
return 1;
}
}
//Function Number: 62
_delete_entity()
{
/#
#/
self delete();
}
//Function Number: 63
hide_vehicle()
{
under_the_world = (self.origin[0],self.origin[1],self.origin[2] - 10000);
self.origin = under_the_world;
wait(0.1);
self hide();
self notify("hidden_permanently");
}
//Function Number: 64
wait_for_unnoticeable_cleanup_opportunity()
{
maxpreventdistancefeet = GetDvarInt(#"EB58349F");
maxpreventvisibilityfeet = GetDvarInt(#"F3A863DC");
maxpreventdistanceinchessq = 144 * maxpreventdistancefeet * maxpreventdistancefeet;
maxpreventvisibilityinchessq = 144 * maxpreventvisibilityfeet * maxpreventvisibilityfeet;
maxsecondstowait = GetDvarFloat(#"33313A70");
iterationwaitseconds = 1;
for(secondswaited = 0;secondswaited < maxsecondstowait;secondswaited = secondswaited + iterationwaitseconds)
{
players_s = get_all_alive_players_s();
oktocleanup = 1;
for(j = 0;j < players_s.a.size && oktocleanup;j++)
{
player = players_s.a[j];
distinchessq = distancesquared(self.origin,player.origin);
if(distinchessq < maxpreventdistanceinchessq)
{
self cleanup_debug_print("(" + maxsecondstowait - secondswaited + "s) Player too close: " + distinchessq + "<" + maxpreventdistanceinchessq);
oktocleanup = 0;
}
else if(distinchessq < maxpreventvisibilityinchessq)
{
vehiclevisibilityfromplayer = self sightconetrace(player.origin,player,AnglesToForward(player.angles));
if(vehiclevisibilityfromplayer > 0)
{
self cleanup_debug_print("(" + maxsecondstowait - secondswaited + "s) Player can see");
oktocleanup = 0;
}
}
}
if(oktocleanup)
{
return;
}
wait(iterationwaitseconds);
}
}
//Function Number: 65
wait_until_vehicle_position_wont_telefrag(position)
{
maxiterations = GetDvarInt(#"C775AA8A");
iterationwaitseconds = GetDvarInt(#"B75883F5");
for(i = 0;i < maxiterations;i++)
{
if(!(vehicle_position_will_telefrag(position)))
{
return;
}
wait(iterationwaitseconds);
}
}
//Function Number: 66
vehicle_position_will_telefrag(position)
{
players_s = get_all_alive_players_s();
for(i = 0;i < players_s.a.size;i++)
{
if(players_s.a[i] player_vehicle_position_will_telefrag(position))
{
return 1;
}
}
return 0;
}
//Function Number: 67
vehicle_telefrag_griefers_at_position(position)
{
attacker = self;
inflictor = self;
players_s = get_all_alive_players_s();
for(i = 0;i < players_s.a.size;i++)
{
player = players_s.a[i];
if(player player_vehicle_position_will_telefrag(position))
{
player dodamage(20000,player.origin + (0,0,1),attacker,inflictor,"none");
}
}
}
//Function Number: 68
player_vehicle_position_will_telefrag(position)
{
distanceinches = 240;
mindistinchessq = distanceinches * distanceinches;
distinchessq = distancesquared(self.origin,position);
return distinchessq < mindistinchessq;
}
//Function Number: 69
vehicle_recycle_spawner_t()
{
self endon("delete");
self waittill("death",attacker);
if(IsDefined(self))
{
self vehicle_transmute(attacker);
}
}
//Function Number: 70
vehicle_play_explosion_sound()
{
self playsound("car_explo_large");
}
//Function Number: 71
vehicle_damage_t()
{
self endon("delete");
self endon("removed");
for(;;)
{
self waittill("damage",damage,attacker);
players = get_players();
for(i = 0;i < players.size;i++)
{
if(!(isalive(players[i])))
{
}
else
{
vehicle = players[i] getvehicleoccupied();
if(IsDefined(vehicle) && self == vehicle && players[i] player_is_driver())
{
if(damage > 0)
{
earthquake(damage / 400,1,players[i].origin,512,players[i]);
}
if(damage > 100)
{
/#
println("Playing heavy rumble.");
#/
players[i] playrumbleonentity("tank_damage_heavy_mp");
}
else if(damage > 10)
{
/#
println("Playing light rumble.");
#/
players[i] playrumbleonentity("tank_damage_light_mp");
}
}
}
}
update_damage_effects(self,attacker);
if(self.health <= 0)
{
return;
}
}
}
//Function Number: 72
_spawn_husk(origin,angles,modelname)
{
husk = spawn("script_model",origin);
husk.angles = angles;
husk setmodel(modelname);
husk.health = 1;
husk setcandamage(0);
return husk;
}
//Function Number: 73
is_vehicle()
{
return IsDefined(self.vehicletype);
}
//Function Number: 74
swap_to_husk_model()
{
if(IsDefined(self.vehicletype))
{
husk_model = level.veh_husk_models[self.vehicletype];
if(IsDefined(husk_model))
{
self setmodel(husk_model);
}
}
}
//Function Number: 75
_init_husk(vehicle_name,respawn_parameters)
{
self swap_to_husk_model();
effects = level.vehicles_husk_effects[vehicle_name];
self play_vehicle_effects(effects);
self.respawn_parameters = respawn_parameters;
forcepointvariance = GetDvarInt(#"F0E3D76A");
horzvelocityvariance = GetDvarInt(#"F7AEC6C3");
vertvelocitymin = GetDvarInt(#"B8C044DC");
vertvelocitymax = GetDvarInt(#"B8C043DE");
forcepointx = randomfloatrange(0 - forcepointvariance,forcepointvariance);
forcepointy = randomfloatrange(0 - forcepointvariance,forcepointvariance);
forcepoint = (forcepointx,forcepointy,0);
forcepoint = forcepoint + self.origin;
initialvelocityx = randomfloatrange(0 - horzvelocityvariance,horzvelocityvariance);
initialvelocityy = randomfloatrange(0 - horzvelocityvariance,horzvelocityvariance);
initialvelocityz = randomfloatrange(vertvelocitymin,vertvelocitymax);
initialvelocity = (initialvelocityx,initialvelocityy,initialvelocityz);
if(self is_vehicle())
{
self launchvehicle(initialvelocity,forcepoint);
}
else
{
self physicslaunch(forcepoint,initialvelocity);
}
self thread husk_cleanup_t();
/#
self thread cleanup_debug_print_t();
#/
}
//Function Number: 76
husk_cleanup_t()
{
self endon("death");
self endon("delete");
self endon("hidden_permanently");
respawn_parameters = self.respawn_parameters;
self do_dead_cleanup_wait("Husk Cleanup Test");
self wait_for_unnoticeable_cleanup_opportunity();
self thread final_husk_cleanup_t(respawn_parameters);
}
//Function Number: 77
final_husk_cleanup_t(respawn_parameters)
{
self husk_do_cleanup();
if(GetDvarInt(#"A85448C3") != 0)
{
if(GetDvarInt(#"4AAF6102") == 0)
{
respawn_vehicle(respawn_parameters);
}
}
}
//Function Number: 78
husk_do_cleanup()
{
self _spawn_explosion(self.origin);
if(self is_vehicle())
{
return self remove_vehicle_from_world();
}
else
{
self _delete_entity();
return 1;
}
}
//Function Number: 79
_spawn_explosion(origin)
{
if(GetDvarInt(#"34D27475") == 0)
{
return;
}
if(IsDefined(level.vehicle_explosion_effect))
{
forward = (0,0,1);
rot = randomfloat(360);
up = (cos(rot),sin(rot),0);
playfx(level.vehicle_explosion_effect,origin,forward,up);
}
thread _play_sound_in_space("vehicle_explo",origin);
}
//Function Number: 80
_play_sound_in_space(soundeffectname,origin)
{
org = spawn("script_origin",origin);
org.origin = origin;
org playsound(soundeffectname);
wait(10);
org delete();
}
//Function Number: 81
vehicle_get_occupant_team()
{
occupants = self getvehoccupants();
if(occupants.size != 0)
{
occupant = occupants[0];
if(isplayer(occupant))
{
return occupant.team;
}
}
return "free";
}
//Function Number: 82
vehicledeathwaiter()
{
self notify("vehicleDeathWaiter");
self endon("vehicleDeathWaiter");
self endon("disconnect");
while(1)
{
self waittill("vehicle_death",vehicle_died);
if(vehicle_died)
{
self.diedonvehicle = 1;
continue;
}
self.diedonturret = 1;
}
}
//Function Number: 83
turretdeathwaiter()
{
}
//Function Number: 84
vehicle_kill_disconnect_paths_forever()
{
self notify("kill_disconnect_paths_forever");
}
//Function Number: 85
vehicle_disconnect_paths()
{
self endon("death");
self endon("kill_disconnect_paths_forever");
if(IsDefined(self.script_disconnectpaths) && !self.script_disconnectpaths)
{
self.dontdisconnectpaths = 1;
return;
}
wait(randomfloat(1));
while(IsDefined(self))
{
if(self getspeed() < 1)
{
if(!(IsDefined(self.dontdisconnectpaths)))
{
self disconnectpaths();
}
self notify("speed_zero_path_disconnect");
while(self getspeed() < 1)
{
wait(0.05);
}
}
self connectpaths();
wait(1);
}
}
//Function Number: 86
follow_path(node)
{
self endon("death");
/#
assert(IsDefined(node),"vehicle_path() called without a path");
#/
self notify("newpath");
if(IsDefined(node))
{
self.attachedpath = node;
}
pathstart = self.attachedpath;
self.currentnode = self.attachedpath;
if(!(IsDefined(pathstart)))
{
return;
}
self attachpath(pathstart);
self startpath();
self endon("newpath");
nextpoint = pathstart;
while(IsDefined(nextpoint))
{
self waittill("reached_node",nextpoint);
self.currentnode = nextpoint;
nextpoint notify("trigger",self);
if(IsDefined(nextpoint.script_noteworthy))
{
self notify(nextpoint.script_noteworthy);
self notify("noteworthy",nextpoint.script_noteworthy,nextpoint);
}
waittillframeend;
}
}