‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_deploy_turret.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\math_shared;
4 #using scripts\shared\statemachine_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\util_shared;
7 #using scripts\shared\vehicle_shared;
8 #using scripts\shared\vehicle_ai_shared;
9 #using scripts\shared\flag_shared;
10 
11 #insert scripts\shared\shared.gsh;
12 #insert scripts\shared\statemachine.gsh;
13 
14 #insert scripts\shared\ai\utility.gsh;
15 
16 #define TURRET_HUD_MARKED_TARGET "hud_proto_rts_secure_target"
17 #define TURRET_HUD_ELEM_CONSTANT_SIZE true
18 
19 #precache( "material", TURRET_HUD_MARKED_TARGET );
20 
21 #namespace turret_gadget_deploy;
22 
23 ‪REGISTER_SYSTEM( "turret_gadget_deploy", &‪__init__, undefined )
24 
25 function ‪__init__()
26 {
27  //vehicle::add_main_callback( "turret_gadget_deploy",&turret_gadget_deploy_think );
28 }
29 
30 function ‪turret_gadget_deploy_think( player, power_callback, cutoff_power, resume_power )
31 {
32  self.power_callback = power_callback;
33  self.cutoff_power = cutoff_power;
34  self.resume_power = resume_power;
35 
36  self DisableAimAssist();
37 
38  self.state_machine = ‪statemachine::create( "brain", self );
39 
40  ‪main = self.state_machine ‪statemachine::add_state( "main", undefined, undefined,&‪turret_gadget_deploy_main, undefined, undefined );
41  scripted = self.state_machine ‪statemachine::add_state( "scripted", undefined, undefined,&‪turret_gadget_deploy_scripted, undefined, undefined );
42 
43  ‪vehicle_ai::add_interrupt_connection( "main", "scripted", "enter_vehicle" );
44  ‪vehicle_ai::add_interrupt_connection( "main", "scripted", "scripted" );
45  ‪vehicle_ai::add_interrupt_connection( "scripted", "main", "exit_vehicle" );
46  ‪vehicle_ai::add_interrupt_connection( "scripted", "main", "scripted_done" );
47 
48  self.overrideVehicleDamage =&‪TurretCallback_VehicleDamage;
49 
50  // Set the first state
51  if ( isdefined( self.script_startstate ) )
52  {
53  if( self.script_startstate == "off" )
54  self ‪turret_gadget_deploy_off( self.angles );
55  else
56  self.state_machine ‪statemachine::set_state( self.script_startstate );
57  }
58  else
59  {
60  // Set the first state
62  }
63 
64  self laserOn();
65 }
66 
68 {
69  self.state_machine ‪statemachine::set_state( "scripted" );
70 }
71 
73 {
74  self.goalpos = self.origin;
75  self.state_machine ‪statemachine::set_state( "main" );
76 }
77 
79 {
80  if( IsAlive( self ) )
81  {
82  self DisableAimAssist();
84  }
85 }
86 
88 {
89  self.state_machine ‪statemachine::set_state( "scripted" );
91  self LaserOff();
92  self ‪vehicle::toggle_sounds( 0 );
94 
95  if(!isdefined(angles))
96  angles = self GetTagAngles( "tag_flash" );
97 
98  target_vec = self.origin + AnglesToForward( ( 0, angles[1], 0 ) ) * 1000;
99  target_vec = target_vec + ( 0, 0, -1700 );
100  self SetTargetOrigin( target_vec );
101  self.off = true;
102  if( !isdefined( self.‪emped ) )
103  {
104  self DisableAimAssist();
105  }
106 }
107 
109 {
110  self ‪vehicle::lights_on();
111  self EnableAimAssist();
112  self ‪vehicle::toggle_sounds( 1 );
113 
115  self.off = undefined;
116 
118 }
119 
121 {
122  self endon( "death" );
123  self endon( "change_state" );
124 
125  max_range = 1500;
126 
127  no_target_delay = 0.05;
128 
129  self.n_burstCountMin = 1;
130  self.n_burstCountMax = 2;
131  self.n_burstWaitTime = 1.5;
132 
133  self thread ‪hud_marker_create();
134 
135  while( 1 )
136  {
137  if ( IsDefined( self.enemy ) && self VehCanSee( self.enemy ) )
138  {
139  if ( IsDefined( self.enemy ) && DistanceSquared( self.enemy.origin, self.origin ) < max_range * max_range )
140  {
141  self SetTurretTargetEnt( self.enemy );
142  self SetLookAtEnt(self.enemy);
143  self ‪turret_gadget_deploy_fire_for_time( RandomFloatRange( self.n_burstCountMin, self.n_burstCountMax ) ); //Tune-able - burst count
144  self ClearLookAtEnt();
145  }
146 
147  wait ( self.n_burstWaitTime );
148  }
149  else
150  {
151  wait no_target_delay;
152  }
153  }
154 }
155 
156 
157 function ‪has_enough_power(min_power)
158 {
159  power = 100;
160  if ( IsDefined( self.power_callback ) )
161  {
162  if ( IsDefined(self.owner) )
163  power = self.owner [[self.power_callback]](self,0);
164  else
165  power = 0;
166  }
167  if ( power > min_power )
168  return true;
169  return false;
170 }
171 
172 
173 function ‪boot_sound()
174 {
175  self playsound ("veh_cic_turret_boot");
176 }
177 
178 function ‪alert_sound()
179 {
180  self playsound ("veh_turret_alert");
181 }
182 
183 function ‪scan_sound()
184 {
185  self playloopsound( "veh_turret_servo" , .05 );
186 }
187 
189 {
190  if( isdefined( self.enemy ) && IsAlive( self.enemy) && self VehCanSee( self.enemy ) && !‪IS_TRUE(self.enemy.ignoreme) )
191  return true;
192  return false;
193 }
194 
195 //#define TURRET_BOOT_TIME 0.2
196 #define TURRET_BOOT_TIME GetDvarFloat("scr_turret_boot_timer")
197 #define TURRET_LOCK_TIME GetDvarFloat("scr_turret_lock_timer")
198 #define TURRET_BURST_MIN_DURATION GetDvarFloat("scr_turret_burst_min_duration")
199 #define TURRET_BURST_MAX_DURATION GetDvarFloat("scr_turret_burst_max_duration")
200 #define TURRET_BURST_MIN_DELAY GetDvarFloat("scr_turret_burst_min_delay")
201 #define TURRET_BURST_MAX_DELAY GetDvarFloat("scr_turret_burst_max_delay")
202 #define TURRET_BURST_MIN_DELAY_LONG GetDvarFloat("scr_turret_burst_min_delay_long")
203 #define TURRET_BURST_MAX_DELAY_LONG GetDvarFloat("scr_turret_burst_max_delay_long")
204 #define TURRET_ROT_SCALE_IDLE GetDvarFloat("scr_turret_rot_scale_idle")
205 #define TURRET_ROT_SCALE_COMBAT GetDvarFloat("scr_turret_rot_scale_combat")
206 
208 {
209  self endon( "death" );
210  self endon( "change_state" );
211 
212  cant_see_enemy_count = 0;
213 
214  ‪DEFAULT(self.default_pitch,0);
215  ‪DEFAULT(self.scanning_arc,80);
216 
217  self ‪boot_sound();
218 
219  wait ‪TURRET_BOOT_TIME;
220 
221  origin = self GetTagOrigin( "tag_barrel" );
222 
223  if (!IsDefined(origin))
224  origin = self.origin;
225 
226  left_look_at_pt = origin + AnglesToForward( self.angles + (self.default_pitch, self.scanning_arc, 0) ) * 1000;
227  right_look_at_pt = origin + AnglesToForward( self.angles + (self.default_pitch, -self.scanning_arc, 0) ) * 1000;
228  powerless_look_at_pt = origin + AnglesToForward( self.angles + (15.0, 0, 0) ) * 1000;
229 
230  self.min_power = self.cutoff_power;
231 
232  while( 1 )
233  {
234  if ( !self ‪has_enough_power(self.min_power) )
235  {
236  self.min_power = self.resume_power;
237  self SetTurretTargetVec( powerless_look_at_pt );
238  wait 0.5;
239  }
240  else if( self ‪has_visible_target() )
241  {
242  self.min_power = self.cutoff_power;
243  self.turretRotScale = ‪TURRET_ROT_SCALE_COMBAT;
244 
245  lock_time = 0.1;
246  if( ( cant_see_enemy_count > 0 || !‪IS_EQUAL(self.last_enemy,self.enemy) ) && IsPlayer( self.enemy ) )
247  {
248  self ‪alert_sound();
249  wait 0.1; //wait between alert sound and rotation
250  lock_time = ‪TURRET_LOCK_TIME;
251  self.last_enemy = self.enemy;
252  }
253 
254  cant_see_enemy_count = 0;
255 
256  for( i = 0; i < 3; i++ )
257  {
258  if ( self ‪has_visible_target() )
259  {
260  self SetTurretTargetEnt( self.enemy );
261  self ‪util::waittill_notify_or_timeout( "turret_on_target", 1.0 );
262  wait lock_time; //wait between rotation start and start firing
263  lock_time = 0.1;
264  if ( self ‪has_visible_target() )
265  {
267  }
268  else
269  {
270  break;
271  }
272  }
273  else
274  {
275  self ClearTargetEntity();
276  break;
277  }
278 
279  if( isdefined( self.enemy ) && IsPlayer( self.enemy ) )
280  wait RandomFloatRange( ‪TURRET_BURST_MIN_DELAY, ‪TURRET_BURST_MAX_DELAY );
281  else
282  wait RandomFloatRange( ‪TURRET_BURST_MIN_DELAY, ‪TURRET_BURST_MAX_DELAY ) * 2;
283  }
284 
285  if ( self ‪has_visible_target() )
286  {
287  if( IsPlayer( self.enemy ) )
289  else
291  }
292  }
293  else
294  {
295  self.min_power = self.cutoff_power;
296  self.turretRotScale = ‪TURRET_ROT_SCALE_IDLE;
297 
298  cant_see_enemy_count++;
299 
300  //wait 0.1;
301 
302  if( cant_see_enemy_count > 1 )
303  {
304  self.turret_state = 0;
305  while( !isdefined( self.enemy ) || !(self VehCanSee( self.enemy )) )
306  {
307  if( self.turretontarget )
308  {
309  self.turret_state++;
310  if( self.turret_state > 1 )
311  self.turret_state = 0;
312  }
313  if( self.turret_state == 0 )
314  self SetTurretTargetVec( left_look_at_pt );
315  else
316  self SetTurretTargetVec( right_look_at_pt );
317 
318  wait 0.1;
319  }
320  }
321  else
322  {
323  self ClearTargetEntity();
324  }
325  }
326 
328  }
329 }
330 
331 
332 
333 function ‪hud_marker_create() // self = TURRET
334 {
335  hud_marked_target = NewHudElem();
336 
337  hud_marked_target.horzAlign = "right";
338  hud_marked_target.vertAlign = "middle";
339 
340  hud_marked_target.sort = 2;
341 
342  hud_marked_target.hidewheninmenu = true;
343  hud_marked_target.immunetodemogamehudsettings = true;
344 
345  const Z_OFFSET = 90;
346 
347  while ( isdefined( self ) )
348  {
349  if ( isdefined( self.enemy ) )
350  {
351  hud_marked_target.alpha = 1;
352 
353  hud_marked_target.x = self.enemy.origin[0];
354  hud_marked_target.y = self.enemy.origin[1];
355  hud_marked_target.z = self.enemy.origin[2] + Z_OFFSET;
356 
357  hud_marked_target SetShader( ‪TURRET_HUD_MARKED_TARGET, 5, 5 );
358  hud_marked_target SetWaypoint( ‪TURRET_HUD_ELEM_CONSTANT_SIZE );
359 
360  }
361  else
362  {
363  hud_marked_target.alpha = 0;
364  }
365 
367  }
368 
369  hud_marked_target Destroy();
370 }
371 
373 {
374  // do nothing state
375  driver = self GetSeatOccupant( 0 );
376  if( isdefined(driver) )
377  {
378  self.turretRotScale = 1;
379  self DisableAimAssist();
380  }
381 
382  self ClearTargetEntity();
383 }
384 
385 function ‪turret_gadget_deploy_fire_for_time( totalFireTime )
386 {
387  self endon( "crash_done" );
388  self endon( "death" );
389 
390  if( isdefined( self.‪emped ) )
391  return;
392 
393  weapon = self SeatGetWeapon( 0 );
394  fireTime = weapon.fireTime;
395  time = 0;
396 
397 
398  fireCount = 1;
399  power = 100;
400 
401  if ( IsDefined( self.power_callback ) )
402  {
403  power = self.owner [[self.power_callback]](self,0.0);
404  }
405 
406  while( time < totalFireTime && !isdefined( self.‪emped ) && power > 0)
407  {
408  if ( IsDefined( self.power_callback ) )
409  {
410  power = self.owner [[self.power_callback]](self,fireTime/totalFireTime);
411  }
412  if( !‪IS_EQUAL(self.last_enemy,self.enemy) && IsPlayer( self.enemy ) )
413  {
414  self ‪alert_sound();
415  wait 0.1; //wait between alert sound and rotation
416  self.last_enemy = self.enemy;
417  }
418  self FireWeapon();
419  fireCount++;
420  wait fireTime;
421  time += fireTime;
422  }
423 }
424 
426 {
427  self endon( "death" );
428  self notify( "emped" );
429  self endon( "emped" );
430 
431  self.emped = true;
432  PlaySoundAtPosition( "veh_cic_turret_emp_down", self.origin );
433  self.turretRotScale = 0.2;
435  if( !isdefined( self.stun_fx) )
436  {
437  self.stun_fx = ‪Spawn( "script_model", self.origin );
438  self.stun_fx SetModel( "tag_origin" );
439  self.stun_fx LinkTo( self, "tag_fx", (0,0,0), (0,0,0) );
440  if( isSubStr(self.vehicletype,"turret_sentry") )
441  PlayFXOnTag( level._effect[ "sentry_turret_stun" ], self.stun_fx, "tag_origin" );
442  else
443  PlayFXOnTag( level._effect[ "cic_turret_stun" ], self.stun_fx, "tag_origin" );
444  }
445 
446  wait RandomFloatRange( 6, 10 );
447 
448  self.stun_fx delete();
449 
450  self.emped = undefined;
452 }
453 
454 function ‪TurretCallback_VehicleDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName )
455 {
456  driver = self GetSeatOccupant( 0 );
457 
458  if( weapon.isEmp && sMeansOfDeath != "MOD_IMPACT" )
459  {
460  if( !isdefined( driver ) )
461  {
462  if( !isdefined( self.off ) )
463  {
464  self thread ‪turret_gadget_deploy_emped();
465  }
466  }
467  }
468  if ( IsDefined(self.dt_damage_callback) )
469  {
470  self thread [[self.dt_damage_callback]]();
471  }
472 
473  return iDamage;
474 }
‪add_interrupt_connection
‪function add_interrupt_connection(from_state_name, to_state_name, on_notify, checkfunc)
Definition: statemachine_shared.gsc:90
‪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
‪turret_gadget_deploy_start_ai
‪function turret_gadget_deploy_start_ai()
Definition: _deploy_turret.gsc:72
‪set_state
‪function set_state(name, state_params)
Definition: statemachine_shared.gsc:133
‪TURRET_LOCK_TIME
‪#define TURRET_LOCK_TIME
Definition: _deploy_turret.gsc:197
‪turret_gadget_deploy_main
‪function turret_gadget_deploy_main()
Definition: _deploy_turret.gsc:78
‪TURRET_BURST_MAX_DELAY_LONG
‪#define TURRET_BURST_MAX_DELAY_LONG
Definition: _deploy_turret.gsc:203
‪toggle_exhaust_fx
‪function toggle_exhaust_fx(on)
Definition: vehicle_shared.gsc:3335
‪TURRET_BURST_MIN_DURATION
‪#define TURRET_BURST_MIN_DURATION
Definition: _deploy_turret.gsc:198
‪scan_sound
‪function scan_sound()
Definition: _deploy_turret.gsc:183
‪TURRET_BURST_MIN_DELAY_LONG
‪#define TURRET_BURST_MIN_DELAY_LONG
Definition: _deploy_turret.gsc:202
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪TURRET_ROT_SCALE_COMBAT
‪#define TURRET_ROT_SCALE_COMBAT
Definition: _deploy_turret.gsc:205
‪turret_gadget_deploy_fire_for_time
‪function turret_gadget_deploy_fire_for_time(totalFireTime)
Definition: _deploy_turret.gsc:385
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪has_visible_target
‪function has_visible_target()
Definition: _deploy_turret.gsc:188
‪turret_gadget_deploy_think
‪function turret_gadget_deploy_think(player, power_callback, cutoff_power, resume_power)
Definition: _deploy_turret.gsc:30
‪turret_gadget_deploy_on
‪function turret_gadget_deploy_on()
Definition: _deploy_turret.gsc:108
‪waittill_notify_or_timeout
‪function waittill_notify_or_timeout(msg, timer)
Definition: util_shared.csc:473
‪turret_gadget_deploy_scripted
‪function turret_gadget_deploy_scripted()
Definition: _deploy_turret.gsc:372
‪TURRET_BURST_MIN_DELAY
‪#define TURRET_BURST_MIN_DELAY
Definition: _deploy_turret.gsc:200
‪turret_gadget_deploy_fireupdate
‪function turret_gadget_deploy_fireupdate()
Definition: _deploy_turret.gsc:207
‪create
‪function create(name, origin, team, shader, alpha, scale)
Definition: objpoints_shared.gsc:32
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪turret_gadget_deploy_fireupdate_old
‪function turret_gadget_deploy_fireupdate_old()
Definition: _deploy_turret.gsc:120
‪emped
‪function emped(down_time)
Definition: _siegebot.gsc:1359
‪Spawn
‪function Spawn(parent, onDeathCallback)
Definition: _flak_drone.gsc:427
‪boot_sound
‪function boot_sound()
Definition: _deploy_turret.gsc:173
‪TURRET_BURST_MAX_DURATION
‪#define TURRET_BURST_MAX_DURATION
Definition: _deploy_turret.gsc:199
‪__init__
‪function __init__()
Definition: _deploy_turret.gsc:25
‪IS_EQUAL
‪#define IS_EQUAL(__a, __b)
Definition: shared.gsh:250
‪turret_gadget_deploy_off
‪function turret_gadget_deploy_off(angles)
Definition: _deploy_turret.gsc:87
‪turret_gadget_deploy_emped
‪function turret_gadget_deploy_emped()
Definition: _deploy_turret.gsc:425
‪main
‪function main()
Definition: _global_fx.csc:17
‪TurretCallback_VehicleDamage
‪function TurretCallback_VehicleDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName)
Definition: _deploy_turret.gsc:454
‪TURRET_BOOT_TIME
‪#define TURRET_BOOT_TIME
Definition: _deploy_turret.gsc:196
‪TURRET_BURST_MAX_DELAY
‪#define TURRET_BURST_MAX_DELAY
Definition: _deploy_turret.gsc:201
‪TURRET_HUD_ELEM_CONSTANT_SIZE
‪#define TURRET_HUD_ELEM_CONSTANT_SIZE
Definition: _deploy_turret.gsc:17
‪hud_marker_create
‪function hud_marker_create()
Definition: _deploy_turret.gsc:333
‪toggle_sounds
‪function toggle_sounds(on)
Definition: vehicle_shared.gsc:3379
‪TURRET_HUD_MARKED_TARGET
‪#define TURRET_HUD_MARKED_TARGET
Definition: _deploy_turret.gsc:16
‪lights_on
‪function lights_on(localClientNum, team)
Definition: vehicle_shared.csc:404
‪turret_gadget_deploy_start_scripted
‪function turret_gadget_deploy_start_scripted()
Definition: _deploy_turret.gsc:67
‪has_enough_power
‪function has_enough_power(min_power)
Definition: _deploy_turret.gsc:157
‪TURRET_ROT_SCALE_IDLE
‪#define TURRET_ROT_SCALE_IDLE
Definition: _deploy_turret.gsc:204
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪alert_sound
‪function alert_sound()
Definition: _deploy_turret.gsc:178