FineNerds

Thundergun.gsc

Aug 10th, 2015
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.03 KB | None | 0 0
  1. #include maps/mp/zombies/_zm_audio;
  2. #include maps/mp/animscripts/zm_death;
  3. #include maps/mp/zombies/_zm_score;
  4. #include maps/mp/zombies/_zm_weapons;
  5. #include maps/mp/zombies/_zm_net;
  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( "thundergun_zm" ) )
  13.     {
  14.         return;
  15.     }
  16.     level._effect[ "thundergun_viewmodel_power_cell1" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view1" );
  17.     level._effect[ "thundergun_viewmodel_power_cell2" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view2" );
  18.     level._effect[ "thundergun_viewmodel_power_cell3" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view3" );
  19.     level._effect[ "thundergun_viewmodel_steam" ] = loadfx( "weapon/thunder_gun/fx_thundergun_steam_view" );
  20.     level._effect[ "thundergun_viewmodel_power_cell1_upgraded" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view1" );
  21.     level._effect[ "thundergun_viewmodel_power_cell2_upgraded" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view2" );
  22.     level._effect[ "thundergun_viewmodel_power_cell3_upgraded" ] = loadfx( "weapon/thunder_gun/fx_thundergun_power_cell_view3" );
  23.     level._effect[ "thundergun_viewmodel_steam_upgraded" ] = loadfx( "weapon/thunder_gun/fx_thundergun_steam_view" );
  24.     level._effect[ "thundergun_knockdown_ground" ] = loadfx( "weapon/thunder_gun/fx_thundergun_knockback_ground" );
  25.     level._effect[ "thundergun_smoke_cloud" ] = loadfx( "weapon/thunder_gun/fx_thundergun_smoke_cloud" );
  26.     set_zombie_var( "thundergun_cylinder_radius", 180 );
  27.     set_zombie_var( "thundergun_fling_range", 480 );
  28.     set_zombie_var( "thundergun_gib_range", 900 );
  29.     set_zombie_var( "thundergun_gib_damage", 75 );
  30.     set_zombie_var( "thundergun_knockdown_range", 1200 );
  31.     set_zombie_var( "thundergun_knockdown_damage", 15 );
  32.     level.thundergun_gib_refs = [];
  33.     level.thundergun_gib_refs[ level.thundergun_gib_refs.size ] = "guts";
  34.     level.thundergun_gib_refs[ level.thundergun_gib_refs.size ] = "right_arm";
  35.     level.thundergun_gib_refs[ level.thundergun_gib_refs.size ] = "left_arm";
  36.     level.basic_zombie_thundergun_knockdown = ::zombie_knockdown;
  37. /#
  38.     level thread thundergun_devgui_dvar_think();
  39. #/
  40.     onplayerconnect_callback( ::thundergun_on_player_connect );
  41. }
  42.  
  43. thundergun_devgui_dvar_think()
  44. {
  45. /#
  46.     if ( !maps/mp/zombies/_zm_weapons::is_weapon_included( "thundergun_zm" ) )
  47.     {
  48.         return;
  49.     }
  50.     setdvar( "scr_thundergun_cylinder_radius", level.zombie_vars[ "thundergun_cylinder_radius" ] );
  51.     setdvar( "scr_thundergun_fling_range", level.zombie_vars[ "thundergun_fling_range" ] );
  52.     setdvar( "scr_thundergun_gib_range", level.zombie_vars[ "thundergun_gib_range" ] );
  53.     setdvar( "scr_thundergun_gib_damage", level.zombie_vars[ "thundergun_gib_damage" ] );
  54.     setdvar( "scr_thundergun_knockdown_range", level.zombie_vars[ "thundergun_knockdown_range" ] );
  55.     setdvar( "scr_thundergun_knockdown_damage", level.zombie_vars[ "thundergun_knockdown_damage" ] );
  56.     for ( ;; )
  57.     {
  58.         level.zombie_vars[ "thundergun_cylinder_radius" ] = getDvarInt( "scr_thundergun_cylinder_radius" );
  59.         level.zombie_vars[ "thundergun_fling_range" ] = getDvarInt( "scr_thundergun_fling_range" );
  60.         level.zombie_vars[ "thundergun_gib_range" ] = getDvarInt( "scr_thundergun_gib_range" );
  61.         level.zombie_vars[ "thundergun_gib_damage" ] = getDvarInt( "scr_thundergun_gib_damage" );
  62.         level.zombie_vars[ "thundergun_knockdown_range" ] = getDvarInt( "scr_thundergun_knockdown_range" );
  63.         level.zombie_vars[ "thundergun_knockdown_damage" ] = getDvarInt( "scr_thundergun_knockdown_damage" );
  64.         wait 0,5;
  65. #/
  66.     }
  67. }
  68.  
  69. thundergun_on_player_connect()
  70. {
  71.     self thread wait_for_thundergun_fired();
  72. }
  73.  
  74. wait_for_thundergun_fired()
  75. {
  76.     self endon( "disconnect" );
  77.     self waittill( "spawned_player" );
  78.     for ( ;; )
  79.     {
  80.         self waittill( "weapon_fired" );
  81.         currentweapon = self getcurrentweapon();
  82.         if ( currentweapon == "thundergun_zm" || currentweapon == "thundergun_upgraded_zm" )
  83.         {
  84.             self thread thundergun_fired();
  85.             view_pos = self gettagorigin( "tag_flash" ) - self getplayerviewheight();
  86.             view_angles = self gettagangles( "tag_flash" );
  87.             playfx( level._effect[ "thundergun_smoke_cloud" ], view_pos, anglesToForward( view_angles ), anglesToUp( view_angles ) );
  88.         }
  89.     }
  90. }
  91.  
  92. thundergun_network_choke()
  93. {
  94.     level.thundergun_network_choke_count++;
  95.     if ( level.thundergun_network_choke_count % 10 )
  96.     {
  97.         wait_network_frame();
  98.         wait_network_frame();
  99.         wait_network_frame();
  100.     }
  101. }
  102.  
  103. thundergun_fired()
  104. {
  105.     physicsexplosioncylinder( self.origin, 600, 240, 1 );
  106.     if ( !isDefined( level.thundergun_knockdown_enemies ) )
  107.     {
  108.         level.thundergun_knockdown_enemies = [];
  109.         level.thundergun_knockdown_gib = [];
  110.         level.thundergun_fling_enemies = [];
  111.         level.thundergun_fling_vecs = [];
  112.     }
  113.     self thundergun_get_enemies_in_range();
  114.     level.thundergun_network_choke_count = 0;
  115.     i = 0;
  116.     while ( i < level.thundergun_fling_enemies.size )
  117.     {
  118.         thundergun_network_choke();
  119.         level.thundergun_fling_enemies[ i ] thread thundergun_fling_zombie( self, level.thundergun_fling_vecs[ i ], i );
  120.         i++;
  121.     }
  122.     i = 0;
  123.     while ( i < level.thundergun_knockdown_enemies.size )
  124.     {
  125.         thundergun_network_choke();
  126.         level.thundergun_knockdown_enemies[ i ] thread thundergun_knockdown_zombie( self, level.thundergun_knockdown_gib[ i ] );
  127.         i++;
  128.     }
  129.     level.thundergun_knockdown_enemies = [];
  130.     level.thundergun_knockdown_gib = [];
  131.     level.thundergun_fling_enemies = [];
  132.     level.thundergun_fling_vecs = [];
  133. }
  134.  
  135. thundergun_get_enemies_in_range()
  136. {
  137.     view_pos = self getweaponmuzzlepoint();
  138.     zombies = get_array_of_closest( view_pos, get_round_enemy_array(), undefined, undefined, level.zombie_vars[ "thundergun_knockdown_range" ] );
  139.     if ( !isDefined( zombies ) )
  140.     {
  141.         return;
  142.     }
  143.     knockdown_range_squared = level.zombie_vars[ "thundergun_knockdown_range" ] * level.zombie_vars[ "thundergun_knockdown_range" ];
  144.     gib_range_squared = level.zombie_vars[ "thundergun_gib_range" ] * level.zombie_vars[ "thundergun_gib_range" ];
  145.     fling_range_squared = level.zombie_vars[ "thundergun_fling_range" ] * level.zombie_vars[ "thundergun_fling_range" ];
  146.     cylinder_radius_squared = level.zombie_vars[ "thundergun_cylinder_radius" ] * level.zombie_vars[ "thundergun_cylinder_radius" ];
  147.     forward_view_angles = self getweaponforwarddir();
  148.     end_pos = view_pos + vectorScale( forward_view_angles, level.zombie_vars[ "thundergun_knockdown_range" ] );
  149. /#
  150.     if ( getDvarInt( #"AAC84AD6" ) == 2 )
  151.     {
  152.         near_circle_pos = view_pos + vectorScale( forward_view_angles, 2 );
  153.         circle( near_circle_pos, level.zombie_vars[ "thundergun_cylinder_radius" ], ( 0, 0, 1 ), 0, 0, 100 );
  154.         line( near_circle_pos, end_pos, ( 0, 0, 1 ), 1, 0, 100 );
  155.         circle( end_pos, level.zombie_vars[ "thundergun_cylinder_radius" ], ( 0, 0, 1 ), 0, 0, 100 );
  156. #/
  157.     }
  158.     i = 0;
  159.     while ( i < zombies.size )
  160.     {
  161.         if ( !isDefined( zombies[ i ] ) || !isalive( zombies[ i ] ) )
  162.         {
  163.             i++;
  164.             continue;
  165.         }
  166.         else
  167.         {
  168.             test_origin = zombies[ i ] getcentroid();
  169.             test_range_squared = distancesquared( view_pos, test_origin );
  170.             if ( test_range_squared > knockdown_range_squared )
  171.             {
  172.                 zombies[ i ] thundergun_debug_print( "range", ( 0, 0, 1 ) );
  173.                 return;
  174.             }
  175.             normal = vectornormalize( test_origin - view_pos );
  176.             dot = vectordot( forward_view_angles, normal );
  177.             if ( dot <= 0 )
  178.             {
  179.                 zombies[ i ] thundergun_debug_print( "dot", ( 0, 0, 1 ) );
  180.                 i++;
  181.                 continue;
  182.             }
  183.             else radial_origin = pointonsegmentnearesttopoint( view_pos, end_pos, test_origin );
  184.             if ( distancesquared( test_origin, radial_origin ) > cylinder_radius_squared )
  185.             {
  186.                 zombies[ i ] thundergun_debug_print( "cylinder", ( 0, 0, 1 ) );
  187.                 i++;
  188.                 continue;
  189.             }
  190.             else if ( zombies[ i ] damageconetrace( view_pos, self ) == 0 )
  191.             {
  192.                 zombies[ i ] thundergun_debug_print( "cone", ( 0, 0, 1 ) );
  193.                 i++;
  194.                 continue;
  195.             }
  196.             else if ( test_range_squared < fling_range_squared )
  197.             {
  198.                 level.thundergun_fling_enemies[ level.thundergun_fling_enemies.size ] = zombies[ i ];
  199.                 dist_mult = ( fling_range_squared - test_range_squared ) / fling_range_squared;
  200.                 fling_vec = vectornormalize( test_origin - view_pos );
  201.                 if ( test_range_squared >= 5000 )
  202.                 {
  203.                     fling_vec += vectornormalize( test_origin - radial_origin );
  204.                 }
  205.                 fling_vec = ( fling_vec[ 0 ], fling_vec[ 1 ], abs( fling_vec[ 2 ] ) );
  206.                 fling_vec = vectorScale( fling_vec, 100 + ( 100 * dist_mult ) );
  207.                 level.thundergun_fling_vecs[ level.thundergun_fling_vecs.size ] = fling_vec;
  208.                 zombies[ i ] thread setup_thundergun_vox( self, 1, 0, 0 );
  209.                 i++;
  210.                 continue;
  211.             }
  212.             else if ( test_range_squared < gib_range_squared )
  213.             {
  214.                 level.thundergun_knockdown_enemies[ level.thundergun_knockdown_enemies.size ] = zombies[ i ];
  215.                 level.thundergun_knockdown_gib[ level.thundergun_knockdown_gib.size ] = 1;
  216.                 zombies[ i ] thread setup_thundergun_vox( self, 0, 1, 0 );
  217.                 i++;
  218.                 continue;
  219.             }
  220.             else
  221.             {
  222.                 level.thundergun_knockdown_enemies[ level.thundergun_knockdown_enemies.size ] = zombies[ i ];
  223.                 level.thundergun_knockdown_gib[ level.thundergun_knockdown_gib.size ] = 0;
  224.                 zombies[ i ] thread setup_thundergun_vox( self, 0, 0, 1 );
  225.             }
  226.         }
  227.         i++;
  228.     }
  229. }
  230.  
  231. thundergun_debug_print( msg, color )
  232. {
  233. /#
  234.     if ( !getDvarInt( #"AAC84AD6" ) )
  235.     {
  236.         return;
  237.     }
  238.     if ( !isDefined( color ) )
  239.     {
  240.         color = ( 0, 0, 1 );
  241.     }
  242.     print3d( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), msg, color, 1, 1, 40 );
  243. #/
  244. }
  245.  
  246. thundergun_fling_zombie( player, fling_vec, index )
  247. {
  248.     if ( !isDefined( self ) || !isalive( self ) )
  249.     {
  250.         return;
  251.     }
  252.     if ( isDefined( self.thundergun_fling_func ) )
  253.     {
  254.         self [[ self.thundergun_fling_func ]]( player );
  255.         return;
  256.     }
  257.     self dodamage( self.health + 666, player.origin, player );
  258.     if ( self.health <= 0 )
  259.     {
  260.         points = 10;
  261.         if ( !index )
  262.         {
  263.             points = maps/mp/zombies/_zm_score::get_zombie_death_player_points();
  264.         }
  265.         else
  266.         {
  267.             if ( index == 1 )
  268.             {
  269.                 points = 30;
  270.             }
  271.         }
  272.         player maps/mp/zombies/_zm_score::player_add_points( "thundergun_fling", points );
  273.         self startragdoll();
  274.         self launchragdoll( fling_vec );
  275.         self.thundergun_death = 1;
  276.     }
  277. }
  278.  
  279. zombie_knockdown( player, gib )
  280. {
  281.     if ( gib && !self.gibbed )
  282.     {
  283.         self.a.gib_ref = random( level.thundergun_gib_refs );
  284.         self thread maps/mp/animscripts/zm_death::do_gib();
  285.     }
  286.     damage = level.zombie_vars[ "thundergun_knockdown_damage" ];
  287.     if ( isDefined( level.override_thundergun_damage_func ) )
  288.     {
  289.         self [[ level.override_thundergun_damage_func ]]( player, gib );
  290.     }
  291.     else
  292.     {
  293.         self.thundergun_handle_pain_notetracks = ::handle_thundergun_pain_notetracks;
  294.         self dodamage( damage, player.origin, player );
  295.     }
  296. }
  297.  
  298. thundergun_knockdown_zombie( player, gib )
  299. {
  300.     self endon( "death" );
  301.     playsoundatposition( "vox_thundergun_forcehit", self.origin );
  302.     playsoundatposition( "wpn_thundergun_proj_impact", self.origin );
  303.     if ( !isDefined( self ) || !isalive( self ) )
  304.     {
  305.         return;
  306.     }
  307.     if ( isDefined( self.thundergun_knockdown_func ) )
  308.     {
  309.         self [[ self.thundergun_knockdown_func ]]( player, gib );
  310.     }
  311.     else
  312.     {
  313.         self dodamage( level.zombie_vars[ "thundergun_knockdown_damage" ], player.origin, player );
  314.     }
  315.     if ( gib )
  316.     {
  317.         self.a.gib_ref = random( level.thundergun_gib_refs );
  318.         self thread maps/mp/animscripts/zm_death::do_gib();
  319.     }
  320.     self.thundergun_handle_pain_notetracks = ::handle_thundergun_pain_notetracks;
  321.     self dodamage( level.zombie_vars[ "thundergun_knockdown_damage" ], player.origin, player );
  322.     self playsound( "fly_thundergun_forcehit" );
  323. }
  324.  
  325. handle_thundergun_pain_notetracks( note )
  326. {
  327.     if ( note == "zombie_knockdown_ground_impact" )
  328.     {
  329.         playfx( level._effect[ "thundergun_knockdown_ground" ], self.origin, anglesToForward( self.angles ), anglesToUp( self.angles ) );
  330.         self playsound( "fly_thundergun_forcehit" );
  331.     }
  332. }
  333.  
  334. is_thundergun_damage()
  335. {
  336.     if ( isDefined( self.damageweapon ) && self.damageweapon != "thundergun_zm" && self.damageweapon == "thundergun_upgraded_zm" )
  337.     {
  338.         if ( self.damagemod != "MOD_GRENADE" )
  339.         {
  340.             return self.damagemod != "MOD_GRENADE_SPLASH";
  341.         }
  342.     }
  343. }
  344.  
  345. enemy_killed_by_thundergun()
  346. {
  347.     if ( isDefined( self.thundergun_death ) )
  348.     {
  349.         return self.thundergun_death == 1;
  350.     }
  351. }
  352.  
  353. thundergun_sound_thread()
  354. {
  355.     self endon( "disconnect" );
  356.     self waittill( "spawned_player" );
  357.     for ( ;; )
  358.     {
  359.         result = self waittill_any_return( "grenade_fire", "death", "player_downed", "weapon_change", "grenade_pullback" );
  360.         if ( !isDefined( result ) )
  361.         {
  362.             continue;
  363.         }
  364.         else if ( result != "weapon_change" && result == "grenade_fire" && self getcurrentweapon() == "thundergun_zm" )
  365.         {
  366.             self playloopsound( "tesla_idle", 0,25 );
  367.             continue;
  368.         }
  369.         else
  370.         {
  371.             self notify( "weap_away" );
  372.             self stoploopsound( 0,25 );
  373.         }
  374.     }
  375. }
  376.  
  377. setup_thundergun_vox( player, fling, gib, knockdown )
  378. {
  379.     if ( !isDefined( self ) || !isalive( self ) )
  380.     {
  381.         return;
  382.     }
  383.     if ( !fling || gib && knockdown )
  384.     {
  385.         if ( randomintrange( 1, 100 ) <= 25 )
  386.         {
  387.         }
  388.     }
  389.     if ( fling )
  390.     {
  391.         if ( randomintrange( 1, 100 ) <= 30 )
  392.         {
  393.             player maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "thundergun" );
  394.         }
  395.     }
  396. }
Advertisement
Add Comment
Please, Sign In to add comment