FineNerds

Blundergat

Dec 28th, 2014
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.96 KB | None | 0 0
  1. #include maps/mp/animscripts/zm_shared;
  2. #include maps/mp/zombies/_zm_spawner;
  3. #include maps/mp/zombies/_zm_weapons;
  4. #include maps/mp/zombies/_zm_net;
  5. #include maps/mp/zombies/_zm_utility;
  6. #include maps/mp/_utility;
  7. #include common_scripts/utility;
  8.  
  9. init()
  10. {
  11.     if ( !maps/mp/zombies/_zm_weapons::is_weapon_included( "blundergat_zm" ) )
  12.     {
  13.         return;
  14.     }
  15.     else
  16.     {
  17.         precacheitem( "blundersplat_bullet_zm" );
  18.         precacheitem( "blundersplat_explosive_dart_zm" );
  19.     }
  20.     level.zombie_spawners = getentarray( "zombie_spawner", "script_noteworthy" );
  21.     array_thread( level.zombie_spawners, ::add_spawn_function, ::zombie_wait_for_blundersplat_hit );
  22.     level.custom_derive_damage_refs = ::gib_on_blundergat_damage;
  23.     level._effect[ "dart_light" ] = loadfx( "weapon/crossbow/fx_trail_crossbow_blink_grn_os" );
  24.     onplayerconnect_callback( ::blundersplat_on_player_connect );
  25. }
  26.  
  27. blundersplat_on_player_connect()
  28. {
  29.     self thread wait_for_blundersplat_fired();
  30.     self thread wait_for_blundersplat_upgraded_fired();
  31. }
  32.  
  33. zombie_wait_for_blundersplat_hit()
  34. {
  35.     self endon( "death" );
  36.     while ( 1 )
  37.     {
  38.         self waittill( "damage", amount, inflictor, direction, point, type, tagname, modelname, partname, weaponname, idflags );
  39.         if ( weaponname == "blundersplat_bullet_zm" )
  40.         {
  41.             if ( !isDefined( self.titus_tagged ) )
  42.             {
  43.                 a_grenades = getentarray( "grenade", "classname" );
  44.                 if ( !isDefined( a_grenades ) || a_grenades.size <= 0 )
  45.                 {
  46.                     continue;
  47.                 }
  48.                 self.titus_tagged = 1;
  49.                 _a66 = a_grenades;
  50.                 _k66 = getFirstArrayKey( _a66 );
  51.                 while ( isDefined( _k66 ) )
  52.                 {
  53.                     e_grenade = _a66[ _k66 ];
  54.                     if ( isDefined( e_grenade.model ) && e_grenade.model == "t6_wpn_zmb_projectile_blundergat" )
  55.                     {
  56.                         if ( e_grenade islinkedto( self ) )
  57.                         {
  58.                             while ( 1 )
  59.                             {
  60.                                 if ( !isDefined( e_grenade.fuse_time ) )
  61.                                 {
  62.                                     wait_network_frame();
  63.                                     continue;
  64.                                 }
  65.                                 else
  66.                                 {
  67.                                 }
  68.                             }
  69.                             n_fuse_timer = e_grenade.fuse_time;
  70.                             e_grenade thread _titus_grenade_detonate_on_target_death( self );
  71.                         }
  72.                     }
  73.                     _k66 = getNextArrayKey( _a66, _k66 );
  74.                 }
  75.                 self thread _titus_target_animate_and_die( n_fuse_timer, inflictor );
  76.                 self thread _titus_target_check_for_grenade_hits();
  77.             }
  78.         }
  79.     }
  80. }
  81.  
  82. wait_for_blundersplat_fired()
  83. {
  84.     self endon( "disconnect" );
  85.     self waittill( "spawned_player" );
  86.     for ( ;; )
  87.     {
  88.         self waittill( "weapon_fired", str_weapon );
  89.         if ( str_weapon == "blundersplat_zm" )
  90.         {
  91.             wait_network_frame();
  92.             _titus_locate_target( 1 );
  93.             wait_network_frame();
  94.             _titus_locate_target( 1 );
  95.             wait_network_frame();
  96.             _titus_locate_target( 1 );
  97.         }
  98.         wait 0,5;
  99.     }
  100. }
  101.  
  102. wait_for_blundersplat_upgraded_fired()
  103. {
  104.     self endon( "disconnect" );
  105.     self waittill( "spawned_player" );
  106.     for ( ;; )
  107.     {
  108.         self waittill( "weapon_fired", str_weapon );
  109.         if ( str_weapon == "blundersplat_upgraded_zm" )
  110.         {
  111.             wait_network_frame();
  112.             _titus_locate_target( 0 );
  113.             wait_network_frame();
  114.             _titus_locate_target( 0 );
  115.             wait_network_frame();
  116.             _titus_locate_target( 0 );
  117.         }
  118.     }
  119. }
  120.  
  121. _titus_locate_target( is_not_upgraded )
  122. {
  123.     if ( !isDefined( is_not_upgraded ) )
  124.     {
  125.         is_not_upgraded = 1;
  126.     }
  127.     fire_angles = self getplayerangles();
  128.     fire_origin = self getplayercamerapos();
  129.     a_targets = arraycombine( getaiarray( "axis" ), getvehiclearray( "axis" ), 0, 0 );
  130.     a_targets = get_array_of_closest( self.origin, a_targets, undefined, undefined, 1500 );
  131.     if ( is_not_upgraded )
  132.     {
  133.         n_fuse_timer = randomfloatrange( 1, 2,5 );
  134.     }
  135.     else
  136.     {
  137.         n_fuse_timer = randomfloatrange( 3, 4 );
  138.     }
  139.     _a161 = a_targets;
  140.     _k161 = getFirstArrayKey( _a161 );
  141.     while ( isDefined( _k161 ) )
  142.     {
  143.         target = _a161[ _k161 ];
  144.         if ( within_fov( fire_origin, fire_angles, target.origin, cos( 30 ) ) )
  145.         {
  146.             if ( isai( target ) )
  147.             {
  148.                 if ( !isDefined( target.titusmarked ) )
  149.                 {
  150.                     a_tags = [];
  151.                     a_tags[ 0 ] = "j_hip_le";
  152.                     a_tags[ 1 ] = "j_hip_ri";
  153.                     a_tags[ 2 ] = "j_spine4";
  154.                     a_tags[ 3 ] = "j_elbow_le";
  155.                     a_tags[ 4 ] = "j_elbow_ri";
  156.                     a_tags[ 5 ] = "j_clavicle_le";
  157.                     a_tags[ 6 ] = "j_clavicle_ri";
  158.                     str_tag = a_tags[ randomint( a_tags.size ) ];
  159.                     b_trace_pass = bullettracepassed( fire_origin, target gettagorigin( str_tag ), 1, self, target );
  160.                     if ( b_trace_pass )
  161.                     {
  162.                         target thread _titus_marked();
  163.                         e_dart = magicbullet( "blundersplat_bullet_zm", fire_origin, target gettagorigin( str_tag ), self );
  164.                         e_dart thread _titus_reset_grenade_fuse( n_fuse_timer, is_not_upgraded );
  165.                         return;
  166.                     }
  167.                 }
  168.             }
  169.         }
  170.         _k161 = getNextArrayKey( _a161, _k161 );
  171.     }
  172.     vec = anglesToForward( fire_angles );
  173.     trace_end = fire_origin + ( vec * 20000 );
  174.     trace = bullettrace( fire_origin, trace_end, 1, self );
  175.     offsetpos = trace[ "position" ] + _titus_get_spread( 80 );
  176.     e_dart = magicbullet( "blundersplat_bullet_zm", fire_origin, offsetpos, self );
  177.     e_dart thread _titus_reset_grenade_fuse( n_fuse_timer );
  178. }
  179.  
  180. _titus_get_spread( n_spread )
  181. {
  182.     n_x = randomintrange( n_spread * -1, n_spread );
  183.     n_y = randomintrange( n_spread * -1, n_spread );
  184.     n_z = randomintrange( n_spread * -1, n_spread );
  185.     return ( n_x, n_y, n_z );
  186. }
  187.  
  188. _titus_marked()
  189. {
  190.     self endon( "death" );
  191.     self.titusmarked = 1;
  192.     wait 1;
  193.     self.titusmarked = undefined;
  194. }
  195.  
  196. _titus_target_animate_and_die( n_fuse_timer, inflictor )
  197. {
  198.     self endon( "death" );
  199.     self endon( "titus_target_timeout" );
  200.     self thread _titus_target_timeout( n_fuse_timer );
  201.     self thread _titus_check_for_target_death( inflictor );
  202.     self thread _blundersplat_target_acid_stun_anim();
  203.     wait n_fuse_timer;
  204.     self notify( "killed_by_a_blundersplat" );
  205.     self dodamage( self.health + 1000, self.origin );
  206. }
  207.  
  208. _titus_target_check_for_grenade_hits()
  209. {
  210.     self endon( "death" );
  211.     self endon( "titus_target_timeout" );
  212.     while ( 1 )
  213.     {
  214.         self waittill( "damage", amount, inflictor, direction, point, type, tagname, modelname, partname, weaponname, idflags );
  215.         while ( weaponname == "blundersplat_bullet_zm" )
  216.         {
  217.             a_grenades = getentarray( "grenade", "classname" );
  218.             _a317 = a_grenades;
  219.             _k317 = getFirstArrayKey( _a317 );
  220.             while ( isDefined( _k317 ) )
  221.             {
  222.                 e_grenade = _a317[ _k317 ];
  223.                 if ( isDefined( e_grenade.model ) && e_grenade.model == "t6_wpn_zmb_projectile_blundergat" )
  224.                 {
  225.                     if ( e_grenade islinkedto( self ) )
  226.                     {
  227.                         e_grenade thread _titus_grenade_detonate_on_target_death( self );
  228.                     }
  229.                 }
  230.                 _k317 = getNextArrayKey( _a317, _k317 );
  231.             }
  232.         }
  233.     }
  234. }
  235.  
  236. _titus_target_timeout( n_fuse_timer )
  237. {
  238.     self endon( "death" );
  239.     wait n_fuse_timer;
  240.     self notify( "titus_target_timeout" );
  241. }
  242.  
  243. _titus_check_for_target_death( inflictor )
  244. {
  245.     self waittill( "death" );
  246.     self notify( "killed_by_a_blundersplat" );
  247.     self notify( "titus_target_killed" );
  248. }
  249.  
  250. _titus_grenade_detonate_on_target_death( target )
  251. {
  252.     self endon( "death" );
  253.     target endon( "titus_target_timeout" );
  254.     target waittill( "titus_target_killed" );
  255.     self.fuse_reset = 1;
  256.     self resetmissiledetonationtime( 0,05 );
  257. }
  258.  
  259. _titus_reset_grenade_fuse( n_fuse_timer, is_not_upgraded )
  260. {
  261.     if ( !isDefined( is_not_upgraded ) )
  262.     {
  263.         is_not_upgraded = 1;
  264.     }
  265.     if ( !isDefined( n_fuse_timer ) )
  266.     {
  267.         n_fuse_timer = randomfloatrange( 1, 1,5 );
  268.     }
  269.     self waittill( "death" );
  270.     a_grenades = getentarray( "grenade", "classname" );
  271.     _a375 = a_grenades;
  272.     _k375 = getFirstArrayKey( _a375 );
  273.     while ( isDefined( _k375 ) )
  274.     {
  275.         e_grenade = _a375[ _k375 ];
  276.         if ( isDefined( e_grenade.model ) && e_grenade.model == "t6_wpn_zmb_projectile_blundergat" && !isDefined( e_grenade.fuse_reset ) )
  277.         {
  278.             e_grenade.fuse_reset = 1;
  279.             e_grenade.fuse_time = n_fuse_timer;
  280.             e_grenade resetmissiledetonationtime( n_fuse_timer );
  281.             if ( is_not_upgraded )
  282.             {
  283.                 e_grenade create_zombie_point_of_interest( 250, 5, 10000 );
  284.             }
  285.             else
  286.             {
  287.                 e_grenade create_zombie_point_of_interest( 500, 10, 10000 );
  288.             }
  289.             return;
  290.         }
  291.         _k375 = getNextArrayKey( _a375, _k375 );
  292.     }
  293. }
  294.  
  295. gib_on_blundergat_damage( refs, point, weaponname )
  296. {
  297.     new_gib_ref = [];
  298.     if ( isDefined( level.no_gib_in_wolf_area ) )
  299.     {
  300.         if ( [[ level.no_gib_in_wolf_area ]]() )
  301.         {
  302.             return new_gib_ref;
  303.         }
  304.     }
  305.     if ( self.health <= 0 )
  306.     {
  307.         return refs;
  308.     }
  309.     else
  310.     {
  311.         if ( weaponname == "blundergat_zm" || weaponname == "blundergat_upgraded_zm" )
  312.         {
  313.             new_gib_ref = self maps/mp/zombies/_zm_spawner::derive_damage_refs( point );
  314.             return new_gib_ref;
  315.         }
  316.     }
  317.     return refs;
  318. }
  319.  
  320. _blundersplat_target_acid_stun_anim()
  321. {
  322.     self endon( "death" );
  323.     while ( 1 )
  324.     {
  325.         ground_ent = self getgroundent();
  326.         if ( isDefined( ground_ent ) && !is_true( ground_ent.classname == "worldspawn" ) )
  327.         {
  328.             self linkto( ground_ent );
  329.         }
  330.         if ( is_true( self.has_legs ) )
  331.         {
  332.             self animscripted( self.origin, self.angles, "zm_blundersplat_stun" );
  333.         }
  334.         else
  335.         {
  336.             self animscripted( self.origin, self.angles, "zm_blundersplat_stun_crawl" );
  337.         }
  338.         self maps/mp/animscripts/zm_shared::donotetracks( "blundersplat_stunned_anim" );
  339.     }
  340. }
Advertisement
Add Comment
Please, Sign In to add comment