Author SHA1 Message Date
okvdai 340a2a0516 Update README.md 2023-04-24 23:40:14 +02:00
okvdai 3120fae436 Fix menu_stats_overview.nut 2023-04-20 18:36:25 +02:00
okvdai 4b779d2730 Create menu_stats_overview.nut
Still need to figure out why kill count doesn't correlate with data shown on the site...
2023-04-19 23:05:57 +02:00
okvdai 559be46b38 Add menu_stats_utility.nut 2023-04-19 21:42:07 +02:00
okvdai e82a29e317 Update pulse.gnut 2023-04-19 19:56:43 +02:00
legonzaur 223299024b Merge branch 'development' of https://github.com/ToneAPI/pulse into development 2023-04-19 19:44:11 +02:00
legonzaur 6c720ed8d1 Shows kills on weapons, as they should do 2023-04-19 19:43:26 +02:00
okvdai 9d5c9956ad Fix sh_stats.gnut
We can now enter the lobby!
2023-04-19 18:22:56 +02:00
okvdai d20ec3a1ac Update README.md 2023-04-19 17:53:30 +02:00
okvdai 2e771bfe17 Initial commit
Commit pulse.gnut for fixing.
2023-04-19 14:10:47 +02:00
23 changed files with 150 additions and 6682 deletions
+7 -91
View File
@@ -1,99 +1,15 @@
# pulse # Pulse
**pulse** is a clientside mod for [TF|2 + Northstar](https://github.com/R2Northstar/Northstar) letting you view killstats collected by [the Tone API](https://toneapi.github.io/ToneAPI_webclient/) using the otherwise non-functional `Stats` tab. Pulse is a clientside mod for Titanfall 2 letting you view killstats collected by [the Tone API](https://toneapi.github.io/ToneAPI_webclient/) using the otherwise non-functional `Stats` tab.
## Currently, features include: Currently, features include:
- mostly functional `Overview` tab, - displaying kills in `Pilot Weapons`
- functional `Time` tab, - displaying kills and most used weapon (by kills) in `Overview`
- Pilot weapon data displayed in `Pilot Weapons` tab,
- Titan kills displayed in `Titans` tab,
- functional `Maps` tab,
- real-time updates.
Want to know what we have planned for future updates? See [here.](https://github.com/ToneAPI/pulse/projects?query=is%3Aopen) Want to know what we have planned for future updates? See [here.](https://github.com/ToneAPI/pulse/projects?query=is%3Aopen)
Found a bug? Make an issue on GitHub [here.](https://github.com/ToneAPI/pulse/issues/new)
<details>
<summary>Features, more in-depth:</summary>
### `Overview`
- Most Kills - shows the weapon with most accumulated kills.
- Nemesis Weapon - shows the weapon that has killed you the most.
- Most Effective - shows weapon with the highest K/D ratio.
- Kill/Death Ratio - shows the overall K/D ratio of player compared to global K/D.
- Kills as Pilot - shows general kill data for player as Pilot, visualised in the table below:
| Name | Description |
|--------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Pilots |Shows **ALL KILLS** accumulated by player as Pilot. Differentiating Pilot and Titan kills will come in a later Tone API update.|
| Titans |Non-functional, see line above.|
| AI kills |Non-functional, Tone API does not collect AI kill data.|
| Pilot melee kills |Shows only melee kills accumulated by player as Pilot.|
| Pilot executions |Shows only executions accumulated by player as Pilot.|
- Kills as Titan - shows general kill data for player as Titan, visualised in the table below:
| Name | Description |
|--------------------|------------------------------------------------------|
| Pilots |Shows **ALL KILLS** accumulated by player as Titan. Differentiating Pilot and Titan kills will come in a later Tone API update.|
| Titans |Non-functional, see line above.|
| Titan executions |Shows only executions accumulated by player as Titan.|
| Pilots meleed |Shows only melee kills accumulated by player as Titan.|
| Pilot roadkills |Shows only roadkills accumulated by player as Titan.|
- Upper statbox values have been zeroed out, these don't yet work and are set to 0 to avoid confusion.
### `Time`
- Kills by Class shows kills by Pilot and Titan on a piechart.
- Kills by Titan shows kills by all Titan classes on a piechart.
- Kills by Gamemode shows kills on each gamemode played on a piechart.
### `Pilot Weapons`
- shows total accumulated kills per weapon under Total Kills.
- shows deaths with given weapon equipped under Deaths with Weapon.
### `Titans`
- shows total accumulated kills per Titan under Total Kills.
### `Maps`
- Player Map Stats - shows general data for player on chosen map, visualised in the table below:
| Name | Description |
|-----------------------|------------------------------------------------------- |
| Kills on Map |Shows all kills accumulated by player on chosen map.|
| Deaths on Map |Shows all deaths accumulated by player on chosen map.|
| Total Shot Distance |Shows total distance of kills accumulated by player on chosen map.|
| Maximum Shot Distance |Shows highest distance kill by player on chosen map.|
- Kills by Gamemode - piechart showing all kills (in percent) on chosen map by gamemode.
</details>
## DISCLAIMER ## DISCLAIMER
The Tone API is NOT used by every server, view a list of supported servers [here.](https://tone.sleepycat.date/v2/client/servers) The Tone API is NOT used by every server, view a list supported servers on [the webclient.](https://toneapi.github.io/ToneAPI_webclient/)
**pulse** is very much a W.I.P as of right now, features may be missing/nonfunctional.
## CHANGELOG Pulse is very much a W.I.P as of right now, features may be missing/nonfunctional.
<details>
<summary> pulse v2.0.0 "Demeter" </summary>
- Switched to Thunderstore template on the GitHub site for easier development.
- General code rewrite - lots of improvements for easier development. Rewrite includes:
- common code file, for better code readability and ease of development,
- new parser, allowing for better expandability and faster data processing (and much simpler implementation, unlike the hellspawn that was the previous `getFromToneAPI` function),
- new request function, more compact and simple than previous iterations,
- other functions that simplify the code and make it easier to read / develop
- Localisation, currently available in:
- English,
- French,
- German,
- Italian,
- Polish. (Northstar isn't translated into Polish, but the game supports it.)
- Locking the Stats tab, avoiding situations where you could click too fast and see no stats. Also prevents the game from showing stats when the API is unreachable.
</details>
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

-7
View File
@@ -1,7 +0,0 @@
{
"name": "Pulse",
"description": "Adds stats (collected by the Tone API) back to the Stats tab.",
"version_number": "2.0.0",
"website_url": "https://github.com/ToneAPI/pulse",
"dependencies": []
}
+15
View File
@@ -0,0 +1,15 @@
{
"Name": "ToneAPI.pulse",
"Description": "placeholder text",
"Version": "0.0.1",
"LoadPriority": 1,
"Scripts": [
{
"Path": "pulse.gnut",
"RunOn": "UI",
"UICallback": {
"After": "GetStatsFromToneAPI"
}
}
]
}
+55
View File
@@ -0,0 +1,55 @@
global function GetStatsFromToneAPI
global function getWeaponKillsFromToneApi
global table globalToneAPIKillData = {}
void function GetStatsFromToneAPI()
{
//SetConVarString("ToneURL", "https://toneapi.sleepycat.date/v1")
print("[PULSE] Loaded, getting data...")
HttpRequest getStats
getStats.method = HttpRequestMethod.GET
getStats.url = "https://tone.sleepycat.date/v1/client/weapons"
getStats.queryParameters["player"] <- [NSGetLocalPlayerUID().tostring()]
void functionref(HttpRequestResponse) onSuccess = void function(HttpRequestResponse response)
{
print("[PULSE] Kill data received, processing...")
table JSONForConversion = DecodeJSON(response.body)
foreach (var key, var value in JSONForConversion) {
table test = expect table(value)
//this won't work on v2 since kills will be an integer already
string kills = expect string(test.kills)
globalToneAPIKillData[string(key)] <- kills.tointeger()
print("[PULSE] " + key + " has been added.")
}
print("[PULSE] Kill data has been processed.")
}
void functionref(HttpRequestFailure) onFailure = void function(HttpRequestFailure failure)
{
print("[PULSE] Encountered an error getting kill data...")
}
bool result = NSHttpRequest(getStats, onSuccess, onFailure)
print("[PULSE] result is " + result)
}
int function getWeaponKillsFromToneApi(string weaponRef){
//Sliced names are to be removed afterwards
print("[PULSE]" + weaponRef)
if(weaponRef.find("mp_weapon") != null){
weaponRef = weaponRef.slice(10)
}
foreach (var key, var value in globalToneAPIKillData) {
print(key)
print(value)
}
if(weaponRef in globalToneAPIKillData){
print("found!")
print(globalToneAPIKillData[weaponRef])
return expect int(globalToneAPIKillData[weaponRef])
}
return 0
}
@@ -5,14 +5,9 @@ global function InitViewStatsOverviewMenu
struct struct
{ {
var menu var menu
array<ItemDisplayData> allTitans
array<ItemDisplayData> allPilotWeapons
table<string, array<string> > titanStatLoadout
} file } file
const MAX_DOTS_ON_GRAPH = 10 const MAX_DOTS_ON_GRAPH = 10
table <string, int> titanKillData = {}
table <string, int> pilotKillData = {}
const IMAGE_TITAN_STRYDER = $"ui/menu/personal_stats/ps_titan_icon_stryder" const IMAGE_TITAN_STRYDER = $"ui/menu/personal_stats/ps_titan_icon_stryder"
const IMAGE_TITAN_ATLAS = $"ui/menu/personal_stats/ps_titan_icon_atlas" const IMAGE_TITAN_ATLAS = $"ui/menu/personal_stats/ps_titan_icon_atlas"
@@ -32,51 +27,10 @@ void function InitViewStatsOverviewMenu()
AddMenuFooterOption( menu, BUTTON_B, "#B_BUTTON_BACK", "#BACK" ) AddMenuFooterOption( menu, BUTTON_B, "#B_BUTTON_BACK", "#BACK" )
} }
void function GetTitanKills( string titanName )
{
file.allTitans = GetVisibleItemsOfType( eItemTypes.TITAN )
var dataTable = GetDataTable( $"datatable/titan_properties.rpak" )
foreach ( titan in file.allTitans )
{
file.titanStatLoadout[ titan.ref ] <- []
int row = GetDataTableRowMatchingStringValue( dataTable, GetDataTableColumnByName( dataTable, "titanRef" ), titan.ref )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "primary" ) ) )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "ordnance" ) ) )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "special" ) ) )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "antirodeo" ) ) )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "coreAbility" ) ) )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "melee" ) ) )
}
foreach ( weaponRef in file.titanStatLoadout[ titanName ])
{
titanKillData[weaponRef] <- pulseParse("weaponsLocal", weaponRef, "kills")
}
}
void function GetAllPilotWeapons()
{
file.allPilotWeapons = GetVisibleItemsOfType( eItemTypes.PILOT_PRIMARY)
file.allPilotWeapons.extend(GetVisibleItemsOfType( eItemTypes.PILOT_SECONDARY) )
file.allPilotWeapons.extend(GetVisibleItemsOfType( eItemTypes.PILOT_ORDNANCE) )
file.allPilotWeapons.extend( GetVisibleItemsOfType( eItemTypes.PILOT_SPECIAL ) )
}
void function OnStatsOverview_Open() void function OnStatsOverview_Open()
{ {
UI_SetPresentationType( ePresentationType.NO_MODELS ) UI_SetPresentationType( ePresentationType.NO_MODELS )
GetTitanKills("ion")
GetTitanKills("scorch")
GetTitanKills("northstar")
GetTitanKills("ronin")
GetTitanKills("tone")
GetTitanKills("legion")
GetTitanKills("vanguard")
UpdateViewStatsOverviewMenu() UpdateViewStatsOverviewMenu()
} }
@@ -97,19 +51,12 @@ function UpdateViewStatsOverviewMenu()
int timesMVP = GetPlayerStatInt( player, "game_stats", "mvp_total" ) int timesMVP = GetPlayerStatInt( player, "game_stats", "mvp_total" )
int timesTop3 = GetPlayerStat_AllCompetitiveModesAndMapsInt( player, "game_stats", "top3OnTeam" ) int timesTop3 = GetPlayerStat_AllCompetitiveModesAndMapsInt( player, "game_stats", "top3OnTeam" )
//SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat0" ), Localize( "#STATS_HEADER_TIME_PLAYED" ), timePlayed ) SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat0" ), Localize( "#STATS_HEADER_TIME_PLAYED" ), timePlayed )
//SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat1" ), Localize( "#STATS_GAMES_PLAYED" ), string( gamesPlayed ) ) SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat1" ), Localize( "#STATS_GAMES_PLAYED" ), string( gamesPlayed ) )
//SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat2" ), Localize( "#STATS_GAMES_WON" ), string( gamesWon ) ) SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat2" ), Localize( "#STATS_GAMES_WON" ), string( gamesWon ) )
//SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat3" ), Localize( "#STATS_GAMES_WIN_PERCENT" ), Localize( "#STATS_PERCENTAGE", winPercent ) ) SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat3" ), Localize( "#STATS_GAMES_WIN_PERCENT" ), Localize( "#STATS_PERCENTAGE", winPercent ) )
//SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat4" ), Localize( "#STATS_GAMES_MVP" ), string( timesMVP ) ) SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat4" ), Localize( "#STATS_GAMES_MVP" ), string( timesMVP ) )
//SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat5" ), Localize( "#STATS_GAMES_TOP3" ), string( timesTop3 ) ) SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat5" ), Localize( "#STATS_GAMES_TOP3" ), string( timesTop3 ) )
SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat0" ), Localize( "#STATS_HEADER_TIME_PLAYED" ), string( 0 ))
SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat1" ), Localize( "#STATS_GAMES_PLAYED" ), string( 0 ) )
SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat2" ), Localize( "#STATS_GAMES_WON" ), string( 0 ) )
SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat3" ), Localize( "#STATS_GAMES_WIN_PERCENT" ), string( 0 ) )
SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat4" ), Localize( "#STATS_GAMES_MVP" ), string( 0 ) )
SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat5" ), Localize( "#STATS_GAMES_TOP3" ), string( 0 ) )
//######################### //#########################
// Modes // Modes
@@ -171,7 +118,7 @@ function UpdateViewStatsOverviewMenu()
table<string, table> weaponData = GetOverviewWeaponData() table<string, table> weaponData = GetOverviewWeaponData()
table mostKillsData = weaponData[ "most_kills" ] table mostKillsData = weaponData[ "most_kills" ]
table nemesisWeapon = weaponData[ "nemesis_weapon" ] table mostUsedData = weaponData[ "most_used" ]
table highestKPMData = weaponData[ "highest_kpm" ] table highestKPMData = weaponData[ "highest_kpm" ]
var weaponImageElem var weaponImageElem
@@ -211,14 +158,14 @@ function UpdateViewStatsOverviewMenu()
weaponNameElem = Hud_GetChild( file.menu, "WeaponName1" ) weaponNameElem = Hud_GetChild( file.menu, "WeaponName1" )
weaponDescElem = Hud_GetChild( file.menu, "WeaponDesc1" ) weaponDescElem = Hud_GetChild( file.menu, "WeaponDesc1" )
noDataElem = Hud_GetChild( file.menu, "WeaponImageTextOverlay1" ) noDataElem = Hud_GetChild( file.menu, "WeaponImageTextOverlay1" )
if ( nemesisWeapon.ref != "" ) if ( mostUsedData.ref != "" )
{ {
SetItemImageWidth( weaponImageElem, expect string( nemesisWeapon.ref ) ) SetItemImageWidth( weaponImageElem, expect string( mostUsedData.ref ) )
RuiSetImage( weaponRui, "buttonImage", GetItemImage( expect string( nemesisWeapon.ref ) ) ) RuiSetImage( weaponRui, "buttonImage", GetItemImage( expect string( mostUsedData.ref ) ) )
Hud_Show( weaponImageElem ) Hud_Show( weaponImageElem )
Hud_SetText( weaponNameElem, nemesisWeapon.printName ) Hud_SetText( weaponNameElem, mostUsedData.printName )
Hud_Show( weaponNameElem ) Hud_Show( weaponNameElem )
Hud_SetText( weaponDescElem, Localize("#NEMESIS_WEAPON_VALUE"), nemesisWeapon.val) SetStatsLabelValue( file.menu, "WeaponDesc1", HoursToTimeString( expect float( mostUsedData.val ) ) )
Hud_Show( weaponDescElem ) Hud_Show( weaponDescElem )
Hud_Hide( noDataElem ) Hud_Hide( noDataElem )
} }
@@ -243,7 +190,7 @@ function UpdateViewStatsOverviewMenu()
Hud_Show( weaponImageElem ) Hud_Show( weaponImageElem )
Hud_SetText( weaponNameElem, highestKPMData.printName ) Hud_SetText( weaponNameElem, highestKPMData.printName )
Hud_Show( weaponNameElem ) Hud_Show( weaponNameElem )
Hud_SetText( weaponDescElem, "%s1 K/D", highestKPMData.val) Hud_SetText( weaponDescElem, "#STATS_MOST_EFFICIENT_VALUE", highestKPMData.val )
Hud_Show( weaponDescElem ) Hud_Show( weaponDescElem )
Hud_Hide( noDataElem ) Hud_Hide( noDataElem )
} }
@@ -299,61 +246,22 @@ function UpdateViewStatsOverviewMenu()
//######################### //#########################
// Lifetime // Lifetime
table playerweaponData = expect table(pulseData["weaponsLocal"]) local lifetimeAverage = player.GetPersistentVar( "kdratio_lifetime" ).tofloat()
table globalweaponData = expect table(pulseData["weaponsGlobal"]) local formattedLifetimeAverage
var totalPilotKills = 0 if ( lifetimeAverage % 1 == 0 )
formattedLifetimeAverage = format( "%.0f", lifetimeAverage )
else
formattedLifetimeAverage = format( "%.1f", lifetimeAverage )
SetStatsLabelValue( file.menu, "LifetimeAverageValue", [ "#STATS_KD_VALUE", formattedLifetimeAverage ] )
foreach (var key, var value in playerweaponData) { // Lifetime (PVP)
table values = expect table(value) local lifetimeAveragePVP = player.GetPersistentVar( "kdratio_lifetime_pvp" ).tofloat()
totalPilotKills += values["kills"] local formattedLifetimeAveragePVP
} if ( lifetimeAveragePVP % 1 == 0 )
formattedLifetimeAveragePVP = format( "%.0f", lifetimeAveragePVP )
var totalGlobalKills = 0 else
foreach (var key, var value in globalweaponData) { formattedLifetimeAveragePVP = format( "%.1f", lifetimeAveragePVP )
table values = expect table(value) SetStatsLabelValue( file.menu, "LifetimePVPAverageValue", [ "#STATS_KD_VALUE", formattedLifetimeAveragePVP ] )
totalGlobalKills += values["kills"]
}
var totalPilotDeaths = 0
foreach (var key, var value in playerweaponData) {
table values = expect table(value)
totalPilotDeaths += values["deaths"]
}
var totalGlobalDeaths = 0
foreach (var key, var value in globalweaponData) {
table values = expect table(value)
totalGlobalDeaths += values["deaths"]
}
var killsAsPilot = 0
foreach (var key, var value in playerweaponData) {
if (key in titanKillData) {
continue
} else {
killsAsPilot += pulseParse("weaponsLocal", string(key), "kills")
}
}
var killsAsTitan = 0
foreach (var key, var value in playerweaponData) {
if (key in titanKillData) {
killsAsTitan += titanKillData[string(key)]
}
}
float kval = float(totalPilotKills)
float dval = float(totalPilotDeaths)
float kdval = float(int((kval / dval)*100))/100
float gkval = float(totalGlobalKills)
float gdval = float(totalGlobalDeaths)
float gkdval = float(int((gkval / gdval)*100))/100
SetStatsLabelValue( file.menu, "LifetimeAverageValue", [ "#STATS_KD_VALUE", kdval ] )
SetStatsLabelValue( file.menu, "LifetimePVPAverageValue", [ "#STATS_KD_VALUE", gkdval ] )
bool last10GamesStatsVisible = gamesPlayed >= NUM_GAMES_TRACK_KDRATIO ? true : false bool last10GamesStatsVisible = gamesPlayed >= NUM_GAMES_TRACK_KDRATIO ? true : false
SetLast10GamesStatVisibility( file.menu, last10GamesStatsVisible ) SetLast10GamesStatVisibility( file.menu, last10GamesStatsVisible )
@@ -383,7 +291,7 @@ function UpdateViewStatsOverviewMenu()
else else
kdratio_match_average = format( "%.1f", kdratio_match_average ) kdratio_match_average = format( "%.1f", kdratio_match_average )
SetStatsLabelValue( file.menu, "Last10GamesValue", [ "#STATS_KD_VALUE", kdratio_match_average ] ) SetStatsLabelValue( file.menu, "Last10GamesValue", [ "#STATS_KD_VALUE", kdratio_match_average ] )
PlotKDPointsOnGraph( file.menu, 0, kdratio_match, kdval ) PlotKDPointsOnGraph( file.menu, 0, kdratio_match, lifetimeAverage )
// Last 10 (PVP) // Last 10 (PVP)
local kdratiopvp_match_sum = 0 local kdratiopvp_match_sum = 0
@@ -401,33 +309,38 @@ function UpdateViewStatsOverviewMenu()
else else
kdratiopvp_match_average = format( "%.1f", kdratiopvp_match_average ) kdratiopvp_match_average = format( "%.1f", kdratiopvp_match_average )
SetStatsLabelValue( file.menu, "Last10GamesPVPValue", [ "#STATS_KD_VALUE", kdratiopvp_match_average ] ) SetStatsLabelValue( file.menu, "Last10GamesPVPValue", [ "#STATS_KD_VALUE", kdratiopvp_match_average ] )
PlotKDPointsOnGraph( file.menu, 1, kdratiopvp_match, gkdval ) PlotKDPointsOnGraph( file.menu, 1, kdratiopvp_match, lifetimeAveragePVP )
var totalPilotKills = 0
foreach (var key, var value in globalToneAPIKillData) {
totalPilotKills += value
}
///////////////////////// /////////////////////////
Hud_SetText( GetElem( file.menu, "KillsAsPilotValue0" ), string( killsAsPilot ) ) Hud_SetText( GetElem( file.menu, "KillsAsPilotValue0" ), string( totalPilotKills ) )
Hud_SetText( GetElem( file.menu, "KillsAsPilotValue1" ), string( GetPlayerStatInt( player, "kills_stats", "titanKillsAsPilot" ) ) ) Hud_SetText( GetElem( file.menu, "KillsAsPilotValue1" ), string( GetPlayerStatInt( player, "kills_stats", "titanKillsAsPilot" ) ) )
Hud_SetText( GetElem( file.menu, "KillsAsPilotValue2" ), string( GetPlayerStatInt( player, "kills_stats", "totalNPC" ) ) ) Hud_SetText( GetElem( file.menu, "KillsAsPilotValue2" ), string( GetPlayerStatInt( player, "kills_stats", "totalNPC" ) ) )
Hud_SetText( GetElem( file.menu, "KillsAsPilotValue3" ), string( pulseParse("weaponsLocal", "pilot_emptyhanded", "kills") ) ) Hud_SetText( GetElem( file.menu, "KillsAsPilotValue3" ), string( GetPlayerStatInt( player, "kills_stats", "pilotKickMeleePilot" ) ) )
Hud_SetText( GetElem( file.menu, "KillsAsPilotValue4" ), string( pulseParse("weaponsLocal", "human_execution", "kills") ) ) Hud_SetText( GetElem( file.menu, "KillsAsPilotValue4" ), string( GetPlayerStatInt( player, "kills_stats", "pilotExecutePilot" ) ) )
// Hud_SetText( GetElem( file.menu, "KillsAsPilotValue5" ), string( GetPlayerStatInt( player, "kills_stats", "titanFallKill" ) ) ) // Hud_SetText( GetElem( file.menu, "KillsAsPilotValue5" ), string( GetPlayerStatInt( player, "kills_stats", "titanFallKill" ) ) )
var titanMeleeKills = 0
titanMeleeKills += pulseParse("weaponsLocal", "titan_punch_ion", "kills")
titanMeleeKills += pulseParse("weaponsLocal", "titan_punch_scorch", "kills")
titanMeleeKills += pulseParse("weaponsLocal", "titan_punch_northstar", "kills")
titanMeleeKills += pulseParse("weaponsLocal", "titan_sword", "kills")
titanMeleeKills += pulseParse("weaponsLocal", "titan_punch_tone", "kills")
titanMeleeKills += pulseParse("weaponsLocal", "titan_punch_legion", "kills")
titanMeleeKills += pulseParse("weaponsLocal", "titan_punch_vanguard", "kills")
titanMeleeKills += pulseParse("weaponsLocal", "auto_titan_melee", "kills")
var titanExecutions = pulseParse("weaponsLocal", "titan_execution", "kills")
Hud_SetText( GetElem( file.menu, "KillsAsTitanValue0" ), string( killsAsTitan ) ) int totalTitanExecutions = 0
totalTitanExecutions += GetPlayerStatInt( player, "kills_stats", "titanExocutionIon" )
totalTitanExecutions += GetPlayerStatInt( player, "kills_stats", "titanExocutionScorch" )
totalTitanExecutions += GetPlayerStatInt( player, "kills_stats", "titanExocutionNorthstar" )
totalTitanExecutions += GetPlayerStatInt( player, "kills_stats", "titanExocutionRonin" )
totalTitanExecutions += GetPlayerStatInt( player, "kills_stats", "titanExocutionTone" )
totalTitanExecutions += GetPlayerStatInt( player, "kills_stats", "titanExocutionLegion" )
totalTitanExecutions += GetPlayerStatInt( player, "kills_stats", "titanExocutionVanguard" )
Hud_SetText( GetElem( file.menu, "KillsAsTitanValue0" ), string( GetPlayerStatInt( player, "kills_stats", "pilotKillsAsTitan" ) ) )
Hud_SetText( GetElem( file.menu, "KillsAsTitanValue1" ), string( GetPlayerStatInt( player, "kills_stats", "titanKillsAsTitan" ) ) ) Hud_SetText( GetElem( file.menu, "KillsAsTitanValue1" ), string( GetPlayerStatInt( player, "kills_stats", "titanKillsAsTitan" ) ) )
Hud_SetText( GetElem( file.menu, "KillsAsTitanValue2" ), string( titanExecutions ) ) Hud_SetText( GetElem( file.menu, "KillsAsTitanValue2" ), string( totalTitanExecutions ) )
Hud_SetText( GetElem( file.menu, "KillsAsTitanValue3" ), string( titanMeleeKills ) ) Hud_SetText( GetElem( file.menu, "KillsAsTitanValue3" ), string( GetPlayerStatInt( player, "kills_stats", "titanMeleePilot" ) ) )
Hud_SetText( GetElem( file.menu, "KillsAsTitanValue4" ), string( pulseParse("weaponsLocal", "damagedef_titan_step", "kills") ) ) Hud_SetText( GetElem( file.menu, "KillsAsTitanValue4" ), string( GetPlayerStatInt( player, "kills_stats", "titanStepCrushPilot" ) ) )
} }
function PlotKDPointsOnGraph( menu, graphIndex, values, dottedAverage ) function PlotKDPointsOnGraph( menu, graphIndex, values, dottedAverage )
@@ -306,10 +306,10 @@ table<string, table> function GetOverviewWeaponData()
Table[ "most_kills" ].ref <- "" Table[ "most_kills" ].ref <- ""
Table[ "most_kills" ].printName <- "" Table[ "most_kills" ].printName <- ""
Table[ "most_kills" ].val <- 0 Table[ "most_kills" ].val <- 0
Table[ "nemesis_weapon" ] <- {} Table[ "most_used" ] <- {}
Table[ "nemesis_weapon" ].ref <- "" Table[ "most_used" ].ref <- ""
Table[ "nemesis_weapon" ].printName <- "" Table[ "most_used" ].printName <- ""
Table[ "nemesis_weapon" ].val <- 0 Table[ "most_used" ].val <- 0
Table[ "highest_kpm" ] <- {} Table[ "highest_kpm" ] <- {}
Table[ "highest_kpm" ].ref <- "" Table[ "highest_kpm" ].ref <- ""
Table[ "highest_kpm" ].printName <- "" Table[ "highest_kpm" ].printName <- ""
@@ -338,7 +338,7 @@ table<string, table> function GetOverviewWeaponData()
if ( !PersistenceEnumValueIsValid( "loadoutWeaponsAndAbilities", weaponName ) ) if ( !PersistenceEnumValueIsValid( "loadoutWeaponsAndAbilities", weaponName ) )
continue continue
int val = pulseParse("weaponsLocal", weaponName, "kills") int val = getWeaponKillsFromToneApi(weaponName)
if ( val > Table[ "most_kills" ].val ) if ( val > Table[ "most_kills" ].val )
{ {
Table[ "most_kills" ].ref = weaponName Table[ "most_kills" ].ref = weaponName
@@ -346,31 +346,24 @@ table<string, table> function GetOverviewWeaponData()
Table[ "most_kills" ].val = val Table[ "most_kills" ].val = val
} }
int nval = pulseParse("weaponsLocal", weaponName, "deaths") float fVal = GetPlayerStatFloat( player, "weapon_stats", "hoursUsed", weaponName )
if ( nval > Table[ "nemesis_weapon" ].val ) if ( fVal > Table[ "most_used" ].val )
{ {
Table[ "nemesis_weapon" ].ref = weaponName Table[ "most_used" ].ref = weaponName
Table[ "nemesis_weapon" ].printName = weaponDisplayName Table[ "most_used" ].printName = weaponDisplayName
Table[ "nemesis_weapon" ].val = nval Table[ "most_used" ].val = fVal
} }
float kdval = 0 local killsPerMinute = 0
float kval = 0 local hoursEquipped = GetPlayerStatFloat( player, "weapon_stats", "hoursEquipped", weaponName )
float dval = 0 local killCount = GetPlayerStatInt( player, "weapon_kill_stats", "total", weaponName )
if( pulseParse("weaponsLocal", weaponName, "kills") != 0 && pulseParse("weaponsLocal", weaponName, "deaths_while_equipped") != 0){ if ( hoursEquipped > 0 )
kval = float(pulseParse("weaponsLocal", weaponName, "kills")) killsPerMinute = format( "%.2f", ( killCount / ( hoursEquipped * 60.0 ) ).tofloat() )
dval = float(pulseParse("weaponsLocal", weaponName, "deaths_while_equipped")) if ( killsPerMinute.tofloat() > Table[ "highest_kpm" ].val.tofloat() )
if (kval / dval > kdval){
kdval = kval / dval
}
}
int rnd= int(kdval*100)
kdval = float(rnd)/100
if ( kdval > Table[ "highest_kpm" ].val.tofloat() )
{ {
Table[ "highest_kpm" ].ref = weaponName Table[ "highest_kpm" ].ref = weaponName
Table[ "highest_kpm" ].printName = weaponDisplayName Table[ "highest_kpm" ].printName = weaponDisplayName
Table[ "highest_kpm" ].val = kdval Table[ "highest_kpm" ].val = killsPerMinute
} }
} }
@@ -180,8 +180,8 @@ void function UpdateStatsForWeapon( string weaponRef )
} }
// Total Kills Stats // Total Kills Stats
SetStatsLabelValue( file.menu, "KillsValue0", pulseParse("weaponsLocal", weaponRef, "kills") ) //Total kills SetStatsLabelValue( file.menu, "KillsValue0", getWeaponKillsFromToneApi(weaponRef) )
SetStatsLabelValue( file.menu, "KillsValue1", pulseParse("weaponsLocal", weaponRef, "kills") ) //Pilots SetStatsLabelValue( file.menu, "KillsValue1", getWeaponKillsFromToneApi(weaponRef) )
SetStatsLabelValue( file.menu, "KillsValue2", GetPlayerStatInt( player, "weapon_kill_stats", "titansTotal", weaponRef ) ) //Titans SetStatsLabelValue( file.menu, "KillsValue2", GetPlayerStatInt( player, "weapon_kill_stats", "titansTotal", weaponRef ) )
SetStatsLabelValue( file.menu, "KillsValue3", pulseParse("weaponsLocal", weaponRef, "deaths_while_equipped")) // Deaths with weapon SetStatsLabelValue( file.menu, "KillsValue3", GetPlayerStatInt( player, "weapon_kill_stats", "ai", weaponRef ) )
} }
-32
View File
@@ -1,32 +0,0 @@
{
"Name": "ToneAPI.pulse",
"Description": "Displays Tone API kill data in the Stats tab.",
"Version": "2.0.0",
"LoadPriority": 1,
"ConVars": [
{
"Name": "ToneURL",
"DefaultValue": "https://tone.sleepycat.date/v2/client"
},
{
"Name": "VersionURL",
"DefaultValue": "https://raw.githubusercontent.com/ToneAPI/pulse/main/version.json"
}
],
"Scripts": [
{
"Path":"pulse-common-func.gnut",
"RunOn":"UI"
},
{
"Path": "pulse.gnut",
"RunOn": "UI",
"UICallback": {
"After": "pulseInit"
}
}
],
"Localisation": [
"resource/pulse_%language%.txt"
]
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,508 +0,0 @@
resource/ui/menus/viewstats_weapons.menu
{
menu
{
ControlName Frame
xpos 0
ypos 0
zpos 3
wide f0
tall f0
autoResize 0
pinCorner 0
visible 1
enabled 1
PaintBackgroundType 0
infocus_bgcolor_overridep "0 0 0 0"
outoffocus_bgcolor_override "0 0 0 0"
Vignette
{
ControlName ImagePanel
InheritProperties MenuVignette
}
MenuTitle
{
ControlName Label
InheritProperties MenuTitle
labelText "#STATS_PILOT_WEAPONS"
}
MenuCommon
{
ControlName CNestedPanel
xpos 0
ypos 0
wide f0
tall f0
visible 1
controlSettingsFile "resource/ui/menus/panels/menu_common.res"
}
MatchmakingStatus
{
ControlName CNestedPanel
xpos 0
ypos 0
wide f0
tall f0
visible 1
controlSettingsFile "resource/ui/menus/panels/matchmaking_status.res"
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
GridPanel
{
ControlName CNestedPanel
xpos 96
ypos 193
zpos 99
wide 224
tall 702
visible 1
tabPosition 1
controlSettingsFile "Resource/UI/menus/panels/weapon_stats_grid.res"
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Screen
{
ControlName Label
xpos 0
ypos 0
wide f0
tall f0
labelText ""
//bgcolor_override "100 100 100 100"
//paintbackground 1
//visible 1
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
WeaponName
{
ControlName Label
xpos -516
ypos -366
zpos 101
auto_wide_tocontents 1
auto_tall_tocontents 1
visible 1
font DefaultBold_44
labelText "WEAPON NAME"
allcaps 1
fgcolor_override "255 255 255 255"
//bgcolor_override "0 255 0 100"
pin_to_sibling Screen
pin_corner_to_sibling TOP_LEFT
pin_to_sibling_corner BOTTOM
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
KillsHeader
{
ControlName RuiPanel
rui "ui/stats_background.rpak"
zpos 101
wide 500
tall 194
visible 1
scaleImage 1
pin_to_sibling WeaponName
pin_corner_to_sibling TOP_LEFT
pin_to_sibling_corner BOTTOM_LEFT
}
KillsHeaderLabel
{
ControlName Label
xpos -18
ypos -6
zpos 102
wide 400
tall 36
visible 1
font Default_31
labelText "#STATS_HEADER_KILL_HISTORY"
allcaps 1
textAlignment west
fgcolor_override "255 255 255 255"
//bgcolor_override "255 255 0 100"
pin_to_sibling KillsHeader
pin_corner_to_sibling TOP_LEFT
pin_to_sibling_corner TOP_LEFT
}
KillsLineBackground0
{
ControlName RuiPanel
rui "ui/stats_line_background.rpak"
xpos 0
ypos -48
zpos 101
wide 500
tall 36
visible 1
scaleImage 1
pin_to_sibling KillsHeader
pin_corner_to_sibling TOP_LEFT
pin_to_sibling_corner TOP_LEFT
}
KillsLabel0
{
ControlName Label
xpos -18
ypos 0
zpos 102
wide 308
tall 36
visible 1
font Default_23
labelText "#STATS_HEADER_TOTAL_KILLS"
allcaps 1
textAlignment west
fgcolor_override "255 255 255 255"
//bgcolor_override "255 255 0 100"
pin_to_sibling KillsLineBackground0
pin_corner_to_sibling LEFT
pin_to_sibling_corner LEFT
}
KillsValue0
{
ControlName Label
xpos 0
ypos 0
zpos 102
wide 94
tall 36
visible 1
font Default_23
labelText "--"
allcaps 1
textAlignment center
fgcolor_override "255 255 255 255"
//bgcolor_override "0 255 0 100"
pin_to_sibling KillsLineBackground0
pin_corner_to_sibling RIGHT
pin_to_sibling_corner RIGHT
}
KillsLineBackground1
{
ControlName RuiPanel
rui "ui/stats_line_background.rpak"
xpos 0
ypos 0
zpos 101
wide 500
tall 36
visible 0
scaleImage 1
pin_to_sibling KillsLineBackground0
pin_corner_to_sibling TOP_LEFT
pin_to_sibling_corner BOTTOM_LEFT
}
KillsLabel1
{
ControlName Label
xpos -18
ypos 0
zpos 102
wide 308
tall 36
visible 1
font Default_23
labelText "#STATS_KILLS_PILOTS"
allcaps 1
textAlignment west
fgcolor_override "255 255 255 255"
//bgcolor_override "255 255 0 100"
pin_to_sibling KillsLineBackground1
pin_corner_to_sibling LEFT
pin_to_sibling_corner LEFT
}
KillsValue1
{
ControlName Label
xpos 0
ypos 0
zpos 102
wide 94
tall 36
visible 1
font Default_23
labelText "--"
allcaps 1
textAlignment center
fgcolor_override "255 255 255 255"
//bgcolor_override "0 255 0 100"
pin_to_sibling KillsLineBackground1
pin_corner_to_sibling RIGHT
pin_to_sibling_corner RIGHT
}
KillsLineBackground2
{
ControlName RuiPanel
rui "ui/stats_line_background.rpak"
xpos 0
ypos 0
zpos 101
wide 500
tall 36
visible 1
scaleImage 1
pin_to_sibling KillsLineBackground1
pin_corner_to_sibling TOP_LEFT
pin_to_sibling_corner BOTTOM_LEFT
}
KillsLabel2
{
ControlName Label
xpos -18
ypos 0
zpos 102
wide 308
tall 36
visible 1
font Default_23
labelText "#STATS_KILLS_TITANS"
allcaps 1
textAlignment west
fgcolor_override "255 255 255 255"
//bgcolor_override "255 255 0 100"
pin_to_sibling KillsLineBackground2
pin_corner_to_sibling LEFT
pin_to_sibling_corner LEFT
}
KillsValue2
{
ControlName Label
xpos 0
ypos 0
zpos 102
wide 94
tall 36
visible 1
font Default_23
labelText "--"
allcaps 1
textAlignment center
fgcolor_override "255 255 255 255"
//bgcolor_override "0 255 0 100"
pin_to_sibling KillsLineBackground2
pin_corner_to_sibling RIGHT
pin_to_sibling_corner RIGHT
}
KillsLineBackground3
{
ControlName RuiPanel
rui "ui/stats_line_background.rpak"
xpos 0
ypos 0
zpos 101
wide 500
tall 36
visible 0
scaleImage 1
pin_to_sibling KillsLineBackground2
pin_corner_to_sibling TOP_LEFT
pin_to_sibling_corner BOTTOM_LEFT
}
KillsLabel3
{
ControlName Label
xpos -18
ypos 0
zpos 102
wide 308
tall 36
visible 1
font Default_23
labelText "#DEATHS_WHILE_EQUIPPED"
allcaps 1
textAlignment west
fgcolor_override "255 255 255 255"
//bgcolor_override "255 255 0 100"
pin_to_sibling KillsLineBackground3
pin_corner_to_sibling LEFT
pin_to_sibling_corner LEFT
}
KillsValue3
{
ControlName Label
xpos 0
ypos 0
zpos 102
wide 94
tall 36
visible 1
font Default_23
labelText "--"
allcaps 1
textAlignment center
fgcolor_override "255 255 255 255"
//bgcolor_override "0 255 0 100"
pin_to_sibling KillsLineBackground3
pin_corner_to_sibling RIGHT
pin_to_sibling_corner RIGHT
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Stat0
{
ControlName RuiPanel
rui "ui/stat_box_e.rpak"
xpos 8
zpos 100
wide 210
tall 93
visible 1
pin_to_sibling KillsHeader
pin_corner_to_sibling TOP_LEFT
pin_to_sibling_corner TOP_RIGHT
}
Stat1
{
ControlName RuiPanel
rui "ui/stat_box_e.rpak"
xpos 8
zpos 100
wide 210
tall 93
visible 1
pin_to_sibling Stat0
pin_corner_to_sibling LEFT
pin_to_sibling_corner RIGHT
}
Stat2
{
ControlName RuiPanel
rui "ui/stat_box_e.rpak"
ypos 8
zpos 100
wide 210
tall 93
visible 1
pin_to_sibling Stat0
pin_corner_to_sibling TOP_LEFT
pin_to_sibling_corner BOTTOM_LEFT
}
Stat3
{
ControlName RuiPanel
rui "ui/stat_box_e.rpak"
xpos 8
zpos 100
wide 210
tall 93
visible 1
pin_to_sibling Stat2
pin_corner_to_sibling LEFT
pin_to_sibling_corner RIGHT
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
NextUnlock
{
ControlName RuiPanel
rui "ui/stats_next_unlock.rpak"
xpos 8
zpos 90
wide 356
tall 194
visible 1
scaleImage 1
pin_to_sibling Stat1
pin_corner_to_sibling TOP_LEFT
pin_to_sibling_corner TOP_RIGHT
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ModelRotateMouseCapture
{
ControlName CMouseMovementCapturePanel
xpos 580
zpos 12
wide 1340
tall %100
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
LblWeaponLocked
{
ControlName Label
classname LblWeaponLocked
xpos -650
ypos 142
zpos 102
wide 474
auto_tall_tocontents 1
visible 1
font Default_27_DropShadow
allcaps 1
textAlignment center
labelText "UNLOCK INFO"
fgcolor_override "153 61 61 255"
bgcolor_override "51 20 20 240"
pin_to_sibling KillsHeader
pin_corner_to_sibling BOTTOM
pin_to_sibling_corner TOP_LEFT
paintbackground 1
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
FooterButtons
{
ControlName CNestedPanel
xpos 0
ypos r119
wide f0
tall 36
visible 1
controlSettingsFile "resource/ui/menus/panels/footer_buttons.res"
}
}
}
@@ -1,60 +0,0 @@
globalize_all_functions
global string pulsePrefix
global bool pulseSuccessBool = true
table withMapName = {}
void function pulsePrefixSet() //Sets our prefix
{
pulsePrefix = format("\x1b[38;2;%i;%i;%im[PULSE]\x1b[0m", 255, 178, 102)
}
void function pulsePrintt(string content) //Prints whatever we want printed with given prefix (by standard [PULSE]).
{
printt(format("%s " + content, pulsePrefix))
}
bool function pulseRequestData(string givenURL, table parameterTable, string tablepath) //Gets data from API (see ToneURL within mod.json) and puts it into one table for processing.
{
table<string, array<string> > requestTable
void functionref (HttpRequestResponse) onSuccess = void function(HttpRequestResponse response) : (parameterTable, requestTable, tablepath)
{
table DecodedJSON = DecodeJSON(response.body)
if ("map" in parameterTable)
{
string mapName = expect string(parameterTable["map"])
withMapName[mapName] <- DecodedJSON
pulseData[tablepath] <- withMapName
} else {
pulseData[tablepath] <- DecodedJSON
}
pulseSuccessBool = false
}
void functionref (HttpRequestFailure) onFailure = void function(HttpRequestFailure failure)
{
pulsePrintt("Something went wrong while getting data.")
pulseSuccessBool = true
}
foreach (key, value in parameterTable)
{
requestTable[string(key)] <- [string(value)]
}
return NSHttpGet(givenURL, requestTable, onSuccess, onFailure)
}
int function pulseParse(...) //Returns data from our pulseData table.
{
table parser = pulseData
int result = 0
for (int i; i < vargc; i++) {
if (i < expect int(vargc) - 1) {
if (expect string (vargv[i]) in parser) {
parser = expect table(parser[expect string(vargv[i])])
} else {break}
} else {
result = expect int(parser[expect string(vargv[i])])
}
}
return result
}
@@ -1,30 +0,0 @@
global function pulseInit
global function pulseGetData
global table pulseData = {}
struct {
array<string> allMaps
} file
void function pulseInit()
{
pulsePrefixSet()
file.allMaps = GetPrivateMatchMaps()
pulsePrintt("Initialized.")
}
void function pulseGetData()
{
string URL = GetConVarString("ToneURL")
array <string> URLpath = ["/weapons", "/weapons", "/gamemodes", "/gamemodes", "/maps"]
array <string> tablepath = ["weaponsLocal", "weaponsGlobal", "gamemodesAll", "gamemodesSeparated", "maps"]
pulseRequestData(URL + URLpath[0], {["player"] = NSGetLocalPlayerUID()}, tablepath[0])
pulseRequestData(URL + URLpath[1], {["player"] = "!" + NSGetLocalPlayerUID()}, tablepath[1])
pulseRequestData(URL + URLpath[2], {["player"] = NSGetLocalPlayerUID()}, tablepath[2])
foreach (map in file.allMaps)
{
pulseRequestData(URL + URLpath[3], {["player"] = NSGetLocalPlayerUID(), ["map"] = map.slice(3)}, tablepath[3])
}
pulseRequestData(URL + URLpath[4], {["player"] = NSGetLocalPlayerUID()}, tablepath[4])
}
File diff suppressed because it is too large Load Diff
@@ -1,318 +0,0 @@
global function InitViewStatsMapsMenu
global function setit
struct
{
var menu
GridMenuData gridData
bool isGridInitialized = false
array<string> allMaps
} file
void function InitViewStatsMapsMenu()
{
var menu = GetMenu( "ViewStats_Maps_Menu" )
file.menu = menu
Hud_SetText( Hud_GetChild( file.menu, "MenuTitle" ), "#STATS_MAPS" )
file.gridData.rows = 5
file.gridData.columns = 1
//file.gridData.numElements // Set in OnViewStatsWeapons_Open after itemdata exists
file.gridData.pageType = eGridPageType.VERTICAL
file.gridData.tileWidth = 224
file.gridData.tileHeight = 112
file.gridData.paddingVert = 6
file.gridData.paddingHorz = 6
Grid_AutoAspectSettings( menu, file.gridData )
file.gridData.initCallback = MapButton_Init
file.gridData.getFocusCallback = MapButton_GetFocus
file.gridData.clickCallback = MapButton_Activate
AddMenuEventHandler( file.menu, eUIEvent.MENU_OPEN, OnViewStatsWeapons_Open )
AddMenuFooterOption( file.menu, BUTTON_B, "#B_BUTTON_BACK", "#BACK" )
}
void function OnViewStatsWeapons_Open()
{
UI_SetPresentationType( ePresentationType.NO_MODELS )
file.allMaps = GetPrivateMatchMaps()
file.gridData.numElements = file.allMaps.len()
if ( !file.isGridInitialized )
{
GridMenuInit( file.menu, file.gridData )
file.isGridInitialized = true
}
file.gridData.currentPage = 0
Grid_InitPage( file.menu, file.gridData )
Hud_SetFocused( Grid_GetButtonForElementNumber( file.menu, 0 ) )
}
bool function MapButton_Init( var button, int elemNum )
{
string mapName = file.allMaps[ elemNum ]
UpdateStatsForMap( mapName )
asset mapImage = GetMapImageForMapName( mapName )
var rui = Hud_GetRui( button )
RuiSetImage( rui, "buttonImage", mapImage )
Hud_SetEnabled( button, true )
Hud_SetVisible( button, true )
return true
}
void function MapButton_GetFocus( var button, int elemNum )
{
if ( IsControllerModeActive() )
UpdateStatsForMap( file.allMaps[ elemNum ] )
}
void function MapButton_Activate( var button, int elemNum )
{
if ( !IsControllerModeActive() )
UpdateStatsForMap( file.allMaps[ elemNum ] )
}
int function GetGameStatForMapInt( string gameStat, string mapName )
{
array<string> privateMatchModes = GetPrivateMatchModes()
int totalStat = 0
int enumCount = PersistenceGetEnumCount( "gameModes" )
for ( int modeId = 0; modeId < enumCount; modeId++ )
{
string modeName = PersistenceGetEnumItemNameForIndex( "gameModes", modeId )
totalStat += GetGameStatForMapAndModeInt( gameStat, mapName, modeName )
}
return totalStat
}
int function GetGameStatForMapAndModeInt( string gameStat, string mapName, string modeName, string difficulty = "1" )
{
string statString = GetStatVar( "game_stats", gameStat, "" )
string persistentVar = Stats_GetFixedSaveVar( statString, mapName, modeName, difficulty )
return GetUIPlayer().GetPersistentVarAsInt( persistentVar )
}
float function GetGameStatForMapFloat( string gameStat, string mapName )
{
array<string> privateMatchModes = GetPrivateMatchModes()
float totalStat = 0
int enumCount = PersistenceGetEnumCount( "gameModes" )
for ( int modeId = 0; modeId < enumCount; modeId++ )
{
string modeName = PersistenceGetEnumItemNameForIndex( "gameModes", modeId )
totalStat += GetGameStatForMapAndModeFloat( gameStat, mapName, modeName )
}
return totalStat
}
float function GetGameStatForMapAndModeFloat( string gameStat, string mapName, string modeName )
{
string statString = GetStatVar( "game_stats", gameStat, "" )
string persistentVar = Stats_GetFixedSaveVar( statString, mapName, modeName, "1" )
return expect float( GetUIPlayer().GetPersistentVar( persistentVar ) )
}
void function UpdateStatsForMap( string mapName )
{
entity player = GetUIPlayer()
if ( player == null )
return
Hud_SetText( Hud_GetChild( file.menu, "WeaponName" ), GetMapDisplayName( mapName ) )
// Image
var imageElem = Hud_GetRui( Hud_GetChild( file.menu, "WeaponImageLarge" ) )
RuiSetImage( imageElem, "basicImage", GetMapImageForMapName( mapName ) )
string timePlayed = "null"
string gamesPlayed = "null"
SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat0" ), Localize( "#STATS_HEADER_TIME_PLAYED" ), timePlayed )
SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat1" ), Localize( "#STATS_GAMES_PLAYED" ), gamesPlayed )
//SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat2" ), Localize( "#STATS_GAMES_PLAYED" ), gamesPlayed )
//SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat3" ), Localize( "#STATS_GAMES_PLAYED" ), gamesPlayed )
SetStatsLabelValue( file.menu, "KillsLabel0", Localize("#MAPS_KILLS") )
SetStatsLabelValue( file.menu, "KillsValue0", pulseParse("maps", mapName.slice(3), "kills") )
SetStatsLabelValue( file.menu, "KillsLabel1", Localize("#MAPS_DEATHS") )
SetStatsLabelValue( file.menu, "KillsValue1", pulseParse("maps", mapName.slice(3), "deaths") )
SetStatsLabelValue( file.menu, "KillsLabel2", Localize("#MAPS_TSD") )
SetStatsLabelValue( file.menu, "KillsValue2", string(int((1.905 * float(pulseParse("maps", mapName.slice(3), "total_distance") ) ) )/100) + "m" )
SetStatsLabelValue( file.menu, "KillsLabel3", Localize("#MAPS_MSD") )
SetStatsLabelValue( file.menu, "KillsValue3", string(int((1.905 * float(pulseParse("maps", mapName.slice(3), "max_distance") ) ) )/100) + "m" )
SetStatsLabelValue( file.menu, "KillsLabel4", "--" )
SetStatsLabelValue( file.menu, "KillsValue4", "--" )
//var anchorElem = Hud_GetChild( file.menu, "WeaponStatsBackground" )
//printt( Hud_GetX( anchorElem ) )
//printt( Hud_GetX( anchorElem ) )
//printt( Hud_GetX( anchorElem ) )
//printt( Hud_GetX( anchorElem ) )
//Hud_SetX( anchorElem, 0 )
//
array<string> gameModesArray = GetPersistenceEnumAsArray( "gameModes" )
array<PieChartEntry> modes
int enumCount = PersistenceGetEnumCount( "gameModes" )
table< string, array<int> > customGamemodeList = {
sns = [255, 178, 102, 255],
fw = [147, 204, 57, 255],
gg = [14, 87, 132, 255]
}
table< string, string > customGamemodeNames = {
sns = Localize("#GAMEMODE_sns")
fw = Localize("#GAMEMODE_fw")
gg = Localize("#GAMEMODE_gg")
}
for ( int modeId = 0; modeId < enumCount; modeId++ )
{
string modeName = PersistenceGetEnumItemNameForIndex( "gameModes", modeId )
if (mapName.slice(3) in pulseData["gamemodesSeparated"])
{
float modePlayedTime = 0
modePlayedTime = float(pulseParse("gamemodesSeparated", mapName.slice(3), modeName, "kills"))
if ( modePlayedTime > 0 ) {
AddPieChartEntry( modes, GameMode_GetName( modeName ), modePlayedTime, GetGameModeDisplayColor( modeName ) )
}
}
}
foreach (string key, array<int> value in customGamemodeList)
{
if (mapName.slice(3) in pulseData["gamemodesSeparated"])
{
float modePlayedTime = 0
modePlayedTime = float(pulseParse("gamemodesSeparated", mapName.slice(3), key, "kills"))
if ( modePlayedTime > 0 ) {
AddPieChartEntry( modes, customGamemodeNames[key], modePlayedTime, value)
}
}
}
const MAX_MODE_ROWS = 8
if ( modes.len() > 0 )
{
modes.sort( ComparePieChartEntryValues )
if ( modes.len() > MAX_MODE_ROWS )
{
float otherValue
for ( int i = MAX_MODE_ROWS-1; i < modes.len() ; i++ )
otherValue += modes[i].numValue
modes.resize( MAX_MODE_ROWS-1 )
AddPieChartEntry( modes, "#GAMEMODE_OTHER", otherValue, [127, 127, 127, 255] )
}
}
PieChartData modesPlayedData
modesPlayedData.entries = modes
modesPlayedData.labelColor = [ 255, 255, 255, 255 ]
SetPieChartData( file.menu, "ModesPieChart", "#KILLS_GAMEMODE", modesPlayedData )
array<string> fdMaps = GetPlaylistMaps( "fd" )
if ( 0 == 1 ) // maybe work later on some FD servers
{
array<var> pveElems = GetElementsByClassname( file.menu, "PvEGroup" )
foreach ( elem in pveElems )
{
Hud_Show( elem )
}
vector perfectColor = TEAM_COLOR_FRIENDLY / 219.0
var iconLegendRui = Hud_GetRui( Hud_GetChild( file.menu, "PvEIconLegend" ) )
RuiSetImage( iconLegendRui, "basicImage", $"rui/menu/gametype_select/playlist_fd_normal" )
RuiSetFloat3( iconLegendRui, "basicImageColor", perfectColor )
var icon0Rui = Hud_GetRui( Hud_GetChild( file.menu, "PvEIcon0" ) )
RuiSetImage( icon0Rui, "basicImage", $"rui/menu/gametype_select/playlist_fd_easy" )
int easyWins = GetGameStatForMapAndModeInt( "games_completed_fd", mapName, "fd", "0" )
SetStatsLabelValue( file.menu, "PvELabel0", "#FD_DIFFICULTY_EASY" )
SetStatsLabelValue( file.menu, "PvEValueA0", easyWins )
if ( GetGameStatForMapAndModeInt( "perfectMatches", mapName, "fd", "0" ) )
RuiSetFloat3( icon0Rui, "basicImageColor", perfectColor )
else
RuiSetFloat3( icon0Rui, "basicImageColor", easyWins > 0 ? <1, 1, 1> : <0.15, 0.15, 0.15> )
var icon1Rui = Hud_GetRui( Hud_GetChild( file.menu, "PvEIcon1" ) )
RuiSetImage( icon1Rui, "basicImage", $"rui/menu/gametype_select/playlist_fd_normal" )
int normalWins = GetGameStatForMapAndModeInt( "games_completed_fd", mapName, "fd", "1" )
SetStatsLabelValue( file.menu, "PvELabel1", "#FD_DIFFICULTY_NORMAL" )
SetStatsLabelValue( file.menu, "PvEValueA1", normalWins )
if ( GetGameStatForMapAndModeInt( "perfectMatches", mapName, "fd", "1" ) )
RuiSetFloat3( icon1Rui, "basicImageColor", perfectColor )
else
RuiSetFloat3( icon1Rui, "basicImageColor", normalWins > 0 ? <1, 1, 1> : <0.15, 0.15, 0.15> )
var icon2Rui = Hud_GetRui( Hud_GetChild( file.menu, "PvEIcon2" ) )
RuiSetImage( icon2Rui, "basicImage", $"rui/menu/gametype_select/playlist_fd_hard" )
int hardWins = GetGameStatForMapAndModeInt( "games_completed_fd", mapName, "fd", "2" )
SetStatsLabelValue( file.menu, "PvELabel2", "#FD_DIFFICULTY_HARD" )
SetStatsLabelValue( file.menu, "PvEValueA2", hardWins )
if ( GetGameStatForMapAndModeInt( "perfectMatches", mapName, "fd", "2" ) )
RuiSetFloat3( icon2Rui, "basicImageColor", perfectColor )
else
RuiSetFloat3( icon2Rui, "basicImageColor", hardWins > 0 ? <1, 1, 1> : <0.15, 0.15, 0.15> )
var icon3Rui = Hud_GetRui( Hud_GetChild( file.menu, "PvEIcon3" ) )
RuiSetImage( icon3Rui, "basicImage", $"rui/menu/gametype_select/playlist_fd_master" )
int masterWins = GetGameStatForMapAndModeInt( "games_completed_fd", mapName, "fd", "3" )
SetStatsLabelValue( file.menu, "PvELabel3", "#FD_DIFFICULTY_MASTER" )
SetStatsLabelValue( file.menu, "PvEValueA3", masterWins )
if ( GetGameStatForMapAndModeInt( "perfectMatches", mapName, "fd", "3" ) )
RuiSetFloat3( icon3Rui, "basicImageColor", perfectColor )
else
RuiSetFloat3( icon3Rui, "basicImageColor", masterWins > 0 ? <1, 1, 1> : <0.15, 0.15, 0.15> )
var icon4Rui = Hud_GetRui( Hud_GetChild( file.menu, "PvEIcon4" ) )
RuiSetImage( icon4Rui, "basicImage", $"rui/menu/gametype_select/playlist_fd_insane" )
int insaneWins = GetGameStatForMapAndModeInt( "games_completed_fd", mapName, "fd", "4" )
SetStatsLabelValue( file.menu, "PvELabel4", "#FD_DIFFICULTY_INSANE" )
SetStatsLabelValue( file.menu, "PvEValueA4", insaneWins )
if ( GetGameStatForMapAndModeInt( "perfectMatches", mapName, "fd", "4" ) )
RuiSetFloat3( icon4Rui, "basicImageColor", perfectColor )
else
RuiSetFloat3( icon4Rui, "basicImageColor", insaneWins > 0 ? <1, 1, 1> : <0.15, 0.15, 0.15> )
}
else
{
array<var> pveElems = GetElementsByClassname( file.menu, "PvEGroup" )
foreach ( elem in pveElems )
{
Hud_Hide( elem )
}
}
}
var function setit( vector color )
{
var iconLegendRui = Hud_GetRui( Hud_GetChild( file.menu, "PvEIconLegend" ) )
RuiSetImage( iconLegendRui, "basicImage", $"rui/menu/gametype_select/playlist_fd_normal" )
RuiSetFloat3( iconLegendRui, "basicImageColor", color )
}
@@ -1,206 +0,0 @@
global function InitViewStatsTimeMenu
global function AddPieChartEntry
const MAX_MODE_ROWS = 8
struct
{
var menu
array<ItemDisplayData> allTitans
table<string, array<string> > titanStatLoadout
} file
void function InitViewStatsTimeMenu()
{
var menu = GetMenu( "ViewStats_Time_Menu" )
file.menu = menu
AddMenuEventHandler( menu, eUIEvent.MENU_OPEN, OnStatsTime_Open )
AddMenuFooterOption( menu, BUTTON_B, "#B_BUTTON_BACK", "#BACK" )
}
void function OnStatsTime_Open()
{
UI_SetPresentationType( ePresentationType.NO_MODELS )
file.allTitans = GetVisibleItemsOfType( eItemTypes.TITAN )
var dataTable = GetDataTable( $"datatable/titan_properties.rpak" )
foreach ( titan in file.allTitans )
{
file.titanStatLoadout[ titan.ref ] <- []
int row = GetDataTableRowMatchingStringValue( dataTable, GetDataTableColumnByName( dataTable, "titanRef" ), titan.ref )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "primary" ) ) )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "ordnance" ) ) )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "special" ) ) )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "antirodeo" ) ) )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "coreAbility" ) ) )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "melee" ) ) )
}
UpdateViewStatsTimeMenu()
}
float function GetTitanKills( string titanName)
{
float weaponKills = 0
foreach ( weaponRef in file.titanStatLoadout[ titanName ])
{
weaponKills += float(pulseParse("weaponsLocal", weaponRef, "kills"))
}
return weaponKills
}
void function UpdateViewStatsTimeMenu()
{
entity player = GetUIPlayer()
if ( player == null )
return
//#########################################
float killsAsTitan = 0
float killsAsIon = GetTitanKills( "ion" )
killsAsTitan += killsAsIon
float killsAsScorch = GetTitanKills( "scorch" )
killsAsTitan += killsAsScorch
float killsAsNorthstar = GetTitanKills( "northstar" )
killsAsTitan += killsAsNorthstar
float killsAsRonin = GetTitanKills( "ronin" )
killsAsTitan += killsAsRonin
float killsAsTone = GetTitanKills( "tone" )
killsAsTitan += killsAsTone
float killsAsLegion = GetTitanKills( "legion" )
killsAsTitan += killsAsLegion
float killsAsMonarch = GetTitanKills( "vanguard" )
killsAsTitan += killsAsMonarch
//#########################################
// Time By Class Pie Chart
//#########################################
var totalPilotKills = 0
table playerweaponData = expect table(pulseData["weaponsLocal"])
foreach (var key, var value in playerweaponData) {
table values = expect table(value)
totalPilotKills += values["kills"]
}
float hoursAsPilot = float(totalPilotKills)
float hoursAsTitan = killsAsTitan
array<PieChartEntry> classes
if ( hoursAsPilot > 0 )
AddPieChartEntry( classes, "#STATS_HEADER_PILOT", hoursAsPilot, [61, 117, 193, 255] )
if ( hoursAsTitan > 0 )
AddPieChartEntry( classes, "#STATS_HEADER_TITAN", hoursAsTitan, [223, 94, 0, 255] )
classes.sort( ComparePieChartEntryValues )
PieChartData classTimeData
classTimeData.entries = classes
classTimeData.labelColor = [ 255, 255, 255, 255 ]
SetPieChartData( file.menu, "ClassPieChart", Localize("#TIME_KILLS_CLASS"), classTimeData )
//#########################################
// Time By Chassis Pie Chart
//#########################################
array<PieChartEntry> titans
if ( killsAsIon > 0 )
AddPieChartEntry( titans, "#TITAN_ION", killsAsIon, [200, 40, 40, 255] )
if ( killsAsScorch > 0 )
AddPieChartEntry( titans, "#TITAN_SCORCH", killsAsScorch, [223, 94, 0, 255] )
if ( killsAsNorthstar > 0 )
AddPieChartEntry( titans, "#TITAN_NORTHSTAR", killsAsNorthstar, [61, 117, 193, 255] )
if ( killsAsRonin > 0 )
AddPieChartEntry( titans, "#TITAN_RONIN", killsAsRonin, [207, 191, 59, 255] )
if ( killsAsTone > 0 )
AddPieChartEntry( titans, "#TITAN_TONE", killsAsTone, [88, 172, 67, 255] )
if ( killsAsLegion > 0 )
AddPieChartEntry( titans, "#TITAN_LEGION", killsAsLegion, [46, 188, 180, 255] )
if ( killsAsMonarch > 0 )
AddPieChartEntry( titans, "#TITAN_VANGUARD", killsAsMonarch, [151, 71, 175, 255] )
titans.sort( ComparePieChartEntryValues )
PieChartData chassisTimeData
chassisTimeData.entries = titans
chassisTimeData.labelColor = [ 255, 255, 255, 255 ]
SetPieChartData( file.menu, "ChassisPieChart", Localize("#TIME_KILLS_TITAN"), chassisTimeData )
//#########################################
// Time By Mode Pie Chart
//#########################################
array<string> gameModesArray = GetPersistenceEnumAsArray( "gameModes" )
array<PieChartEntry> modes
int enumCount = PersistenceGetEnumCount( "gameModes" )
table< string, array<int> > customGamemodeList = {
sns = [255, 178, 102, 255],
fw = [147, 204, 57, 255],
gg = [14, 87, 132, 255]
}
table< string, string > customGamemodeNames = {
sns = Localize("#GAMEMODE_sns")
fw = Localize("#GAMEMODE_fw")
gg = Localize("#GAMEMODE_gg")
}
for ( int modeId = 0; modeId < enumCount; modeId++ )
{
string modeName = PersistenceGetEnumItemNameForIndex( "gameModes", modeId )
if ( pulseParse("gamemodesAll", modeName, "kills") != 0 )
{
float modePlayedTime = 0
modePlayedTime = float(pulseParse("gamemodesAll", modeName, "kills"))
if ( modePlayedTime > 0 ) {
AddPieChartEntry( modes, GameMode_GetName( modeName ), modePlayedTime, GetGameModeDisplayColor( modeName ) )
}
}
}
foreach (string key, array<int> value in customGamemodeList)
{
if ( pulseParse("gamemodesAll", key, "kills") != 0 )
{
float modePlayedTime = 0
modePlayedTime = float(pulseParse("gamemodesAll", key, "kills"))
if ( modePlayedTime > 0 ) {
AddPieChartEntry( modes, customGamemodeNames[key], modePlayedTime, value)
}
}
}
PieChartData modesPlayedData
modesPlayedData.entries = modes
modesPlayedData.labelColor = [ 255, 255, 255, 255 ]
SetPieChartData( file.menu, "ModesPieChart", Localize("#KILLS_GAMEMODE"), modesPlayedData )
//#########################################
// Time Stats
//#########################################
SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat0" ), Localize( "#STATS_HEADER_TIME_PLAYED" ), StatToTimeString( "time_stats", "hours_total" ) )
SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat1" ), Localize( "#STATS_HEADER_TIME_IN_AIR" ), StatToTimeString( "time_stats", "hours_inAir" ) )
SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat2" ), Localize( "#STATS_HEADER_TIME_WALLRUNNING" ), StatToTimeString( "time_stats", "hours_wallrunning" ) )
}
void function AddPieChartEntry( array<PieChartEntry> entries, string displayName, float numValue, array<int> color )
{
PieChartEntry newEntry
newEntry.displayName = displayName
newEntry.numValue = numValue
newEntry.color = color
entries.append( newEntry )
}
@@ -1,227 +0,0 @@
//TODO: Kills Per Minute stat
global function InitViewStatsTitansMenu
struct
{
var menu
var[NUM_PERSISTENT_TITAN_LOADOUTS] buttons
array<ItemDisplayData> allTitans
table<string, array<string> > titanStatLoadout
} file
void function InitViewStatsTitansMenu()
{
var menu = GetMenu( "ViewStats_Titans_Menu" )
file.menu = menu
Hud_SetText( Hud_GetChild( file.menu, "MenuTitle" ), "#STATS_TITANS" )
AddMenuEventHandler( file.menu, eUIEvent.MENU_OPEN, OnViewStatsTitans_Open )
for ( int i = 0; i < NUM_PERSISTENT_TITAN_LOADOUTS; i++ )
{
var button = Hud_GetChild( menu, "Button" + i )
//button.s.rowIndex <- i
//Hud_AddEventHandler( button, UIE_CLICK, OnButton_Activate )
Hud_AddEventHandler( button, UIE_GET_FOCUS, OnButton_Focused )
file.buttons[i] = button
}
AddMenuFooterOption( file.menu, BUTTON_B, "#B_BUTTON_BACK", "#BACK" )
}
void function OnViewStatsTitans_Open()
{
UI_SetPresentationType( ePresentationType.STORE_PRIME_TITANS )
RunMenuClientFunction( "UpdateTitanModel", 0 )
// Get Titan list
file.allTitans = GetVisibleItemsOfType( eItemTypes.TITAN )
var dataTable = GetDataTable( $"datatable/titan_properties.rpak" )
foreach ( titan in file.allTitans )
{
file.titanStatLoadout[ titan.ref ] <- []
int row = GetDataTableRowMatchingStringValue( dataTable, GetDataTableColumnByName( dataTable, "titanRef" ), titan.ref )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "primary" ) ) )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "ordnance" ) ) )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "special" ) ) )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "antirodeo" ) ) )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "coreAbility" ) ) )
file.titanStatLoadout[ titan.ref ].append( GetDataTableString( dataTable, row, GetDataTableColumnByName( dataTable, "melee" ) ) )
}
UpdateButtons( 0, file.buttons )
UpdateStatsForTitan( file.allTitans[ 0 ].ref, 0 )
}
void function UpdateButtons( int selectedIndex, var[NUM_PERSISTENT_TITAN_LOADOUTS] buttons )
{
foreach ( index, button in buttons )
{
TitanLoadoutDef loadout = GetCachedTitanLoadout( index )
RHud_SetText( button, GetTitanLoadoutName( loadout ) )
Hud_SetEnabled( button, true )
Hud_SetVisible( button, true )
}
}
//void function OnButton_Activate( var button )
//{
// int id = int( Hud_GetScriptID( button ) )
// if ( !IsControllerModeActive() )
// UpdateStatsForTitan( file.allTitans[ id ].ref, id )
//}
void function OnButton_Focused( var button )
{
int id = int( Hud_GetScriptID( button ) )
//if ( IsControllerModeActive() )
UpdateStatsForTitan( file.allTitans[ id ].ref, id )
}
void function UpdateStatsForTitan( string titanRef, int loadoutIndex )
{
entity player = GetUIPlayer()
if ( player == null )
return
RunMenuClientFunction( "UpdateTitanModel", loadoutIndex )
RunMenuClientFunction( "UpdateStorePrimeBg", loadoutIndex )
// Name
Hud_SetText( Hud_GetChild( file.menu, "TitanName" ), GetItemName( titanRef ) )
// Locked info
var lockLabel = GetElementsByClassname( file.menu, "LblTitanLocked" )[0]
if ( IsItemLocked( player, titanRef ) )
{
Hud_SetText( lockLabel, "#LOUADOUT_UNLOCK_REQUIREMENT_LEVEL", GetUnlockLevelReq( titanRef ) )
Hud_Show( lockLabel )
}
else
{
Hud_Hide( lockLabel )
}
string timeUsed = StatToTimeString( "time_stats", "hours_as_titan_" + titanRef )
int shotsHit
foreach ( weaponRef in file.titanStatLoadout[ titanRef ] )
shotsHit += GetPlayerStatInt( player, "weapon_stats", "shotsHit", weaponRef )
int coresEarned = GetPlayerStatInt( player, "titan_stats", "coresEarned", titanRef )
int crits
bool critsApplicable = false
foreach ( weaponRef in file.titanStatLoadout[ titanRef ] )
{
if ( GetWeaponInfoFileKeyField_Global( weaponRef, "critical_hit" ) == true )
{
critsApplicable = true
crits += GetPlayerStatInt( player, "weapon_stats", "critHits", weaponRef )
}
}
string critHitsValue = Localize( "#STATS_NOT_APPLICABLE" )
if ( critsApplicable )
critHitsValue = string( crits )
SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat0" ), Localize( "#STATS_HEADER_TIME_USED" ), timeUsed )
SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat1" ), Localize( "#STATS_HEADER_SHOTS_HIT" ), string( shotsHit ) )
SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat2" ), Localize( "#STATS_HEADER_CORES_EARNED" ), string( coresEarned ) )
SetStatBoxDisplay( Hud_GetChild( file.menu, "Stat3" ), Localize( "#STATS_HEADER_CRITICAL_HITS" ), critHitsValue )
string nextUnlockRef = GetNextUnlockForTitanLevel( player, titanRef, TitanGetRawLevel( player, titanRef ) + 1 )
if ( nextUnlockRef != "" )
{
var rui = Hud_GetRui( Hud_GetChild( file.menu, "NextUnlock" ) )
if ( nextUnlockRef == "random" )
{
RuiSetString( rui, "unlockName", "" )
RuiSetImage( rui, "unlockImage", $"rui/menu/common/unlock_random" )
}
else
{
ItemDisplayData displayData
if ( IsSubItemType( GetItemType( nextUnlockRef ) ) )
displayData = GetItemDisplayData( nextUnlockRef, titanRef )
else
displayData = GetItemDisplayData( nextUnlockRef )
RuiSetString( rui, "unlockName", displayData.name )
RuiSetImage( rui, "unlockImage", displayData.image )
vector aspect = GetItemImageAspect( nextUnlockRef )
float mult = 1.0
if ( aspect.x > aspect.y )
mult = 120.0 / aspect.x
else
mult = 120.0 / aspect.y
aspect.x *= mult
aspect.y *= mult
RuiSetFloat2( rui, "unlockImageSize", aspect )
}
}
int totalKills
int pilotKills
int titanKills
int aiKills
foreach ( weaponRef in file.titanStatLoadout[ titanRef ] )
{
totalKills += pulseParse("weaponsLocal", weaponRef, "kills")
pilotKills += GetPlayerStatInt( player, "weapon_kill_stats", "pilots", weaponRef )
titanKills += GetPlayerStatInt( player, "weapon_kill_stats", "titansTotal", weaponRef )
aiKills += GetPlayerStatInt( player, "weapon_kill_stats", "ai", weaponRef )
}
// Total Kills Stats
SetStatsLabelValue( file.menu, "KillsValue0", totalKills )
SetStatsLabelValue( file.menu, "KillsValue1", pilotKills )
SetStatsLabelValue( file.menu, "KillsValue2", titanKills )
SetStatsLabelValue( file.menu, "KillsValue3", aiKills )
}
asset function GetTitanStatImage( string titanRef )
{
asset image
switch ( titanRef )
{
case "ion":
image = $"r2_ui/menus/loadout_icons/titans/ion_icon"
break
case "scorch":
image = $"r2_ui/menus/loadout_icons/titans/scorch_icon"
break
case "northstar":
image = $"r2_ui/menus/loadout_icons/titans/northstar_icon"
break
case "ronin":
image = $"r2_ui/menus/loadout_icons/titans/ronin_icon"
break
case "tone":
image = $"r2_ui/menus/loadout_icons/titans/tone_icon"
break
case "legion":
image = $"r2_ui/menus/loadout_icons/titans/legion_icon"
break
case "vanguard":
image = $"r2_ui/menus/loadout_icons/titans/vanguard_icon"
break
}
return image
}