burc_2004

_zm_ai_sloth_crawler.gsc

Oct 22nd, 2015
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.23 KB | None | 0 0
  1. #include maps/mp/animscripts/zm_shared;
  2. #include maps/mp/animscripts/zm_run;
  3. #include maps/mp/zombies/_zm_ai_sloth;
  4. #include maps/mp/zombies/_zm_ai_sloth_utility;
  5. #include maps/mp/zombies/_zm_utility;
  6. #include maps/mp/_utility;
  7. #include common_scripts/utility;
  8.  
  9. crawler_condition()
  10. {
  11.     zombies = get_round_enemy_array();
  12.     i = 0;
  13.     while ( i < zombies.size )
  14.     {
  15.         zombie = zombies[ i ];
  16.         if ( !is_true( zombie.has_legs ) )
  17.         {
  18.             dist = distancesquared( self.origin, zombie.origin );
  19.             if ( dist < 32400 )
  20.             {
  21.                 self.crawler = zombie;
  22.                 if ( isDefined( level.sloth.custom_crawler_pickup_func ) )
  23.                 {
  24.                     self.crawler thread [[ level.sloth.custom_crawler_pickup_func ]]();
  25.                 }
  26.                 return 1;
  27.             }
  28.         }
  29.         i++;
  30.     }
  31.     return 0;
  32. }
  33.  
  34. crawler_action()
  35. {
  36.     self endon( "death" );
  37.     self endon( "stop_action" );
  38.     self maps/mp/zombies/_zm_ai_sloth::common_context_action();
  39.     self thread watch_sloth_on_exit_side();
  40.     self thread watch_sloth_on_same_side();
  41.     self thread crawler_watch_death();
  42.     self.release_crawler = 0;
  43.     anim_id = self getanimfromasd( "zm_sloth_pickup_crawler", 0 );
  44.     sloth_goal = getstartorigin( self.crawler.origin, self.crawler.angles, anim_id );
  45.     sloth_offset = distance( sloth_goal, self.crawler.origin );
  46.     while ( 1 )
  47.     {
  48.         while ( self sloth_is_traversing() )
  49.         {
  50.             wait 0,1;
  51.         }
  52.         vec_forward = vectornormalize( anglesToForward( self.crawler.angles ) );
  53.         start_pos = self.crawler.origin - ( vec_forward * sloth_offset );
  54.         raised_start_pos = ( start_pos[ 0 ], start_pos[ 1 ], start_pos[ 2 ] + sloth_offset );
  55.         ground_pos = groundpos( raised_start_pos );
  56.         height_check = abs( self.crawler.origin[ 2 ] - ground_pos[ 2 ] );
  57.         if ( height_check > 8 )
  58.         {
  59.             self setanimstatefromasd( "zm_player_idle" );
  60.         }
  61.         else
  62.         {
  63.             self maps/mp/animscripts/zm_run::needsupdate();
  64.             self setgoalpos( start_pos );
  65.         }
  66.         if ( !isDefined( self.crawler ) || self.crawler.health <= 0 )
  67.         {
  68.             self.context_done = 1;
  69.             return;
  70.         }
  71.         dist = distancesquared( self.origin, start_pos );
  72.         z_dist = abs( self.origin[ 2 ] - start_pos[ 2 ] );
  73.         if ( dist < 1024 && z_dist < 12 )
  74.         {
  75.             break;
  76.         }
  77.         else
  78.         {
  79.             wait 0,1;
  80.         }
  81.     }
  82.     self orientmode( "face angle", self.crawler.angles[ 1 ] );
  83.     wait 0,25;
  84.     self.crawler.is_inert = 1;
  85.     self.crawler.ignoreall = 1;
  86.     self.crawler notify( "stop_find_flesh" );
  87.     self.crawler notify( "zombie_acquire_enemy" );
  88.     self.anchor.origin = self.crawler.origin;
  89.     self.anchor.angles = self.crawler.angles;
  90.     sloth_pickup = self append_hunched( "zm_sloth_pickup_crawler" );
  91.     crawler_pickup = self append_hunched( "zm_crawler_pickup_by_sloth" );
  92.     self animscripted( self.anchor.origin, self.anchor.angles, sloth_pickup );
  93.     self.crawler animscripted( self.anchor.origin, self.anchor.angles, crawler_pickup );
  94.     maps/mp/animscripts/zm_shared::donotetracks( "sloth_pickup_crawler_anim" );
  95.     self.carrying_crawler = 1;
  96.     self.crawler.guts_explosion = 1;
  97.     self.pre_traverse = ::crawler_pre_traverse;
  98.     self.post_traverse = ::crawler_post_traverse;
  99.     self.crawler notsolid();
  100.     self.crawler linkto( self, "tag_weapon_right" );
  101.     self.ignore_common_run = 1;
  102.     self set_zombie_run_cycle( "walk_crawlerhold" );
  103.     self.locomotion = "walk_crawlerhold";
  104.     self.setanimstatefromspeed = ::slothanimstatefromspeed;
  105.     self.crawler_end = getTime() + 5000;
  106.     self.crawler.actor_damage_func = ::crawler_damage_func;
  107.     self.sloth_damage_func = ::crawler_damage_func;
  108.     roam = array_randomize( level.roam_points );
  109.     roam_index = 0;
  110.     while ( 1 )
  111.     {
  112.         if ( is_true( self.release_crawler ) )
  113.         {
  114.             break;
  115.         }
  116.         else
  117.         {
  118.             while ( self sloth_is_traversing() )
  119.             {
  120.                 wait 0,1;
  121.             }
  122.             dist = distancesquared( self.origin, self.candy_player.origin );
  123.             if ( dist < 25600 || is_true( self.candy_player.is_in_ghost_zone ) && is_true( self.on_exit_side ) )
  124.             {
  125.                 self.check_turn = 1;
  126.                 self setgoalpos( self.origin );
  127.                 sloth_idle = self append_hunched( "zm_sloth_crawlerhold_idle" );
  128.                 crawler_idle = self append_hunched( "zm_crawler_crawlerhold_idle" );
  129.                 self animscripted( self.origin, self.angles, sloth_idle );
  130.                 self.crawler animscripted( self.origin, self.angles, crawler_idle );
  131.             }
  132.             else
  133.             {
  134.                 self stopanimscripted();
  135.                 self.crawler stopanimscripted();
  136.                 if ( should_ignore_candybooze( self.candy_player ) )
  137.                 {
  138.                     dist = distancesquared( self.origin, roam[ roam_index ].origin );
  139.                     if ( dist < 1024 )
  140.                     {
  141.                         roam_index++;
  142.                         if ( roam_index >= roam.size )
  143.                         {
  144.                             roam_index = 0;
  145.                         }
  146.                     }
  147.                     self maps/mp/zombies/_zm_ai_sloth::sloth_check_turn( roam[ roam_index ].origin );
  148.                     self setgoalpos( roam[ roam_index ].origin );
  149.                 }
  150.                 else
  151.                 {
  152.                     if ( !self sloth_move_to_same_side() )
  153.                     {
  154.                         if ( is_true( self.check_turn ) )
  155.                         {
  156.                             self.check_turn = 0;
  157.                             if ( self sloth_is_same_zone( self.candy_player ) )
  158.                             {
  159.                                 self maps/mp/zombies/_zm_ai_sloth::sloth_check_turn( self.candy_player.origin, -0,965 );
  160.                             }
  161.                         }
  162.                         self setgoalpos( self.candy_player.origin );
  163.                     }
  164.                 }
  165.                 self crawler_update_locomotion();
  166.             }
  167.             wait 0,1;
  168.         }
  169.     }
  170.     self.setanimstatefromspeed = undefined;
  171.     self.crawler unlink();
  172.     sloth_putdown = self append_hunched( "zm_sloth_putdown_crawler" );
  173.     crawler_putdown = self append_hunched( "zm_crawler_putdown_by_sloth" );
  174.     self animscripted( self.origin, self.angles, sloth_putdown );
  175.     self.crawler animscripted( self.origin, self.angles, crawler_putdown );
  176.     maps/mp/animscripts/zm_shared::donotetracks( "sloth_putdown_crawler_anim" );
  177.     self.carrying_crawler = 0;
  178.     self.crawler.deathfunction = ::crawler_death;
  179.     sloth_kill = self append_hunched( "zm_sloth_kill_crawler_stomp" );
  180.     crawler_kill = self append_hunched( "zm_crawler_slothkill_stomp" );
  181.     self notify( "stop_crawler_watch" );
  182.     self animscripted( self.origin, self.angles, sloth_kill );
  183.     self.crawler animscripted( self.origin, self.angles, crawler_kill );
  184.     maps/mp/animscripts/zm_shared::donotetracks( "sloth_kill_crawler_anim" );
  185.     if ( isDefined( self.crawler ) )
  186.     {
  187.         self.crawler dodamage( self.crawler.health * 10, self.crawler.origin );
  188.         self.crawler playsound( "zmb_ai_sloth_attack_impact" );
  189.     }
  190.     self.sloth_damage_func = undefined;
  191.     self maps/mp/zombies/_zm_ai_sloth::sloth_set_traverse_funcs();
  192.     self.crawler = undefined;
  193.     self.context_done = 1;
  194. }
  195.  
  196. watch_sloth_on_exit_side()
  197. {
  198.     self endon( "death" );
  199.     while ( 1 )
  200.     {
  201.         if ( is_true( self.context_done ) )
  202.         {
  203.             return;
  204.         }
  205.         self.on_exit_side = 0;
  206.         player = self.candy_player;
  207.         if ( isDefined( player ) && is_true( player.is_in_ghost_zone ) )
  208.         {
  209.             name = player.current_ghost_room_name;
  210.             if ( isDefined( name ) )
  211.             {
  212.                 room = level.ghost_rooms[ name ];
  213.                 if ( is_true( room.to_maze ) )
  214.                 {
  215.                     if ( self maps/mp/zombies/_zm_ai_sloth::sloth_behind_mansion() )
  216.                     {
  217.                         self.on_exit_side = 1;
  218.                     }
  219.                     break;
  220.                 }
  221.                 else
  222.                 {
  223.                     if ( is_true( room.from_maze ) )
  224.                     {
  225.                         if ( !self maps/mp/zombies/_zm_ai_sloth::sloth_behind_mansion() )
  226.                         {
  227.                             self.on_exit_side = 1;
  228.                         }
  229.                     }
  230.                 }
  231.             }
  232.         }
  233.         wait 0,25;
  234.     }
  235. }
  236.  
  237. watch_sloth_on_same_side()
  238. {
  239.     self endon( "death" );
  240.     while ( 1 )
  241.     {
  242.         if ( is_true( self.context_done ) )
  243.         {
  244.             return;
  245.         }
  246.         self.on_same_side = 0;
  247.         player = self.candy_player;
  248.         if ( isDefined( player ) )
  249.         {
  250.             if ( self maps/mp/zombies/_zm_ai_sloth::sloth_behind_mansion() )
  251.             {
  252.                 if ( player maps/mp/zombies/_zm_ai_sloth::behind_mansion_zone() )
  253.                 {
  254.                     self.on_same_side = 1;
  255.                 }
  256.                 break;
  257.             }
  258.             else
  259.             {
  260.                 if ( !player maps/mp/zombies/_zm_ai_sloth::behind_mansion_zone() )
  261.                 {
  262.                     self.on_same_side = 1;
  263.                 }
  264.             }
  265.         }
  266.         wait 0,25;
  267.     }
  268. }
  269.  
  270. sloth_move_to_same_side()
  271. {
  272.     self endon( "death" );
  273.     if ( isDefined( self.teleport_time ) )
  274.     {
  275.         if ( ( getTime() - self.teleport_time ) < 1000 )
  276.         {
  277.             return 0;
  278.         }
  279.     }
  280.     player = self.candy_player;
  281.     if ( is_true( player.is_in_ghost_zone ) )
  282.     {
  283.         if ( is_true( self.on_exit_side ) )
  284.         {
  285.             return 0;
  286.         }
  287.     }
  288.     else
  289.     {
  290.         if ( is_true( self.on_same_side ) )
  291.         {
  292.             return 0;
  293.         }
  294.     }
  295.     if ( self maps/mp/zombies/_zm_ai_sloth::sloth_behind_mansion() )
  296.     {
  297.         self maps/mp/zombies/_zm_ai_sloth::action_navigate_mansion( level.courtyard_depart, level.courtyard_arrive );
  298.     }
  299.     else
  300.     {
  301.         self maps/mp/zombies/_zm_ai_sloth::action_navigate_mansion( level.maze_depart, level.maze_arrive );
  302.     }
  303.     return 1;
  304. }
  305.  
  306. sloth_is_same_zone( player )
  307. {
  308.     zone_sloth = self get_current_zone();
  309.     zone_player = player get_current_zone();
  310.     if ( !isDefined( zone_sloth ) || !isDefined( zone_player ) )
  311.     {
  312.         return 0;
  313.     }
  314.     if ( zone_sloth == zone_player )
  315.     {
  316.         return 1;
  317.     }
  318.     return 0;
  319. }
  320.  
  321. append_hunched( asd_name )
  322. {
  323.     if ( self.is_inside )
  324.     {
  325.         return asd_name + "_hunched";
  326.     }
  327.     return asd_name;
  328. }
  329.  
  330. crawler_update_locomotion()
  331. {
  332.     if ( self.zombie_move_speed == "walk_crawlerhold" )
  333.     {
  334.         if ( self.is_inside )
  335.         {
  336.             self set_zombie_run_cycle( "walk_crawlerhold_hunched" );
  337.             self.locomotion = "walk_crawlerhold_hunched";
  338.         }
  339.     }
  340.     else
  341.     {
  342.         if ( self.zombie_move_speed == "walk_crawlerhold_hunched" )
  343.         {
  344.             if ( !self.is_inside )
  345.             {
  346.                 self set_zombie_run_cycle( "walk_crawlerhold" );
  347.                 self.locomotion = "walk_crawlerhold";
  348.             }
  349.         }
  350.     }
  351. }
  352.  
  353. crawler_watch_death()
  354. {
  355.     self endon( "stop_crawler_watch" );
  356.     self.crawler waittill( "death" );
  357.     self stop_action();
  358. /#
  359.     sloth_print( "crawler died" );
  360. #/
  361.     if ( isDefined( self.crawler ) )
  362.     {
  363.         self.crawler unlink();
  364.     }
  365.     self.setanimstatefromspeed = undefined;
  366.     self.sloth_damage_func = undefined;
  367.     self maps/mp/zombies/_zm_ai_sloth::sloth_set_traverse_funcs();
  368.     self.crawler = undefined;
  369.     self.context_done = 1;
  370. }
  371.  
  372. crawler_pre_traverse()
  373. {
  374.     sloth_sling = self append_hunched( "zm_sloth_crawlerhold_sling" );
  375.     crawler_sling = self append_hunched( "zm_crawler_sloth_crawlerhold_sling" );
  376.     self setanimstatefromasd( sloth_sling );
  377.     self.crawler setanimstatefromasd( crawler_sling );
  378.     self maps/mp/animscripts/zm_shared::donotetracks( "sloth_crawlerhold_sling_anim" );
  379.     self.crawler thread crawler_traverse_idle();
  380. }
  381.  
  382. crawler_traverse_idle()
  383. {
  384.     self endon( "death" );
  385.     self endon( "stop_traverse_idle" );
  386.     while ( 1 )
  387.     {
  388.         self setanimstatefromasd( "zm_crawler_sloth_crawlerhold_slung_idle" );
  389.         wait 0,1;
  390.     }
  391. }
  392.  
  393. crawler_post_traverse()
  394. {
  395.     self.crawler notify( "stop_traverse_idle" );
  396.     sloth_unsling = self append_hunched( "zm_sloth_crawlerhold_unsling" );
  397.     crawler_unsling = self append_hunched( "zm_crawler_sloth_crawlerhold_unsling" );
  398.     self setanimstatefromasd( sloth_unsling );
  399.     self.crawler setanimstatefromasd( crawler_unsling );
  400.     self maps/mp/animscripts/zm_shared::donotetracks( "sloth_crawlerhold_unsling_anim" );
  401. }
  402.  
  403. crawler_death()
  404. {
  405.     return 1;
  406. }
  407.  
  408. crawler_damage_func( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex )
  409. {
  410.     level.sloth.release_crawler = 1;
  411.     return 0;
  412. }
  413.  
  414. is_crawler_alive()
  415. {
  416.     if ( isDefined( self.crawler ) && self.crawler.health > 0 )
  417.     {
  418.         return 1;
  419.     }
  420.     return 0;
  421. }
  422.  
  423. slothanimstatefromspeed( animstate, substate )
  424. {
  425.     if ( isDefined( self.crawler ) )
  426.     {
  427.         crawler_walk = "zm_crawler_crawlerhold_walk";
  428.         if ( self.is_inside )
  429.         {
  430.             crawler_walk += "_hunched";
  431.         }
  432.         self.crawler setanimstatefromasd( crawler_walk );
  433.     }
  434. }
Advertisement
Add Comment
Please, Sign In to add comment