1 #using scripts\codescripts\struct;
3 #using scripts\mp\_util;
4 #using scripts\mp\gametypes\_globallogic_audio;
5 #using scripts\mp\gametypes\_hostmigration;
6 #using scripts\mp\gametypes\_spawning;
7 #using scripts\mp\killstreaks\_airsupport;
8 #using scripts\mp\killstreaks\_emp;
9 #using scripts\mp\killstreaks\_killstreakrules;
10 #using scripts\mp\killstreaks\_killstreaks;
11 #using scripts\mp\killstreaks\_killstreak_bundles;
12 #using scripts\mp\killstreaks\_placeables;
13 #using scripts\mp\killstreaks\_remote_weapons;
14 #using scripts\mp\killstreaks\_killstreak_hacking;
15 #using scripts\mp\teams\_teams;
17 #using scripts\shared\callbacks_shared;
18 #using scripts\shared\challenges_shared;
19 #using scripts\shared\clientfield_shared;
20 #using scripts\shared\hostmigration_shared;
21 #using scripts\shared\scoreevents_shared;
22 #using scripts\shared\killstreaks_shared;
23 #using scripts\shared\popups_shared;
24 #using scripts\shared\util_shared;
25 #using scripts\shared\weapons\_weaponobjects;
26 #using scripts\shared\turret_shared;
27 #using scripts\shared\vehicle_shared;
28 #using scripts\shared\vehicle_death_shared;
29 #using scripts\shared\visionset_mgr_shared;
31 #insert scripts\mp\_hacker_tool.gsh;
32 #insert scripts\mp\killstreaks\_killstreaks.gsh;
33 #insert scripts\shared\shared.gsh;
34 #insert scripts\shared\version.gsh;
36 #precache( "string", "KILLSTREAK_EARNED_AUTO_TURRET" );
37 #precache( "string", "KILLSTREAK_AUTO_TURRET_INBOUND" );
38 #precache( "string", "KILLSTREAK_AUTO_TURRET_NOT_AVAILABLE" );
39 #precache( "string", "KILLSTREAK_AUTO_TURRET_HACKED" );
40 #precache( "string", "KILLSTREAK_DESTROYED_AUTO_TURRET" );
41 #precache( "triggerstring", "KILLSTREAK_AUTO_TURRET_PLACE_TURRET_HINT" );
42 #precache( "triggerstring", "KILLSTREAK_AUTO_TURRET_INVALID_TURRET_LOCATION" );
43 #precache( "triggerstring", "KILLSTREAK_SENTRY_TURRET_PICKUP" );
44 #precache( "triggerstring", "MP_REMOTE_USE_TURRET" );
45 #precache( "string", "mpl_killstreak_auto_turret" );
47 #using_animtree( "mp_autoturret" );
49 #define TURRET_NAME "autoturret"
50 #define TURRET_SCAN_ANGLE_BUFFER 10
51 #define TURRET_SCAN_WAIT 2.5
52 #define PLACEABLE_MOVEABLE_TIMEOUT_EXTENSION_TU1 5000 // tu1: make sure this matches the same value in placeables.gsc
61 killstreaks::register_strings(
"autoturret", &
"KILLSTREAK_EARNED_AUTO_TURRET", &
"KILLSTREAK_AUTO_TURRET_NOT_AVAILABLE", &
"KILLSTREAK_AUTO_TURRET_INBOUND", undefined, &
"KILLSTREAK_AUTO_TURRET_HACKED",
false );
62 killstreaks::register_dialog(
TURRET_NAME,
"mpl_killstreak_auto_turret",
"turretDialogBundle", undefined,
"friendlyTurret",
"enemyTurret",
"enemyTurretMultiple",
"friendlyTurretHacked",
"enemyTurretHacked",
"requestTurret",
"threatTurret" );
71 level.autoturretOpenAnim = %o_turret_sentry_deploy;
72 level.autoturretCloseAnim = %o_turret_sentry_close;
84 turretVehicle.dontfreeme =
true;
85 turretVehicle.damage_on_death =
false;
86 turretVehicle.delete_on_death = undefined;
87 turretVehicle.watch_remote_weapon_death =
true;
91 turretVehicle.damageTaken = 0;
95 if ( isdefined( tableHealth ) )
97 turretVehicle.maxhealth = tableHealth;
101 turretVehicle.health = turretVehicle.maxhealth;
108 turretVehicle.soundmod =
"drone_land";
118 assert( IsPlayer( player ) );
140 if( event !=
"placed" )
145 turret playsound (
"mpl_turret_startup");
152 assert( IsPlayer( player ) );
154 if( isdefined( turret.vehicle ) )
156 turret.vehicle.origin = turret.origin;
157 turret.vehicle.angles = turret.angles;
161 turret.vehicle playsound (
"mpl_turret_startup");
165 turret.vehicle = SpawnVehicle(
TURRET_VEHICLE_NAME, turret.origin, turret.angles,
"dynamic_spawn_ai" );
166 turret.vehicle.owner = player;
167 turret.vehicle SetOwner( player );
168 turret.vehicle.ownerEntNum = player.entNum;
169 turret.vehicle.parentStruct = turret;
170 turret.vehicle.controlled =
false;
171 turret.vehicle.treat_owner_damage_as_friendly_fire =
true;
172 turret.vehicle.ignore_team_kills =
true;
173 turret.vehicle.deal_no_crush_damage =
true;
175 turret.vehicle.team = player.team;
176 turret.vehicle SetTeam( player.team );
180 turret.vehicle.use_non_teambased_enemy_selection =
true;
181 turret.vehicle.waittill_turret_on_target_delay = 0.25;
184 turret.vehicle.ignore_vehicle_underneath_splash_scalar =
true;
198 if ( IsSentient( turret.vehicle ) ==
false )
199 turret.vehicle MakeSentient();
203 player AddWeaponStat( GetWeapon(
TURRET_NAME ),
"used", 1 );
209 Target_Set( turret.vehicle, ( 0, 0, 36 ) );
210 turret.vehicle Unlink();
223 turretVehicle =
self;
226 if( turretVehicle.controlled ===
true )
230 turretVehicle.owner unlink();
236 turretVehicle =
self;
238 turretVehicle notify(
"WatchRemoteControlDeactivate_remoteWeapons" );
245 turret endon(
"death" );
259 if ( isdefined( turret.vehicle ))
267 turret notify(
"sentry_turret_shutdown" );
273 turret.vehicle Ghost();
275 turret.vehicle LinkTo( turret );
276 Target_Remove( turret.vehicle );
281 if ( isdefined( turret.vehicle ) )
283 turret.vehicle notify(
"end_turret_scanning" );
284 turret.vehicle SetTurretTargetRelativeAngles( ( 0, 0, 0 ) );
288 if( isdefined( turret.vehicle.useTrigger ) )
290 turret.vehicle.useTrigger Delete();
291 turret.vehicle playsound (
"mpl_turret_down");
298 function OnTurretDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal )
302 iDamage =
self killstreaks::OnDamagePerWeapon(
TURRET_NAME, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon,
self.maxhealth, undefined,
self.maxhealth*0.4, undefined, empDamage, undefined,
true, 1.0 );
303 self.damageTaken += iDamage;
305 if (
self.controlled )
311 if (
self.damageTaken >
self.maxHealth && !isdefined(
self.will_die ) )
313 self.will_die =
true;
314 self thread
OnDeathAfterFrameEnd( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime );
320 function OnTurretDeath( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime )
323 self OnDeath( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime );
326 function OnDeathAfterFrameEnd( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime )
330 if ( isdefined(
self ) )
332 self OnDeath( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime );
336 function OnDeath( eInflictor, eAttacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime )
338 turretVehicle =
self;
341 if ( turretVehicle.dead ===
true )
344 turretVehicle.dead =
true;
346 turretVehicle DisableDriverFiring(
true );
351 eAttacker =
self [[ level.figure_out_attacker ]]( eAttacker );
353 if( isdefined( turretVehicle.parentStruct ) )
357 if ( turretVehicle.parentStruct.killstreakTimedOut ===
true && isdefined( turretVehicle.owner ) )
363 if ( isdefined( eAttacker ) && isdefined( turretVehicle.owner ) && ( eAttacker != turretVehicle.owner ) )
368 if ( isdefined( eAttacker ) && IsPlayer( eAttacker ) && ( !isdefined(
self.owner ) ||
self.owner
util::IsEnemyPlayer( eAttacker ) ) )
373 eAttacker AddPlayerStat(
"destroy_turret", 1 );
374 eAttacker AddWeaponStat( weapon,
"destroy_turret", 1 );
375 LUINotifyEvent( &
"player_callout", 2, &
"KILLSTREAK_DESTROYED_AUTO_TURRET", eAttacker.entnum );
379 turretVehicle playsound (
"mpl_m_turret_exp");
385 turretVehicle Ghost();
386 turretVehicle NotSolid();
390 if ( isdefined( turretVehicle ) )
393 while ( isdefined( turretVehicle ) && ( turretVehicle.controlled || !isdefined( turretVehicle.owner ) ) )
396 turretVehicle.dontfreeme = undefined;
400 if ( isdefined ( turretVehicle ) )
401 turretVehicle
delete();
407 turret notify(
"sentry_turret_shutdown" );
413 assert( IsPlayer( player ) );
416 turretVehicle UseVehicle( player, 0 );
418 turretVehicle.controlled =
true;
419 turretVehicle.treat_owner_damage_as_friendly_fire =
false;
420 turretVehicle.ignore_team_kills =
false;
430 if( exitRequestedByOwner )
436 if ( isdefined( turretVehicle.owner ) && ( turretVehicle.controlled ===
true ) )
439 turretVehicle.controlled =
false;
440 turretVehicle.treat_owner_damage_as_friendly_fire =
true;
441 turretVehicle.ignore_team_kills =
true;
446 self endon (
"death" );
447 if ( isdefined(
self.owner ) )
449 self.owner endon(
"joined_team" );
450 self.owner endon(
"disconnect" );
451 self.owner endon(
"joined_spectators" );
462 preset = GetInfluencerPreset(
name );
464 if ( !IsDefined( preset ) )
470 projected_point = turret.origin + VectorScale( AnglesToForward( turret.angles ), preset[
"radius"] * 0.7 );
476 self notify(
"turret_watch_owner_events_singleton" );
477 self endon (
"tturet_watch_owner_events_singleton" );
478 self endon(
"death" );
482 self MakeVehicleUsable();
483 self.controlled =
false;
485 if ( isdefined(
self.owner ) )
491 self MakeVehicleUnusable();
493 if ( isdefined(
self.owner ) )
498 self.abandoned =
true;
505 turretVehicle =
self;
506 turretVehicle endon(
"death" );
512 if ( laser_should_be_on )
514 if ( IsLaserOn( turretVehicle ) == false )
521 if ( IsLaserOn( turretVehicle ) )
533 turretVehicle =
self;
535 turretVehicle endon(
"death" );
536 old_target = undefined;
540 turretVehicle waittill(
"has_new_target", new_target );
542 if ( isdefined( old_target ) )
543 old_target notify(
"abort_death_watch" );
546 old_target = new_target;
553 target endon(
"abort_death_watch" );
555 turretVehicle endon(
"death" );
564 turretVehicle =
self;
566 turretVehicle endon(
"death" );
567 turretVehicle endon(
"end_turret_scanning" );
571 turretVehicle.do_not_clear_targets_during_think =
true;
578 if ( turretVehicle.controlled )
594 if ( turretVehicle.scanPos ===
"left" )
597 turretVehicle.scanPos =
"right";
602 turretVehicle.scanPos =
"left";
613 turret waittill(
"sentry_turret_shutdown" );
617 if( isdefined( turret.vehicle ) )