‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_auto_turret.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\array_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\flag_shared;
6 #using scripts\shared\fx_shared;
7 #using scripts\shared\math_shared;
8 #using scripts\shared\statemachine_shared;
9 #using scripts\shared\system_shared;
10 #using scripts\shared\turret_shared;
11 #using scripts\shared\util_shared;
12 #using scripts\shared\vehicle_death_shared;
13 #using scripts\shared\vehicle_shared;
14 #using scripts\shared\vehicle_ai_shared;
15 
16 #insert scripts\shared\shared.gsh;
17 #insert scripts\shared\statemachine.gsh;
18 
19 #namespace auto_turret;
20 
21 ‪REGISTER_SYSTEM( "auto_turret", &‪__init__, undefined )
22 
23 function ‪__init__()
24 {
25  vehicle::add_main_callback( "auto_turret", &‪turret_initialze );
26 }
27 
29 {
30  self.health = self.healthdefault;
31 
32  if ( isdefined( self.scriptbundlesettings ) )
33  {
34  self.settings = ‪struct::get_script_bundle( "vehiclecustomsettings", self.scriptbundlesettings );
35  }
36  else
37  {
38  self.settings = ‪struct::get_script_bundle( "vehiclecustomsettings", "artillerysettings" );
39  }
40 
41  sightfov = self.settings.sightfov;
42  if ( !isdefined( sightfov ) )
43  {
44  sightfov = 0;
45  }
46  self.fovcosine = Cos( sightfov - 0.1 );
47  self.fovcosinebusy = Cos( sightfov - 0.1 );
48 
49  if ( self.settings.disconnectpaths === true )
50  {
51  self DisconnectPaths();
52  }
53 
54  if ( self.settings.ignoreme === true )
55  {
56  self.ignoreme = true;
57  }
58 
59  if ( self.settings.laseron === true )
60  {
61  self laserOn();
62  }
63 
64  // only auto aim if it can fire. if more specific situation comes we can separate aim assist into a separate GDT field
65  if ( self.settings.disablefiring !== true )
66  {
67  self EnableAimAssist();
68  }
69  else
70  {
71  self.noCybercom = true;
72  }
73 
74  self thread ‪turret::track_lens_flare();
75 
76  self.overrideVehicleDamage =&‪turretCallback_VehicleDamage;
77  self.allowFriendlyFireDamageOverride = &‪turretAllowFriendlyFireDamage;
78 
79  //disable some cybercom abilities
80  if( IsDefined( level.vehicle_initializer_cb ) )
81  {
82  [[level.vehicle_initializer_cb]]( self );
83  }
84 
85  self.ignoreFireFly = true;
86  self.ignoreDecoy = true;
88 
90 }
91 
92 function ‪defaultRole()
93 {
95 
96  self ‪vehicle_ai::get_state_callbacks( "death" ).update_func = &‪state_death_update;
97  self ‪vehicle_ai::get_state_callbacks( "combat" ).update_func = &‪state_combat_update;
98  self ‪vehicle_ai::get_state_callbacks( "combat" ).exit_func = &‪state_combat_exit;
99  self ‪vehicle_ai::get_state_callbacks( "off" ).enter_func = &‪state_off_enter;
100  self ‪vehicle_ai::get_state_callbacks( "off" ).exit_func = &‪state_off_exit;
101  self ‪vehicle_ai::get_state_callbacks( "emped" ).enter_func = &‪state_emped_enter;
102  self ‪vehicle_ai::get_state_callbacks( "emped" ).update_func = &‪state_emped_update;
103  self ‪vehicle_ai::get_state_callbacks( "emped" ).exit_func = &‪state_emped_exit;
104 
105  self ‪vehicle_ai::add_state( "unaware",
106  undefined,
108  undefined );
109 
110  ‪vehicle_ai::add_interrupt_connection( "unaware", "scripted", "enter_scripted" );
111  ‪vehicle_ai::add_interrupt_connection( "unaware", "emped", "emped" );
112  ‪vehicle_ai::add_interrupt_connection( "unaware", "off", "shut_off" );
113  ‪vehicle_ai::add_interrupt_connection( "unaware", "driving", "enter_vehicle" );
114  ‪vehicle_ai::add_interrupt_connection( "unaware", "pain", "pain" );
115 
118 
120 }
121 
122 // ----------------------------------------------
123 // State: death
124 // ----------------------------------------------
125 function ‪state_death_update( params )
126 {
127  self endon( "death" );
128 
129  owner = self GetVehicleOwner();
130  if ( isdefined( owner ) )
131  {
132  self waittill( "exit_vehicle" );
133  }
134 
135  self SetTurretSpinning( false );
136  self ‪turret::toggle_lensflare( false );
137 
138  params.death_type = "default"; // only do default death for now
139 
140  self thread ‪turret_idle_sound_stop();
141  self playsound("veh_sentry_turret_dmg_hit");
142  self.turretRotScale = 2;
143  self ‪rest_turret( params.resting_pitch );
145 }
146 // death-----------------------------------------
147 
148 
149 // ----------------------------------------------
150 // State: unaware
151 // ----------------------------------------------
152 function ‪should_switch_to_unaware( current_state, to_state, connection )
153 {
154  if ( !isdefined( self.enemy ) || !self VehSeenRecently( self.enemy, 1.5 ) )
155  {
156  return 100;
157  }
158 
159  return 0;
160 }
161 
162 function ‪state_unaware_update( params )
163 {
164  self endon( "death" );
165  self endon( "change_state" );
166 
167  turret_left = true;
168  relativeAngle = 0;
169 
170  self thread ‪turret_idle_sound();
171  self playsound ("mpl_turret_startup");
172  self ClearTargetEntity();
173 
174  while( true )
175  {
176  rotScale = self.settings.scanning_speedscale;
177  if ( !isdefined( rotScale ) )
178  {
179  rotScale = 0.01;
180  }
181  self.turretRotScale = rotScale;
182 
183  scanning_arc = self.settings.scanning_arc;
184  if ( !isdefined( scanning_arc ) )
185  {
186  scanning_arc = 0;
187  }
188  limits = self GetTurretLimitsYaw();
189  scanning_arc = min( scanning_arc, limits[0] - 0.1 );
190  scanning_arc = min( scanning_arc, limits[1] - 0.1 );
191 
192  if ( scanning_arc > 179 )
193  {
194  if ( self.turretontarget )
195  {
196  relativeAngle += 90;
197  if ( relativeAngle > 180 )
198  {
199  relativeAngle -= 360;
200  }
201  }
202  scanning_arc = relativeAngle;
203  }
204  else
205  {
206  if ( self.turretontarget )
207  {
208  turret_left = !turret_left;
209  }
210 
211  if ( !turret_left )
212  {
213  scanning_arc *= -1;
214  }
215  }
216 
217  scanning_pitch = self.settings.scanning_pitch;
218  if ( !isdefined( scanning_pitch ) )
219  {
220  scanning_pitch = 0;
221  }
222  self SetTurretTargetRelativeAngles( ( scanning_pitch, scanning_arc, 0 ) );
223 
225  wait 0.5;
226  }
227 }
228 // unaware---------------------------------------
229 
230 // ----------------------------------------------
231 // State: combat
232 // ----------------------------------------------
233 function ‪should_switch_to_combat( current_state, to_state, connection )
234 {
235  if ( isdefined( self.enemy ) && isAlive( self.enemy ) && self VehCanSee( self.enemy ) )
236  {
237  return 100;
238  }
239 
240  return 0;
241 }
242 
243 function ‪state_combat_update( params )
244 {
245  self endon( "death" );
246  self endon( "change_state" );
247 
248  if( isdefined( self.enemy ) )
249  {
251  wait 0.5;
252  }
253 
254  while( 1 )
255  {
256  if( isdefined( self.enemy ) && self VehCanSee( self.enemy ) )
257  {
258  self.turretRotScale = 1;
259 
260  if ( isdefined( self.enemy ) && self HasPart( "tag_minigun_spin" ) )
261  {
262  self SetTurretTargetEnt( self.enemy );
263  self SetTurretSpinning( true );
264  wait 0.5;
265  }
266 
267  for( i = 0; i < 3; i++ )
268  {
269  if( isdefined( self.enemy ) && IsAlive( self.enemy ) && self VehCanSee( self.enemy ) )
270  {
271  self SetTurretTargetEnt( self.enemy );
272  wait 0.1;
273  waitTime = RandomFloatRange( 0.4, 1.5 );
274  if ( self.settings.disablefiring !== true )
275  {
276  self ‪sentry_turret_fire_for_time( waitTime, self.enemy );
277  }
278  else
279  {
280  wait waitTime;
281  }
282  }
283 
284  if( isdefined( self.enemy ) && IsPlayer( self.enemy ) )
285  wait RandomFloatRange( 0.3, 0.6 );
286  else
287  wait RandomFloatRange( 0.3, 0.6 ) * 2;
288  }
289 
290  self SetTurretSpinning( false );
291 
292  if( isdefined( self.enemy ) && IsAlive( self.enemy ) && self VehCanSee( self.enemy ) )
293  {
294  if( IsPlayer( self.enemy ) )
295  wait RandomFloatRange( 0.5, 1.3 );
296  else
297  wait RandomFloatRange( 0.5, 1.3 ) * 2;
298  }
299  }
300 
302  wait 0.5;
303  }
304 }
305 
306 function ‪state_combat_exit( params )
307 {
308  self SetTurretSpinning( false );
309 }
310 
311 function ‪sentry_turret_fire_for_time( totalFireTime, enemy )
312 {
313  self endon( "death" );
314  self endon( "change_state" );
315 
317  wait .1;//giving time for the alert to play
318 
319  weapon = self SeatGetWeapon( 0 );
320  fireTime = weapon.fireTime;
321  time = 0;
322 
323  is_minigun = false;
324  if ( IsSubStr( weapon.name, "minigun" ) )
325  {
326  is_minigun = true;
327  self SetTurretSpinning( true );
328  wait 0.5;
329  }
330 
331  while( time < totalFireTime )
332  {
333  self FireWeapon(0, enemy);
334 
335  wait fireTime;
336  time += fireTime;
337  }
338 
339  if( is_minigun )
340  {
341  self SetTurretSpinning( false );
342  }
343 }
344 // combat----------------------------------------
345 
346 // ----------------------------------------------
347 // State: off
348 // ----------------------------------------------
349 function ‪state_off_enter( params )
350 {
352 
353  self.turretRotScale = 0.5;
354  self ‪rest_turret( params.resting_pitch );
355 }
356 
357 function ‪state_off_exit( params )
358 {
360 
361  self.turretRotScale = 1.0;
362  self playsound ("mpl_turret_startup");
363 }
364 
365 function ‪rest_turret( resting_pitch )
366 {
367  if ( !isdefined( resting_pitch ) )
368  {
369  resting_pitch = self.settings.resting_pitch;
370  }
371 
372  if ( !isdefined( resting_pitch ) )
373  {
374  resting_pitch = 0;
375  }
376 
377  angles = self GetTagAngles( "tag_turret" ) - self.angles;
378 
379  self SetTurretTargetRelativeAngles( ( resting_pitch, angles[1], 0 ) );
380 }
381 // off-------------------------------------------
382 
383 // ----------------------------------------------
384 // State: emped
385 // ----------------------------------------------
386 function ‪state_emped_enter( params )
387 {
389  PlaySoundAtPosition( "veh_sentry_turret_emp_down", self.origin );
390  self.turretRotScale = 0.5;
391  self ‪rest_turret( params.resting_pitch );
392 
393  params.laserOn = IsLaserOn( self );
394 
395  self LaserOff();
396  self ‪vehicle::lights_off();
397 
398  if ( !isdefined( self.abnormal_status ) )
399  {
400  self.abnormal_status = spawnStruct();
401  }
402 
403  self.abnormal_status.emped = true;
404  self.abnormal_status.attacker = params.notify_param[1];
405  self.abnormal_status.inflictor = params.notify_param[2];
406 
407  self ‪vehicle::toggle_emp_fx( true );
408 }
409 
410 function ‪state_emped_update( params )
411 {
412  self endon ("death");
413  self endon ("change_state");
414 
415  time = params.notify_param[0];
416  assert( isdefined( time ) );
417  ‪vehicle_ai::Cooldown( "emped_timer", time );
418 
419  while( !‪vehicle_ai::IsCooldownReady( "emped_timer" ) )
420  {
421  timeLeft = max( ‪vehicle_ai::GetCooldownLeft( "emped_timer" ), 0.5 );
422  wait timeLeft;
423  }
424 
425  self.abnormal_status.emped = false;
426  self ‪vehicle::toggle_emp_fx( false );
428  self ‪rest_turret( 0 );
429  wait 1;
430 
432 }
433 
434 function ‪state_emped_exit( params )
435 {
437 
438  self.turretRotScale = 1.0;
439  self playsound ("mpl_turret_startup");
440 }
441 // emped-----------------------------------------
442 
443 // ----------------------------------------------
444 // State: scripted
445 // ----------------------------------------------
446 function ‪state_scripted_update( params )
447 {
448  self.turretRotScale = 1;
449 }
450 // scripted--------------------------------------
451 
452 function ‪turretAllowFriendlyFireDamage( eInflictor, eAttacker, sMeansOfDeath, weapon )
453 {
454  if ( isdefined( eAttacker ) && isdefined( sMeansOfDeath ) && sMeansOfDeath == "MOD_EXPLOSIVE" )
455  {
456  return true;
457  }
458 
459  return false;
460 }
461 
462 function ‪turretCallback_VehicleDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal )
463 {
464  iDamage = ‪vehicle_ai::shared_callback_damage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal );
465 
466  //self HidePart( "tag_shield" );
467  return iDamage;
468 }
469 
471 {
472  self playsound ("veh_turret_alert");
473 }
474 
476 {
477  if ( !isdefined( self.sndloop_ent ) )
478  {
479  self.sndloop_ent = ‪Spawn("script_origin", self.origin);
480  self.sndloop_ent linkto (self);
481  self.sndloop_ent PlayLoopSound ("veh_turret_idle");
482  }
483 }
484 
486 {
487  self endon( "death" );
488 
489  if ( isdefined( self.sndloop_ent ) )
490  {
491  self.sndloop_ent stoploopsound( .5 );
492  wait( 2 );
493  self.sndloop_ent delete();
494  }
495 }
‪state_emped_exit
‪function state_emped_exit(params)
Definition: _auto_turret.gsc:434
‪add_interrupt_connection
‪function add_interrupt_connection(from_state_name, to_state_name, on_notify, checkfunc)
Definition: statemachine_shared.gsc:90
‪state_combat_exit
‪function state_combat_exit(params)
Definition: _auto_turret.gsc:306
‪toggle_lensflare
‪function toggle_lensflare(bool)
Definition: turret_shared.gsc:2637
‪add_state
‪function add_state(name, enter_func, update_func, exit_func, reenter_func)
Definition: statemachine_shared.gsc:59
‪lights_off
‪function lights_off(localClientNum)
Definition: vehicle_shared.csc:652
‪evaluate_connections
‪function evaluate_connections(eval_func, params)
Definition: statemachine_shared.gsc:266
‪track_lens_flare
‪function track_lens_flare()
Definition: turret_shared.gsc:2642
‪turretCallback_VehicleDamage
‪function turretCallback_VehicleDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal)
Definition: _auto_turret.gsc:462
‪toggle_emp_fx
‪function toggle_emp_fx(on)
Definition: vehicle_shared.gsc:2863
‪IsCooldownReady
‪function IsCooldownReady(name, timeForward_seconds)
Definition: vehicle_ai_shared.gsc:1968
‪InitThreatBias
‪function InitThreatBias()
Definition: vehicle_ai_shared.gsc:60
‪defaultstate_off_exit
‪function defaultstate_off_exit(params)
Definition: vehicle_ai_shared.gsc:1711
‪emp_startup_fx
‪function emp_startup_fx()
Definition: vehicle_ai_shared.gsc:1457
‪defaultRole
‪function defaultRole()
Definition: _auto_turret.gsc:92
‪__init__
‪function __init__()
Definition: _auto_turret.gsc:23
‪turret_idle_sound_stop
‪function turret_idle_sound_stop()
Definition: _auto_turret.gsc:485
‪sentry_turret_alert_sound
‪function sentry_turret_alert_sound()
Definition: _auto_turret.gsc:470
‪state_off_enter
‪function state_off_enter(params)
Definition: _auto_turret.gsc:349
‪state_death_update
‪function state_death_update(params)
Definition: _auto_turret.gsc:125
‪defaultstate_death_update
‪function defaultstate_death_update(params)
Definition: vehicle_ai_shared.gsc:1355
‪state_emped_update
‪function state_emped_update(params)
Definition: _auto_turret.gsc:410
‪state_scripted_update
‪function state_scripted_update(params)
Definition: _auto_turret.gsc:446
‪shared_callback_damage
‪function shared_callback_damage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal)
Definition: vehicle_ai_shared.gsc:726
‪rest_turret
‪function rest_turret(resting_pitch)
Definition: _auto_turret.gsc:365
‪StartInitialState
‪function StartInitialState(defaultState="combat")
Definition: vehicle_ai_shared.gsc:866
‪should_switch_to_unaware
‪function should_switch_to_unaware(current_state, to_state, connection)
Definition: _auto_turret.gsc:152
‪state_combat_update
‪function state_combat_update(params)
Definition: _auto_turret.gsc:243
‪defaultstate_emped_enter
‪function defaultstate_emped_enter(params)
Definition: vehicle_ai_shared.gsc:1427
‪state_off_exit
‪function state_off_exit(params)
Definition: _auto_turret.gsc:357
‪Cooldown
‪function Cooldown(name, time_seconds)
Definition: vehicle_ai_shared.gsc:1943
‪init_state_machine_for_role
‪function init_state_machine_for_role(rolename)
Definition: vehicle_ai_shared.gsc:1034
‪state_emped_enter
‪function state_emped_enter(params)
Definition: _auto_turret.gsc:386
‪sentry_turret_fire_for_time
‪function sentry_turret_fire_for_time(totalFireTime, enemy)
Definition: _auto_turret.gsc:311
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪turret_idle_sound
‪function turret_idle_sound()
Definition: _auto_turret.gsc:475
‪Spawn
‪function Spawn(parent, onDeathCallback)
Definition: _flak_drone.gsc:427
‪should_switch_to_combat
‪function should_switch_to_combat(current_state, to_state, connection)
Definition: _auto_turret.gsc:233
‪turretAllowFriendlyFireDamage
‪function turretAllowFriendlyFireDamage(eInflictor, eAttacker, sMeansOfDeath, weapon)
Definition: _auto_turret.gsc:452
‪turret_initialze
‪function turret_initialze()
Definition: _auto_turret.gsc:28
‪GetCooldownLeft
‪function GetCooldownLeft(name)
Definition: vehicle_ai_shared.gsc:1961
‪defaultstate_off_enter
‪function defaultstate_off_enter(params)
Definition: vehicle_ai_shared.gsc:1681
‪add_utility_connection
‪function add_utility_connection(from_state_name, to_state_name, checkfunc, defaultScore)
Definition: statemachine_shared.gsc:112
‪get_script_bundle
‪function get_script_bundle(str_type, str_name)
Definition: struct.csc:45
‪get_state_callbacks
‪function get_state_callbacks(statename)
Definition: vehicle_ai_shared.gsc:927
‪defaultstate_emped_exit
‪function defaultstate_emped_exit(params)
Definition: vehicle_ai_shared.gsc:1488
‪state_unaware_update
‪function state_unaware_update(params)
Definition: _auto_turret.gsc:162