1760 lines
48 KiB
Plaintext
1760 lines
48 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
main()
|
|
{
|
|
setup_sentry_globals();
|
|
setup_sentry_minigun();
|
|
setup_sentry_grenade_launcher();
|
|
|
|
if ( common_scripts\utility::issp_towerdefense() )
|
|
{
|
|
setup_sentry_minigun_weak();
|
|
setup_sentry_grenade_launcher_weak();
|
|
}
|
|
}
|
|
|
|
setup_sentry_globals()
|
|
{
|
|
if ( common_scripts\utility::issp() )
|
|
{
|
|
precachestring( &"SENTRY_MOVE" );
|
|
precachestring( &"SENTRY_PICKUP" );
|
|
precachestring( &"SENTRY_PLACE" );
|
|
precachestring( &"SENTRY_CANNOT_PLACE" );
|
|
}
|
|
|
|
precachemodel( "tag_laser" );
|
|
level.placed_sentry = [];
|
|
level.sentry_settings = [];
|
|
level.sentryturretsettings = [];
|
|
level.sentryturretsettings["easy"] = [];
|
|
level.sentryturretsettings["easy"]["convergencePitchTime"] = 2.5;
|
|
level.sentryturretsettings["easy"]["convergenceYawTime"] = 2.5;
|
|
level.sentryturretsettings["easy"]["suppressionTime"] = 3.0;
|
|
level.sentryturretsettings["easy"]["aiSpread"] = 2.0;
|
|
level.sentryturretsettings["easy"]["playerSpread"] = 0.5;
|
|
level._effect["sentry_turret_overheat_smoke_sp"] = loadfx( "vfx/gameplay/mp/killstreaks/vfx_sg_overheat_smoke" );
|
|
level._effect["sentry_turret_explode"] = loadfx( "vfx/gameplay/mp/killstreaks/vfx_sentry_gun_explosion" );
|
|
level._effect["sentry_turret_explode_smoke"] = loadfx( "vfx/gameplay/mp/killstreaks/vfx_sg_damage_blacksmoke" );
|
|
}
|
|
|
|
setup_sentry_minigun()
|
|
{
|
|
precachemodel( "sentry_minigun" );
|
|
precachemodel( "sentry_minigun_obj" );
|
|
precachemodel( "sentry_minigun_obj_red" );
|
|
precachemodel( "sentry_minigun_folded_obj" );
|
|
precachemodel( "sentry_minigun_destroyed" );
|
|
|
|
if ( common_scripts\utility::issp() && !is_specialop() )
|
|
{
|
|
precacheturret( "sentry_minigun" );
|
|
precacheturret( "sentry_minigun_enemy" );
|
|
}
|
|
else if ( is_specialop() )
|
|
precacheturret( "sentry_minigun_so" );
|
|
else
|
|
precacheturret( "sentry_minigun_mp" );
|
|
|
|
level.sentry_settings["sentry_minigun"] = spawnstruct();
|
|
sentry_minigun_default_settings( "sentry_minigun" );
|
|
init_placed_sentries( "sentry_minigun" );
|
|
common_scripts\utility::array_thread( getentarray( "script_model_pickup_sentry_minigun", "classname" ), ::sentry_pickup_init, "sentry_minigun" );
|
|
}
|
|
|
|
setup_sentry_minigun_weak()
|
|
{
|
|
precachemodel( "sentry_minigun_weak" );
|
|
precachemodel( "sentry_minigun_weak_destroyed" );
|
|
precachemodel( "sentry_minigun_weak_obj" );
|
|
precachemodel( "sentry_minigun_weak_obj_red" );
|
|
precachemodel( "sentry_minigun_weak_folded_obj" );
|
|
precacheturret( "sentry_minigun_weak" );
|
|
level.sentry_settings["sentry_minigun_weak"] = spawnstruct();
|
|
sentry_minigun_weak_settings( "sentry_minigun_weak" );
|
|
init_placed_sentries( "sentry_minigun_weak" );
|
|
common_scripts\utility::array_thread( getentarray( "script_model_pickup_sentry_minigun_weak", "classname" ), ::sentry_pickup_init, "sentry_minigun_weak" );
|
|
}
|
|
|
|
setup_sentry_grenade_launcher()
|
|
{
|
|
precachemodel( "sentry_grenade_launcher_upgrade" );
|
|
precachemodel( "sentry_grenade_launcher_upgrade_destroyed" );
|
|
precachemodel( "sentry_grenade_launcher_upgrade_obj" );
|
|
precachemodel( "sentry_grenade_launcher_upgrade_obj_red" );
|
|
precachemodel( "sentry_grenade_launcher_upgrade_folded_obj" );
|
|
|
|
if ( common_scripts\utility::issp() && !is_specialop() )
|
|
precacheturret( "sentry_gun" );
|
|
else if ( is_specialop() )
|
|
precacheturret( "sentry_gun_so" );
|
|
else
|
|
precacheturret( "sentry_gun_mp" );
|
|
|
|
level.sentry_settings["sentry_gun"] = spawnstruct();
|
|
sentry_gun_default_settings( "sentry_gun" );
|
|
init_placed_sentries( "sentry_gun" );
|
|
common_scripts\utility::array_thread( getentarray( "script_model_pickup_sentry_gun", "classname" ), ::sentry_pickup_init, "sentry_gun" );
|
|
}
|
|
|
|
setup_sentry_grenade_launcher_weak()
|
|
{
|
|
precachemodel( "sentry_grenade_launcher" );
|
|
precachemodel( "sentry_grenade_launcher_destroyed" );
|
|
precachemodel( "sentry_grenade_launcher_obj" );
|
|
precachemodel( "sentry_grenade_launcher_obj_red" );
|
|
precachemodel( "sentry_grenade_launcher_folded_obj" );
|
|
precacheturret( "sentry_gun_weak" );
|
|
level.sentry_settings["sentry_gun_weak"] = spawnstruct();
|
|
sentry_gun_weak_settings( "sentry_gun_weak" );
|
|
init_placed_sentries( "sentry_gun_weak" );
|
|
common_scripts\utility::array_thread( getentarray( "script_model_pickup_sentry_gun_weak", "classname" ), ::sentry_pickup_init, "sentry_gun_weak" );
|
|
}
|
|
|
|
setup_sentry_smg()
|
|
{
|
|
precachemodel( "weapon_sentry_smg" );
|
|
precachemodel( "weapon_sentry_smg_obj" );
|
|
precachemodel( "weapon_sentry_smg_obj_red" );
|
|
precachemodel( "weapon_sentry_smg_animated" );
|
|
precachemodel( "weapon_sentry_smg_animated_obj" );
|
|
precachemodel( "weapon_sentry_smg_destroyed" );
|
|
precacheturret( "sentry_smg" );
|
|
level.sentry_settings["sentry_smg"] = spawnstruct();
|
|
sentry_smg_default_settings( "sentry_smg" );
|
|
init_placed_sentries( "sentry_smg" );
|
|
common_scripts\utility::array_thread( getentarray( "script_model_pickup_sentry_smg", "classname" ), ::sentry_pickup_init, "sentry_smg" );
|
|
}
|
|
|
|
init_placed_sentries( var_0 )
|
|
{
|
|
var_1 = getentarray( var_0, "targetname" );
|
|
|
|
foreach ( var_3 in var_1 )
|
|
var_3 sentry_init( undefined, var_0 );
|
|
}
|
|
|
|
sentry_gun_default_settings( var_0 )
|
|
{
|
|
level.sentry_settings[var_0].ammo = 100;
|
|
level.sentry_settings[var_0].use_laser = 1;
|
|
level.sentry_settings[var_0].burst_shots_min = 1;
|
|
level.sentry_settings[var_0].burst_shots_max = 2;
|
|
level.sentry_settings[var_0].burst_pause_min = 1;
|
|
level.sentry_settings[var_0].burst_pause_max = 1.5;
|
|
level.sentry_settings[var_0].fire_only_on_target = 1;
|
|
level.sentry_settings[var_0].model = "sentry_grenade_launcher_upgrade";
|
|
level.sentry_settings[var_0].destroyedmodel = "sentry_grenade_launcher_upgrade_destroyed";
|
|
level.sentry_settings[var_0].pickupmodel = "sentry_grenade_launcher_upgrade_folded";
|
|
level.sentry_settings[var_0].pickupmodelobj = "sentry_grenade_launcher_upgrade_folded_obj";
|
|
level.sentry_settings[var_0].placementmodel = "sentry_grenade_launcher_upgrade_obj";
|
|
level.sentry_settings[var_0].placementmodelfail = "sentry_grenade_launcher_upgrade_obj_red";
|
|
level.sentry_settings[var_0].health = 350;
|
|
|
|
if ( common_scripts\utility::issp() && !is_specialop() )
|
|
{
|
|
level.sentry_settings[var_0].damage_smoke_time = 15;
|
|
level.sentry_settings[var_0].weaponinfo = "sentry_gun";
|
|
level.sentry_settings[var_0].targetname = "sentry_gun";
|
|
}
|
|
else if ( is_specialop() )
|
|
{
|
|
level.sentry_settings[var_0].ammo = 50;
|
|
level.sentry_settings[var_0].damage_smoke_time = 8;
|
|
level.sentry_settings[var_0].weaponinfo = "sentry_gun_so";
|
|
level.sentry_settings[var_0].targetname = "sentry_gun_so";
|
|
level.sentry_settings[var_0].health = 1200;
|
|
}
|
|
else
|
|
{
|
|
level.sentry_settings[var_0].damage_smoke_time = 5;
|
|
level.sentry_settings[var_0].weaponinfo = "sentry_gun_mp";
|
|
level.sentry_settings[var_0].targetname = "sentry_gun_mp";
|
|
}
|
|
}
|
|
|
|
sentry_gun_weak_settings( var_0 )
|
|
{
|
|
level.sentry_settings[var_0].use_laser = 0;
|
|
level.sentry_settings[var_0].burst_shots_min = 1;
|
|
level.sentry_settings[var_0].burst_shots_max = 2;
|
|
level.sentry_settings[var_0].burst_pause_min = 1;
|
|
level.sentry_settings[var_0].burst_pause_max = 1.5;
|
|
level.sentry_settings[var_0].fire_only_on_target = 1;
|
|
level.sentry_settings[var_0].model = "sentry_grenade_launcher";
|
|
level.sentry_settings[var_0].destroyedmodel = "sentry_grenade_launcher_destroyed";
|
|
level.sentry_settings[var_0].pickupmodel = "sentry_grenade_launcher_folded";
|
|
level.sentry_settings[var_0].pickupmodelobj = "sentry_grenade_launcher_folded_obj";
|
|
level.sentry_settings[var_0].placementmodel = "sentry_grenade_launcher_obj";
|
|
level.sentry_settings[var_0].placementmodelfail = "sentry_grenade_launcher_obj_red";
|
|
level.sentry_settings[var_0].health = int( 175.0 );
|
|
|
|
if ( common_scripts\utility::issp() )
|
|
{
|
|
level.sentry_settings[var_0].damage_smoke_time = 15;
|
|
level.sentry_settings[var_0].weaponinfo = "sentry_gun_weak";
|
|
level.sentry_settings[var_0].targetname = "sentry_gun_weak";
|
|
}
|
|
else
|
|
{
|
|
level.sentry_settings[var_0].damage_smoke_time = 5;
|
|
level.sentry_settings[var_0].weaponinfo = "sentry_gun_mp";
|
|
level.sentry_settings[var_0].targetname = "sentry_gun_mp";
|
|
}
|
|
}
|
|
|
|
#using_animtree("sentry_gun");
|
|
|
|
sentry_minigun_default_settings( var_0 )
|
|
{
|
|
level.sentry_settings[var_0].ammo = 1000;
|
|
level.sentry_settings[var_0].use_laser = 1;
|
|
level.sentry_settings[var_0].burst_shots_min = 20;
|
|
level.sentry_settings[var_0].burst_shots_max = 60;
|
|
level.sentry_settings[var_0].burst_pause_min = 0.5;
|
|
level.sentry_settings[var_0].burst_pause_max = 1.3;
|
|
level.sentry_settings[var_0].fire_only_on_target = 0;
|
|
level.sentry_settings[var_0].model = "sentry_minigun";
|
|
level.sentry_settings[var_0].destroyedmodel = "sentry_minigun_destroyed";
|
|
level.sentry_settings[var_0].pickupmodel = "sentry_minigun_folded";
|
|
level.sentry_settings[var_0].pickupmodelobj = "sentry_minigun_folded_obj";
|
|
level.sentry_settings[var_0].placementmodel = "sentry_minigun_obj";
|
|
level.sentry_settings[var_0].placementmodelfail = "sentry_minigun_obj_red";
|
|
level.sentry_settings[var_0].health = 190;
|
|
|
|
if ( common_scripts\utility::issp() && !is_specialop() )
|
|
{
|
|
level.sentry_settings[var_0].damage_smoke_time = 15;
|
|
level.sentry_settings[var_0].anim_loop = %minigun_spin_loop;
|
|
level.sentry_settings[var_0].weaponinfo = "sentry_minigun";
|
|
level.sentry_settings[var_0].targetname = "sentry_minigun";
|
|
}
|
|
else if ( is_specialop() )
|
|
{
|
|
level.sentry_settings[var_0].ammo = 800;
|
|
level.sentry_settings[var_0].damage_smoke_time = 8;
|
|
level.sentry_settings[var_0].anim_loop = %minigun_spin_loop;
|
|
level.sentry_settings[var_0].weaponinfo = "sentry_minigun_so";
|
|
level.sentry_settings[var_0].targetname = "sentry_minigun_so";
|
|
level.sentry_settings[var_0].health = 800;
|
|
}
|
|
else
|
|
{
|
|
level.sentry_settings[var_0].damage_smoke_time = 5;
|
|
level.sentry_settings[var_0].weaponinfo = "sentry_minigun_mp";
|
|
level.sentry_settings[var_0].targetname = "sentry_minigun_mp";
|
|
}
|
|
}
|
|
|
|
sentry_minigun_weak_settings( var_0 )
|
|
{
|
|
level.sentry_settings[var_0].ammo = 800;
|
|
level.sentry_settings[var_0].use_laser = 0;
|
|
level.sentry_settings[var_0].burst_shots_min = 10;
|
|
level.sentry_settings[var_0].burst_shots_max = 30;
|
|
level.sentry_settings[var_0].burst_pause_min = 1.0;
|
|
level.sentry_settings[var_0].burst_pause_max = 2.6;
|
|
level.sentry_settings[var_0].fire_only_on_target = 0;
|
|
level.sentry_settings[var_0].model = "sentry_minigun_weak";
|
|
level.sentry_settings[var_0].destroyedmodel = "sentry_minigun_weak_destroyed";
|
|
level.sentry_settings[var_0].pickupmodel = "sentry_minigun_weak_folded";
|
|
level.sentry_settings[var_0].pickupmodelobj = "sentry_minigun_weak_folded_obj";
|
|
level.sentry_settings[var_0].placementmodel = "sentry_minigun_weak_obj";
|
|
level.sentry_settings[var_0].placementmodelfail = "sentry_minigun_weak_obj_red";
|
|
level.sentry_settings[var_0].health = int( 95.0 );
|
|
|
|
if ( common_scripts\utility::issp() )
|
|
{
|
|
level.sentry_settings[var_0].damage_smoke_time = 15;
|
|
level.sentry_settings[var_0].anim_loop = %minigun_spin_loop;
|
|
level.sentry_settings[var_0].weaponinfo = "sentry_minigun_weak";
|
|
level.sentry_settings[var_0].targetname = "sentry_minigun_weak";
|
|
}
|
|
else
|
|
{
|
|
level.sentry_settings[var_0].damage_smoke_time = 5;
|
|
level.sentry_settings[var_0].weaponinfo = "sentry_minigun_mp";
|
|
level.sentry_settings[var_0].targetname = "sentry_minigun_mp";
|
|
}
|
|
}
|
|
|
|
sentry_smg_default_settings( var_0 )
|
|
{
|
|
level.sentry_settings[var_0].ammo = 100;
|
|
level.sentry_settings[var_0].use_laser = 1;
|
|
level.sentry_settings[var_0].burst_shots_min = 10;
|
|
level.sentry_settings[var_0].burst_shots_max = 30;
|
|
level.sentry_settings[var_0].burst_pause_min = 0.5;
|
|
level.sentry_settings[var_0].burst_pause_max = 1.5;
|
|
level.sentry_settings[var_0].fire_only_on_target = 1;
|
|
level.sentry_settings[var_0].model = "weapon_sentry_smg";
|
|
level.sentry_settings[var_0].destroyedmodel = "weapon_sentry_smg_destroyed";
|
|
level.sentry_settings[var_0].pickupmodel = "weapon_sentry_smg_animated";
|
|
level.sentry_settings[var_0].pickupmodelobj = "weapon_sentry_smg_animated_obj";
|
|
level.sentry_settings[var_0].placementmodel = "weapon_sentry_smg_obj";
|
|
level.sentry_settings[var_0].placementmodelfail = "weapon_sentry_smg_obj_red";
|
|
level.sentry_settings[var_0].health = 350;
|
|
level.sentry_settings[var_0].no_steam = 1;
|
|
level.sentry_settings[var_0].damage_smoke_time = 0;
|
|
level.sentry_settings[var_0].weaponinfo = "sentry_smg";
|
|
level.sentry_settings[var_0].targetname = "sentry_smg";
|
|
}
|
|
|
|
sentry_pickup_init( var_0 )
|
|
{
|
|
self setmodel( self.model );
|
|
self.sentrytype = var_0;
|
|
self setcursorhint( "HINT_NOICON" );
|
|
self sethintstring( &"SENTRY_PICKUP" );
|
|
self makeusable();
|
|
thread folded_sentry_use_wait( var_0 );
|
|
}
|
|
|
|
givesentry( var_0 )
|
|
{
|
|
self.last_sentry = var_0;
|
|
thread spawn_and_place_sentry( var_0 );
|
|
}
|
|
|
|
sentry_init( var_0, var_1, var_2 )
|
|
{
|
|
if ( common_scripts\utility::issp() )
|
|
{
|
|
level.sentry_overheating_speed = 1;
|
|
level.sentry_cooling_speed = 1;
|
|
|
|
if ( !isdefined( level.sentry_fire_time ) )
|
|
level.sentry_fire_time = 5;
|
|
|
|
if ( !isdefined( level.sentry_cooldown_time ) )
|
|
level.sentry_cooldown_time = 2;
|
|
}
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
{
|
|
if ( !isdefined( self.script_team ) )
|
|
self.script_team = "axis";
|
|
|
|
var_0 = self.script_team;
|
|
}
|
|
|
|
self setturretmodechangewait( 1 );
|
|
makesentrysolid();
|
|
self maketurretinoperable();
|
|
sentrypoweron();
|
|
self setcandamage( 1 );
|
|
self setdefaultdroppitch( -89.0 );
|
|
|
|
if ( common_scripts\utility::issp() || level.teambased || is_survival() )
|
|
self setturretteam( var_0 );
|
|
|
|
self.sentrytype = var_1;
|
|
self.issentrygun = 1;
|
|
self.kill_reward_money = 350;
|
|
self.kill_melee_reward_money = 400;
|
|
self.sentry_battery_timer = 60;
|
|
self.sentry_ammo = level.sentry_settings[self.sentrytype].ammo;
|
|
|
|
if ( common_scripts\utility::issp() )
|
|
{
|
|
if ( isdefined( level.sentry_settings ) && isdefined( level.sentry_settings["sentry_minigun"] ) && isdefined( level.sentry_settings["sentry_minigun"].bullet_armor ) )
|
|
self.bullet_armor = level.sentry_settings["sentry_minigun"].bullet_armor;
|
|
else if ( self.weaponinfo == "sentry_gun" )
|
|
self.bullet_armor = 2000;
|
|
else
|
|
self.bullet_armor = 1200;
|
|
}
|
|
else if ( self.weaponinfo == "sentry_gun" )
|
|
self.bullet_armor = 300;
|
|
else
|
|
self.bullet_armor = 300;
|
|
|
|
if ( common_scripts\utility::issp() )
|
|
{
|
|
self call [[ level.makeentitysentient_func ]]( var_0 );
|
|
common_scripts\utility::self_func( "useanimtree", #animtree );
|
|
|
|
if ( isdefined( self.script_team ) && self.script_team == "axis" )
|
|
thread enemy_sentry_difficulty_settings();
|
|
}
|
|
|
|
self.health = level.sentry_settings[var_1].health;
|
|
sentry_badplace_create();
|
|
thread sentry_beep_sounds();
|
|
thread sentry_enemy_wait();
|
|
thread sentry_death_wait();
|
|
|
|
if ( !common_scripts\utility::issp() )
|
|
{
|
|
thread sentry_emp_wait();
|
|
thread sentry_emp_damage_wait();
|
|
}
|
|
|
|
thread sentry_health_monitor();
|
|
thread sentry_player_use_wait();
|
|
|
|
if ( !isdefined( var_2 ) )
|
|
{
|
|
if ( common_scripts\utility::issp() )
|
|
var_2 = level.player;
|
|
}
|
|
|
|
sentry_set_owner( var_2 );
|
|
thread sentry_destroy_on_owner_leave( var_2 );
|
|
|
|
if ( !isdefined( self.damage_functions ) )
|
|
self.damage_functions = [];
|
|
}
|
|
|
|
sentry_death_wait()
|
|
{
|
|
self endon( "deleted" );
|
|
self waittill( "death", var_0, var_1, var_2 );
|
|
level notify( "a_sentry_died" );
|
|
|
|
if ( isdefined( var_0 ) && isdefined( var_0.team ) && self.team != var_0.team && isdefined( level.stat_track_kill_func ) )
|
|
var_0 [[ level.stat_track_kill_func ]]( self, var_1, var_2 );
|
|
|
|
if ( !common_scripts\utility::issp() )
|
|
{
|
|
removefromturretlist();
|
|
thread sentry_place_mode_reset();
|
|
}
|
|
|
|
thread sentry_burst_fire_stop();
|
|
thread sentry_turn_laser_off();
|
|
self setmodel( level.sentry_settings[self.sentrytype].destroyedmodel );
|
|
sentrypoweroff();
|
|
|
|
if ( common_scripts\utility::issp() )
|
|
self call [[ level.freeentitysentient_func ]]();
|
|
|
|
if ( !common_scripts\utility::issp() && isdefined( var_0 ) && isplayer( var_0 ) )
|
|
{
|
|
if ( isdefined( self.owner ) )
|
|
self.owner thread [[ level.leaderdialogonplayer_func ]]( "destroy_sentry", "sentry_status" );
|
|
|
|
var_0 thread [[ level.onxpevent ]]( "kill" );
|
|
}
|
|
|
|
self setsentrycarrier( undefined );
|
|
self.carrier = undefined;
|
|
self setcandamage( 1 );
|
|
self.ignoreme = 1;
|
|
self makeunusable();
|
|
self setsentryowner( undefined );
|
|
self setturretminimapvisible( 0 );
|
|
self playsound( "sentry_explode" );
|
|
playfxontag( common_scripts\utility::getfx( "sentry_turret_explode" ), self, "tag_aim" );
|
|
|
|
if ( common_scripts\utility::issp() && ( !isdefined( self.stay_solid_on_death ) || !self.stay_solid_on_death ) )
|
|
self setcontents( 0 );
|
|
|
|
wait 1.5;
|
|
self playsound( "sentry_explode_smoke" );
|
|
var_3 = level.sentry_settings[self.sentrytype].damage_smoke_time * 1000;
|
|
var_4 = gettime();
|
|
|
|
for (;;)
|
|
{
|
|
playfxontag( common_scripts\utility::getfx( "sentry_turret_explode_smoke" ), self, "tag_aim" );
|
|
wait 0.4;
|
|
|
|
if ( gettime() - var_4 > var_3 )
|
|
break;
|
|
}
|
|
|
|
level.placed_sentry = common_scripts\utility::array_remove( level.placed_sentry, self );
|
|
|
|
if ( !common_scripts\utility::issp() || getdvar( "specialops" ) == "1" )
|
|
thread removedeadsentry();
|
|
}
|
|
|
|
handle_sentry_on_carrier_death( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "sentry_placement_finished" );
|
|
self waittill( "death" );
|
|
|
|
if ( common_scripts\utility::issp() )
|
|
{
|
|
var_0 notify( "death" );
|
|
return;
|
|
}
|
|
|
|
if ( !self.canplaceentity )
|
|
{
|
|
var_0 sentry_place_mode_reset();
|
|
var_0 notify( "deleted" );
|
|
waittillframeend;
|
|
var_0 delete();
|
|
return;
|
|
}
|
|
|
|
if ( !common_scripts\utility::issp() )
|
|
thread place_sentry( var_0 );
|
|
}
|
|
|
|
kill_sentry_on_carrier_disconnect( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "sentry_placement_finished" );
|
|
self waittill( "disconnect" );
|
|
var_0 notify( "death" );
|
|
}
|
|
|
|
handle_sentry_placement_failed( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "sentry_placement_finished" );
|
|
self waittill( "sentry_placement_canceled" );
|
|
var_0 sentry_place_mode_reset();
|
|
sentry_placement_hint_hide();
|
|
var_0 notify( "death" );
|
|
}
|
|
|
|
sentry_player_use_wait()
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "death" );
|
|
|
|
if ( self.health <= 0 )
|
|
return;
|
|
|
|
self makeusable();
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "trigger", var_0 );
|
|
|
|
if ( isdefined( var_0.placingsentry ) )
|
|
continue;
|
|
|
|
if ( !common_scripts\utility::issp() )
|
|
var_0 playlocalsound( "sentry_pickup" );
|
|
else
|
|
var_0 playsound( "sentry_pickup" );
|
|
|
|
break;
|
|
}
|
|
|
|
var_0 thread handle_sentry_placement_failed( self );
|
|
var_0 thread handle_sentry_on_carrier_death( self );
|
|
var_0 thread kill_sentry_on_carrier_disconnect( self );
|
|
var_0 thread sentry_placement_endoflevel_cancel_monitor( self );
|
|
|
|
if ( !common_scripts\utility::issp() && !isalive( var_0 ) )
|
|
return;
|
|
|
|
if ( !common_scripts\utility::issp() )
|
|
sentry_team_hide_icon();
|
|
|
|
sentrypoweroff();
|
|
var_0.placingsentry = self;
|
|
self setsentrycarrier( var_0 );
|
|
self.carrier = var_0;
|
|
self.ignoreme = 1;
|
|
self setcandamage( 0 );
|
|
|
|
if ( isdefined( self.carrier ) && isplayer( self.carrier ) )
|
|
self.carrier allowlean( 0 );
|
|
|
|
self makeunusable();
|
|
var_0 common_scripts\utility::_disableweapon();
|
|
makesentrynotsolid();
|
|
sentry_badplace_delete();
|
|
var_0 thread move_sentry_wait( self );
|
|
var_0 thread updatesentrypositionthread( self );
|
|
}
|
|
|
|
sentry_badplace_create()
|
|
{
|
|
if ( !common_scripts\utility::issp() )
|
|
return;
|
|
|
|
self.badplace_name = "" + gettime();
|
|
call [[ level.badplace_cylinder_func ]]( self.badplace_name, 0, self.origin, 32, 128, self.team, "neutral" );
|
|
}
|
|
|
|
sentry_badplace_delete()
|
|
{
|
|
if ( !common_scripts\utility::issp() )
|
|
return;
|
|
|
|
call [[ level.badplace_delete_func ]]( self.badplace_name );
|
|
self.badplace_name = undefined;
|
|
}
|
|
|
|
move_sentry_wait( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
var_0 endon( "death" );
|
|
var_0 endon( "deleted" );
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
var_0 notify( "sentry_move_started", self );
|
|
self.carrying_pickedup_sentry = 1;
|
|
|
|
for (;;)
|
|
{
|
|
waitactivatebutton( 0 );
|
|
waitactivatebutton( 1 );
|
|
updatesentryposition( var_0 );
|
|
|
|
if ( self.canplaceentity )
|
|
break;
|
|
}
|
|
|
|
var_0 notify( "sentry_move_finished", self );
|
|
self.carrying_pickedup_sentry = 0;
|
|
place_sentry( var_0 );
|
|
}
|
|
|
|
place_sentry( var_0 )
|
|
{
|
|
if ( !common_scripts\utility::issp() )
|
|
{
|
|
self endon( "death" );
|
|
level endon( "end_game" );
|
|
}
|
|
|
|
if ( isdefined( var_0.carrier ) && isplayer( var_0.carrier ) )
|
|
var_0.carrier allowlean( 1 );
|
|
|
|
self.placingsentry = undefined;
|
|
var_0 setsentrycarrier( undefined );
|
|
var_0.carrier = undefined;
|
|
var_0 setcandamage( 1 );
|
|
var_0.ignoreme = 0;
|
|
common_scripts\utility::_enableweapon();
|
|
var_0 makesentrysolid();
|
|
var_0 setmodel( level.sentry_settings[var_0.sentrytype].model );
|
|
var_0 sentry_badplace_create();
|
|
var_0 setcontents( var_0.contents );
|
|
var_0 sentry_set_owner( self );
|
|
self notify( "sentry_placement_finished", var_0 );
|
|
var_0 notify( "sentry_carried" );
|
|
var_0.overheated = 0;
|
|
sentry_placement_hint_hide();
|
|
|
|
if ( !common_scripts\utility::issp() )
|
|
var_0 sentry_team_show_icon();
|
|
|
|
var_0 sentrypoweron();
|
|
thread common_scripts\utility::play_sound_in_space( "sentry_gun_plant", var_0.origin );
|
|
waitactivatebutton( 0 );
|
|
var_0 thread sentry_player_use_wait();
|
|
}
|
|
|
|
sentry_enemy_wait()
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "death" );
|
|
thread sentry_overheat_monitor();
|
|
|
|
for (;;)
|
|
{
|
|
common_scripts\utility::waittill_either( "turretstatechange", "cooled" );
|
|
|
|
if ( self isfiringturret() )
|
|
{
|
|
thread sentry_burst_fire_start();
|
|
thread sentry_turn_laser_on();
|
|
continue;
|
|
}
|
|
|
|
thread sentry_burst_fire_stop();
|
|
thread sentry_turn_laser_off();
|
|
}
|
|
}
|
|
|
|
sentry_overheat_monitor()
|
|
{
|
|
self endon( "death" );
|
|
|
|
if ( self.sentrytype != "sentry_minigun" )
|
|
return;
|
|
|
|
if ( !isdefined( level.sentry_overheating_speed ) )
|
|
return;
|
|
|
|
self.overheat = 0;
|
|
self.overheated = 0;
|
|
|
|
if ( getdvarint( "sentry_overheat_debug" ) == 1 )
|
|
thread sentry_overheat_debug();
|
|
|
|
for (;;)
|
|
{
|
|
if ( self.overheat >= level.sentry_fire_time * 10 )
|
|
{
|
|
thread sentry_overheat_deactivate();
|
|
common_scripts\utility::waittill_either( "cooled", "sentry_carried" );
|
|
}
|
|
|
|
if ( self isfiringturret() )
|
|
self.overheat = self.overheat + 1;
|
|
else if ( self.overheat > 0 )
|
|
self.overheat = self.overheat - 1;
|
|
|
|
wait( 0.1 / level.sentry_overheating_speed );
|
|
}
|
|
}
|
|
|
|
sentry_cooling()
|
|
{
|
|
self endon( "death" );
|
|
|
|
while ( self.overheated )
|
|
{
|
|
if ( self.overheat > 0 )
|
|
self.overheat = self.overheat - 1;
|
|
|
|
wait( 0.1 / level.sentry_overheating_speed );
|
|
}
|
|
}
|
|
|
|
sentry_overheat_debug()
|
|
{
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
var_0 = self.overheat / ( level.sentry_fire_time * 10 );
|
|
var_1 = "[ ";
|
|
var_2 = " ]";
|
|
|
|
if ( self.overheated )
|
|
{
|
|
var_1 = "{{{ ";
|
|
var_2 = " }}}";
|
|
}
|
|
|
|
wait 0.2;
|
|
}
|
|
}
|
|
|
|
sentry_overheat_deactivate()
|
|
{
|
|
self endon( "death" );
|
|
self notify( "overheated" );
|
|
self.overheated = 1;
|
|
sentry_burst_fire_stop();
|
|
thread sentry_overheat_reactivate();
|
|
}
|
|
|
|
sentry_overheat_reactivate()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "sentry_carried" );
|
|
thread sentry_cooling();
|
|
wait( level.sentry_cooldown_time );
|
|
self notify( "cooled" );
|
|
self.overheat = 0;
|
|
self.overheated = 0;
|
|
}
|
|
|
|
sentry_burst_fire_start()
|
|
{
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
|
|
if ( level.sentry_settings[self.sentrytype].fire_only_on_target )
|
|
self waittill( "turret_on_target" );
|
|
|
|
if ( isdefined( self.overheated ) && self.overheated )
|
|
return;
|
|
|
|
thread fire_anim_start();
|
|
self endon( "stop_shooting" );
|
|
self notify( "shooting" );
|
|
var_0 = weaponfiretime( self.weaponinfo );
|
|
|
|
for (;;)
|
|
{
|
|
turret_start_anim_wait();
|
|
var_1 = randomintrange( level.sentry_settings[self.sentrytype].burst_shots_min, level.sentry_settings[self.sentrytype].burst_shots_max );
|
|
|
|
for ( var_2 = 0; var_2 < var_1; var_2++ )
|
|
{
|
|
if ( canfire() )
|
|
self shootturret();
|
|
|
|
self notify( "bullet_fired" );
|
|
wait( var_0 );
|
|
}
|
|
|
|
wait( randomfloatrange( level.sentry_settings[self.sentrytype].burst_pause_min, level.sentry_settings[self.sentrytype].burst_pause_max ) );
|
|
}
|
|
}
|
|
|
|
sentry_allowfire( var_0, var_1 )
|
|
{
|
|
self notify( "allowFireThread" );
|
|
self endon( "allowFireThread" );
|
|
self endon( "death" );
|
|
self.taking_damage = var_0;
|
|
|
|
if ( isdefined( var_1 ) && !var_0 )
|
|
{
|
|
wait( var_1 );
|
|
|
|
if ( isdefined( self ) )
|
|
thread sentry_allowfire( 1 );
|
|
}
|
|
}
|
|
|
|
canfire()
|
|
{
|
|
if ( !isdefined( self.taking_damage ) )
|
|
return 1;
|
|
|
|
return self.taking_damage;
|
|
}
|
|
|
|
sentry_burst_fire_stop()
|
|
{
|
|
thread fire_anim_stop();
|
|
self notify( "stop_shooting" );
|
|
|
|
if ( isdefined( self.sentry_type ) && ( !isdefined( level.sentry_settings[self.sentry_type].no_steam ) || !level.sentry_settings[self.sentry_type].no_steam ) )
|
|
thread sentry_steam();
|
|
}
|
|
|
|
sentry_steam()
|
|
{
|
|
self endon( "shooting" );
|
|
self endon( "deleted" );
|
|
wait( randomfloatrange( 0.0, 1.0 ) );
|
|
var_0 = 6000;
|
|
var_1 = gettime();
|
|
|
|
if ( isdefined( self ) )
|
|
self playsound( "sentry_steam" );
|
|
|
|
while ( isdefined( self ) )
|
|
{
|
|
playfxontag( common_scripts\utility::getfx( "sentry_turret_overheat_smoke_sp" ), self, "tag_flash" );
|
|
wait 0.3;
|
|
|
|
if ( gettime() - var_1 > var_0 )
|
|
break;
|
|
}
|
|
}
|
|
|
|
turret_start_anim_wait()
|
|
{
|
|
if ( isdefined( self.allow_fire ) && self.allow_fire == 0 )
|
|
self waittill( "allow_fire" );
|
|
}
|
|
|
|
fire_anim_start()
|
|
{
|
|
self notify( "anim_state_change" );
|
|
self endon( "anim_state_change" );
|
|
self endon( "stop_shooting" );
|
|
self endon( "deleted" );
|
|
level endon( "game_ended" );
|
|
self endon( "death" );
|
|
|
|
if ( !isdefined( level.sentry_settings[self.sentrytype].anim_loop ) )
|
|
return;
|
|
|
|
self.allow_fire = 0;
|
|
|
|
if ( !isdefined( self.momentum ) )
|
|
self.momentum = 0;
|
|
|
|
thread fire_sound_spinup();
|
|
|
|
for (;;)
|
|
{
|
|
if ( self.momentum >= 1.0 )
|
|
break;
|
|
|
|
self.momentum = self.momentum + 0.1;
|
|
self.momentum = clamp( self.momentum, 0.0, 1.0 );
|
|
|
|
if ( common_scripts\utility::issp() )
|
|
common_scripts\utility::self_func( "setanim", level.sentry_settings[self.sentrytype].anim_loop, 1.0, 0.2, self.momentum );
|
|
|
|
wait 0.2;
|
|
}
|
|
|
|
self.allow_fire = 1;
|
|
self notify( "allow_fire" );
|
|
}
|
|
|
|
delete_sentry_turret()
|
|
{
|
|
self notify( "deleted" );
|
|
wait 0.05;
|
|
self notify( "death" );
|
|
|
|
if ( isdefined( self.obj_overlay ) )
|
|
self.obj_overlay delete();
|
|
|
|
if ( isdefined( self.cam ) )
|
|
self.cam delete();
|
|
|
|
self delete();
|
|
}
|
|
|
|
fire_anim_stop()
|
|
{
|
|
self notify( "anim_state_change" );
|
|
self endon( "anim_state_change" );
|
|
|
|
if ( !isdefined( level.sentry_settings[self.sentrytype].anim_loop ) )
|
|
return;
|
|
|
|
thread fire_sound_spindown();
|
|
self.allow_fire = 0;
|
|
|
|
for (;;)
|
|
{
|
|
if ( !isdefined( self.momentum ) )
|
|
break;
|
|
|
|
if ( self.momentum <= 0.0 )
|
|
break;
|
|
|
|
self.momentum = self.momentum - 0.1;
|
|
self.momentum = clamp( self.momentum, 0.0, 1.0 );
|
|
|
|
if ( common_scripts\utility::issp() )
|
|
common_scripts\utility::self_func( "setanim", level.sentry_settings[self.sentrytype].anim_loop, 1.0, 0.2, self.momentum );
|
|
|
|
wait 0.2;
|
|
}
|
|
}
|
|
|
|
fire_sound_spinup()
|
|
{
|
|
self notify( "sound_state_change" );
|
|
self endon( "sound_state_change" );
|
|
self endon( "deleted" );
|
|
|
|
if ( self.momentum < 0.25 )
|
|
{
|
|
self playsound( "sentry_minigun_spinup1" );
|
|
wait 0.6;
|
|
self playsound( "sentry_minigun_spinup2" );
|
|
wait 0.5;
|
|
self playsound( "sentry_minigun_spinup3" );
|
|
wait 0.5;
|
|
self playsound( "sentry_minigun_spinup4" );
|
|
wait 0.5;
|
|
}
|
|
else if ( self.momentum < 0.5 )
|
|
{
|
|
self playsound( "sentry_minigun_spinup2" );
|
|
wait 0.5;
|
|
self playsound( "sentry_minigun_spinup3" );
|
|
wait 0.5;
|
|
self playsound( "sentry_minigun_spinup4" );
|
|
wait 0.5;
|
|
}
|
|
else if ( self.momentum < 0.75 )
|
|
{
|
|
self playsound( "sentry_minigun_spinup3" );
|
|
wait 0.5;
|
|
self playsound( "sentry_minigun_spinup4" );
|
|
wait 0.5;
|
|
}
|
|
else if ( self.momentum < 1 )
|
|
{
|
|
self playsound( "sentry_minigun_spinup4" );
|
|
wait 0.5;
|
|
}
|
|
|
|
thread fire_sound_spinloop();
|
|
}
|
|
|
|
fire_sound_spinloop()
|
|
{
|
|
self endon( "death" );
|
|
self notify( "sound_state_change" );
|
|
self endon( "sound_state_change" );
|
|
|
|
for (;;)
|
|
{
|
|
self playsound( "sentry_minigun_spin" );
|
|
wait 2.5;
|
|
}
|
|
}
|
|
|
|
fire_sound_spindown()
|
|
{
|
|
self notify( "sound_state_change" );
|
|
self endon( "sound_state_change" );
|
|
self endon( "deleted" );
|
|
|
|
if ( !isdefined( self.momentum ) )
|
|
return;
|
|
|
|
if ( self.momentum > 0.75 )
|
|
{
|
|
self stopsounds();
|
|
self playsound( "sentry_minigun_spindown4" );
|
|
wait 0.5;
|
|
self playsound( "sentry_minigun_spindown3" );
|
|
wait 0.5;
|
|
self playsound( "sentry_minigun_spindown2" );
|
|
wait 0.5;
|
|
self playsound( "sentry_minigun_spindown1" );
|
|
wait 0.65;
|
|
}
|
|
else if ( self.momentum > 0.5 )
|
|
{
|
|
self playsound( "sentry_minigun_spindown3" );
|
|
wait 0.5;
|
|
self playsound( "sentry_minigun_spindown2" );
|
|
wait 0.5;
|
|
self playsound( "sentry_minigun_spindown1" );
|
|
wait 0.65;
|
|
}
|
|
else if ( self.momentum > 0.25 )
|
|
{
|
|
self playsound( "sentry_minigun_spindown2" );
|
|
wait 0.5;
|
|
self playsound( "sentry_minigun_spindown1" );
|
|
wait 0.65;
|
|
}
|
|
else
|
|
{
|
|
self playsound( "sentry_minigun_spindown1" );
|
|
wait 0.65;
|
|
}
|
|
}
|
|
|
|
sentry_beep_sounds()
|
|
{
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
wait( randomfloatrange( 3.5, 4.5 ) );
|
|
thread common_scripts\utility::play_sound_in_space( "sentry_gun_beep", self.origin + ( 0, 0, 40 ) );
|
|
}
|
|
}
|
|
|
|
spawn_and_place_sentry( var_0, var_1, var_2, var_3 )
|
|
{
|
|
level endon( "game_ended" );
|
|
|
|
if ( isdefined( self.placingsentry ) )
|
|
return undefined;
|
|
|
|
common_scripts\utility::_disableweapon();
|
|
self notify( "placingSentry" );
|
|
self.sentry_placement_failed = undefined;
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = self.origin;
|
|
|
|
if ( !isdefined( var_2 ) )
|
|
var_2 = self.angles;
|
|
|
|
if ( !isdefined( var_3 ) )
|
|
var_3 = 0;
|
|
|
|
var_4 = spawnturret( "misc_turret", var_1, level.sentry_settings[var_0].weaponinfo );
|
|
var_4 setmodel( level.sentry_settings[var_0].placementmodel );
|
|
var_4.weaponinfo = level.sentry_settings[var_0].weaponinfo;
|
|
var_4.targetname = level.sentry_settings[var_0].targetname;
|
|
var_4.weaponname = level.sentry_settings[var_0].weaponinfo;
|
|
var_4.angles = var_2;
|
|
var_4.team = self.team;
|
|
var_4.attacker = self;
|
|
var_4.sentrytype = var_0;
|
|
var_4 maketurretinoperable();
|
|
var_4 sentrypoweroff();
|
|
var_4 setcandamage( 0 );
|
|
var_4 sentry_set_owner( self );
|
|
var_4 setdefaultdroppitch( -89.0 );
|
|
self.placingsentry = var_4;
|
|
var_4 setsentrycarrier( self );
|
|
var_4.carrier = self;
|
|
var_4 setcandamage( 0 );
|
|
var_4.ignoreme = 1;
|
|
|
|
if ( !common_scripts\utility::issp() )
|
|
var_4 addtoturretlist();
|
|
|
|
if ( !var_3 )
|
|
{
|
|
thread sentry_placement_cancel_monitor( var_4 );
|
|
thread sentry_placement_endoflevel_cancel_monitor( var_4 );
|
|
}
|
|
|
|
thread sentry_placement_initial_wait( var_4, var_3 );
|
|
|
|
if ( !var_3 )
|
|
{
|
|
thread updatesentrypositionthread( var_4 );
|
|
|
|
if ( !common_scripts\utility::issp() )
|
|
common_scripts\utility::waittill_any( "sentry_placement_finished", "sentry_placement_canceled", "death" );
|
|
else
|
|
common_scripts\utility::waittill_any( "sentry_placement_finished", "sentry_placement_canceled" );
|
|
}
|
|
|
|
sentry_placement_hint_hide();
|
|
common_scripts\utility::_enableweapon();
|
|
self.placingsentry = undefined;
|
|
self setcandamage( 1 );
|
|
var_4 setsentrycarrier( undefined );
|
|
var_4.carrier = undefined;
|
|
var_4.ignoreme = 0;
|
|
|
|
if ( is_survival() )
|
|
{
|
|
waittillframeend;
|
|
|
|
if ( isdefined( self.sentry_placement_failed ) && self.sentry_placement_failed )
|
|
return undefined;
|
|
}
|
|
|
|
level.placed_sentry[level.placed_sentry.size] = var_4;
|
|
self notify( "new_sentry", var_4 );
|
|
return var_4;
|
|
}
|
|
|
|
sentry_placement_cancel_monitor( var_0 )
|
|
{
|
|
self endon( "sentry_placement_finished" );
|
|
|
|
if ( !common_scripts\utility::issp() )
|
|
common_scripts\utility::waittill_any( "sentry_placement_canceled", "death", "disconnect" );
|
|
else
|
|
common_scripts\utility::waittill_any( "sentry_placement_canceled" );
|
|
|
|
if ( is_survival() )
|
|
self.sentry_placement_failed = 1;
|
|
|
|
waittillframeend;
|
|
var_0 delete();
|
|
}
|
|
|
|
sentry_placement_endoflevel_cancel_monitor( var_0 )
|
|
{
|
|
self endon( "sentry_placement_finished" );
|
|
|
|
if ( common_scripts\utility::issp() )
|
|
return;
|
|
|
|
level waittill( "game_ended" );
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
return;
|
|
|
|
if ( !self.canplaceentity )
|
|
{
|
|
var_0 notify( "deleted" );
|
|
waittillframeend;
|
|
var_0 delete();
|
|
return;
|
|
}
|
|
|
|
thread place_sentry( var_0 );
|
|
}
|
|
|
|
sentry_restock_wait()
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "disconnect" );
|
|
self endon( "restock_reset" );
|
|
self notifyonplayercommand( "cancel sentry", "+actionslot 4" );
|
|
common_scripts\utility::waittill_any( "death", "cancel sentry" );
|
|
self notify( "sentry_placement_canceled" );
|
|
}
|
|
|
|
sentry_placement_initial_wait( var_0, var_1 )
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "sentry_placement_canceled" );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = 0;
|
|
|
|
if ( !common_scripts\utility::issp() )
|
|
{
|
|
self endon( "disconnect" );
|
|
var_0 thread sentry_reset_on_owner_death();
|
|
thread sentry_restock_wait();
|
|
}
|
|
|
|
if ( !var_1 )
|
|
{
|
|
var_0 makeunusable();
|
|
|
|
while ( self usebuttonpressed() )
|
|
wait 0.05;
|
|
|
|
for (;;)
|
|
{
|
|
waitactivatebutton( 0 );
|
|
waitactivatebutton( 1 );
|
|
updatesentryposition( var_0 );
|
|
|
|
if ( self.canplaceentity )
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( !common_scripts\utility::issp() )
|
|
self notify( "restock_reset" );
|
|
|
|
if ( !common_scripts\utility::issp() )
|
|
{
|
|
var_0.lifeid = self.lifeid;
|
|
sentry_team_setup( var_0 );
|
|
}
|
|
|
|
thread common_scripts\utility::play_sound_in_space( "sentry_gun_plant", var_0.origin );
|
|
var_0 setmodel( level.sentry_settings[var_0.sentrytype].model );
|
|
var_0 sentry_init( self.team, var_0.sentrytype, self );
|
|
self notify( "sentry_placement_finished", var_0 );
|
|
|
|
if ( !var_1 )
|
|
waittillframeend;
|
|
|
|
if ( isdefined( level.sentry_ammo_enabled ) && level.sentry_ammo_enabled )
|
|
var_0 thread sentry_die_on_ammoout();
|
|
|
|
if ( !common_scripts\utility::issp() )
|
|
var_0 thread sentry_die_on_batteryout();
|
|
}
|
|
|
|
updatesentrypositionthread( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
var_0 notify( "sentry_placement_started" );
|
|
self endon( "sentry_placement_canceled" );
|
|
self endon( "sentry_placement_finished" );
|
|
var_0 endon( "death" );
|
|
var_0 endon( "deleted" );
|
|
|
|
if ( !common_scripts\utility::issp() )
|
|
{
|
|
self endon( "disconnect" );
|
|
self endon( "death" );
|
|
}
|
|
|
|
for (;;)
|
|
{
|
|
updatesentryposition( var_0 );
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
updatesentryposition( var_0 )
|
|
{
|
|
if ( isdefined( level.custom_sentry_position_func ) )
|
|
[[ level.custom_sentry_position_func ]]( var_0 );
|
|
else
|
|
{
|
|
var_1 = self canplayerplacesentry();
|
|
var_0.origin = var_1["origin"];
|
|
var_0.angles = var_1["angles"];
|
|
self.canplaceentity = self isonground() && var_1["result"];
|
|
sentry_placement_hint_show( self.canplaceentity );
|
|
|
|
if ( self.canplaceentity )
|
|
{
|
|
var_0 setmodel( level.sentry_settings[var_0.sentrytype].placementmodel );
|
|
return;
|
|
}
|
|
|
|
var_0 setmodel( level.sentry_settings[var_0.sentrytype].placementmodelfail );
|
|
}
|
|
}
|
|
|
|
sentry_placement_hint_show( var_0 )
|
|
{
|
|
if ( isdefined( self.forced_hint ) && self.forced_hint == var_0 )
|
|
return;
|
|
|
|
self.forced_hint = var_0;
|
|
|
|
if ( self.forced_hint )
|
|
self forceusehinton( &"SENTRY_PLACE" );
|
|
else
|
|
self forceusehinton( &"SENTRY_CANNOT_PLACE" );
|
|
}
|
|
|
|
sentry_placement_hint_hide()
|
|
{
|
|
if ( !isdefined( self.forced_hint ) )
|
|
return;
|
|
|
|
self forceusehintoff();
|
|
self.forced_hint = undefined;
|
|
}
|
|
|
|
folded_sentry_use_wait( var_0 )
|
|
{
|
|
self.obj_overlay = spawn( "script_model", self.origin );
|
|
self.obj_overlay.angles = self.angles;
|
|
self.obj_overlay setmodel( level.sentry_settings[var_0].pickupmodelobj );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "trigger", var_1 );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
continue;
|
|
|
|
if ( isdefined( var_1.placingsentry ) )
|
|
continue;
|
|
|
|
if ( !common_scripts\utility::issp() )
|
|
{
|
|
if ( var_1 != self.owner )
|
|
continue;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
self.obj_overlay delete();
|
|
self delete();
|
|
var_1 thread spawn_and_place_sentry( var_0 );
|
|
}
|
|
|
|
sentry_health_monitor()
|
|
{
|
|
self.healthbuffer = 20000;
|
|
self.health = self.health + self.healthbuffer;
|
|
self.currenthealth = self.health;
|
|
var_0 = undefined;
|
|
var_1 = undefined;
|
|
var_2 = 0;
|
|
var_3 = 0;
|
|
var_4 = gettime();
|
|
|
|
while ( self.health > 0 )
|
|
{
|
|
self waittill( "damage", var_5, var_0, var_6, var_7, var_1, var_8, var_9 );
|
|
|
|
if ( isdefined( var_0 ) && !isplayer( var_0 ) )
|
|
{
|
|
var_2 = var_2 + var_5;
|
|
var_3 = var_3 + ( gettime() - var_4 );
|
|
var_4 = gettime();
|
|
|
|
if ( var_3 < 3000 && var_2 > 300 )
|
|
{
|
|
var_10 = 0;
|
|
|
|
foreach ( var_12 in level.players )
|
|
{
|
|
if ( distancesquared( var_12.origin, self.origin ) <= squared( 500 ) )
|
|
var_10 = 1;
|
|
}
|
|
|
|
if ( !var_10 )
|
|
level notify( "a_sentry_is_underattack" );
|
|
|
|
var_2 = 0;
|
|
var_3 = 0;
|
|
}
|
|
|
|
if ( var_3 >= 3000 )
|
|
{
|
|
var_2 = 0;
|
|
var_3 = 0;
|
|
}
|
|
}
|
|
|
|
if ( !common_scripts\utility::issp() && isdefined( var_0 ) && isplayer( var_0 ) && var_0 sentry_attacker_is_friendly( self ) )
|
|
{
|
|
self.health = self.currenthealth;
|
|
return;
|
|
}
|
|
|
|
if ( isdefined( level.stat_track_damage_func ) && isdefined( var_0 ) )
|
|
var_0 [[ level.stat_track_damage_func ]]();
|
|
|
|
if ( isdefined( var_0 ) && isplayer( var_0 ) )
|
|
{
|
|
if ( !common_scripts\utility::issp() )
|
|
var_0 [[ level.func["damagefeedback"] ]]( "false" );
|
|
else if ( is_specialop() )
|
|
var_0 [[ level.func["damagefeedback"] ]]( self );
|
|
|
|
thread sentry_allowfire( 0, 2.0 );
|
|
}
|
|
|
|
if ( sentry_hit_bullet_armor( var_1, var_0 ) )
|
|
{
|
|
self.health = self.currenthealth;
|
|
self.bullet_armor = self.bullet_armor - var_5;
|
|
}
|
|
else
|
|
self.currenthealth = self.health;
|
|
|
|
if ( self.health < self.healthbuffer )
|
|
break;
|
|
}
|
|
|
|
if ( !common_scripts\utility::issp() && var_0 sentry_attacker_can_get_xp( self ) )
|
|
var_0 thread [[ level.onxpevent ]]( "kill" );
|
|
|
|
self notify( "death", var_0, var_1 );
|
|
}
|
|
|
|
sentry_hit_bullet_armor( var_0, var_1 )
|
|
{
|
|
if ( isdefined( var_1 ) && isai( var_1 ) && isdefined( var_1.juggernaut ) && var_1.juggernaut )
|
|
return 0;
|
|
|
|
if ( self.bullet_armor <= 0 )
|
|
return 0;
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
return 0;
|
|
|
|
if ( !issubstr( var_0, "BULLET" ) )
|
|
return 0;
|
|
else
|
|
return 1;
|
|
}
|
|
|
|
enemy_sentry_difficulty_settings()
|
|
{
|
|
var_0 = "easy";
|
|
self setconvergencetime( level.sentryturretsettings[var_0]["convergencePitchTime"], "pitch" );
|
|
self setconvergencetime( level.sentryturretsettings[var_0]["convergenceYawTime"], "yaw" );
|
|
self setsuppressiontime( level.sentryturretsettings[var_0]["suppressionTime"] );
|
|
self setaispread( level.sentryturretsettings[var_0]["aiSpread"] );
|
|
self setplayerspread( level.sentryturretsettings[var_0]["playerSpread"] );
|
|
self.maxrange = 1100;
|
|
self.bullet_armor = 0;
|
|
}
|
|
|
|
waitactivatebutton( var_0 )
|
|
{
|
|
if ( !common_scripts\utility::issp() )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
}
|
|
|
|
if ( var_0 == 1 )
|
|
{
|
|
while ( !self attackbuttonpressed() && !self usebuttonpressed() )
|
|
wait 0.05;
|
|
}
|
|
else if ( var_0 == 0 )
|
|
{
|
|
while ( self attackbuttonpressed() || self usebuttonpressed() )
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
makesentrysolid()
|
|
{
|
|
self maketurretsolid();
|
|
}
|
|
|
|
makesentrynotsolid()
|
|
{
|
|
self.contents = self setcontents( 0 );
|
|
}
|
|
|
|
sentrypoweron()
|
|
{
|
|
if ( !issentient( self ) && isdefined( self.owner ) && isdefined( self.owner.team ) )
|
|
self call [[ level.makeentitysentient_func ]]( self.owner.team );
|
|
|
|
self setmode( "sentry" );
|
|
self.battery_usage = 1;
|
|
}
|
|
|
|
sentrypoweroff()
|
|
{
|
|
if ( issentient( self ) )
|
|
self call [[ level.freeentitysentient_func ]]();
|
|
|
|
self setmode( "sentry_offline" );
|
|
self.battery_usage = 0;
|
|
}
|
|
|
|
sentry_team_setup( var_0 )
|
|
{
|
|
if ( isdefined( self.pers["team"] ) )
|
|
var_0.pers["team"] = self.pers["team"];
|
|
|
|
var_0 sentry_team_show_icon();
|
|
}
|
|
|
|
sentry_team_show_icon()
|
|
{
|
|
var_0 = ( 0, 0, 65 );
|
|
|
|
if ( self.sentrytype == "sentry_gun" )
|
|
var_0 = ( 0, 0, 75 );
|
|
|
|
self [[ level.func["setTeamHeadIcon"] ]]( self.pers["team"], var_0 );
|
|
}
|
|
|
|
sentry_team_hide_icon()
|
|
{
|
|
self [[ level.func["setTeamHeadIcon"] ]]( "none", ( 0, 0, 0 ) );
|
|
}
|
|
|
|
sentry_place_mode_reset()
|
|
{
|
|
if ( !isdefined( self.carrier ) )
|
|
return;
|
|
|
|
self.carrier notify( "sentry_placement_canceled" );
|
|
self.carrier common_scripts\utility::_enableweapon();
|
|
self.carrier.placingsentry = undefined;
|
|
self setsentrycarrier( undefined );
|
|
self.carrier = undefined;
|
|
self setcandamage( 1 );
|
|
self.ignoreme = 0;
|
|
}
|
|
|
|
sentry_set_owner( var_0 )
|
|
{
|
|
if ( isdefined( self.owner ) && self.owner == var_0 )
|
|
return;
|
|
|
|
var_0.debug_sentry = self;
|
|
self.owner = var_0;
|
|
self setsentryowner( var_0 );
|
|
self setturretminimapvisible( 1 );
|
|
}
|
|
|
|
sentry_destroy_on_owner_leave( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "death" );
|
|
var_0 common_scripts\utility::waittill_any( "disconnect", "joined_team", "joined_spectators" );
|
|
self notify( "death" );
|
|
}
|
|
|
|
sentry_die_on_batteryout()
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "death" );
|
|
self endon( "deleted" );
|
|
self notify( "battery_count_started" );
|
|
self endon( "battery_count_started" );
|
|
|
|
while ( self.sentry_battery_timer >= 0 )
|
|
{
|
|
if ( self.battery_usage )
|
|
self.sentry_battery_timer = self.sentry_battery_timer - 1;
|
|
|
|
wait 1;
|
|
}
|
|
|
|
self notify( "death" );
|
|
}
|
|
|
|
sentry_die_on_ammoout()
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "death" );
|
|
self endon( "deleted" );
|
|
self notify( "ammo_count_started" );
|
|
self endon( "ammo_count_started" );
|
|
thread sentry_ammo_debug();
|
|
|
|
while ( self.sentry_ammo >= 0 )
|
|
{
|
|
self waittill( "bullet_fired" );
|
|
self.sentry_ammo = self.sentry_ammo - 1;
|
|
}
|
|
|
|
thread sentry_burst_fire_stop();
|
|
thread sentry_turn_laser_off();
|
|
wait 1;
|
|
sentrypoweroff();
|
|
wait 5;
|
|
self notify( "death" );
|
|
}
|
|
|
|
sentry_ammo_debug()
|
|
{
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
var_0 = level.sentry_settings[self.sentrytype].ammo;
|
|
var_1 = self.sentry_ammo;
|
|
var_2 = var_1 / var_0;
|
|
var_3 = "Ammo: " + var_1 + "/" + var_0;
|
|
var_4 = level.sentry_settings[self.sentrytype].health;
|
|
var_5 = self.health - self.healthbuffer;
|
|
var_6 = var_5 / var_4;
|
|
var_7 = "Health: " + var_5 + "/" + var_4;
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
removedeadsentry()
|
|
{
|
|
if ( isdefined( self.keep_after_death ) && self.keep_after_death )
|
|
return;
|
|
|
|
delete_sentry_turret();
|
|
}
|
|
|
|
sentry_reset_on_owner_death()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "deleted" );
|
|
self.owner common_scripts\utility::waittill_any( "death", "disconnect" );
|
|
|
|
if ( isdefined( self.owner.placingsentry ) && self.owner.placingsentry == self )
|
|
{
|
|
self.owner.placingsentry = undefined;
|
|
self setsentrycarrier( undefined );
|
|
self.carrier = undefined;
|
|
self setcandamage( 1 );
|
|
self.ignoreme = 0;
|
|
self notify( "death" );
|
|
}
|
|
}
|
|
|
|
sentry_attacker_can_get_xp( var_0 )
|
|
{
|
|
if ( !isdefined( self ) )
|
|
return 0;
|
|
|
|
if ( !isplayer( self ) )
|
|
return 0;
|
|
|
|
if ( !isdefined( level.onxpevent ) )
|
|
return 0;
|
|
|
|
if ( !isdefined( self.pers["team"] ) )
|
|
return 0;
|
|
|
|
if ( !isdefined( var_0.team ) )
|
|
return 0;
|
|
|
|
if ( !level.teambased && self == var_0.owner )
|
|
return 0;
|
|
|
|
if ( level.teambased && self.pers["team"] == var_0.team )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
sentry_attacker_is_friendly( var_0 )
|
|
{
|
|
if ( !isdefined( self ) )
|
|
return 0;
|
|
|
|
if ( !isplayer( self ) )
|
|
return 0;
|
|
|
|
if ( !level.teambased )
|
|
return 0;
|
|
|
|
if ( self == var_0.owner )
|
|
return 0;
|
|
|
|
if ( self.team != var_0.team )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
sentry_emp_damage_wait()
|
|
{
|
|
self endon( "deleted" );
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "emp_damage", var_0, var_1 );
|
|
thread sentry_burst_fire_stop();
|
|
thread sentry_turn_laser_off();
|
|
sentrypoweroff();
|
|
playfxontag( common_scripts\utility::getfx( "sentry_turret_explode" ), self, "tag_aim" );
|
|
wait( var_1 );
|
|
sentrypoweron();
|
|
}
|
|
}
|
|
|
|
sentry_emp_wait()
|
|
{
|
|
self endon( "deleted" );
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
level waittill( "emp_update" );
|
|
|
|
if ( level.teamemped[self.team] )
|
|
{
|
|
thread sentry_burst_fire_stop();
|
|
thread sentry_turn_laser_off();
|
|
sentrypoweroff();
|
|
playfxontag( common_scripts\utility::getfx( "sentry_turret_explode" ), self, "tag_aim" );
|
|
continue;
|
|
}
|
|
|
|
sentrypoweron();
|
|
}
|
|
}
|
|
|
|
addtoturretlist()
|
|
{
|
|
level.turrets[self getentitynumber()] = self;
|
|
}
|
|
|
|
removefromturretlist()
|
|
{
|
|
level.turrets[self getentitynumber()] = undefined;
|
|
}
|
|
|
|
dual_waittill( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_0 endon( var_1 );
|
|
var_2 endon( var_3 );
|
|
level waittill( "hell_freezes_over_AND_THEN_thaws_out" );
|
|
}
|
|
|
|
sentry_turn_laser_on()
|
|
{
|
|
if ( !level.sentry_settings[self.sentrytype].use_laser )
|
|
return;
|
|
|
|
if ( !isdefined( level.laseron_func ) )
|
|
return;
|
|
|
|
self call [[ level.laseron_func ]]();
|
|
}
|
|
|
|
sentry_turn_laser_off()
|
|
{
|
|
if ( !level.sentry_settings[self.sentrytype].use_laser )
|
|
return;
|
|
|
|
if ( !isdefined( level.laseroff_func ) )
|
|
return;
|
|
|
|
self call [[ level.laseroff_func ]]();
|
|
}
|
|
|
|
is_specialop()
|
|
{
|
|
return getdvarint( "specialops" ) >= 1;
|
|
}
|
|
|
|
is_survival()
|
|
{
|
|
return is_specialop() && getdvarint( "so_survival" ) > 0;
|
|
}
|