‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
mechz.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\ai_shared;
4 #using scripts\shared\array_shared;
5 #using scripts\shared\callbacks_shared;
6 #using scripts\shared\clientfield_shared;
7 #using scripts\shared\fx_shared;
8 #using scripts\shared\math_shared;
9 #using scripts\shared\scene_shared;
10 #using scripts\shared\spawner_shared;
11 #using scripts\shared\util_shared;
12 #using scripts\shared\visionset_mgr_shared;
13 #using scripts\shared\_burnplayer;
14 
15 #using scripts\shared\ai\systems\animation_state_machine_utility;
16 #using scripts\shared\ai\systems\animation_state_machine_notetracks;
17 #using scripts\shared\ai\systems\animation_state_machine_mocomp;
18 #using scripts\shared\ai\archetype_utility;
19 #using scripts\shared\ai\systems\behavior_tree_utility;
20 #using scripts\shared\ai\systems\blackboard;
21 #using scripts\shared\ai\systems\debug;
22 #using scripts\shared\ai\systems\gib;
23 #using scripts\shared\ai\zombie_utility;
24 #using scripts\shared\ai\archetype_mocomps_utility;
25 
26 #using scripts\shared\weapons\_weaponobjects;
27 
28 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
29 #insert scripts\shared\ai\systems\animation_state_machine.gsh;
30 #insert scripts\shared\ai\systems\behavior.gsh;
31 #insert scripts\shared\ai\systems\behavior_tree.gsh;
32 #insert scripts\shared\ai\systems\blackboard.gsh;
33 #insert scripts\shared\ai\systems\gib.gsh;
34 #insert scripts\shared\ai\mechz.gsh;
35 #insert scripts\shared\ai\utility.gsh;
36 #insert scripts\shared\shared.gsh;
37 #insert scripts\shared\version.gsh;
38 
39 #precache( "xmodel", MECHZ_MODEL_ARMOR_KNEE_LEFT );
40 #precache( "xmodel", MECHZ_MODEL_ARMOR_KNEE_RIGHT );
41 #precache( "xmodel", MECHZ_MODEL_ARMOR_SHOULDER_LEFT );
42 #precache( "xmodel", MECHZ_MODEL_ARMOR_SHOULDER_RIGHT );
43 #precache( "xmodel", MECHZ_MODEL_FACEPLATE );
44 #precache( "xmodel", MECHZ_MODEL_POWERSUPPLY );
45 #precache( "xmodel", MECHZ_MODEL_CLAW );
46 
47 #define PERK_JUGGERNOG "specialty_armorvest"
48 
49 #namespace MechzBehavior;
50 
51 function autoexec ‪init()
52 {
53  // INIT BEHAVIORS
55 
56  // INIT BLACKBOARD
58 
59  // INIT MECHZ ON SPAWN
61 
63  ‪clientfield::register( "actor", "mechz_faceplate_detached", ‪VERSION_DLC1, 1, "int" );
64  ‪clientfield::register( "actor", "mechz_powercap_detached", ‪VERSION_DLC1, 1, "int" );
65  ‪clientfield::register( "actor", "mechz_claw_detached", ‪VERSION_DLC1, 1, "int" );
66  ‪clientfield::register( "actor", "mechz_115_gun_firing", ‪VERSION_DLC1, 1, "int" );
67  ‪clientfield::register( "actor", "mechz_rknee_armor_detached", ‪VERSION_DLC1, 1, "int" );
68  ‪clientfield::register( "actor", "mechz_lknee_armor_detached", ‪VERSION_DLC1, 1, "int" );
69  ‪clientfield::register( "actor", "mechz_rshoulder_armor_detached", ‪VERSION_DLC1, 1, "int" );
70  ‪clientfield::register( "actor", "mechz_lshoulder_armor_detached", ‪VERSION_DLC1, 1, "int" );
71  ‪clientfield::register( "actor", "mechz_headlamp_off", ‪VERSION_DLC1, 2, "int" );
72 
74 }
75 
76 function private ‪InitMechzBehaviorsAndASM()
77 {
78  // SERVICES
81  ‪BT_REGISTER_API( "mechzBerserkKnockdownService", &‪MechzBehavior::mechzBerserkKnockdownService );
82 
83  // CONDITIONS
88  ‪BT_REGISTER_API( "mechzShouldShootFlameSweep", &‪MechzBehavior::mechzShouldShootFlameSweep );
92 
93  // ACTIONS
97 
98  // FUNCTIONS
103  ‪BT_REGISTER_API( "mechzPlayedBerserkIntro", &‪MechzBehavior::mechzPlayedBerserkIntro );
104 
110 
111  // MOCOMPS
112 
113  // NOTETRACKS
116 }
117 
119 {
120  // CREATE BLACKBOARD
122 
123  // USE UTILITY BLACKBOARD
125 
126  // CREATE MECHZ BLACKBOARD
131 
132  // REGISTER ANIMSCRIPTED CALLBACK
133  self.___ArchetypeOnAnimscriptedCallback = &‪ArchetypeMechzOnAnimscriptedCallback;
134 
135  // ENABLE DEBUGGING IN ODYSSEY
137 }
138 
139 function private ‪ArchetypeMechzOnAnimscriptedCallback( entity )
140 {
141  // UNREGISTER THE BLACKBOARD
142  entity.__blackboard = undefined;
143 
144  // REREGISTER BLACKBOARD
146 }
147 
148 function private ‪BB_GetShouldTurn()
149 {
150  if( IsDefined( self.should_turn ) && self.should_turn )
151  {
152  return ‪SHOULD_TURN;
153  }
154  return ‪SHOULD_NOT_TURN;
155 }
156 
157 //----------------------------------------------------------------------------------------------------------------------------
158 // NOTETRACK HANDLERS
159 //----------------------------------------------------------------------------------------------------------------------------
160 function private ‪mechzNotetrackMelee( entity )
161 {
162  if( isDefined( entity.mechz_melee_knockdown_function ))
163  {
164  entity thread [[ entity.mechz_melee_knockdown_function ]]();
165  }
166  entity Melee();
167 }
168 
169 function private ‪mechzNotetrackShootGrenade( entity )
170 {
171  if ( !IsDefined( entity.enemy ) )
172  {
173  return;
174  }
175 
176 // shoot_angle = RandomIntRange( MECHZ_GRENADE_DEVIATION_YAW_MIN, MECHZ_GRENADE_DEVIATION_YAW_MAX );
177 // up_angle = RandomIntRange( MECHZ_GRENADE_DEVIATION_PITCH_MIN, MECHZ_GRENADE_DEVIATION_PITCH_MAX );
178 
179  base_target_pos = entity.enemy.origin;
180  v_velocity = entity.enemy GetVelocity();
181  base_target_pos = base_target_pos + ( v_velocity * ‪MECHZ_GRENADE_TARGET_PREDICTION_TIME );
182 
183  target_pos_offset_x = math::randomsign() * randomint( ‪MECHZ_GRENADE_DEVIATION_RADIUS );
184  target_pos_offset_y = math::randomsign() * randomint( ‪MECHZ_GRENADE_DEVIATION_RADIUS );
185 
186  target_pos = base_target_pos + ( target_pos_offset_x, target_pos_offset_y, 0 );
187 
188  dir = VectorToAngles( target_pos - entity.origin );
189 // dir = ( dir[0] - up_angle, dir[1] + shoot_angle, dir[2] );
190  dir = AnglesToForward( dir );
191 
192  launch_offset = (dir * 5);
193 
194  launch_pos = entity GetTagOrigin( ‪MECHZ_GRENADE_TAG ) + launch_offset;
195 
196  dist = Distance( launch_pos, target_pos );
197 
198  velocity = dir * dist;
199  velocity = velocity + (0,0,120);
200 
201  val = 1;
202  oldval = entity ‪clientfield::get( "mechz_115_gun_firing" );
203  if( oldval === val )
204  {
205  val = 0;
206  }
207 
208  entity ‪clientfield::set( "mechz_115_gun_firing", val );
209 
210 
211  entity MagicGrenadeType( GetWeapon(‪MECHZ_GRENADE_TYPE), launch_pos, velocity );
212  PlaySoundAtPosition ("wpn_grenade_fire_mechz", entity.origin);
213 }
214 
215 //----------------------------------------------------------------------------------------------------------------------------
216 // BEHAVIOR TREE
217 //----------------------------------------------------------------------------------------------------------------------------
218 function ‪mechzTargetService( entity )
219 {
220  if ( ‪IS_TRUE( entity.ignoreall ) )
221  {
222  return false;
223  }
224 
225  if ( IsDefined( entity.destroy_octobomb ) )
226  {
227  return false;
228  }
229 
230  player = ‪zombie_utility::get_closest_valid_player( self.origin, self.ignore_player );
231 
232  entity.favoriteenemy = player;
233 
234  if( !IsDefined( player ) || player IsNoTarget() )
235  {
236  if( IsDefined( entity.ignore_player ) )
237  {
238  if(isDefined(level._should_skip_ignore_player_logic) && [[level._should_skip_ignore_player_logic]]() )
239  {
240  return;
241  }
242  entity.ignore_player = [];
243  }
244 
245  /#if ( ‪IS_TRUE( level.b_mechz_true_ignore ) )
246  {
247  entity SetGoal( entity.origin );
248  return false;
249  }#/
250 
251  if( isdefined( level.no_target_override ) )
252  {
253  [[ level.no_target_override ]]( entity );
254  }
255  else
256  {
257  entity SetGoal( entity.origin );
258  }
259 
260  return false;
261  }
262  else
263  {
264 
265  if( isDefined( level.enemy_location_override_func ))
266  {
267  enemy_ground_pos = [[level.enemy_location_override_func]]( entity, player);
268  if( isDefined( enemy_ground_pos ))
269  {
270  entity SetGoal( enemy_ground_pos);
271  return true;
272  }
273  }
274 
275  targetPos = GetClosestPointOnNavMesh( player.origin, ‪MECHZ_NAVMESH_RADIUS, ‪MECHZ_NAVMESH_BOUNDARY_DIST );
276  if ( IsDefined( targetPos ) )
277  {
278  entity SetGoal( targetPos );
279  return true;
280  }
281  else
282  {
283  entity SetGoal( entity.origin );
284  return false;
285  }
286  }
287 }
288 
289 function private ‪mechzGrenadeService( entity )
290 {
291  if( !isDefined( entity.burstGrenadesFired ))
292  {
293  entity.burstGrenadesFired = 0;
294  }
295 
296  if ( entity.burstGrenadesFired >= ‪MECHZ_GRENADE_BURST_SIZE )
297  {
298  if ( GetTime() > entity.nextGrenadeTime )
299  {
300  entity.burstGrenadesFired = 0;
301  }
302  }
303 
304  if( isDefined( level.a_electroball_grenades ))
305  {
306  level.a_electroball_grenades = ‪array::remove_undefined( level.a_electroball_grenades );
307 
308  a_active_grenades = array::filter( level.a_electroball_grenades, false, &‪mechzFilterGrenadesByOwner, entity );
309  entity.activeGrenades = a_active_grenades.size;
310  }
311  else
312  {
313  entity.activeGrenades = 0;
314  }
315 
316 }
317 
318 function private ‪mechzFilterGrenadesByOwner( grenade, mechz )
319 {
320  if( grenade.owner === mechz )
321  {
322  return true;
323  }
324 
325  return false;
326 
327 }
328 
329 function private ‪mechzBerserkKnockdownService( entity )
330 {
331  velocity = entity GetVelocity();
332  predict_time = 0.3;
333  predicted_pos = entity.origin + ( velocity * predict_time );
334  move_dist_sq = DistanceSquared( predicted_pos, entity.origin );
335  speed = move_dist_sq / predict_time;
336 
337  if( speed >= 10 )
338  {
339  a_zombies = GetAIArchetypeArray( ‪ARCHETYPE_ZOMBIE );
340 
341  a_filtered_zombies = array::filter( a_zombies, false, &‪mechzZombieEligibleForBerserkKnockdown, entity, predicted_pos );
342 
343  if( a_filtered_zombies.size > 0 )
344  {
345  foreach( zombie in a_filtered_zombies )
346  {
347  zombie.knockdown = true;
348  zombie.knockdown_type = ‪KNOCKDOWN_SHOVED;
349  zombie_to_mechz = entity.origin - zombie.origin;
350  zombie_to_mechz_2d = VectorNormalize( ( zombie_to_mechz[0], zombie_to_mechz[1], 0 ) );
351 
352  zombie_forward = AnglesToForward( zombie.angles );
353  zombie_forward_2d = VectorNormalize( ( zombie_forward[0], zombie_forward[1], 0 ) );
354 
355  zombie_right = AnglesToRight( zombie.angles );
356  zombie_right_2d = VectorNormalize( ( zombie_right[0], zombie_right[1], 0 ) );
357 
358  dot = VectorDot( zombie_to_mechz_2d, zombie_forward_2d );
359 
360  if( dot >= 0.5 )
361  {
362  zombie.knockdown_direction = "front";
363  zombie.getup_direction = ‪GETUP_BACK;
364  }
365  else if ( dot < 0.5 && dot > -0.5 )
366  {
367  dot = VectorDot( zombie_to_mechz_2d, zombie_right_2d );
368  if( dot > 0 )
369  {
370  zombie.knockdown_direction = "right";
371 
372  if ( ‪math::cointoss() )
373  {
374  zombie.getup_direction = ‪GETUP_BACK;
375  }
376  else
377  {
378  zombie.getup_direction = ‪GETUP_BELLY;
379  }
380  }
381  else
382  {
383  zombie.knockdown_direction = "left";
384  zombie.getup_direction = ‪GETUP_BELLY;
385  }
386  }
387  else
388  {
389  zombie.knockdown_direction = "back";
390  zombie.getup_direction = ‪GETUP_BELLY;
391  }
392  }
393  }
394  }
395 }
396 
397 function private ‪mechzZombieEligibleForBerserkKnockdown( zombie, mechz, predicted_pos )
398 {
399  if( zombie.knockdown === true )
400  {
401  return false;
402  }
403 
404  knockdown_dist_sq = 48*48;
405 
406  dist_sq = DistanceSquared( predicted_pos, zombie.origin );
407 
408  if( dist_sq > knockdown_dist_sq )
409  {
410  return false;
411  }
412 
413  if( zombie.is_immune_to_knockdown === true )
414  {
415  return false;
416  }
417 
418  origin = mechz.origin;
419 
420  facing_vec = AnglesToForward( mechz.angles );
421  enemy_vec = zombie.origin - origin;
422 
423  enemy_yaw_vec = (enemy_vec[0], enemy_vec[1], 0);
424  facing_yaw_vec = (facing_vec[0], facing_vec[1], 0);
425 
426  enemy_yaw_vec = VectorNormalize( enemy_yaw_vec );
427  facing_yaw_vec = VectorNormalize( facing_yaw_vec );
428 
429  enemy_dot = VectorDot( facing_yaw_vec, enemy_yaw_vec );
430 
431  if( enemy_dot < 0 )// is enemy behind mechz
432  {
433  return false;
434  }
435 
436  return true;
437 
438 }
439 
440 //----------------------------------------------------------------------------------------------------------------------------------
441 // CONDITIONS
442 //----------------------------------------------------------------------------------------------------------------------------------
443 function ‪mechzShouldMelee( entity )
444 {
445  if( !IsDefined( entity.enemy ) )
446  {
447  return false;
448  }
449 
450  if( DistanceSquared( entity.origin, entity.enemy.origin ) > ‪MECHZ_MELEE_DIST_SQ )
451  {
452  return false;
453  }
454 
455  // don't do yaw check if on vehicle ( turret ). add any additional checks above this.
456  if( ‪IS_TRUE( entity.enemy.usingvehicle ) )
457  {
458  return true;
459  }
460 
461  yaw = abs( zombie_utility::getYawToEnemy() );
462  if( ( yaw > ‪MECHZ_MELEE_YAW ) )
463  {
464  return false;
465  }
466 
467  return true;
468 }
469 
470 function private ‪mechzShouldShowPain( entity )
471 {
472  if( entity.partDestroyed === true )
473  {
474  return true;
475  }
476 
477  return false;
478 }
479 
480 function private ‪mechzShouldShootGrenade( entity )
481 {
482 
483  if( entity.berserk === true )
484  {
485  return false;
486  }
487 
488  if( entity.gun_attached !== true )
489  {
490  return false;
491  }
492 
493  if ( !IsDefined( entity.favoriteenemy ) )
494  {
495  return false;
496  }
497 
498  if ( entity.burstGrenadesFired >= ‪MECHZ_GRENADE_BURST_SIZE )
499  {
500  return false;
501  }
502 
503  if( entity.activeGrenades >= ‪MECHZ_GRENADE_MAX )
504  {
505  return false;
506  }
507 
509  {
510  return false;
511  }
512 
513  if( !entity CanSee( entity.favoriteenemy ) )
514  {
515  return false;
516  }
517 
518  dist_sq = DistanceSquared( entity.origin, entity.favoriteenemy.origin );
519  if ( dist_sq < MECHZ_GRENADE_DIST_SQ_MIN || dist_sq > ‪MECHZ_GRENADE_DIST_SQ_MAX )
520  {
521  return false;
522  }
523 
524  return true;
525 }
526 
527 function private ‪mechzShouldShootFlame( entity )
528 {
529  /#
530  if ( ‪IS_TRUE( entity.shoot_flame ) )
531  {
532  return true;
533  }
534  #/
535 
536  if( entity.berserk === true )
537  {
538  return false;
539  }
540 
541  if ( ‪IS_TRUE( entity.isShootingFlame ) && GetTime() < entity.stopShootingFlameTime )
542  {
543  return true;
544  }
545 
546  if ( !IsDefined( entity.favoriteenemy ) )
547  {
548  return false;
549  }
550 
551  if( entity.isShootingFlame === true && entity.stopShootingFlameTime <= GetTime() )
552  {
553  return false;
554  }
555 
556  if ( entity.nextFlameTime > GetTime() )
557  {
558  return false;
559  }
560 
562  {
563  return false;
564  }
565 
566  dist_sq = DistanceSquared( entity.origin, entity.favoriteenemy.origin );
567  if ( dist_sq < MECHZ_FT_DIST_SQ_MIN || dist_sq > ‪MECHZ_FT_DIST_SQ_MAX )
568  {
569  return false;
570  }
571 
572  ‪can_see = BulletTracePassed( entity.origin + ( 0, 0, 36 ), entity.favoriteenemy.origin + ( 0, 0, 36 ), false, undefined );
573  if ( !‪can_see )
574  {
575  return false;
576  }
577 
578  return true;
579 }
580 
581 function private ‪mechzShouldShootFlameSweep( entity )
582 {
583  if( entity.berserk === true )
584  {
585  return false;
586  }
587 
588  if ( !‪mechzShouldShootFlame( entity ) )
589  {
590  return false;
591  }
592 
593  if ( RandomInt( 100 ) > ‪MECHZ_FT_SWEEP_CHANCE )
594  {
595  return false;
596  }
597 
598  near_players = 0;
599  players = GetPlayers();
600 
601  foreach( player in players )
602  {
603  if ( Distance2DSquared( entity.origin, player.origin ) < ‪MECHZ_FT_SWEEP_PLAYER_DIST_SQ )
604  {
605  near_players++;
606  }
607  }
608 
609  if ( near_players < 2 )
610  {
611  return false;
612  }
613 
614  return true;
615 }
616 
617 function private ‪mechzShouldTurnBerserk( entity )
618 {
619  if( entity.berserk === true && entity.hasTurnedBerserk !== true )
620  {
621  return true;
622  }
623 
624  return false;
625 }
626 
627 function private ‪mechzShouldStun( entity )
628 {
629  if ( ‪IS_TRUE( entity.stun ) )
630  {
631  return true;
632  }
633 
634  return false;
635 }
636 
637 function private ‪mechzShouldStumble( entity )
638 {
639  if ( ‪IS_TRUE( entity.stumble ) )
640  {
641  return true;
642  }
643 
644  return false;
645 }
646 
647 //----------------------------------------------------------------------------------------------------------------------------------
648 // ACTIONS
649 //----------------------------------------------------------------------------------------------------------------------------------
650 function private ‪mechzShootGrenadeAction( entity, asmStateName )
651 {
652  ‪AnimationStateNetworkUtility::RequestState( entity, asmStateName );
653 
654  entity.grenadeStartTime = GetTime() + 3000;
655 
656  return ‪BHTN_RUNNING;
657 }
658 
659 function private ‪mechzShootGrenadeActionUpdate( entity, asmStateName )
660 {
661  if ( !‪IS_TRUE( entity.shoot_grenade ) )
662  {
663  return ‪BHTN_SUCCESS;
664  }
665 
666  return ‪BHTN_RUNNING;
667 }
668 
669 function private ‪mechzStunStart( entity, asmStateName )
670 {
671  ‪AnimationStateNetworkUtility::RequestState( entity, asmStateName );
672 
673  entity.stunTime = GetTime() + ‪MECHZ_STUN_TIME;
674 
675  return ‪BHTN_RUNNING;
676 }
677 
678 function private ‪mechzStunUpdate( entity, asmStateName )
679 {
680  if ( GetTime() > entity.stunTime )
681  {
682  return ‪BHTN_SUCCESS;
683  }
684 
685  return ‪BHTN_RUNNING;
686 }
687 
688 function private ‪mechzStunEnd( entity, asmStateName )
689 {
690  entity.stun = false;
691  entity.stumble_stun_cooldown_time = GetTime() + ‪MECHZ_STUN_STUMBLE_COOLDOWN;
692 
693  return ‪BHTN_SUCCESS;
694 }
695 
696 function private ‪mechzStumbleStart( entity, asmStateName )
697 {
698  ‪AnimationStateNetworkUtility::RequestState( entity, asmStateName );
699 
700  entity.stumbleTime = GetTime() + ‪MECHZ_STUMBLE_TIME;
701 
702  return ‪BHTN_RUNNING;
703 }
704 
705 function private ‪mechzStumbleUpdate( entity, asmStateName )
706 {
707  if ( GetTime() > entity.stumbleTime )
708  {
709  return ‪BHTN_SUCCESS;
710  }
711 
712  return ‪BHTN_RUNNING;
713 }
714 
715 function private ‪mechzStumbleEnd( entity, asmStateName )
716 {
717  entity.stumble = false;
718 
719  entity.stumble_stun_cooldown_time = GetTime() + ‪MECHZ_STUN_STUMBLE_COOLDOWN;
720 
721  return ‪BHTN_SUCCESS;
722 }
723 
724 function ‪mechzShootFlameActionStart( entity, asmStateName )
725 {
726  ‪AnimationStateNetworkUtility::RequestState( entity, asmStateName );
727 
728  ‪mechzShootFlame( entity );
729 
730  return ‪BHTN_RUNNING;
731 }
732 
733 function ‪mechzShootFlameActionUpdate( entity, asmStateName )
734 {
735  if( ‪IS_TRUE( entity.berserk ))
736  {
737  ‪mechzStopFlame( entity );
738  return ‪BHTN_SUCCESS;
739  }
740 
741  if( ‪IS_TRUE( ‪mechzShouldMelee( entity )) )
742  {
743  ‪mechzStopFlame( entity );
744  return ‪BHTN_SUCCESS;
745  }
746 
747  if ( ‪IS_TRUE( entity.isShootingFlame ) )
748  {
749  if ( IsDefined( entity.stopShootingFlameTime ) && GetTime() > entity.stopShootingFlameTime )
750  {
751  ‪mechzStopFlame( entity );
752  return ‪BHTN_SUCCESS;
753  }
754 
755  ‪mechzUpdateFlame( entity );
756  }
757 
758  return ‪BHTN_RUNNING;
759 }
760 
761 function ‪mechzShootFlameActionEnd( entity, asmStateName )
762 {
763  ‪mechzStopFlame( entity );
764 
765  return ‪BHTN_SUCCESS;
766 }
767 
768 
769 //----------------------------------------------------------------------------------------------------------------------------------
770 // FUNCTIONS
771 //----------------------------------------------------------------------------------------------------------------------------------
772 function private ‪mechzShootGrenade( entity )
773 {
774  entity.burstGrenadesFired ++;
775  if ( entity.burstGrenadesFired >= ‪MECHZ_GRENADE_BURST_SIZE )
776  {
777  entity.nextGrenadeTime = GetTime() + ‪MECHZ_GRENADE_DELAY;
778  }
779 }
780 
781 function private ‪mechzShootFlame( entity )
782 {
783  entity thread ‪mechzDelayFlame();
784 }
785 
786 function private ‪mechzDelayFlame()
787 {
788  self endon( "death" );
789 
790  self notify( "mechzDelayFlame" );
791  self endon( "mechzDelayFlame" );
792 
793  wait( ‪MECHZ_FT_BLEND_TIME );
794 
796  self.isShootingFlame = true;
797  self.stopShootingFlameTime = GetTime() + ‪MECHZ_FT_RUN_DURATION;
798 }
799 
800 function private ‪mechzUpdateFlame( entity )
801 {
802  if( IsDefined( level.mechz_flamethrower_player_callback ) )
803  {
804  [[level.mechz_flamethrower_player_callback]]( entity );
805  }
806  else
807  {
808  players = GetPlayers();
809 
810  foreach( player in players )
811  {
812  if ( !‪IS_TRUE( player.is_burning ) )
813  {
814  if ( player IsTouching( entity.flameTrigger ) )
815  {
816  if ( IsDefined( entity.mechzFlameDamage ) )
817  {
818  player thread [[ entity.mechzFlameDamage ]]();
819  }
820  else
821  {
822  player thread ‪playerFlameDamage(entity);
823  }
824  }
825  }
826  }
827  }
828 
829  if( IsDefined( level.mechz_flamethrower_ai_callback ) )
830  {
831  [[level.mechz_flamethrower_ai_callback]](entity);
832  }
833 }
834 
835 function ‪playerFlameDamage(mechz)
836 {
837  self endon( "death" );
838  self endon( "disconnect" );
839 
840  if ( !‪IS_TRUE( self.is_burning ) && ‪zombie_utility::is_player_valid( self, true ) )
841  {
842  self.is_burning = 1;
843 
844  if ( !self HasPerk( ‪PERK_JUGGERNOG ) )
845  {
846  self burnplayer::setPlayerBurning( ‪MECHZ_FT_PLAYER_BURN_TIME, ‪MECHZ_FT_PLAYER_DAMAGE_DELAY, ‪MECHZ_FT_PLAYER_DAMAGE, mechz, undefined );
847  }
848  else
849  {
850  self burnplayer::setPlayerBurning( ‪MECHZ_FT_PLAYER_BURN_TIME, ‪MECHZ_FT_PLAYER_DAMAGE_DELAY, ‪MECHZ_FT_PLAYER_DAMAGE_JUGG, mechz, undefined );
851  }
852 
854 
855  self.is_burning = 0;
856  }
857 }
858 
859 function ‪mechzStopFlame( entity )
860 {
861  self notify( "mechzDelayFlame" );
862 
864  entity.isShootingFlame = false;
865  entity.nextFlameTime = GetTime() + ‪MECHZ_FT_DELAY;
866  entity.stopShootingFlameTime = undefined;
867 }
868 
870 {
871  entity = self;
872  g_time = GetTime();
873 
874 // entity ASMSetAnimationRate( 1.04 );
875 
876  entity.berserkEndTime = g_time + ‪MECHZ_BERSERK_TIME;
877 
878  if( entity.berserk !== true )
879  {
880  entity.berserk = true;
881  entity thread mechzEndBerserk();
883  }
884 }
885 
886 function private ‪mechzPlayedBerserkIntro( entity )
887 {
888  entity.hasTurnedBerserk = true;
889 }
890 
891 function private ‪mechZEndBerserk()
892 {
893  self endon( "death" );
894  self endon( "disconnect" );
895 
896  While( self.berserk === true )
897  {
898  if( GetTime() >= self.berserkEndTime )
899  {
900  self.berserk = false;
901  self.hasTurnedBerserk = false;
902 
903  self ASMSetAnimationRate( 1.0 );
904 
906  }
907 
908  wait 0.25;
909  }
910 }
911 
912 function private ‪mechzAttackStart( entity )
913 {
915 }
916 
917 function private ‪mechzDeathStart( entity )
918 {
920 }
921 
922 function private ‪mechzIdleStart( entity )
923 {
925 }
926 
927 function private ‪mechzPainStart( entity )
928 {
930 }
931 
932 function private ‪mechzPainTerminate( entity )
933 {
934  entity.partDestroyed = false;
935  entity.show_pain_from_explosive_dmg = undefined;
936 }
937 
939 // MOCOMPS
941 
942 
944 #namespace MechzServerUtils;
945 
946 function private ‪mechzSpawnSetup()
947 {
948  self DisableAimAssist();
949 
950  self.disableAmmoDrop = true;
951  self.no_gib = true;
952  self.ignore_nuke = true;
953  self.ignore_enemy_count = true;
954  self.ignore_round_robbin_death = true;
955 
956  self.zombie_move_speed = "run";
958 
959  self.ignoreRunAndGunDist = true;
960 
961  self ‪mechzAddAttachments();
962 
963  self.grenadeCount = ‪MECHZ_GRENADE_MAX;
964 
965  self.nextFlameTime = GetTime();
966  self.stumble_stun_cooldown_time = GetTime();
967 
968  /#
969  self.debug_traversal_ast = "traverse@mechz";
970  #/
971 
972  self.flameTrigger = ‪Spawn( "trigger_box", self.origin, 0, 200, 50, 25 );
973  self.flameTrigger EnableLinkTo();
974 
975  self.flameTrigger.origin = self GetTagOrigin( ‪MECHZ_FT_TAG );
976  self.flameTrigger.angles = self GetTagAngles( ‪MECHZ_FT_TAG );
977 
978  self.flameTrigger LinkTo( self, ‪MECHZ_FT_TAG );
979 
981 
982  // necessary array creation element for weapon watcher stuff used in the electroball grenade
983  self.pers = [];
984  self.pers["team"] = self.team;
985 
986  //self thread mechzFlameWatcher();
987 }
988 
989 function private ‪mechzFlameWatcher()
990 {
991  self endon( "death" );
992 
993  while ( 1 )
994  {
995  if ( IsDefined( self.favoriteenemy ) )
996  {
997  if ( self.flameTrigger IsTouching( self.favoriteenemy ) )
998  {
999  /# PrintTopRightLn( "flame on" ); #/
1000  }
1001  }
1002 
1004  }
1005 }
1006 
1007 
1008 function private ‪mechzAddAttachments()
1009 {
1010  self.has_left_knee_armor = true;
1011  self.left_knee_armor_health = ‪MECHZ_ARMOR_KNEE_LEFT_HEALTH;
1012 
1013  self.has_right_knee_armor = true;
1014  self.right_knee_armor_health = ‪MECHZ_ARMOR_KNEE_RIGHT_HEALTH;
1015 
1016  self.has_left_shoulder_armor = true;
1017  self.left_shoulder_armor_health = ‪MECHZ_ARMOR_SHOULDER_LEFT_HEALTH;
1018 
1019  self.has_right_shoulder_armor = true;
1020  self.right_shoulder_armor_health = ‪MECHZ_ARMOR_SHOULDER_RIGHT_HEALTH;
1021 
1022  org = self GetTagOrigin( ‪MECHZ_TAG_CLAW );
1023  ang = self GetTagAngles( ‪MECHZ_TAG_CLAW );
1024 
1025  self.gun_attached = true;
1026 
1027  self.has_faceplate = true;
1028  self.faceplate_health = ‪MECHZ_FACEPLATE_HEALTH;
1029 
1030  self.has_powercap = true;
1031  self.powercap_covered = true;
1032  self.powercap_cover_health = ‪MECHZ_POWERCAP_COVER_HEALTH;
1033  self.powercap_health = ‪MECHZ_POWERCAP_HEALTH;
1034 }
1035 
1036 function ‪mechzDamageCallback( inflictor, attacker, ‪damage, dFlags, mod, weapon, point, dir, hitLoc, offsetTime, boneIndex, modelIndex )
1037 {
1038  if( isDefined( self.b_flyin_done ) && !‪IS_TRUE( self.b_flyin_done ) )
1039  {
1040  return 0;
1041  }
1042 
1043  if ( isDefined( level.mechz_should_stun_override ) && !( ‪IS_TRUE( self.stun ) || ‪IS_TRUE( self.stumble ) ) )
1044  {
1045  if ( self.stumble_stun_cooldown_time < GetTime() && !‪IS_TRUE( self.berserk) )
1046  {
1047  self [[level.mechz_should_stun_override]]( inflictor, attacker, ‪damage, dFlags, mod, weapon, point, dir, hitLoc, offsetTime, boneIndex, modelIndex );
1048  }
1049  }
1050 
1051  if ( IsSubStr( weapon.name, ‪MECHZ_REACT_ELEMENTAL_BOW ) && isdefined( inflictor ) && inflictor.classname === "rocket" )
1052  {
1053  // AkiA: Damage from bow shots that hit Mechz directly is controlled in zm_weap_elemental_bow::mechz_direct_hit_impact_damage_check()
1054  return 0;
1055  }
1056 
1058 
1059  if( isdefined( level.mechz_damage_override ) )
1060  {
1061  ‪damage = [[level.mechz_damage_override]]( attacker, ‪damage );
1062  }
1063 
1064  // play audio pain if he hasn't been hit in a bit
1065  if( !isDefined( self.next_pain_time ) || GetTime() >= self.next_pain_time )
1066  {
1067  self thread ‪mechz_play_pain_audio();
1068  self.next_pain_time = GetTime() + 250 + RandomInt( 500 ); //will wait this long before playing a pain audio again
1069  }
1070 
1071  if( isDefined( self.damage_scoring_function ))
1072  {
1073  self [[ self.damage_scoring_function ]]( inflictor, attacker, ‪damage, dFlags, mod, weapon, point, dir, hitLoc, offsetTime, boneIndex, modelIndex );
1074  }
1075 
1076  if( IsDefined( level.mechz_staff_damage_override ) )
1077  {
1078  staffDamage = [[ level.mechz_staff_damage_override ]]( inflictor, attacker, ‪damage, dFlags, mod, weapon, point, dir, hitLoc, offsetTime, boneIndex, modelIndex );
1079 
1080  if( staffDamage > 0 )
1081  {
1082  n_mechz_damage_percent = 0.5;
1083 
1084  // Boost damage if his helmet is off and the weapon is a staff
1085  if( !‪IS_TRUE( self.has_faceplate ) && n_mechz_damage_percent < 1.0 )
1086  {
1087  n_mechz_damage_percent = 1.0;
1088  }
1089 
1090  staffDamage = staffDamage * n_mechz_damage_percent;
1091 
1092  if( ‪IS_TRUE( self.has_faceplate ) )
1093  {
1094  self ‪mechz_track_faceplate_damage( staffDamage );
1095  }
1096 
1097  /#iPrintLnBold( "Staff DMG: " + staffDamage + ". HP: " + ( self.health - staffDamage ) );#/
1098 
1099  ‪DEFAULT( self.explosive_dmg_taken, 0 );
1100  self.explosive_dmg_taken += staffDamage;
1101 
1102  if( IsDefined( level.mechz_explosive_damage_reaction_callback ) )
1103  {
1104  self [[ level.mechz_explosive_damage_reaction_callback ]]();
1105  }
1106 
1107  return staffDamage;
1108  }
1109  }
1110 
1111  if( IsDefined( level.mechz_explosive_damage_reaction_callback ) )
1112  {
1113  if( isDefined( mod ) && mod == "MOD_GRENADE" || mod == "MOD_GRENADE_SPLASH" || mod == "MOD_PROJECTILE" || mod == "MOD_PROJECTILE_SPLASH" || mod == "MOD_EXPLOSIVE" )
1114  {
1115  n_mechz_damage_percentage = 0.5;
1116  if( isDefined( attacker ) && IsPlayer( attacker ) && IsAlive( attacker ) && ( level.zombie_vars[attacker.team]["zombie_insta_kill"] || ‪IS_TRUE( attacker.personal_instakill )) ) //instakill does normal damage
1117  {
1118  n_mechz_damage_percentage = 1.0;
1119  }
1120 
1121  explosive_damage = ‪damage * n_mechz_damage_percentage;
1122 
1123  ‪DEFAULT( self.explosive_dmg_taken, 0 );
1124  self.explosive_dmg_taken += explosive_damage;
1125 
1126  if( ‪IS_TRUE( self.has_faceplate ) )
1127  {
1128  self ‪mechz_track_faceplate_damage( explosive_damage );
1129  }
1130 
1131  self [[ level.mechz_explosive_damage_reaction_callback ]]();
1132 
1133  /#iPrintLnBold( "Explosive DMG: " + explosive_damage + ". HP: " + ( self.health - explosive_damage ) );#/
1134 
1135  return explosive_damage;
1136  }
1137  }
1138 
1139  if ( hitLoc == "head" )
1140  {
1141  attacker ‪show_hit_marker();
1142  /#iPrintLnBold( "Head DMG: " + ‪damage + ". HP: " + ( self.health - ‪damage ) );#/
1143  return ‪damage;
1144  }
1145 
1146  if( hitloc !== "none" )
1147  {
1148  switch( hitLoc )
1149  {
1150  case "torso_upper":
1151  if( self.has_faceplate == true )
1152  {
1153  faceplate_pos = self GetTagOrigin( ‪MECHZ_TAG_FACEPLATE );
1154  dist_sq = DistanceSquared( faceplate_pos, point );
1155 
1156  if( dist_sq <= 144 )
1157  {
1159  attacker ‪show_hit_marker();
1160  }
1161 
1162  headlamp_dist_sq = DistanceSquared( point, self GetTagOrigin( "tag_headlamp_FX" ));
1163  if( headlamp_dist_sq <= 9 )
1164  {
1166  }
1167  }
1168 
1169  partName = GetPartName( ‪MECHZ_MODEL_BODY, boneIndex );
1170  if( self.powercap_covered === true && ( partName === ‪MECHZ_TAG_POWERSUPPLY || partName === ‪MECHZ_TAG_POWERCORE ) )
1171  {
1173  attacker ‪show_hit_marker();
1174  /#iPrintLnBold( "PowerCore/Supply DMG: " + ( ‪damage * ‪MECHZ_BODY_DAMAGE_SCALE ) + ". HP: " + ( self.health - ( ‪damage * ‪MECHZ_BODY_DAMAGE_SCALE ) ) );#/
1176  }
1177  else if( self.powercap_covered !== true && self.has_powercap === true && ( partName === ‪MECHZ_TAG_POWERSUPPLY || partName === ‪MECHZ_TAG_POWERCORE ) )
1178  {
1180  attacker ‪show_hit_marker();
1181  /#iPrintLnBold( "PowerCore/Supply DMG: " + ‪damage + ". HP: " + ( self.health - ‪damage ) );#/
1182  return ‪damage;
1183  }
1184  else if( self.powercap_covered !== true && self.has_powercap !== true && ( partName === ‪MECHZ_TAG_POWERSUPPLY || partName === ‪MECHZ_TAG_POWERCORE ) )
1185  {
1186  /#iPrintLnBold( "PowerCore/Supply DMG: " + ( ‪damage * ‪MECHZ_POWERCORE_DAMAGE_SCALE ) + ". HP: " + ( self.health - ( ‪damage * ‪MECHZ_POWERCORE_DAMAGE_SCALE ) ) );#/
1187  attacker ‪show_hit_marker();
1189  }
1190 
1191  if( self.has_right_shoulder_armor === true && partName === ‪MECHZ_TAG_ARMOR_SHOULDER_RIGHT )
1192  {
1194  /#iPrintLnBold( "Torso Upper DMG: " + ( ‪damage * ‪MECHZ_BODY_DAMAGE_SCALE ) + ". HP: " + ( self.health - ( ‪damage * ‪MECHZ_BODY_DAMAGE_SCALE ) ) );#/
1196  }
1197 
1198  if( self.has_left_shoulder_armor === true && partName === ‪MECHZ_TAG_ARMOR_SHOULDER_LEFT )
1199  {
1201  /#iPrintLnBold( "Torso Upper DMG: " + ( ‪damage * ‪MECHZ_BODY_DAMAGE_SCALE ) + ". HP: " + ( self.health - ( ‪damage * ‪MECHZ_BODY_DAMAGE_SCALE ) ) );#/
1203  }
1204 
1205  /#iPrintLnBold( "Torso Upper DMG: " + ( ‪damage * ‪MECHZ_BODY_DAMAGE_SCALE ) + ". HP: " + ( self.health - ( ‪damage * ‪MECHZ_BODY_DAMAGE_SCALE ) ) );#/
1207  break;
1208 
1209  case "left_leg_lower":
1210  partName = GetPartName( ‪MECHZ_MODEL_BODY, boneIndex );
1211  if( partName === ‪MECHZ_TAG_ARMOR_KNEE_LEFT && self.has_left_knee_armor === true )
1212  {
1214  }
1215 
1216  /#iPrintLnBold( "HitLoc L Leg Lower DMG: " + ( ‪damage * ‪MECHZ_BODY_DAMAGE_SCALE ) + ". HP: " + ( self.health - ( ‪damage * ‪MECHZ_BODY_DAMAGE_SCALE ) ) );#/
1218  break;
1219 
1220  case "right_leg_lower":
1221  partName = GetPartName( ‪MECHZ_MODEL_BODY, boneIndex );
1222  if( partName === ‪MECHZ_TAG_ARMOR_KNEE_RIGHT && self.has_right_knee_armor === true )
1223  {
1225  }
1226 
1227  /#iPrintLnBold( "HitLoc R Leg Lower DMG: " + ( ‪damage * ‪MECHZ_BODY_DAMAGE_SCALE ) + ". HP: " + ( self.health - ( ‪damage * ‪MECHZ_BODY_DAMAGE_SCALE ) ) );#/
1229  break;
1230 
1231  case "left_hand":
1232  case "left_arm_lower":
1233  case "left_arm_upper":
1234  if ( IsDefined( level.mechz_left_arm_damage_callback ) )
1235  {
1236  self [[ level.mechz_left_arm_damage_callback ]]();
1237  }
1238 
1239  /#iPrintLnBold( "HitLoc L Arm DMG: " + ( ‪damage * ‪MECHZ_BODY_DAMAGE_SCALE ) + ". HP: " + ( self.health - ( ‪damage * ‪MECHZ_BODY_DAMAGE_SCALE ) ) );#/
1241  break;
1242 
1243 
1244  default:
1245  /#iPrintLnBold( "HitLoc DEFAULT DMG: " + ( ‪damage * ‪MECHZ_BODY_DAMAGE_SCALE ) + ". HP: " + ( self.health - ( ‪damage * ‪MECHZ_BODY_DAMAGE_SCALE ) ) );#/
1247  break;
1248  }
1249  }
1250 
1251  if ( mod == "MOD_PROJECTILE" )
1252  {
1254 
1255  if( self.has_faceplate !== true )
1256  {
1257  head_pos = self GetTagOrigin( "tag_eye" );
1258  dist_sq = DistanceSquared( head_pos, point );
1259 
1260  if( dist_sq <= 144 )
1261  {
1262  /#iPrintLnBold( "Projectile head DMG: " + ‪damage + ". HP: " + ( self.health - ‪damage ) );#/
1263  attacker ‪show_hit_marker();
1264  return ‪damage;
1265  }
1266 
1267  }
1268 
1269  if( self.has_faceplate === true )
1270  {
1271  faceplate_pos = self GetTagOrigin( ‪MECHZ_TAG_FACEPLATE );
1272  dist_sq = DistanceSquared( faceplate_pos, point );
1273 
1274  if( dist_sq <= 144 )
1275  {
1277  attacker ‪show_hit_marker();
1278  }
1279 
1280  headlamp_dist_sq = DistanceSquared( point, self GetTagOrigin( "tag_headlamp_FX" ));
1281  if( headlamp_dist_sq <= 9 )
1282  {
1284  }
1285  }
1286 
1287 
1288  power_pos = self GetTagOrigin( ‪MECHZ_TAG_POWERCORE );
1289  power_dist_sq = DistanceSquared( power_pos, point );
1290 
1291  if( power_dist_sq <= 25 )
1292  {
1293  if( self.powercap_covered !== true && self.has_powercap !== true )
1294  {
1295  /#iPrintLnBold( "Projectile powercap DMG: " + ‪damage + ". HP: " + ( self.health - ‪damage ) );#/
1296  attacker ‪show_hit_marker();
1297  return ‪damage;
1298  }
1299 
1300  if( self.powercap_covered !== true && self.has_powercap === true )
1301  {
1303  attacker ‪show_hit_marker();
1304  /#iPrintLnBold( "Projectile powercap DMG: " + ‪damage + ". HP: " + ( self.health - ‪damage ) );#/
1305  return ‪damage;
1306  }
1307 
1308  if( self.powercap_covered === true )
1309  {
1311  attacker ‪show_hit_marker();
1312  }
1313  }
1314 
1315  if( self.has_right_shoulder_armor === true )
1316  {
1317  armor_pos = self GetTagOrigin( ‪MECHZ_TAG_ARMOR_SHOULDER_RIGHT );
1318  dist_sq = DistanceSquared( armor_pos, point );
1319 
1320  if( dist_sq <= 64 )
1321  {
1323  }
1324  }
1325 
1326  if( self.has_left_shoulder_armor === true )
1327  {
1328  armor_pos = self GetTagOrigin( ‪MECHZ_TAG_ARMOR_SHOULDER_LEFT );
1329  dist_sq = DistanceSquared( armor_pos, point );
1330 
1331  if( dist_sq <= 64 )
1332  {
1334  }
1335  }
1336 
1337  if( self.has_right_knee_armor === true )
1338  {
1339  armor_pos = self GetTagOrigin( ‪MECHZ_TAG_ARMOR_KNEE_RIGHT );
1340  dist_sq = DistanceSquared( armor_pos, point );
1341 
1342  if( dist_sq <= 36 )
1343  {
1345  }
1346  }
1347 
1348  if( self.has_left_knee_armor === true )
1349  {
1350  armor_pos = self GetTagOrigin( ‪MECHZ_TAG_ARMOR_KNEE_LEFT );
1351  dist_sq = DistanceSquared( armor_pos, point );
1352 
1353  if( dist_sq <= 36 )
1354  {
1356  }
1357  }
1358 
1359  /#iPrintLnBold( "Projectile DMG: " + hit_damage + ". HP: " + ( self.health - hit_damage ) );#/
1360  return hit_damage;
1361  }
1362  else if ( mod == "MOD_PROJECTILE_SPLASH" )
1363  {
1365 
1366  //count number of armor pieces
1367  i_num_armor_pieces = 0;
1368 
1369  if( isDefined( level.mechz_faceplate_damage_override ))
1370  {
1371  self [[level.mechz_faceplate_damage_override]]( inflictor, attacker, ‪damage, dFlags, mod, weapon, point, dir, hitLoc, offsetTime, boneIndex, modelIndex );
1372  }
1373 
1374  if( self.has_right_shoulder_armor === true )
1375  {
1376  i_num_armor_pieces += 1;
1377  right_shoulder_index = i_num_armor_pieces;
1378  }
1379 
1380  if( self.has_left_shoulder_armor === true )
1381  {
1382  i_num_armor_pieces += 1;
1383  left_shoulder_index = i_num_armor_pieces;
1384  }
1385 
1386  if( self.has_right_knee_armor === true )
1387  {
1388  i_num_armor_pieces += 1;
1389  right_knee_index = i_num_armor_pieces;
1390  }
1391 
1392  if( self.has_left_knee_armor === true )
1393  {
1394  i_num_armor_pieces += 1;
1395  left_knee_index = i_num_armor_pieces;
1396  }
1397 
1398  if( i_num_armor_pieces > 0 )
1399  {
1400  if( i_num_armor_pieces <= 1 )
1401  {
1402  i_random = 0;
1403  }
1404  else
1405  {
1406  i_random = RandomInt( i_num_armor_pieces - 1 );
1407  }
1408 
1409  i_random += 1;
1410 
1411  if( self.has_right_shoulder_armor === true && right_shoulder_index === i_random )
1412  {
1414  }
1415 
1416  if( self.has_left_shoulder_armor === true && left_shoulder_index === i_random )
1417  {
1419  }
1420 
1421  if( self.has_right_knee_armor === true && right_knee_index === i_random )
1422  {
1424  }
1425 
1426  if( self.has_left_knee_armor === true && left_knee_index === i_random )
1427  {
1429  }
1430  }
1431  else
1432  {
1433  if( self.powercap_covered === true )
1434  {
1436  }
1437 
1438  if( self.has_faceplate == true )
1439  {
1441  }
1442  }
1443 
1444  /#iPrintLnBold( "Projectile Splash DMG: " + hit_damage + ". HP: " + ( self.health - hit_damage ) );#/
1445  return hit_damage;
1446  }
1447 
1448  return 0;
1449 }
1450 
1451 //used to step down the damage from some high-powered weapons
1452 function private ‪mechzWeaponDamageModifier( ‪damage, weapon )
1453 {
1454  if( isDefined( weapon) && isDefined( weapon.name ) )
1455  {
1456  if( isSubStr( weapon.name, "shotgun_fullauto") )
1457  {
1458  return ‪damage * 0.5;
1459  }
1460 
1461  if( isSubStr( weapon.name, "lmg_cqb") )
1462  {
1463  return ‪damage * 0.65;
1464  }
1465 
1466  if( isSubStr( weapon.name, "lmg_heavy") )
1467  {
1468  return ‪damage * 0.65;
1469  }
1470 
1471  if( isSubStr( weapon.name, "shotgun_precision") )
1472  {
1473  return ‪damage * 0.65;
1474  }
1475 
1476  if( isSubstr( weapon.name, "shotgun_semiauto") )
1477  {
1478  return ‪damage * 0.75;
1479  }
1480 
1481  }
1482 
1483  return ‪damage;
1484 }
1485 
1487 {
1488  self playsound( "zmb_ai_mechz_destruction" );
1489 }
1490 
1491 function ‪show_hit_marker() // self = player
1492 {
1493  if ( IsDefined( self ) && IsDefined( self.hud_damagefeedback ) )
1494  {
1495  self.hud_damagefeedback SetShader( "damage_feedback", 24, 48 );
1496  self.hud_damagefeedback.alpha = 1;
1497  self.hud_damagefeedback FadeOverTime(1);
1498  self.hud_damagefeedback.alpha = 0;
1499  }
1500 }
1501 
1502 function ‪hide_part( strTag )
1503 {
1504  if ( self HasPart(strTag) )
1505  {
1506  self HidePart(strTag);
1507  }
1508 }
1509 
1510 
1512 {
1513  self.faceplate_health = self.faceplate_health - ‪damage;
1514  if( self.faceplate_health <= 0 )
1515  {
1517  self ‪clientfield::set( "mechz_faceplate_detached", 1 );
1518  self.has_faceplate = false;
1520  self.partDestroyed = true;
1522 
1524 
1525  level notify( "mechz_faceplate_detached" );
1526  }
1527 }
1528 
1530 {
1531  self.powercap_cover_health = self.powercap_cover_health - ‪damage;
1532  if( self.powercap_cover_health <= 0 )
1533  {
1535  self ‪clientfield::set( "mechz_powercap_detached", 1 );
1536  self.powercap_covered = false;
1537  self.partDestroyed = true;
1539 
1540  //self MechzBehavior::mechzGoBerserk();
1541  }
1542 
1543 }
1544 
1546 {
1547  self.powercap_health = self.powercap_health - ‪damage;
1548  if( self.powercap_health <=0 )
1549  {
1550  if( IsDefined( level.mechz_powercap_destroyed_callback ) )
1551  {
1552  self [[level.mechz_powercap_destroyed_callback]]();
1553  }
1554 
1556  self ‪hide_part( "tag_gun_barrel1" );
1557  self ‪hide_part( "tag_gun_barrel2" );
1558  self ‪hide_part( "tag_gun_barrel3" );
1559  self ‪hide_part( "tag_gun_barrel4" );
1560  self ‪hide_part( "tag_gun_barrel5" );
1561  self ‪hide_part( "tag_gun_barrel6" );
1562  self ‪clientfield::set( "mechz_claw_detached", 1 );
1563  self.has_powercap = false;
1564  self.gun_attached = false;
1565  self.partDestroyed = true;
1567 
1568  //self MechzBehavior::mechzGoBerserk();
1569 
1570  level notify( "mechz_gun_detached" );
1571  }
1572 }
1573 
1575 {
1576  self.right_knee_armor_health = self.right_knee_armor_health - ‪damage;
1577  if( self.right_knee_armor_health <= 0 )
1578  {
1580  self ‪clientfield::set( "mechz_rknee_armor_detached", 1 );
1581  self.has_right_knee_armor = false;
1582  }
1583 
1584 }
1585 
1587 {
1588  self.left_knee_armor_health = self.left_knee_armor_health - ‪damage;
1589  if( self.left_knee_armor_health <= 0 )
1590  {
1592  self ‪clientfield::set( "mechz_lknee_armor_detached", 1 );
1593  self.has_left_knee_armor = false;
1594  }
1595 
1596 }
1597 
1599 {
1600  self.right_shoulder_armor_health = self.right_shoulder_armor_health - ‪damage;
1601  if( self.right_shoulder_armor_health <= 0 )
1602  {
1604  self ‪clientfield::set( "mechz_rshoulder_armor_detached", 1 );
1605  self.has_right_shoulder_armor = false;
1606  }
1607 
1608 }
1609 
1611 {
1612  self.left_shoulder_armor_health = self.left_shoulder_armor_health - ‪damage;
1613  if( self.left_shoulder_armor_health <= 0 )
1614  {
1616  self ‪clientfield::set( "mechz_lshoulder_armor_detached", 1 );
1617  self.has_left_shoulder_armor = false;
1618  }
1619 
1620 }
1621 
1622 function ‪mechzCheckInArc( right_offset, aim_tag )
1623 {
1624  origin = self.origin;
1625  angles = self.angles;
1626 
1627  if ( IsDefined( aim_tag ) )
1628  {
1629  origin = self GetTagOrigin( aim_tag );
1630  angles = self GetTagAngles( aim_tag );
1631  }
1632 
1633  if ( IsDefined( right_offset ) )
1634  {
1635  right_angle = anglestoright( angles );
1636  origin = origin + (right_angle * right_offset);
1637  }
1638 
1639  facing_vec = AnglesToForward( angles );
1640  enemy_vec = self.favoriteenemy.origin - origin;
1641 
1642  enemy_yaw_vec = (enemy_vec[0], enemy_vec[1], 0);
1643  facing_yaw_vec = (facing_vec[0], facing_vec[1], 0);
1644 
1645  enemy_yaw_vec = VectorNormalize( enemy_yaw_vec );
1646  facing_yaw_vec = VectorNormalize( facing_yaw_vec );
1647 
1648  enemy_dot = VectorDot( facing_yaw_vec, enemy_yaw_vec );
1649 
1650  if( enemy_dot < ‪MECHZ_AIM_YAW_COS )
1651  {
1652  return false;
1653  }
1654 
1655  enemy_angles = VectorToAngles( enemy_vec );
1656 
1657  if( abs( AngleClamp180( enemy_angles[0] ) ) > ‪MECHZ_AIM_PITCH_MAX )
1658  {
1659  return false;
1660  }
1661 
1662  return true;
1663 }
1664 
1665 function private ‪mechzGrenadeCheckInArc( right_offset )
1666 {
1667  origin = self.origin;
1668  if ( IsDefined( right_offset ) )
1669  {
1670  right_angle = anglestoright( self.angles );
1671  origin = origin + (right_angle * right_offset);
1672  }
1673 
1674  facing_vec = AnglesToForward( self.angles );
1675  enemy_vec = self.favoriteenemy.origin - origin;
1676 
1677  enemy_yaw_vec = (enemy_vec[0], enemy_vec[1], 0);
1678  facing_yaw_vec = (facing_vec[0], facing_vec[1], 0);
1679 
1680  enemy_yaw_vec = VectorNormalize( enemy_yaw_vec );
1681  facing_yaw_vec = VectorNormalize( facing_yaw_vec );
1682 
1683  enemy_dot = VectorDot( facing_yaw_vec, enemy_yaw_vec );
1684 
1685  if( enemy_dot < ‪MECHZ_AIM_YAW_COS )
1686  {
1687  return false;
1688  }
1689 
1690  enemy_angles = VectorToAngles( enemy_vec );
1691 
1692  if( abs( AngleClamp180( enemy_angles[0] ) ) > ‪MECHZ_AIM_PITCH_MAX )
1693  {
1694  return false;
1695  }
1696 
1697  return true;
1698 }
1699 
1700 
1701 function ‪mechz_turn_off_headlamp( headlamp_broken )
1702 {
1703  if( headlamp_broken !== true )
1704  {
1705  self ‪clientfield::set( "mechz_headlamp_off", 1 );
1706  }
1707  else
1708  {
1709  self ‪clientfield::set( "mechz_headlamp_off", 2 );
1710  }
1711 }
‪MECHZ_FT_BLEND_TIME
‪#define MECHZ_FT_BLEND_TIME
Definition: mechz.gsh:118
‪mechzDeathStart
‪function private mechzDeathStart(entity)
Definition: mechz.gsc:917
‪PERK_JUGGERNOG
‪#define PERK_JUGGERNOG
Definition: mechz.gsc:47
‪MECHZ_FT_RIGHT_OFFSET
‪#define MECHZ_FT_RIGHT_OFFSET
Definition: mechz.gsh:110
‪MECHZ_STUMBLE_TIME
‪#define MECHZ_STUMBLE_TIME
Definition: mechz.gsh:156
‪MECHZ_FT_TAG
‪#define MECHZ_FT_TAG
Definition: mechz.gsh:120
‪mechzStopFlame
‪function mechzStopFlame(entity)
Definition: mechz.gsc:859
‪ARCHETYPE_MECHZ
‪#define ARCHETYPE_MECHZ
Definition: archetype_shared.gsh:17
‪mechzShouldShootFlame
‪function private mechzShouldShootFlame(entity)
Definition: mechz.gsc:527
‪MECHZ_PART_FACEPLATE
‪#define MECHZ_PART_FACEPLATE
Definition: blackboard.gsh:228
‪MECHZ_FT_DELAY
‪#define MECHZ_FT_DELAY
Definition: mechz.gsh:115
‪BT_REGISTER_API
‪#define BT_REGISTER_API(name, function)
Definition: behavior.gsh:1
‪mechzDamageCallback
‪function mechzDamageCallback(inflictor, attacker, damage, dFlags, mod, weapon, point, dir, hitLoc, offsetTime, boneIndex, modelIndex)
Definition: mechz.gsc:1036
‪ArchetypeMechzOnAnimscriptedCallback
‪function private ArchetypeMechzOnAnimscriptedCallback(entity)
Definition: mechz.gsc:139
‪mechz_play_pain_audio
‪function mechz_play_pain_audio()
Definition: mechz.gsc:1486
‪mechzGoBerserk
‪function mechzGoBerserk()
Definition: mechz.gsc:869
‪MECHZ_FACE_IDLE
‪#define MECHZ_FACE_IDLE
Definition: mechz.gsh:87
‪MECHZ_FT_DIST_SQ_MAX
‪#define MECHZ_FT_DIST_SQ_MAX
Definition: mechz.gsh:113
‪mechZEndBerserk
‪function private mechZEndBerserk()
Definition: mechz.gsc:891
‪mechzShouldMelee
‪function mechzShouldMelee(entity)
Definition: mechz.gsc:443
‪MECHZ_GRENADE_TARGET_PREDICTION_TIME
‪#define MECHZ_GRENADE_TARGET_PREDICTION_TIME
Definition: mechz.gsh:107
‪mechzFilterGrenadesByOwner
‪function private mechzFilterGrenadesByOwner(grenade, mechz)
Definition: mechz.gsc:318
‪MECHZ_TAG_POWERSUPPLY
‪#define MECHZ_TAG_POWERSUPPLY
Definition: mechz.gsh:38
‪mechzShouldStumble
‪function private mechzShouldStumble(entity)
Definition: mechz.gsc:637
‪mechzGrenadeService
‪function private mechzGrenadeService(entity)
Definition: mechz.gsc:289
‪mechz_track_powercap_damage
‪function mechz_track_powercap_damage(damage)
Definition: mechz.gsc:1545
‪mechz_track_lknee_armor_damage
‪function mechz_track_lknee_armor_damage(damage)
Definition: mechz.gsc:1586
‪MECHZ_FT_CLIENTFIELD
‪#define MECHZ_FT_CLIENTFIELD
Definition: mechz.gsh:80
‪mechzStumbleEnd
‪function private mechzStumbleEnd(entity, asmStateName)
Definition: mechz.gsc:715
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪MECHZ_PROJECTILE_DAMAGE_SCALE
‪#define MECHZ_PROJECTILE_DAMAGE_SCALE
Definition: mechz.gsh:130
‪mechz_track_faceplate_damage
‪function mechz_track_faceplate_damage(damage)
Definition: mechz.gsc:1511
‪MECHZ_AIM_PITCH_MAX
‪#define MECHZ_AIM_PITCH_MAX
Definition: mechz.gsh:126
‪MECHZ_FT_OFF
‪#define MECHZ_FT_OFF
Definition: mechz.gsh:77
‪mechzUpdateFlame
‪function private mechzUpdateFlame(entity)
Definition: mechz.gsc:800
‪BHTN_RUNNING
‪#define BHTN_RUNNING
Definition: behavior_tree.gsh:9
‪mechzShootFlameActionEnd
‪function mechzShootFlameActionEnd(entity, asmStateName)
Definition: mechz.gsc:761
‪cointoss
‪function cointoss()
Definition: math_shared.csc:171
‪MECHZ_FT_ON
‪#define MECHZ_FT_ON
Definition: mechz.gsh:78
‪MECHZ_TAG_ARMOR_KNEE_LEFT
‪#define MECHZ_TAG_ARMOR_KNEE_LEFT
Definition: mechz.gsh:32
‪BB_REGISTER_ATTRIBUTE
‪#define BB_REGISTER_ATTRIBUTE(name, defaultValue, getter)
Definition: blackboard.gsh:1
‪ASM_REGISTER_NOTETRACK_HANDLER
‪#define ASM_REGISTER_NOTETRACK_HANDLER(notetrackname, handlerfunction)
Definition: animation_state_machine.gsh:4
‪mechz_track_rshoulder_armor_damage
‪function mechz_track_rshoulder_armor_damage(damage)
Definition: mechz.gsc:1598
‪mechzShootGrenade
‪function private mechzShootGrenade(entity)
Definition: mechz.gsc:772
‪ZOMBIE_DAMAGEWEAPON_REGULAR
‪#define ZOMBIE_DAMAGEWEAPON_REGULAR
Definition: blackboard.gsh:190
‪mechzPainStart
‪function private mechzPainStart(entity)
Definition: mechz.gsc:927
‪ArchetypeMechzBlackboardInit
‪function private ArchetypeMechzBlackboardInit()
Definition: mechz.gsc:118
‪mechzStumbleStart
‪function private mechzStumbleStart(entity, asmStateName)
Definition: mechz.gsc:696
‪MECHZ_PART
‪#define MECHZ_PART
Definition: blackboard.gsh:227
‪BB_GetShouldTurn
‪function private BB_GetShouldTurn()
Definition: mechz.gsc:148
‪mechzIdleStart
‪function private mechzIdleStart(entity)
Definition: mechz.gsc:922
‪mechzStunUpdate
‪function private mechzStunUpdate(entity, asmStateName)
Definition: mechz.gsc:678
‪LOCOMOTION_SPEED_SPRINT
‪#define LOCOMOTION_SPEED_SPRINT
Definition: blackboard.gsh:158
‪mechzNotetrackShootGrenade
‪function private mechzNotetrackShootGrenade(entity)
Definition: mechz.gsc:169
‪SHOULD_TURN
‪#define SHOULD_TURN
Definition: blackboard.gsh:138
‪SetBlackBoardAttribute
‪function SetBlackBoardAttribute(entity, attributeName, attributeValue)
Definition: blackboard.gsc:56
‪mechzFlameWatcher
‪function private mechzFlameWatcher()
Definition: mechz.gsc:989
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪MECHZ_GRENADE_DELAY
‪#define MECHZ_GRENADE_DELAY
Definition: mechz.gsh:97
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪MECHZ_GRENADE_MAX
‪#define MECHZ_GRENADE_MAX
Definition: mechz.gsh:94
‪MECHZ_FT_PLAYER_DAMAGE
‪#define MECHZ_FT_PLAYER_DAMAGE
Definition: mechz.gsh:144
‪RegisterUtilityBlackboardAttributes
‪function RegisterUtilityBlackboardAttributes()
Definition: archetype_utility.gsc:139
‪is_player_valid
‪function is_player_valid(player, checkIgnoreMeFlag, ignore_laststand_players)
Definition: skeleton.gsc:256
‪MECHZ_FACEPLATE_HEALTH
‪#define MECHZ_FACEPLATE_HEALTH
Definition: mechz.gsh:136
‪init
‪function autoexec init()
Definition: mechz.gsc:51
‪MECHZ_GRENADE_DIST_SQ_MAX
‪#define MECHZ_GRENADE_DIST_SQ_MAX
Definition: mechz.gsh:100
‪mechzStunStart
‪function private mechzStunStart(entity, asmStateName)
Definition: mechz.gsc:669
‪ASM_MECHZ_GRENADE_NOTETRACK
‪#define ASM_MECHZ_GRENADE_NOTETRACK
Definition: mechz.gsh:8
‪mechzShouldShowPain
‪function private mechzShouldShowPain(entity)
Definition: mechz.gsc:470
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪MECHZ_MODEL_BODY
‪#define MECHZ_MODEL_BODY
Definition: mechz.gsh:22
‪MECHZ_FT_SWEEP_PLAYER_DIST_SQ
‪#define MECHZ_FT_SWEEP_PLAYER_DIST_SQ
Definition: mechz.gsh:122
‪MECHZ_ARMOR_KNEE_RIGHT_HEALTH
‪#define MECHZ_ARMOR_KNEE_RIGHT_HEALTH
Definition: mechz.gsh:139
‪LOCOMOTION_SHOULD_TURN
‪#define LOCOMOTION_SHOULD_TURN
Definition: blackboard.gsh:137
‪ENABLE_BLACKBOARD_DEBUG_TRACKING
‪#define ENABLE_BLACKBOARD_DEBUG_TRACKING(self)
Definition: blackboard.gsh:7
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪MECHZ_REACT_ELEMENTAL_BOW
‪#define MECHZ_REACT_ELEMENTAL_BOW
Definition: mechz.gsh:160
‪MECHZ_NAVMESH_BOUNDARY_DIST
‪#define MECHZ_NAVMESH_BOUNDARY_DIST
Definition: mechz.gsh:17
‪MECHZ_TAG_ARMOR_KNEE_RIGHT
‪#define MECHZ_TAG_ARMOR_KNEE_RIGHT
Definition: mechz.gsh:33
‪MECHZ_BODY_DAMAGE_SCALE
‪#define MECHZ_BODY_DAMAGE_SCALE
Definition: mechz.gsh:132
‪MECHZ_PART_POWERCORE
‪#define MECHZ_PART_POWERCORE
Definition: blackboard.gsh:229
‪mechz_track_rknee_armor_damage
‪function mechz_track_rknee_armor_damage(damage)
Definition: mechz.gsc:1574
‪MECHZ_PROJECTILE_SPLASH_DAMAGE_SCALE
‪#define MECHZ_PROJECTILE_SPLASH_DAMAGE_SCALE
Definition: mechz.gsh:131
‪MECHZ_FACE_CLIENTFIELD
‪#define MECHZ_FACE_CLIENTFIELD
Definition: mechz.gsh:81
‪LOCOMOTION_SPEED_TYPE
‪#define LOCOMOTION_SPEED_TYPE
Definition: blackboard.gsh:155
‪MECHZ_ARMOR_KNEE_LEFT_HEALTH
‪#define MECHZ_ARMOR_KNEE_LEFT_HEALTH
Definition: mechz.gsh:140
‪VERSION_DLC1
‪#define VERSION_DLC1
Definition: version.gsh:91
‪MECHZ_FACE_PAIN
‪#define MECHZ_FACE_PAIN
Definition: mechz.gsh:88
‪MECHZ_FT_RUN_DURATION
‪#define MECHZ_FT_RUN_DURATION
Definition: mechz.gsh:116
‪hide_part
‪function hide_part(strTag)
Definition: mechz.gsc:1502
‪MECHZ_POWERCAP_COVER_HEALTH
‪#define MECHZ_POWERCAP_COVER_HEALTH
Definition: mechz.gsh:137
‪mechzTargetService
‪function mechzTargetService(entity)
Definition: mechz.gsc:218
‪mechzShootGrenadeAction
‪function private mechzShootGrenadeAction(entity, asmStateName)
Definition: mechz.gsc:650
‪SHOULD_NOT_TURN
‪#define SHOULD_NOT_TURN
Definition: blackboard.gsh:139
‪MECHZ_STUN_TIME
‪#define MECHZ_STUN_TIME
Definition: mechz.gsh:155
‪MECHZ_AIM_YAW_COS
‪#define MECHZ_AIM_YAW_COS
Definition: mechz.gsh:127
‪MECHZ_FT_SWEEP_CHANCE
‪#define MECHZ_FT_SWEEP_CHANCE
Definition: mechz.gsh:123
‪watchWeaponObjectUsage
‪function watchWeaponObjectUsage()
Definition: _weaponobjects.gsc:1626
‪MECHZ_GRENADE_DEVIATION_RADIUS
‪#define MECHZ_GRENADE_DEVIATION_RADIUS
Definition: mechz.gsh:106
‪mechzNotetrackMelee
‪function private mechzNotetrackMelee(entity)
Definition: mechz.gsc:160
‪mechzShootFlame
‪function private mechzShootFlame(entity)
Definition: mechz.gsc:781
‪MECHZ_FT_PLAYER_BURN_TIME
‪#define MECHZ_FT_PLAYER_BURN_TIME
Definition: mechz.gsh:147
‪mechzStumbleUpdate
‪function private mechzStumbleUpdate(entity, asmStateName)
Definition: mechz.gsc:705
‪remove_undefined
‪function remove_undefined(array, b_keep_keys)
Definition: array_shared.csc:56
‪KNOCKDOWN_SHOVED
‪#define KNOCKDOWN_SHOVED
Definition: blackboard.gsh:212
‪MECHZ_GRENADE_TAG
‪#define MECHZ_GRENADE_TAG
Definition: mechz.gsh:92
‪MECHZ_BERSERK_TIME
‪#define MECHZ_BERSERK_TIME
Definition: mechz.gsh:152
‪get_closest_valid_player
‪function get_closest_valid_player(origin, ignore_player)
Definition: skeleton.gsc:321
‪MECHZ_TAG_ARMOR_SHOULDER_RIGHT
‪#define MECHZ_TAG_ARMOR_SHOULDER_RIGHT
Definition: mechz.gsh:35
‪mechzShootFlameActionUpdate
‪function mechzShootFlameActionUpdate(entity, asmStateName)
Definition: mechz.gsc:733
‪mechzPainTerminate
‪function private mechzPainTerminate(entity)
Definition: mechz.gsc:932
‪Spawn
‪function Spawn(parent, onDeathCallback)
Definition: _flak_drone.gsc:427
‪MECHZ_GRENADE_BURST_SIZE
‪#define MECHZ_GRENADE_BURST_SIZE
Definition: mechz.gsh:95
‪MECHZ_POWERCORE_DAMAGE_SCALE
‪#define MECHZ_POWERCORE_DAMAGE_SCALE
Definition: mechz.gsh:133
‪MECHZ_POWERCAP_HEALTH
‪#define MECHZ_POWERCAP_HEALTH
Definition: mechz.gsh:138
‪show_hit_marker
‪function show_hit_marker()
Definition: mechz.gsc:1491
‪BHTN_SUCCESS
‪#define BHTN_SUCCESS
Definition: behavior_tree.gsh:8
‪ARCHETYPE_ZOMBIE
‪#define ARCHETYPE_ZOMBIE
Definition: archetype_shared.gsh:10
‪add_archetype_spawn_function
‪function add_archetype_spawn_function(archetype, spawn_func)
Definition: ai_shared.csc:23
‪GETUP_BELLY
‪#define GETUP_BELLY
Definition: blackboard.gsh:206
‪MECHZ_STUN_STUMBLE_COOLDOWN
‪#define MECHZ_STUN_STUMBLE_COOLDOWN
Definition: mechz.gsh:162
‪MECHZ_TAG_ARMOR_SHOULDER_LEFT
‪#define MECHZ_TAG_ARMOR_SHOULDER_LEFT
Definition: mechz.gsh:34
‪MECHZ_ARMOR_SHOULDER_RIGHT_HEALTH
‪#define MECHZ_ARMOR_SHOULDER_RIGHT_HEALTH
Definition: mechz.gsh:141
‪mechz_track_lshoulder_armor_damage
‪function mechz_track_lshoulder_armor_damage(damage)
Definition: mechz.gsc:1610
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪mechzShootFlameActionStart
‪function mechzShootFlameActionStart(entity, asmStateName)
Definition: mechz.gsc:724
‪MECHZ_FACE_DEATH
‪#define MECHZ_FACE_DEATH
Definition: mechz.gsh:86
‪MECHZ_FACE_ATTACK
‪#define MECHZ_FACE_ATTACK
Definition: mechz.gsh:85
‪CreateBlackBoardForEntity
‪function CreateBlackBoardForEntity(entity)
Definition: blackboard.gsc:77
‪mechzShouldShootGrenade
‪function private mechzShouldShootGrenade(entity)
Definition: mechz.gsc:480
‪MECHZ_NAVMESH_RADIUS
‪#define MECHZ_NAVMESH_RADIUS
Definition: mechz.gsh:16
‪MECHZ_TAG_CLAW
‪#define MECHZ_TAG_CLAW
Definition: mechz.gsh:36
‪mechzStunEnd
‪function private mechzStunEnd(entity, asmStateName)
Definition: mechz.gsc:688
‪ASM_MECHZ_MELEE_NOTETRACK
‪#define ASM_MECHZ_MELEE_NOTETRACK
Definition: mechz.gsh:7
‪MECHZ_PART_GUN
‪#define MECHZ_PART_GUN
Definition: blackboard.gsh:230
‪mechzZombieEligibleForBerserkKnockdown
‪function private mechzZombieEligibleForBerserkKnockdown(zombie, mechz, predicted_pos)
Definition: mechz.gsc:397
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪mechzDelayFlame
‪function private mechzDelayFlame()
Definition: mechz.gsc:786
‪mechzBerserkKnockdownService
‪function private mechzBerserkKnockdownService(entity)
Definition: mechz.gsc:329
‪MECHZ_TAG_POWERCORE
‪#define MECHZ_TAG_POWERCORE
Definition: mechz.gsh:39
‪MECHZ_MELEE_DIST_SQ
‪#define MECHZ_MELEE_DIST_SQ
Definition: mechz.gsh:13
‪mechzPlayedBerserkIntro
‪function private mechzPlayedBerserkIntro(entity)
Definition: mechz.gsc:886
‪mechzWeaponDamageModifier
‪function private mechzWeaponDamageModifier(damage, weapon)
Definition: mechz.gsc:1452
‪RequestState
‪function RequestState(entity, stateName)
Definition: animation_state_machine_utility.gsc:8
‪mechzAttackStart
‪function private mechzAttackStart(entity)
Definition: mechz.gsc:912
‪MECHZ_FT_PLAYER_DAMAGE_DELAY
‪#define MECHZ_FT_PLAYER_DAMAGE_DELAY
Definition: mechz.gsh:146
‪BT_REGISTER_ACTION
‪#define BT_REGISTER_ACTION(name, initFunction, updateFunction, terminateFunction)
Definition: behavior.gsh:4
‪playerFlameDamage
‪function playerFlameDamage(mechz)
Definition: mechz.gsc:835
‪mechzAddAttachments
‪function private mechzAddAttachments()
Definition: mechz.gsc:1008
‪LOCOMOTION_SPEED_RUN
‪#define LOCOMOTION_SPEED_RUN
Definition: blackboard.gsh:157
‪mechzShouldStun
‪function private mechzShouldStun(entity)
Definition: mechz.gsc:627
‪mechzShouldTurnBerserk
‪function private mechzShouldTurnBerserk(entity)
Definition: mechz.gsc:617
‪can_see
‪function can_see(target, target_origin, player_origin, player_forward, distance)
Definition: grapple.gsc:377
‪mechzSpawnSetup
‪function private mechzSpawnSetup()
Definition: mechz.gsc:946
‪mechzShootGrenadeActionUpdate
‪function private mechzShootGrenadeActionUpdate(entity, asmStateName)
Definition: mechz.gsc:659
‪mechzCheckInArc
‪function mechzCheckInArc(right_offset, aim_tag)
Definition: mechz.gsc:1622
‪InitMechzBehaviorsAndASM
‪function private InitMechzBehaviorsAndASM()
Definition: mechz.gsc:76
‪MECHZ_GRENADE_TYPE
‪#define MECHZ_GRENADE_TYPE
Definition: mechz.gsh:91
‪MECHZ_ARMOR_SHOULDER_LEFT_HEALTH
‪#define MECHZ_ARMOR_SHOULDER_LEFT_HEALTH
Definition: mechz.gsh:142
‪mechz_turn_off_headlamp
‪function mechz_turn_off_headlamp(headlamp_broken)
Definition: mechz.gsc:1701
‪ZOMBIE_DAMAGEWEAPON_TYPE
‪#define ZOMBIE_DAMAGEWEAPON_TYPE
Definition: blackboard.gsh:189
‪mechzShouldShootFlameSweep
‪function private mechzShouldShootFlameSweep(entity)
Definition: mechz.gsc:581
‪mechzGrenadeCheckInArc
‪function private mechzGrenadeCheckInArc(right_offset)
Definition: mechz.gsc:1665
‪MECHZ_MELEE_YAW
‪#define MECHZ_MELEE_YAW
Definition: mechz.gsh:11
‪MECHZ_TAG_FACEPLATE
‪#define MECHZ_TAG_FACEPLATE
Definition: mechz.gsh:37
‪MECHZ_FT_PLAYER_DAMAGE_JUGG
‪#define MECHZ_FT_PLAYER_DAMAGE_JUGG
Definition: mechz.gsh:145
‪mechz_track_powercap_cover_damage
‪function mechz_track_powercap_cover_damage(damage)
Definition: mechz.gsc:1529
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪GETUP_BACK
‪#define GETUP_BACK
Definition: blackboard.gsh:205