Files
ToneAPI_servermod/mod/scripts/vscripts/matchstat.nut
T
2023-08-18 22:26:29 +02:00

93 lines
2.7 KiB
Plaintext

global function matchstat_Init
struct weaponStats {
int shotsFired
int shotsHit
int shotCrit
int shotHeadshot
int shotRichochet
}
struct {
table < entity, table < string, weaponStats > > weaponsUsed
} file
void function matchstat_Init(){
// AddCallback_OnPlayerRespawned( TrackWeapons )
WeaponFireCallbacks_AddCallbackOnOwnerClassFired("player", OnWeaponFired)
AddDamageCallback("player", OnDamage)
}
void function OnWeaponFired(entity weapon, WeaponPrimaryAttackParams attackParams, var ammoUsed){
entity player = weapon.GetOwner()
string weaponName = weapon.GetWeaponClassName()
if(!player.IsPlayer()){
return
}
if(!(player in file.weaponsUsed)){
file.weaponsUsed[player] <- {}
}
if(!(weaponName in file.weaponsUsed[player])){
weaponStats stats = {
shotsFired = 0,
shotsHit = 0,
shotCrit = 0,
shotHeadshot = 0,
shotRichochet = 0
}
file.weaponsUsed[player][weaponName] <- stats
}
file.weaponsUsed[player][weaponName].shotsFired++
}
void function OnDamage( entity victim, var damageInfo){
entity player = DamageInfo_GetAttacker( damageInfo )
if(!IsValid(player) || !player.IsPlayer()){
return
}
entity weapon = DamageInfo_GetWeapon( damageInfo )
entity inflictor = DamageInfo_GetInflictor( damageInfo )
string weaponName
if(weapon){
weaponName = weapon.GetWeaponClassName()
}
else{
if ( inflictor && inflictor instanceof CProjectile && inflictor.IsProjectile() ){
weaponName = inflictor.ProjectileGetWeaponClassName()
}else{
ToneAPI_Log("[ERRR] Couldn't get weapon information")
return
}
}
if(!(player in file.weaponsUsed)){
file.weaponsUsed[player] <- {}
}
if(!(weaponName in file.weaponsUsed[player])){
weaponStats stats = {
shotsFired = 0,
shotsHit = 0,
shotCrit = 0,
shotHeadshot = 0,
shotRichochet = 0
}
file.weaponsUsed[player][weaponName] <- stats
}
file.weaponsUsed[player][weaponName].shotsHit++
int damageType = DamageInfo_GetCustomDamageType( damageInfo )
bool crit = bool( damageType & DF_CRITICAL )
bool headshot = bool( damageType & DF_HEADSHOT )
if(crit){
file.weaponsUsed[player][weaponName].shotCrit++
}
if(headshot){
file.weaponsUsed[player][weaponName].shotHeadshot++
}
if ( inflictor && inflictor instanceof CProjectile && inflictor.IsProjectile() ){
if(inflictor.proj.projectileBounceCount > 1){
file.weaponsUsed[player][weaponName].shotRichochet++
}
}
}