1 #using scripts\codescripts\struct; 
    3 #using scripts\shared\array_shared; 
    4 #using scripts\shared\clientfield_shared; 
    5 #using scripts\shared\math_shared; 
    6 #using scripts\shared\system_shared; 
    7 #using scripts\shared\util_shared; 
    8 #using scripts\shared\visionset_mgr_shared; 
   10 #insert scripts\shared\shared.gsh; 
   11 #insert scripts\shared\version.gsh; 
   13 #using scripts\shared\ai\zombie_utility; 
   15 #using scripts\zm\_util; 
   16 #using scripts\zm\_zm; 
   17 #using scripts\zm\_zm_net; 
   18 #using scripts\zm\_zm_perks; 
   19 #using scripts\zm\_zm_pers_upgrades; 
   20 #using scripts\zm\_zm_pers_upgrades_functions; 
   21 #using scripts\zm\_zm_pers_upgrades_system; 
   22 #using scripts\zm\_zm_score; 
   23 #using scripts\zm\_zm_stats; 
   24 #using scripts\zm\_zm_utility; 
   26 #insert scripts\zm\_zm_perks.gsh; 
   27 #insert scripts\zm\_zm_utility.gsh; 
   30 #define ELECTRIC_CHERRY_PERK_COST                       10 
   31 #define ELECTRIC_CHERRY_PERK_BOTTLE_WEAPON              "zombie_perk_bottle_cherry" 
   32 #define ELECTRIC_CHERRY_SHADER                          "specialty_quickrevive_zombies" 
   33 #define ELECTRIC_CHERRY_MACHINE_DISABLED_MODEL          "p7_zm_vending_nuke" // "p6_zm_vending_electric_cherry_off" 
   34 #define ELECTRIC_CHERRY_MACHINE_ACTIVE_MODEL            "p7_zm_vending_nuke" // "p6_zm_vending_electric_cherry_on" 
   35 #define ELECTRIC_CHERRY_RADIANT_MACHINE_NAME            "vending_electriccherry" 
   36 #define ELECTRIC_CHERRY_MACHINE_LIGHT_FX                "electric_cherry_light"  
   40 #define ELECTRIC_CHERRY_STUN_CYCLES         4 
   42 #define ELECTRIC_CHERRY_DOWNED_ATTACK_RADIUS 500 
   43 #define ELECTRIC_CHERRY_DOWNED_ATTACK_DAMAGE 1000 
   44 #define ELECTRIC_CHERRY_DOWNED_ATTACK_POINTS 40 
   46 #define RELOAD_ATTACK_MIN_RADIUS 32 
   47 #define RELOAD_ATTACK_MAX_RADIUS 128 
   48 #define RELOAD_ATTACK_MIN_DAMAGE 1 
   49 #define RELOAD_ATTACK_MAX_DAMAGE 1045 // Max damage = zombie health at round 10 
   50 #define RELOAD_ATTACK_POINTS 40 
   51 #define RELOAD_ATTACK_COOLDOWN_TIMER 3 
   53 #precache( "fx", "_t6/misc/fx_zombie_cola_revive_on" ); 
   54 #precache( "fx", "dlc1/castle/fx_castle_electric_cherry_down" ); 
   56 #namespace zm_perk_electric_cherry; 
   81     if( 
IS_TRUE( level.custom_electric_cherry_perk_threads ) )
 
   83         level thread [[ level.custom_electric_cherry_perk_threads ]]();
 
   91     if( IsDefined(level.electric_cherry_precache_override_func) )
 
   93         [[ level.electric_cherry_precache_override_func ]]();
 
  117     use_trigger.script_sound = 
"mus_perks_stamin_jingle";
 
  118     use_trigger.script_string = 
"marathon_perk";
 
  119     use_trigger.script_label = 
"mus_perks_stamin_sting";
 
  120     use_trigger.target = 
"vending_marathon";
 
  121     perk_machine.script_string = 
"marathon_perk";
 
  122     perk_machine.targetname = 
"vending_marathon";
 
  123     if( IsDefined( bump_trigger ) )
 
  125         bump_trigger.script_string = 
"marathon_perk";
 
  134     level._effect[ 
"electric_cherry_explode" ]              = 
"dlc1/castle/fx_castle_electric_cherry_down";
 
  155         machine = getentarray( 
"vendingelectric_cherry", 
"targetname" );
 
  156         machine_triggers = GetEntArray( 
"vending_electriccherry", 
"target" );
 
  159         for( i = 0; i < machine.size; i++ )
 
  167         level waittill( 
"electric_cherry_on" );
 
  169         for( i = 0; i < machine.size; i++ )
 
  172             machine[i] vibrate( ( 0, -100, 0 ), 0.3, 0.4, 3 );
 
  173             machine[i] playsound( 
"zmb_perks_power_on" );
 
  178         level notify( 
"specialty_grenadepulldeath_power_on" );
 
  182         level waittill( 
"electric_cherry_off" );
 
  191     a_electric_cherry_perk_machines = GetEntArray( 
"vending_electriccherry", 
"targetname" );
 
  193     foreach( perk_machine 
in a_electric_cherry_perk_machines )
 
  209     VisionSetLastStand( 
"zombie_last_stand", 1 );
 
  211     if ( IsDefined( 
self ) )
 
  213         PlayFX( level._effect[ 
"electric_cherry_explode" ], 
self.origin );
 
  214         self PlaySound( 
"zmb_cherry_explode" );
 
  215         self notify( 
"electric_cherry_start" );
 
  223         for ( i = 0; i < a_zombies.size; i++ )
 
  225             if ( IsAlive( 
self ) && IsAlive( a_zombies[ i ] ) )
 
  232                     if( IsDefined( 
self.cherry_kills ) )
 
  251         self notify( 
"electric_cherry_end" );
 
  258     self endon( 
"death" );
 
  260     self PlaySound( 
"zmb_elec_jib_zombie" );
 
  262     if ( !
IS_TRUE( 
self.head_gibbed ) )
 
  264         if( IsVehicle( 
self ) )
 
  275         if( IsVehicle( 
self ) )
 
  289     self endon( 
"death" );
 
  291     if( IsVehicle( 
self ) )
 
  300     self PlaySound( 
"zmb_elec_jib_zombie" );
 
  302     self waittill( 
"stun_fx_end" ); 
 
  304     if( IsVehicle( 
self ) )
 
  319     self notify( 
"stun_zombie" );
 
  320     self endon( 
"stun_zombie" );
 
  322     if ( 
self.health <= 0 )
 
  328     if ( 
self.ai_state !== 
"zombie_think" )
 
  334     self.zombie_tesla_hit = 
