‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
margwa.gsc
Go to the documentation of this file.
1 #using scripts\shared\ai_shared;
2 #using scripts\shared\callbacks_shared;
3 #using scripts\shared\clientfield_shared;
4 #using scripts\shared\fx_shared;
5 #using scripts\shared\math_shared;
6 #using scripts\shared\scene_shared;
7 #using scripts\shared\spawner_shared;
8 #using scripts\shared\util_shared;
9 #using scripts\shared\array_shared;
10 
11 #using scripts\shared\ai\systems\animation_state_machine_utility;
12 #using scripts\shared\ai\systems\animation_state_machine_notetracks;
13 #using scripts\shared\ai\systems\animation_state_machine_mocomp;
14 #using scripts\shared\ai\archetype_utility;
15 #using scripts\shared\ai\systems\behavior_tree_utility;
16 #using scripts\shared\ai\systems\blackboard;
17 #using scripts\shared\ai\systems\debug;
18 #using scripts\shared\ai\systems\gib;
19 #using scripts\shared\ai\margwa;
20 #using scripts\shared\ai\zombie_utility;
21 #using scripts\codescripts\struct;
22 #using scripts\shared\ai\archetype_mocomps_utility;
23 
24 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
25 #insert scripts\shared\ai\systems\animation_state_machine.gsh;
26 #insert scripts\shared\ai\systems\behavior.gsh;
27 #insert scripts\shared\ai\systems\behavior_tree.gsh;
28 #insert scripts\shared\ai\systems\blackboard.gsh;
29 #insert scripts\shared\ai\systems\gib.gsh;
30 #insert scripts\shared\ai\margwa.gsh;
31 #insert scripts\shared\ai\utility.gsh;
32 #insert scripts\shared\shared.gsh;
33 #insert scripts\shared\version.gsh;
34 
35 #namespace MargwaBehavior;
36 
37 function autoexec ‪init()
38 {
39  // INIT BEHAVIORS
41 
42  // INIT BLACKBOARD
44 
45  // INIT MARGWA ON SPAWN
47 
58 
61 
65 
66  ‪clientfield::register( "actor", "supermargwa", ‪VERSION_SHIP, 1, "int" ); // set this bit when spawning supermargwa for ee quest
67 
69 }
70 
71 function private ‪InitDirectHitWeapons()
72 {
73  if ( !IsDefined( level.dhWeapons ) )
74  {
75  level.dhWeapons = [];
76  }
77 
78  level.dhWeapons[ level.dhWeapons.size ] = "ray_gun";
79  level.dhWeapons[ level.dhWeapons.size ] = "ray_gun_upgraded";
80  level.dhWeapons[ level.dhWeapons.size ] = "pistol_standard_upgraded";
81  level.dhWeapons[ level.dhWeapons.size ] = "pistol_revolver38_upgraded";
82  level.dhWeapons[ level.dhWeapons.size ] = "pistol_revolver38lh_upgraded";
83  level.dhWeapons[ level.dhWeapons.size ] = "launcher_standard";
84  level.dhWeapons[ level.dhWeapons.size ] = "launcher_standard_upgraded";
85 }
86 
87 function ‪AddDirectHitWeapon( weaponName )
88 {
89  foreach( weapon in level.dhWeapons )
90  {
91  if ( weapon == weaponName )
92  {
93  return;
94  }
95  }
96 
97  level.dhWeapons[ level.dhWeapons.size ] = weaponName;
98 }
99 
101 {
102  // SERVICES
104 
105  // CONDITIONS
106  ‪BT_REGISTER_API( "margwaShouldSmashAttack", &‪MargwaBehavior::margwaShouldSmashAttack );
107  ‪BT_REGISTER_API( "margwaShouldSwipeAttack", &‪MargwaBehavior::margwaShouldSwipeAttack );
115  ‪BT_REGISTER_API( "margwaShouldTeleportOut", &‪MargwaBehavior::margwaShouldTeleportOut );
117 
118  // Consolidated condition checking to limit VM calls
120 
121  // ACTIONS
122  ‪BT_REGISTER_ACTION( "margwaReactStunAction", &‪MargwaBehavior::margwaReactStunAction, undefined, undefined );
124 
125  // FUNCTIONS
128  ‪BT_REGISTER_API( "margwaTraverseActionStart", &‪MargwaBehavior::margwaTraverseActionStart );
130  ‪BT_REGISTER_API( "margwaTeleportInTerminate", &‪MargwaBehavior::margwaTeleportInTerminate );
132  ‪BT_REGISTER_API( "margwaTeleportOutTerminate", &‪MargwaBehavior::margwaTeleportOutTerminate );
136  ‪BT_REGISTER_API( "margwaReactStunTerminate", &‪MargwaBehavior::margwaReactStunTerminate );
138  ‪BT_REGISTER_API( "margwaReactIDGunTerminate", &‪MargwaBehavior::margwaReactIDGunTerminate );
140  ‪BT_REGISTER_API( "margwaReactSwordTerminate", &‪MargwaBehavior::margwaReactSwordTerminate );
143  ‪BT_REGISTER_API( "margwaSmashAttackTerminate", &‪MargwaBehavior::margwaSmashAttackTerminate );
144 
146  ‪BT_REGISTER_API( "margwaSwipeAttackTerminate", &MargwaBehavior::margwaSwipeAttackTerminate );
147 
148  // MOCOMPS
150 
151  // NOTETRACKS
155 }
156 
158 {
159  // CREATE BLACKBOARD
161 
162  // USE UTILITY BLACKBOARD
164 
165  // CREATE MARGWA BLACKBOARD
167  ‪BB_REGISTER_ATTRIBUTE( ‪BOARD_ATTACK_SPOT, undefined, undefined );
170 
171  // REGISTER ANIMSCRIPTED CALLBACK
172  self.___ArchetypeOnAnimscriptedCallback = &‪ArchetypeMargwaOnAnimscriptedCallback;
173 
174  // ENABLE DEBUGGING IN ODYSSEY
176 }
177 
179 {
180  // UNREGISTER THE BLACKBOARD
181  entity.__blackboard = undefined;
182 
183  // REREGISTER BLACKBOARD
185 }
186 
187 function private ‪BB_GetShouldTurn()
188 {
189  if( IsDefined( self.should_turn ) && self.should_turn )
190  {
191  return ‪SHOULD_TURN;
192  }
193  return ‪SHOULD_NOT_TURN;
194 }
195 
196 //----------------------------------------------------------------------------------------------------------------------------
197 // NOTETRACK HANDLERS
198 //----------------------------------------------------------------------------------------------------------------------------
199 function private ‪margwaNotetrackSmashAttack( entity )
200 {
201  players = GetPlayers();
202  foreach( player in players )
203  {
204  smashPos = entity.origin + VectorScale( AnglesToForward( self.angles ), ‪MARGWA_SMASH_ATTACK_OFFSET );
205  distSq = DistanceSquared( smashPos, player.origin );
206  if ( distSq < ‪MARGWA_SMASH_ATTACK_RANGE )
207  {
208  if ( !IsGodMode( player ) )
209  {
210  // riot shield can block damage from front or back
211  if ( ‪IS_TRUE( player.hasRiotShield ) )
212  {
213  damageShield = false;
214  attackDir = player.origin - self.origin;
215 
216  if ( ‪IS_TRUE( player.hasRiotShieldEquipped ) )
217  {
219  {
220  damageShield = true;
221  }
222  }
223  else
224  {
226  {
227  damageShield = true;
228  }
229  }
230 
231  if ( damageShield )
232  {
234  shield_damage = level.weaponRiotshield.weaponstarthitpoints;
235  if ( IsDefined( player.weaponRiotshield ) )
236  shield_damage = player.weaponRiotshield.weaponstarthitpoints;
237  player [[ player.player_shield_apply_damage ]]( shield_damage, false );
238  continue;
239  }
240  }
241 
242  if ( isdefined( level.margwa_smash_damage_callback ) && IsFunctionPtr( level.margwa_smash_damage_callback ) )
243  {
244  if ( player [[ level.margwa_smash_damage_callback ]]( self ) )
245  {
246  continue;
247  }
248  }
249 
251  player DoDamage( ‪MARGWA_SMASH_ATTACK_DAMAGE, self.origin, self );
252  }
253  }
254  }
255 
256  if ( IsDefined( self.smashAttackCB ) )
257  {
258  self [[ self.smashAttackCB ]]();
259  }
260 }
261 
262 // Fx takes over after margwa hits the ground
263 function private ‪margwaNotetrackBodyfall( entity )
264 {
265  if( self.archetype == ‪ARCHETYPE_MARGWA )
266  {
267  entity Ghost();
268 
269  if ( IsDefined( self.bodyfallCB ) )
270  {
271  self [[ self.bodyfallCB ]]();
272  }
273  }
274 }
275 
276 function private ‪margwaNotetrackPainMelee( entity )
277 {
278  entity Melee();
279 }
280 
281 //----------------------------------------------------------------------------------------------------------------------------
282 // BEHAVIOR TREE
283 //----------------------------------------------------------------------------------------------------------------------------
284 function private ‪margwaTargetService( entity )
285 {
286  if ( ‪IS_TRUE( entity.ignoreall ) )
287  {
288  return false;
289  }
290 
291  player = ‪zombie_utility::get_closest_valid_player( self.origin, self.ignore_player );
292 
293  if( !IsDefined( player ) )
294  {
295  if( IsDefined( self.ignore_player ) )
296  {
297  if(isDefined(level._should_skip_ignore_player_logic) && [[level._should_skip_ignore_player_logic]]() )
298  {
299  return;
300  }
301  self.ignore_player = [];
302  }
303 
304  self SetGoal( self.origin );
305  return false;
306  }
307  else
308  {
309  targetPos = GetClosestPointOnNavMesh( player.origin, ‪MARGWA_NAVMESH_RADIUS, ‪MARGWA_NAVMESH_BOUNDARY_DIST );
310  if ( IsDefined( targetPos ) )
311  {
312  entity SetGoal( targetPos );
313  return true;
314  }
315  else
316  {
317  entity SetGoal( entity.origin );
318  return false;
319  }
320  }
321 }
322 
323 function ‪margwaShouldSmashAttack( entity )
324 {
325  if( !IsDefined( entity.enemy ) )
326  {
327  return false;
328  }
329 
330  if ( !entity ‪MargwaServerUtils::inSmashAttackRange( entity.enemy ) )
331  {
332  return false;
333  }
334 
335  yaw = abs( zombie_utility::getYawToEnemy() );
336  if( ( yaw > ‪MARGWA_MELEE_YAW ) )
337  {
338  return false;
339  }
340 
341  return true;
342 }
343 
344 function ‪margwaShouldSwipeAttack( entity )
345 {
346  if( !IsDefined( entity.enemy ) )
347  {
348  return false;
349  }
350 
351  if( DistanceSquared( entity.origin, entity.enemy.origin ) > ‪MARGWA_SWIPE_DIST_SQ )
352  {
353  return false;
354  }
355 
356  yaw = abs( zombie_utility::getYawToEnemy() );
357  if( ( yaw > ‪MARGWA_MELEE_YAW ) )
358  {
359  return false;
360  }
361 
362  return true;
363 }
364 
365 function private ‪margwaShouldShowPain( entity )
366 {
367  if ( IsDefined( entity.headDestroyed ) )
368  {
369  headInfo = entity.head[ entity.headDestroyed ];
370  switch( headInfo.cf )
371  {
374  break;
375 
378  break;
379 
382  break;
383  }
384 
385  return true;
386  }
387 
388  return false;
389 }
390 
391 function private ‪margwaShouldReactStun( entity )
392 {
393  if ( ‪IS_TRUE( entity.reactStun ) )
394  {
395  return true;
396  }
397 
398  return false;
399 }
400 
401 function private ‪margwaShouldReactIDGun( entity )
402 {
403  if ( ‪IS_TRUE( entity.reactIDGun ) )
404  {
405  return true;
406  }
407 
408  return false;
409 }
410 
411 function private ‪margwaShouldReactSword( entity )
412 {
413  if ( ‪IS_TRUE( entity.reactSword ) )
414  {
415  return true;
416  }
417 
418  return false;
419 }
420 
421 function private ‪margwaShouldSpawn( entity )
422 {
423  if ( ‪IS_TRUE( entity.needSpawn ) )
424  {
425  return true;
426  }
427 
428  return false;
429 }
430 
431 function private ‪margwaShouldFreeze( entity )
432 {
433  if ( ‪IS_TRUE( entity.isFrozen ) )
434  {
435  return true;
436  }
437 
438  return false;
439 }
440 
441 function private ‪margwaShouldTeleportIn( entity )
442 {
443  if ( ‪IS_TRUE( entity.needTeleportIn ) )
444  {
445  return true;
446  }
447 
448  return false;
449 }
450 
451 function private ‪margwaShouldTeleportOut( entity )
452 {
453  if ( ‪IS_TRUE( entity.needTeleportOut ) )
454  {
455  return true;
456  }
457 
458  return false;
459 }
460 
461 function private ‪margwaShouldWait( entity )
462 {
463  if ( ‪IS_TRUE( entity.waiting ) )
464  {
465  return true;
466  }
467 
468  return false;
469 }
470 
471 function private ‪margwaShouldReset( entity )
472 {
473  if ( IsDefined( entity.headDestroyed ) )
474  {
475  return true;
476  }
477 
478  if ( ‪IS_TRUE( entity.reactIDGun ) )
479  {
480  return true;
481  }
482 
483  if ( ‪IS_TRUE( entity.reactSword ) )
484  {
485  return true;
486  }
487 
488  if ( ‪IS_TRUE( entity.reactStun ) )
489  {
490  return true;
491  }
492 
493  return false;
494 }
495 
496 //----------------------------------------------------------------------------------------------------------------------------------
497 // ACTIONS
498 //----------------------------------------------------------------------------------------------------------------------------------
499 function private ‪margwaReactStunAction( entity, asmStateName )
500 {
501  ‪AnimationStateNetworkUtility::RequestState( entity, asmStateName );
502 
503  stunActionAST = entity ASTSearch( IString( asmStateName ) );
504  stunActionAnimation = ‪AnimationStateNetworkUtility::SearchAnimationMap( entity, stunActionAST[ ‪ASM_ALIAS_ATTRIBUTE ] );
505 
506  closeTime = GetAnimLength( stunActionAnimation ) * 1000;
507 
508  entity ‪MargwaServerUtils::margwaCloseAllHeads( closeTime );
509 
511 
512  return ‪BHTN_RUNNING;
513 }
514 
515 
516 function private ‪margwaSwipeAttackAction( entity, asmStateName )
517 {
518  ‪AnimationStateNetworkUtility::RequestState( entity, asmStateName );
519 
520  if ( !isdefined( entity.swipe_end_time ) )
521  {
522  swipeActionAST = entity ASTSearch( IString( asmStateName ) );
523  swipeActionAnimation = ‪AnimationStateNetworkUtility::SearchAnimationMap( entity, swipeActionAST[ ‪ASM_ALIAS_ATTRIBUTE ] );
524  swipeActionTime = GetAnimLength( swipeActionAnimation ) * 1000;
525 
526  entity.swipe_end_time = GetTime() + swipeActionTime;
527  }
528 
529  return ‪BHTN_RUNNING;
530 }
531 
532 function private ‪margwaSwipeAttackActionUpdate( entity, asmStateName )
533 {
534  if ( isdefined( entity.swipe_end_time ) && GetTime() > entity.swipe_end_time )
535  {
536  return ‪BHTN_SUCCESS;
537  }
538 
539  return ‪BHTN_RUNNING;
540 }
541 
542 function private ‪margwaIdleStart( entity )
543 {
545  {
547  }
548 }
549 
550 function private ‪margwaMoveStart( entity )
551 {
553  {
554  if ( entity.zombie_move_speed == "run" )
555  {
557  }
558  else
559  {
561  }
562  }
563 }
564 
565 function private ‪margwaDeathAction( entity )
566 {
567  //insert anything that needs to be done right before zombie death
568 }
569 
570 function private ‪margwaTraverseActionStart( entity )
571 {
572  ‪Blackboard::SetBlackBoardAttribute( entity, ‪TRAVERSAL_TYPE, entity.traverseStartNode.animscript );
573 
574  if( isdefined( entity.traverseStartNode.animscript ) )
575  {
577  {
578  switch ( entity.traverseStartNode.animscript )
579  {
580  case "jump_down_36":
582  break;
583 
584  case "jump_down_96":
586  break;
587 
588  case "jump_up_36":
590  break;
591 
592  case "jump_up_96":
594  break;
595  }
596  }
597  }
598 }
599 
600 function private ‪margwaTeleportInStart( entity )
601 {
602  entity Unlink();
603  if ( IsDefined( entity.teleportPos ) )
604  {
605  entity ForceTeleport( entity.teleportPos );
606  }
607  entity Show();
608  entity PathMode( "move allowed" );
609  entity.needTeleportIn = false;
611 
612  if ( isdefined( self.traveler ) )
613  {
615  }
617 
619  {
621  }
622 }
623 
625 {
626  if ( isdefined( self.traveler ) )
627  {
629  }
630  entity.isTeleporting = false;
631 }
632 
633 function private ‪margwaTeleportOutStart( entity )
634 {
635  entity.needTeleportOut = false;
636  entity.isTeleporting = true;
637  entity.teleportStart = entity.origin;
638 
641 
643  {
645  }
646 }
647 
648 function private ‪margwaTeleportOutTerminate( entity )
649 {
650  if ( isdefined( entity.traveler ) )
651  {
652  entity.traveler.origin = entity GetTagOrigin( ‪MARGWA_TAG_TELEPORT );
654  }
655 
656  entity Ghost();
657  entity PathMode( "dont move" );
658 
659  if ( isdefined( entity.traveler ) )
660  {
661  entity LinkTo( entity.traveler );
662  }
663 
664  if ( isdefined( entity.margwaWait ) )
665  {
666  entity thread [[ entity.margwaWait ]]();
667  }
668  else
669  {
670  entity thread ‪MargwaServerUtils::margwaWait();
671  }
672 }
673 
674 function private ‪margwaPainStart( entity )
675 {
676  entity notify( "stop_head_update" );
677 
679  {
681  switch ( head )
682  {
683  case ‪MARGWA_HEAD_LEFT:
685  break;
686 
689  break;
690 
693  break;
694 
695  }
696  }
697 
698  entity.headDestroyed = undefined;
699  entity.canStun = false;
700  entity.canDamage = false;
701 }
702 
703 function private ‪margwaPainTerminate( entity )
704 {
705  entity.headDestroyed = undefined;
706  entity.canStun = true;
707  entity.canDamage = true;
708 
710 
711  entity ClearPath();
712 
713  if ( IsDefined( entity.margwaPainTerminateCB ) )
714  {
715  entity [[ entity.margwaPainTerminateCB ]]();
716  }
717 }
718 
719 function private ‪margwaReactStunStart( entity )
720 {
721  entity.reactStun = undefined;
722  entity.canStun = false;
723 
725  {
727  }
728 }
729 
730 function ‪margwaReactStunTerminate( entity )
731 {
732  entity.canStun = true;
733 }
734 
735 function private ‪margwaReactIDGunStart( entity )
736 {
737  entity.reactIDGun = undefined;
738  entity.canStun = false;
739 
740  isPacked = false;
741 
743  {
745  {
747  }
749  }
750  else
751  {
753  {
755  }
757 
758  isPacked = true;
759  }
760 
761  if ( IsDefined( entity.idgun_damage ) )
762  {
763  entity [[ entity.idgun_damage ]]( isPacked );
764  }
765 }
766 
768 {
769  entity.canStun = true;
771 }
772 
773 function private ‪margwaReactSwordStart( entity )
774 {
775  entity.reactSword = undefined;
776  entity.canStun = false;
777 
778  if ( IsDefined( entity.head_chopper ) )
779  {
780  entity.head_chopper notify( "react_sword" );
781  }
782 }
783 
784 function private ‪margwaReactSwordTerminate( entity )
785 {
786  entity.canStun = true;
787 }
788 
789 function private ‪margwaSpawnStart( entity )
790 {
791  entity.needSpawn = false;
792 }
793 
794 function private ‪margwaSmashAttackStart( entity )
795 {
797 
799  {
801  }
802 }
803 
805 {
807 }
808 
809 function ‪margwaSwipeAttackStart( entity )
810 {
812  {
814  }
815 }
816 
817 function private ‪margwaSwipeattackTerminate( entity )
818 {
820 }
821 
823 // MOCOMPS
825 function private ‪mocompMargwaTeleportTraversalInit( entity, mocompAnim, mocompAnimBlendOutTime, mocompAnimFlag, mocompDuration )
826 {
827  entity OrientMode( "face angle", entity.angles[1] );
828  entity AnimMode( ‪AI_ANIM_MOVE_CODE );
829 
830  if ( isdefined( entity.traverseEndNode ) )
831  {
832  entity.teleportStart = entity.origin;
833  entity.teleportPos = entity.traverseEndNode.origin;
835 
836  if ( isdefined( entity.traverseStartNode ) )
837  {
838  if ( isdefined( entity.traverseStartNode.speed ) )
839  {
840  self.margwa_teleport_speed = entity.traverseStartNode.speed;
841  }
842  }
843  }
844 }
845 
846 function private ‪mocompMargwaTeleportTraversalUpdate( entity, mocompAnim, mocompAnimBlendOutTime, mocompAnimFlag, mocompDuration )
847 {
848 }
849 
850 function private ‪mocompMargwaTeleportTraversalTerminate( entity, mocompAnim, mocompAnimBlendOutTime, mocompAnimFlag, mocompDuration )
851 {
853 }
854 
855 
857 #namespace MargwaServerUtils;
858 
859 function private ‪margwaSpawnSetup()
860 {
861  self DisableAimAssist();
862 
863  self.disableAmmoDrop = true;
864  self.no_gib = true;
865  self.ignore_nuke = true;
866  self.ignore_enemy_count = true;
867  self.ignore_round_robbin_death = true;
868 
869  self.zombie_move_speed = "walk";
870 
871  self.overrideActorDamage = &‪margwaDamage;
872  self.canDamage = true;
873 
874  self.headAttached = ‪MARGWA_NUM_HEADS;
875  self.headOpen = 0;
876 
880 
881  self.headHealthMax = ‪MARGWA_HEAD_HEALTH_BASE;
882 
883  self ‪margwaDisableStun();
884 
885  self.traveler = ‪Spawn( "script_model", self.origin );
886  self.traveler SetModel( "tag_origin" );
887  self.traveler NotSolid();
888 
889  self.travelerTell = ‪Spawn( "script_model", self.origin );
890  self.travelerTell SetModel( "tag_origin" );
891  self.travelerTell NotSolid();
892 
893  self thread ‪margwaDeath();
894 
895  self.updateSight = false;
896  self.ignoreRunAndGunDist = true;
897 }
898 
899 function private ‪margwaDeath()
900 {
901  self waittill( "death" );
902 
903  if( isdefined(self.e_head_attacker) )
904  {
905  self.e_head_attacker notify( "margwa_kill" );
906  }
907 
908  if ( IsDefined( self.traveler ) )
909  {
910  self.traveler Delete();
911  }
912 
913  if ( IsDefined( self.travelerTell ) )
914  {
915  self.travelerTell Delete();
916  }
917 }
918 
920 {
921  self.canStun = true;
922 }
923 
924 function private ‪margwaDisableStun()
925 {
926  self.canStun = false;
927 }
928 
929 function private ‪margwaInitHead( headModel, headTag )
930 {
931  model = headModel;
932  model_gore = undefined;
933 
934  switch ( headModel )
935  {
937  if( isdefined( level.margwa_head_left_model_override ))
938  {
939  model = level.margwa_head_left_model_override;
940  model_gore = level.margwa_gore_left_model_override;
941  }
942  break;
943 
945  if( isdefined( level.margwa_head_mid_model_override ))
946  {
947  model = level.margwa_head_mid_model_override;
948  model_gore = level.margwa_gore_mid_model_override;
949  }
950  break;
951 
953  if( isdefined( level.margwa_head_right_model_override ))
954  {
955  model = level.margwa_head_right_model_override;
956  model_gore = level.margwa_gore_right_model_override;
957  }
958  break;
959  }
960 
961  self Attach( model );
962 
963  if ( !IsDefined( self.head ) )
964  {
965  self.head = [];
966  }
967 
968  self.head[ model ] = SpawnStruct();
969  self.head[ model ].model = model;
970  self.head[ model ].tag = headTag;
971  self.head[ model ].health = ‪MARGWA_HEAD_HEALTH_BASE;
972  self.head[ model ].canDamage = false;
973 
974  self.head[ model ].open = ‪MARGWA_HEAD_OPEN;
975  self.head[ model ].closed = ‪MARGWA_HEAD_CLOSED;
976  self.head[ model ].smash = ‪MARGWA_HEAD_SMASH_ATTACK;
977 
978  switch ( headModel )
979  {
981  self.head[ model ].cf = ‪MARGWA_HEAD_LEFT_CLIENTFIELD;
982  self.head[ model ].impactCF = ‪MARGWA_HEAD_LEFT_HIT_CLIENTFIELD;
983  self.head[ model ].gore = ‪MARGWA_MODEL_GORE_LEFT;
984  if( isdefined( model_gore ))
985  {
986  self.head[ model ].gore = model_gore;
987  }
988  self.head[ model ].killIndex = ‪MARGWA_HEAD_KILLED_LEFT;
989  self.head_left_model = model;
990  break;
991 
993  self.head[ model ].cf = ‪MARGWA_HEAD_MID_CLIENTFIELD;
994  self.head[ model ].impactCF = ‪MARGWA_HEAD_MID_HIT_CLIENTFIELD;
995  self.head[ model ].gore = ‪MARGWA_MODEL_GORE_MID;
996  if( isdefined( model_gore ))
997  {
998  self.head[ model ].gore = model_gore;
999  }
1000  self.head[ model ].killIndex = ‪MARGWA_HEAD_KILLED_MID;
1001  self.head_mid_model = model;
1002  break;
1003 
1005  self.head[ model ].cf = ‪MARGWA_HEAD_RIGHT_CLIENTFIELD;
1006  self.head[ model ].impactCF = ‪MARGWA_HEAD_RIGHT_HIT_CLIENTFIELD;
1007  self.head[ model ].gore = ‪MARGWA_MODEL_GORE_RIGHT;
1008  if( isdefined( model_gore ))
1009  {
1010  self.head[ model ].gore = model_gore;
1011  }
1012  self.head[ model ].killIndex = ‪MARGWA_HEAD_KILLED_RIGHT;
1013  self.head_right_model = model;
1014  break;
1015  }
1016 
1017  self thread ‪margwaHeadUpdate( self.head[ model ] );
1018 }
1019 
1020 function ‪margwaSetHeadHealth( health )
1021 {
1022  self.headHealthMax = health;
1023 
1024  foreach( head in self.head )
1025  {
1026  head.health = health;
1027  }
1028 }
1029 
1030 function private ‪margwaResetHeadTime( min, max )
1031 {
1032  time = GetTime() + RandomIntRange( min, max );
1033  return time;
1034 }
1035 
1036 function private ‪margwaHeadCanOpen()
1037 {
1038  if ( self.headAttached > 1 )
1039  {
1040  if ( self.headOpen < (self.headAttached - 1) )
1041  {
1042  return true;
1043  }
1044  }
1045  else
1046  {
1047  return true;
1048  }
1049 
1050  return false;
1051 }
1052 
1053 function private ‪margwaHeadUpdate( headInfo )
1054 {
1055  self endon( "death" );
1056  self endon( "stop_head_update" );
1057 
1058  headInfo notify( "stop_head_update" );
1059  headInfo endon( "stop_head_update" );
1060 
1061  while ( 1 )
1062  {
1063  if ( self IsPaused() )
1064  {
1066  continue;
1067  }
1068 
1069  if ( !IsDefined( headInfo.closeTime ) )
1070  {
1071  if ( self.headAttached == 1 )
1072  {
1074  }
1075  else
1076  {
1078  }
1079  }
1080 
1081  if ( GetTime() > headInfo.closeTime && self ‪margwaHeadCanOpen() )
1082  {
1083  self.headOpen++;
1084  headInfo.closeTime = undefined;
1085  }
1086  else
1087  {
1089  continue;
1090  }
1091 
1092  self ‪margwaHeadDamageDelay( headInfo, true );
1093  self ‪clientfield::set( headInfo.cf, headInfo.open );
1094  self playsoundontag( "zmb_vocals_margwa_ambient", headInfo.tag );
1095 
1096  while ( 1 )
1097  {
1098  if ( !IsDefined( headInfo.openTime ) )
1099  {
1101  }
1102 
1103  if ( GetTime() > headInfo.openTime )
1104  {
1105  self.headOpen--;
1106  headInfo.openTime = undefined;
1107  break;
1108  }
1109  else
1110  {
1112  continue;
1113  }
1114  }
1115 
1116  self ‪margwaHeadDamageDelay( headInfo, false );
1117  self ‪clientfield::set( headInfo.cf, headInfo.closed );
1118  }
1119 }
1120 
1121 function private ‪margwaHeadDamageDelay( headInfo, canDamage )
1122 {
1123  self endon( "death" );
1124 
1126 
1127  headInfo.canDamage = canDamage;
1128 }
1129 
1130 function private ‪margwaHeadSmash()
1131 {
1132  self notify( "stop_head_update" );
1133 
1134  headAlive = [];
1135  foreach( head in self.head )
1136  {
1137  if ( head.health > 0 )
1138  {
1139  headAlive[ headAlive.size ] = head;
1140  }
1141  }
1142 
1143  headAlive = array::randomize( headAlive );
1144  ‪open = false;
1145 
1146  foreach( head in headAlive )
1147  {
1148  if ( !‪open )
1149  {
1150  head.canDamage = true;
1151  self ‪clientfield::set( head.cf, head.smash );
1152  ‪open = true;
1153  }
1154  else
1155  {
1156  self ‪margwaCloseHead( head );
1157  }
1158  }
1159 }
1160 
1161 function private ‪margwaCloseHead( headInfo )
1162 {
1163  headInfo.canDamage = false;
1164  self ‪clientfield::set( headInfo.cf, headInfo.closed );
1165 }
1166 
1167 function private ‪margwaCloseAllHeads( closeTime )
1168 {
1169  if ( self IsPaused() )
1170  {
1171  return;
1172  }
1173 
1174  foreach ( head in self.head )
1175  {
1176  if ( head.health > 0 )
1177  {
1178  head.closeTime = undefined;
1179  head.openTime = undefined;
1180 
1181  if ( IsDefined( closeTime ) )
1182  {
1183  head.closeTime = GetTime() + closeTime;
1184  }
1185 
1186  self.headOpen = 0;
1187 
1188  self ‪margwaCloseHead( head );
1189  self thread ‪margwaHeadUpdate( head );
1190  }
1191  }
1192 }
1193 
1194 function ‪margwaKillHead( modelHit, attacker )
1195 {
1196  headInfo = self.head[ modelHit ];
1197 
1198  headInfo.health = 0;
1199  headInfo notify( "stop_head_update" );
1200 
1201  if ( ‪IS_TRUE( headInfo.canDamage ) )
1202  {
1203  self ‪margwaCloseHead( headInfo );
1204  self.headOpen--;
1205  }
1206 
1207  self ‪margwaUpdateMoveSpeed();
1208 
1209  if ( IsDefined( self.destroyHeadCB ) )
1210  {
1211  self thread [[ self.destroyHeadCB ]]( modelHit, attacker );
1212  }
1213 
1214  self ‪clientfield::set( ‪MARGWA_HEAD_KILLED_CLIENTFIELD, headInfo.killIndex );
1215 
1216  self Detach( headInfo.model );
1217  self Attach( headInfo.gore );
1218  self.headAttached--;
1219 
1220  if ( self.headAttached <= 0 )
1221  {
1222  self.e_head_attacker = attacker;
1223  return true;
1224  }
1225  else
1226  {
1227  self.headDestroyed = modelHit;
1228  }
1229 
1230  return false;
1231 }
1232 
1234 {
1235  foreach( head in self.head )
1236  {
1237  if ( IsDefined( head ) && head.health > 0 && ‪IS_TRUE( head.canDamage ) )
1238  {
1239  return true;
1240  }
1241  }
1242 
1243  return false;
1244 }
1245 
1247 {
1248  if ( IsDefined( self ) && self.health > 0 && ‪IS_TRUE( self.canDamage ) )
1249  {
1250  return true;
1251  }
1252 
1253  return false;
1254 }
1255 
1256 
1257 function ‪show_hit_marker() // self = player
1258 {
1259  if ( IsDefined( self ) && IsDefined( self.hud_damagefeedback ) )
1260  {
1261  self.hud_damagefeedback SetShader( "damage_feedback", 24, 48 );
1262  self.hud_damagefeedback.alpha = 1;
1263  self.hud_damagefeedback FadeOverTime(1);
1264  self.hud_damagefeedback.alpha = 0;
1265  }
1266 }
1267 
1268 function private ‪isDirectHitWeapon( weapon )
1269 {
1270  foreach( dhWeapon in level.dhWeapons )
1271  {
1272  if ( weapon.name == dhWeapon )
1273  {
1274  return true;
1275  }
1276 
1277  if ( isdefined( weapon.rootweapon ) && isdefined( weapon.rootweapon.name ) && weapon.rootweapon.name == dhWeapon )
1278  {
1279  return true;
1280  }
1281  }
1282 
1283  return false;
1284 }
1285 
1286 
1287 // uses the bone name to figure out which head was hit
1288 function ‪margwaDamage( inflictor, attacker, ‪damage, dFlags, mod, weapon, point, dir, hitLoc, offsetTime, boneIndex, modelIndex )
1289 {
1290  if ( ‪IS_TRUE( self.is_kill ) )
1291  {
1292  return ‪damage;
1293  }
1294 
1295  if( isdefined(attacker) && isdefined(attacker.n_margwa_head_damage_scale) )
1296  {
1297  ‪damage = ‪damage * attacker.n_margwa_head_damage_scale;
1298  }
1299 
1300  if( isdefined( level._margwa_damage_cb ) )
1301  {
1302  n_result = [[ level._margwa_damage_cb ]]( inflictor, attacker, ‪damage, dFlags, mod, weapon, point, dir, hitLoc, offsetTime, boneIndex, modelIndex );
1303 
1304  if( isdefined( n_result ) )
1305  {
1306  return n_result;
1307  }
1308  }
1309 
1310  damageOpen = false; // mouth was open during damage
1311 
1312  if ( !‪IS_TRUE( self.canDamage ) )
1313  {
1314  self.health += 1; // impact fx only work when damage is applied
1315  return 1;
1316  }
1317 
1318  if ( ‪isDirectHitWeapon( weapon ) )
1319  {
1320  headAlive = [];
1321  foreach ( head in self.head )
1322  {
1323  if ( head ‪margwaCanDamageHead() )
1324  {
1325  headAlive[ headAlive.size ] = head;
1326  }
1327  }
1328 
1329  if ( headAlive.size > 0 )
1330  {
1331  max = 100000;
1332  headClosest = undefined;
1333  foreach ( head in headAlive )
1334  {
1335  distSq = DistanceSquared( point, self GetTagOrigin( head.tag ) );
1336  if ( distSq < max )
1337  {
1338  max = distSq;
1339  headClosest = head;
1340  }
1341  }
1342  if ( IsDefined( headClosest ) )
1343  {
1344  if ( max < ‪MARGWA_HEAD_DAMAGE_RANGE )
1345  {
1346  if ( isdefined( level.margwa_damage_override_callback ) && IsFunctionPtr( level.margwa_damage_override_callback ) )
1347  {
1348  ‪damage = attacker [[ level.margwa_damage_override_callback ]]( ‪damage );
1349  }
1350 
1351  headClosest.health -= ‪damage;
1352  damageOpen = true;
1353  self ‪clientfield::increment( headClosest.impactCF );
1354  attacker ‪show_hit_marker();
1355 
1356  if ( headClosest.health <= 0 )
1357  {
1358  if( isdefined(level.margwa_head_kill_weapon_check) )
1359  {
1360  [[level.margwa_head_kill_weapon_check]]( self, weapon );
1361  }
1362 
1363  if ( self ‪margwaKillHead( headClosest.model, attacker ) )
1364  {
1365  return self.health;
1366  }
1367  }
1368  }
1369  }
1370  }
1371  }
1372 
1373  partName = GetPartName( self.model, boneIndex );
1374  if ( IsDefined( partName ) )
1375  {
1376  /#
1377  if ( ‪IS_TRUE( self.debugHitLoc ) )
1378  {
1379  PrintTopRightLn( partName + " damage: " + ‪damage );
1380  }
1381  #/
1382  modelHit = self ‪margwaHeadHit( self, partName );
1383  if ( IsDefined( modelHit ) )
1384  {
1385  headInfo = self.head[ modelHit ];
1386  if ( headInfo ‪margwaCanDamageHead() )
1387  {
1388  if ( isdefined( level.margwa_damage_override_callback ) && IsFunctionPtr( level.margwa_damage_override_callback ) )
1389  {
1390  ‪damage = attacker [[ level.margwa_damage_override_callback ]]( ‪damage );
1391  }
1392 
1393  if( isdefined( attacker ) )
1394  {
1395  attacker notify( "margwa_headshot", self );
1396  }
1397 
1398  headInfo.health -= ‪damage;
1399  damageOpen = true;
1400  self ‪clientfield::increment( headInfo.impactCF );
1401  attacker ‪show_hit_marker();
1402 
1403  if ( headInfo.health <= 0 )
1404  {
1405  if( isdefined(level.margwa_head_kill_weapon_check) )
1406  {
1407  [[level.margwa_head_kill_weapon_check]]( self, weapon );
1408  }
1409 
1410  if ( self ‪margwaKillHead( modelHit, attacker ) )
1411  {
1412  return self.health;
1413  }
1414  }
1415  }
1416  }
1417  }
1418 
1419  if ( damageOpen )
1420  {
1421  return 0; // custom fx when damaging head
1422  }
1423 
1424  self.health += 1; // impact fx only work when damage is applied to ent
1425  return 1;
1426 }
1427 
1428 function private ‪margwaHeadHit( entity, partName )
1429 {
1430  switch ( partName )
1431  {
1434  return self.head_left_model;
1435 
1437  case ‪MARGWA_TAG_JAW_MID:
1438  return self.head_mid_model;
1439 
1442  return self.head_right_model;
1443  }
1444 
1445  return undefined;
1446 }
1447 
1448 function private ‪margwaUpdateMoveSpeed()
1449 {
1450  if ( self.zombie_move_speed == "walk" )
1451  {
1452  self.zombie_move_speed = "run";
1453  //self ASMSetAnimationRate( 0.8 );
1455  }
1456  else if ( self.zombie_move_speed == "run" )
1457  {
1458  self.zombie_move_speed = "sprint";
1459  //self ASMSetAnimationRate( 1.0 );
1461  }
1462 }
1463 
1465 {
1466  self.zombie_move_speed = "sprint";
1468 }
1469 
1470 function private ‪margwaDestroyHead( modelHit )
1471 {
1472 }
1473 
1475 {
1476  if ( !‪IS_TRUE( self.jawAnimEnabled ) )
1477  {
1478  return false;
1479  }
1480 
1481  if ( self.headAttached < ‪MARGWA_NUM_HEADS )
1482  {
1483  return true;
1484  }
1485 
1486  return false;
1487 }
1488 
1489 function ‪margwaSetGoal( origin, radius, boundaryDist )
1490 {
1491  pos = GetClosestPointOnNavMesh( origin, ‪MARGWA_NAVMESH_RADIUS, ‪MARGWA_NAVMESH_BOUNDARY_DIST );
1492  if ( IsDefined( pos ) )
1493  {
1494  self SetGoal( pos );
1495  return true;
1496  }
1497 
1498  self SetGoal( self.origin );
1499  return false;
1500 }
1501 
1502 function private ‪margwaWait()
1503 {
1504  self endon( "death" );
1505 
1506  self.waiting = true;
1507  self.needTeleportIn = true;
1508 
1509  destPos = self.teleportPos + ( 0, 0, ‪MARGWA_TRAVELER_HEIGHT_OFFSET );
1510  dist = Distance( self.teleportStart, destPos );
1511  time = dist / ‪MARGWA_TRAVELER_SPEED;
1512 
1513  if ( isdefined( self.margwa_teleport_speed ) )
1514  {
1515  if ( self.margwa_teleport_speed > 0 )
1516  {
1517  time = dist / self.margwa_teleport_speed;
1518  }
1519  }
1520 
1521  if ( isdefined( self.traveler ) )
1522  {
1523  self thread ‪margwaTell();
1524 
1525  self.traveler MoveTo( destPos, time );
1526  self.traveler ‪util::waittill_any_ex( ( time + 0.1 ), "movedone", self, "death" );
1527 
1529  }
1530 
1531  self.waiting = false;
1532  self.needTeleportOut = false;
1533 
1534  if ( isdefined( self.margwa_teleport_speed ) )
1535  {
1536  self.margwa_teleport_speed = undefined;
1537  }
1538 }
1539 
1540 function ‪margwaTell()
1541 {
1542  self endon( "death" );
1543 
1544  self.travelerTell.origin = self.teleportPos;
1545 
1547 
1549 }
1550 
1551 function private ‪shieldFacing( vDir, ‪limit, front = true )
1552 {
1553  orientation = self getPlayerAngles();
1554  forwardVec = anglesToForward( orientation );
1555  if ( !front )
1556  {
1557  forwardVec = -forwardVec;
1558  }
1559  forwardVec2D = ( forwardVec[0], forwardVec[1], 0 );
1560  unitForwardVec2D = VectorNormalize( forwardVec2D );
1561 
1562  toFaceeVec = -vDir;
1563  toFaceeVec2D = ( toFaceeVec[0], toFaceeVec[1], 0 );
1564  unitToFaceeVec2D = VectorNormalize( toFaceeVec2D );
1565 
1566  dotProduct = VectorDot( unitForwardVec2D, unitToFaceeVec2D );
1567  return ( dotProduct > ‪limit ); // more or less in front
1568 }
1569 
1570 function private ‪inSmashAttackRange( enemy )
1571 {
1572  smashPos = self.origin;
1573 
1574  heightOffset = abs( self.origin[2] - enemy.origin[2] );
1575  if ( heightOffset > ‪MARGWA_SMASH_ATTACK_HEIGHT )
1576  {
1577  return false;
1578  }
1579 
1580  distSq = DistanceSquared( smashPos, enemy.origin );
1582 
1583  if ( distSq < range )
1584  {
1585  return true;
1586  }
1587 
1588  return false;
1589 }
‪open
‪function open(localClientNum, a_menu_items)
Definition: debug_menu_shared.csc:10
‪margwaHeadHit
‪function private margwaHeadHit(entity, partName)
Definition: margwa.gsc:1428
‪MARGWA_HEAD_CLIENTFIELD_TYPE
‪#define MARGWA_HEAD_CLIENTFIELD_TYPE
Definition: margwa.gsh:143
‪MARGWA_TAG_JAW_LEFT
‪#define MARGWA_TAG_JAW_LEFT
Definition: margwa.gsh:19
‪margwaForceSprint
‪function margwaForceSprint()
Definition: margwa.gsc:1464
‪MARGWA_HEAD_MIDDLE
‪#define MARGWA_HEAD_MIDDLE
Definition: blackboard.gsh:197
‪MARGWA_HEAD_HEALTH_BASE
‪#define MARGWA_HEAD_HEALTH_BASE
Definition: margwa.gsh:55
‪shouldUpdateJaw
‪function shouldUpdateJaw()
Definition: margwa.gsc:1474
‪MARGWA_SMASH_ATTACK_OFFSET
‪#define MARGWA_SMASH_ATTACK_OFFSET
Definition: margwa.gsh:91
‪BOARD_ATTACK_SPOT
‪#define BOARD_ATTACK_SPOT
Definition: blackboard.gsh:171
‪margwaTargetService
‪function private margwaTargetService(entity)
Definition: margwa.gsc:284
‪BT_REGISTER_API
‪#define BT_REGISTER_API(name, function)
Definition: behavior.gsh:1
‪MARGWA_TELEPORT
‪#define MARGWA_TELEPORT
Definition: blackboard.gsh:200
‪ArchetypeMargwaOnAnimscriptedCallback
‪function private ArchetypeMargwaOnAnimscriptedCallback(entity)
Definition: margwa.gsc:178
‪MARGWA_HEAD_CLOSE_MAX
‪#define MARGWA_HEAD_CLOSE_MAX
Definition: margwa.gsh:61
‪MARGWA_TELEPORT_ON
‪#define MARGWA_TELEPORT_ON
Definition: margwa.gsh:124
‪mocompMargwaTeleportTraversalTerminate
‪function private mocompMargwaTeleportTraversalTerminate(entity, mocompAnim, mocompAnimBlendOutTime, mocompAnimFlag, mocompDuration)
Definition: margwa.gsc:850
‪MARGWA_SMASH_ATTACK_HEIGHT
‪#define MARGWA_SMASH_ATTACK_HEIGHT
Definition: margwa.gsh:92
‪inSmashAttackRange
‪function private inSmashAttackRange(enemy)
Definition: margwa.gsc:1570
‪MARGWA_HEAD_MID_CLIENTFIELD
‪#define MARGWA_HEAD_MID_CLIENTFIELD
Definition: margwa.gsh:141
‪margwaShouldShowPain
‪function private margwaShouldShowPain(entity)
Definition: margwa.gsc:365
‪margwaShouldReset
‪function private margwaShouldReset(entity)
Definition: margwa.gsc:471
‪margwaSetGoal
‪function margwaSetGoal(origin, radius, boundaryDist)
Definition: margwa.gsc:1489
‪MARGWA_HEAD_LEFT
‪#define MARGWA_HEAD_LEFT
Definition: blackboard.gsh:196
‪margwaTeleportInTerminate
‪function margwaTeleportInTerminate(entity)
Definition: margwa.gsc:624
‪MARGWA_HEAD_SMASH_ATTACK
‪#define MARGWA_HEAD_SMASH_ATTACK
Definition: margwa.gsh:37
‪margwaShouldSwipeAttack
‪function margwaShouldSwipeAttack(entity)
Definition: margwa.gsc:344
‪MARGWA_FX_SPAWN_CLIENTFIELD_TYPE
‪#define MARGWA_FX_SPAWN_CLIENTFIELD_TYPE
Definition: margwa.gsh:154
‪limit
‪function limit(equipment_name, limited)
Definition: _zm_equipment.gsc:140
‪MARGWA_JAW_RUN_CHARGE
‪#define MARGWA_JAW_RUN_CHARGE
Definition: margwa.gsh:186
‪MARGWA_JAW_TELEPORT_OUT
‪#define MARGWA_JAW_TELEPORT_OUT
Definition: margwa.gsh:194
‪MARGWA_SINGLE_HEAD_CLOSE_MAX
‪#define MARGWA_SINGLE_HEAD_CLOSE_MAX
Definition: margwa.gsh:64
‪MARGWA_NUM_HEADS
‪#define MARGWA_NUM_HEADS
Definition: margwa.gsh:32
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪MARGWA_MODEL_GORE_LEFT
‪#define MARGWA_MODEL_GORE_LEFT
Definition: margwa.gsh:13
‪margwaSmashAttackTerminate
‪function margwaSmashAttackTerminate(entity)
Definition: margwa.gsc:804
‪BHTN_RUNNING
‪#define BHTN_RUNNING
Definition: behavior_tree.gsh:9
‪AddDirectHitWeapon
‪function AddDirectHitWeapon(weaponName)
Definition: margwa.gsc:87
‪MARGWA_JAW_REACT_IDGUN
‪#define MARGWA_JAW_REACT_IDGUN
Definition: margwa.gsh:187
‪LOCOMOTION_SPEED_WALK
‪#define LOCOMOTION_SPEED_WALK
Definition: blackboard.gsh:156
‪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
‪margwaShouldReactSword
‪function private margwaShouldReactSword(entity)
Definition: margwa.gsc:411
‪show_hit_marker
‪function show_hit_marker()
Definition: margwa.gsc:1257
‪margwaReactStunStart
‪function private margwaReactStunStart(entity)
Definition: margwa.gsc:719
‪ZOMBIE_DAMAGEWEAPON_REGULAR
‪#define ZOMBIE_DAMAGEWEAPON_REGULAR
Definition: blackboard.gsh:190
‪MARGWA_MODEL_HEAD_MID
‪#define MARGWA_MODEL_HEAD_MID
Definition: margwa.gsh:10
‪margwaSpawnStart
‪function private margwaSpawnStart(entity)
Definition: margwa.gsc:789
‪LOCOMOTION_SPEED_SPRINT
‪#define LOCOMOTION_SPEED_SPRINT
Definition: blackboard.gsh:158
‪MARGWA_JAW_CLIENTFIELD
‪#define MARGWA_JAW_CLIENTFIELD
Definition: margwa.gsh:174
‪MARGWA_HEAD_OPEN_MIN
‪#define MARGWA_HEAD_OPEN_MIN
Definition: margwa.gsh:58
‪margwaTraverseActionStart
‪function private margwaTraverseActionStart(entity)
Definition: margwa.gsc:570
‪SHOULD_TURN
‪#define SHOULD_TURN
Definition: blackboard.gsh:138
‪SetBlackBoardAttribute
‪function SetBlackBoardAttribute(entity, attributeName, attributeValue)
Definition: blackboard.gsc:56
‪MARGWA_JAW_HEAD_R_EXPLODE
‪#define MARGWA_JAW_HEAD_R_EXPLODE
Definition: margwa.gsh:184
‪margwaReactIDGunStart
‪function private margwaReactIDGunStart(entity)
Definition: margwa.gsc:735
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪MARGWA_SMASH_CLIENTFIELD
‪#define MARGWA_SMASH_CLIENTFIELD
Definition: margwa.gsh:161
‪GetBlackBoardAttribute
‪function GetBlackBoardAttribute(entity, attributeName)
Definition: blackboard.gsc:32
‪margwaCloseAllHeads
‪function private margwaCloseAllHeads(closeTime)
Definition: margwa.gsc:1167
‪MARGWA_MOUTH_BLEND_TIME
‪#define MARGWA_MOUTH_BLEND_TIME
Definition: margwa.gsh:68
‪RegisterUtilityBlackboardAttributes
‪function RegisterUtilityBlackboardAttributes()
Definition: archetype_utility.gsc:139
‪MARGWA_JAW_IDLE
‪#define MARGWA_JAW_IDLE
Definition: margwa.gsh:181
‪MARGWA_FX_SPAWN_CLIENTFIELD
‪#define MARGWA_FX_SPAWN_CLIENTFIELD
Definition: margwa.gsh:153
‪MARGWA_HEAD_CLOSE_MIN
‪#define MARGWA_HEAD_CLOSE_MIN
Definition: margwa.gsh:60
‪MARGWA_HEAD_RIGHT_HIT_CLIENTFIELD
‪#define MARGWA_HEAD_RIGHT_HIT_CLIENTFIELD
Definition: margwa.gsh:167
‪margwaHeadSmash
‪function private margwaHeadSmash()
Definition: margwa.gsc:1130
‪margwaDisableStun
‪function private margwaDisableStun()
Definition: margwa.gsc:924
‪SearchAnimationMap
‪function SearchAnimationMap(entity, aliasName)
Definition: animation_state_machine_utility.gsc:9
‪margwaEnableStun
‪function margwaEnableStun()
Definition: margwa.gsc:919
‪MARGWA_TRAVELER_HEIGHT_OFFSET
‪#define MARGWA_TRAVELER_HEIGHT_OFFSET
Definition: margwa.gsh:128
‪margwaWait
‪function private margwaWait()
Definition: margwa.gsc:1502
‪ASM_MARGWA_SMASH_ATTACK_NOTETRACK
‪#define ASM_MARGWA_SMASH_ATTACK_NOTETRACK
Definition: margwa.gsh:70
‪MARGWA_FX_IN_CLIENTFIELD
‪#define MARGWA_FX_IN_CLIENTFIELD
Definition: margwa.gsh:146
‪MARGWA_TAG_TELEPORT
‪#define MARGWA_TAG_TELEPORT
Definition: margwa.gsh:121
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪MARGWA_HEAD_KILLED_LEFT
‪#define MARGWA_HEAD_KILLED_LEFT
Definition: margwa.gsh:170
‪margwaSwipeAttackActionUpdate
‪function private margwaSwipeAttackActionUpdate(entity, asmStateName)
Definition: margwa.gsc:532
‪LOCOMOTION_SHOULD_TURN
‪#define LOCOMOTION_SHOULD_TURN
Definition: blackboard.gsh:137
‪MARGWA_TELEPORT_IN
‪#define MARGWA_TELEPORT_IN
Definition: blackboard.gsh:201
‪InitDirectHitWeapons
‪function private InitDirectHitWeapons()
Definition: margwa.gsc:71
‪MARGWA_JAW_TRV_JUMP_DOWN_96
‪#define MARGWA_JAW_TRV_JUMP_DOWN_96
Definition: margwa.gsh:198
‪ENABLE_BLACKBOARD_DEBUG_TRACKING
‪#define ENABLE_BLACKBOARD_DEBUG_TRACKING(self)
Definition: blackboard.gsh:7
‪MARGWA_JAW_RUN
‪#define MARGWA_JAW_RUN
Definition: margwa.gsh:189
‪MARGWA_NAVMESH_BOUNDARY_DIST
‪#define MARGWA_NAVMESH_BOUNDARY_DIST
Definition: margwa.gsh:100
‪margwaSpawnSetup
‪function private margwaSpawnSetup()
Definition: margwa.gsc:859
‪MARGWA_MODEL_GORE_MID
‪#define MARGWA_MODEL_GORE_MID
Definition: margwa.gsh:14
‪AI_ANIM_MOVE_CODE
‪#define AI_ANIM_MOVE_CODE
Definition: animation_state_machine.gsh:77
‪shieldFacing
‪function private shieldFacing(vDir, limit, front=true)
Definition: margwa.gsc:1551
‪margwaDestroyHead
‪function private margwaDestroyHead(modelHit)
Definition: margwa.gsc:1470
‪MARGWA_HEAD_CLIENTFIELD_BITS
‪#define MARGWA_HEAD_CLIENTFIELD_BITS
Definition: margwa.gsh:144
‪margwaCanDamageHead
‪function margwaCanDamageHead()
Definition: margwa.gsc:1246
‪MARGWA_TAG_CHUNK_MID
‪#define MARGWA_TAG_CHUNK_MID
Definition: margwa.gsh:22
‪MARGWA_RIOTSHIELD_FACING_TOLERANCE
‪#define MARGWA_RIOTSHIELD_FACING_TOLERANCE
Definition: margwa.gsh:96
‪ASM_REGISTER_MOCOMP
‪#define ASM_REGISTER_MOCOMP(name, initFunction, updateFunction, terminateFunction)
Definition: animation_state_machine.gsh:1
‪waittill_any_ex
‪function waittill_any_ex(...)
Definition: util_shared.csc:270
‪mocompMargwaTeleportTraversalUpdate
‪function private mocompMargwaTeleportTraversalUpdate(entity, mocompAnim, mocompAnimBlendOutTime, mocompAnimFlag, mocompDuration)
Definition: margwa.gsc:846
‪MARGWA_JAW_SMASH_ATTACK
‪#define MARGWA_JAW_SMASH_ATTACK
Definition: margwa.gsh:190
‪margwaReactIDGunTerminate
‪function margwaReactIDGunTerminate(entity)
Definition: margwa.gsc:767
‪LOCOMOTION_SPEED_TYPE
‪#define LOCOMOTION_SPEED_TYPE
Definition: blackboard.gsh:155
‪wait_network_frame
‪function wait_network_frame(n_count=1)
Definition: util_shared.gsc:64
‪MARGWA_TAG_JAW_MID
‪#define MARGWA_TAG_JAW_MID
Definition: margwa.gsh:23
‪MARGWA_FX_SPAWN_CLIENTFIELD_BITS
‪#define MARGWA_FX_SPAWN_CLIENTFIELD_BITS
Definition: margwa.gsh:155
‪MARGWA_JAW_REACT_STUN
‪#define MARGWA_JAW_REACT_STUN
Definition: margwa.gsh:185
‪ASM_MARGWA_PAIN_MELEE_NOTETRACK
‪#define ASM_MARGWA_PAIN_MELEE_NOTETRACK
Definition: margwa.gsh:72
‪MARGWA_JAW_TRV_JUMP_DOWN_36
‪#define MARGWA_JAW_TRV_JUMP_DOWN_36
Definition: margwa.gsh:197
‪BB_GetShouldTurn
‪function private BB_GetShouldTurn()
Definition: margwa.gsc:187
‪margwaHeadCanOpen
‪function private margwaHeadCanOpen()
Definition: margwa.gsc:1036
‪margwaResetHeadTime
‪function private margwaResetHeadTime(min, max)
Definition: margwa.gsc:1030
‪margwaDeath
‪function private margwaDeath()
Definition: margwa.gsc:899
‪margwaCanDamageAnyHead
‪function margwaCanDamageAnyHead()
Definition: margwa.gsc:1233
‪margwaTeleportInStart
‪function private margwaTeleportInStart(entity)
Definition: margwa.gsc:600
‪margwaHeadDamageDelay
‪function private margwaHeadDamageDelay(headInfo, canDamage)
Definition: margwa.gsc:1121
‪SHOULD_NOT_TURN
‪#define SHOULD_NOT_TURN
Definition: blackboard.gsh:139
‪isDirectHitWeapon
‪function private isDirectHitWeapon(weapon)
Definition: margwa.gsc:1268
‪margwaReactStunTerminate
‪function margwaReactStunTerminate(entity)
Definition: margwa.gsc:730
‪margwaNotetrackBodyfall
‪function private margwaNotetrackBodyfall(entity)
Definition: margwa.gsc:263
‪margwaHeadUpdate
‪function private margwaHeadUpdate(headInfo)
Definition: margwa.gsc:1053
‪margwaShouldReactIDGun
‪function private margwaShouldReactIDGun(entity)
Definition: margwa.gsc:401
‪margwaTell
‪function margwaTell()
Definition: margwa.gsc:1540
‪margwaMoveStart
‪function private margwaMoveStart(entity)
Definition: margwa.gsc:550
‪MARGWA_MODEL_HEAD_RIGHT
‪#define MARGWA_MODEL_HEAD_RIGHT
Definition: margwa.gsh:11
‪MARGWA_TAG_CHUNK_RIGHT
‪#define MARGWA_TAG_CHUNK_RIGHT
Definition: margwa.gsh:26
‪margwaUpdateMoveSpeed
‪function private margwaUpdateMoveSpeed()
Definition: margwa.gsc:1448
‪margwaShouldTeleportIn
‪function private margwaShouldTeleportIn(entity)
Definition: margwa.gsc:441
‪MARGWA_TAG_CHUNK_LEFT
‪#define MARGWA_TAG_CHUNK_LEFT
Definition: margwa.gsh:18
‪margwaKillHead
‪function margwaKillHead(modelHit, attacker)
Definition: margwa.gsc:1194
‪margwaShouldTeleportOut
‪function private margwaShouldTeleportOut(entity)
Definition: margwa.gsc:451
‪increment
‪function increment(str_field_name, n_increment_count=1)
Definition: clientfield_shared.gsc:110
‪TRAVERSAL_TYPE
‪#define TRAVERSAL_TYPE
Definition: blackboard.gsh:116
‪margwaSmashAttackStart
‪function private margwaSmashAttackStart(entity)
Definition: margwa.gsc:794
‪margwaDamage
‪function margwaDamage(inflictor, attacker, damage, dFlags, mod, weapon, point, dir, hitLoc, offsetTime, boneIndex, modelIndex)
Definition: margwa.gsc:1288
‪init
‪function autoexec init()
Definition: margwa.gsc:37
‪MARGWA_JAW_HEAD_L_EXPLODE
‪#define MARGWA_JAW_HEAD_L_EXPLODE
Definition: margwa.gsh:182
‪MARGWA_HEAD_EXPLODE_CLIENTFIELD_TYPE
‪#define MARGWA_HEAD_EXPLODE_CLIENTFIELD_TYPE
Definition: margwa.gsh:158
‪ArchetypeMargwaBlackboardInit
‪function private ArchetypeMargwaBlackboardInit()
Definition: margwa.gsc:157
‪get_closest_valid_player
‪function get_closest_valid_player(origin, ignore_player)
Definition: skeleton.gsc:321
‪margwaNotetrackSmashAttack
‪function private margwaNotetrackSmashAttack(entity)
Definition: margwa.gsc:199
‪MARGWA_MELEE_YAW
‪#define MARGWA_MELEE_YAW
Definition: margwa.gsh:75
‪MARGWA_TRAVELER_SPEED
‪#define MARGWA_TRAVELER_SPEED
Definition: margwa.gsh:127
‪MARGWA_TELEPORT_OUT
‪#define MARGWA_TELEPORT_OUT
Definition: blackboard.gsh:202
‪margwaIdleStart
‪function private margwaIdleStart(entity)
Definition: margwa.gsc:542
‪Spawn
‪function Spawn(parent, onDeathCallback)
Definition: _flak_drone.gsc:427
‪margwaSetHeadHealth
‪function margwaSetHeadHealth(health)
Definition: margwa.gsc:1020
‪margwaSwipeAttackStart
‪function margwaSwipeAttackStart(entity)
Definition: margwa.gsc:809
‪margwaSwipeattackTerminate
‪function private margwaSwipeattackTerminate(entity)
Definition: margwa.gsc:817
‪MARGWA_TAG_JAW_RIGHT
‪#define MARGWA_TAG_JAW_RIGHT
Definition: margwa.gsh:27
‪BHTN_SUCCESS
‪#define BHTN_SUCCESS
Definition: behavior_tree.gsh:8
‪margwaShouldSmashAttack
‪function margwaShouldSmashAttack(entity)
Definition: margwa.gsc:323
‪add_archetype_spawn_function
‪function add_archetype_spawn_function(archetype, spawn_func)
Definition: ai_shared.csc:23
‪margwaPainTerminate
‪function private margwaPainTerminate(entity)
Definition: margwa.gsc:703
‪margwaNotetrackPainMelee
‪function private margwaNotetrackPainMelee(entity)
Definition: margwa.gsc:276
‪MARGWA_NAVMESH_RADIUS
‪#define MARGWA_NAVMESH_RADIUS
Definition: margwa.gsh:99
‪MARGWA_JAW_TRV_JUMP_UP_96
‪#define MARGWA_JAW_TRV_JUMP_UP_96
Definition: margwa.gsh:201
‪MARGWA_JAW_REACT_IDGUN_PACKED
‪#define MARGWA_JAW_REACT_IDGUN_PACKED
Definition: margwa.gsh:188
‪MARGWA_MODEL_GORE_RIGHT
‪#define MARGWA_MODEL_GORE_RIGHT
Definition: margwa.gsh:15
‪MARGWA_HEAD_EXPLODE_CLIENTFIELD_BITS
‪#define MARGWA_HEAD_EXPLODE_CLIENTFIELD_BITS
Definition: margwa.gsh:159
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪MARGWA_HEAD_DAMAGE_RANGE
‪#define MARGWA_HEAD_DAMAGE_RANGE
Definition: margwa.gsh:84
‪ASM_ALIAS_ATTRIBUTE
‪#define ASM_ALIAS_ATTRIBUTE
Definition: animation_state_machine.gsh:22
‪MARGWA_HEAD_OPEN_MAX
‪#define MARGWA_HEAD_OPEN_MAX
Definition: margwa.gsh:59
‪MARGWA_HEAD_LEFT_CLIENTFIELD
‪#define MARGWA_HEAD_LEFT_CLIENTFIELD
Definition: margwa.gsh:140
‪margwaShouldWait
‪function private margwaShouldWait(entity)
Definition: margwa.gsc:461
‪CreateBlackBoardForEntity
‪function CreateBlackBoardForEntity(entity)
Definition: blackboard.gsc:77
‪margwaTeleportOutTerminate
‪function private margwaTeleportOutTerminate(entity)
Definition: margwa.gsc:648
‪MARGWA_JAW_HEAD_M_EXPLODE
‪#define MARGWA_JAW_HEAD_M_EXPLODE
Definition: margwa.gsh:183
‪MARGWA_HEAD_KILLED_MID
‪#define MARGWA_HEAD_KILLED_MID
Definition: margwa.gsh:171
‪MARGWA_PAIN_CLOSE_TIME
‪#define MARGWA_PAIN_CLOSE_TIME
Definition: margwa.gsh:66
‪MARGWA_FX_OUT_CLIENTFIELD
‪#define MARGWA_FX_OUT_CLIENTFIELD
Definition: margwa.gsh:147
‪MARGWA_HEAD_RIGHT
‪#define MARGWA_HEAD_RIGHT
Definition: blackboard.gsh:198
‪InitMargwaBehaviorsAndASM
‪function private InitMargwaBehaviorsAndASM()
Definition: margwa.gsc:100
‪MARGWA_MODEL_HEAD_LEFT
‪#define MARGWA_MODEL_HEAD_LEFT
Definition: margwa.gsh:9
‪MARGWA_HEAD_LEFT_HIT_CLIENTFIELD
‪#define MARGWA_HEAD_LEFT_HIT_CLIENTFIELD
Definition: margwa.gsh:165
‪MARGWA_FX_TRAVEL_TELL_CLIENTFIELD
‪#define MARGWA_FX_TRAVEL_TELL_CLIENTFIELD
Definition: margwa.gsh:149
‪margwaTeleportOutStart
‪function private margwaTeleportOutStart(entity)
Definition: margwa.gsc:633
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪MARGWA_HEAD_KILLED_CLIENTFIELD
‪#define MARGWA_HEAD_KILLED_CLIENTFIELD
Definition: margwa.gsh:169
‪MARGWA_HEAD_RIGHT_CLIENTFIELD
‪#define MARGWA_HEAD_RIGHT_CLIENTFIELD
Definition: margwa.gsh:142
‪ASM_MARGWA_BODYFALL_NOTETRACK
‪#define ASM_MARGWA_BODYFALL_NOTETRACK
Definition: margwa.gsh:71
‪margwaShouldSpawn
‪function private margwaShouldSpawn(entity)
Definition: margwa.gsc:421
‪MARGWA_SINGLE_HEAD_CLOSE_MIN
‪#define MARGWA_SINGLE_HEAD_CLOSE_MIN
Definition: margwa.gsh:63
‪MARGWA_TELEPORT_OFF
‪#define MARGWA_TELEPORT_OFF
Definition: margwa.gsh:123
‪RequestState
‪function RequestState(entity, stateName)
Definition: animation_state_machine_utility.gsc:8
‪margwaDeathAction
‪function private margwaDeathAction(entity)
Definition: margwa.gsc:565
‪MARGWA_SMASH_ATTACK_START
‪#define MARGWA_SMASH_ATTACK_START
Definition: margwa.gsh:87
‪MARGWA_JAW_TRV_JUMP_UP_36
‪#define MARGWA_JAW_TRV_JUMP_UP_36
Definition: margwa.gsh:200
‪margwaShouldFreeze
‪function private margwaShouldFreeze(entity)
Definition: margwa.gsc:431
‪margwaSwipeAttackAction
‪function private margwaSwipeAttackAction(entity, asmStateName)
Definition: margwa.gsc:516
‪mocompMargwaTeleportTraversalInit
‪function private mocompMargwaTeleportTraversalInit(entity, mocompAnim, mocompAnimBlendOutTime, mocompAnimFlag, mocompDuration)
Definition: margwa.gsc:825
‪margwaCloseHead
‪function private margwaCloseHead(headInfo)
Definition: margwa.gsc:1161
‪BT_REGISTER_ACTION
‪#define BT_REGISTER_ACTION(name, initFunction, updateFunction, terminateFunction)
Definition: behavior.gsh:4
‪ARCHETYPE_MARGWA
‪#define ARCHETYPE_MARGWA
Definition: archetype_shared.gsh:16
‪MARGWA_HEAD_MID_HIT_CLIENTFIELD
‪#define MARGWA_HEAD_MID_HIT_CLIENTFIELD
Definition: margwa.gsh:166
‪margwaReactSwordTerminate
‪function private margwaReactSwordTerminate(entity)
Definition: margwa.gsc:784
‪LOCOMOTION_SPEED_RUN
‪#define LOCOMOTION_SPEED_RUN
Definition: blackboard.gsh:157
‪MARGWA_HEAD
‪#define MARGWA_HEAD
Definition: blackboard.gsh:195
‪MARGWA_SWIPE_DIST_SQ
‪#define MARGWA_SWIPE_DIST_SQ
Definition: margwa.gsh:80
‪MARGWA_HEAD_KILLED_RIGHT
‪#define MARGWA_HEAD_KILLED_RIGHT
Definition: margwa.gsh:172
‪MARGWA_SMASH_ATTACK_DAMAGE
‪#define MARGWA_SMASH_ATTACK_DAMAGE
Definition: margwa.gsh:90
‪margwaReactStunAction
‪function private margwaReactStunAction(entity, asmStateName)
Definition: margwa.gsc:499
‪margwaInitHead
‪function private margwaInitHead(headModel, headTag)
Definition: margwa.gsc:929
‪MARGWA_HEAD_CLOSED
‪#define MARGWA_HEAD_CLOSED
Definition: margwa.gsh:36
‪ZOMBIE_DAMAGEWEAPON_TYPE
‪#define ZOMBIE_DAMAGEWEAPON_TYPE
Definition: blackboard.gsh:189
‪MARGWA_FX_TRAVEL_CLIENTFIELD
‪#define MARGWA_FX_TRAVEL_CLIENTFIELD
Definition: margwa.gsh:148
‪margwaReactSwordStart
‪function private margwaReactSwordStart(entity)
Definition: margwa.gsc:773
‪MARGWA_HEAD_OPEN
‪#define MARGWA_HEAD_OPEN
Definition: margwa.gsh:35
‪margwaPainStart
‪function private margwaPainStart(entity)
Definition: margwa.gsc:674
‪MARGWA_JAW_SWIPE_PLAYER
‪#define MARGWA_JAW_SWIPE_PLAYER
Definition: margwa.gsh:192
‪MARGWA_SMASH_ATTACK_RANGE
‪#define MARGWA_SMASH_ATTACK_RANGE
Definition: margwa.gsh:88
‪margwaShouldReactStun
‪function private margwaShouldReactStun(entity)
Definition: margwa.gsc:391
‪MARGWA_HEAD_EXPLODE_CLIENTFIELD
‪#define MARGWA_HEAD_EXPLODE_CLIENTFIELD
Definition: margwa.gsh:157
‪MARGWA_JAW_TELEPORT_IN
‪#define MARGWA_JAW_TELEPORT_IN
Definition: margwa.gsh:193