279 lines
7.1 KiB
Plaintext
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 );
|
|
} |