1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\laststand_shared;
6 #using scripts\shared\math_shared;
7 #using scripts\shared\util_shared;
8 #using scripts\shared\system_shared;
10 #insert scripts\shared\shared.gsh;
12 #using scripts\shared\abilities\_ability_player;
13 #using scripts\shared\abilities\_ability_util;
15 #insert scripts\shared\abilities\_ability_util.gsh;
17 #using scripts\zm\_zm_audio;
18 #using scripts\zm\_zm_equipment;
19 #using scripts\zm\_zm_laststand;
20 #using scripts\zm\_zm_pers_upgrades_functions;
21 #using scripts\zm\_zm_score;
22 #using scripts\zm\_zm_utility;
23 #using scripts\zm\_zm_weapons;
25 #insert scripts\zm\_zm_utility.gsh;
27 #namespace zm_hero_weapon;
33 #define HERO_STATE_HIDDEN 0
34 #define HERO_STATE_CHARGING 1
35 #define HERO_STATE_READY 2
36 #define HERO_STATE_INUSE 3
37 #define HERO_STATE_UNAVAILABLE 4
41 #define HERO_MINPOWER 0
42 #define HERO_MAXPOWER 100
44 #define HERO_CLIENTFIELD_POWER "zmhud.swordEnergy"
45 #define HERO_CLIENTFIELD_POWER_FLASH "zmhud.swordChargeUpdate"
46 #define HERO_CLIENTFIELD_STATE "zmhud.swordState"
48 #precache( "string", "ZOMBIE_HERO_WEAPON_HINT" );
76 if ( isdefined(
self) )
78 w_current =
self GetCurrentWeapon();
82 self.hero_power =
self GadgetPowerGet( 0 );
83 if (
self.hero_power <= 0 )
86 self.i_tried_to_glitch_the_hero_weapon = 1;
97 weaponNone = GetWeapon(
"none" );
99 weapon = GetWeapon( weapon_name );
101 if ( weapon != weaponNone )
103 hero_weapon = SpawnStruct();
104 hero_weapon.weapon = weapon;
112 DEFAULT( level._hero_weapons, [] );
113 level._hero_weapons[weapon] = hero_weapon;
120 weaponNone = GetWeapon(
"none" );
121 weapon = GetWeapon( weapon_name );
122 if ( weapon != weaponNone && IsDefined(level._hero_weapons[weapon]) )
124 level._hero_weapons[weapon].give_fn = give_fn;
125 level._hero_weapons[weapon].take_fn = take_fn;
131 power =
self GadgetPowerGet( 0 );
149 weaponNone = GetWeapon(
"none" );
150 weapon = GetWeapon( weapon_name );
151 if ( weapon != weaponNone && IsDefined(level._hero_weapons[weapon]) )
153 level._hero_weapons[weapon].wield_fn = wield_fn;
154 level._hero_weapons[weapon].unwield_fn = unwield_fn;
170 weaponNone = GetWeapon(
"none" );
171 weapon = GetWeapon( weapon_name );
172 if ( weapon != weaponNone && IsDefined(level._hero_weapons[weapon]) )
174 level._hero_weapons[weapon].power_full_fn = power_full_fn;
175 level._hero_weapons[weapon].power_empty_fn = power_empty_fn;
192 self.hero_weapon_state = state;
206 self notify(
"watch_hero_weapon_give");
207 self endon(
"watch_hero_weapon_give");
208 self endon(
"disconnect" );
212 self waittill(
"weapon_give", w_weapon );
216 self [[level._hero_weapons[w_weapon].give_fn]]( w_weapon );
223 self notify(
"watch_hero_weapon_take");
224 self endon(
"watch_hero_weapon_take");
225 self endon(
"disconnect" );
229 self waittill(
"weapon_take", w_weapon );
232 self [[level._hero_weapons[w_weapon].take_fn]]( w_weapon );
233 self notify(
"stop_watch_hero_power");
240 self notify(
"watch_hero_weapon_change");
241 self endon(
"watch_hero_weapon_change");
242 self endon(
"disconnect" );
246 self waittill(
"weapon_change", w_current, w_previous );
247 if (
self.sessionstate !=
"spectator" )
251 self [[level._hero_weapons[w_previous].unwield_fn]]( w_previous );
253 if(
self GadgetPowerGet( 0 ) == 100 )
255 if(
self HasWeapon( w_previous ) )
257 self SetWeaponAmmoClip( w_previous, w_previous.clipSize );
258 self [[level._hero_weapons[w_previous].power_full_fn]]( w_previous );
264 self [[level._hero_weapons[w_current].wield_fn]]( w_current );
273 self notify(
"watch_hero_power");
274 self endon(
"watch_hero_power");
275 self endon(
"stop_watch_hero_power");
276 self endon(
"disconnect" );
278 DEFAULT(
self.hero_power_prev, -1 );
282 self.hero_power =
self GadgetPowerGet( 0 );
284 if (
self.hero_power !=
self.hero_power_prev )
286 self.hero_power_prev =
self.hero_power;
289 self [[level._hero_weapons[w_weapon].power_full_fn]]( w_weapon );
293 self [[level._hero_weapons[w_weapon].power_empty_fn]]( w_weapon );
304 self endon(
"stop_draining_hero_weapon" );
307 while ( isdefined(
self ) )
311 if ( isdefined(w_weapon.gadget_power_usage_rate) )
312 n_rate = w_weapon.gadget_power_usage_rate;
316 if (
self.hero_power !=
self.hero_power_prev )
318 self GadgetPowerSet( 0,
self.hero_power );
330 if ( !isdefined( level.a_func_hero_power_update ) )
332 level.a_func_hero_power_update = [];
335 if ( !isdefined( level.a_func_hero_power_update[ w_hero ] ) )
337 level.a_func_hero_power_update[ w_hero ] = func;
344 w_hero = e_player.current_hero_weapon;
346 if( isdefined( level.a_func_hero_power_update ) && isdefined( level.a_func_hero_power_update[ w_hero ] ) )
348 level [[ level.a_func_hero_power_update[ w_hero ] ]]( e_player, ai_enemy );
366 if( isdefined(
self ) )
369 if( isdefined( ai_enemy.heroweapon_kill_power ) )
372 if (
self hasperk(
"specialty_overcharge" ) )
374 perkFactor = GetDvarFloat(
"gadgetPowerOverchargePerkScoreFactor" );
376 if (
IS_TRUE(
self.i_tried_to_glitch_the_hero_weapon ) )
381 self.hero_power =
self.hero_power + perkFactor * ( ai_enemy.heroweapon_kill_power );
383 if (
self.hero_power !=
self.hero_power_prev )
385 self GadgetPowerSet( 0,
self.hero_power );
395 if( isdefined(
self.current_hero_weapon ) )
397 self notify(
"weapon_take",
self.current_hero_weapon );
398 self GadgetPowerSet( 0, 0 );