boiii-scripts/shared/abilities/_ability_power.gsc
2023-04-13 17:30:38 +02:00

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