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 );