305 lines
13 KiB
Plaintext
305 lines
13 KiB
Plaintext
#using scripts\codescripts\struct;
|
|
#using scripts\shared\callbacks_shared;
|
|
#using scripts\shared\flagsys_shared;
|
|
#using scripts\shared\hud_util_shared;
|
|
#using scripts\shared\system_shared;
|
|
#using scripts\shared\abilities\_ability_gadgets;
|
|
#using scripts\shared\abilities\_ability_player;
|
|
#using scripts\shared\abilities\_ability_util;
|
|
|
|
|
|
|
|
|
|
#namespace ability_power;
|
|
|
|
function autoexec __init__sytem__() { system::register("ability_power",&__init__,undefined,undefined); }
|
|
|
|
function __init__()
|
|
{
|
|
callback::on_connect( &on_player_connect );
|
|
}
|
|
|
|
/#
|
|
function cpower_print( slot, str )
|
|
{
|
|
color = "^2";
|
|
|
|
toprint = color + "GADGET POWER: ^7" + str;
|
|
|
|
weaponName = "null";
|
|
|
|
if ( IsDefined( self._gadgets_player[slot] ) )
|
|
{
|
|
weaponName = self._gadgets_player[slot].name;
|
|
}
|
|
|
|
if ( GetDvarInt( "scr_cpower_debug_prints" ) > 0 )
|
|
self IPrintlnBold( toprint );
|
|
else
|
|
PrintLn( self.playername + ": " + weaponName + ": " + toprint );
|
|
}
|
|
#/
|
|
|
|
//---------------------------------------------------------
|
|
// power and gadget activation
|
|
|
|
function on_player_connect()
|
|
{
|
|
}
|
|
|
|
function power_is_hero_ability( gadget )
|
|
{
|
|
return gadget.gadget_type != 0;
|
|
}
|
|
|
|
function is_weapon_or_variant_same_as_gadget( weapon, gadget )
|
|
{
|
|
if ( weapon == gadget )
|
|
{
|
|
return true;
|
|
}
|
|
|
|
if ( isdefined( level.weaponLightningGun ) && gadget == level.weaponLightningGun )
|
|
{
|
|
if ( isdefined( level.weaponLightningGunArc ) && weapon == level.weaponLightningGunArc )
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function power_gain_event_score( eAttacker, score, weapon, hero_restricted )
|
|
{
|
|
if( score > 0 )
|
|
{
|
|
for ( slot = 0; slot < 3; slot++ )
|
|
{
|
|
gadget = self._gadgets_player[slot];
|
|
|
|
if ( isdefined( gadget ) )
|
|
{
|
|
ignoreSelf = gadget.gadget_powerGainScoreIgnoreSelf;
|
|
|
|
if ( isdefined( weapon ) && ignoreSelf && is_weapon_or_variant_same_as_gadget( weapon, gadget ) )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
ignoreWhenActive = gadget.gadget_powerGainScoreIgnoreWhenActive;
|
|
|
|
if ( ignoreWhenActive && self GadgetIsActive( slot ) )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ( isdefined( hero_restricted ) && hero_restricted && power_is_hero_ability( gadget ) )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
scoreFactor = gadget.gadget_powerGainScoreFactor;
|
|
if ( isdefined( self.gadgetThiefActive ) && self.gadgetThiefActive == true )
|
|
{
|
|
continue; // handled exclusively by gadget_thief
|
|
}
|
|
|
|
gametypeFactor = GetGametypeSetting( "scoreHeroPowerGainFactor" );
|
|
|
|
perkFactor = 1.0;
|
|
if ( self hasperk( "specialty_overcharge" ) )
|
|
{
|
|
perkFactor = GetDvarFloat( "gadgetPowerOverchargePerkScoreFactor" );
|
|
}
|
|
|
|
if ( scoreFactor > 0 && gametypeFactor > 0 )
|
|
{
|
|
gainToAdd = score * scoreFactor * gametypeFactor * perkFactor;
|
|
self power_gain_event( slot, eAttacker, gainToAdd, "score" );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function power_gain_event_damage_actor( eAttacker )
|
|
{
|
|
baseGain = 0.0;
|
|
|
|
if( baseGain > 0 )
|
|
{
|
|
for ( slot = 0; slot < 3; slot++ )
|
|
{
|
|
if ( IsDefined( self._gadgets_player[slot] ) )
|
|
{
|
|
self power_gain_event( slot, eAttacker, baseGain, "damaged actor" );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function power_gain_event_killed_actor( eAttacker, meansOfDeath )
|
|
{
|
|
baseGain = 5.0;
|
|
|
|
for ( slot = 0; slot < 3; slot++ )
|
|
{
|
|
if ( IsDefined( self._gadgets_player[slot] ) )
|
|
{
|
|
if ( meansOfDeath == "MOD_MELEE_ASSASSINATE" && self ability_util::gadget_is_camo_suit_on() )
|
|
{
|
|
if ( self._gadgets_player[slot].gadget_powertakedowngain > 0 )
|
|
{
|
|
source = "assassinate actor";
|
|
self power_gain_event( slot, eAttacker, self._gadgets_player[slot].gadget_powertakedowngain, source );
|
|
}
|
|
}
|
|
|
|
if ( self._gadgets_player[slot].gadget_powerreplenishfactor > 0 )
|
|
{
|
|
gainToAdd = baseGain * self._gadgets_player[slot].gadget_powerreplenishfactor;
|
|
if ( gainToAdd > 0 )
|
|
{
|
|
source = "killed actor";
|
|
self power_gain_event( slot, eAttacker, gainToAdd, source );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function power_gain_event( slot, eAttacker, val, source )
|
|
{
|
|
if ( !isdefined( self ) || !isalive( self ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
powerToAdd = val;
|
|
|
|
if ( powerToAdd > 0.1 || powerToAdd < -0.1 )
|
|
{
|
|
powerLeft = self GadgetPowerChange( slot, powerToAdd );
|
|
/#
|
|
self cpower_print( slot, "^2gain^3 " + powerToAdd + "^7 from ^3" + source + "^7, remaining " + powerLeft );
|
|
#/
|
|
}
|
|
}
|
|
|
|
function power_loss_event_took_damage( eAttacker, eInflictor, weapon, sMeansOfDeath, iDamage )
|
|
{
|
|
baseLoss = iDamage;
|
|
|
|
for ( slot = 0; slot < 3; slot++ )
|
|
{
|
|
if ( IsDefined( self._gadgets_player[slot] ) )
|
|
{
|
|
if ( self GadgetIsActive( slot ) )
|
|
{
|
|
powerLoss = baseLoss * self._gadgets_player[slot].gadget_powerOnLossOnDamage;
|
|
if ( powerLoss > 0 )
|
|
{
|
|
self power_loss_event( slot, eAttacker, powerLoss, "took damage with power on" );
|
|
}
|
|
|
|
if ( self._gadgets_player[slot].gadget_flickerOnDamage > 0 )
|
|
{
|
|
self ability_gadgets::SetFlickering( slot, self._gadgets_player[slot].gadget_flickerOnDamage );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
powerLoss = baseLoss * self._gadgets_player[slot].gadget_powerOffLossOnDamage;
|
|
if ( powerLoss > 0 )
|
|
{
|
|
self power_loss_event( slot, eAttacker, powerLoss, "took damage" );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function power_loss_event( slot, eAttacker, val, source )
|
|
{
|
|
powerToRemove = -val;
|
|
|
|
if ( powerToRemove > 0.1 || powerToRemove < -0.1 )
|
|
{
|
|
powerLeft = self GadgetPowerChange( slot, powerToRemove );
|
|
/#
|
|
self cpower_print( slot, "^1loss^3 " + powerToRemove + "^7 from ^3" + source + "^7, remaining " + powerLeft );
|
|
#/
|
|
}
|
|
}
|
|
|
|
function power_drain_completely( slot )
|
|
{
|
|
powerLeft = self GadgetPowerChange( slot, 0 );
|
|
powerLeft = self GadgetPowerChange( slot, -powerLeft );
|
|
}
|
|
|
|
function IsMovingPowerloss()
|
|
{
|
|
velocity = self GetVelocity();
|
|
speedsq = lengthsquared( velocity );
|
|
|
|
return speedsq > self._gadgets_player.gadget_powermovespeed * self._gadgets_player.gadget_powermovespeed;
|
|
}
|
|
|
|
function power_consume_timer_think( slot, weapon )
|
|
{
|
|
self endon( "disconnect" );
|
|
self endon( "death" );
|
|
|
|
time = GetTime();
|
|
|
|
while ( 1 )
|
|
{
|
|
wait( 0.1 );
|
|
|
|
if ( !IsDefined( self._gadgets_player[slot] ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( !self GadgetIsActive( slot ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
currentTime = GetTime();
|
|
interval = currentTime - time;
|
|
time = currentTime;
|
|
powerConsumpted = 0;
|
|
|
|
//sprint
|
|
if( self IsOnGround() )
|
|
{
|
|
if ( self._gadgets_player[slot].gadget_powersprintloss > 0 && self IsSprinting() )
|
|
{
|
|
powerConsumpted += 1.0 * interval / 1000 * self._gadgets_player[slot].gadget_powersprintloss;
|
|
}
|
|
//move
|
|
else if ( self._gadgets_player[slot].gadget_powermoveloss && self IsMovingPowerloss() )
|
|
{
|
|
powerConsumpted += 1.0 * interval / 1000 * self._gadgets_player[slot].gadget_powermoveloss;
|
|
}
|
|
}
|
|
|
|
//--jump
|
|
//--juke
|
|
//--melee
|
|
//--attack
|
|
|
|
if ( powerConsumpted > 0.1 )
|
|
{
|
|
self power_loss_event( slot, self, powerConsumpted, "consume" );
|
|
if ( self._gadgets_player[slot].gadget_flickerOnPowerloss > 0 )
|
|
{
|
|
self ability_gadgets::SetFlickering( slot, self._gadgets_player[slot].gadget_flickerOnPowerloss );
|
|
}
|
|
}
|
|
}
|
|
}
|