burc_2004

_zm_perk_electric_cherry.gsc

Oct 21st, 2015
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.63 KB | None | 0 0
  1. #include maps/mp/zombies/_zm_ai_basic;
  2. #include maps/mp/animscripts/shared;
  3. #include maps/mp/zombies/_zm_score;
  4. #include maps/mp/zombies/_zm_perks;
  5. #include maps/mp/zombies/_zm_net;
  6. #include maps/mp/zombies/_zm_utility;
  7. #include common_scripts/utility;
  8. #include maps/mp/_utility;
  9.  
  10. enable_electric_cherry_perk_for_level()
  11. {
  12.     maps/mp/zombies/_zm_perks::register_perk_basic_info( "specialty_grenadepulldeath", "electric_cherry", 2000, &"ZM_PRISON_PERK_CHERRY", "zombie_perk_bottle_cherry" );
  13.     maps/mp/zombies/_zm_perks::register_perk_precache_func( "specialty_grenadepulldeath", ::electic_cherry_precache );
  14.     maps/mp/zombies/_zm_perks::register_perk_clientfields( "specialty_grenadepulldeath", ::electric_cherry_register_clientfield, ::electric_cherry_set_clientfield );
  15.     maps/mp/zombies/_zm_perks::register_perk_threads( "specialty_grenadepulldeath", ::electric_cherry_reload_attack, ::electric_cherry_perk_lost );
  16.     maps/mp/zombies/_zm_perks::register_perk_machine( "specialty_grenadepulldeath", ::electric_cherry_perk_machine_setup, ::electric_cherry_perk_machine_think );
  17.     maps/mp/zombies/_zm_perks::register_perk_host_migration_func( "specialty_grenadepulldeath", ::electric_cherry_host_migration_func );
  18. }
  19.  
  20. init_electric_cherry()
  21. {
  22.     level.custom_laststand_func = ::electric_cherry_laststand;
  23.     set_zombie_var( "tesla_head_gib_chance", 50 );
  24.     registerclientfield( "allplayers", "electric_cherry_reload_fx", 9000, 2, "int" );
  25. }
  26.  
  27. electic_cherry_precache()
  28. {
  29.     precacheitem( "zombie_perk_bottle_cherry" );
  30.     precacheshader( "specialty_fastreload_zombies" );
  31.     precachemodel( "p6_zm_vending_electric_cherry_off" );
  32.     precachemodel( "p6_zm_vending_electric_cherry_on" );
  33.     precachestring( &"ZM_PRISON_PERK_CHERRY" );
  34.     level._effect[ "electriccherry" ] = loadfx( "misc/fx_zombie_cola_on" );
  35.     level._effect[ "electric_cherry_explode" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_down" );
  36.     level._effect[ "electric_cherry_reload_small" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_sm" );
  37.     level._effect[ "electric_cherry_reload_medium" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_player" );
  38.     level._effect[ "electric_cherry_reload_large" ] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_electric_cherry_lg" );
  39.     level._effect[ "tesla_shock" ] = loadfx( "maps/zombie/fx_zombie_tesla_shock" );
  40.     level._effect[ "tesla_shock_secondary" ] = loadfx( "maps/zombie/fx_zombie_tesla_shock_secondary" );
  41. }
  42.  
  43. electric_cherry_register_clientfield()
  44. {
  45.     registerclientfield( "toplayer", "perk_electric_cherry", 9000, 1, "int" );
  46. }
  47.  
  48. electric_cherry_set_clientfield( state )
  49. {
  50.     self setclientfieldtoplayer( "perk_electric_cherry", state );
  51. }
  52.  
  53. electric_cherry_perk_machine_setup( use_trigger, perk_machine, bump_trigger, collision )
  54. {
  55.     use_trigger.script_sound = "mus_perks_cherry_jingle";
  56.     use_trigger.script_string = "electric_cherry_perk";
  57.     use_trigger.script_label = "mus_perks_cherry_sting";
  58.     use_trigger.target = "vending_electriccherry";
  59.     perk_machine.script_string = "electriccherry_perk";
  60.     perk_machine.targetname = "vendingelectric_cherry";
  61.     if ( isDefined( bump_trigger ) )
  62.     {
  63.         bump_trigger.script_string = "electriccherry_perk";
  64.     }
  65. }
  66.  
  67. electric_cherry_perk_machine_think()
  68. {
  69.     init_electric_cherry();
  70.     while ( 1 )
  71.     {
  72.         machine = getentarray( "vendingelectric_cherry", "targetname" );
  73.         machine_triggers = getentarray( "vending_electriccherry", "target" );
  74.         i = 0;
  75.         while ( i < machine.size )
  76.         {
  77.             machine[ i ] setmodel( "p6_zm_vending_electric_cherry_off" );
  78.             i++;
  79.         }
  80.         level thread do_initial_power_off_callback( machine, "electriccherry" );
  81.         array_thread( machine_triggers, ::maps/mp/zombies/_zm_perks::set_power_on, 0 );
  82.         level waittill( "electric_cherry_on" );
  83.         i = 0;
  84.         while ( i < machine.size )
  85.         {
  86.             machine[ i ] setmodel( "p6_zm_vending_electric_cherry_on" );
  87.             machine[ i ] vibrate( vectorScale( ( 0, -1, 0 ), 100 ), 0,3, 0,4, 3 );
  88.             machine[ i ] playsound( "zmb_perks_power_on" );
  89.             machine[ i ] thread perk_fx( "electriccherry" );
  90.             machine[ i ] thread play_loop_on_machine();
  91.             i++;
  92.         }
  93.         level notify( "specialty_grenadepulldeath_power_on" );
  94.         array_thread( machine_triggers, ::maps/mp/zombies/_zm_perks::set_power_on, 1 );
  95.         level waittill( "electric_cherry_off" );
  96.         array_thread( machine, ::maps/mp/zombies/_zm_perks::turn_perk_off );
  97.     }
  98. }
  99.  
  100. electric_cherry_host_migration_func()
  101. {
  102.     a_electric_cherry_perk_machines = getentarray( "vending_electriccherry", "targetname" );
  103.     _a125 = a_electric_cherry_perk_machines;
  104.     _k125 = getFirstArrayKey( _a125 );
  105.     while ( isDefined( _k125 ) )
  106.     {
  107.         perk_machine = _a125[ _k125 ];
  108.         if ( isDefined( perk_machine.model ) && perk_machine.model == "p6_zm_vending_electric_cherry_on" )
  109.         {
  110.             perk_machine perk_fx( undefined, 1 );
  111.             perk_machine thread perk_fx( "electriccherry" );
  112.         }
  113.         _k125 = getNextArrayKey( _a125, _k125 );
  114.     }
  115. }
  116.  
  117. electric_cherry_laststand()
  118. {
  119.     visionsetlaststand( "zombie_last_stand", 1 );
  120.     if ( isDefined( self ) )
  121.     {
  122.         playfx( level._effect[ "electric_cherry_explode" ], self.origin );
  123.         self playsound( "zmb_cherry_explode" );
  124.         self notify( "electric_cherry_start" );
  125.         wait 0,05;
  126.         a_zombies = get_round_enemy_array();
  127.         a_zombies = get_array_of_closest( self.origin, a_zombies, undefined, undefined, 500 );
  128.         i = 0;
  129.         while ( i < a_zombies.size )
  130.         {
  131.             if ( isalive( self ) )
  132.             {
  133.                 if ( a_zombies[ i ].health <= 1000 )
  134.                 {
  135.                     a_zombies[ i ] thread electric_cherry_death_fx();
  136.                     if ( isDefined( self.cherry_kills ) )
  137.                     {
  138.                         self.cherry_kills++;
  139.                     }
  140.                     self maps/mp/zombies/_zm_score::add_to_player_score( 40 );
  141.                 }
  142.                 else
  143.                 {
  144.                     a_zombies[ i ] thread electric_cherry_stun();
  145.                     a_zombies[ i ] thread electric_cherry_shock_fx();
  146.                 }
  147.                 wait 0,1;
  148.                 a_zombies[ i ] dodamage( 1000, self.origin, self, self, "none" );
  149.             }
  150.             i++;
  151.         }
  152.         self notify( "electric_cherry_end" );
  153.     }
  154. }
  155.  
  156. electric_cherry_death_fx()
  157. {
  158.     self endon( "death" );
  159.     tag = "J_SpineUpper";
  160.     fx = "tesla_shock";
  161.     if ( self.isdog )
  162.     {
  163.         tag = "J_Spine1";
  164.     }
  165.     self playsound( "zmb_elec_jib_zombie" );
  166.     network_safe_play_fx_on_tag( "tesla_death_fx", 2, level._effect[ fx ], self, tag );
  167.     if ( isDefined( self.tesla_head_gib_func ) && !self.head_gibbed )
  168.     {
  169.         [[ self.tesla_head_gib_func ]]();
  170.     }
  171. }
  172.  
  173. electric_cherry_shock_fx()
  174. {
  175.     self endon( "death" );
  176.     tag = "J_SpineUpper";
  177.     fx = "tesla_shock_secondary";
  178.     if ( self.isdog )
  179.     {
  180.         tag = "J_Spine1";
  181.     }
  182.     self playsound( "zmb_elec_jib_zombie" );
  183.     network_safe_play_fx_on_tag( "tesla_shock_fx", 2, level._effect[ fx ], self, tag );
  184. }
  185.  
  186. electric_cherry_stun()
  187. {
  188.     self endon( "death" );
  189.     self notify( "stun_zombie" );
  190.     self endon( "stun_zombie" );
  191.     if ( self.health <= 0 )
  192.     {
  193. /#
  194.         iprintln( "trying to stun a dead zombie" );
  195. #/
  196.         return;
  197.     }
  198.     if ( self.ai_state != "find_flesh" )
  199.     {
  200.         return;
  201.     }
  202.     self.forcemovementscriptstate = 1;
  203.     self.ignoreall = 1;
  204.     i = 0;
  205.     while ( i < 2 )
  206.     {
  207.         self animscripted( self.origin, self.angles, "zm_afterlife_stun" );
  208.         self maps/mp/animscripts/shared::donotetracks( "stunned" );
  209.         i++;
  210.     }
  211.     self.forcemovementscriptstate = 0;
  212.     self.ignoreall = 0;
  213.     self setgoalpos( self.origin );
  214.     self thread maps/mp/zombies/_zm_ai_basic::find_flesh();
  215. }
  216.  
  217. electric_cherry_reload_attack()
  218. {
  219.     self endon( "death" );
  220.     self endon( "disconnect" );
  221.     self endon( "stop_electric_cherry_reload_attack" );
  222.     self.wait_on_reload = [];
  223.     self.consecutive_electric_cherry_attacks = 0;
  224.     while ( 1 )
  225.     {
  226.         self waittill( "reload_start" );
  227.         str_current_weapon = self getcurrentweapon();
  228.         while ( isinarray( self.wait_on_reload, str_current_weapon ) )
  229.         {
  230.             continue;
  231.         }
  232.         self.wait_on_reload[ self.wait_on_reload.size ] = str_current_weapon;
  233.         self.consecutive_electric_cherry_attacks++;
  234.         n_clip_current = self getweaponammoclip( str_current_weapon );
  235.         n_clip_max = weaponclipsize( str_current_weapon );
  236.         n_fraction = n_clip_current / n_clip_max;
  237.         perk_radius = linear_map( n_fraction, 1, 0, 32, 128 );
  238.         perk_dmg = linear_map( n_fraction, 1, 0, 1, 1045 );
  239.         self thread check_for_reload_complete( str_current_weapon );
  240.         if ( isDefined( self ) )
  241.         {
  242.             switch( self.consecutive_electric_cherry_attacks )
  243.             {
  244.                 case 0:
  245.                 case 1:
  246.                     n_zombie_limit = undefined;
  247.                     break;
  248.                 case 2:
  249.                     n_zombie_limit = 8;
  250.                     break;
  251.                 case 3:
  252.                     n_zombie_limit = 4;
  253.                     break;
  254.                 case 4:
  255.                     n_zombie_limit = 2;
  256.                     break;
  257.                 default:
  258.                     n_zombie_limit = 0;
  259.             }
  260.             self thread electric_cherry_cooldown_timer( str_current_weapon );
  261.             if ( isDefined( n_zombie_limit ) && n_zombie_limit == 0 )
  262.             {
  263.                 continue;
  264.             }
  265.             self thread electric_cherry_reload_fx( n_fraction );
  266.             self notify( "electric_cherry_start" );
  267.             self playsound( "zmb_cherry_explode" );
  268.             a_zombies = get_round_enemy_array();
  269.             a_zombies = get_array_of_closest( self.origin, a_zombies, undefined, undefined, perk_radius );
  270.             n_zombies_hit = 0;
  271.             i = 0;
  272.             while ( i < a_zombies.size )
  273.             {
  274.                 if ( isalive( self ) )
  275.                 {
  276.                     if ( isDefined( n_zombie_limit ) )
  277.                     {
  278.                         if ( n_zombies_hit < n_zombie_limit )
  279.                         {
  280.                             n_zombies_hit++;
  281.                             break;
  282.                         }
  283.                         else }
  284.                     else if ( a_zombies[ i ].health <= perk_dmg )
  285.                     {
  286.                         a_zombies[ i ] thread electric_cherry_death_fx();
  287.                         if ( isDefined( self.cherry_kills ) )
  288.                         {
  289.                             self.cherry_kills++;
  290.                         }
  291.                         self maps/mp/zombies/_zm_score::add_to_player_score( 40 );
  292.                     }
  293.                     else
  294.                     {
  295.                         if ( !isDefined( a_zombies[ i ].is_brutus ) )
  296.                         {
  297.                             a_zombies[ i ] thread electric_cherry_stun();
  298.                         }
  299.                         a_zombies[ i ] thread electric_cherry_shock_fx();
  300.                     }
  301.                     wait 0,1;
  302.                     a_zombies[ i ] dodamage( perk_dmg, self.origin, self, self, "none" );
  303.                 }
  304.                 i++;
  305.             }
  306.             self notify( "electric_cherry_end" );
  307.         }
  308.     }
  309. }
  310.  
  311. electric_cherry_cooldown_timer( str_current_weapon )
  312. {
  313.     self notify( "electric_cherry_cooldown_started" );
  314.     self endon( "electric_cherry_cooldown_started" );
  315.     self endon( "death" );
  316.     self endon( "disconnect" );
  317.     n_reload_time = weaponreloadtime( str_current_weapon );
  318.     if ( self hasperk( "specialty_fastreload" ) )
  319.     {
  320.         n_reload_time *= getDvarFloat( "perk_weapReloadMultiplier" );
  321.     }
  322.     n_cooldown_time = n_reload_time + 3;
  323.     wait n_cooldown_time;
  324.     self.consecutive_electric_cherry_attacks = 0;
  325. }
  326.  
  327. check_for_reload_complete( weapon )
  328. {
  329.     self endon( "death" );
  330.     self endon( "disconnect" );
  331.     self endon( "player_lost_weapon_" + weapon );
  332.     self thread weapon_replaced_monitor( weapon );
  333.     while ( 1 )
  334.     {
  335.         self waittill( "reload" );
  336.         str_current_weapon = self getcurrentweapon();
  337.         if ( str_current_weapon == weapon )
  338.         {
  339.             arrayremovevalue( self.wait_on_reload, weapon );
  340.             self notify( "weapon_reload_complete_" + weapon );
  341.             return;
  342.         }
  343.         else
  344.         {
  345.         }
  346.     }
  347. }
  348.  
  349. weapon_replaced_monitor( weapon )
  350. {
  351.     self endon( "death" );
  352.     self endon( "disconnect" );
  353.     self endon( "weapon_reload_complete_" + weapon );
  354.     while ( 1 )
  355.     {
  356.         self waittill( "weapon_change" );
  357.         primaryweapons = self getweaponslistprimaries();
  358.         if ( !isinarray( primaryweapons, weapon ) )
  359.         {
  360.             self notify( "player_lost_weapon_" + weapon );
  361.             arrayremovevalue( self.wait_on_reload, weapon );
  362.             return;
  363.         }
  364.         else
  365.         {
  366.         }
  367.     }
  368. }
  369.  
  370. electric_cherry_reload_fx( n_fraction )
  371. {
  372.     if ( n_fraction >= 0,67 )
  373.     {
  374.         self setclientfield( "electric_cherry_reload_fx", 1 );
  375.     }
  376.     else if ( n_fraction >= 0,33 && n_fraction < 0,67 )
  377.     {
  378.         self setclientfield( "electric_cherry_reload_fx", 2 );
  379.     }
  380.     else
  381.     {
  382.         self setclientfield( "electric_cherry_reload_fx", 3 );
  383.     }
  384.     wait 1;
  385.     self setclientfield( "electric_cherry_reload_fx", 0 );
  386. }
  387.  
  388. electric_cherry_perk_lost()
  389. {
  390.     self notify( "stop_electric_cherry_reload_attack" );
  391. }
Advertisement
Add Comment
Please, Sign In to add comment