FineNerds

Paralyzer

Dec 28th, 2014
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 21.45 KB | None | 0 0
  1. #include maps/mp/zombies/_zm_audio;
  2. #include maps/mp/zombies/_zm_score;
  3. #include maps/mp/zombies/_zm_powerups;
  4. #include maps/mp/zombies/_zm_spawner;
  5. #include maps/mp/zombies/_zm_weapons;
  6. #include maps/mp/zombies/_zm_utility;
  7. #include maps/mp/_utility;
  8. #include common_scripts/utility;
  9.  
  10. init()
  11. {
  12.     if ( !maps/mp/zombies/_zm_weapons::is_weapon_included( "slowgun_zm" ) )
  13.     {
  14.         return;
  15.     }
  16.     registerclientfield( "actor", "slowgun_fx", 12000, 3, "int" );
  17.     registerclientfield( "actor", "anim_rate", 7000, 5, "float" );
  18.     registerclientfield( "allplayers", "anim_rate", 7000, 5, "float" );
  19.     registerclientfield( "toplayer", "sndParalyzerLoop", 12000, 1, "int" );
  20.     registerclientfield( "toplayer", "slowgun_fx", 12000, 1, "int" );
  21.     level.sliquifier_distance_checks = 0;
  22.     maps/mp/zombies/_zm_spawner::add_cusom_zombie_spawn_logic( ::slowgun_on_zombie_spawned );
  23.     maps/mp/zombies/_zm_spawner::register_zombie_damage_callback( ::slowgun_zombie_damage_response );
  24.     maps/mp/zombies/_zm_spawner::register_zombie_death_animscript_callback( ::slowgun_zombie_death_response );
  25.     level._effect[ "zombie_slowgun_explosion" ] = loadfx( "weapon/paralyzer/fx_paralyzer_body_disintegrate" );
  26.     level._effect[ "zombie_slowgun_explosion_ug" ] = loadfx( "weapon/paralyzer/fx_paralyzer_body_disintegrate_ug" );
  27.     level._effect[ "zombie_slowgun_sizzle" ] = loadfx( "weapon/paralyzer/fx_paralyzer_hit_dmg" );
  28.     level._effect[ "zombie_slowgun_sizzle_ug" ] = loadfx( "weapon/paralyzer/fx_paralyzer_hit_dmg_ug" );
  29.     level._effect[ "player_slowgun_sizzle" ] = loadfx( "weapon/paralyzer/fx_paralyzer_hit_noharm" );
  30.     level._effect[ "player_slowgun_sizzle_ug" ] = loadfx( "weapon/paralyzer/fx_paralyzer_hit_noharm" );
  31.     level._effect[ "player_slowgun_sizzle_1st" ] = loadfx( "weapon/paralyzer/fx_paralyzer_hit_noharm_view" );
  32.     onplayerconnect_callback( ::slowgun_player_connect );
  33.     level.slowgun_damage = 40;
  34.     level.slowgun_damage_ug = 60;
  35.     level.slowgun_damage_mod = "MOD_PROJECTILE_SPLASH";
  36.     precacherumble( "damage_heavy" );
  37. /#
  38.     level thread show_anim_rates();
  39. #/
  40. }
  41.  
  42. slowgun_player_connect()
  43. {
  44.     self thread watch_reset_anim_rate();
  45.     self thread watch_slowgun_fired();
  46.     self thread sndwatchforweapswitch();
  47. }
  48.  
  49. sndwatchforweapswitch()
  50. {
  51.     self endon( "disconnect" );
  52.     while ( 1 )
  53.     {
  54.         self waittill( "weapon_change", weapon );
  55.         if ( weapon == "slowgun_zm" || weapon == "slowgun_upgraded_zm" )
  56.         {
  57.             self setclientfieldtoplayer( "sndParalyzerLoop", 1 );
  58.             self waittill( "weapon_change" );
  59.             self setclientfieldtoplayer( "sndParalyzerLoop", 0 );
  60.         }
  61.     }
  62. }
  63.  
  64. watch_reset_anim_rate()
  65. {
  66.     self set_anim_rate( 1 );
  67.     self setclientfieldtoplayer( "slowgun_fx", 0 );
  68.     while ( 1 )
  69.     {
  70.         self waittill_any( "spawned", "entering_last_stand", "player_revived", "player_suicide", "respawned" );
  71.         self setclientfieldtoplayer( "slowgun_fx", 0 );
  72.         self set_anim_rate( 1 );
  73.     }
  74. }
  75.  
  76. watch_slowgun_fired()
  77. {
  78.     self endon( "disconnect" );
  79.     self waittill( "spawned_player" );
  80.     for ( ;; )
  81.     {
  82.         self waittill( "weapon_fired", weapon );
  83.         if ( weapon == "slowgun_zm" )
  84.         {
  85.             self slowgun_fired( 0 );
  86.             continue;
  87.         }
  88.         else
  89.         {
  90.             if ( weapon == "slowgun_upgraded_zm" )
  91.             {
  92.                 self slowgun_fired( 1 );
  93.             }
  94.         }
  95.     }
  96. }
  97.  
  98. slowgun_fired( upgraded )
  99. {
  100.     origin = self getweaponmuzzlepoint();
  101.     forward = self getweaponforwarddir();
  102. /#
  103.     show_muzzle( origin, forward );
  104. #/
  105.     targets = self get_targets_in_range( upgraded, origin, forward );
  106.     while ( targets.size )
  107.     {
  108.         _a148 = targets;
  109.         _k148 = getFirstArrayKey( _a148 );
  110.         while ( isDefined( _k148 ) )
  111.         {
  112.             target = _a148[ _k148 ];
  113.             if ( isplayer( target ) )
  114.             {
  115.                 if ( is_player_valid( target ) && self != target )
  116.                 {
  117.                     target thread player_paralyzed( self, upgraded );
  118.                 }
  119.             }
  120.             else if ( isDefined( target.paralyzer_hit_callback ) )
  121.             {
  122.                 target thread [[ target.paralyzer_hit_callback ]]( self, upgraded );
  123.             }
  124.             else
  125.             {
  126.                 target thread zombie_paralyzed( self, upgraded );
  127.             }
  128.             _k148 = getNextArrayKey( _a148, _k148 );
  129.         }
  130.     }
  131.     dot = vectordot( forward, ( 0, 1, 0 ) );
  132.     if ( dot > 0,8 )
  133.     {
  134.         self thread player_paralyzed( self, upgraded );
  135.     }
  136. }
  137.  
  138. slowgun_get_enemies_in_range( upgraded, position, forward, possible_targets )
  139. {
  140.     inner_range = 12;
  141.     outer_range = 660;
  142.     cylinder_radius = 48;
  143.     level.slowgun_enemies = [];
  144.     view_pos = position;
  145.     if ( !isDefined( possible_targets ) )
  146.     {
  147.         return level.slowgun_enemies;
  148.     }
  149.     slowgun_inner_range_squared = inner_range * inner_range;
  150.     slowgun_outer_range_squared = outer_range * outer_range;
  151.     cylinder_radius_squared = cylinder_radius * cylinder_radius;
  152.     forward_view_angles = forward;
  153.     end_pos = view_pos + vectorScale( forward_view_angles, outer_range );
  154. /#
  155.     if ( getDvarInt( #"61A711C2" ) == 2 )
  156.     {
  157.         near_circle_pos = view_pos + vectorScale( forward_view_angles, 2 );
  158.         circle( near_circle_pos, cylinder_radius, ( 0, 1, 0 ), 0, 0, 100 );
  159.         line( near_circle_pos, end_pos, ( 0, 1, 0 ), 1, 0, 100 );
  160.         circle( end_pos, cylinder_radius, ( 0, 1, 0 ), 0, 0, 100 );
  161. #/
  162.     }
  163.     i = 0;
  164.     while ( i < possible_targets.size )
  165.     {
  166.         if ( !isDefined( possible_targets[ i ] ) || !isalive( possible_targets[ i ] ) )
  167.         {
  168.             i++;
  169.             continue;
  170.         }
  171.         else
  172.         {
  173.             test_origin = possible_targets[ i ] getcentroid();
  174.             test_range_squared = distancesquared( view_pos, test_origin );
  175.             if ( test_range_squared > slowgun_outer_range_squared )
  176.             {
  177.                 possible_targets[ i ] slowgun_debug_print( "range", ( 0, 1, 0 ) );
  178.                 i++;
  179.                 continue;
  180.             }
  181.             else normal = vectornormalize( test_origin - view_pos );
  182.             dot = vectordot( forward_view_angles, normal );
  183.             if ( dot <= 0 )
  184.             {
  185.                 possible_targets[ i ] slowgun_debug_print( "dot", ( 0, 1, 0 ) );
  186.                 i++;
  187.                 continue;
  188.             }
  189.             else radial_origin = pointonsegmentnearesttopoint( view_pos, end_pos, test_origin );
  190.             if ( distancesquared( test_origin, radial_origin ) > cylinder_radius_squared )
  191.             {
  192.                 possible_targets[ i ] slowgun_debug_print( "cylinder", ( 0, 1, 0 ) );
  193.                 i++;
  194.                 continue;
  195.             }
  196.             else if ( possible_targets[ i ] damageconetrace( view_pos, self ) == 0 )
  197.             {
  198.                 possible_targets[ i ] slowgun_debug_print( "cone", ( 0, 1, 0 ) );
  199.                 i++;
  200.                 continue;
  201.             }
  202.             else
  203.             {
  204.                 level.slowgun_enemies[ level.slowgun_enemies.size ] = possible_targets[ i ];
  205.             }
  206.         }
  207.         i++;
  208.     }
  209.     return level.slowgun_enemies;
  210. }
  211.  
  212. get_targets_in_range( upgraded, position, forward )
  213. {
  214.     if ( !isDefined( self.slowgun_targets ) || ( getTime() - self.slowgun_target_time ) > 150 )
  215.     {
  216.         targets = [];
  217.         possible_targets = getaispeciesarray( level.zombie_team, "all" );
  218.         possible_targets = arraycombine( possible_targets, get_players(), 1, 0 );
  219.         if ( isDefined( level.possible_slowgun_targets ) && level.possible_slowgun_targets.size > 0 )
  220.         {
  221.             possible_targets = arraycombine( possible_targets, level.possible_slowgun_targets, 1, 0 );
  222.         }
  223.         targets = slowgun_get_enemies_in_range( 0, position, forward, possible_targets );
  224.         self.slowgun_targets = targets;
  225.         self.slowgun_target_time = getTime();
  226.     }
  227.     return self.slowgun_targets;
  228. }
  229.  
  230. slowgun_on_zombie_spawned()
  231. {
  232.     self set_anim_rate( 1 );
  233.     self.paralyzer_hit_callback = ::zombie_paralyzed;
  234.     self.paralyzer_damaged_multiplier = 1;
  235.     self.paralyzer_score_time_ms = getTime();
  236.     self.paralyzer_slowtime = 0;
  237.     self setclientfield( "slowgun_fx", 0 );
  238. }
  239.  
  240. can_be_paralyzed( zombie )
  241. {
  242.     if ( is_true( zombie.is_ghost ) )
  243.     {
  244.         return 0;
  245.     }
  246.     if ( is_true( zombie.guts_explosion ) )
  247.     {
  248.         return 0;
  249.     }
  250.     if ( isDefined( zombie ) && zombie.health > 0 )
  251.     {
  252.         return 1;
  253.     }
  254.     return 0;
  255. }
  256.  
  257. set_anim_rate( rate )
  258. {
  259.     if ( isDefined( self ) )
  260.     {
  261.         self.slowgun_anim_rate = rate;
  262.         if ( !is_true( level.ignore_slowgun_anim_rates ) && !is_true( self.ignore_slowgun_anim_rates ) )
  263.         {
  264.             self setclientfield( "anim_rate", rate );
  265.             qrate = self getclientfield( "anim_rate" );
  266.             self setentityanimrate( qrate );
  267.             if ( isDefined( self.set_anim_rate ) )
  268.             {
  269.                 self [[ self.set_anim_rate ]]( rate );
  270.             }
  271.         }
  272.     }
  273. }
  274.  
  275. reset_anim()
  276. {
  277.     wait_network_frame();
  278.     if ( !isDefined( self ) )
  279.     {
  280.         return;
  281.     }
  282.     if ( is_true( self.is_traversing ) )
  283.     {
  284.         animstate = self getanimstatefromasd();
  285.         if ( !is_true( self.no_restart ) )
  286.         {
  287.             self.no_restart = 1;
  288.             animstate += "_no_restart";
  289.         }
  290.         substate = self getanimsubstatefromasd();
  291.         self setanimstatefromasd( animstate, substate );
  292.     }
  293.     else
  294.     {
  295.         self.needs_run_update = 1;
  296.         self notify( "needs_run_update" );
  297.     }
  298. }
  299.  
  300. zombie_change_rate( time, newrate )
  301. {
  302.     self set_anim_rate( newrate );
  303.     if ( isDefined( self.reset_anim ) )
  304.     {
  305.         self thread [[ self.reset_anim ]]();
  306.     }
  307.     else
  308.     {
  309.         self thread reset_anim();
  310.     }
  311.     if ( time > 0 )
  312.     {
  313.         wait time;
  314.     }
  315. }
  316.  
  317. zombie_slow_for_time( time, multiplier )
  318. {
  319.     if ( !isDefined( multiplier ) )
  320.     {
  321.         multiplier = 2;
  322.     }
  323.     paralyzer_time_per_frame = 0,1 * ( 1 + multiplier );
  324.     if ( self.paralyzer_slowtime <= time )
  325.     {
  326.         self.paralyzer_slowtime = time + paralyzer_time_per_frame;
  327.     }
  328.     else
  329.     {
  330.         self.paralyzer_slowtime += paralyzer_time_per_frame;
  331.     }
  332.     if ( !isDefined( self.slowgun_anim_rate ) )
  333.     {
  334.         self.slowgun_anim_rate = 1;
  335.     }
  336.     if ( !isDefined( self.slowgun_desired_anim_rate ) )
  337.     {
  338.         self.slowgun_desired_anim_rate = 1;
  339.     }
  340.     if ( self.slowgun_desired_anim_rate > 0,3 )
  341.     {
  342.         self.slowgun_desired_anim_rate -= 0,2;
  343.     }
  344.     else
  345.     {
  346.         self.slowgun_desired_anim_rate = 0,05;
  347.     }
  348.     if ( is_true( self.slowing ) )
  349.     {
  350.         return;
  351.     }
  352.     self.slowing = 1;
  353.     self.preserve_asd_substates = 1;
  354.     self playloopsound( "wpn_paralyzer_slowed_loop", 0,1 );
  355.     while ( self.paralyzer_slowtime > 0 && isalive( self ) )
  356.     {
  357.         if ( self.paralyzer_slowtime < 0,1 )
  358.         {
  359.             self.slowgun_desired_anim_rate = 1;
  360.         }
  361.         else if ( self.paralyzer_slowtime < ( 2 * 0,1 ) )
  362.         {
  363.             self.slowgun_desired_anim_rate = max( self.slowgun_desired_anim_rate, 0,8 );
  364.         }
  365.         else if ( self.paralyzer_slowtime < ( 3 * 0,1 ) )
  366.         {
  367.             self.slowgun_desired_anim_rate = max( self.slowgun_desired_anim_rate, 0,6 );
  368.         }
  369.         else if ( self.paralyzer_slowtime < ( 4 * 0,1 ) )
  370.         {
  371.             self.slowgun_desired_anim_rate = max( self.slowgun_desired_anim_rate, 0,4 );
  372.         }
  373.         else
  374.         {
  375.             if ( self.paralyzer_slowtime < ( 5 * 0,1 ) )
  376.             {
  377.                 self.slowgun_desired_anim_rate = max( self.slowgun_desired_anim_rate, 0,2 );
  378.             }
  379.         }
  380.         if ( self.slowgun_desired_anim_rate == self.slowgun_anim_rate )
  381.         {
  382.             self.paralyzer_slowtime -= 0,1;
  383.             wait 0,1;
  384.             continue;
  385.         }
  386.         else if ( self.slowgun_desired_anim_rate >= self.slowgun_anim_rate )
  387.         {
  388.             new_rate = self.slowgun_desired_anim_rate;
  389.             if ( ( self.slowgun_desired_anim_rate - self.slowgun_anim_rate ) > 0,2 )
  390.             {
  391.                 new_rate = self.slowgun_anim_rate + 0,2;
  392.             }
  393.             self.paralyzer_slowtime -= 0,1;
  394.             zombie_change_rate( 0,1, new_rate );
  395.             self.paralyzer_damaged_multiplier = 1;
  396.             continue;
  397.         }
  398.         else
  399.         {
  400.             if ( self.slowgun_desired_anim_rate <= self.slowgun_anim_rate )
  401.             {
  402.                 new_rate = self.slowgun_desired_anim_rate;
  403.                 if ( ( self.slowgun_anim_rate - self.slowgun_desired_anim_rate ) > 0,2 )
  404.                 {
  405.                     new_rate = self.slowgun_anim_rate - 0,2;
  406.                 }
  407.                 self.paralyzer_slowtime -= 0,25;
  408.                 zombie_change_rate( 0,25, new_rate );
  409.             }
  410.         }
  411.     }
  412.     if ( self.slowgun_anim_rate < 1 )
  413.     {
  414.         self zombie_change_rate( 0, 1 );
  415.     }
  416.     self.preserve_asd_substates = 0;
  417.     self.slowing = 0;
  418.     self.paralyzer_damaged_multiplier = 1;
  419.     self setclientfield( "slowgun_fx", 0 );
  420.     self stoploopsound( 0,1 );
  421. }
  422.  
  423. zombie_paralyzed( player, upgraded )
  424. {
  425.     if ( !can_be_paralyzed( self ) )
  426.     {
  427.         return;
  428.     }
  429.     insta = player maps/mp/zombies/_zm_powerups::is_insta_kill_active();
  430.     if ( upgraded )
  431.     {
  432.         self setclientfield( "slowgun_fx", 5 );
  433.     }
  434.     else
  435.     {
  436.         self setclientfield( "slowgun_fx", 1 );
  437.     }
  438.     if ( self.slowgun_anim_rate <= 0,1 || insta && self.slowgun_anim_rate <= 0,5 )
  439.     {
  440.         if ( upgraded )
  441.         {
  442.             damage = level.slowgun_damage_ug;
  443.         }
  444.         else
  445.         {
  446.             damage = level.slowgun_damage;
  447.         }
  448.         damage *= randomfloatrange( 0,667, 1,5 );
  449.         damage *= self.paralyzer_damaged_multiplier;
  450.         if ( insta )
  451.         {
  452.             damage = self.health + 666;
  453.         }
  454.         if ( isalive( self ) )
  455.         {
  456.             self dodamage( damage, player.origin, player, player, "none", level.slowgun_damage_mod, 0, "slowgun_zm" );
  457.         }
  458.         self.paralyzer_damaged_multiplier *= 1,15;
  459.     }
  460.     else
  461.     {
  462.         self.paralyzer_damaged_multiplier = 1;
  463.     }
  464.     self zombie_slow_for_time( 0,2 );
  465. }
  466.  
  467. get_extra_damage( amount, mod, slow )
  468. {
  469.     mult = 1 - slow;
  470.     return amount * slow;
  471. }
  472.  
  473. slowgun_zombie_damage_response( mod, hit_location, hit_origin, player, amount )
  474. {
  475.     if ( !self is_slowgun_damage( self.damagemod, self.damageweapon ) )
  476.     {
  477.         if ( isDefined( self.slowgun_anim_rate ) && self.slowgun_anim_rate < 1 && mod != level.slowgun_damage_mod )
  478.         {
  479.             extra_damage = get_extra_damage( amount, mod, self.slowgun_anim_rate );
  480.             if ( extra_damage > 0 )
  481.             {
  482.                 if ( isalive( self ) )
  483.                 {
  484.                     self dodamage( extra_damage, hit_origin, player, player, hit_location, level.slowgun_damage_mod, 0, "slowgun_zm" );
  485.                 }
  486.                 if ( !isalive( self ) )
  487.                 {
  488.                     return 1;
  489.                 }
  490.             }
  491.         }
  492.         return 0;
  493.     }
  494.     if ( ( getTime() - self.paralyzer_score_time_ms ) >= 500 )
  495.     {
  496.         self.paralyzer_score_time_ms = getTime();
  497.         player maps/mp/zombies/_zm_score::player_add_points( "damage", mod, hit_location, self.isdog, level.zombie_team );
  498.     }
  499.     if ( player maps/mp/zombies/_zm_powerups::is_insta_kill_active() )
  500.     {
  501.         amount = self.health + 666;
  502.     }
  503.     if ( isalive( self ) )
  504.     {
  505.         self dodamage( amount, hit_origin, player, player, hit_location, mod, 0, "slowgun_zm" );
  506.     }
  507.     return 1;
  508. }
  509.  
  510. explosion_choke()
  511. {
  512.     if ( !isDefined( level.slowgun_explosion_time ) )
  513.     {
  514.         level.slowgun_explosion_time = 0;
  515.     }
  516.     if ( level.slowgun_explosion_time != getTime() )
  517.     {
  518.         level.slowgun_explosion_count = 0;
  519.         level.slowgun_explosion_time = getTime();
  520.     }
  521.     while ( level.slowgun_explosion_count > 4 )
  522.     {
  523.         wait 0,05;
  524.         if ( level.slowgun_explosion_time != getTime() )
  525.         {
  526.             level.slowgun_explosion_count = 0;
  527.             level.slowgun_explosion_time = getTime();
  528.         }
  529.     }
  530.     level.slowgun_explosion_count++;
  531.     return;
  532. }
  533.  
  534. explode_into_dust( player, upgraded )
  535. {
  536.     if ( isDefined( self.marked_for_insta_upgraded_death ) )
  537.     {
  538.         return;
  539.     }
  540.     explosion_choke();
  541.     if ( upgraded )
  542.     {
  543.         self setclientfield( "slowgun_fx", 6 );
  544.     }
  545.     else
  546.     {
  547.         self setclientfield( "slowgun_fx", 2 );
  548.     }
  549.     self.guts_explosion = 1;
  550.     self ghost();
  551. }
  552.  
  553. slowgun_zombie_death_response()
  554. {
  555.     if ( !self is_slowgun_damage( self.damagemod, self.damageweapon ) )
  556.     {
  557.         return 0;
  558.     }
  559.     level maps/mp/zombies/_zm_spawner::zombie_death_points( self.origin, self.damagemod, self.damagelocation, self.attacker, self );
  560.     self thread explode_into_dust( self.attacker, self.damageweapon == "slowgun_upgraded_zm" );
  561.     return 1;
  562. }
  563.  
  564. is_slowgun_damage( mod, weapon )
  565. {
  566.     if ( isDefined( weapon ) )
  567.     {
  568.         if ( weapon != "slowgun_zm" )
  569.         {
  570.             return weapon == "slowgun_upgraded_zm";
  571.         }
  572.     }
  573. }
  574.  
  575. setjumpenabled( onoff )
  576. {
  577.     if ( onoff )
  578.     {
  579.         if ( isDefined( self.jump_was_enabled ) )
  580.         {
  581.             self allowjump( self.jump_was_enabled );
  582.             self.jump_was_enabled = undefined;
  583.         }
  584.         else
  585.         {
  586.             self allowjump( 1 );
  587.         }
  588.     }
  589.     else
  590.     {
  591.         if ( !isDefined( self.jump_was_enabled ) )
  592.         {
  593.             self.jump_was_enabled = self allowjump( 0 );
  594.         }
  595.     }
  596. }
  597.  
  598. get_ahead_ent()
  599. {
  600.     velocity = self getvelocity();
  601.     if ( lengthsquared( velocity ) < 225 )
  602.     {
  603.         return undefined;
  604.     }
  605.     start = self geteyeapprox();
  606.     end = start + ( velocity * 0,25 );
  607.     mins = ( 0, 1, 0 );
  608.     maxs = ( 0, 1, 0 );
  609.     trace = physicstrace( start, end, vectorScale( ( 0, 1, 0 ), 15 ), vectorScale( ( 0, 1, 0 ), 15 ), self, level.physicstracemaskclip );
  610.     if ( isDefined( trace[ "entity" ] ) )
  611.     {
  612.         return trace[ "entity" ];
  613.     }
  614.     else
  615.     {
  616.         if ( trace[ "fraction" ] < 0,99 || trace[ "surfacetype" ] != "none" )
  617.         {
  618.             return level;
  619.         }
  620.     }
  621.     return undefined;
  622. }
  623.  
  624. bump()
  625. {
  626.     self playrumbleonentity( "damage_heavy" );
  627.     earthquake( 0,5, 0,15, self.origin, 1000, self );
  628. }
  629.  
  630. player_fly_rumble()
  631. {
  632.     self endon( "player_slow_stop_flying" );
  633.     self endon( "disconnect" );
  634.     self endon( "platform_collapse" );
  635.     self.slowgun_flying = 1;
  636.     last_ground = self getgroundent();
  637.     last_ahead = undefined;
  638.     while ( 1 )
  639.     {
  640.         ground = self getgroundent();
  641.         if ( isDefined( ground ) != isDefined( last_ground ) || ground != last_ground )
  642.         {
  643.             if ( isDefined( ground ) )
  644.             {
  645.                 self bump();
  646.             }
  647.         }
  648.         if ( isDefined( ground ) && !self.slowgun_flying )
  649.         {
  650.             self thread dont_tread_on_z();
  651.             return;
  652.         }
  653.         last_ground = ground;
  654.         if ( isDefined( ground ) )
  655.         {
  656.             last_ahead = undefined;
  657.         }
  658.         else
  659.         {
  660.             ahead = self get_ahead_ent();
  661.             if ( isDefined( ahead ) )
  662.             {
  663.                 if ( isDefined( ahead ) != isDefined( last_ahead ) || ahead != last_ahead )
  664.                 {
  665.                     self playsoundtoplayer( "zmb_invis_barrier_hit", self );
  666.                     chance = get_response_chance( "invisible_collision" );
  667.                     if ( chance > randomintrange( 1, 100 ) )
  668.                     {
  669.                         self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "invisible_collision" );
  670.                     }
  671.                     self bump();
  672.                 }
  673.             }
  674.             last_ahead = ahead;
  675.         }
  676.         wait 0,15;
  677.     }
  678. }
  679.  
  680. dont_tread_on_z()
  681. {
  682.     if ( !isDefined( level.ghost_head_damage ) )
  683.     {
  684.         level.ghost_head_damage = 30;
  685.     }
  686.     ground = self getgroundent();
  687.     while ( isDefined( ground ) && isDefined( ground.team ) && ground.team == level.zombie_team )
  688.     {
  689.         first_ground = ground;
  690.         while ( !isDefined( ground ) || isDefined( ground.team ) && ground.team == level.zombie_team )
  691.         {
  692.             if ( is_true( self.slowgun_flying ) )
  693.             {
  694.                 return;
  695.             }
  696.             if ( isDefined( ground ) )
  697.             {
  698.                 self dodamage( level.ghost_head_damage, ground.origin, ground );
  699.                 if ( is_true( ground.is_ghost ) )
  700.                 {
  701.                     level.ghost_head_damage *= 1,5;
  702.                     if ( self.score > 4000 )
  703.                     {
  704.                         self.score -= 4000;
  705.                     }
  706.                     else
  707.                     {
  708.                         self.score = 0;
  709.                     }
  710.                 }
  711.             }
  712.             else
  713.             {
  714.                 self dodamage( level.ghost_head_damage, first_ground.origin, first_ground );
  715.             }
  716.             wait 0,25;
  717.             ground = self getgroundent();
  718.         }
  719.     }
  720. }
  721.  
  722. player_slow_for_time( time )
  723. {
  724.     self notify( "player_slow_for_time" );
  725.     self endon( "player_slow_for_time" );
  726.     self endon( "disconnect" );
  727.     if ( !is_true( self.slowgun_flying ) )
  728.     {
  729.         self thread player_fly_rumble();
  730.     }
  731.     self setclientfieldtoplayer( "slowgun_fx", 1 );
  732.     self set_anim_rate( 0,05 );
  733.     wait time;
  734.     self set_anim_rate( 1 );
  735.     self setclientfieldtoplayer( "slowgun_fx", 0 );
  736.     self.slowgun_flying = 0;
  737. }
  738.  
  739. player_paralyzed( byplayer, upgraded )
  740. {
  741.     self notify( "player_paralyzed" );
  742.     self endon( "player_paralyzed" );
  743.     self endon( "death" );
  744.     if ( isDefined( level.slowgun_allow_player_paralyze ) )
  745.     {
  746.         if ( !( self [[ level.slowgun_allow_player_paralyze ]]() ) )
  747.         {
  748.             return;
  749.         }
  750.     }
  751.     if ( self != byplayer )
  752.     {
  753.         sizzle = "player_slowgun_sizzle";
  754.         if ( upgraded )
  755.         {
  756.             sizzle = "player_slowgun_sizzle_ug";
  757.         }
  758.         if ( isDefined( level._effect[ sizzle ] ) )
  759.         {
  760.             playfxontag( level._effect[ sizzle ], self, "J_SpineLower" );
  761.         }
  762.     }
  763.     self thread player_slow_for_time( 0,25 );
  764. }
  765.  
  766. slowgun_debug_print( msg, color )
  767. {
  768. /#
  769.     if ( getDvarInt( #"61A711C2" ) != 2 )
  770.     {
  771.         return;
  772.     }
  773.     if ( !isDefined( color ) )
  774.     {
  775.         color = ( 0, 1, 0 );
  776.     }
  777.     print3d( self.origin + vectorScale( ( 0, 1, 0 ), 60 ), msg, color, 1, 1, 40 );
  778. #/
  779. }
  780.  
  781. show_anim_rate( pos, dsquared )
  782. {
  783. /#
  784.     if ( distancesquared( pos, self.origin ) > dsquared )
  785.     {
  786.         return;
  787.     }
  788.     rate = self getentityanimrate();
  789.     color = ( 1 - rate, rate, 0 );
  790.     text = "" + int( rate * 100 ) + " S";
  791.     print3d( self.origin + ( 0, 1, 0 ), text, color, 1, 0,5, 1 );
  792. #/
  793. }
  794.  
  795. show_slow_time( pos, dsquared, insta )
  796. {
  797. /#
  798.     if ( distancesquared( pos, self.origin ) > dsquared )
  799.     {
  800.         return;
  801.     }
  802.     rate = self.paralyzer_slowtime;
  803.     if ( !isDefined( rate ) || rate < 0,05 )
  804.     {
  805.         return;
  806.     }
  807.     if ( self getentityanimrate() <= 0,1 || insta && self getentityanimrate() <= 0,5 )
  808.     {
  809.         color = ( 0, 1, 0 );
  810.     }
  811.     else
  812.     {
  813.         color = ( 0, 1, 0 );
  814.     }
  815.     text = "" + rate + "";
  816.     print3d( self.origin + vectorScale( ( 0, 1, 0 ), 50 ), text, color, 1, 0,5, 1 );
  817. #/
  818. }
  819.  
  820. show_anim_rates()
  821. {
  822. /#
  823.     while ( 1 )
  824.     {
  825.         if ( getDvarInt( #"61A711C2" ) == 1 )
  826.         {
  827.             lp = get_players()[ 0 ];
  828.             insta = lp maps/mp/zombies/_zm_powerups::is_insta_kill_active();
  829.             zombies = getaispeciesarray( "all", "all" );
  830.             while ( isDefined( zombies ) )
  831.             {
  832.                 _a858 = zombies;
  833.                 _k858 = getFirstArrayKey( _a858 );
  834.                 while ( isDefined( _k858 ) )
  835.                 {
  836.                     zombie = _a858[ _k858 ];
  837.                     zombie show_slow_time( lp.origin, 360000, insta );
  838.                     _k858 = getNextArrayKey( _a858, _k858 );
  839.                 }
  840.             }
  841.             if ( isDefined( level.sloth ) )
  842.             {
  843.                 level.sloth show_slow_time( lp.origin, 360000, 0 );
  844.             }
  845.         }
  846.         while ( getDvarInt( #"61A711C2" ) == 3 )
  847.         {
  848.             lp = get_players()[ 0 ];
  849.             _a871 = get_players();
  850.             _k871 = getFirstArrayKey( _a871 );
  851.             while ( isDefined( _k871 ) )
  852.             {
  853.                 player = _a871[ _k871 ];
  854.                 player show_anim_rate( lp.origin, 360000 );
  855.                 _k871 = getNextArrayKey( _a871, _k871 );
  856.             }
  857.             zombies = getaispeciesarray( "all", "all" );
  858.             while ( isDefined( zombies ) )
  859.             {
  860.                 _a879 = zombies;
  861.                 _k879 = getFirstArrayKey( _a879 );
  862.                 while ( isDefined( _k879 ) )
  863.                 {
  864.                     zombie = _a879[ _k879 ];
  865.                     zombie show_anim_rate( lp.origin, 360000 );
  866.                     _k879 = getNextArrayKey( _a879, _k879 );
  867.                 }
  868.             }
  869.         }
  870.         wait 0,05;
  871. #/
  872.     }
  873. }
  874.  
  875. show_muzzle( origin, forward )
  876. {
  877. /#
  878.     if ( getDvarInt( #"61A711C2" ) == 4 )
  879.     {
  880.         seconds = 0,25;
  881.         grey = vectorScale( ( 0, 1, 0 ), 0,3 );
  882.         green = ( 0, 1, 0 );
  883.         start = origin;
  884.         end = origin + ( 12 * forward );
  885.         frames = int( 20 * seconds );
  886.         line( start, end, green, 1, 0, frames );
  887. #/
  888.     }
  889. }
Advertisement
Add Comment
Please, Sign In to add comment