‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_siegebot.gsc
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // #using
3 // ----------------------------------------------------------------------------
4 #using scripts\codescripts\struct;
5 
6 #using scripts\shared\_oob;
7 #using scripts\shared\callbacks_shared;
8 #using scripts\shared\clientfield_shared;
9 #using scripts\shared\gameskill_shared;
10 #using scripts\shared\math_shared;
11 #using scripts\shared\scoreevents_shared;
12 #using scripts\shared\statemachine_shared;
13 #using scripts\shared\system_shared;
14 #using scripts\shared\array_shared;
15 #using scripts\shared\util_shared;
16 
17 #using scripts\shared\vehicle_shared;
18 #using scripts\shared\vehicle_death_shared;
19 #using scripts\shared\vehicle_ai_shared;
20 
21 #using scripts\shared\ai\systems\blackboard;
22 #using scripts\shared\ai\blackboard_vehicle;
23 
24 #using scripts\shared\turret_shared;
25 #using scripts\shared\weapons\_spike_charge_siegebot;
26 
27 #insert scripts\mp\_hacker_tool.gsh;
28 #insert scripts\shared\shared.gsh;
29 #insert scripts\shared\statemachine.gsh;
30 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
31 
32 #using scripts\mp\killstreaks\_killstreaks;
33 #using scripts\mp\killstreaks\_killstreak_bundles;
34 #using scripts\mp\gametypes\_loadout;
35 
36 #insert scripts\shared\ai\utility.gsh;
37 #insert scripts\shared\version.gsh;
38 
39 #define JUMP_COOLDOWN 7
40 #define DEBUG_ON false
41 
42 #define SIEGEBOT_BUNDLE "siegebot"
43 #define SIEGEBOT_MISSILE_TURRET_INDEX 2 // number similiarly to Gunner1, Gunner2, etc.
44 #define SIEGEBOT_MISSILE_COUNT_AFTER_RELOAD 3
45 
46 #define SIEGEBOT_RIGHT_ARM_TRACE_TAG "tag_turret"
47 #define SIEGEBOT_RIGHT_ARM_TRACE_OFFSET 60 // relative to right axis
48 #define SIEGEBOT_RIGHT_ARM_TRACE_START 40 // relative to forward
49 #define SIEGEBOT_RIGHT_ARM_TRACE_END -30 // relative to forward
50 
51 #define SIEGEBOT_LEFT_ARM_TRACE_TAG "tag_turret"
52 #define SIEGEBOT_LEFT_ARM_TRACE_OFFSET -60
53 #define SIEGEBOT_LEFT_ARM_TRACE_START 40 // relative to forward
54 #define SIEGEBOT_LEFT_ARM_TRACE_END -30 // relative to forward
55 
56 #define SIEGEBOT_ARM_TRACE_CLIP_MASK PHYSICS_TRACE_MASK_PHYSICS | PHYSICS_TRACE_MASK_CLIP
57 
58 #define SIEGEBOT_ROCKET_WALL_TRACE_TAG "tag_gunner_flash2b"
59 #define SIEGEBOT_ROCKET_WALL_TRACE_START 12 // relative to forward
60 #define SIEGEBOT_ROCKET_WALL_TRACE_END -12 // relative to forward
61 #define SIEGEBOT_ROCKET_WALL_RELATIVE_TAG "tag_turret"
62 
63 #define SIEGEBOT_ROCKET_WALL_TAG "tag_turret" // to re-aim when rocket will shoot through a wall
64 #define SIEGEBOT_ROCKET_WALL_FORWARD_OFFSET 100
65 #define SIEGEBOT_ROCKET_WALL_RIGHT_OFFSET 40
66 #define SIEGEBOT_ROCKET_WALL_Z_OFFSET 500
67 #define SIEGEBOT_ROCKET_WALL_BLOCKED_FRAMES 10 // how many frames not check wall block after becoming blocked
68 
69 
70 #namespace siegebot;
71 
72 ‪REGISTER_SYSTEM( "siegebot_mp", &‪__init__, undefined )
73 
74 #using_animtree( "generic" );
75 
76 function ‪__init__()
77 {
78  vehicle::add_main_callback( "siegebot_mp", &‪siegebot_initialize );
79 
80  ‪clientfield::register( "vehicle", "siegebot_retract_right_arm", ‪VERSION_TU15, 1, "int" );
81  ‪clientfield::register( "vehicle", "siegebot_retract_left_arm", ‪VERSION_TU15, 1, "int" );
82 
84 }
85 
87 {
88  self useanimtree( #animtree );
89 
92 
93  self.health = self.healthdefault;
94  self.spawnTime = GetTime();
95  self.is_oob_kill_target = true;
96  self.isStunned = false;
97  self.missiles_disabled = false;
98  self.numberRockets = ‪SIEGEBOT_MISSILE_COUNT_AFTER_RELOAD;
99 
101 
102  //Target_Set( self, ( 0, 0, 84 ) );
103  self.targetOffset = ( 0, 0, 84 );
104 
105 
106  self EnableAimAssist();
107  self SetNearGoalNotifyDist( 40 );
108 
109  self.fovcosine = 0.5; // +/-60 degrees = 120 fov
110  self.fovcosinebusy = 0.5;
111  self.maxsightdistsqrd = ‪SQR( 10000 );
112 
113  assert( isdefined( self.scriptbundlesettings ) );
114 
115  self.settings = ‪struct::get_script_bundle( "vehiclecustomsettings", self.scriptbundlesettings );
116 
117  self.goalRadius = 9999999;
118  self.goalHeight = 5000;
119  self SetGoal( self.origin, false, self.goalRadius, self.goalHeight );
120 
121  self.overrideVehicleDamage = &‪siegebot_callback_damage;
122 
124 
125  self SetGunnerTurretOnTargetRange( 0, self.settings.gunner_turret_on_target_range );
126 
127  self ASMRequestSubstate( "locomotion@movement" );
128 
129  if( self.vehicletype === "spawner_enemy_boss_siegebot_zombietron" )
130  {
131  self ASMSetAnimationRate( 0.5 );
132  self HidePart( "tag_turret_canopy_animate" );
133  self HidePart( "tag_turret_panel_01_d0" );
134  self HidePart( "tag_turret_panel_02_d0" );
135  self HidePart( "tag_turret_panel_03_d0" );
136  self HidePart( "tag_turret_panel_04_d0" );
137  self HidePart( "tag_turret_panel_05_d0" );
138  }
139  else if( self.vehicletype == "zombietron_veh_siegebot" )
140  {
141  self ASMSetAnimationRate( 1.429 );
142  }
143 
144  self ‪initJumpStruct();
145 
146  //disable some cybercom abilities
147  if( IsDefined( level.vehicle_initializer_cb ) )
148  {
149  [[level.vehicle_initializer_cb]]( self );
150  }
151 
152  self.ignoreFireFly = true;
153  self.ignoreDecoy = true;
155 
156  self thread ‪vehicle_ai::target_hijackers();
157 
158  self.ignoreme = true;
159 
160  self.killstreakType = ‪SIEGEBOT_BUNDLE;
162  self.maxhealth = ‪killstreak_bundles::get_max_health( self.killstreakType );
163  self.heatlh = self.maxhealth;
164 
165  self thread ‪monitor_enter_exit_vehicle();
166 
167  self thread ‪watch_game_ended();
168 
169  self thread ‪watch_emped();
170 
171  self thread ‪watch_death();
172 }
173 
174 
176 {
178 
179  scale_up = mapfloat( 0, 9, 0.8, 2.0, value );
180  scale_down = mapfloat( 0, 9, 1.0, 0.5, value );
181 
182  self.difficulty_scale_up = scale_up;
183  self.difficulty_scale_down = scale_down;
184 }
185 
186 function ‪defaultRole()
187 {
189 
190  self ‪vehicle_ai::get_state_callbacks( "combat" ).update_func = &‪state_combat_update;
191  self ‪vehicle_ai::get_state_callbacks( "combat" ).exit_func = &‪state_combat_exit;
192 
193  self ‪vehicle_ai::get_state_callbacks( "driving" ).update_func = &‪siegebot_driving;
194 
195  self ‪vehicle_ai::get_state_callbacks( "death" ).update_func = &‪state_death_update;
196 
197  self ‪vehicle_ai::get_state_callbacks( "pain" ).update_func = &‪pain_update;
198 
199  self ‪vehicle_ai::get_state_callbacks( "emped" ).enter_func = &‪emped_enter;
200  self ‪vehicle_ai::get_state_callbacks( "emped" ).update_func = &‪emped_update;
201  self ‪vehicle_ai::get_state_callbacks( "emped" ).exit_func = &‪emped_exit;
202  self ‪vehicle_ai::get_state_callbacks( "emped" ).reenter_func = &‪emped_reenter;
203 
204  self ‪vehicle_ai::add_state( "jump",
208 
210  ‪vehicle_ai::add_utility_connection( "jump", "combat" );
211 
212  self ‪vehicle_ai::add_state( "unaware",
213  undefined,
215  undefined );
216  // don't use this for now unless we really need it
217 
219 }
220 
221 // ----------------------------------------------
222 // State: death
223 // ----------------------------------------------
224 function ‪state_death_update( params )
225 {
226  self endon( "death" );
227  self endon( "nodeath_thread" );
228 
229  // Need to prep the death model
230  StreamerModelHint( self.deathmodel, 6 );
231 
232  death_type = ‪vehicle_ai::get_death_type( params );
233  if ( !isdefined( death_type ) )
234  {
235  params.death_type = "gibbed";
236  death_type = params.death_type;
237  }
238 
239  self ‪clean_up_spawned();
240 
241  self SetTurretSpinning( false );
243 
245  self playsound("veh_quadtank_sparks");
246 
247  if ( self.vehicletype === "spawner_enemy_boss_siegebot_zombietron" )
248  {
249  self ASMSetAnimationRate( 1.0 );
250  }
251 
252  self.turretRotScale = 3;
253  self SetTurretTargetRelativeAngles( (0,0,0), 0 );
254  self SetTurretTargetRelativeAngles( (0,0,0), 1 );
255  self SetTurretTargetRelativeAngles( (0,0,0), 2 );
256 
257  self ASMRequestSubstate( "death@stationary" );
258 
259  self waittill( "model_swap" ); // give the streamer time to load
260  self ‪vehicle_death::set_death_model( self.deathmodel, self.modelswapdelay );
263 
264  self waittill( "bodyfall large" );
265 
266  // falling damage
267  self RadiusDamage( self.origin + (0,0,10), self.radius * 0.8, 150, 60, self, "MOD_CRUSH" );
268 
269  //BadPlace_Box( "", 0, self.origin, 50, "neutral" );
270 
271  ‪vehicle_ai::waittill_asm_complete( "death@stationary", 3 );
272 
273  self thread ‪vehicle_death::CleanUp();
275 }
276 
277 // ----------------------------------------------
278 // State: scripted
279 // ----------------------------------------------
280 function ‪siegebot_driving( params )
281 {
282  self thread ‪siegebot_player_fireupdate();
283  self thread ‪siegebot_kill_on_tilting();
284 
285  self ClearTargetEntity();
286  self CancelAIMove();
287  self ClearVehGoalPos();
288 }
289 
291 {
292  self endon( "death" );
293  self endon( "exit_vehicle" );
294 
295  tileCount = 0;
296 
297  while( 1 )
298  {
299  selfup = AnglesToUp( self.angles );
300  worldup = ( 0, 0, 1 );
301 
302  if ( VectorDot( selfup, worldup ) < 0.64 ) // angle diff more than 50 degree
303  {
304  tileCount += 1;
305  }
306  else
307  {
308  tileCount = 0;
309  }
310 
311  if ( tileCount > 20 ) // more than 1 full second
312  {
313  driver = self GetSeatOccupant( 0 );
314  self Kill( self.origin );
315  }
316 
318  }
319 }
320 
322 {
323  self endon( "death" );
324  self endon( "exit_vehicle" );
325 
326  weapon = self SeatGetWeapon( ‪SIEGEBOT_MISSILE_TURRET_INDEX );
327  driver = self GetSeatOccupant( 0 );
328 
329  if ( !isdefined( driver ) )
330  return;
331 
332  self thread ‪siegebot_player_aimUpdate();
333 
334  while( isdefined( driver ) )
335  {
336  if( driver FragButtonPressed() && !self.missiles_disabled )
337  {
338  self FireWeapon( ‪SIEGEBOT_MISSILE_TURRET_INDEX );
339  wait weapon.fireTime;
340  }
341  else
342  {
344  }
345  }
346 }
347 
349 {
350  self endon( "death" );
351  self endon( "exit_vehicle" );
352 
353  rocket_wall_blocked_count = 0;
354  use_old_trace = true;
355 
356  while( 1 )
357  {
358  if ( rocket_wall_blocked_count == 0 && self ‪does_rocket_shoot_through_wall( use_old_trace ) )
359  {
360  rocket_wall_blocked_count = ‪SIEGEBOT_ROCKET_WALL_BLOCKED_FRAMES;
361  use_old_trace = true;
362  }
363 
364  if ( rocket_wall_blocked_count > 0 )
365  {
366  aim_origin = self GetTagOrigin( ‪SIEGEBOT_ROCKET_WALL_TAG );
367  ref_angles = self GetTagAngles( ‪SIEGEBOT_ROCKET_WALL_TAG );
368  forward = AnglesToForward( ref_angles );
369  right = AnglesToRight( ref_angles );
370  aim_origin += ( forward * ‪SIEGEBOT_ROCKET_WALL_FORWARD_OFFSET ) + ( right * ‪SIEGEBOT_ROCKET_WALL_RIGHT_OFFSET );
371  // util::debug_sphere( aim_origin, 12, ( 1, 0, 0 ), 0.5, 1 );
372  aim_origin += ( 0, 0, ‪SIEGEBOT_ROCKET_WALL_Z_OFFSET ); // aim down too
373 
374  self SetGunnerTargetVec( aim_origin, ‪SIEGEBOT_MISSILE_TURRET_INDEX - 1 );
375  rocket_wall_blocked_count--;
376  }
377  else
378  {
379  self SetGunnerTargetVec( self GetGunnerTargetVec( 0 ), ‪SIEGEBOT_MISSILE_TURRET_INDEX - 1 );
380  use_old_trace = false;
381  }
382 
384  }
385 }
386 // State: scripted ----------------------------------
387 
388 // ----------------------------------------------
389 // State: emped
390 // ----------------------------------------------
391 function ‪emped_enter( params )
392 {
393  if ( !isdefined( self.abnormal_status ) )
394  {
395  self.abnormal_status = spawnStruct();
396  }
397 
398  self.abnormal_status.emped = true;
399  self.abnormal_status.attacker = params.notify_param[1];
400  self.abnormal_status.inflictor = params.notify_param[2];
401 
402  self ‪vehicle::toggle_emp_fx( true );
403 }
404 
405 function ‪emped_update( params )
406 {
407  self endon( "death" );
408  self endon( "change_state" );
409 
411 
412  if ( self.vehicletype === "spawner_enemy_boss_siegebot_zombietron" )
413  {
414  self ASMSetAnimationRate( 1.0 );
415  }
416 
417  asmState = "damage_2@pain";
418  self ASMRequestSubstate( asmState );
419  self ‪vehicle_ai::waittill_asm_complete( asmState, 3 );
420 
421  self SetBrake( 0 );
422 
424 }
425 
426 function ‪emped_exit( params )
427 {
428 }
429 
430 function ‪emped_reenter( params )
431 {
432  return false;
433 }
434 // State: emped ----------------------------------
435 
436 // ----------------------------------------------
437 // State: pain
438 // ----------------------------------------------
439 function ‪pain_toggle( enabled )
440 {
441  self._enablePain = enabled;
442 }
443 
444 function ‪pain_update( params )
445 {
446  self endon( "death" );
447  self endon( "change_state" );
448 
450 
451  if ( self.vehicletype === "spawner_enemy_boss_siegebot_zombietron" )
452  {
453  self ASMSetAnimationRate( 1.0 );
454  }
455 
456  if ( self.newDamageLevel == 3 )
457  {
458  asmState = "damage_2@pain";
459  }
460  else
461  {
462  asmState = "damage_1@pain";
463  }
464 
465  self ASMRequestSubstate( asmState );
466  self ‪vehicle_ai::waittill_asm_complete( asmState, 1.5 );
467 
468  self SetBrake( 0 );
469 
471 }
472 // State: pain ----------------------------------
473 
474 // ----------------------------------------------
475 // State: unaware
476 // ----------------------------------------------
477 function ‪state_unaware_update( params )
478 {
479  self endon( "death" );
480  self endon( "change_state" );
481 
482  self SetTurretTargetRelativeAngles( (0,90,0), 1 );
483  self SetTurretTargetRelativeAngles( (0,90,0), 2 );
484 
485  self thread ‪Movement_Thread_Unaware();
486 
487  while ( true )
488  {
490  wait 1;
491  }
492 }
493 
495 {
496  self endon( "death" );
497  self endon( "change_state" );
498  self notify( "end_movement_thread" );
499  self endon( "end_movement_thread" );
500 
501  while( true )
502  {
503  self.current_pathto_pos = self ‪GetNextMovePosition_unaware();
504 
505  foundpath = self SetVehGoalPos( self.current_pathto_pos, false, true );
506 
507  if ( foundPath )
508  {
510  self thread ‪path_update_interrupt();
512  self notify( "near_goal" ); // kill path_update_interrupt thread
513  self CancelAIMove();
514  self ClearVehGoalPos();
515 
516  ‪Scan();
517  }
518  else
519  {
520  wait 1;
521  }
522 
524  }
525 }
526 
528 {
529  if( self.goalforced )
530  {
531  return self.goalpos;
532  }
533 
534  minSearchRadius = 500;
535  maxSearchRadius = 1500;
536  halfHeight = 400;
537  spacing = 80;
538 
539  queryResult = PositionQuery_Source_Navigation( self.origin, minSearchRadius, maxSearchRadius, halfHeight, spacing, self, spacing );
540  PositionQuery_Filter_DistanceToGoal( queryResult, self );
542 
543  forward = AnglesToForward( self.angles );
544  foreach ( point in queryResult.data )
545  {
546  ADD_POINT_SCORE( point, "random", randomFloatRange( 0, 30 ) );
547 
548  pointDirection = VectorNormalize( point.origin - self.origin );
549  factor = VectorDot( pointDirection, forward );
550  if ( factor > 0.7 )
551  {
552  ADD_POINT_SCORE( point, "directionDiff", 600 );
553  }
554  else if ( factor > 0 )
555  {
556  ADD_POINT_SCORE( point, "directionDiff", 0 );
557  }
558  else if ( factor > -0.5 )
559  {
560  ADD_POINT_SCORE( point, "directionDiff", -600 );
561  }
562  else
563  {
564  ADD_POINT_SCORE( point, "directionDiff", -1200 );
565  }
566  }
567 
569  self ‪vehicle_ai::PositionQuery_DebugScores( queryResult );
570 
571  if( queryResult.data.size == 0 )
572  return self.origin;
573 
574  return queryResult.data[0].origin;
575 }
576 
577 // ----------------------------------------------
578 // State: jump
579 // ----------------------------------------------
581 {
582  if ( isdefined( self.jump ) && isDefined(self.jump.linkEnt) )
583  {
584  self.jump.linkEnt Delete();
585  }
586 }
587 function ‪clean_up_spawnedOnDeath(entToWatch)
588 {
589  self endon("death");
590  entToWatch waittill("death");
591  self delete();
592 }
593 
594 
596 {
597  if ( isdefined( self.jump ) )
598  {
599  self Unlink();
600  self.jump.linkEnt Delete();
601  self.jump Delete();
602  }
603 
604  self.jump = spawnstruct();
605  self.jump.linkEnt = ‪Spawn( "script_origin", self.origin );
606  self.jump.linkEnt thread ‪clean_up_spawnedOnDeath(self);
607  self.jump.in_air = false;
608  self.jump.highgrounds = ‪struct::get_array( "balcony_point" );
609  self.jump.groundpoints = ‪struct::get_array( "ground_point" );
610 
611  //assert( self.jump.highgrounds.size > 0 );
612  //assert( self.jump.groundpoints.size > 0 );
613 }
614 
615 function ‪state_jump_can_enter( from_state, to_state, connection )
616 {
617  if(‪IS_TRUE(self.noJumping))
618  return false;
619 
620  return ( self.vehicletype === "spawner_enemy_boss_siegebot_zombietron" );
621 }
622 
623 function ‪state_jump_enter( params )
624 {
625  goal = params.jumpgoal;
626 
627  ‪trace = PhysicsTrace( goal + ( 0, 0, 500 ), goal - ( 0, 0, 10000 ), ( -10, -10, -10 ), ( 10, 10, 10 ), self, ‪PHYSICS_TRACE_MASK_VEHICLE );
628  if ( ‪DEBUG_ON )
629  {
630  /#debugstar( goal, 60000, (0,1,0) ); #/
631  /#debugstar( ‪trace[ "position" ], 60000, (0,1,0) ); #/
632  /#line(goal, ‪trace[ "position" ], (0,1,0), 1, false, 60000 ); #/
633  }
634  if ( ‪trace[ "fraction" ] < 1 )
635  {
636  goal = ‪trace[ "position" ];
637  }
638 
639  self.jump.goal = goal;
640 
641  params.scaleForward = 40;
642  params.gravityForce = (0, 0, -6);
643  params.upByHeight = 50;
644  params.landingState = "land@jump";
645 
646  self ‪pain_toggle( false );
647 
649 }
650 
651 function ‪state_jump_update( params )
652 {
653  self endon( "change_state" );
654  self endon( "death" );
655 
656  goal = self.jump.goal;
657 
658  self ‪face_target( goal );
659 
660  self.jump.linkEnt.origin = self.origin;
661  self.jump.linkEnt.angles = self.angles;
662 
664 
665  self LinkTo( self.jump.linkEnt );
666 
667  self.jump.in_air = true;
668 
669  if ( ‪DEBUG_ON )
670  {
671  /#debugstar( goal, 60000, (0,1,0) ); #/
672  /#debugstar( goal + (0,0,100), 60000, (0,1,0) ); #/
673  /#line(goal, goal + (0,0,100), (0,1,0), 1, false, 60000 ); #/
674  }
675 
676  // calculate distance and forces
677  totalDistance = Distance2D(goal, self.jump.linkEnt.origin);
678  forward = ‪FLAT_ORIGIN( ((goal - self.jump.linkEnt.origin) / totalDistance) );
679  upByDistance = MapFloat( 500, 2000, 46, 52, totalDistance );
680  antiGravityByDistance = 0;//MapFloat( 500, 2000, 0, 0.5, totalDistance );
681 
682  initVelocityUp = (0,0,1) * ( upByDistance + params.upByHeight );
683  initVelocityForward = forward * params.scaleForward * MapFloat( 500, 2000, 0.8, 1, totalDistance );
684  velocity = initVelocityUp + initVelocityForward;
685 
686  // start jumping
687  if ( self.vehicletype === "spawner_enemy_boss_siegebot_zombietron" )
688  {
689  self ASMSetAnimationRate( 1.0 );
690  }
691 
692  self ASMRequestSubstate( "inair@jump" );
693  self waittill( "engine_startup" );
694  self ‪vehicle::impact_fx( self.settings.startupfx1 );
695  self waittill( "leave_ground" );
696  self ‪vehicle::impact_fx( self.settings.takeofffx1 );
697 
698  while( true )
699  {
700  distanceToGoal = Distance2D(self.jump.linkEnt.origin, goal);
701 
702  antiGravityScaleUp = 1.0;//MapFloat( 0, 0.5, 0.6, 0, abs( 0.5 - distanceToGoal / totalDistance ) );
703  antiGravityScale = 1.0;//MapFloat( (self.radius * 1.0), (self.radius * 3), 0, 1, distanceToGoal );
704  antiGravity = (0,0,0);//antiGravityScale * antiGravityScaleUp * (-params.gravityForce) + (0,0,antiGravityByDistance);
705  if ( ‪DEBUG_ON ) /#line(self.jump.linkEnt.origin, self.jump.linkEnt.origin + antiGravity, (0,1,0), 1, false, 60000 ); #/
706 
707  velocityForwardScale = MapFloat( (self.radius * 1), (self.radius * 4), 0.2, 1, distanceToGoal );
708  velocityForward = initVelocityForward * velocityForwardScale;
709  if ( ‪DEBUG_ON ) /#line(self.jump.linkEnt.origin, self.jump.linkEnt.origin + velocityForward, (0,1,0), 1, false, 60000 ); #/
710 
711  oldVerticleSpeed = velocity[2];
712  velocity = (0,0, velocity[2]);
713  velocity += velocityForward + params.gravityForce + antiGravity;
714 
715  if ( oldVerticleSpeed > 0 && velocity[2] < 0 )
716  {
717  self ASMRequestSubstate( "fall@jump" );
718  }
719 
720  if ( velocity[2] < 0 && self.jump.linkEnt.origin[2] + velocity[2] < goal[2] )
721  {
722  break;
723  }
724 
725  heightThreshold = goal[2] + 110;
726  oldHeight = self.jump.linkEnt.origin[2];
727  self.jump.linkEnt.origin += velocity;
728 
729  if ( self.jump.linkEnt.origin[2] < heightThreshold && ( oldHeight > heightThreshold || ( oldVerticleSpeed > 0 && velocity[2] < 0 ) ) )
730  {
731  self notify( "start_landing" );
732  self ASMRequestSubstate( params.landingState );
733  }
734 
735  if ( ‪DEBUG_ON ) /#debugstar( self.jump.linkEnt.origin, 60000, (1,0,0) ); #/
737  }
738 
739  // landed
740  self.jump.linkEnt.origin = ‪FLAT_ORIGIN( self.jump.linkEnt.origin ) + ( 0, 0, goal[2] );
741  self notify( "land_crush" );
742 
743  // don't damage player, but crush player vehicle
744  foreach( player in level.players )
745  {
746  player._takedamage_old = player.takedamage;
747  player.takedamage = false;
748  }
749  self RadiusDamage( self.origin + ( 0,0,15 ), self.radiusdamageradius, self.radiusdamagemax, self.radiusdamagemin, self, "MOD_EXPLOSIVE" );
750 
751  foreach( player in level.players )
752  {
753  player.takedamage = player._takedamage_old;
754  player._takedamage_old = undefined;
755 
756  if ( Distance2DSquared( self.origin, player.origin ) < ‪SQR( 200 ) )
757  {
758  direction = ‪FLAT_ORIGIN( ( player.origin - self.origin ) );
759  if ( Abs( direction[0] ) < 0.01 && Abs( direction[1] ) < 0.01 )
760  {
761  direction = ( RandomFloatRange( 1, 2 ), RandomFloatRange( 1, 2 ), 0 );
762  }
763  direction = VectorNormalize( direction );
764  strength = 700;
765  player SetVelocity( player GetVelocity() + direction * strength );
766 
767  if ( player.health > 80 )
768  {
769  player DoDamage( player.health - 70, self.origin, self );
770  }
771  }
772  }
773 
774  self ‪vehicle::impact_fx( self.settings.landingfx1 );
776 
777  //rumble for landing from jump
778  //self clientfield::increment( "sarah_rumble_on_landing" );
779 
780  wait 0.3;
781 
782  self Unlink();
783 
785 
786  self.jump.in_air = false;
787 
788  self notify ( "jump_finished" );
789 
791 
792  self ‪vehicle_ai::waittill_asm_complete( params.landingState, 3 );
793 
795 }
796 
797 function ‪state_jump_exit( params )
798 {
799 }
800 
801 // ----------------------------------------------
802 // State: combat
803 // ----------------------------------------------
804 function ‪state_combat_update( params )
805 {
806  self endon( "death" );
807  self endon( "change_state" );
808 
809  self thread ‪Movement_Thread();
810  self thread ‪Attack_Thread_machinegun();
811  self thread ‪Attack_Thread_rocket();
812 }
813 
814 function ‪state_combat_exit( params )
815 {
816  self ClearTurretTarget();
817  self SetTurretSpinning( false );
818 }
819 
821 {
822  if( self.vehicletype === "spawner_enemy_boss_siegebot_zombietron" )
823  {
824  self ASMSetAnimationRate( 0.5 );
825  }
826 
827  self ASMRequestSubstate( "locomotion@movement" );
828 }
829 
831 {
832  if( self.goalforced )
833  {
834  return self.goalpos;
835  }
836 
837  maxSearchRadius = 800;
838  halfHeight = 400;
839  innerSpacing = 50;
840  outerSpacing = 60;
841 
842  queryResult = PositionQuery_Source_Navigation( self.origin, 0, maxSearchRadius, halfHeight, innerSpacing, self, outerSpacing );
843  PositionQuery_Filter_DistanceToGoal( queryResult, self );
845 
846  if( isdefined( self.enemy ) )
847  {
848  PositionQuery_Filter_Sight( queryResult, self.enemy.origin, self GetEye() - self.origin, self, 0, self.enemy );
849  self ‪vehicle_ai::PositionQuery_Filter_EngagementDist( queryResult, self.enemy, self.settings.engagementDistMin, self.settings.engagementDistMax );
850  }
851 
852  foreach ( point in queryResult.data )
853  {
854  ADD_POINT_SCORE( point, "random", randomFloatRange( 0, 30 ) );
855 
856  if( point.disttoorigin2d < 120 )
857  {
858  ADD_POINT_SCORE( point, "tooCloseToSelf", (120 - point.disttoorigin2d) * -1.5 );
859  }
860 
861  if( isdefined( self.enemy ) )
862  {
863  ADD_POINT_SCORE( point, "engagementDist", -point.distAwayFromEngagementArea );
864 
865  if ( !point.visibility )
866  {
867  ADD_POINT_SCORE( point, "visibility", -600 );
868  }
869  }
870  }
871 
873  self ‪vehicle_ai::PositionQuery_DebugScores( queryResult );
874 
875  if( queryResult.data.size == 0 )
876  return self.origin;
877 
878  return queryResult.data[0].origin;
879 }
880 
882 {
883  self endon( "death" );
884  self endon( "change_state" );
885  self endon( "near_goal" );
886  self endon( "reached_end_node" );
887 
888  canSeeEnemyCount = 0;
889 
890  old_enemy = self.enemy;
891 
892  startPath = GetTime(); // assume we just started a new path
893  old_origin = self.origin;
894  move_dist = 300;
895 
896  wait 1.5;
897 
898  while( 1 )
899  {
900  self SetMaxSpeedScale( 1 );
901  self SetMaxAccelerationScale( 1 );
902  self SetSpeed( self.settings.defaultMoveSpeed );
903 
904  if ( isdefined( self.enemy ) )
905  {
906  selfDistToTarget = Distance2D( self.origin, self.enemy.origin );
907 
908  farEngagementDist = self.settings.engagementDistMax + 150;
909  closeEngagementDist = self.settings.engagementDistMin - 150;
910 
911  if( self VehCanSee( self.enemy ) )
912  {
913  self SetLookAtEnt( self.enemy ); // try to keep the basic orientation towards the enemy
914  self SetTurretTargetEnt( self.enemy );
915 
916  // check the distance so we don't trigger a new path when we are already moving
917  if( selfDistToTarget < farEngagementDist && selfDistToTarget > closeEngagementDist )
918  {
919  canSeeEnemyCount++;
920 
921  // Stop if we can see our enemy for a bit
922  if( canSeeEnemyCount > 3 && ( ‪vehicle_ai::TimeSince( startPath ) > 5 || Distance2DSquared( old_origin, self.origin ) > ‪SQR( move_dist ) ) )
923  {
924  self notify( "near_goal" );
925  }
926  }
927  else
928  {
929  // too far go fast
930  self SetMaxSpeedScale( 2.5 );
931  self SetMaxAccelerationScale( 3 );
932  self SetSpeed( self.settings.defaultMoveSpeed * 2 );
933  }
934  }
935  else if( (!self VehSeenRecently( self.enemy, 1.5 ) && self VehSeenRecently( self.enemy, 15 )) || selfDistToTarget > farEngagementDist ) // move fast if we just lost sight of our target or we are too far
936  {
937  self SetMaxSpeedScale( 1.8 );
938  self SetMaxAccelerationScale( 2 );
939  self SetSpeed( self.settings.defaultMoveSpeed * 1.5 );
940  }
941  }
942  else
943  {
944  canSeeEnemyCount = 0;
945  }
946 
947  if ( isdefined( self.enemy ) )
948  {
949  if( !isdefined( old_enemy ) )
950  {
951  self notify( "near_goal" ); // new enemy
952  }
953  else if( self.enemy != old_enemy )
954  {
955  self notify( "near_goal" ); // new enemy
956  }
957 
958  if( self VehCanSee( self.enemy ) && distance2dSquared( self.origin, self.enemy.origin ) < ‪SQR( 150 ) && Distance2DSquared( old_origin, self.enemy.origin ) > ‪SQR( 151 ) ) // don't walk pass the player
959  {
960  self notify( "near_goal" );
961  }
962  }
963 
964  wait 0.2;
965  }
966 }
967 
968 function ‪weapon_doors_state( isOpen, waittime = 0 )
969 {
970  self endon( "death" );
971  self notify( "weapon_doors_state" );
972  self endon( "weapon_doors_state" );
973 
974  if ( isdefined( waittime ) && waittime > 0 )
975  {
976  wait waittime;
977  }
978 
979  self ‪vehicle::toggle_ambient_anim_group( 1, isOpen );
980 }
981 
983 {
984  self endon( "death" );
985  self endon( "change_state" );
986  self notify( "end_movement_thread" );
987  self endon( "end_movement_thread" );
988 
989  while ( 1 )
990  {
991  self.current_pathto_pos = self ‪GetNextMovePosition_tactical();
992 
993  if( self.vehicletype === "spawner_enemy_boss_siegebot_zombietron" )
994  {
995  if ( ‪vehicle_ai::IsCooldownReady( "jump" ) )
996  {
997  params = SpawnStruct();
998  params.jumpgoal = self.current_pathto_pos;
1000  wait 0.5;
1001  self ‪vehicle_ai::evaluate_connections( undefined, params );
1002  wait 0.5;
1003  }
1004  }
1005 
1006  foundpath = self SetVehGoalPos( self.current_pathto_pos, false, true );
1007 
1008  if ( foundPath )
1009  {
1010  if ( isdefined( self.enemy ) && self VehSeenRecently( self.enemy, 1 ) )
1011  {
1012  self SetLookAtEnt( self.enemy );
1013  self SetTurretTargetEnt( self.enemy );
1014  }
1016  self thread ‪path_update_interrupt();
1018  self notify( "near_goal" ); // kill path_update_interrupt thread
1019  self CancelAIMove();
1020  self ClearVehGoalPos();
1021  if ( isdefined( self.enemy ) && self VehSeenRecently( self.enemy, 2 ) )
1022  {
1023  self ‪face_target( self.enemy.origin );
1024  }
1025  }
1026 
1027  wait 1;
1028 
1029  startAdditionalWaiting = GetTime();
1030  while ( isdefined( self.enemy ) && self VehCanSee( self.enemy ) && ‪vehicle_ai::TimeSince( startAdditionalWaiting ) < 1.5 )
1031  {
1032  wait 0.4;
1033  }
1034  }
1035 }
1036 
1038 {
1039  self notify( "end_movement_thread" );
1040  self notify( "near_goal" );
1041  self CancelAIMove();
1042  self ClearVehGoalPos();
1043  self ClearTurretTarget();
1044  self ClearLookAtEnt();
1045  self SetBrake( 1 );
1046 }
1047 
1048 function ‪face_target( position, targetAngleDiff )
1049 {
1050  if ( !isdefined( targetAngleDiff ) )
1051  {
1052  targetAngleDiff = 30;
1053  }
1054 
1055  v_to_enemy = ‪FLAT_ORIGIN( (position - self.origin) );
1056  v_to_enemy = VectorNormalize( v_to_enemy );
1057  goalAngles = VectortoAngles( v_to_enemy );
1058 
1059  angleDiff = AbsAngleClamp180( self.angles[1] - goalAngles[1] );
1060  if ( angleDiff <= targetAngleDiff )
1061  {
1062  return;
1063  }
1064 
1065  self SetLookAtOrigin( position );
1066  self SetTurretTargetVec( position );
1067  self ‪locomotion_start();
1068 
1069  angleAdjustingStart = GetTime();
1070  while( angleDiff > targetAngleDiff && ‪vehicle_ai::TimeSince( angleAdjustingStart ) < 4 )
1071  {
1072  angleDiff = AbsAngleClamp180( self.angles[1] - goalAngles[1] );
1074  }
1075 
1076  self ClearVehGoalPos();
1077  self ClearLookAtEnt();
1078  self ClearTurretTarget();
1079  self CancelAIMove();
1080 }
1081 
1082 function ‪Scan()
1083 {
1084  angles = self GetTagAngles( "tag_barrel" );
1085  angles = (0,angles[1],0); // get rid of pitch
1086 
1087  rotate = 360;
1088 
1089  while( rotate > 0 )
1090  {
1091  angles += (0,30,0);
1092  rotate -= 30;
1093  forward = AnglesToForward( angles );
1094 
1095  aimpos = self.origin + forward * 1000;
1096  self SetTurretTargetVec( aimpos );
1097  msg = self ‪util::waittill_any_timeout( 0.5, "turret_on_target" );
1098  wait 0.1;
1099 
1100  if( isdefined( self.enemy ) && self VehCanSee( self.enemy ) ) // use VehCanSee, if recently attacked this will return true and not use FOV check
1101  {
1102  self SetTurretTargetEnt( self.enemy );
1103  self SetLookAtEnt( self.enemy );
1104  self ‪face_target( self.enemy );
1105  return;
1106  }
1107  }
1108 
1109  // return the turret to forward
1110  forward = AnglesToForward( self.angles );
1111 
1112  aimpos = self.origin + forward * 1000;
1113  self SetTurretTargetVec( aimpos );
1114  msg = self ‪util::waittill_any_timeout( 3.0, "turret_on_target" );
1115  self ClearTurretTarget();
1116 }
1117 
1119 {
1120  self endon( "death" );
1121  self endon( "change_state" );
1122  self endon( "end_attack_thread" );
1123  self notify( "end_machinegun_attack_thread" );
1124  self endon( "end_machinegun_attack_thread" );
1125 
1126  self.turretrotscale = 1 * self.difficulty_scale_up;
1127 
1128  spinning = false;
1129 
1130  while( 1 )
1131  {
1132  if( isdefined( self.enemy ) && self VehCanSee( self.enemy ) )
1133  {
1134  self SetLookAtEnt( self.enemy );
1135  self SetTurretTargetEnt( self.enemy );
1136 
1137  if ( !spinning )
1138  {
1139  spinning = true;
1140  self SetTurretSpinning( true );
1141  wait 0.5;
1142  continue;
1143  }
1144 
1145  self SetGunnerTargetEnt( self.enemy, (0,0,0), 0 );
1146  self SetGunnerTargetEnt( self.enemy, (0,0,0), 1 );
1147 
1148  self ‪vehicle_ai::fire_for_time( RandomFloatRange( 0.75, 1.5 ) * self.difficulty_scale_up, 1 );
1149 
1150  if( isdefined( self.enemy ) && IsAI( self.enemy ) )
1151  {
1152  wait( RandomFloatRange( 0.1, 0.2 ) );
1153  }
1154  else
1155  {
1156  wait( RandomFloatRange( 0.2, 0.3 ) ) * self.difficulty_scale_down;
1157  }
1158  }
1159  else
1160  {
1161  spinning = false;
1162  self SetTurretSpinning( false );
1163  self ClearGunnerTarget( 0 );
1164  self ClearGunnerTarget( 1 );
1165  wait 0.4;
1166  }
1167  }
1168 }
1169 
1170 function ‪Attack_Rocket( target )
1171 {
1172  if ( isdefined( target ) )
1173  {
1174  self SetTurretTargetEnt( target );
1175  self SetGunnerTargetEnt( target, (0,0,-10), 2 );
1176  msg = self ‪util::waittill_any_timeout( 1, "turret_on_target" );
1177  self FireWeapon( 2, target, (0,0,-10) );
1178  self ClearGunnerTarget( 1 );
1179  }
1180 }
1181 
1183 {
1184  self endon( "death" );
1185  self endon( "change_state" );
1186  self endon( "end_attack_thread" );
1187  self notify( "end_rocket_attack_thread" );
1188  self endon( "end_rocket_attack_thread" );
1189 
1190  ‪vehicle_ai::Cooldown( "rocket", 3 );
1191 
1192  while( 1 )
1193  {
1194  if ( isdefined( self.enemy ) && self VehSeenRecently( self.enemy, 3 ) && ( ‪vehicle_ai::IsCooldownReady( "rocket", 1.5 ) ) )
1195  {
1196  self SetGunnerTargetEnt( self.enemy, (0,0,0), 0 );
1197  self SetGunnerTargetEnt( self.enemy, (0,0,-10), 2 );
1198 
1199  self thread ‪weapon_doors_state( true );
1200  wait 1.5;
1201  if ( isdefined( self.enemy ) && self VehSeenRecently( self.enemy, 1 ) )
1202  {
1203  ‪vehicle_ai::Cooldown( "rocket", 5 );
1204  ‪Attack_Rocket( self.enemy );
1205  wait 1;
1206  if ( isdefined( self.enemy ) )
1207  {
1208  ‪Attack_Rocket( self.enemy );
1209  }
1210  self thread ‪weapon_doors_state( false, 1 );
1211  }
1212  else
1213  {
1214  self thread ‪weapon_doors_state( false );
1215  }
1216  }
1217  else
1218  {
1219  self ClearGunnerTarget( 0 );
1220  self ClearGunnerTarget( 1 );
1221  wait 0.4;
1222  }
1223  }
1224 }
1225 
1227 {
1228  self endon( "death" );
1229 
1230  player = undefined;
1231 
1232  while( 1 )
1233  {
1234  self ‪vehicle_unoccupied( player );
1235 
1236  self waittill( "enter_vehicle", player );
1237  self ‪vehicle_occupied( player );
1238 
1239  self waittill( "exit_vehicle", player );
1240  }
1241 }
1242 
1243 function ‪vehicle_occupied( player )
1244 {
1245  self ‪clientfield::set( "enemyvehicle", ‪ENEMY_VEHICLE_ACTIVE );
1246 
1247 /#
1248  // self thread arm_test(); // if testing, comment out watch_left_arm() and watch_right_arm() below
1249 #/
1250 
1251  self.ignoreme = false;
1252 
1253  self thread ‪siegebot_player_fireupdate();
1254  self thread ‪weapon_doors_state( true );
1255  self thread ‪watch_left_arm();
1256  self thread ‪watch_right_arm();
1257 
1258  if ( IsPlayer( player ) )
1259  {
1260  player.using_map_vehicle = true;
1261  player.current_map_vehicle = self;
1262  player.ignoreme = true;
1263  self.current_driver = player;
1264  player SetClientUIVisibilityFlag( "weapon_hud_visible", 0 );
1265  player ‪vehicle::update_damage_as_occupant( self.maxhealth - self.health, self.maxhealth );
1266  player DisableWeaponCycling();
1267  self thread ‪watch_rockets( player );
1269  player.siegebot_kills = undefined;
1270  player Ghost();
1271  }
1272 }
1273 
1274 function ‪vehicle_unoccupied( player )
1275 {
1276  self ‪clientfield::set( "enemyvehicle", ‪ENEMY_VEHICLE_INACTIVE );
1277 
1278  self.ignoreme = true;
1279 
1280  self thread ‪weapon_doors_state( false );
1281 
1282  if ( IsPlayer( player ) )
1283  {
1284  player.using_map_vehicle = undefined;
1285  player.current_map_vehicle = undefined;
1286  player.ignoreme = false;
1287  player SetClientUIVisibilityFlag( "weapon_hud_visible", 1 );
1288  player EnableWeaponCycling();
1289  ‪update_emped_visuals( player, false );
1290  player Show();
1291  }
1292 
1293  self.current_driver = undefined;
1294 
1295  //if ( self oob::IsTouchingAnyOOBTrigger() )
1296  //{
1297  // self destroy_siegebot();
1298  //}
1299 }
1300 
1301 function ‪siegebot_callback_damage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal )
1302 {
1303  time_alive = GetTime() - self.spawnTime;
1304 
1305  if ( time_alive < 500 && sMeansOfDeath == "MOD_TRIGGER_HURT" )
1306  return 0;
1307 
1308 
1309  iDamage = self ‪killstreaks::OnDamagePerWeapon( ‪SIEGEBOT_BUNDLE, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, self.maxhealth, undefined, self.maxhealth * 0.4, undefined, 0, undefined, true, 1.0 );
1310 
1311  fmj = ‪loadout::isFMJDamage( weapon, sMeansOfDeath, eAttacker );
1312 
1313  if( ‪IS_TRUE( fmj ) && ( !isdefined( weapon.isHeroWeapon ) || !weapon.isHeroWeapon ) )
1314  {
1315  iDamage = iDamage / 2;
1316  }
1317 
1318  if ( ‪vehicle_ai::should_emp( self, weapon, sMeansOfDeath, eInflictor, eAttacker ) )
1319  {
1320  minEmpDownTime = 0.8 * self.settings.empdowntime;
1321  maxEmpDownTime = 1.2 * self.settings.empdowntime;
1322  self notify ( "emped", RandomFloatRange( minEmpDownTime, maxEmpDownTime ), eAttacker, eInflictor );
1323  }
1324 
1325  ‪DEFAULT( self.damageLevel, 0 );
1326  newDamageLevel = ‪vehicle::should_update_damage_fx_level( self.health, iDamage, self.healthdefault );
1327  if ( newDamageLevel > self.damageLevel )
1328  {
1329  self.damageLevel = newDamageLevel;
1330  ‪vehicle::set_damage_fx_level( self.damageLevel );
1331  }
1332 
1333  driver = self GetSeatOccupant( 0 );
1334  if ( isPlayer( driver ) )
1335  {
1336  driver ‪vehicle::update_damage_as_occupant( self.maxhealth - ( self.health - iDamage ), self.maxhealth );
1337 
1338  if ( iDamage > self.health )
1339  {
1340  driver Show();
1341  }
1342  }
1343 
1344  return iDamage;
1345 }
1346 
1347 function ‪watch_emped()
1348 {
1349  self endon( "death" );
1350 
1351  while ( 1 )
1352  {
1353  self waittill( "emped", down_time, attacker, inflictor );
1354 
1355  self thread ‪emped( down_time );
1356  }
1357 }
1358 
1359 function ‪emped( down_time )
1360 {
1361  self notify( "emped_singleton" );
1362  self endon( "death" );
1363  self endon( "emped_singleton" );
1364 
1365  self SetBrake( 1 ); // TODO: not working ask expect... the handbrake doesn't work to slow down the siegebot
1366  self.emped = true;
1368 
1369  wait down_time;
1370 
1371  self SetBrake( 0 );
1372 
1373  self.emped = false;
1375 }
1376 
1378 {
1379  ‪update_emped_visuals( self GetSeatOccupant( 0 ), self.‪emped );
1380 }
1381 
1383 {
1384  if ( IsPlayer( driver ) )
1385  {
1386  value = ( ‪VAL( ‪emped, 0 ) ? 1 : 0 );
1387  driver ‪clientfield::set_to_player( "empd", value );
1388  driver ‪clientfield::set_to_player( "static_postfx", value );
1389  driver SetEMPJammed( value );
1390  }
1391 }
1392 
1394 {
1395  self endon( "death" );
1396 
1397  level waittill("game_ended");
1398 
1399  self thread ‪wait_then_hide( 3.0 );
1400  self ‪destroy_siegebot();
1401 }
1402 
1404 {
1405  self DoDamage( self.health + 1, self.origin + (0, 0, 60), undefined, undefined, "none", "MOD_EXPLOSIVE", 0 );
1406 }
1407 
1408 function ‪wait_then_hide( wait_time )
1409 {
1410  wait wait_time;
1411 
1412  // hide vehicle after destruction
1413  if ( isdefined( self ) )
1414  {
1415  self Hide();
1416  }
1417 }
1418 
1419 function ‪watch_death()
1420 {
1421  self notify( "siegebot_watch_death" );
1422  self endon( "siegebot_watch_death" );
1423 
1424  self waittill( "death" );
1425 
1426  self ‪process_siegebot_kill( self.current_driver );
1427 
1428  // driver = self GetSeatOccupant( 0 ); // NOTE: this always fails, so use self.current_driver instead
1429  if ( IsPlayer( self.current_driver ) )
1430  {
1431  self ‪vehicle_unoccupied( self.current_driver );
1432  }
1433 
1434  // Need to prep the death model
1435  StreamerModelHint( self.deathmodel, 6 );
1436 
1437  // self waittill( "model_swap" ); // give the streamer time to load (NOTE: this wait doesn't work right now)
1438  self ‪vehicle_death::set_death_model( self.deathmodel, self.modelswapdelay );
1441 
1442  self ‪vehicle_death::DeleteWhenSafe( 0.25 );
1443 }
1444 
1445 function ‪process_siegebot_kill( driver )
1446 {
1447  if ( !isdefined( self ) )
1448  return;
1449 
1450  if ( self.team == "neutral" )
1451  return;
1452 
1453  if ( !IsPlayer( driver ) )
1454  return;
1455 
1456  if ( IsPlayer( self.attacker ) )
1457  {
1458  if ( driver == self.attacker )
1459  return;
1460 
1461  ‪scoreevents::processScoreEvent( "destroyed_siegebot", self.attacker );
1462  }
1463 
1464  if ( isdefined( self.attackers ) )
1465  {
1466  foreach( kill_assist in self.attackers )
1467  {
1468  if ( IsPlayer( kill_assist ) )
1469  {
1470  if ( self.attacker === kill_assist )
1471  continue;
1472 
1473  if ( !isdefined( self.attacker ) || kill_assist.team == self.attacker.team )
1474  {
1475  ‪scoreevents::processScoreEvent( "destroyed_siegebot_assist", kill_assist );
1476  }
1477  }
1478  }
1479  }
1480 }
1481 
1482 function ‪reload_rockets( player )
1483 {
1484  bundle = level.killstreakBundle[ ‪SIEGEBOT_BUNDLE ];
1485  self ‪disable_missiles();
1486 
1487  // setup the "reload" time for the player's vehicle HUD
1488  weapon_wait_duration_ms = Int( bundle.ksWeaponReloadTime * 1000 );
1489  player SetVehicleWeaponWaitDuration( weapon_wait_duration_ms );
1490  player SetVehicleWeaponWaitEndTime( GetTime() + weapon_wait_duration_ms );
1491 
1492  wait ( bundle.ksWeaponReloadTime );
1493 
1495 
1496  wait 0.4;
1497 
1498  if ( !self.‪isStunned )
1499  self ‪enable_missiles();
1500 }
1501 
1502 function ‪set_rocket_count( rocket_count )
1503 {
1504  self.numberRockets = rocket_count;
1505  self ‪update_client_ammo( self.numberRockets );
1506 }
1507 
1509 {
1510  self.missiles_disabled = false;
1511  self DisableGunnerFiring( ‪SIEGEBOT_MISSILE_TURRET_INDEX - 1, false );
1512 }
1513 
1515 {
1516  self.missiles_disabled = true;
1517  self DisableGunnerFiring( ‪SIEGEBOT_MISSILE_TURRET_INDEX - 1, true );
1518 }
1519 
1520 function ‪watch_rockets( player )
1521 {
1522  self endon( "death" );
1523  self endon( "exit_vehicle" );
1524 
1525  if ( self.numberRockets <= 0 )
1526  {
1527  self ‪reload_rockets( player );
1528  }
1529  else
1530  {
1531  self ‪update_client_ammo( self.numberRockets );
1532  }
1533 
1534  if ( !self.‪isStunned )
1535  self ‪enable_missiles();
1536 
1537  while( true )
1538  {
1539  player waittill( "missile_fire", missile );
1540 
1541  missile.ignore_team_kills = self.ignore_team_kills;
1542 
1543  self ‪set_rocket_count( self.numberRockets - 1 );
1544 
1545  // self perform_recoil_missile_turret( player ); // not needed for siegebot
1546 
1547  if ( self.numberRockets <= 0 )
1548  self ‪reload_rockets( player );
1549  }
1550 }
1551 
1552 function ‪update_client_ammo( ammo_count, driver_only_update = false ) // self == vehicle
1553 {
1554  if ( !driver_only_update )
1555  {
1556  self ‪clientfield::set( "ai_tank_missile_fire", ammo_count );
1557  }
1558 
1559  if ( IsPlayer( self.current_driver ) )
1560  {
1561  self.current_driver ‪clientfield::increment_to_player( "ai_tank_update_hud", 1 );
1562  }
1563 }
1564 
1565 /#
1566 function ‪arm_test()
1567 {
1568  self notify( "arm_test" );
1569  self endon( "arm_test" );
1570 
1571  level endon( "game_ended" );
1572 
1573  ‪delay = 10.0;
1574 
1575  while( 1 )
1576  {
1577  self thread ‪retract_left_arm();
1578  self thread ‪retract_right_arm();
1579  wait ‪delay;
1580 
1581  self thread ‪extend_left_arm();
1582  self thread ‪extend_right_arm();
1583  wait ‪delay;
1584  }
1585 }
1586 #/
1587 
1589 {
1590  ‪DEFAULT( self.left_arm_retracted, false );
1591  if ( self.left_arm_retracted )
1592  return;
1593 
1594  self.left_arm_retracted = true;
1595 
1596  self UseAnimTree( #animtree );
1597  self ‪clientfield::set( "siegebot_retract_left_arm", 1 );
1598  self ClearAnim( %ai_siegebot_base_mp_left_arm_extend, 0.2 );
1599  self SetAnim( %ai_siegebot_base_mp_left_arm_retract, 1.0 );
1600 }
1601 
1603 {
1604  ‪DEFAULT( self.left_arm_retracted, false );
1605  if ( !self.left_arm_retracted )
1606  return;
1607 
1608  self.left_arm_retracted = false;
1609 
1610  self UseAnimTree( #animtree );
1611 
1612  self ‪clientfield::set( "siegebot_retract_left_arm", 0 );
1613  self ClearAnim( %ai_siegebot_base_mp_left_arm_retract, 0.2 );
1614  self SetAnim( %ai_siegebot_base_mp_left_arm_extend, 1.0, 0.0 );
1615 
1616  wait 0.1;
1617 
1618  if ( self.left_arm_retracted == false ) // if still extended
1619  self ClearAnim( %ai_siegebot_base_mp_left_arm_extend, 0.1 );
1620 }
1621 
1623 {
1624  ‪DEFAULT( self.right_arm_retracted, false );
1625  if ( self.right_arm_retracted )
1626  return;
1627 
1628  self.right_arm_retracted = true;
1629 
1630  self UseAnimTree( #animtree );
1631  self ‪clientfield::set( "siegebot_retract_right_arm", 1 );
1632  self ClearAnim( %ai_siegebot_base_mp_right_arm_extend, 0.2 );
1633  self SetAnim( %ai_siegebot_base_mp_right_arm_retract, 1.0 );
1634 }
1635 
1637 {
1638  ‪DEFAULT( self.right_arm_retracted, false );
1639  if ( !self.right_arm_retracted )
1640  return;
1641 
1642  self.right_arm_retracted = false;
1643 
1644  self UseAnimTree( #animtree );
1645  self ‪clientfield::set( "siegebot_retract_right_arm", 0 );
1646  self ClearAnim( %ai_siegebot_base_mp_right_arm_retract, 0.2 );
1647  self SetAnim( %ai_siegebot_base_mp_right_arm_extend, 1.0 );
1648 
1649  wait 0.1;
1650 
1651  if ( self.right_arm_retracted == false ) // if still extended
1652  self ClearAnim( %ai_siegebot_base_mp_right_arm_extend, 0.1 );
1653 }
1654 
1656 {
1657  self endon( "death" );
1658  self endon( "exit_vehicle" );
1659 
1660  wait RandomFloatRange( 0.05, 0.3 );
1661 
1662  while( 1 )
1663  {
1664  ref_origin = self GetTagOrigin( ‪SIEGEBOT_LEFT_ARM_TRACE_TAG );
1665  ref_angles = self GetTagAngles( ‪SIEGEBOT_LEFT_ARM_TRACE_TAG );
1666 
1667  forward = AnglesToForward( ref_angles );
1668  right = AnglesToRight( ref_angles );
1669  ref_origin += ( right * ‪SIEGEBOT_LEFT_ARM_TRACE_OFFSET );
1670 
1671  trace_start = ref_origin + ( forward * ‪SIEGEBOT_LEFT_ARM_TRACE_START );
1672  trace_end = ref_origin + ( forward * ‪SIEGEBOT_LEFT_ARM_TRACE_END );
1673 
1674  // util::debug_sphere( ref_origin, 8, ( 1, 0, 1 ), 0.5, 1 );
1675  // util::debug_sphere( trace_start, 8, ( 1, 0, 1 ), 0.5, 1 );
1676  // util::debug_sphere( trace_end, 8, ( 1, 0, 1 ), 0.5, 1 );
1677 
1678  ‪trace = PhysicsTrace( trace_start, trace_end, (-8, -8, -8), (8, 8, 8), self, ‪SIEGEBOT_ARM_TRACE_CLIP_MASK );
1679 
1680  if ( ‪trace["fraction"] < 1.0 )
1681  self ‪retract_left_arm();
1682  else
1683  self ‪extend_left_arm();
1684 
1685  wait 0.2;
1686  }
1687 }
1688 
1690 {
1691  self endon( "death" );
1692  self endon( "exit_vehicle" );
1693 
1694  wait RandomFloatRange( 0.05, 0.3 );
1695 
1696  while( 1 )
1697  {
1698  ref_origin = self GetTagOrigin( ‪SIEGEBOT_RIGHT_ARM_TRACE_TAG );
1699  ref_angles = self GetTagAngles( ‪SIEGEBOT_RIGHT_ARM_TRACE_TAG );
1700 
1701  forward = AnglesToForward( ref_angles );
1702  right = AnglesToRight( ref_angles );
1703  ref_origin += ( right * ‪SIEGEBOT_RIGHT_ARM_TRACE_OFFSET );
1704 
1705  trace_start = ref_origin + ( forward * ‪SIEGEBOT_RIGHT_ARM_TRACE_START );
1706  trace_end = ref_origin + ( forward * ‪SIEGEBOT_RIGHT_ARM_TRACE_END );
1707 
1708  // util::debug_sphere( ref_origin, 8, ( 1, 0, 1 ), 0.5, 1 );
1709  // util::debug_sphere( trace_start, 8, ( 1, 0, 1 ), 0.5, 1 );
1710  // util::debug_sphere( trace_end, 8, ( 1, 0, 1 ), 0.5, 1 );
1711 
1712  ‪trace = PhysicsTrace( trace_start, trace_end, (-8, -8, -8), (8, 8, 8), self, ‪SIEGEBOT_ARM_TRACE_CLIP_MASK );
1713 
1714  if ( ‪trace["fraction"] < 1.0 )
1715  self ‪retract_right_arm();
1716  else
1717  self ‪extend_right_arm();
1718 
1719  wait 0.2;
1720  }
1721 }
1722 
1723 function ‪does_rocket_shoot_through_wall( use_old_trace )
1724 {
1725  if ( use_old_trace && isdefined( self.rocket_wall_origin_offset ) )
1726  {
1727  base_tag_angles = self GetTagAngles( ‪SIEGEBOT_ROCKET_WALL_RELATIVE_TAG );
1728  base_forward = AnglesToForward( base_tag_angles );
1729  base_right = AnglesToRight( base_tag_angles );
1730  base_up = AnglesToUp( base_tag_angles );
1731 
1732  offset = self.rocket_wall_origin_offset;
1733  ref_origin = self.origin + ( offset[0] * base_forward ) + ( offset[1] * base_right ) + ( offset[2] * base_up );
1734  ref_angles = base_tag_angles + self.rocket_wall_angles_offset;
1735  }
1736  else
1737  {
1738  ref_origin = self GetTagOrigin( ‪SIEGEBOT_ROCKET_WALL_TRACE_TAG );
1739  ref_angles = self GetTagAngles( ‪SIEGEBOT_ROCKET_WALL_TRACE_TAG );
1740  }
1741 
1742  forward = AnglesToForward( ref_angles );
1743 
1744  trace_start = ref_origin + ( forward * ‪SIEGEBOT_ROCKET_WALL_TRACE_START );
1745  trace_end = ref_origin + ( forward * ‪SIEGEBOT_ROCKET_WALL_TRACE_END );
1746 
1747  // util::debug_sphere( trace_start, 8, ( 1, 0, 1 ), 0.5, 1 );
1748  // util::debug_sphere( trace_end, 8, ( 1, 0, 1 ), 0.5, 1 );
1749 
1750  ‪trace = PhysicsTrace( trace_start, trace_end, (-2, -2, -2), (2, 2, 2), self, ‪SIEGEBOT_ARM_TRACE_CLIP_MASK );
1751 
1752  shoot_through_wall = ( ‪trace["fraction"] < 1.0 );
1753 
1754  if ( shoot_through_wall )
1755  {
1756  if ( !isdefined( base_tag_angles ) )
1757  {
1758  base_tag_angles = self GetTagAngles( ‪SIEGEBOT_ROCKET_WALL_RELATIVE_TAG );
1759  base_forward = AnglesToForward( base_tag_angles );
1760  base_right = AnglesToRight( base_tag_angles );
1761  base_up = AnglesToUp( base_tag_angles );
1762  }
1763 
1764  ref_offset = ref_origin - self.origin;;
1765 
1766  self.rocket_wall_origin_offset = ( VectorDot( ref_offset, base_forward), VectorDot( ref_offset, base_right ), VectorDot( ref_offset, base_up ) ) ;
1767  self.rocket_wall_angles_offset = ref_angles - base_tag_angles;
1768  }
1769 
1770  return shoot_through_wall;
1771 }
1772 
1774 {
1775  player = self;
1776 
1777  if ( isdefined( player ) && isdefined( player.current_map_vehicle ) )
1778  {
1779  player.current_map_vehicle notify( "exit_vehicle", player );
1780  }
1781 }
‪processScoreEvent
‪function processScoreEvent(event, player, victim, weapon)
Definition: scoreevents_shared.gsc:19
‪set_death_model
‪function set_death_model(sModel, fDelay)
Definition: vehicle_death_shared.gsc:258
‪Scan
‪function Scan()
Definition: _siegebot.gsc:1082
‪add_state
‪function add_state(name, enter_func, update_func, exit_func, reenter_func)
Definition: statemachine_shared.gsc:59
‪siegebot_player_fireupdate
‪function siegebot_player_fireupdate()
Definition: _siegebot.gsc:321
‪Attack_Thread_Rocket
‪function Attack_Thread_Rocket()
Definition: _siegebot.gsc:1182
‪evaluate_connections
‪function evaluate_connections(eval_func, params)
Definition: statemachine_shared.gsc:266
‪GetNextMovePosition_unaware
‪function GetNextMovePosition_unaware()
Definition: _siegebot.gsc:527
‪SIEGEBOT_ARM_TRACE_CLIP_MASK
‪#define SIEGEBOT_ARM_TRACE_CLIP_MASK
Definition: _siegebot.gsc:56
‪extend_right_arm
‪function extend_right_arm()
Definition: _siegebot.gsc:1636
‪SIEGEBOT_LEFT_ARM_TRACE_END
‪#define SIEGEBOT_LEFT_ARM_TRACE_END
Definition: _siegebot.gsc:54
‪ENEMY_VEHICLE_INACTIVE
‪#define ENEMY_VEHICLE_INACTIVE
Definition: _hacker_tool.gsh:1
‪state_combat_exit
‪function state_combat_exit(params)
Definition: _siegebot.gsc:814
‪toggle_emp_fx
‪function toggle_emp_fx(on)
Definition: vehicle_shared.gsc:2863
‪set_rocket_count
‪function set_rocket_count(rocket_count)
Definition: _siegebot.gsc:1502
‪locomotion_start
‪function locomotion_start()
Definition: _siegebot.gsc:820
‪monitor_enter_exit_vehicle
‪function monitor_enter_exit_vehicle()
Definition: _siegebot.gsc:1226
‪set_damage_fx_level
‪function set_damage_fx_level(damage_level)
Definition: vehicle_shared.gsc:3012
‪IsCooldownReady
‪function IsCooldownReady(name, timeForward_seconds)
Definition: vehicle_ai_shared.gsc:1968
‪watch_rockets
‪function watch_rockets(player)
Definition: _siegebot.gsc:1520
‪InitThreatBias
‪function InitThreatBias()
Definition: vehicle_ai_shared.gsc:60
‪siegebot_initialize
‪function siegebot_initialize()
Definition: _siegebot.gsc:86
‪arm_test
‪function arm_test()
Definition: _siegebot.gsc:1566
‪state_unaware_update
‪function state_unaware_update(params)
Definition: _siegebot.gsc:477
‪set_to_player
‪function set_to_player(str_field_name, n_value)
Definition: clientfield_shared.gsc:58
‪clean_up_spawnedOnDeath
‪function clean_up_spawnedOnDeath(entToWatch)
Definition: _siegebot.gsc:587
‪register_killstreak_bundle
‪function register_killstreak_bundle(killstreakType)
Definition: _killstreak_bundles.gsc:20
‪emped_enter
‪function emped_enter(params)
Definition: _siegebot.gsc:391
‪clean_up_spawned
‪function clean_up_spawned()
Definition: _siegebot.gsc:580
‪SIEGEBOT_RIGHT_ARM_TRACE_END
‪#define SIEGEBOT_RIGHT_ARM_TRACE_END
Definition: _siegebot.gsc:49
‪pain_toggle
‪function pain_toggle(enabled)
Definition: _siegebot.gsc:439
‪Attack_Thread_rocket
‪function Attack_Thread_rocket()
Definition: _quadtank.gsc:959
‪SIEGEBOT_MISSILE_TURRET_INDEX
‪#define SIEGEBOT_MISSILE_TURRET_INDEX
Definition: _siegebot.gsc:43
‪SIEGEBOT_RIGHT_ARM_TRACE_OFFSET
‪#define SIEGEBOT_RIGHT_ARM_TRACE_OFFSET
Definition: _siegebot.gsc:47
‪get_array
‪function get_array(kvp_value, kvp_key="targetname")
Definition: struct.csc:34
‪watch_emped
‪function watch_emped()
Definition: _siegebot.gsc:1347
‪retract_left_arm
‪function retract_left_arm()
Definition: _siegebot.gsc:1588
‪VAL
‪#define VAL(__var, __default)
Definition: shared.gsh:272
‪OnDamagePerWeapon
‪function OnDamagePerWeapon(killstreak_ref, attacker, damage, flags, type, weapon, max_health, destroyed_callback, low_health, low_health_callback, emp_damage, emp_callback, allow_bullet_damage, chargeLevel)
Definition: _killstreaks.gsc:2667
‪SIEGEBOT_LEFT_ARM_TRACE_OFFSET
‪#define SIEGEBOT_LEFT_ARM_TRACE_OFFSET
Definition: _siegebot.gsc:52
‪Attack_Rocket
‪function Attack_Rocket(target)
Definition: _siegebot.gsc:1170
‪DeleteWhenSafe
‪function DeleteWhenSafe(time=4)
Definition: vehicle_death_shared.gsc:1761
‪SIEGEBOT_LEFT_ARM_TRACE_START
‪#define SIEGEBOT_LEFT_ARM_TRACE_START
Definition: _siegebot.gsc:53
‪trace
‪function trace(from, to, target)
Definition: grapple.gsc:369
‪state_jump_update
‪function state_jump_update(params)
Definition: _siegebot.gsc:651
‪disable_missiles
‪function disable_missiles()
Definition: _siegebot.gsc:1514
‪ENEMY_VEHICLE_ACTIVE
‪#define ENEMY_VEHICLE_ACTIVE
Definition: _hacker_tool.gsh:2
‪GetNextMovePosition_tactical
‪function GetNextMovePosition_tactical()
Definition: _siegebot.gsc:830
‪state_death_update
‪function state_death_update(params)
Definition: _siegebot.gsc:224
‪state_jump_can_enter
‪function state_jump_can_enter(from_state, to_state, connection)
Definition: _siegebot.gsc:615
‪on_player_disconnected
‪function on_player_disconnected()
Definition: _siegebot.gsc:1773
‪pain_update
‪function pain_update(params)
Definition: _siegebot.gsc:444
‪state_jump_enter
‪function state_jump_enter(params)
Definition: _siegebot.gsc:623
‪extend_left_arm
‪function extend_left_arm()
Definition: _siegebot.gsc:1602
‪waittill_any_timeout
‪function waittill_any_timeout(n_timeout, string1, string2, string3, string4, string5)
Definition: util_shared.csc:423
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪Movement_Thread_Unaware
‪function Movement_Thread_Unaware()
Definition: _siegebot.gsc:494
‪on_disconnect
‪function on_disconnect()
Definition: _wager.gsc:88
‪SQR
‪#define SQR(__var)
Definition: shared.gsh:293
‪face_target
‪function face_target(position, targetAngleDiff)
Definition: _siegebot.gsc:1048
‪delay
‪function delay(time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6)
Definition: util_shared.csc:784
‪SIEGEBOT_ROCKET_WALL_TRACE_TAG
‪#define SIEGEBOT_ROCKET_WALL_TRACE_TAG
Definition: _siegebot.gsc:58
‪VERSION_TU15
‪#define VERSION_TU15
Definition: version.gsh:70
‪death_radius_damage
‪function death_radius_damage(meansOfDamage="MOD_EXPLOSIVE")
Definition: vehicle_death_shared.gsc:1196
‪does_rocket_shoot_through_wall
‪function does_rocket_shoot_through_wall(use_old_trace)
Definition: _siegebot.gsc:1723
‪Movement_Thread
‪function Movement_Thread()
Definition: _siegebot.gsc:982
‪weapon_doors_state
‪function weapon_doors_state(isOpen, waittime=0)
Definition: _siegebot.gsc:968
‪vehicle_occupied
‪function vehicle_occupied(player)
Definition: _siegebot.gsc:1243
‪update_emped_driver_visuals
‪function update_emped_driver_visuals()
Definition: _siegebot.gsc:1377
‪watch_death
‪function watch_death()
Definition: _siegebot.gsc:1419
‪SIEGEBOT_ROCKET_WALL_BLOCKED_FRAMES
‪#define SIEGEBOT_ROCKET_WALL_BLOCKED_FRAMES
Definition: _siegebot.gsc:67
‪StartInitialState
‪function StartInitialState(defaultState="combat")
Definition: vehicle_ai_shared.gsc:866
‪path_update_interrupt
‪function path_update_interrupt()
Definition: _siegebot.gsc:881
‪impact_fx
‪function impact_fx(fxname, surfaceTypes)
Definition: vehicle_shared.gsc:2765
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪JUMP_COOLDOWN
‪#define JUMP_COOLDOWN
Definition: _siegebot.gsc:39
‪enable_missiles
‪function enable_missiles()
Definition: _siegebot.gsc:1508
‪FreeWhenSafe
‪function FreeWhenSafe(time=4)
Definition: vehicle_death_shared.gsc:1756
‪SIEGEBOT_ROCKET_WALL_TRACE_START
‪#define SIEGEBOT_ROCKET_WALL_TRACE_START
Definition: _siegebot.gsc:59
‪siegebot_update_difficulty
‪function siegebot_update_difficulty()
Definition: _siegebot.gsc:175
‪friendly_fire_shield
‪function friendly_fire_shield()
Definition: vehicle_shared.gsc:2194
‪isStunned
‪function isStunned()
Definition: util_shared.gsc:813
‪SIEGEBOT_ROCKET_WALL_RELATIVE_TAG
‪#define SIEGEBOT_ROCKET_WALL_RELATIVE_TAG
Definition: _siegebot.gsc:61
‪defaultRole
‪function defaultRole()
Definition: _siegebot.gsc:186
‪update_client_ammo
‪function update_client_ammo(ammo_count, driver_only_update=false)
Definition: _siegebot.gsc:1552
‪state_jump_exit
‪function state_jump_exit(params)
Definition: _siegebot.gsc:797
‪SIEGEBOT_ROCKET_WALL_RIGHT_OFFSET
‪#define SIEGEBOT_ROCKET_WALL_RIGHT_OFFSET
Definition: _siegebot.gsc:65
‪__init__
‪function __init__()
Definition: _siegebot.gsc:76
‪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
‪waittill_pathing_done
‪function waittill_pathing_done(maxtime=15)
Definition: vehicle_ai_shared.gsc:340
‪PositionQuery_DebugScores
‪function PositionQuery_DebugScores(queryResult)
Definition: vehicle_ai_shared.gsc:2010
‪initJumpStruct
‪function initJumpStruct()
Definition: _siegebot.gsc:595
‪increment_to_player
‪function increment_to_player(str_field_name, n_increment_count=1)
Definition: clientfield_shared.gsc:169
‪stopMovementAndSetBrake
‪function stopMovementAndSetBrake()
Definition: _siegebot.gsc:1037
‪process_siegebot_kill
‪function process_siegebot_kill(driver)
Definition: _siegebot.gsc:1445
‪get_general_difficulty_level
‪function get_general_difficulty_level()
Definition: gameskill_shared.gsc:2056
‪update_emped_visuals
‪function update_emped_visuals(driver, emped)
Definition: _siegebot.gsc:1382
‪fire_for_time
‪function fire_for_time(n_time, n_index=0)
Definition: turret_shared.gsc:953
‪get_max_health
‪function get_max_health(killstreakType)
Definition: _killstreak_bundles.gsc:188
‪PositionQuery_PostProcess_SortScore
‪function PositionQuery_PostProcess_SortScore(queryResult, descending=true)
Definition: vehicle_ai_shared.gsc:2097
‪isFMJDamage
‪function isFMJDamage(sWeapon, sMeansOfDeath, attacker)
Definition: _loadout.gsc:1402
‪PositionQuery_Filter_OutOfGoalAnchor
‪function PositionQuery_Filter_OutOfGoalAnchor(queryResult, tolerance=1)
Definition: vehicle_ai_shared.gsc:2104
‪watch_right_arm
‪function watch_right_arm()
Definition: _siegebot.gsc:1689
‪update_damage_as_occupant
‪function update_damage_as_occupant(damage_taken, max_health)
Definition: vehicle_shared.gsc:3709
‪SIEGEBOT_ROCKET_WALL_TRACE_END
‪#define SIEGEBOT_ROCKET_WALL_TRACE_END
Definition: _siegebot.gsc:60
‪SIEGEBOT_MISSILE_COUNT_AFTER_RELOAD
‪#define SIEGEBOT_MISSILE_COUNT_AFTER_RELOAD
Definition: _siegebot.gsc:44
‪SIEGEBOT_RIGHT_ARM_TRACE_TAG
‪#define SIEGEBOT_RIGHT_ARM_TRACE_TAG
Definition: _siegebot.gsc:46
‪SIEGEBOT_BUNDLE
‪#define SIEGEBOT_BUNDLE
Definition: _siegebot.gsc:42
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪SIEGEBOT_ROCKET_WALL_FORWARD_OFFSET
‪#define SIEGEBOT_ROCKET_WALL_FORWARD_OFFSET
Definition: _siegebot.gsc:64
‪siegebot_kill_on_tilting
‪function siegebot_kill_on_tilting()
Definition: _siegebot.gsc:290
‪PHYSICS_TRACE_MASK_VEHICLE
‪#define PHYSICS_TRACE_MASK_VEHICLE
Definition: shared.gsh:131
‪SIEGEBOT_LEFT_ARM_TRACE_TAG
‪#define SIEGEBOT_LEFT_ARM_TRACE_TAG
Definition: _siegebot.gsc:51
‪emped
‪function emped(down_time)
Definition: _siegebot.gsc:1359
‪Spawn
‪function Spawn(parent, onDeathCallback)
Definition: _flak_drone.gsc:427
‪siegebot_callback_damage
‪function siegebot_callback_damage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal)
Definition: _siegebot.gsc:1301
‪target_hijackers
‪function target_hijackers()
Definition: vehicle_ai_shared.gsc:2312
‪waittill_asm_complete
‪function waittill_asm_complete(substate_to_wait, timeout=10)
Definition: vehicle_ai_shared.gsc:374
‪SIEGEBOT_ROCKET_WALL_Z_OFFSET
‪#define SIEGEBOT_ROCKET_WALL_Z_OFFSET
Definition: _siegebot.gsc:66
‪PositionQuery_Filter_EngagementDist
‪function PositionQuery_Filter_EngagementDist(queryResult, enemy, engagementDistanceMin, engagementDistanceMax)
Definition: vehicle_ai_shared.gsc:2116
‪should_emp
‪function should_emp(vehicle, weapon, meansOfDeath, eInflictor, eAttacker)
Definition: vehicle_ai_shared.gsc:765
‪RegisterVehicleBlackBoardAttributes
‪function RegisterVehicleBlackBoardAttributes()
Definition: blackboard_vehicle.gsc:24
‪SIEGEBOT_RIGHT_ARM_TRACE_START
‪#define SIEGEBOT_RIGHT_ARM_TRACE_START
Definition: _siegebot.gsc:48
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪siegebot_player_aimUpdate
‪function siegebot_player_aimUpdate()
Definition: _siegebot.gsc:348
‪emped_exit
‪function emped_exit(params)
Definition: _siegebot.gsc:426
‪CreateBlackBoardForEntity
‪function CreateBlackBoardForEntity(entity)
Definition: blackboard.gsc:77
‪CleanUp
‪function CleanUp()
Definition: vehicle_death_shared.gsc:1795
‪TimeSince
‪function TimeSince(startTimeInMilliseconds)
Definition: vehicle_ai_shared.gsc:1930
‪wait_then_hide
‪function wait_then_hide(wait_time)
Definition: _siegebot.gsc:1408
‪reload_rockets
‪function reload_rockets(player)
Definition: _siegebot.gsc:1482
‪should_update_damage_fx_level
‪function should_update_damage_fx_level(currentHealth, damage, maxHealth)
Definition: vehicle_shared.gsc:2900
‪add_utility_connection
‪function add_utility_connection(from_state_name, to_state_name, checkfunc, defaultScore)
Definition: statemachine_shared.gsc:112
‪watch_game_ended
‪function watch_game_ended()
Definition: _siegebot.gsc:1393
‪watch_left_arm
‪function watch_left_arm()
Definition: _siegebot.gsc:1655
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪FLAT_ORIGIN
‪#define FLAT_ORIGIN(__origin)
Definition: shared.gsh:256
‪get_script_bundle
‪function get_script_bundle(str_type, str_name)
Definition: struct.csc:45
‪emped_update
‪function emped_update(params)
Definition: _siegebot.gsc:405
‪destroy_siegebot
‪function destroy_siegebot()
Definition: _siegebot.gsc:1403
‪vehicle_unoccupied
‪function vehicle_unoccupied(player)
Definition: _siegebot.gsc:1274
‪siegebot_driving
‪function siegebot_driving(params)
Definition: _siegebot.gsc:280
‪Attack_Thread_machinegun
‪function Attack_Thread_machinegun()
Definition: _siegebot.gsc:1118
‪do_death_dynents
‪function do_death_dynents(special_status=1)
Definition: vehicle_shared.gsc:2874
‪DEBUG_ON
‪#define DEBUG_ON
Definition: _siegebot.gsc:40
‪emped_reenter
‪function emped_reenter(params)
Definition: _siegebot.gsc:430
‪state_combat_update
‪function state_combat_update(params)
Definition: _siegebot.gsc:804
‪retract_right_arm
‪function retract_right_arm()
Definition: _siegebot.gsc:1622
‪toggle_ambient_anim_group
‪function toggle_ambient_anim_group(groupID, on)
Definition: vehicle_shared.gsc:2844
‪get_state_callbacks
‪function get_state_callbacks(statename)
Definition: vehicle_ai_shared.gsc:927
‪SIEGEBOT_ROCKET_WALL_TAG
‪#define SIEGEBOT_ROCKET_WALL_TAG
Definition: _siegebot.gsc:63
‪get_death_type
‪function get_death_type(params)
Definition: vehicle_ai_shared.gsc:1323
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265