1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\flag_shared;
6 #using scripts\shared\flagsys_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
9 #using scripts\shared\weapons\_weaponobjects;
11 #using scripts\shared\abilities\_ability_player;
12 #using scripts\shared\abilities\_ability_power;
13 #using scripts\shared\abilities\_ability_util;
15 #insert scripts\shared\shared.gsh;
16 #insert scripts\shared\version.gsh;
17 #insert scripts\shared\abilities\_ability_util.gsh;
19 #define ARMOR_PROJECTILE_MULTIPLIER GetDvarFloat( "scr_armor_mod_proj_mult", 1 )
20 #define ARMOR_MELEE_MULTIPLIER GetDvarFloat( "scr_armor_mod_melee_mult", 2 )
21 #define ARMOR_EXPLOSIVE_MULTIPLIER GetDvarFloat( "scr_armor_mod_expl_mult", 1 )
22 #define ARMOR_BULLET_MULTIPLIER GetDvarFloat( "scr_armor_mod_bullet_mult", .7 )
23 #define ARMOR_MISC_MULTIPLIER GetDvarFloat( "scr_armor_mod_misc_mult", 1 )
24 #define ARMOR_VIEW_KICK_MULTIPLIER GetDvarFloat( "scr_armor_mod_view_kick_mult", .001 )
47 return self GadgetIsActive( slot );
53 return self GadgetFlickering( slot );
68 self._gadget_armor_slot = slot;
69 self._gadget_armor_weapon = weapon;
93 self.shock_onpain = 0;
96 self.gadgetHitPoints = ( ( IsDefined( weapon.gadget_max_hitpoints ) && weapon.gadget_max_hitpoints > 0 ) ? weapon.gadget_max_hitpoints : undefined );
98 if ( isdefined(
self.overridePlayerDamage ) )
100 self.originalOverridePlayerDamage =
self.overridePlayerDamage;
112 self notify(
"gadget_armor_off" );
118 self.shock_onpain = 1;
120 if ( isdefined(
self.originalOverridePlayerDamage ) )
122 self.overridePlayerDamage =
self.originalOverridePlayerDamage;
123 self.originalOverridePlayerDamage = undefined;
126 if ( armorOn && IsAlive(
self ) && isdefined( level.playGadgetSuccess ) )
128 self [[ level.playGadgetSuccess ]]( weapon );
134 self endon(
"disconnect" );
141 eventTime =
self._gadgets_player[slot].gadget_flickertime;
147 if ( !
self GadgetFlickering( slot ) )
161 if ( IsDefined( time ) )
163 timeStr =
"^3" +
", time: " + time;
166 if ( GetDvarInt(
"scr_cpower_debug_prints" ) > 0 )
167 self IPrintlnBold(
"Gadget Armor: " + status + timeStr );
172 switch(sMeansOfDeath)
178 case "MOD_HIT_BY_OBJECT":
183 case "MOD_PROJECTILE":
187 case "MOD_MELEE_WEAPON_BUTT":
191 case "MOD_EXPLOSIVE":
192 case "MOD_PROJECTILE_SPLASH":
194 case "MOD_GRENADE_SPLASH":
198 case "MOD_PISTOL_BULLET":
199 case "MOD_RIFLE_BULLET":
206 case "MOD_TRIGGER_HURT":
214 switch( weapon.name )
216 case "hero_lightninggun":
217 case "hero_lightninggun_arc":
224 switch(sMeansOfDeath)
230 case "MOD_HIT_BY_OBJECT":
233 case "MOD_MELEE_WEAPON_BUTT":
234 case "MOD_EXPLOSIVE":
235 case "MOD_PROJECTILE_SPLASH":
237 case "MOD_GRENADE_SPLASH":
240 case "MOD_TRIGGER_HURT":
243 case "MOD_PISTOL_BULLET":
244 case "MOD_RIFLE_BULLET":
247 case "MOD_PROJECTILE":
249 if (weapon.explosionradius == 0 )
274 if( isDefined( sHitLoc ) && ( sHitLoc ==
"head" || sHitLoc ==
"helmet" ) )
282 function armor_player_damage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime )
285 self.power_armor_took_damage =
false;
286 if ( (
self armor_should_take_damage( eAttacker, weapon, sMeansOfDeath, sHitLoc ) ) && isdefined(
self._gadget_armor_slot ) )
295 if ( armor_damage > 0 )
297 if( IsDefined(
self.gadgetHitPoints ) )
299 hitPointsLeft =
self.gadgetHitPoints;
303 hitPointsLeft =
self GadgetPowerChange(
self._gadget_armor_slot, 0.0 );
306 if ( weapon == level.weaponLightningGun || weapon == level.weaponLightningGunArc )
309 armor_damage = hitPointsLeft;
311 else if ( hitPointsLeft < armor_damage )
314 damage = armor_damage - hitPointsLeft;
317 if( IsDefined(
self.gadgetHitPoints ) )
325 self.power_armor_took_damage =
true;
326 self.power_armor_last_took_damage_time = GetTime();
347 self.gadgetHitPoints -= val;
353 self endon(
"disconnect" );
355 maxHitPoints = ( ( IsDefined( weapon.gadget_max_hitpoints ) && weapon.gadget_max_hitpoints > 0 ) ? weapon.gadget_max_hitpoints : 100 );
359 if( IsDefined(
self.gadgetHitPoints ) &&
self.gadgetHitPoints <= 0 )
361 self playsoundtoplayer(
"wpn_power_armor_destroyed_plr",
self );
362 self playsoundtoallbutplayer(
"wpn_power_armor_destroyed_npc",
self );
364 self GadgetDeactivate( slot, weapon );
365 self GadgetPowerSet( slot, 0.0 );
368 if( IsDefined(
self.gadgetHitPoints ) )
370 hitPointsRatio =
self.gadgetHitPoints / maxHitPoints;
374 hitPointsRatio =
self GadgetPowerChange(
self._gadget_armor_slot, 0.0 ) / maxHitPoints;