true;       
 
  335     self.ignoreall = 
true;
 
  339     if( isdefined( 
self ) )
 
  342         self.zombie_tesla_hit = 
false;      
 
  343         self.ignoreall = 
false;
 
  345         self notify( 
"stun_fx_end" );   
 
  355     self endon( 
"death" );
 
  356     self endon( 
"disconnect" );
 
  359     self.wait_on_reload = [];
 
  360     self.consecutive_electric_cherry_attacks = 0;
 
  365         self waittill(
"reload_start");
 
  367         current_weapon = 
self GetCurrentWeapon();
 
  370         if( IsInArray( 
self.wait_on_reload, current_weapon ) )
 
  376         self.wait_on_reload[
self.wait_on_reload.size] = current_weapon;
 
  378         self.consecutive_electric_cherry_attacks++;
 
  385         n_fraction = n_clip_current/n_clip_max;
 
  394         if ( IsDefined( 
self ) )
 
  397             switch( 
self.consecutive_electric_cherry_attacks )
 
  401                 n_zombie_limit = undefined;
 
  423             if( IsDefined(n_zombie_limit) && (n_zombie_limit == 0) )
 
  432             self notify( 
"electric_cherry_start" );
 
  433             self PlaySound( 
"zmb_cherry_explode" );
 
  440             for ( i = 0; i < a_zombies.size; i++ )
 
  442                 if ( IsAlive( 
self ) && IsAlive( a_zombies[ i ] ) )
 
  445                     if( IsDefined( n_zombie_limit ) )
 
  448                         if( n_zombies_hit < n_zombie_limit )
 
  459                     if ( a_zombies[ i ].health <= perk_dmg )
 
  464                         if( IsDefined( 
self.cherry_kills ) )
 
  473                         if( !IsDefined(a_zombies[ i ].is_brutus) )
 
  482                     if( isdefined( a_zombies[ i ] ) && IsAlive( a_zombies[ i ] ) ) 
 
  484                         a_zombies[ i ] DoDamage( perk_dmg, 
self.origin, 
self, 
self, 
"none" );
 
  489             self notify( 
"electric_cherry_end" );   
 
  496     self notify( 
"electric_cherry_cooldown_started" );
 
  497     self endon( 
"electric_cherry_cooldown_started" );
 
  498     self endon( 
"death" );
 
  499     self endon( 
"disconnect" );
 
  504     n_reload_time = 0.25;
 
  505     if( 
self HasPerk( 
"specialty_fastreload" ) )
 
  507         n_reload_time *= GetDvarFloat( 
"perk_weapReloadMultiplier" );
 
  512     wait n_cooldown_time;
 
  514     self.consecutive_electric_cherry_attacks = 0;
 
  519     self endon( 
"death" );
 
  520     self endon( 
"disconnect" );
 
  522     self endon( 
"player_lost_weapon_" + weapon.name );
 
  530         self waittill( 
"reload" );
 
  535         current_weapon = 
self GetCurrentWeapon();
 
  536         if( current_weapon == weapon )
 
  538             ArrayRemoveValue( 
self.wait_on_reload, weapon );
 
  539             self notify( 
"weapon_reload_complete_" + weapon.name );
 
  547     self endon( 
"death" );
 
  548     self endon( 
"disconnect" );
 
  549     self endon( 
"weapon_reload_complete_" + weapon.name );
 
  554         self waittill( 
"weapon_change" );
 
  560         primaryWeapons = 
self GetWeaponsListPrimaries();
 
  561         if( !IsInArray( primaryWeapons, weapon ) )
 
  563             self notify( 
"player_lost_weapon_" + weapon.name );
 
  564             ArrayRemoveValue( 
self.wait_on_reload, weapon );
 
  572     if( n_fraction >= 0.67 )
 
  574         CodeSetClientField( 
self, 
"electric_cherry_reload_fx", 1 ); 
 
  576     else if( (n_fraction >= 0.33) && (n_fraction < 0.67) )
 
  578         CodeSetClientField( 
self, 
"electric_cherry_reload_fx", 2 ); 
 
  582         CodeSetClientField( 
self, 
"electric_cherry_reload_fx", 3 ); 
 
  587     CodeSetClientField( 
self, 
"electric_cherry_reload_fx", 0 );