2024-02-13 13:20:49 +01:00

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;
}