‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
raz.gsc
Go to the documentation of this file.
1 
2 #using scripts\shared\ai_shared;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\clientfield_shared;
6 #using scripts\shared\fx_shared;
7 #using scripts\shared\math_shared;
8 #using scripts\shared\scene_shared;
9 #using scripts\shared\spawner_shared;
10 #using scripts\shared\util_shared;
11 #using scripts\shared\visionset_mgr_shared;
12 
13 #using scripts\shared\ai\systems\animation_state_machine_utility;
14 #using scripts\shared\ai\systems\animation_state_machine_notetracks;
15 #using scripts\shared\ai\systems\animation_state_machine_mocomp;
16 #using scripts\shared\ai\archetype_utility;
17 #using scripts\shared\ai\systems\behavior_tree_utility;
18 #using scripts\shared\ai\systems\blackboard;
19 #using scripts\shared\ai\systems\debug;
20 #using scripts\shared\ai\systems\gib;
21 #using scripts\shared\ai\zombie_utility;
22 #using scripts\shared\ai\archetype_mocomps_utility;
23 #using scripts\zm\_zm_behavior; //*! \details **Description:**
24 <br/>Temp - Should ‪use ‪callback functions to keep this shared
25 #using scripts\zm\_zm_spawner;
26 #using scripts\zm\_zm_utility;
27 
28 #using scripts\shared\weapons\_weaponobjects;
29 
30 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
31 #insert scripts\shared\ai\systems\animation_state_machine.gsh;
32 #insert scripts\shared\ai\systems\behavior.gsh;
33 #insert scripts\shared\ai\systems\behavior_tree.gsh;
34 #insert scripts\shared\ai\systems\blackboard.gsh;
35 #insert scripts\shared\ai\systems\gib.gsh;
36 #insert scripts\shared\ai\raz.gsh;
37 #insert scripts\shared\ai\utility.gsh;
38 #insert scripts\shared\shared.gsh;
39 #insert scripts\shared\version.gsh;
40 
41 #define PERK_JUGGERNOG "specialty_armorvest"
42 
43 #precache( "xmodel", RAZ_TORPEDO_MODEL );
44 #precache( "xmodel", RAZ_GUN_MODEL );
45 #precache( "xmodel", RAZ_GUN_CORE_MODEL );
46 #precache( "xmodel", RAZ_HELMET_MODEL );
47 #precache( "xmodel", RAZ_CHEST_ARMOR_MODEL );
48 #precache( "xmodel", RAZ_L_SHOULDER_ARMOR_MODEL );
49 #precache( "xmodel", RAZ_R_THIGH_ARMOR_MODEL );
50 #precache( "xmodel", RAZ_L_THIGH_ARMOR_MODEL );
51 
52 #namespace RazBehavior;
53 
54 function autoexec ‪init()
55 {
56  // INIT BEHAVIORS
58 
59  // INIT BLACKBOARD
61 
62  // INIT RAZ ON SPAWN
64 
75 }
76 
77 function private ‪InitRazBehaviorsAndASM()
78 {
79  // SERVICES
82 
83  // CONDITIONS
86  ‪BT_REGISTER_API( "razShouldShowSpecialPain", &‪RazBehavior::razShouldShowSpecialPain );
87  ‪BT_REGISTER_API( "razShouldShowShieldPain", &‪RazBehavior::razShouldShowShieldPain );
88  ‪BT_REGISTER_API( "razShouldShootGroundTorpedo", &‪RazBehavior::razShouldShootGroundTorpedo );
90  ‪BT_REGISTER_API( "razShouldTraverseWindow", &‪RazBehavior::razShouldTraverseWindow );
91 
92  // ACTIONS
95  ‪BT_REGISTER_API( "razFinishGroundTorpedo", &‪RazBehavior::razFinishGroundTorpedo );
97  ‪BT_REGISTER_API( "razStartTraverseWindow", &‪RazBehavior::razStartTraverseWindow );
98  ‪BT_REGISTER_API( "razFinishTraverseWindow", &‪RazBehavior::razFinishTraverseWindow );
101 
102  // FUNCTIONS
103 
104  // MOCOMPS
105 
106  // NOTETRACKS
108 
109 }
110 
112 {
113  // CREATE BLACKBOARD
115 
116  // USE UTILITY BLACKBOARD
118 
119  // CREATE RAZ BLACKBOARD
120  ‪BB_REGISTER_ATTRIBUTE( ‪GIBBED_LIMBS, "none", undefined );
124  ‪BB_REGISTER_ATTRIBUTE( ‪GIB_LOCATION, RAZ_ARMOR_PAIN_NONE, undefined );
125 
126  // REGISTER ANIMSCRIPTED CALLBACK
127  self.___ArchetypeOnAnimscriptedCallback = &‪ArchetypeRazOnAnimscriptedCallback;
128 
129  // ENABLE DEBUGGING IN ODYSSEY
131 }
132 
133 function private ‪ArchetypeRazOnAnimscriptedCallback( entity )
134 {
135  // UNREGISTER THE BLACKBOARD
136  entity.__blackboard = undefined;
137 
138  // REREGISTER BLACKBOARD
140 
141  if( ‪IS_TRUE( entity.started_running ))
142  {
143  entity.invoke_sprint_time = undefined;
145  }
146 
147  if(!‪IS_TRUE(entity.razHasGunAttached))
148  {
150  }
151 }
152 
153 function private ‪BB_GetShouldTurn()
154 {
155  if( IsDefined( self.should_turn ) && self.should_turn )
156  {
157  return ‪SHOULD_TURN;
158  }
159  return ‪SHOULD_NOT_TURN;
160 }
161 
162 //----------------------------------------------------------------------------------------------------------------------------
163 // NOTETRACK HANDLERS
164 //----------------------------------------------------------------------------------------------------------------------------
165 
166 
167 //----------------------------------------------------------------------------------------------------------------------------
168 // BEHAVIOR TREE
169 //----------------------------------------------------------------------------------------------------------------------------
170 
171 function ‪findNodesService( behaviorTreeEntity )
172 {
173  node = undefined;
174 
175  behaviorTreeEntity.entrance_nodes = [];
176 
177  if( IsDefined( behaviorTreeEntity.find_flesh_struct_string ) )
178  {
179  if ( behaviorTreeEntity.find_flesh_struct_string == "find_flesh" )
180  {
181  return false;
182  }
183 
184  for( i=0; i<level.exterior_goals.size; i++ )
185  {
186  if( IsDefined(level.exterior_goals[i].script_string) && level.exterior_goals[i].script_string == behaviorTreeEntity.find_flesh_struct_string )
187  {
188  node = level.exterior_goals[i];
189  break;
190  }
191  }
192 
193  behaviorTreeEntity.entrance_nodes[behaviorTreeEntity.entrance_nodes.size] = node;
194 
195  assert( IsDefined( node ), "Did not find an entrance node with .script_string:" + behaviorTreeEntity.find_flesh_struct_string+ "!!! [Fix this!]" );
196 
197  behaviorTreeEntity.first_node = node;
198  //behaviorTreeEntity.pushable = false; //turn off pushable
199  behaviorTreeEntity.goalradius = 80;
200 
201  behaviorTreeEntity.mocomp_barricade_offset = GetDvarInt("raz_node_origin_offset", -22);
202  node_origin = node.origin + AnglesToForward(node.angles) * behaviorTreeEntity.mocomp_barricade_offset;
203 
204  behaviorTreeEntity SetGoal( node_origin );
205 
206  // zombie spawned within the entrance
207  if ( ‪zm_behavior::zombieIsAtEntrance( behaviorTreeEntity ) )
208  {
209  behaviorTreeEntity.got_to_entrance = true;
210  }
211 
212  return true;
213  }
214 }
215 
216 function ‪shouldSkipTeardown( entity )
217 {
218  if(‪IS_TRUE(entity.destroying_window))
219  {
220  return true;
221  }
222 
223  if(!isdefined(entity.script_string) || entity.script_string == "find_flesh")
224  {
225  return true;
226  }
227 
228  return false;
229 }
230 
232 {
233  chunks = undefined;
234 
235  if( isdefined(self.first_node) )
236  {
237  chunks = ‪zm_utility::get_non_destroyed_chunks( self.first_node, self.first_node.barrier_chunks);
238  }
239 
240  return chunks;
241 }
242 
243 function private ‪razDestroyWindow( entity, b_destroy_actual_pieces )
244 {
245  if( !‪IS_TRUE(b_destroy_actual_pieces) )
246  {
247  entity.got_to_entrance = false;
248  entity.destroying_window = true;
249  entity ForceTeleport( entity.origin, entity.first_node.angles);
250 
251  chunks = entity ‪razGetNonDestroyedChuncks();
252 
253  if( !isdefined(chunks) || chunks.size == 0 )
254  {
255  entity.jump_through_window = true;
256  entity.jump_through_window_angle = entity.angles;
257  }
258  else
259  {
260  if( ‪IS_TRUE(entity.razHasGunAttached) )
261  {
262  entity.destroy_window_by_torpedo = true;
263  }
264  else
265  {
266  entity.destroy_window_by_melee = true;
267  }
268  }
269  }
270  else
271  {
272  entity.jump_through_window = true;
273  entity.jump_through_window_angle = entity.angles;
274 
275  if( isdefined(entity.first_node) )
276  {
277  chunks = entity ‪razGetNonDestroyedChuncks();
278 
279  if ( isdefined( chunks ) )
280  {
281  for(i = 0; i < chunks.size; i++)
282  {
283  entity.first_node.zbarrier SetZBarrierPieceState( chunks[i], "opening", 0.2 );
284  }
285  }
286  }
287  }
288 }
289 
290 function private ‪razTargetService( entity )
291 {
292  if ( ‪IS_TRUE( entity.ignoreall ) )
293  {
294  return false;
295  }
296 
297  if( ‪IS_TRUE(entity.jump_through_window) )
298  {
299  return false;
300  }
301 
302  if(!zm_behavior::InPlayableArea( entity) && !‪shouldSkipTeardown( entity) )
303  {
304  if(‪IS_TRUE(entity.got_to_entrance))
305  {
306  ‪razDestroyWindow( entity );
307  }
308  else
309  {
311  {
312  return false;
313  }
314 
315  ‪findNodesService( entity );
316  }
317 
318  return false;
319  }
320 
321  if ( level.zombie_poi_array.size > 0 )
322  {
323  zombie_poi = entity ‪zm_utility::get_zombie_point_of_interest( entity.origin );
324 
325  if(isdefined(zombie_poi))
326  {
327  targetPos = GetClosestPointOnNavMesh( zombie_poi[0], ‪RAZ_NAVMESH_RADIUS, ‪RAZ_NAVMESH_BOUNDARY_DIST );
328 
329  entity.zombie_poi = zombie_poi;
330  entity.enemyoverride = zombie_poi;
331 
332  if(isdefined(targetPos) )
333  {
334  self SetGoal( targetPos );
335  }
336  else
337  {
338  self SetGoal( zombie_poi[0] );
339  }
340 
341  return;
342  }
343  else
344  {
345  entity.zombie_poi = undefined;
346  entity.enemyoverride = undefined;
347  }
348  }
349  else
350  {
351  entity.zombie_poi = undefined;
352  entity.enemyoverride = undefined;
353  }
354 
355  player = ‪zombie_utility::get_closest_valid_player( self.origin, self.ignore_player, true );
356 
357  entity.favoriteenemy = player;
358 
359  if( !IsDefined( player ) || player IsNoTarget() )
360  {
361  if( IsDefined( self.ignore_player ) )
362  {
363  if(isDefined(level._should_skip_ignore_player_logic) && [[level._should_skip_ignore_player_logic]]() )
364  {
365  return;
366  }
367  self.ignore_player = [];
368  }
369 
370  self SetGoal( self.origin );
371  return false;
372  }
373  else
374  {
375  targetPos = GetClosestPointOnNavMesh( player.origin, ‪RAZ_NAVMESH_RADIUS, ‪RAZ_NAVMESH_BOUNDARY_DIST );
376  if ( IsDefined( targetPos ) )
377  {
378  entity SetGoal( targetPos );
379  return true;
380  }
381  else
382  {
383  entity SetGoal( entity.origin );
384  return false;
385  }
386  }
387 }
388 
389 function private ‪razSprintService( entity )
390 {
391  if(‪IS_TRUE(entity.started_running))
392  {
393  return false;
394  }
395 
396  if(!isdefined(entity.invoke_sprint_time))
397  {
398  return false;
399  }
400 
401  if(GetTime() > entity.invoke_sprint_time)
402  {
403  entity.invoke_sprint_time = undefined;
404  entity.started_running = true;
405  entity.berserk = true;
406  entity thread ‪razSprintKnockdownZombies();
408  }
409 }
410 
411 
412 //----------------------------------------------------------------------------------------------------------------------------------
413 // CONDITIONS
414 //----------------------------------------------------------------------------------------------------------------------------------
415 function ‪razShouldMelee( entity )
416 {
417  if(‪IS_TRUE(entity.destroy_window_by_melee))
418  {
419  return true;
420  }
421 
422  if( !IsDefined( entity.enemy ) )
423  {
424  return false;
425  }
426 
427  if( DistanceSquared( entity.origin, entity.enemy.origin ) > ‪RAZ_MELEE_DIST_SQ )
428  {
429  return false;
430  }
431 
432  yaw = abs( zombie_utility::getYawToEnemy() );
433  if( ( yaw > ‪RAZ_MELEE_YAW ) )
434  {
435  return false;
436  }
437 
438  return true;
439 }
440 
441 function private ‪razShouldShowPain( entity )
442 {
443  if( ‪IS_TRUE( entity.berserk ) && !‪IS_TRUE( entity.razHasGoneBerserk ) )
444  {
445  return false;
446  }
447 
448  return true;
449 }
450 
451 function private ‪razShouldShowSpecialPain( entity )
452 {
453  gib_location = ‪Blackboard::GetBlackBoardAttribute( entity, ‪GIB_LOCATION );
454 
455  if(gib_location == "right_arm")
456  {
457  return true;
458  }
459 
460  if(!‪razShouldShowPain( entity ))
461  {
462  return false;
463  }
464 
465  if( gib_location == "head" ||
466  gib_location == "arms" ||
467  gib_location == "right_leg" ||
468  gib_location == "left_leg" ||
469  gib_location == "left_arm"
470  )
471  {
472  return true;
473  }
474 
475  return false;
476 }
477 
478 function private ‪razShouldShowShieldPain( entity )
479 {
480  if( isdefined(entity.damageWeapon) && isdefined(entity.damageWeapon.name) )
481  {
482  return ( entity.damageWeapon.name == "dragonshield" );
483  }
484 
485  return false;
486 }
487 
488 function private ‪razShouldGoBerserk( entity )
489 {
490  if( ‪IS_TRUE( entity.berserk ) && !‪IS_TRUE( entity.razHasGoneBerserk ))
491  {
492  return true;
493  }
494 
495  return false;
496 }
497 
498 function private ‪razShouldTraverseWindow( entity )
499 {
500  return ‪IS_TRUE(entity.jump_through_window);
501 }
502 
503 function private ‪razGoneBerserk( entity )
504 {
505  entity.razHasGoneBerserk = true;
506 }
507 
508 function private ‪razStartTraverseWindow( entity )
509 {
510  //entity ClearPath();
511  //entity ForceTeleport( entity.origin, entity.first_node.angles);
512 
513  raz_dir = AnglesToForward( entity.first_node.angles );
514  raz_dir = VectorScale(raz_dir, 100);
515  entity SetGoal( entity.origin + raz_dir );
516 }
517 
518 function private ‪razFinishTraverseWindow( entity )
519 {
520  entity SetGoal( entity.origin );
521  entity.jump_through_window = undefined;
522  entity.first_node = undefined;
523 
524  if( !‪IS_TRUE(entity.completed_emerging_into_playable_area) )
525  {
527  }
528 }
529 
530 function private ‪razTookPain( entity )
531 {
532  //revert back to normal pain
533  ‪Blackboard::SetBlackBoardAttribute(entity, ‪GIB_LOCATION, RAZ_ARMOR_PAIN_NONE);
534 }
535 
536 function private ‪razStartDeath( entity )
537 {
538 
539  entity playsoundontag( "zmb_raz_death", "tag_eye" );
540 
541  if( ‪IS_TRUE( entity.razHasGunAttached ) )
542  {
543  entity Clientfield::Set( ‪RAZ_GUN_DETACH_CLIENTFIELD, 1 );
544  entity.razHasGunAttached = false;
545 
546  entity detach( "c_zom_dlc3_raz_cannon_arm" );
547 
548  entity HidePart( ‪RAZ_GUN_CORE_HIDE_TAG, "", true );
549  entity HidePart( ‪RAZ_GUN_HIDE_TAG );
550 
551  wait 0.05;
552 
553  if(isdefined( entity) )
554  {
556  }
557  }
558 
559  if(isdefined( entity) )
560  {
561  if( ‪IS_TRUE( entity.razHasHelmet ) )
562  {
564  entity HidePart( ‪RAZ_HELMET_TAG, "", true );
565  entity.razHasHelmet = false;
566  }
567 
568  if( ‪IS_TRUE( entity.razHasChestArmor ) )
569  {
571  entity HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_1, "", true );
572  entity HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_2, "", true );
573  entity HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_3, "", true );
574  entity HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_4, "", true );
575  entity HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_5, "", true );
576  entity HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_6, "", true );
577  entity.razHasChestArmor = false;
578  }
579 
580  if( ‪IS_TRUE( entity.razHasLeftShoulderArmor ) )
581  {
583  entity HidePart( ‪RAZ_L_SHOULDER_ARMOR_HIDE_TAG_1, "", true );
584  entity HidePart( ‪RAZ_L_SHOULDER_ARMOR_HIDE_TAG_2, "", true );
585  entity HidePart( ‪RAZ_L_SHOULDER_ARMOR_HIDE_TAG_3, "", true );
586  entity.razHasLeftShoulderArmor = false;
587  }
588 
589  if( ‪IS_TRUE( entity.razHasLeftThighArmor ) )
590  {
592  entity HidePart( ‪RAZ_L_THIGH_ARMOR_HIDE_TAG_1, "", true );
593  entity HidePart( ‪RAZ_L_THIGH_ARMOR_HIDE_TAG_2, "", true );
594  entity.razHasLeftThighArmor = false;
595  }
596 
597  if( ‪IS_TRUE( entity.razHasRightThighArmor ) )
598  {
600  entity HidePart( ‪RAZ_R_THIGH_ARMOR_HIDE_TAG_1, "", true );
601  entity HidePart( ‪RAZ_R_THIGH_ARMOR_HIDE_TAG_2, "", true );
602  entity.razHasRightThighArmor = false;
603  }
604  }
605 }
606 
607 
608 function private ‪razShouldShootGroundTorpedo( entity )
609 {
610  if(‪IS_TRUE(entity.destroy_window_by_torpedo))
611  {
612  return true;
613  }
614 
615  if( !IsDefined( entity.enemy ) )
616  {
617  return false;
618  }
619 
620  if( !‪IS_TRUE( entity.razHasGunAttached ))
621  {
622  return false;
623  }
624 
625  time = GetTime();
626  if( time < entity.next_torpedo_time )
627  {
628  return false;
629  }
630 
631  enemy_dist_sq = DistanceSquared( entity.origin, entity.enemy.origin );
632 
633  if( !(enemy_dist_sq >= ‪RAZ_MIN_TORPEDO_RANGE_SQ && enemy_dist_sq <= ‪RAZ_MAX_TORPEDO_RANGE_SQ && entity ‪razCanSeeTorpedoTarget( entity.enemy )) )
634  {
635  return false;
636  }
637 
638  if( isdefined(entity.check_point_in_enabled_zone ) )
639  {
640  in_enabled_zone = [[entity.check_point_in_enabled_zone]](entity.origin);
641 
642  if(!in_enabled_zone)
643  {
644  return false;
645  }
646  }
647 
648  return true;
649 }
650 
651 function private ‪razCanSeeTorpedoTarget( enemy )
652 {
653  entity = self;
654  origin_point = entity GetTagOrigin( ‪RAZ_TORPEDO_ORIGIN_TAG );
655  target_point = enemy.origin + (0,0,48);
656 
657  forward_vect = AnglesToForward( self.angles );
658  vect_to_enemy = target_point - origin_point;
659 
660  if( VectorDot(forward_vect, vect_to_enemy) <= 0 ) //player behind RAZ
661  {
662  return false;
663  }
664 
665  //Check if the enemy is inside my sight rect range
666  right_vect = AnglesToRight( self.angles );
667 
668  projected_distance = VectorDot(vect_to_enemy, right_vect);
669 
670 
671  /*
672  /#
673  sight_horiz_dist = GetDvarInt("raz_sight_horiz_dist", 50);
674 
675  line( origin_point, origin_point + VectorScale(right_vect, sight_horiz_dist), ( 1, 0, 0 ), 1, false, 100 );
676  line( origin_point, origin_point + VectorScale(right_vect, -sight_horiz_dist), ( 1, 0, 0 ), 1, false, 100 );
677 
678  line( target_point, origin_point + VectorScale(right_vect, projected_distance), ( 0, 1, 0 ), 1, false, 100 );
679 
680  Sphere( origin_point + VectorScale(right_vect, projected_distance), 10, ( 0, 0, 1 ), 1, false,100 );
681 
682  #/
683  */
684 
685  if(abs(projected_distance) > ‪RAZ_TORPEDO_SIGHT_HORIZ_RANGE)
686  {
687  return false;
688  }
689 
690  ‪trace = BulletTrace( origin_point, target_point, false, self );
691 
692  if( ‪trace[ "position" ] === target_point )
693  {
694  return true;
695  }
696 
697  return false;
698 }
699 
700 
701 //----------------------------------------------------------------------------------------------------------------------------------
702 // ACTIONS
703 //----------------------------------------------------------------------------------------------------------------------------------
704 
705 function private ‪razStartMelee( entity )
706 {
707  if( ‪IS_TRUE(entity.destroy_window_by_melee) )
708  {
709  wait 1.1;
710  ‪razDestroyWindow( entity, true);
711  }
712 }
713 
714 function private ‪razFinishMelee( entity )
715 {
716  entity.destroy_window_by_melee = undefined;
717 }
718 
719 function private ‪razFinishGroundTorpedo( entity )
720 {
721  entity.destroy_window_by_torpedo = undefined;
722 
723  entity.next_torpedo_time = GetTime() + ‪RAZ_TORPEDO_COOLDOWN;
724 }
725 
726 function private ‪razNotetrackShootGroundTorpedo( entity )
727 {
728  if( !isdefined( entity.enemy) && !‪IS_TRUE(entity.destroy_window_by_torpedo) )
729  {
730  /#println( "RAZ does not have an enemy to shoot Ground Torpedo at" );#/
731  return;
732  }
733 
734  if(‪IS_TRUE(entity.destroy_window_by_torpedo))
735  {
736  ‪razDestroyWindow( entity, true);
737 
738  raz_dir = AnglesToForward( entity.first_node.angles );
739  entity ‪razShootGroundTorpedo( entity.first_node, VectorScale(raz_dir, 100) + (0 , 0, 48) );
740  }
741  else
742  {
743  entity ‪razShootGroundTorpedo( entity.enemy, (0, 0, 48) );
744  }
745 
746  entity.next_torpedo_time = GetTime() + ‪RAZ_TORPEDO_COOLDOWN;
747 }
748 
749 //----------------------------------------------------------------------------------------------------------------------------------
750 // Ground Torpedo
751 //----------------------------------------------------------------------------------------------------------------------------------
752 function private ‪razTorpedoLaunchDirection( forward_dir, torpedo_pos, torpedo_target_pos, max_angle)
753 {
754  vec_to_enemy = torpedo_target_pos - torpedo_pos;
755  vec_to_enemy_normal = VectorNormalize(vec_to_enemy);
756 
757  angle_to_enemy = VectorDot(forward_dir, vec_to_enemy_normal);
758 
759  if( angle_to_enemy >= max_angle )
760  {
761  return vec_to_enemy_normal;
762  }
763 
764  //enemy outside our range, let's get the vector near the age of our maximum spectrum facing the enemy
765  //Algorithm is to get a perpendicular vector to the forward_dir on the to enemy plane, then use te angle to get the vector on the border
766 
767  plane_normal = VectorCross(forward_dir, vec_to_enemy_normal);
768  perpendicular_normal = VectorCross(plane_normal, forward_dir);
769 
770  torpedo_dir = forward_dir * cos(max_angle) + perpendicular_normal * sin(max_angle);
771 
772  return torpedo_dir;
773 }
774 
775 function private ‪razShootGroundTorpedo( torpedo_target, torpedo_target_offset )
776 {
777  // self is the RAZ shooting the torpedo
778  torpedo_pos = self GetTagOrigin( ‪RAZ_TORPEDO_ORIGIN_TAG );
779  torpedo_target_pos = torpedo_target.origin + torpedo_target_offset;
780  torpedo = ‪Spawn( "script_model", torpedo_pos ); //if this number changes, will need to update razCanSeeTorpedoTarget function to account for it
781  torpedo SetModel( ‪RAZ_TORPEDO_MODEL );
783  torpedo.torpedo_trail_iterations = 0;
784  torpedo.raz_torpedo_owner = self; //used for determining damage so RAZ is immune to own torpedoes
785 
786  //Torpedo starting direction
787  vec_to_enemy = ‪razTorpedoLaunchDirection(AnglesToForward(self.angles), torpedo_pos, torpedo_target_pos, ‪RAZ_TORPEDO_MAX_LAUNCH_ANGLE);
788  angles_to_enemy = VectorToAngles( vec_to_enemy );
789  torpedo.angles = angles_to_enemy;
790  normal_vector = VectorNormalize( vec_to_enemy );
791  torpedo.torpedo_old_normal_vector = normal_vector;
792  torpedo.knockdown_iterations = 0;
793 
795  max_trail_iterations = Int( ‪RAZ_MAX_TORPEDO_RANGE / iteration_move_distance );
796 
797  torpedo thread ‪razTorpedoKnockdownZombies( torpedo_target );
798  torpedo thread ‪razTorpedoDetonateIfCloseToTarget( torpedo_target, torpedo_target_offset );
799 
800  while( isDefined( torpedo ))
801  {
802  if( !isdefined( torpedo_target) || torpedo.torpedo_trail_iterations >= max_trail_iterations )
803  {
804  torpedo thread ‪razTorpedoDetonate( 0 );
805  }
806  else
807  {
808  torpedo ‪razTorpedoMoveToTarget( torpedo_target );
809 // torpedo razTorpedoPlayTrailEffect();
810  torpedo.torpedo_trail_iterations += 1;
811  }
812 
814  }
815 }
816 
817 function private ‪razTorpedoDetonateIfCloseToTarget( torpedo_target, torpedo_target_offset )
818 {
819  self endon( "death" );
820  self endon( "detonated" );
821  torpedo = self;
822 
823  While( isdefined( torpedo) && isdefined( torpedo_target ))
824  {
825  torpedo_target_pos = torpedo_target.origin + torpedo_target_offset;
826 
827  if( DistanceSquared( torpedo.origin, torpedo_target_pos ) <= ‪RAZ_TORPEDO_DETONATION_DIST_SQ )
828  {
829  torpedo thread ‪razTorpedoDetonate( 0 );
830  }
831 
832 
834  }
835 }
836 
837 function private ‪razTorpedoMoveToTarget( torpedo_target )
838 {
839  self endon( "death" );
840  self endon( "detonated" );
841 
842  if( !isDefined( self.torpedo_max_yaw_cos ) )
843  {
845  self.torpedo_max_yaw_cos = Cos( torpedo_yaw_per_interval );
846  }
847 
848  if( isDefined( self.torpedo_old_normal_vector ) )
849  {
850  torpedo_target_point = torpedo_target.origin + (0,0, 48); //if this number changes, will need to update razCanSeeTorpedoTarget function to account for it
851  if( isPlayer( torpedo_target ))
852  {
853  torpedo_target_point = torpedo_target GetPlayerCameraPos();
854  }
855  vector_to_target = torpedo_target_point - self.origin;
856  normal_vector = VectorNormalize( vector_to_target );
857 
858  flat_mapped_normal_vector = VectorNormalize( (normal_vector[0], normal_vector[1], 0) );
859  flat_mapped_old_normal_vector = VectorNormalize( (self.torpedo_old_normal_vector[0], self.torpedo_old_normal_vector[1], 0) );
860  dot = VectorDot( flat_mapped_normal_vector, flat_mapped_old_normal_vector );
861 
862  if( dot >= 1 )
863  {
864  dot = 1;
865  }
866  else if( dot <= -1 )
867  {
868  dot = -1;
869  }
870 
871  if( dot < self.torpedo_max_yaw_cos )
872  {
873  new_vector = normal_vector - self.torpedo_old_normal_vector;
874  angle_between_vectors = Acos( dot );
875 
876  if( !isDefined( angle_between_vectors ))// in case dot product is -1, Acos returns undefined
877  {
878  angle_between_vectors = 180;
879  }
880 
881  if(angle_between_vectors == 0)
882  {
883  angle_between_vectors = 0.0001;
884  }
885 
886 
888  ratio = max_angle_per_interval / angle_between_vectors;
889 
890  if(ratio > 1)
891  {
892  ratio = 1;
893  }
894 
895  new_vector = new_vector * ratio;
896  new_vector = new_vector + self.torpedo_old_normal_vector;
897  normal_vector = VectorNormalize( new_vector );
898  }
899  else
900  {
901  normal_vector = self.torpedo_old_normal_vector;
902  }
903  }
904 
906  move_vector = move_distance * normal_vector;
907 
908  move_to_point = self.origin + move_vector;
909 // terrain_check_offset_high = (0,0,RAZ_TORPEDO_TERRAIN_CHECK_OFFSET - RAZ_TORPEDO_GROUND_OFFSET);
910 // terrain_check_offset_low = (0,0,RAZ_TORPEDO_TERRAIN_CHECK_OFFSET + RAZ_TORPEDO_GROUND_OFFSET);
911 // trace = BulletTrace( move_to_point + terrain_check_offset_high, move_to_point - terrain_check_offset_low, false, self );
912 //
913 // if( trace[ "surfacetype" ] !== "none" )
914 // {
915 // move_to_point = trace[ "position" ] + (0,0,RAZ_TORPEDO_GROUND_OFFSET );
916 // }
917 
918  ‪trace = BulletTrace( self.origin, move_to_point, false, self );
919  if( ‪trace[ "surfacetype" ] !== "none" )
920  {
921  detonate_point = ‪trace[ "position" ];
922 
923  dist_sq = DistanceSquared( detonate_point, self.origin );
924  move_dist_sq = move_distance * move_distance;
925  ratio = dist_sq / move_dist_sq;
927 
928  self thread ‪razTorpedoDetonate( ‪delay );
929  }
930 
931 
932  self.torpedo_old_normal_vector = normal_vector;
933 
934  self MoveTo( move_to_point, ‪RAZ_TORPEDO_MOVE_INTERVAL_TIME );
935 }
936 
938 {
939  self endon( "death" );
940  self endon( "detonated" );
941 
942  surface_check_offset = ‪RAZ_TORPEDO_GROUND_OFFSET + 10;
943  if( self.torpedo_trail_iterations >= 1 )
944  {
945  ‪trace = BulletTrace( self.origin + (0,0,10), self.origin - (0,0,surface_check_offset), false, self );
946  if( ‪trace[ "surfacetype" ] !== "none" )
947  {
949  }
950  }
951 }
952 
953 function private ‪razKnockdownZombies( target )
954 {
955  self endon( "death" );
956 
957  While( isDefined( self ))
958  {
959  if(isdefined(target)) //Torpedo
960  {
961  if( IsPlayer( target ) )
962  {
963  torpedo_target_position = target.origin + ( 0,0,48 );
964  }
965  else
966  {
967  torpedo_target_position = target.origin;
968  }
969 
970  prediction_time = 0.3;
971 
972  // gradually increase prediction time to catch zombies right in front of raz in knockdown from torpedo
973  if( isDefined( self.knockdown_iterations ) && self.knockdown_iterations < 3 )
974  {
975  if( self.knockdown_iterations == 0 )
976  {
977  prediction_time = 0.075;
978  }
979 
980  if( self.knockdown_iterations == 1 )
981  {
982  prediction_time = 0.15;
983  }
984 
985  if( self.knockdown_iterations == 2 )
986  {
987  prediction_time = 0.225;
988  }
989  }
990 
991  self.knockdown_iterations += 1;
992 
993  vector_to_target = torpedo_target_position - self.origin;
994  normal_vector = VectorNormalize( vector_to_target );
995  move_distance = ‪RAZ_TORPEDO_VELOCITY * prediction_time;
996  move_vector = move_distance * normal_vector;
997 
998  self.angles = VectorToAngles( move_vector );
999  }
1000  else //Raz
1001  {
1002  velocity = self GetVelocity();
1003  velocityMag = Length(velocity);
1004 
1005  b_sprinting = velocityMag >= 40;
1006 
1007  if(b_sprinting)
1008  {
1009  predict_time = 0.2;
1010  move_vector = velocity * predict_time;
1011  }
1012  }
1013 
1014 
1015  if(!isdefined(b_sprinting) || b_sprinting == true)
1016  {
1017  predicted_pos = self.origin + move_vector;
1018 
1019 // /#
1020 // thread util::debug_sphere(predicted_pos,48,(0,0,1),0.5,200);
1021 // #/
1022 
1023  a_zombies = GetAIArchetypeArray( ‪ARCHETYPE_ZOMBIE );
1024  a_filtered_zombies = array::filter( a_zombies, false, &‪razZombieEligibleForKnockdown, self, predicted_pos );
1025  }
1026  else
1027  {
1028  wait 0.2;
1029  continue;
1030  }
1031 
1032  if( a_filtered_zombies.size > 0 )
1033  {
1034 
1035 
1036  foreach( zombie in a_filtered_zombies )
1037  {
1038  zombie.knockdown = true;
1039  zombie.knockdown_type = ‪KNOCKDOWN_SHOVED;
1040  zombie_to_target = self.origin - zombie.origin;
1041  zombie_to_target_2d = VectorNormalize( ( zombie_to_target[0], zombie_to_target[1], 0 ) );
1042 
1043  zombie_forward = AnglesToForward( zombie.angles );
1044  zombie_forward_2d = VectorNormalize( ( zombie_forward[0], zombie_forward[1], 0 ) );
1045 
1046  zombie_right = AnglesToRight( zombie.angles );
1047  zombie_right_2d = VectorNormalize( ( zombie_right[0], zombie_right[1], 0 ) );
1048 
1049  dot = VectorDot( zombie_to_target_2d, zombie_forward_2d );
1050 
1051  if( dot >= 0.5 )
1052  {
1053  zombie.knockdown_direction = "front";
1054  zombie.getup_direction = ‪GETUP_BACK;
1055  }
1056  else if ( dot < 0.5 && dot > -0.5 )
1057  {
1058  dot = VectorDot( zombie_to_target_2d, zombie_right_2d );
1059  if( dot > 0 )
1060  {
1061  zombie.knockdown_direction = "right";
1062 
1063  if ( ‪math::cointoss() )
1064  {
1065  zombie.getup_direction = ‪GETUP_BACK;
1066  }
1067  else
1068  {
1069  zombie.getup_direction = ‪GETUP_BELLY;
1070  }
1071  }
1072  else
1073  {
1074  zombie.knockdown_direction = "left";
1075  zombie.getup_direction = ‪GETUP_BELLY;
1076  }
1077  }
1078  else
1079  {
1080  zombie.knockdown_direction = "back";
1081  zombie.getup_direction = ‪GETUP_BELLY;
1082  }
1083  }
1084  }
1085  wait 0.2;
1086  }
1087 }
1088 
1089 function private ‪razTorpedoKnockdownZombies( torpedo_target )
1090 {
1091  self endon( "death" );
1092  self endon( "detonated" );
1093 
1094  ‪razKnockdownZombies( torpedo_target );
1095 }
1096 
1098 {
1099  self endon( "death" );
1100 
1101  self notify("razSprintKnockdownZombies");
1102  self endon("razSprintKnockdownZombies");
1103 
1105 }
1106 
1107 
1108 function private ‪razTorpedoDetonate( ‪delay )
1109 {
1110  self notify( "detonated" );
1111 
1112  torpedo = self;
1113  raz_torpedo_owner = self.raz_torpedo_owner;
1114 
1115  if( ‪delay > 0 )
1116  {
1117  wait ‪delay;
1118  }
1119 
1120  if( isdefined( self ) )
1121  {
1123 
1124  w_weapon = GetWeapon( "none" );
1125  explosion_point = torpedo.origin;
1127  RadiusDamage( explosion_point + ( 0,0,18 ), ‪RAZ_TORPEDO_BLAST_RADIUS, ‪RAZ_TORPEDO_BLAST_INNER_DAMAGE, ‪RAZ_TORPEDO_BLAST_OUTER_DAMAGE, self.raz_torpedo_owner, "MOD_UNKNOWN", w_weapon );
1128  ‪razApplyTorpedoDetonationPushToPlayers( explosion_point + ( 0,0,18 ) );
1130  wait 0.05;
1131 
1132 
1133  if( isdefined( raz_torpedo_owner ) && ‪IS_TRUE( level.b_raz_ignore_mangler_cooldown ))
1134  {
1135  raz_torpedo_owner.next_torpedo_time = GetTime();
1136  }
1137 
1138  if ( isdefined( self ) )
1139  {
1140  self Delete();
1141  }
1142  }
1143 
1144 }
1145 
1146 function private ‪razApplyTorpedoDetonationPushToPlayers( torpedo_origin )
1147 {
1148  players = GetPlayers();
1149 
1150  v_length = ‪SQR(100);
1151 
1152  for( i = 0; i < players.size; i++ )
1153  {
1154  player = players[i];
1155 
1156  if( !IsAlive( player ) )
1157  {
1158  continue;
1159  }
1160 
1161  if( player.sessionstate == "spectator" )
1162  {
1163  continue;
1164  }
1165 
1166  if( player.sessionstate == "intermission" )
1167  {
1168  continue;
1169  }
1170 
1171  if( ‪IS_TRUE( player.ignoreme ) )
1172  {
1173  continue;
1174  }
1175 
1176  if( player IsNoTarget() )
1177  {
1178  continue;
1179  }
1180 
1181  if ( !player IsOnGround() )
1182  {
1183  continue;
1184  }
1185 
1186 
1187  n_distance = Distance2DSquared( torpedo_origin, player.origin );
1188 
1189  if( n_distance < 0.01 )
1190  {
1191  continue;
1192  }
1193 
1194  if( n_distance < v_length)
1195  {
1196  v_dir = player.origin - torpedo_origin;
1197  v_dir = (v_dir[0], v_dir[1], 0.1);
1198  v_dir = VectorNormalize( v_dir );
1199 
1200  n_push_strength = GetDvarInt("raz_n_push_strength", 500);
1201  n_push_strength = 200 + RandomInt( n_push_strength - 200 );
1202 
1203  v_player_velocity = player GetVelocity();
1204  player SetVelocity( v_player_velocity + (v_dir * n_push_strength) );
1205  }
1206  }
1207 }
1208 
1210 {
1211  Earthquake( 0.4, 0.8, self.origin, 300 );
1212 
1213  for(i = 0;i < level.activeplayers.size; i++)
1214  {
1215  distanceSq = DistanceSquared(self.origin, level.activeplayers[i].origin + (0, 0, 48));
1216 
1217  if(distanceSq > ‪RAZ_TORPEDO_DETONATION_DIST_SQ)
1218  {
1219  continue;
1220  }
1221 
1222  //Apply effects
1223  level.activeplayers[i] playrumbleonentity("damage_heavy");
1224  }
1225 }
1226 
1227 function private ‪razZombieEligibleForKnockdown( zombie, target, predicted_pos )
1228 {
1229  if( zombie.knockdown === true )
1230  {
1231  return false;
1232  }
1233 
1235  {
1236  return false;
1237  }
1238 
1239  knockdown_dist = 48;
1240  check_pos = zombie.origin;
1241 
1242  if( !isActor( target ))
1243  {
1244  check_pos = zombie GetCentroid();
1245  knockdown_dist = 64;
1246  }
1247 
1248  knockdown_dist_sq = knockdown_dist * knockdown_dist;
1249  dist_sq = DistanceSquared( predicted_pos, check_pos );
1250 
1251  if( dist_sq > knockdown_dist_sq )
1252  {
1253  return false;
1254  }
1255 
1256  origin = target.origin;
1257 
1258  facing_vec = AnglesToForward( target.angles );
1259  enemy_vec = zombie.origin - origin;
1260 
1261  enemy_yaw_vec = (enemy_vec[0], enemy_vec[1], 0);
1262  facing_yaw_vec = (facing_vec[0], facing_vec[1], 0);
1263 
1264  enemy_yaw_vec = VectorNormalize( enemy_yaw_vec );
1265  facing_yaw_vec = VectorNormalize( facing_yaw_vec );
1266 
1267  enemy_dot = VectorDot( facing_yaw_vec, enemy_yaw_vec );
1268 
1269  if( enemy_dot < 0 )
1270  {
1271  return false;
1272  }
1273 
1274  return true;
1275 
1276 }
1277 
1278 
1279 
1280 #namespace razServerUtils;
1281 
1282 function private ‪razSpawnSetup()
1283 {
1284  self.invoke_sprint_time = GetTime() + ‪RAZ_INVOKE_SPRINT_TIME;
1285  self.next_torpedo_time = GetTime();
1286  self.razHasGunAttached = true;
1287  self.razHasHelmet = true;
1288  self.razHasLeftShoulderArmor = true;
1289  self.razHasChestArmor = true;
1290  self.razHasRightThighArmor = true;
1291  self.razHasLeftThighArmor = true;
1292  self.razHasGoneBerserk = false;
1293  if( !isDefined( level.razGunHealth ) )
1294  {
1295  level.razGunHealth = ‪RAZ_GUN_HEALTH_DEFAULT;
1296  }
1297  if( !isDefined( level.razMaxHealth ) )
1298  {
1299  level.razMaxHealth = self.health;
1300  }
1301  if( !isDefined( level.razHelmetHealth ))
1302  {
1303  level.razHelmetHealth = ‪RAZ_DEFAULT_HELMET_HEALTH;
1304  }
1305  if( !isDefined( level.razLeftShoulderArmorHealth ))
1306  {
1307  level.razLeftShoulderArmorHealth = ‪RAZ_DEFAULT_L_SHOULDER_ARMOR_HEALTH;
1308  }
1309  if( !isDefined( level.razChestArmorHealth ))
1310  {
1311  level.razChestArmorHealth = ‪RAZ_DEFAULT_CHEST_ARMOR_HEALTH;
1312  }
1313  if( !isDefined( level.razThighArmorHealth ))
1314  {
1315  level.razThighArmorHealth = ‪RAZ_DEFAULT_THIGH_ARMOR_HEALTH;
1316  }
1317  self.maxHealth = level.razMaxHealth;
1318  self.razGunHealth = level.razGunHealth;
1319  self.razHelmetHealth = level.razHelmetHealth;
1320  self.razChestArmorHealth = level.razChestArmorHealth;
1321  self.razRightThighHealth = level.razThighArmorHealth;
1322  self.razLeftThighHealth = level.razThighArmorHealth;
1323  self.razLeftShoulderArmorHealth = level.razLeftShoulderArmorHealth;
1324 
1325  self.canBeTargetedByTurnedZombies= true;
1326  self.no_widows_wine = true;
1327  self.flame_fx_timeout = 3;
1328 
1329  AiUtility::AddAiOverrideDamageCallback( self, &‪razServerUtils::razDamageCallback );
1330 
1331  self thread ‪razGibZombiesOnMelee();
1332 
1333 }
1334 
1335 function private ‪razGibZombiesOnMelee()
1336 {
1337  self endon("death");
1338  self endon("disconnect");
1339 
1340  while(true)
1341  {
1342  self waittill("melee_fire");
1343  a_zombies = GetAIArchetypeArray( ‪ARCHETYPE_ZOMBIE );
1344 
1345  foreach( zombie in a_zombies )
1346  {
1347  if(‪IS_TRUE(zombie.no_gib))
1348  continue;
1349 
1350  heightDiff = abs(zombie.origin[2] - self.origin[2]);
1351 
1352  if(heightDiff > 50)
1353  continue;
1354 
1355  distance2DSq = Distance2DSquared(zombie.origin, self.origin);
1356 
1357  if( distance2DSq > ‪SQR(90) )
1358  continue;
1359 
1360  raz_forward = AnglesToForward( self.angles );
1361  vect_to_enemy = zombie.origin - self.origin;
1362 
1363  if( VectorDot(raz_forward, vect_to_enemy) <= 0 ) //zombie behind RAZ
1364  {
1365  continue;
1366  }
1367 
1368  //Check if the zombie is inside my sight rect range
1369  right_vect = AnglesToRight( self.angles );
1370 
1371  projected_distance = VectorDot(vect_to_enemy, right_vect);
1372 
1373  if(abs(projected_distance) > 35)
1374  {
1375  continue;
1376  }
1377 
1378  b_gibbed = false;
1379 
1380  val = randomint( 100 );
1381  if( val > 50 )
1382  {
1384  b_gibbed = true;
1385  }
1386 
1387  val = randomint( 100 );
1388  if( val > 50 )
1389  {
1391  {
1393  b_gibbed = true;
1394  }
1395  }
1396 
1397  val = randomint( 100 );
1398  if( val > 50 )
1399  {
1401  {
1403  b_gibbed = true;
1404  }
1405  }
1406 
1407  if( !‪IS_TRUE(b_gibbed) )
1408  {
1410  {
1412  }
1414  {
1416  }
1417  else
1418  {
1420  }
1421  }
1422  }
1423  }
1424 }
1425 
1427 {
1428  if( !‪IS_TRUE( self.razHasGunAttached ))
1429  {
1430  self HidePart( ‪RAZ_GUN_CORE_HIDE_TAG, "", true );
1431  self HidePart( ‪RAZ_GUN_HIDE_TAG );
1432  }
1433 
1434  if( !‪IS_TRUE( self.razHasChestArmor ))
1435  {
1436  self HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_1, "", true );
1437  self HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_2, "", true );
1438  self HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_3, "", true );
1439  self HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_4, "", true );
1440  self HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_5, "", true );
1441  self HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_6, "", true );
1442  }
1443 
1444  if( !‪IS_TRUE( self.razHasLeftShoulderArmor ))
1445  {
1446  self HidePart( ‪RAZ_L_SHOULDER_ARMOR_HIDE_TAG_1, "", true );
1447  self HidePart( ‪RAZ_L_SHOULDER_ARMOR_HIDE_TAG_2, "", true );
1448  self HidePart( ‪RAZ_L_SHOULDER_ARMOR_HIDE_TAG_3, "", true );
1449  }
1450 
1451  if( !‪IS_TRUE( self.razHasRightThighArmor ))
1452  {
1453  self HidePart( ‪RAZ_R_THIGH_ARMOR_HIDE_TAG_1, "", true );
1454  self HidePart( ‪RAZ_R_THIGH_ARMOR_HIDE_TAG_2, "", true );
1455  }
1456 
1457  if( !‪IS_TRUE( self.razHasLeftThighArmor ))
1458  {
1459  self HidePart( ‪RAZ_L_THIGH_ARMOR_HIDE_TAG_1, "", true );
1460  self HidePart( ‪RAZ_L_THIGH_ARMOR_HIDE_TAG_2, "", true );
1461  }
1462 
1463  if( !‪IS_TRUE( self.razHasHelmet ) )
1464  {
1465  self HidePart( ‪RAZ_HELMET_TAG, "", true );
1466  }
1467 }
1468 
1469 function private ‪razDamageCallback( inflictor, attacker, ‪damage, dFlags, mod, weapon, point, dir, hitLoc, offsetTime, boneIndex, modelIndex )
1470 {
1471  entity = self;
1472 
1473  entity.last_damage_hit_armor = false;
1474 
1475  if( isDefined( attacker ) && attacker == entity )
1476  {
1477  return 0;
1478  }
1479 
1480  if( mod !== "MOD_PROJECTILE_SPLASH" )
1481  {
1482  if( ‪IS_TRUE( entity.razHasGunAttached ))
1483  {
1484  b_hit_shoulder_weakpoint = ‪raz_check_for_location_hit( entity, hitloc, point, "right_arm_upper", ‪RAZ_GUN_TAG_HIT_RADIUS_SQ, ‪RAZ_R_SHOULDER_WEAKSPOT_TAG );
1485 
1486  if ( ‪IS_TRUE( b_hit_shoulder_weakpoint ))
1487  {
1488  entity ‪razTrackGunDamage( ‪damage, attacker ); // PORTIZ: passing attacker to award credit for RAZ arm destroying challenge
1489 
1491 
1492  if( !‪IS_TRUE(entity.razHasGunAttached)) //if the damage pops the gun off, either kill RAZ, or reduce him to a percentage of his max health
1493  {
1494  post_hit_health = entity.health - ‪damage;
1495  gun_detach_damage = entity.maxHealth * ‪RAZ_GUN_DETACH_DAMAGE_HEALTH_PERCENT;
1496  post_hit_health_percent = ( post_hit_health - gun_detach_damage ) / entity.maxHealth;
1497 
1498  // If his health is greater than the max health post-detach, reduce health to max health post-detach
1499  if( post_hit_health_percent > ‪RAZ_GUN_DETACH_HEALTH_PERCENT_MAX )
1500  {
1501  return( entity.health - ( entity.maxHealth * ‪RAZ_GUN_DETACH_HEALTH_PERCENT_MAX ) );
1502  }
1503  else
1504  {
1505  return gun_detach_damage;
1506  }
1507  }
1508 
1509  return ‪damage;
1510  }
1511  }
1512 
1513  if( ‪IS_TRUE( entity.razHasChestArmor ))
1514  {
1515  b_hit_chest = ‪raz_check_for_location_hit( entity, hitloc, point, "torso_upper", ‪RAZ_CHEST_ARMOR_HIT_RADIUS_SQ, ‪RAZ_CHEST_ARMOR_HIT_TAG );
1516 
1517  if( b_hit_chest || hitloc === "torso_lower" || hitloc === "torso_mid" )
1518  {
1520  entity.last_damage_hit_armor = true;
1522  return ‪damage;
1523  }
1524  }
1525 
1526  if( ‪IS_TRUE( entity.razHasLeftShoulderArmor ))
1527  {
1528  b_hit_l_shoulder_armor = ‪raz_check_for_location_hit( entity, hitloc, point, "left_arm_upper", ‪RAZ_L_SHOUDLER_ARMOR_HIT_RADIUS_SQ, ‪RAZ_L_SHOULDER_ARMOR_HIT_TAG );
1529 
1530  if( b_hit_l_shoulder_armor )
1531  {
1533  entity.last_damage_hit_armor = true;
1535  return ‪damage;
1536  }
1537  }
1538 
1539  if( ‪IS_TRUE( entity.razHasRightThighArmor ))
1540  {
1541  b_hit_r_thigh_armor = ‪raz_check_for_location_hit( entity, hitloc, point, "right_leg_upper", ‪RAZ_R_THIGH_ARMOR_HIT_RADIUS_SQ, ‪RAZ_R_THIGH_ARMOR_HIT_TAG );
1542 
1543  if( b_hit_r_thigh_armor )
1544  {
1546  entity.last_damage_hit_armor = true;
1548  return ‪damage;
1549  }
1550  }
1551 
1552  if( ‪IS_TRUE( entity.razHasLeftThighArmor ))
1553  {
1554  b_hit_l_thigh_armor = ‪raz_check_for_location_hit( entity, hitloc, point, "left_leg_upper", ‪RAZ_L_THIGH_ARMOR_HIT_RADIUS_SQ, ‪RAZ_L_THIGH_ARMOR_HIT_TAG );
1555 
1556  if( b_hit_l_thigh_armor )
1557  {
1559  entity.last_damage_hit_armor = true;
1561  return ‪damage;
1562  }
1563  }
1564 
1565 
1566  if( ‪IS_TRUE( entity.razHasHelmet ) )
1567  {
1568  b_hit_head = ‪raz_check_for_location_hit( entity, hitloc, point, "head", ‪RAZ_HELMET_HIT_RADIUS_SQ, ‪RAZ_HELMET_HIT_TAG );
1569 
1570  if( b_hit_head || hitloc === "neck" || hitloc === "helmet" )
1571  {
1572  entity ‪razTrackHelmetDamage( ‪damage, attacker ); // PORTIZ: passing attacker to award credit for RAZ mask destroying challenge
1573  entity.last_damage_hit_armor = true;
1575  return ‪damage;
1576  }
1577  }
1578 
1579  }
1580 
1581  return ‪damage;
1582 }
1583 
1584 function private ‪raz_check_for_location_hit( entity, hitloc, point, location, hit_radius_sq, tag )
1585 {
1586  b_hit_location = false;
1587 
1588  if ( isDefined( hitloc) && hitloc != "none" )
1589  {
1590  if ( hitLoc == location )
1591  {
1592  b_hit_location = true;
1593  }
1594  }
1595  else
1596  {
1597  dist_sq = DistanceSquared( point, entity GetTagOrigin( tag ));
1598 
1599  if( dist_sq <= hit_radius_sq )
1600  {
1601  b_hit_location = true;
1602  }
1603  }
1604 
1605  return b_hit_location;
1606 }
1607 
1608 function private ‪razTrackGunDamage( ‪damage, attacker )
1609 {
1610  entity = self;
1611  entity.razGunHealth = entity.razGunHealth - ‪damage;
1612 
1613  post_hit_health = entity.health - ‪damage;
1614  post_hit_health_percent = post_hit_health / entity.maxHealth;
1615 
1616  if( entity.razGunHealth > 0 )
1617  {
1618  entity Clientfield::Increment( ‪RAZ_GUN_WEAKPOINT_HIT_CLIENTFIELD, 1 );
1619  }
1620 
1621  if( entity.razGunHealth <= 0 )
1622  {
1623  entity.razGunHealth = 0;
1624  entity Clientfield::Set( ‪RAZ_GUN_DETACH_CLIENTFIELD, 1 );
1625  entity.razHasGunAttached = false;
1626  entity.invoke_sprint_time = undefined;
1627  entity.started_running = true;
1632 
1633  explosion_max_damage = ‪RAZ_GUN_DETACH_EXPLOSION_DAMAGE_MAX * entity.maxHealth;
1634  explosion_min_damage = ‪RAZ_GUN_DETACH_EXPLOSION_DAMAGE_MIN * entity.maxHealth;
1635 
1636  weapon = GetWeapon( "raz_melee" );
1637 
1638  RadiusDamage( self.origin + (0,0,18), ‪RAZ_GUN_DETACH_EXPLOSION_RADIUS, explosion_max_damage, explosion_min_damage, entity, "MOD_PROJECTILE_SPLASH", weapon );
1639 
1640  self detach( "c_zom_dlc3_raz_cannon_arm" );
1641 
1642  self HidePart( ‪RAZ_GUN_CORE_HIDE_TAG, "", true );
1643  self HidePart( ‪RAZ_GUN_HIDE_TAG );
1644 
1646 
1647  level notify( "raz_arm_detach", attacker ); // send notify to be caught by challenge system
1648  self notify( "raz_arm_detach", attacker ); // send notify to be caught by vo/general systems
1649  }
1650 }
1651 
1652 function private ‪razTrackHelmetDamage( ‪damage, attacker )
1653 {
1654  entity = self;
1655 
1656  entity.razHelmetHealth = entity.razHelmetHealth - ‪damage;
1657  if( entity.razHelmetHealth <= 0 )
1658  {
1660  entity HidePart( ‪RAZ_HELMET_TAG, "", true );
1661  entity.razHasHelmet = false;
1663 
1664  level notify( "raz_mask_destroyed", attacker ); //notify for minor EE and challenge
1665  }
1666 }
1667 
1669 {
1670  entity = self;
1671 
1672  entity.razChestArmorHealth = entity.razChestArmorHealth - ‪damage;
1673  if( entity.razChestArmorHealth <= 0 )
1674  {
1676  entity HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_1, "", true );
1677  entity HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_2, "", true );
1678  entity HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_3, "", true );
1679  entity HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_4, "", true );
1680  entity HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_5, "", true );
1681  entity HidePart( ‪RAZ_CHEST_ARMOR_HIDE_TAG_6, "", true );
1682  entity.razHasChestArmor = false;
1683  ‪Blackboard::SetBlackBoardAttribute(entity, ‪GIB_LOCATION, "arms"); //This will trigger the Chest pain
1684  }
1685 }
1686 
1688 {
1689  entity = self;
1690 
1691  entity.razLeftShoulderArmorHealth = entity.razLeftShoulderArmorHealth - ‪damage;
1692  if( entity.razLeftShoulderArmorHealth <= 0 )
1693  {
1695  entity HidePart( ‪RAZ_L_SHOULDER_ARMOR_HIDE_TAG_1, "", true );
1696  entity HidePart( ‪RAZ_L_SHOULDER_ARMOR_HIDE_TAG_2, "", true );
1697  entity HidePart( ‪RAZ_L_SHOULDER_ARMOR_HIDE_TAG_3, "", true );
1698  entity.razHasLeftShoulderArmor = false;
1700  }
1701 }
1702 
1704 {
1705  entity = self;
1706 
1707  entity.razLeftThighHealth = entity.razLeftThighHealth - ‪damage;
1708  if( entity.razLeftThighHealth <= 0 )
1709  {
1711  entity HidePart( ‪RAZ_L_THIGH_ARMOR_HIDE_TAG_1, "", true );
1712  entity HidePart( ‪RAZ_L_THIGH_ARMOR_HIDE_TAG_2, "", true );
1713  entity.razHasLeftThighArmor = false;
1715  }
1716 }
1717 
1719 {
1720  entity = self;
1721 
1722  entity.razRightThighHealth = entity.razRightThighHealth - ‪damage;
1723  if( entity.razRightThighHealth <= 0 )
1724  {
1726  entity HidePart( ‪RAZ_R_THIGH_ARMOR_HIDE_TAG_1, "", true );
1727  entity HidePart( ‪RAZ_R_THIGH_ARMOR_HIDE_TAG_2, "", true );
1728  entity.razHasRightThighArmor = false;
1730  }
1731 }
1732 
1733 
‪callback
‪function callback(event, localclientnum, params)
Definition: callbacks_shared.csc:13
‪RAZ_MELEE_YAW
‪#define RAZ_MELEE_YAW
Definition: raz.gsh:16
‪RAZ_DEFAULT_THIGH_ARMOR_HEALTH
‪#define RAZ_DEFAULT_THIGH_ARMOR_HEALTH
Definition: raz.gsh:132
‪razShouldShowPain
‪function private razShouldShowPain(entity)
Definition: raz.gsc:441
‪RAZ_TORPEDO_SELF_FX_CLIENTFIELD
‪#define RAZ_TORPEDO_SELF_FX_CLIENTFIELD
Definition: raz.gsh:42
‪RAZ_CHEST_ARMOR_HIDE_TAG_2
‪#define RAZ_CHEST_ARMOR_HIDE_TAG_2
Definition: raz.gsh:122
‪zombieIsAtEntrance
‪function zombieIsAtEntrance(behaviorTreeEntity)
Definition: _zm_behavior.gsc:1161
‪RAZ_GUN_HEALTH_DEFAULT
‪#define RAZ_GUN_HEALTH_DEFAULT
Definition: raz.gsh:63
‪RAZ_GUN_WEAKPOINT_HIT_CLIENTFIELD
‪#define RAZ_GUN_WEAKPOINT_HIT_CLIENTFIELD
Definition: raz.gsh:64
‪RAZ_GUN_DETACH_CLIENTFIELD
‪#define RAZ_GUN_DETACH_CLIENTFIELD
Definition: raz.gsh:52
‪razGoneBerserk
‪function private razGoneBerserk(entity)
Definition: raz.gsc:503
‪razTorpedoDetonateIfCloseToTarget
‪function private razTorpedoDetonateIfCloseToTarget(torpedo_target, torpedo_target_offset)
Definition: raz.gsc:817
‪GIBBED_LIMBS
‪#define GIBBED_LIMBS
Definition: blackboard.gsh:146
‪BT_REGISTER_API
‪#define BT_REGISTER_API(name, function)
Definition: behavior.gsh:1
‪RAZ_TORPEDO_ORIGIN_TAG
‪#define RAZ_TORPEDO_ORIGIN_TAG
Definition: raz.gsh:20
‪razGetNonDestroyedChuncks
‪function private razGetNonDestroyedChuncks()
Definition: raz.gsc:231
‪razDestroyWindow
‪function private razDestroyWindow(entity, b_destroy_actual_pieces)
Definition: raz.gsc:243
‪RAZ_MELEE_DIST_SQ
‪#define RAZ_MELEE_DIST_SQ
Definition: raz.gsh:15
‪RAZ_DETACH_CHEST_ARMOR_CLIENTFIELD
‪#define RAZ_DETACH_CHEST_ARMOR_CLIENTFIELD
Definition: raz.gsh:120
‪GIB_TORSO_RIGHT_ARM_FLAG
‪#define GIB_TORSO_RIGHT_ARM_FLAG
Definition: gib.gsh:25
‪RAZ_INVOKE_SPRINT_TIME
‪#define RAZ_INVOKE_SPRINT_TIME
Definition: raz.gsh:11
‪GibLeftArm
‪function GibLeftArm(entity)
Definition: gib.gsc:450
‪RAZ_L_SHOULDER_ARMOR_HIT_TAG
‪#define RAZ_L_SHOULDER_ARMOR_HIT_TAG
Definition: raz.gsh:110
‪razShootGroundTorpedo
‪function private razShootGroundTorpedo(torpedo_target, torpedo_target_offset)
Definition: raz.gsc:775
‪raz_check_for_location_hit
‪function private raz_check_for_location_hit(entity, hitloc, point, location, hit_radius_sq, tag)
Definition: raz.gsc:1584
‪RAZ_TORPEDO_NOTETRACK
‪#define RAZ_TORPEDO_NOTETRACK
Definition: raz.gsh:28
‪zombie_head_gib
‪function zombie_head_gib(attacker, means_of_death)
Definition: zombie_utility.gsc:2952
‪RAZ_NAVMESH_RADIUS
‪#define RAZ_NAVMESH_RADIUS
Definition: raz.gsh:46
‪RAZ_TORPEDO_BLAST_RADIUS
‪#define RAZ_TORPEDO_BLAST_RADIUS
Definition: raz.gsh:32
‪RAZ_L_THIGH_ARMOR_HIDE_TAG_1
‪#define RAZ_L_THIGH_ARMOR_HIDE_TAG_1
Definition: raz.gsh:146
‪RAZ_TORPEDO_BLAST_INNER_DAMAGE
‪#define RAZ_TORPEDO_BLAST_INNER_DAMAGE
Definition: raz.gsh:33
‪razShouldGoBerserk
‪function private razShouldGoBerserk(entity)
Definition: raz.gsc:488
‪RAZ_L_SHOULDER_ARMOR_HIDE_TAG_1
‪#define RAZ_L_SHOULDER_ARMOR_HIDE_TAG_1
Definition: raz.gsh:115
‪cointoss
‪function cointoss()
Definition: math_shared.csc:171
‪razZombieEligibleForKnockdown
‪function private razZombieEligibleForKnockdown(zombie, target, predicted_pos)
Definition: raz.gsc:1227
‪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
‪RAZ_TORPEDO_MODEL
‪#define RAZ_TORPEDO_MODEL
Definition: raz.gsh:29
‪RAZ_HELMET_HIT_RADIUS_SQ
‪#define RAZ_HELMET_HIT_RADIUS_SQ
Definition: raz.gsh:105
‪razTrackChestArmorDamage
‪function private razTrackChestArmorDamage(damage)
Definition: raz.gsc:1668
‪RAZ_DETACH_HELMET_CLIENTFIELD
‪#define RAZ_DETACH_HELMET_CLIENTFIELD
Definition: raz.gsh:106
‪ARCHETYPE_RAZ
‪#define ARCHETYPE_RAZ
Definition: archetype_shared.gsh:20
‪ZOMBIE_DAMAGEWEAPON_REGULAR
‪#define ZOMBIE_DAMAGEWEAPON_REGULAR
Definition: blackboard.gsh:190
‪RAZ_GUN_DETACH_DAMAGE_HEALTH_PERCENT
‪#define RAZ_GUN_DETACH_DAMAGE_HEALTH_PERCENT
Definition: raz.gsh:66
‪RAZ_DEFAULT_L_SHOULDER_ARMOR_HEALTH
‪#define RAZ_DEFAULT_L_SHOULDER_ARMOR_HEALTH
Definition: raz.gsh:109
‪InitRazBehaviorsAndASM
‪function private InitRazBehaviorsAndASM()
Definition: raz.gsc:77
‪trace
‪function trace(from, to, target)
Definition: grapple.gsc:369
‪RAZ_TORPEDO_GROUND_OFFSET
‪#define RAZ_TORPEDO_GROUND_OFFSET
Definition: raz.gsh:41
‪LOCOMOTION_SPEED_SPRINT
‪#define LOCOMOTION_SPEED_SPRINT
Definition: blackboard.gsh:158
‪VERSION_DLC3
‪#define VERSION_DLC3
Definition: version.gsh:95
‪SHOULD_TURN
‪#define SHOULD_TURN
Definition: blackboard.gsh:138
‪SetBlackBoardAttribute
‪function SetBlackBoardAttribute(entity, attributeName, attributeValue)
Definition: blackboard.gsc:56
‪razDamageCallback
‪function private razDamageCallback(inflictor, attacker, damage, dFlags, mod, weapon, point, dir, hitLoc, offsetTime, boneIndex, modelIndex)
Definition: raz.gsc:1469
‪RAZ_GUN_DETACH_HEALTH_PERCENT_MAX
‪#define RAZ_GUN_DETACH_HEALTH_PERCENT_MAX
Definition: raz.gsh:67
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪GetBlackBoardAttribute
‪function GetBlackBoardAttribute(entity, attributeName)
Definition: blackboard.gsc:32
‪SQR
‪#define SQR(__var)
Definition: shared.gsh:293
‪GIB_LEGS_BOTH_LEGS_FLAG
‪#define GIB_LEGS_BOTH_LEGS_FLAG
Definition: gib.gsh:30
‪razTrackHelmetDamage
‪function private razTrackHelmetDamage(damage, attacker)
Definition: raz.gsc:1652
‪RAZ_MAX_TORPEDO_RANGE
‪#define RAZ_MAX_TORPEDO_RANGE
Definition: raz.gsh:23
‪RAZ_HELMET_HIT_TAG
‪#define RAZ_HELMET_HIT_TAG
Definition: raz.gsh:103
‪delay
‪function delay(time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6)
Definition: util_shared.csc:784
‪RegisterUtilityBlackboardAttributes
‪function RegisterUtilityBlackboardAttributes()
Definition: archetype_utility.gsc:139
‪RAZ_CHEST_ARMOR_HIDE_TAG_5
‪#define RAZ_CHEST_ARMOR_HIDE_TAG_5
Definition: raz.gsh:125
‪use
‪function use(str_name, str_key="targetname", ent, b_assert=true)
Definition: trigger_shared.gsc:1059
‪RAZ_ARMOR_DAMAGE_MODIFIER
‪#define RAZ_ARMOR_DAMAGE_MODIFIER
Definition: raz.gsh:101
‪BB_GetShouldTurn
‪function private BB_GetShouldTurn()
Definition: raz.gsc:153
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪razTargetService
‪function private razTargetService(entity)
Definition: raz.gsc:290
‪razShouldShowSpecialPain
‪function private razShouldShowSpecialPain(entity)
Definition: raz.gsc:451
‪RAZ_HELMET_TAG
‪#define RAZ_HELMET_TAG
Definition: raz.gsh:108
‪RAZ_GUN_HIDE_TAG
‪#define RAZ_GUN_HIDE_TAG
Definition: raz.gsh:57
‪RAZ_CHEST_ARMOR_HIDE_TAG_3
‪#define RAZ_CHEST_ARMOR_HIDE_TAG_3
Definition: raz.gsh:123
‪LOCOMOTION_SHOULD_TURN
‪#define LOCOMOTION_SHOULD_TURN
Definition: blackboard.gsh:137
‪RAZ_CHEST_ARMOR_HIDE_TAG_1
‪#define RAZ_CHEST_ARMOR_HIDE_TAG_1
Definition: raz.gsh:121
‪RAZ_L_THIGH_ARMOR_HIT_TAG
‪#define RAZ_L_THIGH_ARMOR_HIT_TAG
Definition: raz.gsh:141
‪RAZ_TORPEDO_COOLDOWN
‪#define RAZ_TORPEDO_COOLDOWN
Definition: raz.gsh:25
‪razCanSeeTorpedoTarget
‪function private razCanSeeTorpedoTarget(enemy)
Definition: raz.gsc:651
‪razTookPain
‪function private razTookPain(entity)
Definition: raz.gsc:530
‪RAZ_MIN_TORPEDO_RANGE_SQ
‪#define RAZ_MIN_TORPEDO_RANGE_SQ
Definition: raz.gsh:22
‪ENABLE_BLACKBOARD_DEBUG_TRACKING
‪#define ENABLE_BLACKBOARD_DEBUG_TRACKING(self)
Definition: blackboard.gsh:7
‪razNotetrackShootGroundTorpedo
‪function private razNotetrackShootGroundTorpedo(entity)
Definition: raz.gsc:726
‪RAZ_NAVMESH_BOUNDARY_DIST
‪#define RAZ_NAVMESH_BOUNDARY_DIST
Definition: raz.gsh:47
‪RAZ_CHEST_ARMOR_HIT_RADIUS_SQ
‪#define RAZ_CHEST_ARMOR_HIT_RADIUS_SQ
Definition: raz.gsh:129
‪razGibZombiesOnMelee
‪function private razGibZombiesOnMelee()
Definition: raz.gsc:1335
‪LOCOMOTION_SPEED_TYPE
‪#define LOCOMOTION_SPEED_TYPE
Definition: blackboard.gsh:155
‪RAZ_R_THIGH_ARMOR_HIDE_TAG_2
‪#define RAZ_R_THIGH_ARMOR_HIDE_TAG_2
Definition: raz.gsh:139
‪razApplyTorpedoDetonationPushToPlayers
‪function private razApplyTorpedoDetonationPushToPlayers(torpedo_origin)
Definition: raz.gsc:1146
‪razTorpedoMoveToTarget
‪function private razTorpedoMoveToTarget(torpedo_target)
Definition: raz.gsc:837
‪razKnockdownZombies
‪function private razKnockdownZombies(target)
Definition: raz.gsc:953
‪SHOULD_NOT_TURN
‪#define SHOULD_NOT_TURN
Definition: blackboard.gsh:139
‪RAZ_L_SHOULDER_ARMOR_HIDE_TAG_3
‪#define RAZ_L_SHOULDER_ARMOR_HIDE_TAG_3
Definition: raz.gsh:117
‪RAZ_R_THIGH_ARMOR_HIT_TAG
‪#define RAZ_R_THIGH_ARMOR_HIT_TAG
Definition: raz.gsh:133
‪RAZ_DETACH_L_SHOULDER_ARMOR_CLIENTFIELD
‪#define RAZ_DETACH_L_SHOULDER_ARMOR_CLIENTFIELD
Definition: raz.gsh:118
‪RAZ_TORPEDO_MOVE_INTERVAL_TIME
‪#define RAZ_TORPEDO_MOVE_INTERVAL_TIME
Definition: raz.gsh:37
‪RAZ_MAX_TORPEDO_RANGE_SQ
‪#define RAZ_MAX_TORPEDO_RANGE_SQ
Definition: raz.gsh:24
‪RAZ_TORPEDO_MAX_LAUNCH_ANGLE
‪#define RAZ_TORPEDO_MAX_LAUNCH_ANGLE
Definition: raz.gsh:26
‪razTrackLeftShoulderArmorDamage
‪function private razTrackLeftShoulderArmorDamage(damage)
Definition: raz.gsc:1687
‪RAZ_TORPEDO_BLAST_OUTER_DAMAGE
‪#define RAZ_TORPEDO_BLAST_OUTER_DAMAGE
Definition: raz.gsh:34
‪razTorpedoKnockdownZombies
‪function private razTorpedoKnockdownZombies(torpedo_target)
Definition: raz.gsc:1089
‪GIB_LOCATION
‪#define GIB_LOCATION
Definition: blackboard.gsh:141
‪RAZ_DETACH_R_THIGH_ARMOR_CLIENTFIELD
‪#define RAZ_DETACH_R_THIGH_ARMOR_CLIENTFIELD
Definition: raz.gsh:140
‪razSprintKnockdownZombies
‪function private razSprintKnockdownZombies()
Definition: raz.gsc:1097
‪IsGibbed
‪function IsGibbed(localClientNum, entity, gibFlag)
Definition: gib.csc:734
‪shouldSkipTeardown
‪function shouldSkipTeardown(entity)
Definition: raz.gsc:216
‪RAZ_R_THIGH_ARMOR_HIDE_TAG_1
‪#define RAZ_R_THIGH_ARMOR_HIDE_TAG_1
Definition: raz.gsh:138
‪increment
‪function increment(str_field_name, n_increment_count=1)
Definition: clientfield_shared.gsc:110
‪KNOCKDOWN_SHOVED
‪#define KNOCKDOWN_SHOVED
Definition: blackboard.gsh:212
‪ArchetypeRazOnAnimscriptedCallback
‪function private ArchetypeRazOnAnimscriptedCallback(entity)
Definition: raz.gsc:133
‪RAZ_DEFAULT_HELMET_HEALTH
‪#define RAZ_DEFAULT_HELMET_HEALTH
Definition: raz.gsh:102
‪init
‪function autoexec init()
Definition: raz.gsc:54
‪findNodesService
‪function findNodesService(behaviorTreeEntity)
Definition: raz.gsc:171
‪get_closest_valid_player
‪function get_closest_valid_player(origin, ignore_player)
Definition: skeleton.gsc:321
‪razTrackRightThighArmorDamage
‪function private razTrackRightThighArmorDamage(damage)
Definition: raz.gsc:1718
‪razTrackGunDamage
‪function private razTrackGunDamage(damage, attacker)
Definition: raz.gsc:1608
‪Spawn
‪function Spawn(parent, onDeathCallback)
Definition: _flak_drone.gsc:427
‪razSpawnSetup
‪function private razSpawnSetup()
Definition: raz.gsc:1282
‪RAZ_GUN_DETACH_EXPLOSION_DAMAGE_MIN
‪#define RAZ_GUN_DETACH_EXPLOSION_DAMAGE_MIN
Definition: raz.gsh:69
‪razTorpedoPlayTrailEffect
‪function private razTorpedoPlayTrailEffect()
Definition: raz.gsc:937
‪get_zombie_point_of_interest
‪function get_zombie_point_of_interest(origin, poi_array)
Definition: _zm_utility.gsc:893
‪RAZ_L_SHOUDLER_ARMOR_HIT_RADIUS_SQ
‪#define RAZ_L_SHOUDLER_ARMOR_HIT_RADIUS_SQ
Definition: raz.gsh:113
‪RAZ_TORPEDO_DETONATION_DIST_SQ
‪#define RAZ_TORPEDO_DETONATION_DIST_SQ
Definition: raz.gsh:31
‪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
‪razFinishMelee
‪function private razFinishMelee(entity)
Definition: raz.gsc:714
‪RAZ_GUN_CORE_HIDE_TAG
‪#define RAZ_GUN_CORE_HIDE_TAG
Definition: raz.gsh:56
‪RAZ_DETACH_L_THIGH_ARMOR_CLIENTFIELD
‪#define RAZ_DETACH_L_THIGH_ARMOR_CLIENTFIELD
Definition: raz.gsh:148
‪razShouldTraverseWindow
‪function private razShouldTraverseWindow(entity)
Definition: raz.gsc:498
‪razTrackLeftThighArmorDamage
‪function private razTrackLeftThighArmorDamage(damage)
Definition: raz.gsc:1703
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪RAZ_CHEST_ARMOR_HIDE_TAG_6
‪#define RAZ_CHEST_ARMOR_HIDE_TAG_6
Definition: raz.gsh:126
‪GIB_TORSO_LEFT_ARM_FLAG
‪#define GIB_TORSO_LEFT_ARM_FLAG
Definition: gib.gsh:26
‪ArchetypeRazBlackboardInit
‪function private ArchetypeRazBlackboardInit()
Definition: raz.gsc:111
‪RAZ_GUN_DETACH_EXPLOSION_DAMAGE_MAX
‪#define RAZ_GUN_DETACH_EXPLOSION_DAMAGE_MAX
Definition: raz.gsh:70
‪razFinishTraverseWindow
‪function private razFinishTraverseWindow(entity)
Definition: raz.gsc:518
‪razShouldShootGroundTorpedo
‪function private razShouldShootGroundTorpedo(entity)
Definition: raz.gsc:608
‪razTorpedoDetonate
‪function private razTorpedoDetonate(delay)
Definition: raz.gsc:1108
‪CreateBlackBoardForEntity
‪function CreateBlackBoardForEntity(entity)
Definition: blackboard.gsc:77
‪razShouldShowShieldPain
‪function private razShouldShowShieldPain(entity)
Definition: raz.gsc:478
‪razSprintService
‪function private razSprintService(entity)
Definition: raz.gsc:389
‪RAZ_TORPEDO_VELOCITY
‪#define RAZ_TORPEDO_VELOCITY
Definition: raz.gsh:36
‪RAZ_CHEST_ARMOR_HIT_TAG
‪#define RAZ_CHEST_ARMOR_HIT_TAG
Definition: raz.gsh:130
‪razStartDeath
‪function private razStartDeath(entity)
Definition: raz.gsc:536
‪RAZ_R_SHOULDER_WEAKSPOT_TAG
‪#define RAZ_R_SHOULDER_WEAKSPOT_TAG
Definition: raz.gsh:55
‪razFinishGroundTorpedo
‪function private razFinishGroundTorpedo(entity)
Definition: raz.gsc:719
‪RAZ_GUN_DETACH_EXPLOSION_RADIUS
‪#define RAZ_GUN_DETACH_EXPLOSION_RADIUS
Definition: raz.gsh:68
‪RAZ_TORPEDO_SIGHT_HORIZ_RANGE
‪#define RAZ_TORPEDO_SIGHT_HORIZ_RANGE
Definition: raz.gsh:27
‪razApplyPlayerDetonationEffects
‪function private razApplyPlayerDetonationEffects()
Definition: raz.gsc:1209
‪RAZ_TORPEDO_MAX_YAW_PER_SECOND
‪#define RAZ_TORPEDO_MAX_YAW_PER_SECOND
Definition: raz.gsh:40
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪RAZ_TORPEDO_DETONATION_CLIENTFIELD
‪#define RAZ_TORPEDO_DETONATION_CLIENTFIELD
Definition: raz.gsh:35
‪RAZ_L_THIGH_ARMOR_HIDE_TAG_2
‪#define RAZ_L_THIGH_ARMOR_HIDE_TAG_2
Definition: raz.gsh:147
‪razTorpedoLaunchDirection
‪function private razTorpedoLaunchDirection(forward_dir, torpedo_pos, torpedo_target_pos, max_angle)
Definition: raz.gsc:752
‪razInvalidateGibbedArmor
‪function private razInvalidateGibbedArmor()
Definition: raz.gsc:1426
‪get_non_destroyed_chunks
‪function get_non_destroyed_chunks(barrier, barrier_chunks)
Definition: _zm_utility.gsc:2506
‪RAZ_L_SHOULDER_ARMOR_HIDE_TAG_2
‪#define RAZ_L_SHOULDER_ARMOR_HIDE_TAG_2
Definition: raz.gsh:116
‪RAZ_L_THIGH_ARMOR_HIT_RADIUS_SQ
‪#define RAZ_L_THIGH_ARMOR_HIT_RADIUS_SQ
Definition: raz.gsh:144
‪RAZ_R_THIGH_ARMOR_HIT_RADIUS_SQ
‪#define RAZ_R_THIGH_ARMOR_HIT_RADIUS_SQ
Definition: raz.gsh:136
‪GibRightArm
‪function GibRightArm(entity)
Definition: gib.gsc:467
‪RAZ_GUN_TAG_HIT_RADIUS_SQ
‪#define RAZ_GUN_TAG_HIT_RADIUS_SQ
Definition: raz.gsh:62
‪zombieEnteredPlayable
‪function zombieEnteredPlayable(behaviorTreeEntity)
Definition: _zm_behavior.gsc:754
‪RAZ_CHEST_ARMOR_HIDE_TAG_4
‪#define RAZ_CHEST_ARMOR_HIDE_TAG_4
Definition: raz.gsh:124
‪razStartTraverseWindow
‪function private razStartTraverseWindow(entity)
Definition: raz.gsc:508
‪RAZ_DEFAULT_CHEST_ARMOR_HEALTH
‪#define RAZ_DEFAULT_CHEST_ARMOR_HEALTH
Definition: raz.gsh:119
‪RAZ_TORPEDO_TRAIL_CLIENTFIELD
‪#define RAZ_TORPEDO_TRAIL_CLIENTFIELD
Definition: raz.gsh:38
‪razStartMelee
‪function private razStartMelee(entity)
Definition: raz.gsc:705
‪razShouldMelee
‪function razShouldMelee(entity)
Definition: raz.gsc:415
‪ZOMBIE_DAMAGEWEAPON_TYPE
‪#define ZOMBIE_DAMAGEWEAPON_TYPE
Definition: blackboard.gsh:189
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪GETUP_BACK
‪#define GETUP_BACK
Definition: blackboard.gsh:205
‪zombie_complete_emerging_into_playable_area
‪function zombie_complete_emerging_into_playable_area()
Definition: _zm_spawner.gsc:3253