‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_zm_mgturret.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #insert scripts\shared\shared.gsh;
4 
5 #namespace zm_mgturret;
6 
7 function ‪main()
8 {
9  // TODO: what does this main do exactly?
10  // TODO: change this dvar name to turret or something; really? we have a dvar named mg42
11  if( GetDvarString( "mg42" ) == "" )
12  {
13  SetDvar( "mgTurret", "off" );
14  }
15 
16  level.magic_distance = 24;
17 
18  turretInfos = getEntArray( "turretInfo", "targetname" );
19  for( index = 0; index < turretInfos.size; index++ )
20  {
21  turretInfos[index] Delete();
22  }
23 }
24 
25 function ‪set_difficulty( difficulty )
26 {
28 
29  turrets = GetEntArray( "misc_turret", "classname" );
30 
31  for( index = 0; index < turrets.size; index++ )
32  {
33  if( isdefined( turrets[index].script_skilloverride ) )
34  {
35  switch( turrets[index].script_skilloverride )
36  {
37  case "easy":
38  difficulty = "easy";
39  break;
40  case "medium":
41  difficulty = "medium";
42  break;
43  case "hard":
44  difficulty = "hard";
45  break;
46  case "fu":
47  difficulty = "fu";
48  break;
49  default:
50  continue;
51  }
52  }
53  ‪turret_set_difficulty( turrets[index], difficulty );
54  }
55 }
56 
58 {
59  level.mgTurretSettings["easy"]["convergenceTime"] = 2.5;
60  level.mgTurretSettings["easy"]["suppressionTime"] = 3.0;
61  level.mgTurretSettings["easy"]["accuracy"] = 0.38;
62  level.mgTurretSettings["easy"]["aiSpread"] = 2;
63  level.mgTurretSettings["easy"]["playerSpread"] = 0.5;
64 
65  level.mgTurretSettings["medium"]["convergenceTime"] = 1.5;
66  level.mgTurretSettings["medium"]["suppressionTime"] = 3.0;
67  level.mgTurretSettings["medium"]["accuracy"] = 0.38;
68  level.mgTurretSettings["medium"]["aiSpread"] = 2;
69  level.mgTurretSettings["medium"]["playerSpread"] = 0.5;
70 
71  level.mgTurretSettings["hard"]["convergenceTime"] = .8;
72  level.mgTurretSettings["hard"]["suppressionTime"] = 3.0;
73  level.mgTurretSettings["hard"]["accuracy"] = 0.38;
74  level.mgTurretSettings["hard"]["aiSpread"] = 2;
75  level.mgTurretSettings["hard"]["playerSpread"] = 0.5;
76 
77  level.mgTurretSettings["fu"]["convergenceTime"] = .4;
78  level.mgTurretSettings["fu"]["suppressionTime"] = 3.0;
79  level.mgTurretSettings["fu"]["accuracy"] = 0.38;
80  level.mgTurretSettings["fu"]["aiSpread"] = 2;
81  level.mgTurretSettings["fu"]["playerSpread"] = 0.5;
82 }
83 
84 function ‪turret_set_difficulty( turret, difficulty )
85 {
86  turret.convergenceTime = level.mgTurretSettings[difficulty]["convergenceTime"];
87  turret.suppressionTime = level.mgTurretSettings[difficulty]["suppressionTime"];
88  turret.accuracy = level.mgTurretSettings[difficulty]["accuracy"];
89  turret.aiSpread = level.mgTurretSettings[difficulty]["aiSpread"];
90  turret.playerSpread = level.mgTurretSettings[difficulty]["playerSpread"];
91 }
92 
93 function ‪turret_suppression_fire( targets ) // self == turret
94 {
95  self endon( "death" );
96  self endon( "stop_suppression_fire" );
97  if( !isdefined( self.suppresionFire ) )
98  {
99  self.suppresionFire = true;
100  }
101 
102  for( ;; )
103  {
104  while( self.suppresionFire )
105  {
106  self SetTargetEntity( targets[RandomInt( targets.size )] );
107  wait( 2 + RandomFloat( 2 ) );
108  }
109 
110  self ClearTargetEntity();
111  while( !self.suppresionFire )
112  {
113  wait( 1 );
114  }
115  }
116 }
117 
118 // returns a time frame for the burst fire depending on the setting parameter
119 function ‪burst_fire_settings( setting )
120 {
121  if( setting == "delay" )
122  {
123  return 0.2;
124  }
125  else if( setting == "delay_range" )
126  {
127  return 0.5;
128  }
129  else if( setting == "burst" )
130  {
131  return 0.5;
132  }
133  else if( setting == "burst_range" )
134  {
135  return 4;
136  }
137 }
138 
139 // makes the turret burst fire with delays in between
140 function ‪burst_fire( turret, manual_target )
141 {
142  turret endon( "death" ); // MikeD: Incase we delete the turret.
143  turret endon( "stopfiring" );
144  self endon( "stop_using_built_in_burst_fire" );
145 
146 
147  if( isdefined( turret.script_delay_min ) )
148  {
149  turret_delay = turret.script_delay_min;
150  }
151  else
152  {
153  turret_delay = ‪burst_fire_settings( "delay" );
154  }
155 
156  if( isdefined( turret.script_delay_max ) )
157  {
158  turret_delay_range = turret.script_delay_max - turret_delay;
159  }
160  else
161  {
162  turret_delay_range = ‪burst_fire_settings( "delay_range" );
163  }
164 
165  if( isdefined( turret.script_burst_min ) )
166  {
167  turret_burst = turret.script_burst_min;
168  }
169  else
170  {
171  turret_burst = ‪burst_fire_settings( "burst" );
172  }
173 
174  if( isdefined( turret.script_burst_max ) )
175  {
176  turret_burst_range = turret.script_burst_max - turret_burst;
177  }
178  else
179  {
180  turret_burst_range = ‪burst_fire_settings( "burst_range" );
181  }
182 
183  while( 1 )
184  {
185  turret StartFiring();
186 
187 
188 
189  if( isdefined( manual_target ) )
190  {
191  turret thread ‪random_spread( manual_target );
192  }
193  turret ‪do_shoot();
194 
195  wait( turret_burst + RandomFloat( turret_burst_range ) );
196 
197  turret StopShootTurret();
198 
199  turret StopFiring();
200 
201  wait( turret_delay + RandomFloat( turret_delay_range ) );
202  }
203 }
204 
205 // auto targeting and burst firing at the targets
206 function ‪burst_fire_unmanned() // self == turret
207 {
208  self notify( "stop_burst_fire_unmanned" );
209  self endon( "stop_burst_fire_unmanned" );
210  self endon( "death" );
211  self endon( "remote_start" );
212  level endon( "game_ended" );
213 
214  if ( isdefined( self.controlled ) && self.controlled )
215  {
216  return;
217  }
218 
219  if( isdefined( self.script_delay_min ) )
220  {
221  turret_delay = self.script_delay_min;
222  }
223  else
224  {
225  turret_delay = ‪burst_fire_settings( "delay" );
226  }
227 
228  if( isdefined( self.script_delay_max ) )
229  {
230  turret_delay_range = self.script_delay_max - turret_delay;
231  }
232  else
233  {
234  turret_delay_range = ‪burst_fire_settings( "delay_range" );
235  }
236 
237  if( isdefined( self.script_burst_min ) )
238  {
239  turret_burst = self.script_burst_min;
240  }
241  else
242  {
243  turret_burst = ‪burst_fire_settings( "burst" );
244  }
245 
246  if( isdefined( self.script_burst_max ) )
247  {
248  turret_burst_range = self.script_burst_max - turret_burst;
249  }
250  else
251  {
252  turret_burst_range = ‪burst_fire_settings( "burst_range" );
253  }
254 
255  pauseUntilTime = GetTime();
256  turretState = "start";
257  // SRS 05/02/07 - added this for link_turrets() so we can accurately tell when the function is
258  // actually firing or just waiting between bursts (IsFiringTurret() returns true the whole time)
259  self.script_shooting = false;
260 
261  for( ;; )
262  {
263  if( isdefined( self.manual_targets ) )
264  {
265  self ClearTargetEntity();
266  self SetTargetEntity( self.manual_targets[RandomInt( self.manual_targets.size )] );
267  }
268 
269  duration = ( pauseUntilTime - GetTime() ) * 0.001;
270  if( self IsFiringTurret() && (duration <= 0) )
271  {
272  if( turretState != "fire" )
273  {
274  turretState = "fire";
275  self playsound ("mpl_turret_alert"); // Play a state change sound CDC
276 
277  self thread ‪do_shoot();
278  self.script_shooting = true;
279  }
280 
281  duration = turret_burst + RandomFloat( turret_burst_range );
282 
283  //println( "fire duration: ", duration );
284  self thread ‪turret_timer( duration );
285 
286  self waittill( "turretstatechange" ); // code or script
287 
288  self.script_shooting = false;
289 
290  duration = turret_delay + RandomFloat( turret_delay_range );
291  //println( "stop fire duration: ", duration );
292 
293  pauseUntilTime = GetTime() + Int( duration * 1000 );
294  }
295  else
296  {
297  if( turretState != "aim" )
298  {
299  turretState = "aim";
300  }
301 
302  //println( "aim duration: ", duration );
303  self thread ‪turret_timer( duration );
304 
305  // TODO: make the turret scan back and forth
306 
307  self waittill( "turretstatechange" ); // code or script
308  }
309  }
310 }
311 
312 
314 {
315  if (!isdefined(level._zm_mgturret_firing))
316  level._zm_mgturret_firing = 0;
317  level._zm_mgturret_firing++;
318  wait time;
319  level._zm_mgturret_firing--;
320 }
321 
322 
323 
324 function ‪do_shoot()
325 {
326  self endon( "death" );
327  self endon( "turretstatechange" ); // code or script
328 
329  for( ;; )
330  {
331  while (‪IS_TRUE(level._zm_mgturret_firing))
332  wait 0.1;
333  thread ‪avoid_synchronization(0.1);
334  //ent = self GetTargetEntity();
335  //ent DoDamage( ent.health + 666, ent.origin );
336  self ShootTurret();
337  wait( 0.112 );
338  }
339 }
340 
341 // waits for a duration and sends a turret state change notify
342 function ‪turret_timer( duration )
343 {
344  if( duration <= 0 )
345  {
346  return;
347  }
348 
349  self endon( "turretstatechange" ); // code
350 
351  //println( "start turret timer" );
352 
353  wait( duration );
354  if( isdefined( self ) )
355  {
356  self notify( "turretstatechange" );
357  }
358 
359  //println( "end turret timer" );
360 }
361 
362 function ‪random_spread( ent )
363 {
364  self endon( "death" );
365 
366  self notify( "stop random_spread" );
367  self endon( "stop random_spread" );
368 
369  self endon( "stopfiring" );
370  self SetTargetEntity( ent );
371 
372  self.manual_target = ent;
373 
374  while( 1 )
375  {
376 
377  // SCRIPTER_MOD
378  // MikeD( 3/21/2007 ): No more level.player
379  // if( ent == level.player )
380  // ent.origin = self.manual_target GetOrigin();
381  // else
382  // ent.origin = self.manual_target.origin;
383 
384  if( IsPlayer( ent ) )
385  {
386  ent.origin = self.manual_target GetOrigin();
387  }
388  else
389  {
390  ent.origin = self.manual_target.origin;
391  }
392 
393  ent.origin += ( 20 - RandomFloat( 40 ), 20 - RandomFloat( 40 ), 20 - RandomFloat( 60 ) );
394  wait( 0.2 );
395  }
396 }
‪random_spread
‪function random_spread(ent)
Definition: _zm_mgturret.gsc:362
‪turret_timer
‪function turret_timer(duration)
Definition: _zm_mgturret.gsc:342
‪burst_fire_settings
‪function burst_fire_settings(setting)
Definition: _zm_mgturret.gsc:119
‪init_turret_difficulty_settings
‪function init_turret_difficulty_settings()
Definition: _zm_mgturret.gsc:57
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪turret_suppression_fire
‪function turret_suppression_fire(targets)
Definition: _zm_mgturret.gsc:93
‪main
‪function main()
Definition: _zm_mgturret.gsc:7
‪burst_fire_unmanned
‪function burst_fire_unmanned()
Definition: _zm_mgturret.gsc:206
‪turret_set_difficulty
‪function turret_set_difficulty(turret, difficulty)
Definition: _zm_mgturret.gsc:84
‪do_shoot
‪function do_shoot()
Definition: _zm_mgturret.gsc:324
‪burst_fire
‪function burst_fire(turret, manual_target)
Definition: _zm_mgturret.gsc:140
‪avoid_synchronization
‪function avoid_synchronization(time)
Definition: _zm_mgturret.gsc:313
‪set_difficulty
‪function set_difficulty(difficulty)
Definition: _zm_mgturret.gsc:25