burc_2004

_zm_ai_mechz_ft.gsc

Oct 22nd, 2015
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.03 KB | None | 0 0
  1. #include maps/mp/_visionset_mgr;
  2. #include maps/mp/animscripts/zm_shared;
  3. #include maps/mp/zombies/_zm_ai_mechz;
  4. #include maps/mp/zombies/_zm_ai_mechz_dev;
  5. #include maps/mp/zm_tomb_tank;
  6. #include maps/mp/animscripts/zm_utility;
  7. #include maps/mp/zombies/_zm_utility;
  8. #include maps/mp/zombies/_zm_net;
  9. #include maps/mp/_utility;
  10. #include common_scripts/utility;
  11. #include maps/mp/zombies/_zm_zonemgr;
  12.  
  13. #using_animtree( "mechz_claw" );
  14.  
  15. init_flamethrower_triggers()
  16. {
  17.     flag_wait( "initial_players_connected" );
  18.     level.flamethrower_trigger_array = getentarray( "flamethrower_trigger", "script_noteworthy" );
  19. /#
  20.     if ( isDefined( level.flamethrower_trigger_array ) )
  21.     {
  22.         assert( level.flamethrower_trigger_array.size >= 4 );
  23.     }
  24. #/
  25.     i = 0;
  26.     while ( i < level.flamethrower_trigger_array.size )
  27.     {
  28.         level.flamethrower_trigger_array[ i ] enablelinkto();
  29.         i++;
  30.     }
  31. }
  32.  
  33. mechz_flamethrower_initial_setup()
  34. {
  35.     self endon( "death" );
  36.     if ( isDefined( self.flamethrower_trigger ) )
  37.     {
  38.         self release_flamethrower_trigger();
  39.     }
  40.     self.flamethrower_trigger = get_flamethrower_trigger();
  41.     if ( !isDefined( self.flamethrower_trigger ) )
  42.     {
  43. /#
  44.         println( "Error: No free flamethrower triggers! Make sure you haven't spawned more than 4 mech zombies" );
  45. #/
  46.         return;
  47.     }
  48.     self.flamethrower_trigger.origin = self gettagorigin( "tag_flamethrower_FX" );
  49.     self.flamethrower_trigger.angles = self gettagangles( "tag_flamethrower_FX" );
  50.     self.flamethrower_trigger linkto( self, "tag_flamethrower_FX" );
  51.     self thread mechz_watch_for_flamethrower_damage();
  52. }
  53.  
  54. get_flamethrower_trigger()
  55. {
  56.     i = 0;
  57.     while ( i < level.flamethrower_trigger_array.size )
  58.     {
  59.         if ( isDefined( level.flamethrower_trigger_array[ i ].in_use ) && !level.flamethrower_trigger_array[ i ].in_use )
  60.         {
  61.             level.flamethrower_trigger_array[ i ].in_use = 1;
  62.             level.flamethrower_trigger_array[ i ].original_position = level.flamethrower_trigger_array[ i ].origin;
  63.             return level.flamethrower_trigger_array[ i ];
  64.         }
  65.         i++;
  66.     }
  67.     return undefined;
  68. }
  69.  
  70. release_flamethrower_trigger()
  71. {
  72.     if ( !isDefined( self.flamethrower_trigger ) )
  73.     {
  74.         return;
  75.     }
  76.     self.flamethrower_trigger.in_use = 0;
  77.     self.flamethrower_trigger unlink();
  78.     self.flamethrower_trigger.origin = self.flamethrower_trigger.original_position;
  79.     self.flamethrower_linked = 0;
  80.     self.flamethrower_trigger = undefined;
  81. }
  82.  
  83. mechz_flamethrower_dist_watcher()
  84. {
  85.     self endon( "kill_ft" );
  86.     wait 0,5;
  87.     while ( 1 )
  88.     {
  89.         if ( isDefined( self.favoriteenemy ) || !is_player_valid( self.favoriteenemy, 1, 1 ) && distancesquared( self.origin, self.favoriteenemy.origin ) > 50000 )
  90.         {
  91.             self notify( "stop_ft" );
  92.             return;
  93.         }
  94.         wait 0,05;
  95.     }
  96. }
  97.  
  98. mechz_flamethrower_arc_watcher()
  99. {
  100.     self endon( "death" );
  101.     self endon( "kill_ft" );
  102.     self endon( "stop_ft" );
  103.     aim_anim = undefined;
  104.     while ( 1 )
  105.     {
  106.         old_anim = aim_anim;
  107.         aim_anim = mechz_get_aim_anim( "zm_flamethrower", self.favoriteenemy.origin, 26 );
  108.         self.curr_aim_anim = aim_anim;
  109.         if ( !isDefined( aim_anim ) )
  110.         {
  111.             self notify( "stop_ft" );
  112.             return;
  113.         }
  114.         if ( !isDefined( old_anim ) || old_anim != aim_anim )
  115.         {
  116.             self notify( "arc_change" );
  117.         }
  118.         wait 0,05;
  119.     }
  120. }
  121.  
  122. mechz_play_flamethrower_aim()
  123. {
  124.     self endon( "death" );
  125.     self endon( "kill_ft" );
  126.     self endon( "stop_ft" );
  127.     self endon( "arc_change" );
  128.     if ( isDefined( self.curr_aim_anim ) )
  129.     {
  130.         self stopanimscripted();
  131.         self animscripted( self.origin, self.angles, self.curr_aim_anim );
  132.         self maps/mp/animscripts/zm_shared::donotetracks( "flamethrower_anim" );
  133.     }
  134.     else
  135.     {
  136.         wait 0,05;
  137.     }
  138. }
  139.  
  140. mechz_flamethrower_aim()
  141. {
  142.     self endon( "death" );
  143.     self endon( "kill_ft" );
  144.     self endon( "stop_ft" );
  145.     self waittillmatch( "flamethrower_anim" );
  146.     return "end";
  147.     self thread mechz_flamethrower_dist_watcher();
  148.     self thread mechz_flamethrower_arc_watcher();
  149.     aim_anim = undefined;
  150.     while ( 1 )
  151.     {
  152.         self mechz_play_flamethrower_aim();
  153.     }
  154. }
  155.  
  156. mechz_flamethrower_tank_sweep()
  157. {
  158.     self endon( "death" );
  159.     self endon( "kill_ft" );
  160.     self endon( "stop_ft" );
  161.     while ( 1 )
  162.     {
  163.         self stopanimscripted();
  164.         self.angles = vectorToAngle( level.vh_tank.origin - self.origin );
  165.         self animscripted( self.origin, self.angles, "zm_flamethrower_sweep_up" );
  166.         self maps/mp/animscripts/zm_shared::donotetracks( "flamethrower_anim" );
  167.         if ( level.vh_tank ent_flag( "tank_moving" ) )
  168.         {
  169.             break;
  170.         }
  171.         else a_players_on_tank = get_players_on_tank( 1 );
  172.         if ( !a_players_on_tank.size )
  173.         {
  174.             break;
  175.         }
  176.         else
  177.         {
  178.         }
  179.     }
  180.     self notify( "stop_ft" );
  181. }
  182.  
  183. mechz_stop_firing_watcher()
  184. {
  185.     self endon( "death" );
  186.     self endon( "kill_ft" );
  187.     self endon( "flamethrower_complete" );
  188.     self waittillmatch( "flamethrower_anim" );
  189.     return "stop_ft";
  190.     self.firing = 0;
  191. }
  192.  
  193. mechz_watch_for_flamethrower_damage()
  194. {
  195.     self endon( "death" );
  196.     while ( 1 )
  197.     {
  198.         self waittillmatch( "flamethrower_anim" );
  199.         return "start_ft";
  200.         self.firing = 1;
  201.         self thread mechz_stop_firing_watcher();
  202.         while ( isDefined( self.firing ) && self.firing )
  203.         {
  204.             if ( isDefined( self.doing_tank_sweep ) && self.doing_tank_sweep )
  205.             {
  206.                 do_tank_sweep_auto_damage = !level.vh_tank ent_flag( "tank_moving" );
  207.             }
  208.             players = getplayers();
  209.             i = 0;
  210.             while ( i < players.size )
  211.             {
  212.                 if ( isDefined( players[ i ].is_burning ) && !players[ i ].is_burning )
  213.                 {
  214.                     if ( do_tank_sweep_auto_damage || players[ i ] entity_on_tank() && players[ i ] istouching( self.flamethrower_trigger ) )
  215.                     {
  216.                         players[ i ] thread player_flame_damage();
  217.                     }
  218.                 }
  219.                 i++;
  220.             }
  221.             zombies = getaispeciesarray( "axis", "all" );
  222.             i = 0;
  223.             while ( i < zombies.size )
  224.             {
  225.                 if ( isDefined( zombies[ i ].is_mechz ) && zombies[ i ].is_mechz )
  226.                 {
  227.                     i++;
  228.                     continue;
  229.                 }
  230.                 else
  231.                 {
  232.                     if ( isDefined( zombies[ i ].on_fire ) && zombies[ i ].on_fire )
  233.                     {
  234.                         i++;
  235.                         continue;
  236.                     }
  237.                     else
  238.                     {
  239.                         if ( do_tank_sweep_auto_damage || zombies[ i ] entity_on_tank() && zombies[ i ] istouching( self.flamethrower_trigger ) )
  240.                         {
  241.                             zombies[ i ].on_fire = 1;
  242.                             zombies[ i ] promote_to_explosive();
  243.                         }
  244.                     }
  245.                 }
  246.                 i++;
  247.             }
  248.             wait 0,1;
  249.         }
  250.     }
  251. }
  252.  
  253. player_flame_damage()
  254. {
  255.     self endon( "zombified" );
  256.     self endon( "death" );
  257.     self endon( "disconnect" );
  258.     n_player_dmg = 30;
  259.     n_jugga_dmg = 45;
  260.     n_burn_time = 1,5;
  261.     if ( isDefined( self.is_zombie ) && self.is_zombie )
  262.     {
  263.         return;
  264.     }
  265.     self thread player_stop_burning();
  266.     if ( !isDefined( self.is_burning ) && is_player_valid( self, 1, 0 ) )
  267.     {
  268.         self.is_burning = 1;
  269.         maps/mp/_visionset_mgr::vsmgr_activate( "overlay", "zm_transit_burn", self, n_burn_time, level.zm_transit_burn_max_duration );
  270.         self notify( "burned" );
  271.         if ( !self hasperk( "specialty_armorvest" ) )
  272.         {
  273.             self dodamage( n_player_dmg, self.origin );
  274.         }
  275.         else
  276.         {
  277.             self dodamage( n_jugga_dmg, self.origin );
  278.         }
  279.         wait 0,5;
  280.         self.is_burning = undefined;
  281.     }
  282. }
  283.  
  284. player_stop_burning()
  285. {
  286.     self notify( "player_stop_burning" );
  287.     self endon( "player_stop_burning" );
  288.     self endon( "death_or_disconnect" );
  289.     self waittill( "zombified" );
  290.     self notify( "stop_flame_damage" );
  291.     maps/mp/_visionset_mgr::vsmgr_deactivate( "overlay", "zm_transit_burn", self );
  292. }
  293.  
  294. zombie_burning_fx()
  295. {
  296.     self endon( "death" );
  297.     self endon( "stop_flame_damage" );
  298.     while ( 1 )
  299.     {
  300.         if ( isDefined( level._effect ) && isDefined( level._effect[ "character_fire_death_torso" ] ) )
  301.         {
  302.             if ( !self.isdog )
  303.             {
  304.                 playfxontag( level._effect[ "character_fire_death_torso" ], self, "J_SpineLower" );
  305.             }
  306.         }
  307.         if ( isDefined( level._effect ) && isDefined( level._effect[ "character_fire_death_sm" ] ) )
  308.         {
  309.             wait 1;
  310.             tagarray = [];
  311.             if ( randomint( 2 ) == 0 )
  312.             {
  313.                 tagarray[ 0 ] = "J_Elbow_LE";
  314.                 tagarray[ 1 ] = "J_Elbow_RI";
  315.                 tagarray[ 2 ] = "J_HEAD";
  316.             }
  317.             else
  318.             {
  319.                 tagarray[ 0 ] = "J_Wrist_RI";
  320.                 tagarray[ 1 ] = "J_Wrist_LE";
  321.                 tagarray[ 2 ] = "J_HEAD";
  322.             }
  323.             tagarray = array_randomize( tagarray );
  324.             self thread network_safe_play_fx_on_tag( "flamethrower", 2, level._effect[ "character_fire_death_sm" ], self, tagarray[ 0 ] );
  325.         }
  326.         wait 12;
  327.     }
  328. }
  329.  
  330. zombie_burning_audio()
  331. {
  332.     self playloopsound( "zmb_fire_loop" );
  333.     self waittill_any( "death", "stop_flame_damage" );
  334.     if ( isDefined( self ) && isalive( self ) )
  335.     {
  336.         self stoploopsound( 0,25 );
  337.     }
  338. }
  339.  
  340. zombie_burning_dmg()
  341. {
  342.     self endon( "death" );
  343.     self endon( "stop_flame_damage" );
  344.     damageradius = 25;
  345.     damage = 2;
  346.     while ( 1 )
  347.     {
  348.         eyeorigin = self geteye();
  349.         players = get_players();
  350.         i = 0;
  351.         while ( i < players.size )
  352.         {
  353.             if ( is_player_valid( players[ i ], 1, 0 ) )
  354.             {
  355.                 playereye = players[ i ] geteye();
  356.                 if ( distancesquared( eyeorigin, playereye ) < ( damageradius * damageradius ) )
  357.                 {
  358.                     players[ i ] dodamage( damage, self.origin, self );
  359.                     players[ i ] notify( "burned" );
  360.                 }
  361.             }
  362.             i++;
  363.         }
  364.         wait 1;
  365.     }
  366. }
  367.  
  368. promote_to_explosive()
  369. {
  370.     self endon( "death" );
  371.     self thread zombie_burning_audio();
  372.     self thread zombie_burning_fx();
  373.     self thread explode_on_death();
  374.     self thread zombie_burning_dmg();
  375.     self thread on_fire_timeout();
  376. }
  377.  
  378. explode_on_death()
  379. {
  380.     self endon( "stop_flame_damage" );
  381.     self waittill( "death" );
  382.     if ( !isDefined( self ) )
  383.     {
  384.         return;
  385.     }
  386.     tag = "J_SpineLower";
  387.     if ( isDefined( self.animname ) && self.animname == "zombie_dog" )
  388.     {
  389.         tag = "tag_origin";
  390.     }
  391.     if ( is_mature() )
  392.     {
  393.         if ( isDefined( level._effect[ "zomb_gib" ] ) )
  394.         {
  395.             playfx( level._effect[ "zomb_gib" ], self gettagorigin( tag ) );
  396.         }
  397.     }
  398.     else
  399.     {
  400.         if ( isDefined( level._effect[ "spawn_cloud" ] ) )
  401.         {
  402.             playfx( level._effect[ "spawn_cloud" ], self gettagorigin( tag ) );
  403.         }
  404.     }
  405.     self radiusdamage( self.origin, 128, 30, 15, undefined, "MOD_EXPLOSIVE" );
  406.     self ghost();
  407.     if ( isDefined( self.isdog ) && self.isdog )
  408.     {
  409.         self hide();
  410.     }
  411.     else
  412.     {
  413.         self delay_thread( 1, ::self_delete );
  414.     }
  415. }
  416.  
  417. on_fire_timeout()
  418. {
  419.     self endon( "death" );
  420.     wait 12;
  421.     if ( isDefined( self ) && isalive( self ) )
  422.     {
  423.         self.is_on_fire = 0;
  424.         self notify( "stop_flame_damage" );
  425.     }
  426. }
  427.  
  428. should_do_flamethrower_attack()
  429. {
  430. /#
  431.     assert( isDefined( self.favoriteenemy ) );
  432. #/
  433. /#
  434.     if ( getDvarInt( #"E7121222" ) > 1 )
  435.     {
  436.         println( "\n\tMZ: Checking should flame\n" );
  437. #/
  438.     }
  439.     if ( isDefined( self.disable_complex_behaviors ) && self.disable_complex_behaviors )
  440.     {
  441. /#
  442.         if ( getDvarInt( #"E7121222" ) > 1 )
  443.         {
  444.             println( "\n\t\tMZ: Not doing flamethrower because doing force aggro\n" );
  445. #/
  446.         }
  447.         return 0;
  448.     }
  449.     if ( isDefined( self.not_interruptable ) && self.not_interruptable )
  450.     {
  451. /#
  452.         if ( getDvarInt( #"E7121222" ) > 1 )
  453.         {
  454.             println( "\n\t\tMZ: Not doing flamethrower because another behavior has set not_interruptable\n" );
  455. #/
  456.         }
  457.         return 0;
  458.     }
  459.     if ( !self mechz_check_in_arc( 26 ) )
  460.     {
  461. /#
  462.         if ( getDvarInt( #"E7121222" ) > 1 )
  463.         {
  464.             println( "\n\t\tMZ: Not doing flamethrower because target is not in front arc\n" );
  465. #/
  466.         }
  467.         return 0;
  468.     }
  469.     if ( isDefined( self.last_flamethrower_time ) && ( getTime() - self.last_flamethrower_time ) < level.mechz_flamethrower_cooldown_time )
  470.     {
  471. /#
  472.         if ( getDvarInt( #"E7121222" ) > 1 )
  473.         {
  474.             println( "\n\t\tMZ: Not doing flamethrower because it is still on cooldown\n" );
  475. #/
  476.         }
  477.         return 0;
  478.     }
  479.     n_dist_sq = distancesquared( self.origin, self.favoriteenemy.origin );
  480.     if ( n_dist_sq < 10000 || n_dist_sq > 50000 )
  481.     {
  482. /#
  483.         if ( getDvarInt( #"E7121222" ) > 1 )
  484.         {
  485.             println( "\n\t\tMZ: Not doing flamethrower because target is not in range\n" );
  486. #/
  487.         }
  488.         return 0;
  489.     }
  490.     b_cansee = bullettracepassed( self.origin + vectorScale( ( 0, 0, 1 ), 36 ), self.favoriteenemy.origin + vectorScale( ( 0, 0, 1 ), 36 ), 0, undefined );
  491.     if ( !b_cansee )
  492.     {
  493. /#
  494.         if ( getDvarInt( #"E7121222" ) > 1 )
  495.         {
  496.             println( "\n\t\tMZ: Not doing flamethrower because cannot see target\n" );
  497. #/
  498.         }
  499.         return 0;
  500.     }
  501.     return 1;
  502. }
  503.  
  504. mechz_do_flamethrower_attack( tank_sweep )
  505. {
  506.     self endon( "death" );
  507.     self endon( "kill_ft" );
  508. /#
  509.     if ( getDvarInt( #"E7121222" ) > 0 )
  510.     {
  511.         println( "\n\tMZ: Doing Flamethrower Attack\n" );
  512. #/
  513.     }
  514.     self thread mechz_stop_basic_find_flesh();
  515.     self.ai_state = "flamethrower_attack";
  516.     self setgoalpos( self.origin );
  517.     self clearanim( %root, 0,2 );
  518.     self.last_flamethrower_time = getTime();
  519.     self thread mechz_kill_flamethrower_watcher();
  520.     if ( !isDefined( self.flamethrower_trigger ) )
  521.     {
  522.         self mechz_flamethrower_initial_setup();
  523.     }
  524.     n_nearby_enemies = 0;
  525.     a_players = getplayers();
  526.     _a628 = a_players;
  527.     _k628 = getFirstArrayKey( _a628 );
  528.     while ( isDefined( _k628 ) )
  529.     {
  530.         player = _a628[ _k628 ];
  531.         if ( distance2dsquared( player.origin, self.favoriteenemy.origin ) < 10000 )
  532.         {
  533.             n_nearby_enemies++;
  534.         }
  535.         _k628 = getNextArrayKey( _a628, _k628 );
  536.     }
  537.     if ( isDefined( tank_sweep ) && tank_sweep )
  538.     {
  539.         self.doing_tank_sweep = 1;
  540.         self thread mechz_flamethrower_tank_sweep();
  541.     }
  542.     else
  543.     {
  544.         if ( randomint( 100 ) < level.mechz_ft_sweep_chance && n_nearby_enemies > 1 )
  545.         {
  546.             self.doing_ft_sweep = 1;
  547.             self animscripted( self.origin, self.angles, "zm_flamethrower_sweep" );
  548.             self maps/mp/animscripts/zm_shared::donotetracks( "flamethrower_anim" );
  549.         }
  550.         else
  551.         {
  552.             self animscripted( self.origin, self.angles, "zm_flamethrower_aim_start" );
  553.             self thread mechz_flamethrower_aim();
  554.             self maps/mp/animscripts/zm_shared::donotetracks( "flamethrower_anim" );
  555.         }
  556.     }
  557.     self orientmode( "face default" );
  558.     if ( isDefined( self.doing_ft_sweep ) && self.doing_ft_sweep )
  559.     {
  560.         self.doing_ft_sweep = 0;
  561.     }
  562.     else
  563.     {
  564.         self.cant_melee = 1;
  565.         self waittill( "stop_ft" );
  566.         self mechz_flamethrower_cleanup();
  567.         wait 0,5;
  568.         self stopanimscripted();
  569.         return;
  570.     }
  571.     self mechz_flamethrower_cleanup();
  572. }
  573.  
  574. mechz_kill_flamethrower_watcher()
  575. {
  576.     self endon( "flamethrower_complete" );
  577.     self waittill_either( "kill_ft", "death" );
  578.     self mechz_flamethrower_cleanup();
  579. }
  580.  
  581. mechz_flamethrower_cleanup()
  582. {
  583.     self.fx_field &= 64;
  584.     self setclientfield( "mechz_fx", self.fx_field );
  585.     self.firing = 0;
  586.     self.doing_tank_sweep = 0;
  587.     self.cant_melee = 0;
  588.     self notify( "flamethrower_complete" );
  589. }
Advertisement
Add Comment
Please, Sign In to add comment