1
0
KF2-Dev-Scripts/KFGame/Classes/KFGFxHUD_ScoreboardWidget.uc
2021-06-23 01:34:46 +03:00

246 lines
7.6 KiB
Ucode

//=============================================================================
// KFGFxHUD_ScoreboardWidget
//=============================================================================
// Displays a list of all active players on the server (not spectators) and
// prints out vital information such as their Kills, Dosh, Health, Perks, etc.
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
// - Alex Quick 6/9/2014
//=============================================================================
class KFGFxHUD_ScoreboardWidget extends GFxObject;
// Performance optimization - Only update list while the scoreboard is visible.
var bool bUpdateScoreboard;
// Interval between scoreboard updates. Higher values mean less frequent updates.
var const float ScoreboardUpdateInterval;
// Last time we performed an update on this scoreboard's info.
var Protected float LastScoreboardUpdateTime;
//This item will contain the match information.
var KFGFxHUD_ScoreboardMapInfoContainer MatchInfoContainer;
var array<KFPlayerReplicationinfo> CurrentPlayerList;
var localized string PlayerString;
var localized string DoshString;
var localized string KillsString;
var localized string AssistsString;
var localized string PingString;
function InitializeHUD()
{
LocalizeText();
UpdatePlayerList();
UpdateMatchInfo();
SendServerInfoToGFX();
}
function LocalizeText()
{
local GFxObject LocalizedObject;
LocalizedObject = CreateObject( "Object" );
LocalizedObject.SetString("playerText", PlayerString);
LocalizedObject.SetString("doshText", DoshString);
LocalizedObject.SetString("killsText", KillsString);
LocalizedObject.SetString("assistsText", AssistsString);
LocalizedObject.SetString("pingText", PingString);
SetObject("localizeText", LocalizedObject);
}
function SendServerInfoToGFX()
{
local WorldInfo WI;
local GFxObject ServerObject;
WI = class'WorldInfo'.static.GetWorldInfo();
ServerObject = CreateObject( "Object" );
if(WI != none && WI.NetMode != NM_Standalone )
{
if(WI.GRI != none)
{
ServerObject.SetString("serverName", WI.GRI.ServerName);
}
//ServerObject.SetString("serverIP", WI.GetAddressURL());
}
SetObject("serverInfo", ServerObject);
}
/** Ties the GFxClikWidget variables to the .swf components and handles events */
event bool WidgetInitialized(name WidgetName, name WidgetPath, GFxObject Widget)
{
switch (WidgetName)
{
case ( 'ScoreboardMapInfo' ):
if(MatchInfoContainer == none)
{
MatchInfoContainer = KFGFxHUD_ScoreboardMapInfoContainer(Widget);
MatchInfoContainer.InitializeHUD();
}
break;
}
return true;
}
function TickHud(float DeltaTime)
{
if(bUpdateScoreboard &&
GetPC() != none &&
GetPC().WorldInfo.TimeSeconds - LastScoreboardUpdateTime > ScoreboardUpdateInterval)
{
LastScoreboardUpdateTime = GetPC().WorldInfo.TimeSeconds; // throttle the updates so we're not spamming Actionscript with data.
UpdatePlayerList();
UpdateMatchInfo();
SendServerInfoToGFX();
}
}
function ForceUpdateNextFrame()
{
// Reset this time so the next TickHud, it'll force an update
LastScoreboardUpdateTime = 0;
}
function SetOpen(bool bOpen)
{
SetBool("showScore", bOpen);
}
// Elapsed time, difficulty, map name.
function UpdateMatchInfo()
{
if(MatchInfoContainer != none)
{
MatchInfoContainer.UpdateMatchInfo();
MatchInfoContainer.UpdateWaveCount();
}
}
function UpdatePlayerList()
{
local KFGameReplicationInfo KFGRI;
KFGRI = KFGameReplicationInfo(GetPC().Worldinfo.GRI);
if(KFGRI != none)
{
KFGRI.GetKFPRIArray(CurrentPlayerList);
SortPlayerList(CurrentPlayerList);
UpdatePlayerData();
}
}
function SortPlayerList(out array<KFPlayerReplicationinfo> PlayerList)
{
local int i, j, HighestScore, HighestScoreIndex;
local KFPlayerReplicationinfo TempPRI;
// Perform a selection sort on the PRIArray by Score
for ( i = 0; i < PlayerList.Length; i++ )
{
HighestScore = -1000000000;
for ( j = i; j < PlayerList.Length; j++ )
{
if ( PlayerList[j].Kills > HighestScore )
{
HighestScore = PlayerList[j].Kills;
HighestScoreIndex = j;
}
else if(PlayerList[j].Kills == HighestScore)
{
if(PlayerList[j].Assists > PlayerList[HighestScoreIndex].Assists)
{
HighestScore = PlayerList[j].Kills;
HighestScoreIndex = j;
}
}
}
TempPRI = PlayerList[i];
PlayerList[i] = PlayerList[HighestScoreIndex];
PlayerList[HighestScoreIndex] = TempPRI;
}
}
function UpdatePlayerData()
{
local GFxObject DataProvider,TempData, PerkIconObject;
local int i;
local KFPlayerReplicationinfo KFPRI;
local KFGameReplicationInfo KFGRI;
local KFPlayerController KFPC;
local int PlayerIndex;
KFPC = KFPlayerController(GetPC());
KFGRI = KFGameReplicationInfo(GetPC().Worldinfo.GRI);
PlayerIndex=0;
DataProvider = CreateArray();
for(i = 0 ; i < CurrentPlayerList.length; i ++)
{
KFPRI = CurrentPlayerList[i];
if(KFPRI.GetTeamNum() != 255 && (KFPRI.bHasSpawnedIn || (KFGRI != none && KFGRI.bVersusGame)))
{
TempData = CreateObject("Object");
TempData.SetString("playername", KFPRI.PlayerName);
TempData.SetInt("dosh", KFPRI.Score);
TempData.SetInt("assists", KFPRI.Assists);
TempData.SetInt("kills", KFPRI.Kills);
TempData.SetInt("ping", KFPRI.Ping * `PING_SCALE);
TempData.SetInt("perkLevel", KFPRI.GetActivePerkLevel());
TempData.SetInt("prestigeLevel", KFPRI.GetActivePerkPrestigeLevel());
if( KFPRI.CurrentPerkClass != none )
{
TempData.SetString("perkName", KFPRI.CurrentPerkClass.default.PerkName);
PerkIconObject = CreateObject("Object");
PerkIconObject.SetString("perkIcon", "img://"$KFPRI.CurrentPerkClass.static.GetPerkIconPath());
PerkIconObject.SetString("prestigeIcon", KFPRI.CurrentPerkClass.static.GetPrestigeIconPath(KFPRI.GetActivePerkPrestigeLevel()));
TempData.SetObject("iconPath", PerkIconObject);
}
if( class'WorldInfo'.static.IsConsoleBuild( CONSOLE_Orbis ) )
{
TempData.SetString("avatar", "img://"$KFPC.GetPS4Avatar(KFPRI.PlayerName));
}
else
{
TempData.SetString("avatar", "img://"$KFPC.GetSteamAvatar(KFPRI.UniqueId));
}
if(KFPRI.PlayerHealth < 0)
{
TempData.SetFloat("health", 0);
TempData.SetFloat("healthPercent", 0);
}
else
{
TempData.SetFloat("health", KFPRI.PlayerHealth);
TempData.SetFloat("healthPercent", ByteToFloat(KFPRI.PlayerHealthPercent) * 100);
}
DataProvider.SetElementObject(PlayerIndex,TempData);
PlayerIndex++;
}
}
SetObject("playerData", DataProvider);
}
defaultproperties
{
ScoreboardUpdateInterval=1.f
SubWidgetBindings.Add((WidgetName="ScoreboardMapInfo",WidgetClass=class'KFGFxHUD_ScoreboardMapInfoContainer'))
}