‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_croc.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\clientfield_shared;
4 #using scripts\shared\gameskill_shared;
5 #using scripts\shared\math_shared;
6 #using scripts\shared\statemachine_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
9 #using scripts\shared\turret_shared;
10 #using scripts\shared\flag_shared;
11 
12 #insert scripts\shared\shared.gsh;
13 #insert scripts\shared\statemachine.gsh;
14 #insert scripts\shared\version.gsh;
15 
16 #insert scripts\shared\ai\utility.gsh;
17 
18 #using scripts\shared\vehicle_shared;
19 #using scripts\shared\vehicle_ai_shared;
20 #using scripts\shared\vehicle_death_shared;
21 
22 
23 #define NUM_DAMAGE_STATES 4
24 #define DAMAGE_STATE_THRESHOLD_PCT_1 0.75
25 #define DAMAGE_STATE_THRESHOLD_PCT_2 0.5
26 #define DAMAGE_STATE_THRESHOLD_PCT_3 0.25
27 #define DAMAGE_STATE_THRESHOLD_PCT_4 0.1
28 
29 #define SCAN_HEIGHT_OFFSET 40
30 
31 #define DEFAULT_WEAK_SPOT_DAMAGE_LIMIT 600
32 
33 #define MELEE_RADIUS 270
34 #define MELEE_INNER_RADIUS_DAMAGE 200
35 #define MELEE_OUTER_RADIUS_DAMAGE 150
36 
37 #define NEAR_POINTS_DIST 1000
38 #define FAR_POINTS_DIST 2500
39 
40 #namespace croc;
41 
42 ‪REGISTER_SYSTEM( "croc", &‪__init__, undefined )
43 
44 #using_animtree( "generic" );
45 
46 function ‪__init__()
47 {
48  vehicle::add_main_callback( "croc", &‪main );
49 
50  SetDvar( "phys_buoyancy", 1 ); // turn on buoyancy
51 
52  level.difficultySettings[ "crocburst_scale" ][ "easy" ] = 1.15;
53  level.difficultySettings[ "crocburst_scale" ][ "normal" ] = 1;
54  level.difficultySettings[ "crocburst_scale" ][ "hardened" ] = 0.85;
55  level.difficultySettings[ "crocburst_scale" ][ "veteran" ] = 0.7;
56 
57  level.difficultySettings[ "crochealth_boost" ][ "easy" ] = -70;
58  level.difficultySettings[ "crochealth_boost" ][ "normal" ] = 0;
59  level.difficultySettings[ "crochealth_boost" ][ "hardened" ] = 70;
60  level.difficultySettings[ "crochealth_boost" ][ "veteran" ] = 140;
61 }
62 
63 function ‪main()
64 {
65  self useanimtree( #animtree );
66  self thread ‪croc_think();
67  self.overrideVehicleDamage = &‪crocCallback_VehicleDamage;
68 }
69 
70 function ‪isInWater()
71 {
72  return GetEntNavMaterial( self ) == 2;
73 }
74 
75 function ‪isOnLand()
76 {
77  return !‪isInWater();
78 }
79 
80 function ‪croc_requestASMState( statename )
81 {
82  if ( self ‪isInWater() )
83  {
84  self ASMRequestSubstate( statename + "@water" );
85  }
86  else if ( self ‪isOnLand() )
87  {
88  self ASMRequestSubstate( statename + "@land" );
89  }
90 }
91 
92 function ‪croc_think()
93 {
94  self EnableAimAssist();
95  self SetNearGoalNotifyDist( 35 );
96 
97  self.current_damage_state = 0;
98 
99  // Set this on the metal storm to specify the cuttoff distance at which he can see
100  self.highlyawareradius = 150;
101  self.weak_spot_health = ‪DEFAULT_WEAK_SPOT_DAMAGE_LIMIT;
102 
103  self.fovcosine = 0; // +/-90 degrees = 180 fov, err 0 actually means 360 degree view
104  self.fovcosinebusy = 0;
105  self.maxsightdistsqrd = 10000 * 10000;
106 
107  //assert( isdefined( self.scriptbundlesettings ) );
108  //self.settings = struct::get_script_bundle( "vehiclecustomsettings", self.scriptbundlesettings );
109 
110  //self SetSpeed( self.settings.defaultMoveSpeed, 5, 5 );
111 
112  self.goalradius = 10000;
113 
114  if( !isdefined( self.goalpos ) )
115  {
116  self.goalpos = self.origin;
117  }
118 
119  self.state_machine = self ‪vehicle_ai::init_state_machine_for_role( "default" );
120 
121  self ‪vehicle_ai::get_state_callbacks( "default", "scripted" ).update_func = &‪croc_scripted;
122  self ‪vehicle_ai::get_state_callbacks( "default", "combat" ).update_func = &‪croc_main;
123 
124  self ‪vehicle_ai::get_state_callbacks( "default", "death" ).update_func = &‪croc_death;
125 
126  self ‪vehicle_ai::set_role( "default" );
127  self ‪vehicle_ai::set_state( "combat" );
128 
129 
130  // Set the first state
131  if ( isdefined( self.script_startstate ) )
132  {
133  if( self.script_startstate == "off" )
134  {
135  self ‪croc_off();
136  }
137  else
138  {
139  self.state_machine ‪statemachine::set_state( self.script_startstate );
140  }
141  }
142  else
143  {
144  // Set the first state
146  }
147 
148  self thread ‪croc_set_team( self.team );
149 
150  waittillframeend;
151 
152  //self.health += gameskill::getCurrentDifficultySetting( "crochealth_boost" );
153 }
154 
155 function ‪croc_off()
156 {
157  self playsound( "veh_croc_power_down" );
158  if( isdefined( self.sndEnt ) )
159  {
160  self.sndEnt stoploopsound( .5 );
161  }
162  self.state_machine ‪statemachine::set_state( "scripted" );
163  self ‪vehicle::lights_off();
164  self LaserOff();
165  self ‪vehicle::toggle_tread_fx( 0 );
166  self ‪vehicle::toggle_sounds( 0 );
168  angles = self GetTagAngles( "tag_flash" );
169  target_vec = self.origin + AnglesToForward( ( 0, angles[1], 0 ) ) * 1000;
170  target_vec = target_vec + ( 0, 0, -500 );
171  self SetTargetOrigin( target_vec );
172  self.off = true;
173  if( !isdefined( self.‪emped ) )
174  {
175  self DisableAimAssist();
176  }
177 }
178 
179 function ‪croc_on()
180 {
181  self ‪vehicle::lights_on();
182  self ‪vehicle::toggle_tread_fx( 1 );
183  self EnableAimAssist();
184  self ‪vehicle::toggle_sounds( 1 );
185  self ‪bootup();
187  self.off = undefined;
189 }
190 
191 function ‪bootup()
192 {
193  self playsound( "veh_croc_power_up" );
194 
195  for( i = 0; i < 6; i++ )
196  {
197  wait 0.1;
199  wait 0.1;
201  }
202 
203  angles = self GetTagAngles( "tag_flash" );
204  target_vec = self.origin + AnglesToForward( ( 0, angles[1], 0 ) ) * 1000;
205 
206  driver = self GetSeatOccupant( 0 );
207  if( !isdefined(driver) )
208  {
209  self SetTargetOrigin( target_vec );
210  }
211  wait 1;
212 }
213 
214 function ‪show_weak_spots( show ) // vents on the sides that are exposed when firing the main gun
215 {
216  if( show )
217  {
218  //self ShowPart( "tag_target_turret_left" );
219  //self ShowPart( "tag_target_turret_right" );
220  //self HidePart( "tag_target_turret_left_closed" );
221  //self HidePart( "tag_target_turret_right_closed" );
222 
224  }
225  else
226  {
227  //self HidePart( "tag_target_turret_left" );
228  //self HidePart( "tag_target_turret_right" );
229  //self ShowPart( "tag_target_turret_left_closed" );
230  //self ShowPart( "tag_target_turret_right_closed" );
231 
233  }
234 }
235 
237 {
238  self endon( "death" );
239  self endon( "change_state" );
240  self endon( "weapon_fired" );
241 
242  while( isdefined( self.enemy ) )
243  {
244  start = self GetTagOrigin( "tag_flash" );
245  enemy_origin = self.enemy.origin;
246 
247  if( start[2] < enemy_origin[2] ) // if above croc then use the eye
248  {
249  enemy_origin = self.enemy GetEye();
250  }
251 
252  dir_to_enemy = enemy_origin - start;
253  dir_to_enemy = VectorNormalize( dir_to_enemy );
254  right = VectorCross( dir_to_enemy, (0,0,1) );
255  right = VectorNormalize( right );
256 
257  dist_to_enemy_squared = DistanceSquared( start, enemy_origin ) - (5*5);
258 
259  behind_end = enemy_origin + dir_to_enemy * 200;
260 
261  best_dist = -100000;
262 
263  ‪end = behind_end;
264  results = bullettrace( start, ‪end, false, self );
265 
266  if( results["fraction"] < 1.0 )
267  {
268  dist_squared = DistanceSquared( start, results["position"] );
269  dist_beyond_enemy = dist_squared - dist_to_enemy_squared;
270  if( dist_beyond_enemy > 0 )
271  {
272  self SetTurretTargetVec( ‪end );
273  wait 0.1;
274  continue;
275  }
276  }
277 
278  ‪end = behind_end + right * 60;
279  results = bullettrace( start, ‪end, false, self );
280 
281  if( results["fraction"] < 1.0 )
282  {
283  dist_squared = DistanceSquared( start, results["position"] );
284  dist_beyond_enemy = dist_squared - dist_to_enemy_squared;
285  if( dist_beyond_enemy > 0 )
286  {
287  self SetTurretTargetVec( ‪end );
288  wait 0.1;
289  continue;
290  }
291  }
292 
293  ‪end = behind_end + right * -60;
294  results = bullettrace( start, ‪end, false, self );
295 
296  if( results["fraction"] < 1.0 )
297  {
298  dist_squared = DistanceSquared( start, results["position"] );
299  dist_beyond_enemy = dist_squared - dist_to_enemy_squared;
300  if( dist_beyond_enemy > 0 )
301  {
302  self SetTurretTargetVec( ‪end );
303  wait 0.1;
304  continue;
305  }
306  }
307 
308  self SetTurretTargetEnt( self.enemy );
309  wait 0.1;
310  }
311 }
312 
313 function ‪croc_start_ai( state )
314 {
315  self.goalpos = self.origin;
316 
317  if ( !isdefined( state ) )
318  state = "combat";
319 
320  self.state_machine ‪statemachine::set_state( state );
321 }
322 
323 function ‪croc_stop_ai()
324 {
325  self.state_machine ‪statemachine::set_state( "scripted" );
326 }
327 
328 function ‪croc_main()
329 {
330  while( isdefined( self.‪emped ) )
331  {
332  wait 1;
333  }
334 
335  self SetSpeed( 5, 5, 5 );
336 
337  self thread ‪croc_movementupdate();
338 }
339 
340 function ‪check_melee()
341 {
342  if ( isdefined( self.enemy ) )
343  {
344  if( distanceSquared( self.enemy.origin, self.origin ) < ‪MELEE_RADIUS * ‪MELEE_RADIUS )
345  {
346  /*if( isdefined( self.settings.meleefx ) )
347  {
348  PlayFxOnTag( self.settings.meleefx, self, "tag_origin" );
349  }*/
350  RadiusDamage( self.origin + (0,0,40), ‪MELEE_RADIUS, ‪MELEE_INNER_RADIUS_DAMAGE, ‪MELEE_OUTER_RADIUS_DAMAGE, self );
351  self playsound( "veh_croc_emp" );
352  return true;
353  }
354  }
355 
356  foreach ( player in level.players )
357  {
358  if( !isdefined( self.enemy ) || player != self.enemy )
359  {
360  if( distanceSquared( player.origin, self.origin ) < ‪MELEE_RADIUS * ‪MELEE_RADIUS )
361  {
362  /*if( isdefined( self.settings.meleefx ) )
363  {
364  PlayFxOnTag( self.settings.meleefx, self, "tag_origin" );
365  }*/
366  RadiusDamage( self.origin + (0,0,40), ‪MELEE_RADIUS, ‪MELEE_INNER_RADIUS_DAMAGE, ‪MELEE_OUTER_RADIUS_DAMAGE, self );
367  self playsound( "veh_croc_emp" );
368  return true;
369  }
370  }
371  }
372 
373  return false;
374 }
375 
377 {
378  self endon( "death" );
379  self endon( "change_state" );
380  self endon( "near_goal" );
381  self endon( "reached_end_node" );
382 
383  wait 1;
384 
385  cantSeeEnemyCount = 0;
386 
387  while( 1 )
388  {
389  if ( self ‪check_melee() )
390  {
391  self.move_now = true;
392  self notify( "near_goal" );
393  }
394 
395  if( isdefined( self.current_pathto_pos ) )
396  {
397  if( isdefined( self.enemy ) )
398  {
399  if( distance2dSquared( self.enemy.origin, self.current_pathto_pos ) < 250 * 250 )
400  {
401  self.move_now = true;
402  self notify( "near_goal" );
403  }
404 
405  if( !self VehCanSee( self.enemy ) )
406  {
407  if( !self ‪canSeeEnemyFromPosition( self.current_pathto_pos, self.enemy ) )
408  {
409  cantSeeEnemyCount++;
410  if( cantSeeEnemyCount > 5 )
411  {
412  self.move_now = true;
413  self notify( "near_goal" );
414  }
415  }
416  }
417  }
418 
419  if( distance2dSquared( self.current_pathto_pos, self.goalpos ) > self.goalradius * self.goalradius )
420  {
421  wait 1;
422 
423  self.move_now = true;
424  self notify( "near_goal" );
425  }
426  }
427 
428  wait 0.3;
429  }
430 }
431 
433 {
434  self endon( "death" );
435  self endon( "change_state" );
436 
437  if( self.vehonpath )
438  {
439  self thread ‪goal_flag_monitor();
440  self ‪flag::wait_till( "goal_reached" );
441  }
442 }
443 
445 {
446  self endon( "death" );
447  self endon( "change_state" );
448 
449  self ‪flag::clear( "goal_reached" );
450  self ‪util::waittill_any( "near_goal", "reached_end_node", "force_goal" );
451  self ‪flag::set( "goal_reached" );
452 }
453 
454 function ‪croc_set_swim_depth( swimDepth )
455 {
456  self SetBuoyancyOffset( -swimDepth );
457 }
458 
460 {
461  self endon( "death" );
462 
463  base = 10;
464  floatingOffset = base;
465 
466  while ( true )
467  {
468  floatingOffset = -floatingOffset;
469  ‪croc_set_swim_depth( base + floatingOffset );
470  wait RandomFloatRange( 5, 8 );
471  }
472 }
473 
475 {
476  self endon( "death" );
477  self endon( "change_state" );
478 
479  //if( distance2dSquared( self.origin, self.goalpos ) > 20 * 20 )
480  // self SetVehGoalPos( self.goalpos, true, 2 );
481 
482  self.sndEnt = ‪spawn( "script_origin", self.origin );
483  self.sndEnt linkto( self, "tag_origin" );
484  self.sndEnt playloopsound( "veh_croc_movement_loop", 2 );
485  self ‪croc_requestASMState( "idle" );
486 
487  if ( !self ‪flag::exists( "goal_reached" ) )
488  {
489  self ‪flag::init( "goal_reached" );
490  }
491 
492  wait 0.5;
493 
494  goalfailures = 0;
495 
497 
498  //self thread croc_testBuoyancy();
499 
500  return;
501 
502  while( 1 )
503  {
504  self ‪waittill_pathing_done(); // might be scripted on a spline
505 
506  //goalpos = croc_find_new_position();
507  goalpos = self.patrol_node.origin;
508 
509  //self SetSpeed( self.settings.defaultMoveSpeed, 5, 5 );
510 
511  if( self SetVehGoalPos( goalpos, false, 1 ) )
512  {
513  self ‪croc_requestASMState( "locomotion" );
514 
515  self.sndEnt playloopsound( "veh_croc_movement_loop", 2 );
516 
517  self.current_pathto_pos = goalpos;
518  self thread ‪path_update_interrupt();
519 
520  goalfailures = 0;
521  self ‪util::waittill_any( "near_goal", "reached_end_node" );
522  self CancelAIMove();
523  self ClearVehGoalPos();
524 
526 
527  if( isdefined( self.move_now ) )
528  {
529  self.move_now = undefined;
530  wait 0.1;
531  }
532  else
533  {
534  self.sndEnt stoploopsound( .5 );
535 
536  if( !isdefined( self.getreadytofire ) )
537  {
538  self ‪croc_requestASMState( "idle" );
539  }
540 
541  wait 0.5;
542  }
543  }
544  else
545  {
546  goalfailures++;
547 
548  self.current_pathto_pos = undefined;
549  self LaunchVehicle( (0,0,-50) );
550 
552  }
553 
554  if( isdefined( self.getreadytofire ) )
555  {
556  self.sndEnt stoploopsound( .5 );
557 
558  while( isdefined( self.getreadytofire ) )
559  {
560  wait 0.2;
561  self ‪check_melee();
562  }
563  }
564 
565  }
566 }
567 
568 function ‪canSeeEnemyFromPosition( position, enemy )
569 {
570  sightCheckOrigin = position + (0,0,80);
571  return sighttracepassed( sightCheckOrigin, enemy.origin + (0,0,30), false, self );
572 }
573 
575 {
576  self endon( "change_state" );
577  self endon( "death" );
578 
579  if ( !IsDefined( self.patrol_node ) )
580  {
581 /# println( "^1WARNING: No patrol path defined, taking the nearest one" ); #/
582 
583  searchRadius = 256;
584  while ( !isdefined( self.patrol_node ) )
585  {
586  searchRadius = searchRadius * 2;
587  nodes = GetNodesInRadius( self.origin, searchRadius, 0, searchRadius, "Path", 1 );
588 
589  if ( nodes.size > 0 )
590  {
591  self.patrol_node = nodes[ 0 ];
592  }
593  wait 0.02;
594  }
595  }
596 
597  if ( !isdefined( self.patrol_start_node ) )
598  {
599  self.patrol_start_node = self.patrol_node;
600  }
601 
602  if ( IsDefined( self.patrol_node.target ) )
603  {
604  self.patrol_node = GetNode( self.patrol_node.target, "targetname" );
605 
606  if ( self.patrol_node == self.patrol_start_node )
607  {
608  self notify("patrol_route_complete");
609  }
610  }
611 
612  //AnimationStateNetworkUtility::RequestState( self, asmStateName );
613 }
614 
616 {
617  //sweet_spot_dist = self.settings.engagementDist;
618  sweet_spot_dist = 700; // TODO temporary value before setting up scriptbundle
619 
620  quad_tank_radius = 120;
621  height_check_dist = 300;
622 
623  // deprecated // closepoints = GetNavPointsInRadius( self.origin, 0, NEAR_POINTS_DIST, quad_tank_radius, 100 );
624  // deprecated // farpoints = GetNavPointsInRadius( self.origin, NEAR_POINTS_DIST, FAR_POINTS_DIST, quad_tank_radius, 100 );
625  closepoints = [];
626  farpoints = [];
627 
628  points = arraycombine( closepoints, farpoints, false, false );
629 
630  if( points.size < 5 )
631  {
632  // deprecated // points = GetNavPointsInRadius( self.origin, 0, FAR_POINTS_DIST, quad_tank_radius, 100 );
633  points = [];
634  }
635 
636  origin = self.goalpos;
637 
638  best_point = undefined;
639  best_score = -999999;
640 
641  if ( isdefined( self.enemy ) )
642  {
643  vec_enemy_to_self = VectorNormalize( ‪FLAT_ORIGIN( self.origin ) - ‪FLAT_ORIGIN( self.enemy.origin ) );
644 
645  foreach( point in points )
646  {
647  if( distanceSquared( point, self.goalpos ) > self.goalRadius * self.goalRadius )
648  {
649  continue;
650  }
651 
652  vec_enemy_to_point = ( ‪FLAT_ORIGIN( point ) - ‪FLAT_ORIGIN( self.enemy.origin ) );
653 
654  dist_in_front_of_enemy = VectorDot( vec_enemy_to_point, vec_enemy_to_self );
655  dist_away_from_sweet_line = Abs( dist_in_front_of_enemy - sweet_spot_dist );
656 
657  score = 10 + RandomFloat( 1.5 );
658 
659  if( dist_away_from_sweet_line > 160 )
660  {
661  score -= ‪math::clamp( dist_away_from_sweet_line / 1500, 0, 10 );
662  }
663 
664  too_far_dist = sweet_spot_dist + 200;
665  dist_from_enemy = distance2dSquared( point, self.enemy.origin );
666  if( dist_from_enemy > too_far_dist * too_far_dist )
667  {
668  score -= ‪math::clamp( dist_from_enemy / (too_far_dist * too_far_dist), 1, 10 );
669  }
670 
671  if( distance2dSquared( self.origin, point ) < 170 * 170 )
672  {
673  score -= 1.0;
674  }
675 
676  if( self ‪canSeeEnemyFromPosition( point, self.enemy ) )
677  {
678  score += 2.0;
679  }
680 
681  /#
682  //DebugStar( point + (0,0,30), 100, ( 1, score, 1 ) );
683  //Print3d( point + (0,0,30), "Score: " + score, ( 1, 1, 1 ), 1, 100 );
684  //Record3dText( "Score: " + score, point + (0,0,30), WHITE, "Script" );
685  #/
686 
687  if ( score > best_score )
688  {
689  best_score = score;
690  best_point = point;
691  }
692  }
693  }
694  else
695  {
696  foreach( point in points )
697  {
698  score = RandomFloat( 1 );
699 
700  if( distance2dSquared( self.origin, point ) < 250 )
701  {
702  score -= 0.5;
703  }
704 
705  if( score > best_score )
706  {
707  best_score = score;
708  best_point = point;
709  }
710  }
711  }
712 
713  if( isdefined( best_point ) )
714  {
715  /#
716  //line( best_point, best_point + (0,0,100), (.3,1,.3), 1.0, true, 100 );
717  #/
718  origin = best_point;
719  }
720 
721  return origin;
722 }
723 
724 // self is vehicle
726 {
727  self waittill( "exit_vehicle", player );
728 
729  player.ignoreme = false;
730  player DisableInvulnerability();
731 
732  self.goalpos = self.origin;
733 }
734 
736 {
737  self endon( "change_state" );
738 
739  driver = self GetSeatOccupant( 0 );
740  if( isdefined(driver) )
741  {
742  self.turretRotScale = 1;
743  self DisableAimAssist();
744  //self thread vehicle_death::vehicle_damage_filter( "firestorm_turret" );
745  self thread ‪croc_set_team( driver.team );
746  driver EnableInvulnerability();
747  driver.ignoreme = true;
748  //self thread croc_player_rocket_recoil( driver );
749  //self thread croc_player_bullet_shake( driver );
750  self thread ‪croc_exit_vehicle();
751  self SetBrake( 0 );
752  }
753 
754  self LaserOff();
755  self ClearTargetEntity();
756  self CancelAIMove();
757  self ClearVehGoalPos();
758 }
759 
761 {
762  next_damage_state = 0;
763 
764  max_health = self.healthdefault;
765  if( isdefined( self.health_max ) )
766  {
767  max_health = self.health_max;
768  }
769 
770  health_pct = self.health / max_health;
771 
772  if ( health_pct <= DAMAGE_STATE_THRESHOLD_PCT_1 && health_pct > ‪DAMAGE_STATE_THRESHOLD_PCT_2 )
773  {
774  next_damage_state = 1;
775  }
776  else if ( health_pct <= DAMAGE_STATE_THRESHOLD_PCT_2 && health_pct > ‪DAMAGE_STATE_THRESHOLD_PCT_3 )
777  {
778  next_damage_state = 2;
779  }
780  else if ( health_pct <= DAMAGE_STATE_THRESHOLD_PCT_3 && health_pct > ‪DAMAGE_STATE_THRESHOLD_PCT_4 )
781  {
782  next_damage_state = 3;
783  }
784  else if ( health_pct <= ‪DAMAGE_STATE_THRESHOLD_PCT_4 )
785  {
786  next_damage_state = 4;
787  }
788 
789  if ( next_damage_state != self.current_damage_state )
790  {
791  /*if ( isdefined( level.fx_damage_effects[ STR_VEHICLETYPE ][ next_damage_state - 1 ] ) )
792  {
793  fx_ent = self get_damage_fx_ent();
794 
795  //PlayFXOnTag( level.fx_damage_effects[ STR_VEHICLETYPE ][ next_damage_state - 1 ], fx_ent, "tag_origin" );
796  }
797  else
798  {
799  // This will get rid of the fx ent
800  get_damage_fx_ent();
801  }*/
802 
803  self.current_damage_state = next_damage_state;
804  }
805 }
806 
808 {
809  if ( isdefined( self.damage_fx_ent ) )
810  self.damage_fx_ent Delete();
811 
812  self.damage_fx_ent = ‪Spawn( "script_model", ( 0, 0, 0 ) );
813  self.damage_fx_ent SetModel( "tag_origin" );
814  self.damage_fx_ent.origin = self.origin;
815  self.damage_fx_ent.angles = self.angles;
816  self.damage_fx_ent LinkTo( self, "tag_turret", (0,0,0), (0,0,0) );
817 
818  return self.damage_fx_ent;
819 }
820 
822 {
823  if( isdefined( self.damage_fx_ent ) )
824  {
825  self.damage_fx_ent delete();
826  }
827 
828  if( isdefined( self.stun_fx ) )
829  {
830  self.stun_fx delete();
831  }
832 }
833 
834 
835 
836 // Death
837 
838 function ‪croc_death()
839 {
840  if ( isdefined( self ) )
841  {
842  self playsound( "veh_croc_power_down" );
843 
844  self ‪croc_requestASMState( "death" );
845  }
846 
847  if( isdefined( self.sndEnt ) )
848  {
849  self.sndEnt stoploopsound( .5 );
850  }
851 
852  if( isdefined( self.‪delete_on_death ) )
853  {
854  self ‪cleanup_fx_ents();
855  self delete();
856  return;
857  }
858 
859  if ( !isdefined( self ) )
860  {
861  return;
862  }
863 
865 
866  self DisableAimAssist();
867  self ‪vehicle::toggle_sounds( false );
868  self ‪vehicle::lights_off();
869  self LaserOff();
870  self ‪cleanup_fx_ents();
871  self ‪vehicle::toggle_tread_fx( false );
872  self ‪vehicle::toggle_exhaust_fx( false );
873 
874 
876  //PlayFXOnTag( level._effect[ "croc_explo" ], fx_ent, "tag_origin" );
877 
878  self ‪croc_crash_movement( self.death_info.attacker );
879 
880  wait 5;
881 
882  //self NotSolid();
883 
884  if ( isdefined( self ) )
885  {
886  //radius = 18;
887  //height = 50;
888  //badplace_box( "", 80, self.origin, radius, "all" );
889  //self freeVehicle();
890  }
891 
892  wait 240;
893 
894  if ( isdefined( self ) )
895  {
896  self delete();
897  }
898 }
899 
900 
901 function ‪death_fx()
902 {
904  self playsound("veh_croc_sparks");
905 }
906 
907 function ‪croc_crash_movement( attacker )
908 {
909  self endon( "crash_done" );
910  self endon( "death" );
911 
912  self CancelAIMove();
913  self ClearVehGoalPos();
914 
915  self.takedamage = 0;
916 
917  self ClearTurretTarget();
918  self SetBrake( 1 );
919 
921 
922  self thread ‪vehicle_death::set_death_model( self.deathmodel, self.modelswapdelay );
923 
925 
926  self notify( "crash_done" );
927 }
928 
929 
930 function ‪croc_emped()
931 {
932  if( isdefined( self.‪emped ) )
933  {
934  // already emped, just return for now.
935  return;
936  }
937 
938  self endon( "death" );
939  self notify( "emped" );
940  self endon( "emped" );
941 
942  self.emped = true;
943  PlaySoundAtPosition( "veh_crocemp_down", self.origin );
944  self.turretRotScale = 0.2;
945  self ‪croc_off();
946  if( !isdefined( self.stun_fx) )
947  {
948  self.stun_fx = ‪Spawn( "script_model", self.origin );
949  self.stun_fx SetModel( "tag_origin" );
950  self.stun_fx LinkTo( self, "tag_turret", (0,0,0), (0,0,0) );
951  //PlayFXOnTag( level._effect[ "croc_stun" ], self.stun_fx, "tag_origin" );
952  }
953 
954  wait RandomFloatRange( 4, 8 );
955 
956  self.stun_fx delete();
957 
958  self.emped = undefined;
959  self.weak_spot_health = ‪DEFAULT_WEAK_SPOT_DAMAGE_LIMIT;
960  self ‪croc_on();
961  self playsound ("veh_boot_croc");
962 }
963 
964 function ‪crocCallback_VehicleDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName )
965 {
966  is_damaged_by_grenade = weapon.weapClass == "grenade";
967 
968  if( isdefined( eAttacker ) && ( eAttacker == self || eAttacker.team == self.team ) )
969  {
970  return 0;
971  }
972 
973  if( partName == "tag_target_turret_right" || partName == "tag_target_turret_left" ||
974  partName == "tag_target_left" || partName == "tag_target_right" || partName == "tag_target_left1" || partName == "tag_target_right1" )
975  {
976  self.weak_spot_health -= iDamage;
977  if( self.weak_spot_health <= 0 )
978  {
979  self thread ‪croc_emped();
980  }
981 
982  iDamage = Int( iDamage * 3 );
983 
984  self playsound( "veh_croc_panel_hit" );
985  //PlayFxOnTag( self.settings.weakSpotFx, self, partName );
986  }
987  else if( partName == "tag_gunner_barrel1" || partName == "tag_gunner_turret1" )
988  {
989  //PlayFxOnTag( self.settings.weakSpotFx, self, partName );
990 
991  self.left_turret_health -= iDamage;
992  if( self.left_turret_health <= 0 )
993  {
994  //croc_destroyturret( 1 );
995  }
996  }
997  else if( partName == "tag_gunner_barrel2" || partName == "tag_gunner_turret2" )
998  {
999  //PlayFxOnTag( self.settings.weakSpotFx, self, partName );
1000 
1001  self.right_turret_health -= iDamage;
1002  if( self.right_turret_health <= 0 )
1003  {
1004  //croc_destroyturret( 2 );
1005  }
1006  }
1007  else if ( is_damaged_by_grenade || sMeansOfDeath == "MOD_EXPLOSIVE" )
1008  {
1009  iDamage = Int( iDamage * 3 );
1010  }
1011 
1012  // when taking damage let the turret know if it is scanning to look at our enemy
1013  // hopefully code will update our enemy
1014  self.turretRotScale = 1.0;
1015 
1017 
1018  driver = self GetSeatOccupant( 0 );
1019 
1020  if( weapon.isEmp && sMeansOfDeath != "MOD_IMPACT" )
1021  {
1022  if( !isdefined(driver) )
1023  {
1024  self thread ‪croc_emped();
1025  }
1026  }
1027 
1028  if( isdefined( driver ) )
1029  {
1030  // Lets get some hit indicators
1031  //driver FinishPlayerDamage( eInflictor, eAttacker, 1, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, "none", 0, psOffsetTime );
1032  }
1033 
1034  return iDamage;
1035 }
1036 
1037 
1038 function ‪croc_set_team( team )
1039 {
1040  self.team = team;
1041 
1042  if( !isdefined( self.off ) )
1043  {
1045  }
1046 }
1047 
1049 {
1050  self endon( "death" );
1051 
1052  self ‪vehicle::lights_off();
1053  wait 0.1;
1054  self ‪vehicle::lights_on();
1055  wait 0.1;
1056  self ‪vehicle::lights_off();
1057  wait 0.1;
1058  self ‪vehicle::lights_on();
1059 }
1060 
1062 {
1063  self endon( "death" );
1064  self endon( "recoil_thread" );
1065 
1066  while( 1 )
1067  {
1068  self waittill( "turret_fire" );
1069  angles = self GetTagAngles( "tag_barrel" );
1070  dir = AnglesToForward( angles );
1071  self LaunchVehicle( dir * -5, self.origin + (0,0,30), false );
1072  Earthquake( 0.2, 0.2, player.origin, 200 );
1073  }
1074 }
1075 
1077 {
1078  self notify( "recoil_thread" );
1079  self endon( "recoil_thread" );
1080  self endon( "death" );
1081 
1082  while( 1 )
1083  {
1084  player waittill( "missile_fire" );
1085 
1086  angles = self GetTagAngles( "tag_barrel" );
1087  dir = AnglesToForward( angles );
1088 
1089  self LaunchVehicle( dir * -30, self.origin + (0,0,70), false );
1090  Earthquake( 0.4, 0.3, player.origin, 200 );
1091 
1092  //self SetAnimRestart( %vehicles::o_drone_tank_missile_fire_sp, 1, 0, 0.4 );
1093  }
1094 }
‪goal_flag_monitor
‪function goal_flag_monitor()
Definition: _croc.gsc:444
‪set_death_model
‪function set_death_model(sModel, fDelay)
Definition: vehicle_death_shared.gsc:258
‪croc_find_new_position
‪function croc_find_new_position()
Definition: _croc.gsc:615
‪lights_off
‪function lights_off(localClientNum)
Definition: vehicle_shared.csc:652
‪set_state
‪function set_state(name, state_params)
Definition: statemachine_shared.gsc:133
‪croc_death
‪function croc_death()
Definition: _croc.gsc:838
‪crocCallback_VehicleDamage
‪function crocCallback_VehicleDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName)
Definition: _croc.gsc:964
‪MELEE_RADIUS
‪#define MELEE_RADIUS
Definition: _croc.gsc:33
‪toggle_tread_fx
‪function toggle_tread_fx(on)
Definition: vehicle_shared.gsc:3357
‪DAMAGE_STATE_THRESHOLD_PCT_3
‪#define DAMAGE_STATE_THRESHOLD_PCT_3
Definition: _croc.gsc:26
‪clear
‪function clear(str_flag)
Definition: flag_shared.csc:130
‪death_fx
‪function death_fx()
Definition: _croc.gsc:901
‪__init__
‪function __init__()
Definition: _croc.gsc:46
‪croc_update_damage_fx
‪function croc_update_damage_fx()
Definition: _croc.gsc:760
‪fx_ent
‪var fx_ent
Definition: traps_shared.gsc:2008
‪main
‪function main()
Definition: _croc.gsc:63
‪aim_at_best_shoot_location
‪function aim_at_best_shoot_location()
Definition: _croc.gsc:236
‪toggle_exhaust_fx
‪function toggle_exhaust_fx(on)
Definition: vehicle_shared.gsc:3335
‪MELEE_INNER_RADIUS_DAMAGE
‪#define MELEE_INNER_RADIUS_DAMAGE
Definition: _croc.gsc:34
‪croc_scripted
‪function croc_scripted()
Definition: _croc.gsc:735
‪croc_testBuoyancy
‪function croc_testBuoyancy()
Definition: _croc.gsc:459
‪isOnLand
‪function isOnLand()
Definition: _croc.gsc:75
‪death_cleanup_level_variables
‪function death_cleanup_level_variables()
Definition: vehicle_death_shared.gsc:1144
‪waittill_pathing_done
‪function waittill_pathing_done()
Definition: _croc.gsc:432
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪canSeeEnemyFromPosition
‪function canSeeEnemyFromPosition(position, enemy)
Definition: _croc.gsc:568
‪MELEE_OUTER_RADIUS_DAMAGE
‪#define MELEE_OUTER_RADIUS_DAMAGE
Definition: _croc.gsc:35
‪croc_player_rocket_recoil
‪function croc_player_rocket_recoil(player)
Definition: _croc.gsc:1076
‪check_melee
‪function check_melee()
Definition: _croc.gsc:340
‪DAMAGE_STATE_THRESHOLD_PCT_2
‪#define DAMAGE_STATE_THRESHOLD_PCT_2
Definition: _croc.gsc:25
‪bootup
‪function bootup()
Definition: _croc.gsc:191
‪death_radius_damage
‪function death_radius_damage(meansOfDamage="MOD_EXPLOSIVE")
Definition: vehicle_death_shared.gsc:1196
‪croc_movementupdate
‪function croc_movementupdate()
Definition: _croc.gsc:474
‪croc_think
‪function croc_think()
Definition: _croc.gsc:92
‪path_update_interrupt
‪function path_update_interrupt()
Definition: _croc.gsc:376
‪croc_requestASMState
‪function croc_requestASMState(statename)
Definition: _croc.gsc:80
‪croc_player_bullet_shake
‪function croc_player_bullet_shake(player)
Definition: _croc.gsc:1061
‪croc_main
‪function croc_main()
Definition: _croc.gsc:328
‪cleanup_fx_ents
‪function cleanup_fx_ents()
Definition: _croc.gsc:821
‪croc_blink_lights
‪function croc_blink_lights()
Definition: _croc.gsc:1048
‪end
‪function end(final)
Definition: _killcam.gsc:511
‪show_weak_spots
‪function show_weak_spots(show)
Definition: _croc.gsc:214
‪init_state_machine_for_role
‪function init_state_machine_for_role(rolename)
Definition: vehicle_ai_shared.gsc:1034
‪waittill_any
‪function waittill_any(str_notify1, str_notify2, str_notify3, str_notify4, str_notify5)
Definition: util_shared.csc:375
‪set_role
‪function set_role(rolename)
Definition: vehicle_ai_shared.gsc:910
‪croc_exit_vehicle
‪function croc_exit_vehicle()
Definition: _croc.gsc:725
‪wait_till
‪function wait_till(str_flag)
Definition: flag_shared.csc:189
‪isInWater
‪function isInWater()
Definition: _croc.gsc:70
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪croc_crash_movement
‪function croc_crash_movement(attacker)
Definition: _croc.gsc:907
‪DEFAULT_WEAK_SPOT_DAMAGE_LIMIT
‪#define DEFAULT_WEAK_SPOT_DAMAGE_LIMIT
Definition: _croc.gsc:31
‪emped
‪function emped(down_time)
Definition: _siegebot.gsc:1359
‪Spawn
‪function Spawn(parent, onDeathCallback)
Definition: _flak_drone.gsc:427
‪get_damage_fx_ent
‪function get_damage_fx_ent()
Definition: _croc.gsc:807
‪croc_set_swim_depth
‪function croc_set_swim_depth(swimDepth)
Definition: _croc.gsc:454
‪init
‪function init()
Definition: struct.csc:1
‪croc_find_next_patrol_node
‪function croc_find_next_patrol_node()
Definition: _croc.gsc:574
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪exists
‪function exists(str_flag)
Definition: flag_shared.csc:43
‪croc_on
‪function croc_on()
Definition: _croc.gsc:179
‪croc_start_ai
‪function croc_start_ai(state)
Definition: _croc.gsc:313
‪FLAT_ORIGIN
‪#define FLAT_ORIGIN(__origin)
Definition: shared.gsh:256
‪croc_emped
‪function croc_emped()
Definition: _croc.gsc:930
‪do_death_fx
‪function do_death_fx()
Definition: vehicle_shared.gsc:2855
‪croc_set_team
‪function croc_set_team(team)
Definition: _croc.gsc:1038
‪clamp
‪function clamp(val, val_min, val_max)
Definition: math_shared.csc:16
‪toggle_sounds
‪function toggle_sounds(on)
Definition: vehicle_shared.gsc:3379
‪croc_stop_ai
‪function croc_stop_ai()
Definition: _croc.gsc:323
‪delete_on_death
‪function delete_on_death(ent)
Definition: util_shared.gsc:1796
‪lights_on
‪function lights_on(localClientNum, team)
Definition: vehicle_shared.csc:404
‪DAMAGE_STATE_THRESHOLD_PCT_4
‪#define DAMAGE_STATE_THRESHOLD_PCT_4
Definition: _croc.gsc:27
‪get_state_callbacks
‪function get_state_callbacks(statename)
Definition: vehicle_ai_shared.gsc:927
‪croc_off
‪function croc_off()
Definition: _croc.gsc:155
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265