burc_2004

_zm_ai_mechz_claw.gsc

Oct 22nd, 2015
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 17.62 KB | None | 0 0
  1. #include maps/mp/zombies/_zm_weap_riotshield_tomb;
  2. #include maps/mp/zombies/_zm_laststand;
  3. #include maps/mp/animscripts/zm_shared;
  4. #include maps/mp/zombies/_zm_ai_mechz_ft;
  5. #include maps/mp/zombies/_zm_ai_mechz;
  6. #include maps/mp/zombies/_zm_ai_mechz_dev;
  7. #include maps/mp/zm_tomb_tank;
  8. #include maps/mp/animscripts/zm_utility;
  9. #include maps/mp/zm_tomb_utility;
  10. #include maps/mp/zombies/_zm_utility;
  11. #include maps/mp/zombies/_zm_net;
  12. #include maps/mp/_utility;
  13. #include common_scripts/utility;
  14. #include maps/mp/zombies/_zm_zonemgr;
  15.  
  16. #using_animtree( "mechz_claw" );
  17.  
  18. mechz_claw_detach()
  19. {
  20.     if ( isDefined( self.m_claw ) )
  21.     {
  22.         self.m_claw setanim( %ai_zombie_mech_grapple_arm_open_idle, 1, 0,2, 1 );
  23.         if ( isDefined( self.m_claw.fx_ent ) )
  24.         {
  25.             self.m_claw.fx_ent delete();
  26.         }
  27.         self.m_claw unlink();
  28.         self.m_claw physicslaunch( self.m_claw.origin, ( 0, 0, 0 ) );
  29.         self.m_claw thread mechz_delayed_item_delete();
  30.         self.m_claw = undefined;
  31.     }
  32.     if ( isDefined( self.m_claw_damage_trigger ) )
  33.     {
  34.         self.m_claw_damage_trigger unlink();
  35.         self.m_claw_damage_trigger delete();
  36.         self.m_claw_damage_trigger = undefined;
  37.     }
  38. }
  39.  
  40. mechz_claw_release( bopenclaw )
  41. {
  42.     self.explosive_dmg_taken_on_grab_start = undefined;
  43.     if ( isDefined( self.e_grabbed ) )
  44.     {
  45.         if ( isplayer( self.e_grabbed ) )
  46.         {
  47.             self.e_grabbed setclientfieldtoplayer( "mechz_grab", 0 );
  48.             self.e_grabbed allowcrouch( 1 );
  49.             self.e_grabbed allowprone( 1 );
  50.         }
  51.         if ( !isDefined( self.e_grabbed._fall_down_anchor ) )
  52.         {
  53.             trace_start = self.e_grabbed.origin + vectorScale( ( 0, 0, 0 ), 70 );
  54.             trace_end = self.e_grabbed.origin + vectorScale( ( 0, 0, 0 ), 500 );
  55.             drop_trace = playerphysicstrace( trace_start, trace_end ) + vectorScale( ( 0, 0, 0 ), 24 );
  56.             self.e_grabbed unlink();
  57.             self.e_grabbed setorigin( drop_trace );
  58.         }
  59.         self.e_grabbed = undefined;
  60.         if ( isDefined( bopenclaw ) && bopenclaw )
  61.         {
  62.             self.m_claw setanim( %ai_zombie_mech_grapple_arm_open_idle, 1, 0,2, 1 );
  63.         }
  64.     }
  65. }
  66.  
  67. mechz_claw_shot_pain_reaction()
  68. {
  69.     self mechz_interrupt();
  70.     self animscripted( self.origin, self.angles, "zm_head_pain" );
  71.     self maps/mp/animscripts/zm_shared::donotetracks( "head_pain_anim" );
  72. }
  73.  
  74. ent_released_from_claw_grab_achievement( e_releaser, e_held_by_mechz )
  75. {
  76.     if ( isDefined( e_releaser ) && isDefined( e_held_by_mechz ) && isplayer( e_releaser ) && isplayer( e_held_by_mechz ) )
  77.     {
  78.         if ( e_releaser == e_held_by_mechz )
  79.         {
  80.             e_releaser notify( "mechz_grab_released_self" );
  81.             return;
  82.         }
  83.         else
  84.         {
  85.             e_releaser notify( "mechz_grab_released_friendly" );
  86.         }
  87.     }
  88. }
  89.  
  90. mechz_claw_notetracks()
  91. {
  92.     self endon( "death" );
  93.     self endon( "kill_claw" );
  94.     self waittillmatch( "grapple_anim" );
  95.     return "muzzleflash";
  96.     self waittillmatch( "grapple_anim" );
  97.     return "end";
  98. }
  99.  
  100. mechz_claw_aim( target_pos )
  101. {
  102.     self endon( "death" );
  103.     self endon( "kill_claw" );
  104.     self endon( "claw_complete" );
  105.     aim_anim = mechz_get_aim_anim( "zm_grapple", target_pos );
  106.     self animscripted( self.origin, self.angles, "zm_grapple_aim_start" );
  107.     self thread mechz_claw_notetracks();
  108.     self maps/mp/animscripts/zm_shared::donotetracks( "grapple_anim" );
  109.     while ( flag( "mechz_launching_claw" ) )
  110.     {
  111.         self animscripted( self.origin, self.angles, aim_anim );
  112.         self maps/mp/animscripts/zm_shared::donotetracks( "grapple_anim" );
  113.         self clearanim( %root, 0 );
  114.     }
  115. }
  116.  
  117. player_can_be_grabbed()
  118. {
  119.     if ( self getstance() == "prone" && isDefined( self.is_dtp ) && self.is_dtp )
  120.     {
  121.         return 0;
  122.     }
  123.     if ( !is_player_valid( self, 1, 1 ) )
  124.     {
  125.         return 0;
  126.     }
  127.     return 1;
  128. }
  129.  
  130. mechz_claw_explosive_watcher()
  131. {
  132.     if ( !isDefined( self.explosive_dmg_taken ) )
  133.     {
  134.         self.explosive_dmg_taken = 0;
  135.     }
  136.     self.explosive_dmg_taken_on_grab_start = self.explosive_dmg_taken;
  137. }
  138.  
  139. mechz_unlink_on_laststand( mechz )
  140. {
  141.     self endon( "death" );
  142.     self endon( "disconnect" );
  143.     mechz endon( "death" );
  144.     mechz endon( "claw_complete" );
  145.     mechz endon( "kill_claw" );
  146.     while ( 1 )
  147.     {
  148.         if ( isDefined( self ) && self maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
  149.         {
  150.             mechz thread mechz_claw_release();
  151.             return;
  152.         }
  153.         wait 0,05;
  154.     }
  155. }
  156.  
  157. claw_grapple()
  158. {
  159.     self endon( "death" );
  160.     self endon( "kill_claw" );
  161.     if ( !isDefined( self.favoriteenemy ) )
  162.     {
  163.         return;
  164.     }
  165.     v_claw_origin = self gettagorigin( "tag_claw" );
  166.     v_claw_angles = vectorToAngle( self.origin - self.favoriteenemy.origin );
  167.     self.fx_field |= 256;
  168.     self setclientfield( "mechz_fx", self.fx_field );
  169.     self.m_claw setanim( %ai_zombie_mech_grapple_arm_open_idle, 1, 0, 1 );
  170.     self.m_claw unlink();
  171.     self.m_claw.fx_ent = spawn( "script_model", self.m_claw gettagorigin( "tag_claw" ) );
  172.     self.m_claw.fx_ent.angles = self.m_claw gettagangles( "tag_claw" );
  173.     self.m_claw.fx_ent setmodel( "tag_origin" );
  174.     self.m_claw.fx_ent linkto( self.m_claw, "tag_claw" );
  175.     network_safe_play_fx_on_tag( "mech_claw", 1, level._effect[ "mechz_claw" ], self.m_claw.fx_ent, "tag_origin" );
  176.     v_enemy_origin = self.favoriteenemy.origin + vectorScale( ( 0, 0, 0 ), 36 );
  177.     n_dist = distance( v_claw_origin, v_enemy_origin );
  178.     n_time = n_dist / 1200;
  179.     self playsound( "zmb_ai_mechz_claw_fire" );
  180.     self.m_claw moveto( v_enemy_origin, n_time );
  181.     self.m_claw thread check_for_claw_move_complete();
  182.     self.m_claw playloopsound( "zmb_ai_mechz_claw_loop_out", 0,1 );
  183.     self.e_grabbed = undefined;
  184.     a_players = getplayers();
  185.     _a260 = a_players;
  186.     _k260 = getFirstArrayKey( _a260 );
  187.     while ( isDefined( _k260 ) )
  188.     {
  189.         player = _a260[ _k260 ];
  190.         if ( !is_player_valid( player, 1, 1 ) || !player player_can_be_grabbed() )
  191.         {
  192.         }
  193.         else
  194.         {
  195.             n_dist_sq = distancesquared( player.origin + vectorScale( ( 0, 0, 0 ), 36 ), self.m_claw.origin );
  196.             if ( n_dist_sq < 2304 )
  197.             {
  198.                 if ( isDefined( player.hasriotshield ) && player.hasriotshield && player getcurrentweapon() == level.riotshield_name )
  199.                 {
  200.                     shield_dmg = level.zombie_vars[ "riotshield_hit_points" ];
  201.                     player maps/mp/zombies/_zm_weap_riotshield_tomb::player_damage_shield( shield_dmg - 1, 1 );
  202.                     wait 1;
  203.                     player maps/mp/zombies/_zm_weap_riotshield_tomb::player_damage_shield( 1, 1 );
  204.                 }
  205.                 else
  206.                 {
  207.                     self.e_grabbed = player;
  208.                     self.e_grabbed setclientfieldtoplayer( "mechz_grab", 1 );
  209.                     self.e_grabbed playerlinktodelta( self.m_claw, "tag_attach_player" );
  210.                     self.e_grabbed setplayerangles( vectorToAngle( self.origin - self.e_grabbed.origin ) );
  211.                     self.e_grabbed playsound( "zmb_ai_mechz_claw_grab" );
  212.                     self.e_grabbed setstance( "stand" );
  213.                     self.e_grabbed allowcrouch( 0 );
  214.                     self.e_grabbed allowprone( 0 );
  215.                     self.e_grabbed thread mechz_grabbed_played_vo( self );
  216.                     if ( !flag( "mechz_claw_move_complete" ) )
  217.                     {
  218.                         self.m_claw moveto( self.m_claw.origin, 0,05 );
  219.                     }
  220.                 }
  221.                 break;
  222.             }
  223.         }
  224.         else
  225.         {
  226.             _k260 = getNextArrayKey( _a260, _k260 );
  227.         }
  228.     }
  229.     wait 0,05;
  230.     if ( !flag( "mechz_claw_move_complete" ) && !isDefined( self.e_grabbed ) )
  231.     {
  232.         a_ai_zombies = get_round_enemy_array();
  233.         _a306 = a_ai_zombies;
  234.         _k306 = getFirstArrayKey( _a306 );
  235.         while ( isDefined( _k306 ) )
  236.         {
  237.             ai_zombie = _a306[ _k306 ];
  238.             if ( isalive( ai_zombie ) && isDefined( ai_zombie.is_giant_robot ) || ai_zombie.is_giant_robot && isDefined( ai_zombie.is_mechz ) && ai_zombie.is_mechz )
  239.             {
  240.             }
  241.             else
  242.             {
  243.                 n_dist_sq = distancesquared( ai_zombie.origin + vectorScale( ( 0, 0, 0 ), 36 ), self.m_claw.origin );
  244.                 if ( n_dist_sq < 2304 )
  245.                 {
  246.                     self.e_grabbed = ai_zombie;
  247.                     self.e_grabbed linkto( self.m_claw, "tag_attach_player", ( 0, 0, 0 ) );
  248.                     self.e_grabbed.mechz_grabbed_by = self;
  249.                     self.e_grabbed animcustom( ::zombie_grabbed_by_mechz_claw );
  250.                     break;
  251.                 }
  252.             }
  253.             else
  254.             {
  255.                 _k306 = getNextArrayKey( _a306, _k306 );
  256.             }
  257.         }
  258.     }
  259.     self.m_claw clearanim( %root, 0,2 );
  260.     self.m_claw setanim( %ai_zombie_mech_grapple_arm_closed_idle, 1, 0,2, 1 );
  261.     wait 0,5;
  262.     if ( isDefined( self.e_grabbed ) )
  263.     {
  264.         n_time = n_dist / 200;
  265.     }
  266.     else
  267.     {
  268.         n_time = n_dist / 1000;
  269.     }
  270.     self mechz_claw_explosive_watcher();
  271.     v_claw_origin = self gettagorigin( "tag_claw" );
  272.     v_claw_angles = self gettagangles( "tag_claw" );
  273.     self.m_claw moveto( v_claw_origin, max( 0,05, n_time ) );
  274.     self.m_claw playloopsound( "zmb_ai_mechz_claw_loop_in", 0,1 );
  275.     self.m_claw waittill( "movedone" );
  276.     v_claw_origin = self gettagorigin( "tag_claw" );
  277.     v_claw_angles = self gettagangles( "tag_claw" );
  278.     self.m_claw playsound( "zmb_ai_mechz_claw_back" );
  279.     self.m_claw stoploopsound( 1 );
  280.     if ( maps/mp/zombies/_zm_ai_mechz::sndmechzisnetworksafe( "angry" ) )
  281.     {
  282.         self playsound( "zmb_ai_mechz_vox_angry" );
  283.     }
  284.     self.m_claw.origin = v_claw_origin;
  285.     self.m_claw.angles = v_claw_angles;
  286.     self.m_claw clearanim( %root, 0,2 );
  287.     self.m_claw linkto( self, "tag_claw", ( 0, 0, 0 ) );
  288.     self.m_claw setanim( %ai_zombie_mech_grapple_arm_closed_idle, 1, 0,2, 1 );
  289.     self.m_claw.fx_ent delete();
  290.     self.m_claw.fx_ent = undefined;
  291.     self.fx_field &= 256;
  292.     self setclientfield( "mechz_fx", self.fx_field );
  293.     flag_clear( "mechz_launching_claw" );
  294.     if ( isDefined( self.e_grabbed ) )
  295.     {
  296.         if ( !isDefined( self.flamethrower_trigger ) )
  297.         {
  298.             self mechz_flamethrower_initial_setup();
  299.         }
  300.         if ( isplayer( self.e_grabbed ) && is_player_valid( self.e_grabbed ) )
  301.         {
  302.             self.e_grabbed thread mechz_unlink_on_laststand( self );
  303.         }
  304.         else
  305.         {
  306.             if ( isai( self.e_grabbed ) )
  307.             {
  308.                 self.e_grabbed thread mechz_zombie_flamethrower_gib( self );
  309.             }
  310.         }
  311.         self thread check_for_claw_damaged( self.e_grabbed );
  312.         self animscripted( self.origin, self.angles, "zm_flamethrower_claw_victim" );
  313.         self maps/mp/animscripts/zm_shared::donotetracks( "flamethrower_anim" );
  314.     }
  315.     flag_clear( "mechz_claw_move_complete" );
  316. }
  317.  
  318. zombie_grabbed_by_mechz_claw()
  319. {
  320.     self endon( "death" );
  321.     self setanimstatefromasd( "zm_grabbed_by_mech" );
  322.     self.mechz_grabbed_by waittill_any( "death", "claw_complete", "kill_claw" );
  323. }
  324.  
  325. check_for_claw_damaged( player )
  326. {
  327.     player endon( "death" );
  328.     player endon( "disconnect" );
  329.     self endon( "death" );
  330.     self endon( "claw_complete" );
  331.     self endon( "kill_claw" );
  332.     self thread claw_damaged_mechz_endon_watcher( player );
  333.     player thread claw_damaged_player_endon_watcher( self );
  334.     self.m_claw setcandamage( 1 );
  335.     while ( isDefined( self.e_grabbed ) )
  336.     {
  337.         self.m_claw waittill( "damage", amount, inflictor, direction, point, type, tagname, modelname, partname, weaponname, idflags );
  338.         if ( is_player_valid( inflictor ) )
  339.         {
  340.             self dodamage( 1, inflictor.origin, inflictor, inflictor, "left_hand", type );
  341.             self.m_claw setcandamage( 0 );
  342.             self notify( "claw_damaged" );
  343.             return;
  344.         }
  345.         else
  346.         {
  347.         }
  348.     }
  349. }
  350.  
  351. claw_damaged_mechz_endon_watcher( player )
  352. {
  353.     self endon( "claw_damaged" );
  354.     player endon( "death" );
  355.     player endon( "disconnect" );
  356.     self waittill_any( "death", "claw_complete", "kill_claw" );
  357.     if ( isDefined( self ) && isDefined( self.m_claw ) )
  358.     {
  359.         self.m_claw setcandamage( 0 );
  360.     }
  361. }
  362.  
  363. claw_damaged_player_endon_watcher( mechz )
  364. {
  365.     mechz endon( "claw_damaged" );
  366.     mechz endon( "death" );
  367.     mechz endon( "claw_complete" );
  368.     mechz endon( "kill_claw" );
  369.     self waittill_any( "death", "disconnect" );
  370.     if ( isDefined( mechz ) && isDefined( mechz.m_claw ) )
  371.     {
  372.         mechz.m_claw setcandamage( 0 );
  373.     }
  374. }
  375.  
  376. check_for_players_mid_grapple()
  377. {
  378.     self endon( "movedone" );
  379.     while ( 1 )
  380.     {
  381.         a_players = getplayers();
  382.         _a471 = a_players;
  383.         _k471 = getFirstArrayKey( _a471 );
  384.         while ( isDefined( _k471 ) )
  385.         {
  386.             player = _a471[ _k471 ];
  387.             if ( !is_player_valid( player, 1, 1 ) || !player player_can_be_grabbed() )
  388.             {
  389.             }
  390.             else
  391.             {
  392.                 n_dist_sq = distancesquared( player.origin + vectorScale( ( 0, 0, 0 ), 36 ), self.origin );
  393.                 if ( n_dist_sq < 2304 )
  394.                 {
  395.                     self moveto( self.origin, 0,05 );
  396.                     self notify( "movedone" );
  397.                     return;
  398.                 }
  399.             }
  400.             _k471 = getNextArrayKey( _a471, _k471 );
  401.         }
  402.         wait 0,05;
  403.     }
  404. }
  405.  
  406. check_for_claw_move_complete()
  407. {
  408.     self waittill( "movedone" );
  409.     wait 0,05;
  410.     flag_set( "mechz_claw_move_complete" );
  411. }
  412.  
  413. mechz_zombie_flamethrower_gib( mechz )
  414. {
  415.     mechz waittillmatch( "flamethrower_anim" );
  416.     return "start_ft";
  417.     if ( isalive( self ) )
  418.     {
  419.         self thread zombie_gib_all();
  420.         self dodamage( self.health, self.origin, self );
  421.     }
  422. }
  423.  
  424. should_do_claw_attack()
  425. {
  426. /#
  427.     assert( isDefined( self.favoriteenemy ) );
  428. #/
  429. /#
  430.     if ( getDvarInt( #"E7121222" ) > 1 )
  431.     {
  432.         println( "\n\tMZ: Checking should claw\n" );
  433. #/
  434.     }
  435.     if ( isDefined( self.has_powerplant ) && !self.has_powerplant )
  436.     {
  437. /#
  438.         if ( getDvarInt( #"E7121222" ) > 1 )
  439.         {
  440.             println( "\n\t\tMZ: Not doing claw because powerplant has been destroyed\n" );
  441. #/
  442.         }
  443.         return 0;
  444.     }
  445.     if ( isDefined( self.disable_complex_behaviors ) && self.disable_complex_behaviors )
  446.     {
  447. /#
  448.         if ( getDvarInt( #"E7121222" ) > 1 )
  449.         {
  450.             println( "\n\t\tMZ: Not doing claw because doing force aggro\n" );
  451. #/
  452.         }
  453.         return 0;
  454.     }
  455.     if ( isDefined( self.not_interruptable ) && self.not_interruptable )
  456.     {
  457. /#
  458.         if ( getDvarInt( #"E7121222" ) > 1 )
  459.         {
  460.             println( "\n\t\tMZ: Not doing claw because another behavior has set not_interruptable\n" );
  461. #/
  462.         }
  463.         return 0;
  464.     }
  465.     if ( isDefined( self.last_claw_time ) && ( getTime() - self.last_claw_time ) < level.mechz_claw_cooldown_time )
  466.     {
  467. /#
  468.         if ( getDvarInt( #"E7121222" ) > 1 )
  469.         {
  470.             println( "\n\t\tMZ: Not doing claw because claw is on cooldown\n" );
  471. #/
  472.         }
  473.         return 0;
  474.     }
  475.     if ( !self mechz_check_in_arc() )
  476.     {
  477. /#
  478.         if ( getDvarInt( #"E7121222" ) > 1 )
  479.         {
  480.             println( "\n\t\tMZ: Not doing claw because target is not in front arc\n" );
  481. #/
  482.         }
  483.         return 0;
  484.     }
  485.     n_dist_sq = distancesquared( self.origin, self.favoriteenemy.origin );
  486.     if ( n_dist_sq < 90000 || n_dist_sq > 1000000 )
  487.     {
  488. /#
  489.         if ( getDvarInt( #"E7121222" ) > 1 )
  490.         {
  491.             println( "\n\t\tMZ: Not doing claw because target is not in range\n" );
  492. #/
  493.         }
  494.         return 0;
  495.     }
  496.     if ( !self.favoriteenemy player_can_be_grabbed() )
  497.     {
  498. /#
  499.         if ( getDvarInt( #"E7121222" ) > 1 )
  500.         {
  501.             println( "\n\t\tMZ: Not doing claw because player is prone or dtp\n" );
  502. #/
  503.         }
  504.         return 0;
  505.     }
  506.     curr_zone = get_zone_from_position( self.origin + vectorScale( ( 0, 0, 0 ), 36 ) );
  507.     if ( isDefined( curr_zone ) && curr_zone == "ug_bottom_zone" )
  508.     {
  509. /#
  510.         if ( getDvarInt( #"E7121222" ) > 1 )
  511.         {
  512.             println( "\n\t\tMZ: Not doing claw because mech is in main chamber\n" );
  513. #/
  514.         }
  515.         return 0;
  516.     }
  517.     clip_mask = level.physicstracemaskclip | level.physicstracemaskphysics;
  518.     claw_origin = self.origin + vectorScale( ( 0, 0, 0 ), 65 );
  519.     trace = physicstrace( claw_origin, self.favoriteenemy.origin + vectorScale( ( 0, 0, 0 ), 30 ), ( -15, -15, -20 ), ( 15, 15, 40 ), self, clip_mask );
  520.     if ( trace[ "fraction" ] != 1 )
  521.     {
  522.         if ( isDefined( trace[ "entity" ] ) )
  523.         {
  524.             b_cansee = trace[ "entity" ] == self.favoriteenemy;
  525.         }
  526.     }
  527.     if ( !b_cansee )
  528.     {
  529. /#
  530.         if ( getDvarInt( #"E7121222" ) > 1 )
  531.         {
  532.             println( "\n\t\tMZ: Not doing claw because capsule trace failed\n" );
  533. #/
  534.         }
  535.         return 0;
  536.     }
  537.     return 1;
  538. }
  539.  
  540. mechz_do_claw_grab()
  541. {
  542.     self endon( "death" );
  543.     self endon( "kill_claw" );
  544. /#
  545.     if ( getDvarInt( #"E7121222" ) > 0 )
  546.     {
  547.         println( "\n\tMZ: Doing Claw Attack\n" );
  548. #/
  549.     }
  550. /#
  551.     assert( isDefined( self.favoriteenemy ) );
  552. #/
  553.     self thread mechz_kill_claw_watcher();
  554.     self.last_claw_time = getTime();
  555.     target_pos = self.favoriteenemy.origin + vectorScale( ( 0, 0, 0 ), 30 );
  556.     self thread mechz_stop_basic_find_flesh();
  557.     self.ai_state = "grapple_attempt";
  558.     flag_set( "mechz_launching_claw" );
  559.     self thread mechz_claw_aim( target_pos );
  560.     self orientmode( "face enemy" );
  561.     self waittillmatch( "grapple_anim" );
  562.     return "muzzleflash";
  563.     self claw_grapple();
  564.     self mechz_claw_cleanup();
  565. }
  566.  
  567. mechz_kill_claw_watcher()
  568. {
  569.     self endon( "claw_complete" );
  570.     self waittill_either( "death", "kill_claw" );
  571.     self mechz_claw_cleanup();
  572. }
  573.  
  574. mechz_claw_cleanup()
  575. {
  576.     self.fx_field &= 256;
  577.     self.fx_field &= 64;
  578.     self setclientfield( "mechz_fx", self.fx_field );
  579.     self mechz_claw_release();
  580.     if ( isDefined( self.m_claw ) )
  581.     {
  582.         self.m_claw clearanim( %root, 0,2 );
  583.         if ( isDefined( self.m_claw.fx_ent ) )
  584.         {
  585.             self.m_claw.fx_ent delete();
  586.             self.m_claw.fx_ent = undefined;
  587.         }
  588.         if ( isDefined( self.has_powerplant ) && !self.has_powerplant )
  589.         {
  590.             self mechz_claw_detach();
  591.             flag_clear( "mechz_launching_claw" );
  592.         }
  593.         else
  594.         {
  595.             if ( !self.m_claw islinkedto( self ) )
  596.             {
  597.                 v_claw_origin = self gettagorigin( "tag_claw" );
  598.                 v_claw_angles = self gettagangles( "tag_claw" );
  599.                 n_dist = distance( self.m_claw.origin, v_claw_origin );
  600.                 n_time = n_dist / 1000;
  601.                 self.m_claw moveto( v_claw_origin, max( 0,05, n_time ) );
  602.                 self.m_claw playloopsound( "zmb_ai_mechz_claw_loop_in", 0,1 );
  603.                 self.m_claw waittill( "movedone" );
  604.                 v_claw_origin = self gettagorigin( "tag_claw" );
  605.                 v_claw_angles = self gettagangles( "tag_claw" );
  606.                 self.m_claw playsound( "zmb_ai_mechz_claw_back" );
  607.                 self.m_claw stoploopsound( 1 );
  608.                 self.m_claw.origin = v_claw_origin;
  609.                 self.m_claw.angles = v_claw_angles;
  610.                 self.m_claw clearanim( %root, 0,2 );
  611.                 self.m_claw linkto( self, "tag_claw", ( 0, 0, 0 ) );
  612.             }
  613.             self.m_claw setanim( %ai_zombie_mech_grapple_arm_closed_idle, 1, 0,2, 1 );
  614.         }
  615.     }
  616.     self notify( "claw_complete" );
  617. }
  618.  
  619. mechz_claw_damage_trigger_thread()
  620. {
  621.     self endon( "death" );
  622.     self.m_claw_damage_trigger endon( "death" );
  623.     while ( 1 )
  624.     {
  625.         self.m_claw_damage_trigger waittill( "damage", amount, inflictor, direction, point, type, tagname, modelname, partname, weaponname, idflags );
  626.         while ( self.m_claw islinkedto( self ) )
  627.         {
  628.             continue;
  629.         }
  630.         if ( is_player_valid( inflictor ) )
  631.         {
  632.             self dodamage( 1, inflictor.origin, inflictor, inflictor, "left_hand", type );
  633.             self.m_claw setcandamage( 0 );
  634.             self notify( "claw_damaged" );
  635.         }
  636.     }
  637. }
Advertisement
Add Comment
Please, Sign In to add comment