boiii-scripts/mp/_behavior_tracker.gsc
2023-04-13 17:30:38 +02:00

279 lines
7.1 KiB
Plaintext

#using scripts\shared\math_shared;
#namespace behaviorTracker;
/////////////////////////////////////////////////////
///// Inititialize & Finaliize ////
/////////////////////////////////////////////////////
function SetupTraits()
{
if ( isDefined( self.behaviorTracker.traits ) )
return;
self.behaviorTracker.traits = [];
// Define the traits with a default value. This default value will be used if we dont have stats.
// Add the information to the BBPrint()
self.behaviorTracker.traits["effectiveCombat"] = 0.5;
self.behaviorTracker.traits["effectiveWallRunCombat"] = 0.5;
self.behaviorTracker.traits["effectiveDoubleJumpCombat"] = 0.5;
self.behaviorTracker.traits["effectiveSlideCombat"] = 0.5;
if ( self.behaviorTracker.version != 0 )
{
traits = getArrayKeys( self.behaviorTracker.traits );
for ( i = 0; i < traits.size; i++ )
{
trait = traits[i];
self.behaviorTracker.traits[trait] = float( self GetTraitStatValue( trait ) );
}
}
}
function Initialize()
{
if ( isdefined( self.pers["isBot"] ) )
return;
if ( isDefined( self.behaviorTracker ) )
return;
if ( isdefined( level.disableBehaviorTracker ) && level.disableBehaviorTracker == true )
return;
self.behaviorTracker = spawnstruct();
self.behaviorTracker.version = int( self GetTraitStatValue( "version" ) );
self.behaviorTracker.numRecords = int( self GetTraitStatValue( "numRecords" ) ) + 1;
self SetupTraits();
self.behaviorTracker.valid = true;
}
function Finalize()
{
if ( !( self IsAllowed() ) )
return;
self SetTraitStats();
self PrintTrackerToBlackBox();
}
/////////////////////////////////////////////////////
///// Utility Functions ////
/////////////////////////////////////////////////////
function IsAllowed()
{
if ( !isDefined( self ) )
return false;
if ( !isDefined( self.behaviorTracker ) )
return false;
if ( !self.behaviorTracker.valid )
return false;
if ( isdefined( level.disableBehaviorTracker ) && level.disableBehaviorTracker == true )
return false;
return true;
}
function PrintTrackerToBlackBox()
{
// Prepare the list of traits & its values
// TODO: Construct the string with all the traits so that it can just be added as a single variable in the print.
/*traitsStr = "";
traits = getArrayKeys( self.behaviorTracker.traits );
for ( i = 0; i < traits.size; i++ )
{
trait = traits[i];
value = self.behaviorTracker.traits[trait];
traitsStr = traitsStr + trait + " " + value + " ";
}
bbPrint( "mpbehaviortracker", "username %s version %d numRecords %d %s", self.name, self.behaviorTracker.version, self.behaviorTracker.numRecords, traitsStr ); */
bbPrint( "mpbehaviortracker", "username %s version %d numRecords %d effectiveSlideCombat %f effectiveDoubleJumpCombat %f effectiveWallRunCombat %f effectiveCombat %f",
self.name, self.behaviorTracker.version, self.behaviorTracker.numRecords, self.behaviorTracker.traits["effectiveSlideCombat"],
self.behaviorTracker.traits["effectiveDoubleJumpCombat"], self.behaviorTracker.traits["effectiveWallRunCombat"], self.behaviorTracker.traits["effectiveCombat"] );
}
/////////////////////////////////////////////////////
///// Set, Get & Update Trait ////
/////////////////////////////////////////////////////
function GetTraitValue( trait )
{
return self.behaviorTracker.traits[ trait ];
}
function SetTraitValue( trait, value )
{
self.behaviorTracker.traits[trait] = value;
}
function UpdateTrait( trait, percent )
{
if ( !( self IsAllowed() ) )
return;
math::clamp( percent, -1.0, 1.0 );
currentValue = self GetTraitValue( trait );
if ( percent >= 0 )
{
delta = ( 1.0 - currentValue ) * percent;
}
else
{
delta = ( currentValue - 0.0 ) * percent;
}
weightedDelta = 0.1 * delta;
newValue = currentvalue + weightedDelta;
newValue = math::clamp( newValue, 0.0, 1.0 );
self SetTraitValue( trait, newValue );
bbprint( "mpbehaviortraitupdate", "username %s trait %s percent %f", self.name, trait, percent );
}
/////////////////////////////////////////////////////
///// Game Side Hooks ////
/////////////////////////////////////////////////////
function UpdatePlayerDamage( attacker, victim, damage )
{
if ( isDefined( victim ) && victim IsAllowed() )
{
damageRatio = float( damage ) / float( victim.maxhealth );
math::clamp( damageRatio, 0.0, 1.0 );
damageRatio = damageRatio * -1.0; // Negative damage percent since this is the victim
victim UpdateTrait( "effectiveCombat", damageRatio );
if ( victim IsWallRunning() )
{
victim UpdateTrait( "effectiveWallRunCombat", damageRatio );
}
if ( victim IsSliding() )
{
victim UpdateTrait( "effectiveSlideCombat", damageRatio );
}
if ( victim IsDoubleJumping() )
{
victim UpdateTrait( "effectiveDoubleJumpCombat", damageRatio );
}
}
if ( isDefined( attacker ) && ( attacker IsAllowed() ) && attacker != victim )
{
damageRatio = float( damage ) / float( attacker.maxhealth );
math::clamp( damageRatio, 0.0, 1.0 );
attacker UpdateTrait( "effectiveCombat", damageRatio );
if ( attacker IsWallRunning() )
{
attacker UpdateTrait( "effectiveWallRunCombat", damageRatio );
}
if ( attacker IsSliding() )
{
attacker UpdateTrait( "effectiveSlideCombat", damageRatio );
}
if ( attacker IsDoubleJumping() )
{
attacker UpdateTrait( "effectiveDoubleJumpCombat", damageRatio );
}
}
}
function UpdatePlayerKilled( attacker, victim )
{
if ( isDefined( victim ) && victim IsAllowed() )
{
// Passing -1.0 since to denote negative 100%.
victim UpdateTrait( "effectiveCombat", -1.0 );
if ( victim IsWallRunning() )
{
victim UpdateTrait( "effectiveWallRunCombat", -1.0 );
}
if ( victim IsSliding() )
{
victim UpdateTrait( "effectiveSlideCombat", -1.0 );
}
if ( victim IsDoubleJumping() )
{
victim UpdateTrait( "effectiveDoubleJumpCombat", -1.0 );
}
}
if ( isDefined( attacker ) && ( attacker IsAllowed() ) && attacker != victim )
{
// Passing 1.0 since to denote positive 100%.
attacker UpdateTrait( "effectiveCombat", 1.0 );
if ( attacker IsWallRunning() )
{
attacker UpdateTrait( "effectiveWallRunCombat", 1.0 );
}
if ( attacker IsSliding() )
{
attacker UpdateTrait( "effectiveSlideCombat", 1.0 );
}
if ( attacker IsDoubleJumping() )
{
attacker UpdateTrait( "effectiveDoubleJumpCombat", 1.0 );
}
}
}
/////////////////////////////////////////////////////
///// Stats Related ////
/////////////////////////////////////////////////////
function SetTraitStats()
{
if ( self.behaviorTracker.version == 0 )
return;
self.behaviorTracker.numRecords = self.behaviorTracker.numRecords + 1;
self SetTraitStatValue( "numRecords", self.behaviorTracker.numRecords );
traits = getArrayKeys( self.behaviorTracker.traits );
for ( i = 0; i < traits.size; i++ )
{
trait = traits[i];
value = self.behaviorTracker.traits[trait];
self SetTraitStatValue( trait, value );
}
}
function GetTraitStatValue( trait )
{
return self getDStat( "behaviorTracker", trait );
}
function SetTraitStatValue( trait, value )
{
self setDStat( "behaviorTracker", trait, value );
}