class UI_Scoreboard_CD extends UI_Scoreboard; var transient float AdminXPos, PerkXPos, PlayerXPos, StateXPos, TimeXPos; var int MaxPlayerCount; var localized string HeaderPerkText; var localized string HeaderStateText; var localized string HeaderRankText; var localized string DeveloperText; var localized string VoteKickText; function FRowItem NewFRowItem(string Text, bool isSplitter) { local FRowItem newItem; newItem.Text=Text; newItem.bSplitter=isSplitter; return newItem; } function InitMenu() { Super.InitMenu(); SpecButton.ButtonText=SpecButtonText; SpecButton.Tooltip=SpecButtonTooltip; PlayerContext.ItemRows.AddItem(NewFRowItem(SpectateThisPlayerText, false)); PlayerContext.ItemRows.AddItem(NewFRowItem(ViewPlayerProfileText, false)); PlayerContext.ItemRows.AddItem(NewFRowItem(MuteText, false)); PlayerContext.ItemRows.AddItem(NewFRowItem(VoteKickText, false)); PlayerContext.ItemRows.AddItem(NewFRowItem("", true)); } static final function string FormatTimeSMH (float Sec) { local int Hours, Seconds, Minutes; Sec = Abs (Sec); Seconds = int (Sec); Minutes = Seconds / 60; Seconds -= Minutes * 60; Hours = Minutes / 60; return ((Hours < 1) ? "0" $Hours : string (Hours)) @":" @((Minutes < 10) ? "0" $Minutes : string (Minutes)) @":" @((Seconds < 10) ? "0" $Seconds : string (Seconds)); } function DrawMenu() { local string S; local PlayerController PC; local PlayerReplicationInfo PRI; local ExtPlayerReplicationInfo KFPRI; local float XPos, YPos, XL, YL, FontScalar, XPosCenter, CurrentBoxY; local int i, j, NumSpec, NumPlayer, NumAlivePlayer, Width, NotShownCount; local byte DefFont; PC = GetPlayer (); if (KFGRI == None) { KFGRI = KFGameReplicationInfo (PC.WorldInfo.GRI); if (KFGRI == None) return; } // Sort player list. for (i = (KFGRI.PRIArray.Length - 1); i > 0; --i) { for (j = i - 1; j >= 0; --j) { if (!InOrder (KFGRI.PRIArray [i], KFGRI.PRIArray [j])) { PRI = KFGRI.PRIArray [i]; KFGRI.PRIArray [i] = KFGRI.PRIArray [j]; KFGRI.PRIArray [j] = PRI; } } } // Check players. NumPlayer = 0; for (i = (KFGRI.PRIArray.Length - 1); i >= 0; --i) { KFPRI = ExtPlayerReplicationInfo (KFGRI.PRIArray [i]); if (KFPRI == None) continue; if (KFPRI.bOnlySpectator) { ++NumSpec; continue; } if (KFPRI.PlayerHealth > 0 && KFPRI.PlayerHealthPercent > 0 && KFPRI.GetTeamNum () == 0) ++NumAlivePlayer; ++NumPlayer; } //`Log ("DrawMenu (): PlayList.Length = " @PRIList.Length); // Header font info. DefFont = Owner.CurrentStyle.DefaultFontSize; Canvas.Font = Owner.CurrentStyle.PickFont(DefFont, FontScalar); YL = Owner.CurrentStyle.DefaultHeight; XPosCenter = (Canvas.ClipX * 0.5); // ServerName XPos = XPosCenter; YPos = Canvas.ClipY * 0.05; S = " " $KFGRI.ServerName $" "; Canvas.TextSize (S, XL, YL, FontScalar, FontScalar); XPos -= (XL * 0.5); Canvas.SetDrawColor (10, 10, 10, 200); Owner.CurrentStyle.DrawRectBox (XPos, YPos, XL, YL, 4); Canvas.DrawColor = MakeColor (250, 0, 0, 255); XPos += 5; S = KFGRI.ServerName; Canvas.SetPos (XPos, YPos); Canvas.DrawText (S, , FontScalar, FontScalar); // Deficulty | Wave | MapName | ElapsedTime XPos = XPosCenter; YPos += YL; S = " " $Class'KFCommon_LocalizedStrings'.Static.GetDifficultyString (KFGRI.GameDifficulty) $" | WAVE " $KFGRI.WaveNum $" | " $PC.WorldInfo.Title $" | 00 : 00 : 00 "; Canvas.TextSize (S, XL, YL, FontScalar, FontScalar); XPos -= (XL * 0.5); Canvas.SetDrawColor (10, 10, 10, 200); Owner.CurrentStyle.DrawRectBox (XPos, YPos, XL, YL, 4); Canvas.DrawColor = MakeColor (0, 250, 0, 255); XPos += 5; S = Class'KFCommon_LocalizedStrings'.Static.GetDifficultyString (KFGRI.GameDifficulty); Canvas.SetPos (XPos, YPos); Canvas.DrawText (S, , FontScalar, FontScalar); Canvas.TextSize (S, XL, YL, FontScalar, FontScalar); XPos += XL; S = " | "$HeaderWaveText$" " $KFGRI.WaveNum; Canvas.SetPos (XPos, YPos); Canvas.DrawText (S, , FontScalar, FontScalar); Canvas.TextSize (S, XL, YL, FontScalar, FontScalar); XPos += XL; S = " | " $class'KFCommon_LocalizedStrings'.static.GetFriendlyMapName(PC.WorldInfo.GetMapName(true)); Canvas.SetPos (XPos, YPos); Canvas.DrawText (S, , FontScalar, FontScalar); Canvas.TextSize (S, XL, YL, FontScalar, FontScalar); XPos += XL; S = " | " $FormatTimeSMH (KFGRI.ElapsedTime); Canvas.SetPos (XPos, YPos); Canvas.DrawText (S, , FontScalar, FontScalar); // Players | Alive | Spectators XPos = XPosCenter; YPos += YL; S = " "$PlayersText$" : " $NumPlayer $" | "$AliveText$" : " $NumAlivePlayer $" | "$SpectatorsText$" : " $NumSpec $" "; Canvas.TextSize (S, XL, YL, FontScalar, FontScalar); XPos -= (XL * 0.5); Canvas.SetDrawColor (10, 10, 10, 200); Owner.CurrentStyle.DrawRectBox (XPos, YPos, XL, YL, 4); Canvas.DrawColor = MakeColor (250, 250, 0, 255); XPos += 5; S = PlayersText$" : " $NumPlayer; Canvas.SetPos (XPos, YPos); Canvas.DrawText (S, , FontScalar, FontScalar); Canvas.TextSize (S, XL, YL, FontScalar, FontScalar); XPos += XL; S = " | "$AliveText$" : " $NumAlivePlayer; Canvas.SetPos (XPos, YPos); Canvas.DrawText (S, , FontScalar, FontScalar); Canvas.TextSize (S, XL, YL, FontScalar, FontScalar); XPos += XL; S = " | "$SpectatorsText$" : " $NumSpec; Canvas.SetPos (XPos, YPos); Canvas.DrawText (S, , FontScalar, FontScalar); Width = Canvas.ClipX * 0.7; XPos = (Canvas.ClipX - Width) * 0.5; YPos += YL * 2.0; Canvas.SetDrawColor (10, 10, 10, 200); Owner.CurrentStyle.DrawRectBox (XPos, YPos, Width, YL, 4); Canvas.DrawColor = MakeColor (250, 250, 250, 255); // Calc X offsets AdminXPos = Width * 0.0; PerkXPos = Width * 0.1; PlayerXPos = Width * 0.3; KillsXPos = Width * 0.5; AssistXPos = Width * 0.6; CashXPos = Width * 0.7; StateXPos = Width * 0.8; PingXPos = Width * 0.95; // Header texts if( !bShowSpectatorsOnly ) { Canvas.SetPos (XPos + PerkXPos, YPos); Canvas.DrawText (HeaderPerkText, , FontScalar, FontScalar); Canvas.SetPos (XPos + KillsXPos, YPos); Canvas.DrawText (HeaderKillsText, , FontScalar, FontScalar); Canvas.SetPos (XPos + AssistXPos, YPos); Canvas.DrawText (HeaderAssistText, , FontScalar, FontScalar); Canvas.SetPos (XPos + CashXPos, YPos); Canvas.DrawText (HeaderDoshText, , FontScalar, FontScalar); Canvas.SetPos (XPos + StateXPos, YPos); Canvas.DrawText (HeaderStateText, , FontScalar, FontScalar); } Canvas.SetPos (XPos, YPos); Canvas.DrawText (HeaderRankText, , FontScalar, FontScalar); Canvas.SetPos (XPos + PlayerXPos, YPos); Canvas.DrawText (HeaderPlayerText, , FontScalar, FontScalar); Canvas.SetPos (XPos + PingXPos, YPos); Canvas.DrawText (HeaderPingText, , FontScalar, FontScalar); PRIList.Length = (bShowSpectatorsOnly ? NumSpec : NumPlayer); j = PRIList.Length; for( i=(KFGRI.PRIArray.Length-1); i>=0; --i ) { KFPRI = ExtPlayerReplicationInfo(KFGRI.PRIArray[i]); if( KFPRI!=None && bShowSpectatorsOnly==KFPRI.bOnlySpectator ) { PRIList[--j] = KFPRI; if( KFPRI==PC.PlayerReplicationInfo ) PlayerIndex = j; } } CurrentBoxY = (YL + 4) * MaxPlayerCount; while( CurrentBoxY > (Canvas.ClipY-YPos) ) { if( ++i>=5 ) { NotShownCount = MaxPlayerCount-int((Canvas.ClipY-YPos)/CurrentBoxY)+1; MaxPlayerCount-=NotShownCount; break; } } PlayersList.XPosition = ((Canvas.ClipX - Width) * 0.5) / InputPos[2]; PlayersList.YPosition = (YPos + (YL + 4)) / InputPos[3]; PlayersList.XSize = (Width * 1.022) / InputPos[2]; PlayersList.YSize = CurrentBoxY / InputPos[3]; PlayersList.ListItemsPerPage = MaxPlayerCount; PlayersList.ChangeListSize(PRIList.Length); } function DrawPlayerEntry( Canvas C, int Index, float YOffset, float Height, float Width, bool bFocus ) { local float FontScalar; local ExtPlayerReplicationInfo KFPRI; local string S, StrValue; local byte DefFont; local int Ping; KFPRI = PRIList[Index]; bFocus = bFocus || (bHasSelectedPlayer && RightClickPlayer==KFPRI); DefFont = Owner.CurrentStyle.DefaultFontSize; C.Font = Owner.CurrentStyle.PickFont(DefFont, FontScalar); if (KFPRI == GetPlayer().PlayerReplicationInfo) { if( bFocus ) C.SetDrawColor(0, 83, 255, 150); else C.SetDrawColor (51, 30, 101, 150); } else { if( bFocus ) C.SetDrawColor(0, 83, 255, 150); else C.SetDrawColor (30, 30, 30, 150); } Owner.CurrentStyle.DrawRectBox (0.f, YOffset, Width, Height, 4); C.DrawColor = MakeColor (250, 250, 250, 255); // Perk if( !bShowSpectatorsOnly ) { C.DrawColor = KFPRI.HUDPerkColor; if( KFPRI.ECurrentPerk!=None ) { C.SetPos (0.f + PerkXPos, YOffset + 2.5); C.DrawRect (Height-5, Height-5, KFPRI.ECurrentPerk.Default.PerkIcon); S = KFPRI.GetPerkLevelStr()@KFPRI.ECurrentPerk.Default.PerkName; C.SetPos (0.f + PerkXPos + Height, YOffset); C.DrawText (S, , FontScalar, FontScalar); } else if( KFPRI.bBot && KFPRI.CurrentPerkClass!=None ) { C.SetPos (0.f + PerkXPos, YOffset + 2.5); C.DrawRect (Height-5, Height-5, KFPRI.CurrentPerkClass.Default.PerkIcon); S = KFPRI.CurrentPerkClass.Default.PerkName; C.SetPos (0.f + PerkXPos + Height, YOffset); C.DrawText (S, , FontScalar, FontScalar); } else { C.DrawColor = MakeColor (250, 250, 250, 255); S = NoPerkText; C.SetPos (0.f + PerkXPos + Height, YOffset); C.DrawText (S, , FontScalar, FontScalar); } } // Avatar if( KFPRI.Avatar!=None ) { C.SetDrawColor(255,255,255,255); C.SetPos(0.f + PlayerXPos - (Height * 1.2), YOffset); C.DrawTile(KFPRI.Avatar,Height,Height,0,0,KFPRI.Avatar.SizeX,KFPRI.Avatar.SizeY); } else { // Try to obtain avatar. if( !KFPRI.bBot ) KFPRI.Avatar = FindAvatar(KFPRI.UniqueId); } // Rank if( KFPRI.ShowAdminName() ) { S = KFPRI.GetAdminName(); C.DrawColor = KFPRI.GetAdminColorC(); } else if( KFPRI.bIsDev ) { S = DeveloperText; C.DrawColor = MakeColor(130,255,235,255); } else { S = PlayerText; C.DrawColor = MakeColor(255,255,255,255); } // Rank C.SetPos (0.f + AdminXPos, YOffset); C.DrawText (S, , FontScalar, FontScalar); // Player C.SetPos (0.f + PlayerXPos, YOffset); C.DrawText (KFPRI.PlayerName, , FontScalar, FontScalar); C.DrawColor = MakeColor(255,255,255,255); if( !bShowSpectatorsOnly ) { // Kill C.SetDrawColor(255,51,51,255); C.SetPos (0.f + KillsXPos, YOffset); C.DrawText (string (KFPRI.Kills), , FontScalar, FontScalar); // Assist C.SetDrawColor(255,255,51,255); C.SetPos (0.f + AssistXPos, YOffset); C.DrawText (string (KFPRI.Assists), , FontScalar, FontScalar); // Dosh C.SetDrawColor(51,255,51,255); C.SetPos (0.f + CashXPos, YOffset); StrValue = ConvertValueLarge(KFPRI.Score); C.DrawText (StrValue, , FontScalar, FontScalar); // State if (KFPRI.PlayerHealth <= 0 || KFPRI.PlayerHealthPercent <= 0) { C.DrawColor = MakeColor (250, 0, 0, 255); S = DeadText; } else { if (KFPRI.PlayerHealth >= 80) C.DrawColor = MakeColor (0, 250, 0, 255); else if (KFPRI.PlayerHealth >= 30) C.DrawColor = MakeColor (250, 250, 0, 255); else C.DrawColor = MakeColor (250, 100, 100, 255); S = string (KFPRI.PlayerHealth) @"HP"; } C.SetPos (0.f + StateXPos, YOffset); C.DrawText (S, , FontScalar, FontScalar); C.DrawColor = MakeColor (250, 250, 250, 255); } // Ping if (KFPRI.bBot) S = "-"; else { Ping = int(KFPRI.Ping * `PING_SCALE); if (Ping <= 100) C.DrawColor = MakeColor (0, 250, 0, 255); else if (Ping <= 200) C.DrawColor = MakeColor (250, 250, 0, 255); else C.DrawColor = MakeColor (250, 100, 100, 255); S = string(Ping); } C.SetPos (0.f + PingXPos, YOffset); C.DrawText (S, , FontScalar, FontScalar); } function ShowPlayerTooltip( int Index ) { local ExtPlayerReplicationInfo PRI; local string S; PRI = PRIList[Index]; if( PRI!=None ) { if( ToolTipItem==None ) { ToolTipItem = New(None)Class'KFGUI_Tooltip_CD'; ToolTipItem.Owner = Owner; ToolTipItem.ParentComponent = Self; ToolTipItem.InitMenu(); } S = PlayerText$": "$PRI.TaggedPlayerName$"|"$HealthText$": "$(PRI.PlayerHealthPercent<=0 ? "0" : string(PRI.PlayerHealth)); if( PRI.ShowAdminName() ) S = S$"|"$PRI.GetAdminName(); S = S$"|"$RClickForOptsText; ToolTipItem.SetText(S); ToolTipItem.ShowMenu(); ToolTipItem.CompPos[0] = Owner.MousePosition.X; ToolTipItem.CompPos[1] = Owner.MousePosition.Y; ToolTipItem.GetInputFocus(); } } function string ConvertValueLarge(int FValue) { local string StrValue, StrType; local float FltValue; local int i; FltValue = float(FValue); StrValue = string(FltValue); if(FltValue < 10000.f) { StrValue = string(int(FltValue)); StrType = ""; } else if(FltValue < 1000000.f) { StrValue = string(FltValue / 1000);//.0 StrType = "k"; } else { StrValue = string(FltValue / 1000000);//.0 StrType = "m"; } i = InStr(StrValue,"."); if(i != -1 && StrType != "") return Left(StrValue,i+2) $ StrType; return StrValue; } function SelectedRCItem( int Index ) { local PlayerController PC; local KFPlayerReplicationInfo KFPRI; PC = GetPlayer(); KFPRI = KFPlayerReplicationInfo(PC.PlayerReplicationInfo); switch( Index ) { case 3: // Vote kick. KFPRI.ServerStartKickVote(RightClickPlayer, KFPRI); break; default: Super.SelectedRCItem(Index); break; } } defaultproperties { MaxPlayerCount=25 Components.Empty Begin Object Class=KFGUI_List_CD Name=PlayerList bDrawBackground=false OnDrawItem=DrawPlayerEntry OnClickedItem=ClickedPlayer ID="PlayerList" bClickable=true OnMouseRest=ShowPlayerTooltip End Object Begin Object Class=KFGUI_Button_CD Name=B_ShowSpecs ID="Spec" XPosition=0.67 YPosition=0.965 XSize=0.09 YSize=0.03 OnClickLeft=ButtonClicked OnClickRight=ButtonClicked End Object Components.Add(PlayerList) Components.Add(B_ShowSpecs) Begin Object Class=KFGUI_RightClickMenu_CD Name=PlayerContextMenu OnSelectedItem=SelectedRCItem OnBecameHidden=HidRightClickMenu End Object PlayerContext=PlayerContextMenu }