Files
Recompilable-gscs-for-BO2-z…/patch_mp/maps/mp/killstreaks/_turret_killstreak.gsc

2574 lines
72 KiB
Plaintext

#include maps/mp/animscripts/dog_flashed;
#include maps/mp/_scrambler;
#include maps/mp/killstreaks/_remote_weapons;
#include maps/mp/gametypes/_weaponobjects;
#include maps/mp/gametypes/_globallogic_audio;
#include maps/mp/_challenges;
#include maps/mp/_scoreevents;
#include maps/mp/gametypes/_damagefeedback;
#include maps/mp/gametypes/_globallogic_player;
#include maps/mp/gametypes/_spawning;
#include maps/mp/_hacker_tool;
#include maps/mp/_entityheadicons;
#include maps/mp/killstreaks/_killstreakrules;
#include maps/mp/killstreaks/_supplydrop;
#include maps/mp/killstreaks/_killstreaks;
#include maps/mp/gametypes/_tweakables;
#include maps/mp/_mgturret;
#include maps/mp/gametypes/_weapons;
#include maps/mp/gametypes/_hud_util;
#include common_scripts/utility;
#include maps/mp/_utility;
#using_animtree( "mp_microwaveturret" );
init()
{
precacheturret( "auto_gun_turret_mp" );
precacheturret( "microwave_turret_mp" );
precachemodel( "t6_wpn_turret_sentry_gun" );
precachemodel( "t6_wpn_turret_sentry_gun_yellow" );
precachemodel( "t6_wpn_turret_sentry_gun_red" );
precachemodel( "t6_wpn_turret_ads_world" );
precachemodel( "t6_wpn_turret_ads_carry" );
precachemodel( "t6_wpn_turret_ads_carry_animate" );
precachemodel( "t6_wpn_turret_ads_carry_animate_red" );
precachemodel( "t6_wpn_turret_ads_carry_red" );
precachemodel( "tag_microwavefx" );
precacheshellshock( "mp_radiation_high" );
precacheshellshock( "mp_radiation_med" );
precacheshellshock( "mp_radiation_low" );
precacheitem( "killstreak_remote_turret_mp" );
thread maps/mp/_mgturret::init_turret_difficulty_settings();
level.auto_turret_timeout = 240;
level.microwave_radius = 750;
level.microwave_turret_cone_dot = cos( 45 );
level.microwave_turret_angle = 90;
level.microwave_turret_damage = 10;
level.microwave_fx_size = 150;
flag_init( "end_target_confirm" );
level.auto_turret_settings = [];
level.microwaveopenanim = %o_hpm_open;
level.microwavecloseanim = %o_hpm_close;
level.microwavedestroyedanim = %o_hpm_destroyed;
level.auto_turret_settings[ "sentry" ] = spawnstruct();
level.auto_turret_settings[ "sentry" ].hintstring = &"KILLSTREAK_SENTRY_TURRET_PICKUP";
level.auto_turret_settings[ "sentry" ].hackerhintstring = &"KILLSTREAK_TURRET_HACKING";
level.auto_turret_settings[ "sentry" ].disablehintstring = &"KILLSTREAK_TURRET_SENTRY_DISABLE";
level.auto_turret_settings[ "sentry" ].hinticon = "hud_ks_auto_turret";
level.auto_turret_settings[ "sentry" ].modelbase = "t6_wpn_turret_sentry_gun";
level.auto_turret_settings[ "sentry" ].modelgoodplacement = "t6_wpn_turret_sentry_gun_yellow";
level.auto_turret_settings[ "sentry" ].modelbadplacement = "t6_wpn_turret_sentry_gun_red";
level.auto_turret_settings[ "sentry" ].stunfx = loadfx( "weapon/sentry_gun/fx_sentry_gun_emp_stun" );
level.auto_turret_settings[ "sentry" ].stunfxtag = "tag_origin";
level.auto_turret_settings[ "sentry" ].damagefx = loadfx( "weapon/sentry_gun/fx_sentry_gun_damage_state" );
level.auto_turret_settings[ "sentry" ].disablefx = loadfx( "weapon/sentry_gun/fx_sentry_gun_death_state" );
level.auto_turret_settings[ "sentry" ].explodefx = loadfx( "weapon/sentry_gun/fx_sentry_gun_exp" );
level.auto_turret_settings[ "sentry" ].stunfxfrequencymin = 0,1;
level.auto_turret_settings[ "sentry" ].stunfxfrequencymax = 0,75;
level.auto_turret_settings[ "sentry" ].turretinitdelay = 1,6;
level.auto_turret_settings[ "sentry" ].hackertoolradius = level.sentryhackertoolradius;
level.auto_turret_settings[ "sentry" ].hackertooltimems = level.sentryhackertooltimems;
level.auto_turret_settings[ "tow" ] = spawnstruct();
level.auto_turret_settings[ "tow" ].hintstring = &"KILLSTREAK_TOW_TURRET_PICKUP";
level.auto_turret_settings[ "tow" ].hackerhintstring = &"KILLSTREAK_TURRET_HACKING";
level.auto_turret_settings[ "tow" ].hinticon = "hud_ks_sam_turret";
level.auto_turret_settings[ "tow" ].modelbase = "t6_wpn_turret_sam";
level.auto_turret_settings[ "tow" ].modelgoodplacement = "t6_wpn_turret_sam_yellow";
level.auto_turret_settings[ "tow" ].modelbadplacement = "t6_wpn_turret_sam_red";
level.auto_turret_settings[ "tow" ].stunfx = loadfx( "weapon/grenade/fx_spark_disabled_weapon_lg" );
level.auto_turret_settings[ "tow" ].stunfxtag = "TAG_aim";
level.auto_turret_settings[ "tow" ].stunfxfrequencymin = 0,1;
level.auto_turret_settings[ "tow" ].stunfxfrequencymax = 0,75;
level.auto_turret_settings[ "tow" ].turretinitdelay = 3;
level.auto_turret_settings[ "tow" ].turretfiredelay = 5;
level.auto_turret_settings[ "microwave" ] = spawnstruct();
level.auto_turret_settings[ "microwave" ].hintstring = &"KILLSTREAK_MICROWAVE_TURRET_PICKUP";
level.auto_turret_settings[ "microwave" ].hackerhintstring = &"KILLSTREAK_TURRET_MICROWAVE_HACKING";
level.auto_turret_settings[ "microwave" ].disablehintstring = &"KILLSTREAK_TURRET_MICROWAVE_DISABLE";
level.auto_turret_settings[ "microwave" ].hinticon = "hud_ks_microwave_turret";
level.auto_turret_settings[ "microwave" ].modelbase = "t6_wpn_turret_ads_world";
level.auto_turret_settings[ "microwave" ].modelgoodplacement = "t6_wpn_turret_ads_carry";
level.auto_turret_settings[ "microwave" ].modelgoodplacementanimate = "t6_wpn_turret_ads_carry_animate";
level.auto_turret_settings[ "microwave" ].modelbadplacementanimate = "t6_wpn_turret_ads_carry_animate_red";
level.auto_turret_settings[ "microwave" ].modelbadplacement = "t6_wpn_turret_ads_carry_red";
level.auto_turret_settings[ "microwave" ].stunfx = loadfx( "weapon/silent_gaurdian/fx_sg_emp_stun" );
level.auto_turret_settings[ "microwave" ].loopsoundfx = "wpn_sguard_beam";
level.auto_turret_settings[ "microwave" ].stunfxtag = "tag_origin";
level.auto_turret_settings[ "microwave" ].damagefx = loadfx( "weapon/silent_gaurdian/fx_sg_damage_state" );
level.auto_turret_settings[ "microwave" ].disablefx = loadfx( "weapon/silent_gaurdian/fx_sg_death_state" );
level.auto_turret_settings[ "microwave" ].explodefx = loadfx( "weapon/silent_gaurdian/fx_sg_exp" );
level.auto_turret_settings[ "microwave" ].stunfxfrequencymin = 0,1;
level.auto_turret_settings[ "microwave" ].stunfxfrequencymax = 0,75;
level.auto_turret_settings[ "microwave" ].turretinitdelay = 1;
level.auto_turret_settings[ "microwave" ].timeout = 240;
level.auto_turret_settings[ "microwave" ].fxchecktime = 5;
level.auto_turret_settings[ "microwave" ].hackertoolradius = level.microwavehackertoolradius;
level.auto_turret_settings[ "microwave" ].hackertooltimems = level.microwavehackertooltimems;
level.auto_turret_settings[ "microwave" ].microwave_radius_1 = int( level.microwave_radius / 8 );
level.auto_turret_settings[ "microwave" ].microwave_radius_2 = int( level.microwave_radius / 2 );
level.auto_turret_settings[ "microwave" ].microwave_radius_3 = int( ( level.microwave_radius * 3 ) / 4 );
level.auto_turret_settings[ "microwave" ].microwave_radius_4 = int( level.microwave_radius );
level.auto_turret_settings[ "microwave" ].fx = loadfx( "weapon/silent_gaurdian/fx_sg_distortion_cone_ash" );
level._turret_explode_fx = loadfx( "explosions/fx_exp_equipment_lg" );
minefields = getentarray( "minefield", "targetname" );
hurt_triggers = getentarray( "trigger_hurt", "classname" );
level.fatal_triggers = arraycombine( minefields, hurt_triggers, 1, 0 );
level.noturretplacementtriggers = getentarray( "no_turret_placement", "targetname" );
level notify( "no_turret_trigger_created" );
if ( maps/mp/gametypes/_tweakables::gettweakablevalue( "killstreak", "allowauto_turret" ) )
{
maps/mp/killstreaks/_killstreaks::registerkillstreak( "autoturret_mp", "autoturret_mp", "killstreak_auto_turret", "auto_turret_used", ::usesentryturretkillstreak );
maps/mp/killstreaks/_killstreaks::registerkillstreakaltweapon( "autoturret_mp", "auto_gun_turret_mp" );
maps/mp/killstreaks/_killstreaks::registerkillstreakremoteoverrideweapon( "autoturret_mp", "killstreak_remote_turret_mp" );
maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "autoturret_mp", &"KILLSTREAK_EARNED_AUTO_TURRET", &"KILLSTREAK_AUTO_TURRET_NOT_AVAILABLE" );
maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "autoturret_mp", "mpl_killstreak_auto_turret", "kls_turret_used", "", "kls_turret_enemy", "", "kls_turret_ready" );
maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "autoturret_mp", "scr_giveautoturret" );
maps/mp/killstreaks/_killstreaks::registerkillstreak( "turret_drop_mp", "turret_drop_mp", "killstreak_auto_turret_drop", "auto_turret_used", ::usekillstreakturretdrop, undefined, 1 );
maps/mp/killstreaks/_killstreaks::registerkillstreakremoteoverrideweapon( "turret_drop_mp", "killstreak_remote_turret_mp" );
maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "turret_drop_mp", &"KILLSTREAK_EARNED_AUTO_TURRET", &"KILLSTREAK_AIRSPACE_FULL" );
maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "turret_drop_mp", "mpl_killstreak_turret", "kls_turret_used", "", "kls_turret_enemy", "", "kls_turret_ready" );
maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "turret_drop_mp", "scr_giveautoturretdrop" );
maps/mp/killstreaks/_supplydrop::registercratetype( "turret_drop_mp", "killstreak", "autoturret_mp", 1, &"KILLSTREAK_AUTO_TURRET_CRATE", undefined, "MEDAL_SHARE_PACKAGE_AUTO_TURRET", ::maps/mp/killstreaks/_supplydrop::givecratekillstreak );
level.killstreakicons[ "autoturret_mp" ] = "hud_ks_auto_turret";
maps/mp/killstreaks/_killstreaks::registerkillstreak( "microwaveturret_mp", "microwaveturret_mp", "killstreak_microwave_turret", "microwave_turret_used", ::usemicrowaveturretkillstreak );
maps/mp/killstreaks/_killstreaks::registerkillstreakaltweapon( "microwaveturret_mp", "microwave_turret_mp" );
maps/mp/killstreaks/_killstreaks::registerkillstreakaltweapon( "microwaveturret_mp", "microwave_turret_damage_mp" );
maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "microwaveturret_mp", &"KILLSTREAK_EARNED_MICROWAVE_TURRET", &"KILLSTREAK_MICROWAVE_TURRET_NOT_AVAILABLE" );
maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "microwaveturret_mp", "mpl_killstreak_auto_turret", "kls_microwave_used", "", "kls_microwave_enemy", "", "kls_microwave_ready" );
maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "microwaveturret_mp", "scr_givemicrowaveturret" );
maps/mp/killstreaks/_killstreaks::setkillstreakteamkillpenaltyscale( "microwaveturret_mp", level.teamkillreducedpenalty );
maps/mp/killstreaks/_killstreaks::registerkillstreak( "microwaveturret_drop_mp", "microwaveturret_drop_mp", "killstreak_microwave_turret_drop", "microwave_turret_used", ::usekillstreakturretdrop, undefined, 1 );
maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "microwaveturret_drop_mp", &"KILLSTREAK_EARNED_MICROWAVE_TURRET", &"KILLSTREAK_AIRSPACE_FULL" );
maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "microwaveturret_drop_mp", "mpl_killstreak_turret", "kls_microwave_used", "", "kls_microwave_enemy", "", "kls_microwave_ready" );
maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "microwaveturret_drop_mp", "scr_givemicrowaveturretdrop" );
maps/mp/killstreaks/_supplydrop::registercratetype( "microwaveturret_drop_mp", "killstreak", "microwaveturret_mp", 1, &"KILLSTREAK_MICROWAVE_TURRET_CRATE", undefined, "MEDAL_SHARE_PACKAGE_MICROWAVE_TURRET", ::maps/mp/killstreaks/_supplydrop::givecratekillstreak );
level.killstreakicons[ "microwaveturret_mp" ] = "hud_ks_microwave_turret";
}
level.turrets_headicon_offset = [];
level.turrets_headicon_offset[ "default" ] = vectorScale( ( 0, 0, 0 ), 70 );
level.turrets_headicon_offset[ "sentry" ] = vectorScale( ( 0, 0, 0 ), 70 );
level.turrets_headicon_offset[ "tow" ] = vectorScale( ( 0, 0, 0 ), 65 );
level.turrets_headicon_offset[ "microwave" ] = vectorScale( ( 0, 0, 0 ), 80 );
level.turrets_hacker_trigger_width = 72;
level.turrets_hacker_trigger_height = 96;
setdvar( "scr_turret_no_timeout", 0 );
setdvar( "turret_sentryTargetTime", 1500 );
setdvar( "turret_TargetLeadBias", 1,5 );
registerclientfield( "turret", "turret_microwave_sounds", 1000, 1, "int" );
}
usekillstreakturretdrop( hardpointtype )
{
if ( self maps/mp/killstreaks/_supplydrop::issupplydropgrenadeallowed( hardpointtype ) == 0 )
{
return 0;
}
result = self maps/mp/killstreaks/_supplydrop::usesupplydropmarker();
self notify( "supply_drop_marker_done" );
if ( !isDefined( result ) || !result )
{
return 0;
}
return result;
}
usesentryturretkillstreak( hardpointtype )
{
if ( self maps/mp/killstreaks/_killstreaks::isinteractingwithobject() )
{
return 0;
}
if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 )
{
return 0;
}
killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team );
if ( killstreak_id == -1 )
{
return 0;
}
turret = self usesentryturret( hardpointtype );
turret.killstreak_id = killstreak_id;
event = turret waittill_any_return( "turret_placed", "destroy_turret", "death", "turret_emped" );
if ( event == "turret_placed" )
{
level.globalkillstreakscalled++;
self addweaponstat( hardpointtype, "used", 1 );
return 1;
}
if ( event == "death" )
{
returnturrettoinventory( turret );
return 0;
}
if ( event == "turret_emped" )
{
level.globalkillstreakscalled++;
self addweaponstat( hardpointtype, "used", 1 );
turret notify( "destroy_turret" );
return 1;
}
return 0;
}
usetowturretkillstreak( hardpointtype )
{
if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 )
{
return 0;
}
killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team );
if ( killstreak_id == -1 )
{
return 0;
}
turret = self usetowturret( hardpointtype );
turret.killstreak_id = killstreak_id;
event = turret waittill_any_return( "turret_placed", "destroy_turret", "death", "turret_emped" );
if ( event == "turret_placed" )
{
return 1;
}
if ( event == "death" )
{
returnturrettoinventory( turret );
return 0;
}
if ( event == "turret_emped" )
{
turret notify( "destroy_turret" );
return 1;
}
return 0;
}
usemicrowaveturretkillstreak( hardpointtype )
{
if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 )
{
return 0;
}
if ( self maps/mp/killstreaks/_killstreaks::isinteractingwithobject() )
{
return 0;
}
killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team );
if ( killstreak_id == -1 )
{
return 0;
}
turret = self usemicrowaveturret( hardpointtype );
turret.killstreak_id = killstreak_id;
event = turret waittill_any_return( "turret_placed", "destroy_turret", "death", "turret_emped" );
if ( event == "turret_placed" )
{
level.globalkillstreakscalled++;
self addweaponstat( hardpointtype, "used", 1 );
return 1;
}
if ( event == "death" )
{
returnturrettoinventory( turret );
return 0;
}
if ( event == "turret_emped" )
{
level.globalkillstreakscalled++;
self addweaponstat( hardpointtype, "used", 1 );
turret notify( "destroy_turret" );
return 1;
}
return 0;
}
usesentryturret( hardpointtype )
{
self maps/mp/killstreaks/_killstreaks::switchtolastnonkillstreakweapon();
if ( isDefined( level.usingmomentum ) && !level.usingmomentum && !self maps/mp/killstreaks/_killstreaks::getiftopkillstreakhasbeenused() )
{
level.globalkillstreakscalled++;
self addweaponstat( hardpointtype, "used", 1 );
}
turret = spawnturret( "auto_turret", self.origin, "auto_gun_turret_mp" );
turret.turrettype = "sentry";
turret setturrettype( turret.turrettype );
turret setmodel( level.auto_turret_settings[ turret.turrettype ].modelgoodplacement );
turret.angles = self.angles;
turret.hardpointweapon = hardpointtype;
turret.hasbeenplanted = 0;
turret.waitfortargettobeginlifespan = 0;
self.turret_active = 0;
self.curr_time = -1;
turret.stunnedbytacticalgrenade = 0;
turret.stuntime = 0;
turret setturretowner( self );
turret setturretminimapvisible( 1 );
turret.isfrominventory = self.usingkillstreakfrominventory;
turret setdrawinfrared( 1 );
target_set( turret, vectorScale( ( 0, 0, 0 ), 40 ) );
turret.controlled = 0;
if ( !isDefined( self.numturrets ) )
{
self.numturrets = 1;
}
else
{
self.numturrets++;
}
turret.ownernumber = self.numturrets;
if ( level.teambased )
{
turret setturretteam( self.team );
turret.team = self.team;
}
else
{
turret setturretteam( "free" );
turret.team = "free";
}
setupturrethealth( turret );
turret.carried = 1;
turret.curr_time = 0;
turret.stunduration = 5;
turret.remotecontrolled = 0;
turret thread watchturretlifespan();
self thread watchownerdisconnect( turret );
self thread watchownerteamkillkicked( turret );
turret thread destroyturret();
turret thread turret_target_aquired_watch( self );
turret thread turret_target_lost_watch( self );
self thread startcarryturret( turret );
return turret;
}
usetowturret( hardpointtype )
{
self maps/mp/killstreaks/_killstreaks::switchtolastnonkillstreakweapon();
if ( isDefined( level.usingmomentum ) && !level.usingmomentum && !self maps/mp/killstreaks/_killstreaks::getiftopkillstreakhasbeenused() )
{
level.globalkillstreakscalled++;
self addweaponstat( hardpointtype, "used", 1 );
}
turret = spawnturret( "auto_turret", self.origin, "tow_turret_mp" );
turret.turrettype = "tow";
turret setturrettype( turret.turrettype );
turret setmodel( level.auto_turret_settings[ turret.turrettype ].modelgoodplacement );
turret.angles = self.angles;
turret.hardpointweapon = hardpointtype;
turret.hasbeenplanted = 0;
turret.waitfortargettobeginlifespan = 0;
turret.firetime = level.auto_turret_settings[ "tow" ].turretfiredelay;
self.turret_active = 0;
turret.stunnedbytacticalgrenade = 0;
turret.stuntime = 0;
turret setturretowner( self );
turret setturretminimapvisible( 1 );
turret.isfrominventory = self.usingkillstreakfrominventory;
if ( level.teambased )
{
turret setturretteam( self.team );
turret.team = self.team;
}
else
{
turret setturretteam( "free" );
turret.team = "free";
}
setupturrethealth( turret );
turret.carried = 1;
turret.curr_time = 0;
turret.stunduration = 5;
turret setscanningpitch( -35 );
turret thread watchturretlifespan();
self thread watchownerdisconnect( turret );
self thread watchownerteamkillkicked( turret );
turret thread destroyturret();
self thread startcarryturret( turret );
return turret;
}
usemicrowaveturret( hardpointtype )
{
self maps/mp/killstreaks/_killstreaks::switchtolastnonkillstreakweapon();
if ( isDefined( level.usingmomentum ) && !level.usingmomentum && !self maps/mp/killstreaks/_killstreaks::getiftopkillstreakhasbeenused() )
{
level.globalkillstreakscalled++;
self addweaponstat( hardpointtype, "used", 1 );
}
turret = spawnturret( "auto_turret", self.origin, "microwave_turret_mp" );
turret.turrettype = "microwave";
turret setturrettype( turret.turrettype );
turret setmodel( level.auto_turret_settings[ turret.turrettype ].modelgoodplacement );
turret.angles = self.angles;
turret.hardpointweapon = hardpointtype;
turret.hasbeenplanted = 0;
turret.waitfortargettobeginlifespan = 0;
self.turret_active = 0;
self.curr_time = -1;
turret.stunnedbytacticalgrenade = 0;
turret.stuntime = 0;
turret setturretowner( self );
turret setturretminimapvisible( 1 );
turret.isfrominventory = self.usingkillstreakfrominventory;
turret setdrawinfrared( 1 );
turret.controlled = 0;
turret.soundmod = "hpm";
target_set( turret, vectorScale( ( 0, 0, 0 ), 30 ) );
if ( level.teambased )
{
turret setturretteam( self.team );
turret.team = self.team;
}
else
{
turret setturretteam( "free" );
turret.team = "free";
}
setupturrethealth( turret );
turret.carried = 1;
turret.curr_time = 0;
turret.stunduration = 5;
turret thread watchturretlifespan();
self thread watchownerdisconnect( turret );
turret thread destroyturret();
self thread startcarryturret( turret );
return turret;
}
watchroundandgameend( turret )
{
self endon( "disconnect" );
turret notify( "watchRoundAndGameEnd" );
turret endon( "watchRoundAndGameEnd" );
turret endon( "destroy_turret" );
turret endon( "hacked" );
turret endon( "death" );
level waittill( "game_ended" );
self stopcarryturret( turret );
turret notify( "destroy_turret" );
}
giveturretback( turret )
{
if ( isDefined( level.usingmomentum ) || !level.usingmomentum && isDefined( turret.isfrominventory ) && turret.isfrominventory )
{
maps/mp/killstreaks/_killstreaks::givekillstreak( turret.hardpointweapon, undefined, undefined, 1 );
}
}
watchownerdeath( turret )
{
self endon( "disconnect" );
turret endon( "turret_placed" );
turret endon( "destroy_turret" );
turret endon( "hacked" );
self waittill( "death" );
if ( !turret.hasbeenplanted )
{
self returnturrettoinventory( turret );
}
else if ( turret.canbeplaced && turret.carried )
{
if ( level.teambased && self.team != turret.team )
{
self stopcarryturret( turret );
turret notify( "destroy_turret" );
}
else
{
placement = self canplayerplaceturret( turret );
if ( placement[ "result" ] )
{
turret.origin = placement[ "origin" ];
turret.angles = placement[ "angles" ];
self placeturret( turret );
}
else
{
if ( isDefined( turret ) )
{
self stopcarryturret( turret );
turret notify( "destroy_turret" );
}
}
}
}
else
{
if ( isDefined( turret ) )
{
self stopcarryturret( turret );
turret notify( "destroy_turret" );
}
}
}
returnturrettoinventory( turret )
{
if ( level.teambased && self.team != turret.team )
{
if ( isDefined( turret ) )
{
self stopcarryturret( turret );
turret notify( "destroy_turret" );
}
}
else
{
if ( isDefined( turret ) )
{
turret setturretcarried( 0 );
self stopcarryturret( turret );
turret notify( "destroy_turret" );
}
self _enableweapon();
}
}
watchowneremp( turret )
{
self endon( "disconnect" );
self endon( "death" );
turret endon( "turret_placed" );
turret endon( "destroy_turret" );
turret endon( "hacked" );
while ( 1 )
{
self waittill( "emp_jammed" );
if ( !turret.hasbeenplanted )
{
turret setturretcarried( 0 );
self stopcarryturret( turret );
self _enableweapon();
self takeweapon( turret.hardpointweapon );
turret notify( "turret_emped" );
continue;
}
else if ( turret.canbeplaced && turret.carried )
{
self placeturret( turret );
continue;
}
else
{
if ( isDefined( turret ) )
{
self stopcarryturret( turret );
turret notify( "turret_emped" );
}
}
}
}
watchownerteamkillkicked( turret )
{
turret endon( "turret_deactivated" );
turret endon( "hacked" );
turret endon( "destroy_turret" );
self waittill( "teamKillKicked" );
if ( isDefined( turret ) )
{
turret notify( "destroy_turret" );
}
}
watchownerdisconnect( turret )
{
turret endon( "turret_deactivated" );
turret endon( "hacked" );
self waittill_any( "disconnect", "joined_team" );
if ( isDefined( turret ) )
{
turret notify( "destroy_turret" );
}
}
startcarryturret( turret )
{
turret maketurretunusable();
turret setturretcarried( 1 );
self _disableweapon();
turret stoploopsound();
turret setmode( "auto_ai" );
if ( turret.turrettype == "sentry" )
{
turret notify( "stop_burst_fire_unmanned" );
}
else if ( turret.turrettype == "tow" )
{
turret notify( "target_lost" );
}
else
{
if ( turret.turrettype == "microwave" )
{
turret notify( "stop_microwave" );
}
}
turret.carried = 1;
if ( turret.hasbeenplanted )
{
level notify( "drop_objects_to_ground" );
}
self carryturret( turret, vectorScale( ( 0, 0, 0 ), 40 ), ( 0, 0, 0 ) );
self thread watchownerdeath( turret );
self thread watchowneremp( turret );
self thread watchroundandgameend( turret );
turret maps/mp/_entityheadicons::destroyentityheadicons();
turret setturretowner( self );
turret setdefaultdroppitch( -90 );
if ( !turret.hasbeenplanted )
{
self thread watchreturnturrettoinventory( turret );
}
self thread updateturretplacement( turret );
self thread watchturretplacement( turret );
if ( turret.turrettype == "microwave" )
{
turret clearclientflag( 2 );
turret setclientflag( 3 );
self playsoundtoplayer( "mpl_turret_micro_startup", self );
}
turret notify( "turret_carried" );
turret notify( "turret_target_lost" );
}
watchreturnturrettoinventory( turret )
{
self endon( "death" );
self endon( "entering_last_stand" );
self endon( "disconnect" );
turret endon( "turret_placed" );
turret endon( "turret_deactivated" );
wait 0,05;
while ( 1 )
{
if ( self actionslotfourbuttonpressed() )
{
returnturrettoinventory( turret );
return;
}
wait 0,05;
}
}
updateturretplacement( turret )
{
self endon( "death" );
self endon( "entering_last_stand" );
self endon( "disconnect" );
turret endon( "turret_placed" );
turret endon( "turret_deactivated" );
lastplacedturret = -1;
turret.canbeplaced = 0;
firstmodel = 1;
while ( 1 )
{
placement = self canplayerplaceturret( turret );
turret.origin = placement[ "origin" ];
turret.angles = placement[ "angles" ];
good_spot_check = placement[ "result" ] & !turret turretinhurttrigger() & !turret turretinnoturretplacementtrigger();
turret.canbeplaced = good_spot_check;
if ( turret.canbeplaced != lastplacedturret && turret.turrettype == "microwave" && firstmodel != 1 )
{
if ( good_spot_check )
{
turret setmodel( level.auto_turret_settings[ turret.turrettype ].modelgoodplacement );
}
else
{
turret setmodel( level.auto_turret_settings[ turret.turrettype ].modelbadplacement );
}
lastplacedturret = turret.canbeplaced;
}
if ( turret.turrettype == "microwave" && firstmodel == 1 )
{
if ( turret.canbeplaced )
{
turret setmodel( level.auto_turret_settings[ turret.turrettype ].modelgoodplacementanimate );
}
else
{
turret setmodel( level.auto_turret_settings[ turret.turrettype ].modelbadplacementanimate );
}
firstmodel = 0;
lastplacedturret = turret.canbeplaced;
}
wait 0,05;
}
}
turretinhurttrigger()
{
i = 0;
while ( i < level.fatal_triggers.size )
{
if ( self istouching( level.fatal_triggers[ i ] ) )
{
return 1;
}
i++;
}
return 0;
}
turretinnoturretplacementtrigger()
{
i = 0;
while ( i < level.noturretplacementtriggers.size )
{
if ( self istouching( level.noturretplacementtriggers[ i ] ) )
{
return 1;
}
i++;
}
return 0;
}
watchturretplacement( turret )
{
self endon( "disconnect" );
self endon( "death" );
self endon( "entering_last_stand" );
turret endon( "turret_placed" );
turret endon( "turret_deactivated" );
while ( self attackbuttonpressed() )
{
wait 0,05;
}
while ( 1 )
{
if ( self attackbuttonpressed() && turret.canbeplaced )
{
placement = self canplayerplaceturret( turret );
if ( placement[ "result" ] )
{
turret.origin = placement[ "origin" ];
turret.angles = placement[ "angles" ];
self placeturret( turret );
}
}
wait 0,05;
}
}
placeturret( turret )
{
if ( !turret.carried || !turret.canbeplaced )
{
return;
}
turret setturretcarried( 0 );
self stopcarryturret( turret, turret.origin, turret.angles );
turret spawnturretpickuptrigger( self );
turret maps/mp/_hacker_tool::registerwithhackertool( level.auto_turret_settings[ turret.turrettype ].hackertoolradius, level.auto_turret_settings[ turret.turrettype ].hackertooltimems );
self thread initturret( turret );
self _enableweapon();
turret.carried = 0;
turret.hasbeenplanted = 1;
if ( turret.stunnedbytacticalgrenade )
{
turret thread stunturrettacticalgrenade( turret.stunduration );
}
if ( isDefined( level.auto_turret_settings[ turret.turrettype ].loopsoundfx ) )
{
turret playloopsound( level.auto_turret_settings[ turret.turrettype ].loopsoundfx );
}
self playrumbleonentity( "damage_heavy" );
turret notify( "turret_placed" );
}
initturret( turret )
{
maps/mp/_mgturret::turret_set_difficulty( turret, "fu" );
turret setmodel( level.auto_turret_settings[ turret.turrettype ].modelbase );
if ( turret.turrettype == "microwave" )
{
turret clearclientflag( 3 );
turret setclientflag( 2 );
}
turret setforcenocull();
turret playsound( "mpl_turret_startup" );
if ( level.teambased )
{
offset = level.turrets_headicon_offset[ "default" ];
if ( isDefined( level.turrets_headicon_offset[ turret.turrettype ] ) )
{
offset = level.turrets_headicon_offset[ turret.turrettype ];
}
turret maps/mp/_entityheadicons::setentityheadicon( self.pers[ "team" ], self, offset );
}
turret maketurretunusable();
turret setmode( "auto_nonai" );
turret setturretowner( self );
turret.owner = self;
turret setdefaultdroppitch( 45 );
turret.dangerous_nodes = [];
if ( turret.turrettype == "sentry" )
{
turret thread turret_sentry_think( self );
}
else if ( turret.turrettype == "tow" )
{
turret thread turret_tow_think( self );
}
else
{
if ( turret.turrettype == "microwave" )
{
turret thread turret_microwave_think( self );
}
}
turret.turret_active = 1;
turret.spawninfluencerid = maps/mp/gametypes/_spawning::create_auto_turret_influencer( turret.origin, turret.team, turret.angles );
turret.spawninfluencercloseid = maps/mp/gametypes/_spawning::create_auto_turret_influencer_close( turret.origin, turret.team, turret.angles );
turret thread watchdamage();
turret thread checkforstundamage();
wait 1;
flag_set( "end_target_confirm" );
}
setupturrethealth( turret )
{
turret.health = 100000;
turret.maxhealth = 650;
turret.bulletdamagereduction = 0,6;
turret.explosivedamagereduction = 2;
}
watchdamage()
{
self endon( "turret_deactivated" );
medalgiven = 0;
if ( !isDefined( self.damagetaken ) )
{
self.damagetaken = 0;
}
low_health = 0;
if ( self.damagetaken > ( self.maxhealth / 1,8 ) )
{
playfxontag( level.auto_turret_settings[ self.turrettype ].damagefx, self, level.auto_turret_settings[ self.turrettype ].stunfxtag );
low_health = 1;
}
for ( ;; )
{
self waittill( "damage", damage, attacker, direction, point, type, tagname, modelname, partname, weaponname );
if ( type == "MOD_CRUSH" )
{
self.skipfutz = 1;
self notify( "destroy_turret" );
return;
}
if ( !isDefined( attacker ) )
{
continue;
}
else allowperks = 1;
if ( !isplayer( attacker ) )
{
if ( isDefined( attacker.owner ) && isplayer( attacker.owner ) )
{
attacker = attacker.owner;
allowperks = 0;
}
}
if ( isplayer( attacker ) && level.teambased && isDefined( attacker.team ) && self.team == attacker.team && level.friendlyfire == 0 )
{
continue;
}
else
{
if ( !level.teambased && !level.hardcoremode )
{
if ( self.owner == attacker )
{
break;
}
}
else if ( self.turrettype == "microwave" && partname == "tag_shield" )
{
self.health += damage;
break;
}
else damagetakenbefore = self.damagetaken;
if ( type != "MOD_PISTOL_BULLET" || type == "MOD_RIFLE_BULLET" && type == "MOD_PROJECTILE_SPLASH" && isexplosivebulletweapon( weaponname ) )
{
if ( allowperks && attacker hasperk( "specialty_armorpiercing" ) )
{
damage += int( damage * level.cac_armorpiercing_data );
}
if ( weaponclass( weaponname ) == "spread" )
{
damage *= 5;
}
self.damagetaken += self.bulletdamagereduction * damage;
}
else
{
if ( weaponname != "remote_missile_missile_mp" || weaponname == "remote_mortar_mp" && weaponname == "missile_drone_projectile_mp" )
{
self.damagetaken += damage * 10;
break;
}
else
{
if ( type == "MOD_PROJECTILE" || weaponname == "smaw_mp" && weaponname == "fhj18_mp" )
{
self.damagetaken += 200 * self.explosivedamagereduction;
break;
}
else
{
if ( type != "MOD_PROJECTILE" && type != "MOD_GRENADE_SPLASH" && type == "MOD_PROJECTILE_SPLASH" && damage != 0 && weaponname != "emp_grenade_mp" && !isexplosivebulletweapon( weaponname ) )
{
self.damagetaken += self.explosivedamagereduction * damage;
break;
}
else
{
if ( type == "MOD_MELEE" )
{
if ( isplayer( attacker ) )
{
attacker playlocalsound( "fly_riotshield_impact_knife" );
}
break;
}
else if ( isDefined( weaponname ) && weaponname == "emp_grenade_mp" && type == "MOD_GRENADE_SPLASH" )
{
self.damagetaken += self.maxhealth;
break;
}
else
{
self.damagetaken += damage;
}
}
}
}
}
damagedealt = self.damagetaken - damagetakenbefore;
if ( damagedealt > 0 && isDefined( self.controlled ) && self.controlled )
{
self.owner sendkillstreakdamageevent( int( damagedealt ) );
}
if ( isDefined( weaponname ) && type == "MOD_GRENADE_SPLASH" )
{
switch( weaponname )
{
case "emp_grenade_mp":
if ( !self.stunnedbytacticalgrenade )
{
self thread stunturrettacticalgrenade( self.stunduration );
}
if ( level.teambased && self.owner.team != attacker.team )
{
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
{
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback( type );
}
}
else
{
if ( !level.teambased && self.owner != attacker )
{
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
{
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback( type );
}
}
}
break;
default:
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
{
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback( type );
}
break;
}
}
else
{
if ( isDefined( weaponname ) )
{
if ( maps/mp/gametypes/_globallogic_player::dodamagefeedback( weaponname, attacker ) )
{
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback( type );
}
}
}
if ( self.damagetaken >= self.maxhealth )
{
if ( self isenemyplayer( attacker ) && self.owner != attacker )
{
if ( self.turrettype == "sentry" )
{
maps/mp/_scoreevents::processscoreevent( "destroyed_sentry_gun", attacker, self, weaponname );
}
else
{
if ( self.turrettype == "microwave" )
{
maps/mp/_scoreevents::processscoreevent( "destroyed_microwave_turret", attacker, self, weaponname );
}
}
attacker maps/mp/_challenges::destroyedturret( weaponname );
if ( isDefined( self.hardpointweapon ) )
{
level.globalkillstreaksdestroyed++;
attacker addweaponstat( self.hardpointweapon, "destroyed", 1 );
}
if ( isDefined( self.controlled ) && self.controlled )
{
attacker addweaponstat( weaponname, "destroyed_controlled_killstreak", 1 );
}
}
owner = self.owner;
if ( self.turrettype == "sentry" )
{
owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "sentry_destroyed", "item_destroyed" );
}
else
{
if ( self.turrettype == "microwave" )
{
owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "microwave_destroyed", "item_destroyed" );
}
}
owner stopcarryturret( self );
self.damagetaken = self.health;
self.dead = 1;
self notify( "destroy_turret" );
}
if ( !low_health && self.damagetaken > ( self.maxhealth / 1,8 ) )
{
playfxontag( level.auto_turret_settings[ self.turrettype ].damagefx, self, level.auto_turret_settings[ self.turrettype ].stunfxtag );
low_health = 1;
}
}
}
}
watchturretlifespan( turret )
{
self endon( "turret_deactivated" );
self endon( "death" );
while ( 1 )
{
timeout = level.auto_turret_timeout;
if ( isDefined( turret ) && isDefined( level.auto_turret_settings[ turret.turrettype ].timeout ) )
{
timeout = level.auto_turret_settings[ turret.turrettype ].timeout;
}
if ( self.curr_time > timeout )
{
break;
}
else
{
while ( self.waitfortargettobeginlifespan )
{
wait 0,1;
}
if ( ( self.curr_time + 2 ) > level.auto_turret_timeout )
{
self deleteturretusetrigger();
}
if ( !self.carried )
{
self.curr_time += 1;
}
wait 1;
}
}
shouldtimeout = getDvar( "scr_turret_no_timeout" );
if ( shouldtimeout == "1" )
{
return;
}
self notify( "destroy_turret" );
}
checkforstundamage()
{
self endon( "turret_deactivated" );
while ( 1 )
{
self waittill( "damage_caused_by", weapon );
if ( isstunweapon( weapon ) && !self.stunnedbytacticalgrenade )
{
self thread stunturrettacticalgrenade( self.stunduration );
}
}
}
stunturrettacticalgrenade( duration )
{
self endon( "turret_deactivated" );
self setmode( "auto_ai" );
self notify( "stop_burst_fire_unmanned" );
if ( self maps/mp/gametypes/_weaponobjects::isstunned() )
{
return;
}
self.stunnedbytacticalgrenade = 1;
self thread stunturretfx( duration, 0, 1 );
if ( self.turrettype == "microwave" )
{
self clearclientflag( 2 );
self setclientflag( 3 );
self notify( "microwave_end_fx" );
}
if ( isDefined( self.controlled ) && self.controlled )
{
self.owner freezecontrols( 1 );
}
if ( isDefined( self.owner.fullscreen_static ) )
{
self.owner thread maps/mp/killstreaks/_remote_weapons::stunstaticfx( duration );
}
while ( self.stunnedbytacticalgrenade )
{
while ( 1 )
{
if ( self.stuntime >= duration )
{
break;
}
else
{
if ( self.carried )
{
return;
}
self.stuntime += 0,1;
wait 0,1;
}
}
}
self.stunnedbytacticalgrenade = 0;
self.stuntime = 0;
if ( isDefined( self.controlled ) && self.controlled )
{
self.owner freezecontrols( 0 );
}
if ( !self.carried )
{
self setmode( "auto_nonai" );
}
if ( self.turrettype != "tow" && !self.carried && !self.controlled )
{
self thread maps/mp/_mgturret::burst_fire_unmanned();
}
if ( self.turrettype == "microwave" && !self.carried )
{
self clearclientflag( 3 );
self setclientflag( 2 );
wait 0,5;
self thread microwave_fx();
}
self notify( "turret_stun_ended" );
}
stunturret( duration, isdead, isemp )
{
self endon( "turret_deactivated" );
self setmode( "auto_ai" );
self notify( "stop_burst_fire_unmanned" );
self thread stunturretfx( duration, isdead, isemp );
if ( isDefined( self.controlled ) && self.controlled && isDefined( self.owner ) )
{
self.owner freezecontrols( 1 );
}
if ( self.turrettype == "microwave" )
{
self clearclientflag( 2 );
self setclientflag( 4 );
}
if ( isDefined( duration ) )
{
wait duration;
}
else
{
return;
}
if ( isDefined( self.controlled ) && self.controlled && isDefined( self.owner ) )
{
self.owner freezecontrols( 0 );
}
if ( !self.carried )
{
self setmode( "auto_nonai" );
}
if ( self.turrettype != "tow" && !self.carried && !self.controlled )
{
self thread maps/mp/_mgturret::burst_fire_unmanned();
}
self notify( "turret_stun_ended" );
level notify( "turret_stun_ended" );
}
stunfxthink( fx )
{
fx endon( "death" );
self stoploopsound();
self waittill_any( "death", "turret_stun_ended", "turret_deactivated", "hacked", "turret_carried" );
if ( isDefined( self ) )
{
if ( isDefined( level.auto_turret_settings[ self.turrettype ].loopsoundfx ) )
{
self playloopsound( level.auto_turret_settings[ self.turrettype ].loopsoundfx );
}
}
fx delete();
}
stunturretfx( duration, isdead, isemp )
{
self endon( "turret_deactivated" );
self endon( "death" );
self endon( "turret_stun_ended" );
origin = self gettagorigin( level.auto_turret_settings[ self.turrettype ].stunfxtag );
self.stun_fx = spawn( "script_model", origin );
self.stun_fx setmodel( "tag_origin" );
self thread stunfxthink( self.stun_fx );
wait 0,1;
self.stun_fx playsound( "dst_disable_spark" );
time = 0;
while ( time < duration )
{
if ( ( int( time * 10 ) % 20 ) == 0 )
{
if ( isDefined( isdead ) && isdead )
{
playfxontag( level.auto_turret_settings[ self.turrettype ].disablefx, self.stun_fx, "tag_origin" );
}
if ( isDefined( isemp ) && isemp )
{
playfxontag( level.auto_turret_settings[ self.turrettype ].stunfx, self.stun_fx, "tag_origin" );
}
}
wait 0,25;
time += 0,25;
}
}
isstunweapon( weapon )
{
switch( weapon )
{
case "emp_grenade_mp":
return 1;
default:
return 0;
}
}
scramblerstun( stun )
{
if ( stun )
{
self thread stunturret( 0, 1 );
}
else
{
self setmode( "auto_nonai" );
if ( self.turrettype != "tow" && !self.controlled )
{
self thread maps/mp/_mgturret::burst_fire_unmanned();
}
self notify( "turret_stun_ended" );
level notify( "turret_stun_ended" );
}
}
watchscramble()
{
self endon( "death" );
self endon( "turret_deactivated" );
self endon( "turret_carried" );
if ( self maps/mp/_scrambler::checkscramblerstun() )
{
self thread scramblerstun( 1 );
}
for ( ;; )
{
level waittill_any( "scrambler_spawn", "scrambler_death", "hacked", "turret_stun_ended" );
wait 0,05;
if ( self maps/mp/_scrambler::checkscramblerstun() )
{
self thread scramblerstun( 1 );
continue;
}
else
{
self scramblerstun( 0 );
}
}
}
destroyturret()
{
self waittill( "destroy_turret", playdeathanim );
self remove_turret_dangerous_nodes();
if ( self.turrettype == "sentry" )
{
maps/mp/killstreaks/_killstreakrules::killstreakstop( "autoturret_mp", self.team, self.killstreak_id );
if ( isDefined( self.owner ) && isDefined( self.owner.remoteweapon ) )
{
if ( self == self.owner.remoteweapon )
{
self notify( "removed_on_death" );
self.owner notify( "remove_remote_weapon" );
}
}
else
{
if ( isDefined( self.owner ) && !isDefined( self.owner.remoteweapon ) )
{
self.owner notify( "find_remote_weapon" );
}
}
}
else if ( self.turrettype == "tow" )
{
maps/mp/killstreaks/_killstreakrules::killstreakstop( "auto_tow_mp", self.team, self.killstreak_id );
}
else
{
if ( self.turrettype == "microwave" )
{
self notify( "microwave_end_fx" );
maps/mp/killstreaks/_killstreakrules::killstreakstop( "microwaveturret_mp", self.team, self.killstreak_id );
}
}
if ( isDefined( self.controlled ) && self.controlled == 1 && isDefined( self.owner ) )
{
self.owner sendkillstreakdamageevent( 600 );
self.owner destroy_remote_hud();
}
self.turret_active = 0;
self.curr_time = -1;
self setmode( "auto_ai" );
self notify( "stop_burst_fire_unmanned" );
self notify( "turret_deactivated" );
self deleteturretusetrigger();
if ( isDefined( playdeathanim ) && playdeathanim && !self.carried )
{
self playsound( "dst_equipment_destroy" );
self stunturret( self.stunduration, 1, self.stunnedbytacticalgrenade );
}
level notify( "drop_objects_to_ground" );
if ( isDefined( self.spawninfluencerid ) )
{
removeinfluencer( self.spawninfluencerid );
self.spawninfluencerid = undefined;
}
if ( isDefined( self.spawninfluencercloseid ) )
{
removeinfluencer( self.spawninfluencercloseid );
self.spawninfluencercloseid = undefined;
}
self setturretminimapvisible( 0 );
self laseroff();
wait 0,1;
if ( isDefined( self ) )
{
if ( self.hasbeenplanted )
{
playfx( level.auto_turret_settings[ self.turrettype ].explodefx, self.origin, self.angles );
self playsound( "mpl_turret_exp" );
}
if ( self.carried && isDefined( self.owner ) )
{
self.owner stopcarryturret( self );
self.owner _enableweapon();
}
self delete();
}
}
deleteturretusetrigger()
{
self remove_turret_dangerous_nodes();
if ( isDefined( self.pickuptrigger ) )
{
self.pickuptrigger delete();
}
if ( isDefined( self.hackertrigger ) )
{
if ( isDefined( self.hackertrigger.progressbar ) )
{
self.hackertrigger.progressbar destroyelem();
self.hackertrigger.progresstext destroyelem();
}
self.hackertrigger delete();
}
if ( isDefined( self.disabletrigger ) )
{
if ( isDefined( self.disabletrigger.progressbar ) )
{
self.disabletrigger.progressbar destroyelem();
self.disabletrigger.progresstext destroyelem();
}
self.disabletrigger delete();
}
}
spawnturretpickuptrigger( player )
{
pos = self.origin + vectorScale( ( 0, 0, 0 ), 15 );
self.pickuptrigger = spawn( "trigger_radius_use", pos );
self.pickuptrigger setcursorhint( "HINT_NOICON", self );
if ( isDefined( level.auto_turret_settings[ self.turrettype ].hintstring ) )
{
self.pickuptrigger sethintstring( level.auto_turret_settings[ self.turrettype ].hintstring );
}
else
{
self.pickuptrigger sethintstring( &"MP_GENERIC_PICKUP" );
}
if ( level.teambased )
{
self.pickuptrigger setteamfortrigger( player.team );
}
player clientclaimtrigger( self.pickuptrigger );
self thread watchturretuse( self.pickuptrigger );
}
watchturretuse( trigger )
{
self endon( "delete" );
self endon( "turret_deactivated" );
self endon( "turret_carried" );
while ( 1 )
{
trigger waittill( "trigger", player );
while ( !isalive( player ) )
{
continue;
}
while ( player isusingoffhand() )
{
continue;
}
while ( !player isonground() )
{
continue;
}
if ( isDefined( trigger.triggerteam ) && player.team != trigger.triggerteam )
{
continue;
}
if ( isDefined( trigger.claimedby ) && player != trigger.claimedby )
{
continue;
}
if ( player usebuttonpressed() && !player.throwinggrenade && !player meleebuttonpressed() && !player attackbuttonpressed() && !player maps/mp/killstreaks/_killstreaks::isinteractingwithobject() && !player isremotecontrolling() )
{
if ( isDefined( self.spawninfluencerid ) )
{
removeinfluencer( self.spawninfluencerid );
self.spawninfluencerid = undefined;
}
if ( isDefined( self.spawninfluencercloseid ) )
{
removeinfluencer( self.spawninfluencercloseid );
self.spawninfluencercloseid = undefined;
}
player playrumbleonentity( "damage_heavy" );
self playsound( "mpl_turret_down" );
self deleteturretusetrigger();
if ( self.turrettype == "microwave" )
{
self notify( "microwave_end_fx" );
}
if ( isDefined( player.remoteweapon ) && player.remoteweapon == self )
{
player notify( "remove_remote_weapon" );
}
player thread startcarryturret( self );
self deleteturretusetrigger();
}
}
}
turret_target_aquired_watch( player )
{
level endon( "game_ended" );
self endon( "death" );
self endon( "destroy_turret" );
player endon( "disconnect" );
for ( ;; )
{
self waittill( "turret_target_aquired" );
if ( !self.remotecontrolled )
{
self laseron();
}
}
}
turret_target_lost_watch( player )
{
level endon( "game_ended" );
self endon( "death" );
self endon( "destroy_turret" );
player endon( "disconnect" );
for ( ;; )
{
self waittill( "turret_target_lost" );
if ( !self.remotecontrolled )
{
self laseroff();
}
}
}
turret_sentry_think( player )
{
self endon( "destroy_turret" );
self.pickuptrigger endon( "trigger" );
player maps/mp/killstreaks/_remote_weapons::initremoteweapon( self, "killstreak_remote_turret_mp" );
wait level.auto_turret_settings[ self.turrettype ].turretinitdelay;
self thread maps/mp/_mgturret::burst_fire_unmanned();
}
turret_tow_think( player )
{
self endon( "turret_deactivated" );
self endon( "death" );
player endon( "disconnect" );
level endon( "game_ended" );
turretstate = "started";
self thread missile_fired_notify();
wait level.auto_turret_settings[ self.turrettype ].turretinitdelay;
while ( 1 )
{
if ( self isfiringturret() && turretstate != "firing" )
{
turretstate = "firing";
self playsound( "mpl_turret_alert" );
self thread do_tow_shoot( player );
}
else
{
self notify( "target_lost" );
turretstate = "scanning";
}
self waittill( "turretstatechange" );
self notify( "target_lost" );
}
}
deletetriggeronparentdeath( trigger )
{
self waittill( "death" );
if ( isDefined( trigger ) )
{
trigger delete();
}
}
doesmicrowaveturretaffectentity( entity )
{
if ( !isalive( entity ) )
{
return 0;
}
if ( !isplayer( entity ) && !isai( entity ) )
{
return 0;
}
if ( isDefined( self.carried ) && self.carried )
{
return 0;
}
if ( self maps/mp/gametypes/_weaponobjects::isstunned() )
{
return 0;
}
if ( isDefined( self.owner ) && entity == self.owner )
{
return 0;
}
if ( !maps/mp/gametypes/_weaponobjects::friendlyfirecheck( self.owner, entity, 0 ) )
{
return 0;
}
if ( distancesquared( entity.origin, self.origin ) > ( level.microwave_radius * level.microwave_radius ) )
{
return 0;
}
entdirection = vectornormalize( entity.origin - self.origin );
forward = anglesToForward( self.angles );
dot = vectordot( entdirection, forward );
if ( dot < level.microwave_turret_cone_dot )
{
return 0;
}
pitchdifference = int( abs( vectorToAngle( entdirection )[ 0 ] - self.angles[ 0 ] ) ) % 360;
if ( pitchdifference > 15 && pitchdifference < 345 )
{
return 0;
}
if ( entity damageconetrace( self.origin + vectorScale( ( 0, 0, 0 ), 40 ), self ) <= 0 )
{
return 0;
}
return 1;
}
microwaveentity( entity )
{
entity endon( "disconnect" );
entity.beingmicrowaved = 1;
entity.beingmicrowavedby = self.owner;
entity.microwaveeffect = 0;
for ( ;; )
{
if ( !isDefined( self ) || !self doesmicrowaveturretaffectentity( entity ) )
{
if ( !isDefined( entity ) )
{
return;
}
entity.beingmicrowaved = 0;
entity.beingmicrowavedby = undefined;
if ( isDefined( entity.microwavepoisoning ) && entity.microwavepoisoning )
{
entity.microwavepoisoning = 0;
}
return;
}
damage = level.microwave_turret_damage;
if ( level.hardcoremode )
{
damage /= 2;
}
if ( !isai( entity ) && entity mayapplyscreeneffect() )
{
if ( !isDefined( entity.microwavepoisoning ) || !entity.microwavepoisoning )
{
entity.microwavepoisoning = 1;
entity.microwaveeffect = 0;
}
}
entity dodamage( damage, self.origin, self.owner, self, 0, "MOD_TRIGGER_HURT", 0, "microwave_turret_mp" );
entity.microwaveeffect++;
if ( isplayer( entity ) && !entity isremotecontrolling() )
{
if ( ( entity.microwaveeffect % 2 ) == 1 )
{
if ( distancesquared( entity.origin, self.origin ) > ( ( ( level.microwave_radius * 2 ) / 3 ) * ( ( level.microwave_radius * 2 ) / 3 ) ) )
{
entity shellshock( "mp_radiation_low", 1,5 );
entity viewkick( 25, self.origin );
break;
}
else if ( distancesquared( entity.origin, self.origin ) > ( ( ( level.microwave_radius * 1 ) / 3 ) * ( ( level.microwave_radius * 1 ) / 3 ) ) )
{
entity shellshock( "mp_radiation_med", 1,5 );
entity viewkick( 50, self.origin );
break;
}
else
{
entity shellshock( "mp_radiation_high", 1,5 );
entity viewkick( 75, self.origin );
}
}
if ( ( entity.microwaveeffect % 3 ) == 2 )
{
maps/mp/_scoreevents::processscoreevent( "hpm_suppress", self.owner, entity );
}
}
wait 0,5;
}
}
turret_microwave_think( player )
{
self endon( "death" );
level endon( "game_ended" );
self endon( "stop_microwave" );
self endon( "destroy_turret" );
wait level.auto_turret_settings[ self.turrettype ].turretinitdelay;
trigger = spawn( "trigger_radius", self.origin + ( 0, 0, level.microwave_radius * -1 ), level.aitriggerspawnflags | level.vehicletriggerspawnflags, level.microwave_radius, level.microwave_radius * 2 );
trigger enablelinkto();
trigger linkto( self );
self thread deletetriggeronparentdeath( trigger );
self thread microwave_fx();
self thread turret_microwave_watchfordogs( trigger, player );
for ( ;; )
{
trigger waittill( "trigger", ent );
if ( !isDefined( ent.beingmicrowaved ) || !ent.beingmicrowaved )
{
self thread microwaveentity( ent );
}
}
}
turret_microwave_watchfordogs( trigger, player )
{
self endon( "death" );
level endon( "game_ended" );
self endon( "stop_microwave" );
self endon( "destroy_turret" );
damage = level.microwave_turret_damage;
for ( ;; )
{
dogs = getentarray( "attack_dog", "targetname" );
_a1893 = dogs;
_k1893 = getFirstArrayKey( _a1893 );
while ( isDefined( _k1893 ) )
{
dog = _a1893[ _k1893 ];
if ( dog.aiteam == player.team )
{
}
else if ( dog istouching( trigger ) == 0 )
{
}
else if ( self doesmicrowaveturretaffectdog( dog ) == 0 )
{
}
else
{
dog.flashduration = 1000;
dog thread maps/mp/animscripts/dog_flashed::main();
dog dodamage( damage, self.origin, self.owner, self, 0, "MOD_TRIGGER_HURT", 0, "microwave_turret_mp" );
}
_k1893 = getNextArrayKey( _a1893, _k1893 );
}
wait 0,5;
}
}
doesmicrowaveturretaffectdog( entity )
{
if ( !isalive( entity ) )
{
return 0;
}
if ( !isplayer( entity ) && !isai( entity ) )
{
return 0;
}
if ( isDefined( self.carried ) && self.carried )
{
return 0;
}
if ( self maps/mp/gametypes/_weaponobjects::isstunned() )
{
return 0;
}
if ( isDefined( self.owner ) && entity == self.owner )
{
return 0;
}
if ( distancesquared( entity.origin, self.origin ) > ( level.microwave_radius * level.microwave_radius ) )
{
return 0;
}
entdirection = vectornormalize( entity.origin - self.origin );
forward = anglesToForward( self.angles );
dot = vectordot( entdirection, forward );
if ( dot < level.microwave_turret_cone_dot )
{
return 0;
}
pitchdifference = int( abs( vectorToAngle( entdirection )[ 0 ] - self.angles[ 0 ] ) ) % 360;
if ( pitchdifference > 15 && pitchdifference < 345 )
{
return 0;
}
if ( entity damageconetrace( self.origin + vectorScale( ( 0, 0, 0 ), 40 ), self ) <= 0 )
{
return 0;
}
return 1;
}
microwave_fx()
{
self endon( "death" );
self endon( "microwave_end_fx" );
self thread waittillendfx();
waitamount = level.auto_turret_settings[ "microwave" ].fxchecktime;
for ( ;; )
{
update_microwave_fx();
wait waitamount;
}
}
waittillendfx()
{
self endon( "death" );
self waittill( "microwave_end_fx" );
self setclientfield( "turret_microwave_sounds", 0 );
}
update_microwave_fx()
{
angles = self gettagangles( "tag_flash" );
origin = self gettagorigin( "tag_flash" );
forward = anglesToForward( angles );
forward = vectorScale( forward, level.microwave_radius );
forwardright = anglesToForward( angles - ( 0, level.microwave_turret_angle / 3, 0 ) );
forwardright = vectorScale( forwardright, level.microwave_radius );
forwardleft = anglesToForward( angles + ( 0, level.microwave_turret_angle / 3, 0 ) );
forwardleft = vectorScale( forwardleft, level.microwave_radius );
trace = bullettrace( origin, origin + forward, 0, self );
traceright = bullettrace( origin, origin + forwardright, 0, self );
traceleft = bullettrace( origin, origin + forwardleft, 0, self );
fxhash = self microwave_fx_hash( trace, origin );
fxhashright = self microwave_fx_hash( traceright, origin );
fxhashleft = self microwave_fx_hash( traceleft, origin );
if ( isDefined( self.microwavefxhash ) && self.microwavefxhash == fxhash && isDefined( self.microwavefxhashright ) && self.microwavefxhashright == fxhashright && isDefined( self.microwavefxhashleft ) && self.microwavefxhashleft == fxhashleft )
{
return;
}
if ( isDefined( self.microwavefxent ) )
{
self.microwavefxent deleteaftertime( 0,1 );
}
self.microwavefxent = spawn( "script_model", origin );
self.microwavefxent setmodel( "tag_microwavefx" );
self.microwavefxent.angles = angles;
self thread deleteonendfx();
self.microwavefxhash = fxhash;
self.microwavefxhashright = fxhashright;
self.microwavefxhashleft = fxhashleft;
wait 0,1;
self.microwavefxent microwave_play_fx( trace, traceright, traceleft, origin );
self setclientfield( "turret_microwave_sounds", 1 );
}
deleteonendfx()
{
self.microwavefxent endon( "death" );
self waittill( "microwave_end_fx" );
self.microwavefxhash = undefined;
self.microwavefxhashright = undefined;
self.microwavefxhashleft = undefined;
if ( isDefined( self.microwavefxent ) )
{
self.microwavefxent delete();
}
}
microwave_fx_hash( trace, origin )
{
hash = 0;
counter = 1;
i = 0;
while ( i < 5 )
{
distsq = ( i * level.microwave_fx_size ) * ( i * level.microwave_fx_size );
if ( distancesquared( origin, trace[ "position" ] ) >= distsq )
{
hash += counter;
}
counter *= 2;
i++;
}
return hash;
}
microwave_play_fx( trace, traceright, traceleft, origin )
{
rows = 5;
i = 0;
while ( i < rows )
{
distsq = ( i * level.microwave_fx_size ) * ( i * level.microwave_fx_size );
if ( distancesquared( origin, trace[ "position" ] ) >= distsq )
{
switch( i )
{
case 0:
playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx11" );
wait 0,05;
break;
break;
case 1:
case 2:
playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx32" );
wait 0,05;
break;
break;
case 3:
playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx42" );
wait 0,05;
playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx43" );
wait 0,05;
break;
break;
case 4:
playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx53" );
wait 0,05;
break;
break;
}
}
if ( distancesquared( origin, traceleft[ "position" ] ) >= distsq )
{
switch( i )
{
case 0:
break;
break;
case 1:
playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx22" );
wait 0,05;
break;
break;
case 2:
playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx33" );
wait 0,05;
break;
break;
case 3:
playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx44" );
wait 0,05;
break;
break;
case 4:
playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx54" );
wait 0,05;
playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx55" );
wait 0,05;
break;
break;
}
}
if ( distancesquared( origin, traceright[ "position" ] ) >= distsq )
{
switch( i )
{
case 0:
break;
i++;
continue;
case 1:
playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx21" );
wait 0,05;
break;
i++;
continue;
case 2:
playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx31" );
wait 0,05;
break;
i++;
continue;
case 3:
playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx41" );
wait 0,05;
break;
i++;
continue;
case 4:
playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx51" );
wait 0,05;
playfxontag( level.auto_turret_settings[ "microwave" ].fx, self, "tag_fx52" );
wait 0,05;
break;
i++;
continue;
}
}
i++;
}
}
}
do_tow_shoot( player )
{
self endon( "turret_deactivated" );
self endon( "death" );
player endon( "disconnect" );
self endon( "target_lost" );
level endon( "game_ended" );
while ( 1 )
{
while ( self.firetime < level.auto_turret_settings[ "tow" ].turretfiredelay )
{
wait 0,1;
self.firetime += 0,1;
}
self playsound( "wpn_sam_launcher_rocket_npc" );
self shootturret();
self.firetime = 0;
}
}
missile_fired_notify()
{
self endon( "turret_deactivated" );
self endon( "death" );
level endon( "game_ended" );
if ( isDefined( self.owner ) )
{
self.owner endon( "disconnect" );
}
while ( 1 )
{
self waittill( "missile_fire", missile, weap, target );
if ( isDefined( target ) )
{
target notify( "stinger_fired_at_me" );
}
level notify( "missile_fired" );
}
}
spawnturrethackertrigger( player )
{
triggerorigin = self.origin + vectorScale( ( 0, 0, 0 ), 10 );
self.hackertrigger = spawn( "trigger_radius_use", triggerorigin, level.weaponobjects_hacker_trigger_width, level.weaponobjects_hacker_trigger_height );
/#
#/
self.hackertrigger setcursorhint( "HINT_NOICON", self );
self.hackertrigger setignoreentfortrigger( self );
self.hackertrigger sethintstring( level.auto_turret_settings[ self.turrettype ].hackerhintstring );
self.hackertrigger setperkfortrigger( "specialty_disarmexplosive" );
self.hackertrigger thread maps/mp/gametypes/_weaponobjects::hackertriggersetvisibility( player );
self thread hackerthink( self.hackertrigger, player );
}
hackerthink( trigger, owner )
{
self endon( "death" );
for ( ;; )
{
trigger waittill( "trigger", player, instant );
if ( !isDefined( instant ) && !trigger maps/mp/gametypes/_weaponobjects::hackerresult( player, owner ) )
{
continue;
}
else
{
if ( self.turrettype == "sentry" )
{
maps/mp/killstreaks/_killstreakrules::killstreakstop( "autoturret_mp", self.team, self.killstreak_id );
killstreak_id = player maps/mp/killstreaks/_killstreakrules::killstreakstart( "autoturret_mp", player.team, 1 );
self.killstreak_id = killstreak_id;
}
else if ( self.turrettype == "tow" )
{
maps/mp/killstreaks/_killstreakrules::killstreakstop( "auto_tow_mp", self.team, self.killstreak_id );
killstreak_id = player maps/mp/killstreaks/_killstreakrules::killstreakstart( "auto_tow_mp", player.team, 1 );
self.killstreak_id = killstreak_id;
}
else
{
if ( self.turrettype == "microwave" )
{
maps/mp/killstreaks/_killstreakrules::killstreakstop( "microwaveturret_mp", self.team, self.killstreak_id );
killstreak_id = player maps/mp/killstreaks/_killstreakrules::killstreakstart( "microwaveturret_mp", player.team, 1 );
self.killstreak_id = killstreak_id;
}
}
maps/mp/_scoreevents::processscoreevent( "hacked", player, self );
if ( self.turrettype == "sentry" )
{
owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "sentry_hacked", "item_destroyed" );
}
if ( self.turrettype == "microwave" )
{
owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "microwave_hacked", "item_destroyed" );
}
if ( level.teambased )
{
self setturretteam( player.team );
self.team = player.team;
}
else
{
self setturretteam( "free" );
self.team = "free";
}
if ( isDefined( self.owner ) && isDefined( self.owner.remoteweapon ) )
{
if ( self.owner.remoteweapon == self )
{
self.owner notify( "remove_remote_weapon" );
}
}
self.hacked = 1;
self setturretowner( player );
self.owner = player;
self notify( "hacked" );
level notify( "hacked" );
self deleteturretusetrigger();
wait 0,1;
self thread stunturrettacticalgrenade( 1,5 );
wait 1,5;
if ( isDefined( player ) && player.sessionstate == "playing" )
{
player thread watchownerdisconnect( self );
player thread watchownerteamkillkicked( self );
}
offset = level.turrets_headicon_offset[ "default" ];
if ( isDefined( level.turrets_headicon_offset[ self.turrettype ] ) )
{
offset = level.turrets_headicon_offset[ self.turrettype ];
}
self maps/mp/_entityheadicons::setentityheadicon( player.pers[ "team" ], player, offset );
self spawnturrethackertrigger( player );
if ( self.turrettype == "sentry" )
{
player maps/mp/killstreaks/_remote_weapons::initremoteweapon( self, "killstreak_remote_turret_mp" );
}
return;
}
}
}
spawnturretdisabletrigger( player )
{
triggerorigin = self.origin + vectorScale( ( 0, 0, 0 ), 10 );
self.disabletrigger = spawn( "trigger_radius_use", triggerorigin, level.weaponobjects_hacker_trigger_width, level.weaponobjects_hacker_trigger_height );
self.disabletrigger setcursorhint( "HINT_NOICON", self );
self.disabletrigger setignoreentfortrigger( self );
self.disabletrigger sethintstring( level.auto_turret_settings[ self.turrettype ].disablehintstring );
self.disabletrigger thread maps/mp/gametypes/_weaponobjects::hackertriggersetvisibility( player );
self thread disabletriggerthink( self.disabletrigger, player );
}
disabletriggerthink( trigger, owner )
{
self endon( "death" );
for ( ;; )
{
trigger waittill( "trigger", attacker );
if ( !trigger disableresult( attacker, owner ) )
{
continue;
}
else
{
if ( self isenemyplayer( attacker ) )
{
if ( self.turrettype == "sentry" )
{
maps/mp/_scoreevents::processscoreevent( "destroyed_sentry_gun", attacker, self, "knife_mp" );
}
else
{
if ( self.turrettype == "microwave" )
{
maps/mp/_scoreevents::processscoreevent( "destroyed_microwave_turret", attacker, self, "knife_mp" );
}
}
if ( isDefined( self.hardpointweapon ) )
{
level.globalkillstreaksdestroyed++;
attacker addweaponstat( self.hardpointweapon, "destroyed", 1 );
}
}
if ( isDefined( self.owner ) && isplayer( self.owner ) )
{
owner = self.owner;
if ( self.turrettype == "sentry" )
{
owner maps/mp/gametypes/_globallogic_audio::leaderdialogonplayer( "sentry_destroyed", "item_destroyed" );
}
}
self notify( "destroy_turret" );
}
}
}
disableresult( player, owner )
{
success = 1;
time = getTime();
hacktime = getDvarFloat( "perk_disarmExplosiveTime" );
if ( !candisable( player, owner, 1 ) )
{
return 0;
}
self thread hackerunfreezeplayer( player );
while ( ( time + ( hacktime * 1000 ) ) > getTime() )
{
if ( !candisable( player, owner, 0 ) )
{
success = 0;
break;
}
else if ( !player usebuttonpressed() )
{
success = 0;
break;
}
else if ( !isDefined( self ) )
{
success = 0;
break;
}
else
{
player freeze_player_controls( 1 );
player disableweapons();
if ( !isDefined( self.progressbar ) )
{
self.progressbar = player createprimaryprogressbar();
self.progressbar.lastuserate = -1;
self.progressbar showelem();
self.progressbar updatebar( 0,01, 1 / hacktime );
self.progresstext = player createprimaryprogressbartext();
self.progresstext settext( &"MP_DISABLING" );
self.progresstext showelem();
player playlocalsound( "evt_hacker_hacking" );
}
wait 0,05;
}
}
if ( isDefined( player ) )
{
player freeze_player_controls( 0 );
player enableweapons();
}
if ( isDefined( self.progressbar ) )
{
self.progressbar destroyelem();
self.progresstext destroyelem();
}
if ( isDefined( self ) )
{
self notify( "hack_done" );
}
return success;
}
candisable( player, owner, weapon_check )
{
if ( !isDefined( player ) )
{
return 0;
}
if ( !isplayer( player ) )
{
return 0;
}
if ( !isalive( player ) )
{
return 0;
}
if ( !isDefined( owner ) )
{
return 0;
}
if ( owner == player )
{
return 0;
}
if ( level.teambased && player.team == owner.team )
{
return 0;
}
if ( isDefined( player.isdefusing ) && player.isdefusing )
{
return 0;
}
if ( isDefined( player.isplanting ) && player.isplanting )
{
return 0;
}
if ( isDefined( player.proxbar ) && !player.proxbar.hidden )
{
return 0;
}
if ( isDefined( player.revivingteammate ) && player.revivingteammate == 1 )
{
return 0;
}
if ( !player isonground() )
{
return 0;
}
if ( player isinvehicle() )
{
return 0;
}
if ( player isweaponviewonlylinked() )
{
return 0;
}
if ( player hasperk( "specialty_disarmexplosive" ) )
{
return 0;
}
if ( isDefined( player.laststand ) && player.laststand )
{
return 0;
}
if ( weapon_check )
{
if ( player isthrowinggrenade() )
{
return 0;
}
if ( player isswitchingweapons() )
{
return 0;
}
if ( player ismeleeing() )
{
return 0;
}
weapon = player getcurrentweapon();
if ( !isDefined( weapon ) )
{
return 0;
}
if ( weapon == "none" )
{
return 0;
}
if ( isweaponequipment( weapon ) && player isfiring() )
{
return 0;
}
if ( isweaponspecificuse( weapon ) )
{
return 0;
}
}
return 1;
}
turretscanstartwaiter()
{
self endon( "turret_deactivated" );
self endon( "death" );
self endon( "turret_carried" );
level endon( "game_ended" );
turret_scan_start_sound_ent = spawn( "script_origin", self.origin );
turret_scan_start_sound_ent linkto( self, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) );
self thread turretscanstopwaiter( turret_scan_start_sound_ent );
self thread turretscanstopwaitercleanup( turret_scan_start_sound_ent );
while ( 1 )
{
self waittill( "turret_scan_start" );
wait 0,5;
}
}
turretscanstopwaiter( ent )
{
self endon( "turret_sound_cleanup" );
level endon( "game_ended" );
while ( 1 )
{
self waittill( "turret_scan_stop" );
wait 0,5;
}
}
turretscanstopwaitercleanup( ent )
{
level endon( "game_ended" );
self waittill_any( "death", "disconnect", "turret_deactivated" );
self notify( "turret_sound_cleanup" );
wait 0,1;
/#
println( "snd scan delete" );
#/
if ( isDefined( ent ) )
{
ent delete();
}
}
turretscanstopnotify()
{
}
startturretremotecontrol( turret )
{
self.killstreak_waitamount = level.auto_turret_timeout * 1000;
turret maketurretusable();
arc_limits = turret getturretarclimits();
self playerlinkweaponviewtodelta( turret, "tag_player", 0, arc_limits[ "arc_max_yaw" ], arc_limits[ "arc_min_yaw" ] * -1, arc_limits[ "arc_min_pitch" ] * -1, arc_limits[ "arc_max_pitch" ] );
self playerlinkedsetusebaseangleforviewclamp( 1 );
self remotecontrolturret( turret );
turret laseron();
turret.remotecontrolled = 1;
turret setmode( "manual" );
self thread watchremotesentryfire( turret );
}
watchremotesentryfire( turret )
{
self endon( "stopped_using_remote" );
turret endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
while ( 1 )
{
if ( self attackbuttonpressed() && turret.stunnedbytacticalgrenade == 0 )
{
firetime = weaponfiretime( "auto_gun_turret_mp" );
earthquake( 0,15, 0,2, turret.origin, 200 );
wait firetime;
continue;
}
else
{
wait 0,05;
}
}
}
endremoteturret( turret, isdead )
{
if ( isDefined( self ) && isDefined( turret ) && turret.remotecontrolled )
{
self remotecontrolturretoff( turret );
self remove_turret_hint_hud();
}
turret maketurretunusable();
turret laseroff();
turret.remotecontrolled = 0;
turret setmode( "auto_nonai" );
if ( !isdead )
{
turret thread maps/mp/_mgturret::burst_fire_unmanned();
}
}
stop_remote()
{
if ( !isDefined( self ) )
{
return;
}
self clearusingremote();
self.killstreak_waitamount = undefined;
self maps/mp/killstreaks/_ai_tank::destroy_remote_hud();
self remove_turret_hint_hud();
}
create_remote_turret_hud( remote )
{
self.fire_turret_hud = newclienthudelem( self );
self.fire_turret_hud.alignx = "left";
self.fire_turret_hud.aligny = "bottom";
self.fire_turret_hud.horzalign = "user_left";
self.fire_turret_hud.vertalign = "user_bottom";
self.fire_turret_hud.font = "small";
self.fire_turret_hud settext( &"MP_FIRE_SENTRY_GUN" );
self.fire_turret_hud.hidewheninmenu = 1;
self.fire_turret_hud.hidewhenindemo = 1;
self.fire_turret_hud.archived = 0;
self.fire_turret_hud.x = 25;
self.fire_turret_hud.y = -25;
self.fire_turret_hud.fontscale = 1,25;
self.zoom_turret_hud = newclienthudelem( self );
self.zoom_turret_hud.alignx = "left";
self.zoom_turret_hud.aligny = "bottom";
self.zoom_turret_hud.horzalign = "user_left";
self.zoom_turret_hud.vertalign = "user_bottom";
self.zoom_turret_hud.font = "small";
self.zoom_turret_hud settext( &"KILLSTREAK_INCREASE_ZOOM" );
self.zoom_turret_hud.hidewheninmenu = 1;
self.zoom_turret_hud.hidewhenindemo = 1;
self.zoom_turret_hud.archived = 0;
self.zoom_turret_hud.x = 25;
self.zoom_turret_hud.y = -40;
self.zoom_turret_hud.fontscale = 1,25;
self thread fade_out_hint_hud();
}
fade_out_hint_hud()
{
wait 8;
time = 0;
while ( time < 2 )
{
if ( !isDefined( self.fire_turret_hud ) )
{
return;
}
self.fire_turret_hud.alpha -= 0,025;
self.zoom_turret_hud.alpha -= 0,025;
time += 0,05;
wait 0,05;
}
self.fire_turret_hud.alpha = 0;
self.zoom_turret_hud.alpha = 0;
}
remove_turret_hint_hud()
{
if ( isDefined( self.fire_turret_hud ) )
{
self.fire_turret_hud destroy();
}
if ( isDefined( self.zoom_turret_hud ) )
{
self.zoom_turret_hud destroy();
}
}
remove_turret_dangerous_nodes()
{
while ( isDefined( self.dangerous_nodes ) )
{
_a2744 = self.dangerous_nodes;
_k2744 = getFirstArrayKey( _a2744 );
while ( isDefined( _k2744 ) )
{
node = _a2744[ _k2744 ];
_a2746 = level.teams;
_k2746 = getFirstArrayKey( _a2746 );
while ( isDefined( _k2746 ) )
{
team = _a2746[ _k2746 ];
node setdangerous( team, 0 );
_k2746 = getNextArrayKey( _a2746, _k2746 );
}
_k2744 = getNextArrayKey( _a2744, _k2744 );
}
}
self.dangerous_nodes = [];
}
addnoturrettrigger( position, radius, height )
{
level waittill( "no_turret_trigger_created" );
trigger = spawn( "trigger_radius", position, 0, radius, height );
level.noturretplacementtriggers[ level.noturretplacementtriggers.size ] = trigger;
}
turret_debug_box( origin, mins, maxs, color )
{
/#
debug_turret = getDvar( #"94A738D1" );
if ( debug_turret == "1" )
{
box( origin, mins, maxs, 0, color, 1, 1, 300 );
#/
}
}
turret_debug_line( start, end, color )
{
/#
debug_turret = getDvar( #"94A738D1" );
if ( debug_turret == "1" )
{
line( start, end, color, 1, 1, 300 );
#/
}
}