From 06202bb31123b2fb0c983e4d6132eab8ace1a7d1 Mon Sep 17 00:00:00 2001 From: legonzaur Date: Thu, 10 Aug 2023 12:33:09 +0200 Subject: [PATCH] add passives to loadout --- mod/scripts/vscripts/killstat.nut | 572 +++++++++++++++++------------- 1 file changed, 322 insertions(+), 250 deletions(-) diff --git a/mod/scripts/vscripts/killstat.nut b/mod/scripts/vscripts/killstat.nut index 76da745..4d60c40 100644 --- a/mod/scripts/vscripts/killstat.nut +++ b/mod/scripts/vscripts/killstat.nut @@ -1,313 +1,368 @@ -global function killstat_Init +global + +function killstat_Init struct { - string killstatVersion - string Tone_URI - string Tone_protocol - string Tone_token - bool connected + string killstatVersion + string Tone_URI + string Tone_protocol + string Tone_token + bool connected - string matchId - string gameMode - string map -} file + string matchId + string gameMode + string map +} +file -void function killstat_Init() { - file.killstatVersion = GetConVarString("killstat_version") - file.Tone_URI = GetConVarString("Tone_URI") - file.Tone_token = GetConVarString("Tone_token") - file.connected = false +void - //Test auth and print result to console when server start - Tone_Test_Auth() +function killstat_Init() { + file.killstatVersion = GetConVarString("killstat_version") + file.Tone_URI = GetConVarString("Tone_URI") + file.Tone_token = GetConVarString("Tone_token") + file.connected = false - //We should probably blacklist mp_lobby this - Tone_Register_Match() - // callbacks - AddCallback_GameStateEnter(eGameState.Playing, killstat_Begin) - AddCallback_OnPlayerKilled(killstat_Record) - AddCallback_GameStateEnter(eGameState.Postmatch, killstat_End) - AddCallback_OnClientConnected(JoinMessage) + //Test auth and print result to console when server start + Tone_Test_Auth() + + //We should probably blacklist mp_lobby this + Tone_Register_Match() + // callbacks + AddCallback_GameStateEnter(eGameState.Playing, killstat_Begin) + AddCallback_OnPlayerKilled(killstat_Record) + AddCallback_GameStateEnter(eGameState.Postmatch, killstat_End) + AddCallback_OnClientConnected(JoinMessage) } string prefix = "\x1b[38;5;81m[TONE API]\x1b[0m " -void function JoinMessage(entity player) { - //Chat_ServerPrivateMessage(player, prefix + "This server collects data using the Tone API. Check your data here: \x1b[34mtoneapi.com/" + player.GetPlayerName()+ "\x1b[0m", false, false) - Chat_ServerPrivateMessage(player, prefix + "This server collects data using the WIP Tone API. View statistics at https://toneapi.github.io/ToneAPI_webclient/", false, false) +void + +function JoinMessage(entity player) { + //Chat_ServerPrivateMessage(player, prefix + "This server collects data using the Tone API. Check your data here: \x1b[34mtoneapi.com/" + player.GetPlayerName()+ "\x1b[0m", false, false) + Chat_ServerPrivateMessage(player, prefix + "This server collects data using the WIP Tone API. View statistics at https://toneapi.github.io/ToneAPI_webclient/", false, false) } -void function killstat_Begin() { - //TODO : request MatchID from API ------------------------------------------------------------------------------------------------ - //TODO : request anonymization data from API +void - Log("-----BEGIN KILLSTAT-----") - Log("Sending kill data to " + file.Tone_URI + "/kill") +function killstat_Begin() { + //TODO : request MatchID from API ------------------------------------------------------------------------------------------------ + //TODO : request anonymization data from API + + Log("-----BEGIN KILLSTAT-----") + Log("Sending kill data to " + file.Tone_URI + "/kill") } -void function killstat_Record(entity victim, entity attacker, var damageInfo) { - if ( !victim.IsPlayer() || !attacker.IsPlayer() || GetGameState() != eGameState.Playing ) - return - // if(file.matchId) - // return +void + +function killstat_Record(entity victim, entity attacker, + var damageInfo) { + if (!victim.IsPlayer() || !attacker.IsPlayer() || GetGameState() != eGameState.Playing) + return + // if(file.matchId) + // return - table attackerValues = {} - table victimValues = {} + table attackerValues = {} + table < string, + var > victimValues = {} - array attackerWeapons = attacker.GetMainWeapons() - array victimWeapons = victim.GetMainWeapons() - array attackerOffhandWeapons = attacker.GetOffhandWeapons() - array victimOffhandWeapons = victim.GetOffhandWeapons() + array < entity > attackerWeapons = attacker.GetMainWeapons() + array < entity > victimWeapons = victim.GetMainWeapons() + array < entity > attackerOffhandWeapons = attacker.GetOffhandWeapons() + array < entity > victimOffhandWeapons = victim.GetOffhandWeapons() - attackerWeapons.sort(MainWeaponSort) - victimWeapons.sort(MainWeaponSort) + attackerWeapons.sort(MainWeaponSort) + victimWeapons.sort(MainWeaponSort) - entity aw1 = GetNthWeapon(attackerWeapons, 0) - entity aw2 = GetNthWeapon(attackerWeapons, 1) - entity aw3 = GetNthWeapon(attackerWeapons, 2) - entity vw1 = GetNthWeapon(victimWeapons, 0) - entity vw2 = GetNthWeapon(victimWeapons, 1) - entity vw3 = GetNthWeapon(victimWeapons, 2) - entity aow1 = GetNthWeapon(attackerOffhandWeapons, 0) - entity aow2 = GetNthWeapon(attackerOffhandWeapons, 1) - entity aow3 = GetNthWeapon(attackerOffhandWeapons, 2) - entity vow1 = GetNthWeapon(victimOffhandWeapons, 0) - entity vow2 = GetNthWeapon(victimOffhandWeapons, 1) - entity vow3 = GetNthWeapon(victimOffhandWeapons, 2) + entity aw1 = GetNthWeapon(attackerWeapons, 0) + entity aw2 = GetNthWeapon(attackerWeapons, 1) + entity aw3 = GetNthWeapon(attackerWeapons, 2) + entity vw1 = GetNthWeapon(victimWeapons, 0) + entity vw2 = GetNthWeapon(victimWeapons, 1) + entity vw3 = GetNthWeapon(victimWeapons, 2) + entity aow1 = GetNthWeapon(attackerOffhandWeapons, 0) + entity aow2 = GetNthWeapon(attackerOffhandWeapons, 1) + entity aow3 = GetNthWeapon(attackerOffhandWeapons, 2) + entity vow1 = GetNthWeapon(victimOffhandWeapons, 0) + entity vow2 = GetNthWeapon(victimOffhandWeapons, 1) + entity vow3 = GetNthWeapon(victimOffhandWeapons, 2) - int damageSourceId = DamageInfo_GetDamageSourceIdentifier(damageInfo) - string damageName = DamageSourceIDToString(damageSourceId) + int damageSourceId = DamageInfo_GetDamageSourceIdentifier(damageInfo) + string damageName = DamageSourceIDToString(damageSourceId) - float dist = Distance(attacker.GetOrigin(), victim.GetOrigin()) + float dist = Distance(attacker.GetOrigin(), victim.GetOrigin()) - table values = { - killstat_version = file.killstatVersion - match_id = file.matchId - game_time = Time() - player_count = GetPlayerArray().len() - cause_of_death = damageName - distance = dist - attacker = { - name = attacker.GetPlayerName() - id = attacker.GetUID() - titan = GetTitan(attacker) - velocity = Distance(<0,0,0>, attacker.GetVelocity()) - cloaked = attacker.IsCloaked( true ) - state = GetMovementState(attacker) - current_weapon = { - name = GetWeaponName(attacker.GetLatestPrimaryWeapon()) - mods = GetWeaponMods(attacker.GetLatestPrimaryWeapon()) - } - loadout = { - primary = { - name = GetWeaponName(aw1) - mods = GetWeaponMods(aw1) - } - secondary = { - name = GetWeaponName(aw2) - mods = GetWeaponMods(aw2) - } - anti_titan = { - name = GetWeaponName(aw3) - mods = GetWeaponMods(aw3) - } - ordnance = { - name = GetWeaponName(aow1) - mods = GetWeaponMods(aow1) - } - tactical = { - name = GetWeaponName(aow2) - mods = GetWeaponMods(aow2) - } - } - } - victim = { - name = victim.GetPlayerName() - id = victim.GetUID() - titan = GetTitan(victim) - velocity = Distance(<0,0,0>, victim.GetVelocity()) - cloaked = victim.IsCloaked( true ) - state = GetMovementState(victim) - current_weapon = { - name = GetWeaponName(victim.GetLatestPrimaryWeapon()) - mods = GetWeaponMods(victim.GetLatestPrimaryWeapon()) - } - loadout = { - primary = { - name = GetWeaponName(vw1) - mods = GetWeaponMods(vw1) - } - secondary = { - name = GetWeaponName(vw2) - mods = GetWeaponMods(vw2) - } - anti_titan = { - name = GetWeaponName(vw3) - mods = GetWeaponMods(vw3) - } - ordnance = { - name = GetWeaponName(vow1) - mods = GetWeaponMods(vow1) - } - tactical = { - name = GetWeaponName(vow2) - mods = GetWeaponMods(vow2) - } - } - } - } + table values = { + killstat_version = file.killstatVersion + match_id = file.matchId + game_time = Time() + player_count = GetPlayerArray().len() + cause_of_death = damageName + distance = dist + attacker = { + name = attacker.GetPlayerName() + id = attacker.GetUID() + velocity = Distance( < 0, 0, 0 > , attacker.GetVelocity()) + cloaked = attacker.IsCloaked(true) + state = GetMovementState(attacker) + current_weapon = { + name = GetWeaponName(attacker.GetLatestPrimaryWeapon()) + mods = GetWeaponMods(attacker.GetLatestPrimaryWeapon()) + } + loadout = { + primary = { + name = GetWeaponName(aw1) + mods = GetWeaponMods(aw1) + } + secondary = { + name = GetWeaponName(aw2) + mods = GetWeaponMods(aw2) + } + anti_titan = { + name = GetWeaponName(aw3) + mods = GetWeaponMods(aw3) + } + ordnance = { + name = GetWeaponName(aow1) + mods = GetWeaponMods(aow1) + } + tactical = { + name = GetWeaponName(aow2) + mods = GetWeaponMods(aow2) + } + passive1 = getPlayerPassive1(attacker) + passive2 = getPlayerPassive2(attacker) + titan = GetTitan(attacker) + } + } + victim = { + name = victim.GetPlayerName() + id = victim.GetUID() + velocity = Distance( < 0, 0, 0 > , victim.GetVelocity()) + cloaked = victim.IsCloaked(true) + state = GetMovementState(victim) + current_weapon = { + name = GetWeaponName(victim.GetLatestPrimaryWeapon()) + mods = GetWeaponMods(victim.GetLatestPrimaryWeapon()) + } + loadout = { + primary = { + name = GetWeaponName(vw1) + mods = GetWeaponMods(vw1) + } + secondary = { + name = GetWeaponName(vw2) + mods = GetWeaponMods(vw2) + } + anti_titan = { + name = GetWeaponName(vw3) + mods = GetWeaponMods(vw3) + } + ordnance = { + name = GetWeaponName(vow1) + mods = GetWeaponMods(vow1) + } + tactical = { + name = GetWeaponName(vow2) + mods = GetWeaponMods(vow2) + } + passive1 = getPlayerPassive1(victim) + passive2 = getPlayerPassive2(victim) + titan = GetTitan(victim) + } + } + } - HttpRequest request - request.method = HttpRequestMethod.POST - request.url = file.Tone_URI + "/server/kill" - request.body = EncodeJSON(values) + HttpRequest request + request.method = HttpRequestMethod.POST + request.url = file.Tone_URI + "/server/kill" + request.body = EncodeJSON(values) - Tone_HTTP_Request( - request, - void function ( HttpRequestResponse response ) {} - ) + Tone_HTTP_Request( + request, + void + function(HttpRequestResponse response) {} + ) } -void function killstat_End() { - Log("-----END KILLSTAT-----") +void + +function killstat_End() { + Log("-----END KILLSTAT-----") } -string function GetMovementState(entity player){ - Assert(IsPilot(player)) - //IsPhaseShifted - //IsStanding - if(player.IsWallHanging()) - return "WallHanging" - if(player.IsWallRunning()) - return "WallRunning" - if(player.IsZiplining()) - return "Ziplining" - if(!player.IsOnGround()) +string + +function GetMovementState(entity player) { + Assert(IsPilot(player)) + //IsPhaseShifted + //IsStanding + if (player.IsWallHanging()) + return "WallHanging" + if (player.IsWallRunning()) + return "WallRunning" + if (player.IsZiplining()) + return "Ziplining" + if (!player.IsOnGround()) return "Airborne" - if(player.IsCrouched()) - return "Crouching" - return "OnGround" + if (player.IsCrouched()) + return "Crouching" + return "OnGround" } // Should sort main weapons in following order: // 1. primary // 2. secondary // 3. anti-titan -int function MainWeaponSort(entity a, entity b) { - int aID = a.GetDamageSourceID() - int bID = b.GetDamageSourceID() +int - int aIdx = MAIN_DAMAGE_SOURCES.find(aID) - int bIdx = MAIN_DAMAGE_SOURCES.find(bID) +function MainWeaponSort(entity a, entity b) { + int aID = a.GetDamageSourceID() + int bID = b.GetDamageSourceID() - if (aIdx == bIdx) { - return 0 - } else if (aIdx != -1 && bIdx == -1) { - return -1 - } else if (aIdx == -1 && bIdx != -1) { - return 1 - } + int aIdx = MAIN_DAMAGE_SOURCES.find(aID) + int bIdx = MAIN_DAMAGE_SOURCES.find(bID) - return aIdx < bIdx ? -1 : 1 + if (aIdx == bIdx) { + return 0 + } else if (aIdx != -1 && bIdx == -1) { + return -1 + } else if (aIdx == -1 && bIdx != -1) { + return 1 + } + + return aIdx < bIdx ? -1 : 1 } -entity function GetNthWeapon(array weapons, int index) { - return index < weapons.len() ? weapons[index] : null +entity +function GetNthWeapon(array < entity > weapons, int index) { + return index < weapons.len() ? weapons[index] : null } -string function GetWeaponName(entity weapon) { - string s = "null" - if (weapon != null) { - s = weapon.GetWeaponClassName() - } - return s +string +function GetWeaponName(entity weapon) { + string s = "null" + if (weapon != null) { + s = weapon.GetWeaponClassName() + } + return s } -int function GetWeaponMods(entity weapon) { - if (weapon == null) { - return 0 - } - int modBits = weapon.GetModBitField() - // return format("%d", modBits) - return modBits +int +function GetWeaponMods(entity weapon) { + if (weapon == null) { + return 0 + } + int modBits = weapon.GetModBitField() + // return format("%d", modBits) + return modBits } -string function GetTitan(entity player) { - if(!player.IsTitan()) return "null" - return GetTitanCharacterName(player) +string +function GetTitan(entity player) { + if (!player.IsTitan()) return "null" + return GetTitanCharacterName(player) } -void function Log(string s) { - print(prefix + " " + s) +void +function Log(string s) { + print(prefix + " " + s) } -void function Tone_Test_Auth(){ - HttpRequest request - request.method = HttpRequestMethod.POST - request.url = file.Tone_URI + "/" - Tone_HTTP_Request( - request, - void function ( HttpRequestResponse response ) { - Log("Tone API Online !") - file.connected = true - } - ) +void +function Tone_Test_Auth() { + HttpRequest request + request.method = HttpRequestMethod.POST + request.url = file.Tone_URI + "/" + Tone_HTTP_Request( + request, + void + function(HttpRequestResponse response) { + Log("Tone API Online !") + file.connected = true + } + ) } -void function Tone_Register_Match(){ - HttpRequest request - request.method = HttpRequestMethod.POST - request.url = file.Tone_URI + "/match" - request.body = EncodeJSON({ - gameMode = GameRules_GetGameMode() - map = StringReplace(GetMapName(), "mp_", "") - servername = GetConVarString("ns_server_name") - }) - Tone_HTTP_Request( - request, - void function ( HttpRequestResponse response ) { - Log("match ID : " + response.body) - file.matchId = response.body - } - ) +void +function Tone_Register_Match() { + HttpRequest request + request.method = HttpRequestMethod.POST + request.url = file.Tone_URI + "/match" + request.body = EncodeJSON({ + gameMode = GameRules_GetGameMode() + map = StringReplace(GetMapName(), "mp_", "") + servername = GetConVarString("ns_server_name") + }) + Tone_HTTP_Request( + request, + void + function(HttpRequestResponse response) { + Log("match ID : " + response.body) + file.matchId = response.body + } + ) } -void function Tone_HTTP_Request(HttpRequest request, void functionref( HttpRequestResponse ) cbSuccess){ - if(!request.method) request.method = HttpRequestMethod.POST - if(request.url == ""){ - Log("[ERRR] Couldn't find URI for request. This should be reported") - return - } - request.headers = {Authorization = ["Bearer "+ file.Tone_token]} +void +function Tone_HTTP_Request(HttpRequest request, void functionref(HttpRequestResponse) cbSuccess) { + if (!request.method) request.method = HttpRequestMethod.POST + if (request.url == "") { + Log("[ERRR] Couldn't find URI for request. This should be reported") + return + } + request.headers = { + Authorization = ["Bearer " + file.Tone_token] + } - NSHttpRequest( - request, - void function ( HttpRequestResponse response ) : (cbSuccess) - { - if(response.statusCode == 200 || response.statusCode == 201){ - cbSuccess(response) - }else{ - Log("[WARN] Something might be wrong with your token") - Log("[WARN]" + response.statusCode) - Log("[WARN]" + response.body) - } - }, - void function ( HttpRequestFailure failure ) - { - Log("[WARN] Couldn't request the server! ToneAPI may be down.") - Log("[WARN]" + failure.errorCode) - Log("[WARN]" + failure.errorMessage) - } - ) + NSHttpRequest( + request, + void + function(HttpRequestResponse response): (cbSuccess) { + if (response.statusCode == 200 || response.statusCode == 201) { + cbSuccess(response) + } else { + Log("[WARN] Something might be wrong with your token") + Log("[WARN]" + response.statusCode) + Log("[WARN]" + response.body) + } + }, + void + function(HttpRequestFailure failure) { + Log("[WARN] Couldn't request the server! ToneAPI may be down.") + Log("[WARN]" + failure.errorCode) + Log("[WARN]" + failure.errorMessage) + } + ) } +string +function getPlayerPassive1(player entity) { + foreach(string passive in passive1Names) { + if (PlayerHasPassive(player, passive)) { + return passive + } + } + return null +} -array MAIN_DAMAGE_SOURCES = [ - // primaries +string +function getPlayerPassive2(player entity) { + foreach(string passive in passive2Names) { + if (PlayerHasPassive(player, passive)) { + return passive + } + } + return null +} + +array < int > MAIN_DAMAGE_SOURCES = [ + // primaries eDamageSourceId.mp_weapon_car, eDamageSourceId.mp_weapon_r97, eDamageSourceId.mp_weapon_alternator_smg, @@ -332,15 +387,32 @@ array MAIN_DAMAGE_SOURCES = [ eDamageSourceId.mp_weapon_shotgun_pistol, eDamageSourceId.mp_weapon_wingman_n, - // secondaries + // secondaries eDamageSourceId.mp_weapon_smart_pistol, eDamageSourceId.mp_weapon_wingman, eDamageSourceId.mp_weapon_semipistol, eDamageSourceId.mp_weapon_autopistol, - // anti-titan + // anti-titan eDamageSourceId.mp_weapon_mgl, eDamageSourceId.mp_weapon_rocket_launcher, eDamageSourceId.mp_weapon_arc_launcher, eDamageSourceId.mp_weapon_defender +] + + +array < string > passive1Names = [ + "pas_ordnance_pack", + "pas_power_cell", + "pas_fast_embark", + "pas_fast_health_regen" +] + + +array < string > passive2Names = [ + "pas_stealth_movement", + "pas_wallhang", + "pas_ads_hover", + "pas_enemy_death_icons", + "pas_at_hunter" ] \ No newline at end of file