Ulysses
Ulysses Stuff => Releases => Topic started by: Mors Quaedam on November 04, 2012, 10:12:39 AM
-
I suck at making addons, and to be honest I couldn't even work this one out - but here it is. A hacky scoreboard workaround - because nobody else has fixed the sui scoreboards and I have no idea how to (although I've tried)
Replace the code in your orangebox\garrysmod\gamemodes\base\gamemode\cl_scoreboard.lua with my code.
You should back the file up before using my version, in case you want to change back.
(http://puu.sh/1mp83)
surface.CreateFont( "ScoreboardDefault",
{
font = "Helvetica",
size = 22,
weight = 800
})
surface.CreateFont( "ScoreboardDefaultTitle",
{
font = "Helvetica",
size = 32,
weight = 800
})
--
-- This defines a new panel type for the player row. The player row is given a player
-- and then from that point on it pretty much looks after itself. It updates player info
-- in the think function, and removes itself when the player leaves the server.
--
local PLAYER_LINE =
{
Init = function( self )
self.AvatarButton = self:Add( "DButton" )
self.AvatarButton:Dock( LEFT )
self.AvatarButton:SetSize( 32, 32 )
self.AvatarButton.DoClick = function() self.Player:ShowProfile() end
self.Avatar = vgui.Create( "AvatarImage", self.AvatarButton )
self.Avatar:SetSize( 32, 32 )
self.Avatar:SetMouseInputEnabled( false )
self.Name = self:Add( "DLabel" )
self.Name:Dock( FILL )
self.Name:SetFont( "ScoreboardDefault" )
self.Name:DockMargin( 8, 0, 0, 0 )
self.Rank = self:Add( "DLabel" )
self.Rank:Dock( FILL )
self.Rank:SetFont( "ScoreboardDefault" )
self.Rank:DockMargin( 300, 0, 0, 0 )
self.Mute = self:Add( "DImageButton" )
self.Mute:SetSize( 32, 32 )
self.Mute:Dock( RIGHT )
self.Ping = self:Add( "DLabel" )
self.Ping:Dock( RIGHT )
self.Ping:SetWidth( 50 )
self.Ping:SetFont( "ScoreboardDefault" )
self.Ping:SetContentAlignment( 5 )
self.Deaths = self:Add( "DLabel" )
self.Deaths:Dock( RIGHT )
self.Deaths:SetWidth( 50 )
self.Deaths:SetFont( "ScoreboardDefault" )
self.Deaths:SetContentAlignment( 5 )
self.Kills = self:Add( "DLabel" )
self.Kills:Dock( RIGHT )
self.Kills:SetWidth( 50 )
self.Kills:SetFont( "ScoreboardDefault" )
self.Kills:SetContentAlignment( 5 )
self:Dock( TOP )
self:DockPadding( 3, 3, 3, 3 )
self:SetHeight( 32 + 3*2 )
self:DockMargin( 2, 0, 2, 2 )
end,
Setup = function( self, pl )
self.Player = pl
self.Avatar:SetPlayer( pl )
self.Name:SetText( pl:Nick() )
self.Rank:SetText( team.GetName(pl:Team()) )
self:Think( self )
--local friend = self.Player:GetFriendStatus()
--MsgN( pl, " Friend: ", friend )
end,
Think = function( self )
if ( !IsValid( self.Player ) ) then
self:Remove()
return
end
self.Rank:SetText( team.GetName(self.Player:Team()) )
if ( self.NumKills == nil || self.NumKills != self.Player:Frags() ) then
self.NumKills = self.Player:Frags()
self.Kills:SetText( self.NumKills )
end
if ( self.NumDeaths == nil || self.NumDeaths != self.Player:Deaths() ) then
self.NumDeaths = self.Player:Deaths()
self.Deaths:SetText( self.NumDeaths )
end
if ( self.NumPing == nil || self.NumPing != self.Player:Ping() ) then
self.NumPing = self.Player:Ping()
self.Ping:SetText( self.NumPing )
end
--
-- Change the icon of the mute button based on state
--
if ( self.Muted == nil || self.Muted != self.Player:IsMuted() ) then
self.Muted = self.Player:IsMuted()
if ( self.Muted ) then
self.Mute:SetImage( "icon32/muted.png" )
else
self.Mute:SetImage( "icon32/unmuted.png" )
end
self.Mute.DoClick = function() self.Player:SetMuted( !self.Muted ) end
end
--
-- Connecting players go at the very bottom
--
if ( self.Player:Team() == TEAM_CONNECTING ) then
self:SetZPos( 2000 )
end
--
-- This is what sorts the list. The panels are docked in the z order,
-- so if we set the z order according to kills they'll be ordered that way!
-- Careful though, it's a signed short internally, so needs to range between -32,768k and +32,767
--
self:SetZPos( (self.NumKills * -50) + self.NumDeaths )
end,
Paint = function( self, w, h )
if ( !IsValid( self.Player ) ) then
return
end
--
-- We draw our background a different colour based on the status of the player
--
tcolor = team.GetColor(self.Player:Team())
if ( self.Player:Team() == TEAM_CONNECTING ) then
draw.RoundedBox( 4, 0, 0, w, h, Color( 200, 200, 200, 200 ) )
return
end
if ( !self.Player:Alive() ) then
draw.RoundedBox( 4, 0, 0, w, h, Color( tcolor.r,tcolor.g,tcolor.b,225 ) )
return
end
if ( self.Player:IsAdmin() ) then
draw.RoundedBox( 4, 0, 0, w, h, Color( tcolor.r,tcolor.g,tcolor.b,225 ) )
return
end
draw.RoundedBox( 4, 0, 0, w, h, Color( tcolor.r,tcolor.g,tcolor.b,225 ) )
end,
}
--
-- Convert it from a normal table into a Panel Table based on DPanel
--
PLAYER_LINE = vgui.RegisterTable( PLAYER_LINE, "DPanel" );
--
-- Here we define a new panel table for the scoreboard. It basically consists
-- of a header and a scrollpanel - into which the player lines are placed.
--
local SCORE_BOARD =
{
Init = function( self )
self.Header = self:Add( "Panel" )
self.Header:Dock( TOP )
self.Header:SetHeight( 100 )
self.Name = self.Header:Add( "DLabel" )
self.Name:SetFont( "ScoreboardDefaultTitle" )
self.Name:SetTextColor( Color( 255, 255, 255, 255 ) )
self.Name:Dock( TOP )
self.Name:SetHeight( 40 )
self.Name:SetContentAlignment( 5 )
self.Name:SetExpensiveShadow( 2, Color( 0, 0, 0, 200 ) )
--self.NumPlayers = self.Header:Add( "DLabel" )
--self.NumPlayers:SetFont( "ScoreboardDefault" )
--self.NumPlayers:SetTextColor( Color( 255, 255, 255, 255 ) )
--self.NumPlayers:SetPos( 0, 100 - 30 )
--self.NumPlayers:SetSize( 300, 30 )
--self.NumPlayers:SetContentAlignment( 4 )
self.Scores = self:Add( "DScrollPanel" )
self.Scores:Dock( FILL )
end,
PerformLayout = function( self )
self:SetSize( 700, ScrH() - 200 )
self:SetPos( ScrW() / 2 - 350, 100 )
end,
Paint = function( self, w, h )
--draw.RoundedBox( 4, 0, 0, w, h, Color( 0, 0, 0, 200 ) )
end,
Think = function( self, w, h )
self.Name:SetText( GetHostName() )
--
-- Loop through each player, and if one doesn't have a score entry - create it.
--
local plyrs = player.GetAll()
for id, pl in pairs( plyrs ) do
if ( IsValid( pl.ScoreEntry ) ) then continue end
pl.ScoreEntry = vgui.CreateFromTable( PLAYER_LINE, pl.ScoreEntry )
pl.ScoreEntry:Setup( pl )
self.Scores:AddItem( pl.ScoreEntry )
end
end,
}
SCORE_BOARD = vgui.RegisterTable( SCORE_BOARD, "EditablePanel" );
--[[---------------------------------------------------------
Name: gamemode:ScoreboardShow( )
Desc: Sets the scoreboard to visible
-----------------------------------------------------------]]
function GM:ScoreboardShow()
if ( !IsValid( g_Scoreboard ) ) then
g_Scoreboard = vgui.CreateFromTable( SCORE_BOARD )
end
if ( IsValid( g_Scoreboard ) ) then
g_Scoreboard:Show()
g_Scoreboard:MakePopup()
end
end
--[[---------------------------------------------------------
Name: gamemode:ScoreboardHide( )
Desc: Hides the scoreboard
-----------------------------------------------------------]]
function GM:ScoreboardHide()
if ( IsValid( g_Scoreboard ) ) then
g_Scoreboard:Hide()
end
end
--[[---------------------------------------------------------
Name: gamemode:HUDDrawScoreBoard( )
Desc: If you prefer to draw your scoreboard the stupid way (without vgui)
-----------------------------------------------------------]]
function GM:HUDDrawScoreBoard()
end
This scoreboard doesn't order people based on their rank, I have no idea how to do that.
Again - Sorry for the half-baked cake, but I thought everyone should know about this 'workaround'.
Anyone's free to edit/fix/whatever this however they want, I'm just providing a temporary solution until the SUI Scoreboards are fixed.
-
Still working after the GMod update - Just re-copy the code.
-
How do you change the color of the boxes and the color of the letters?
-
How do you change the color of the boxes and the color of the letters?
Use the "Teams" section in the ULX Groups tab to set team colours. The text should be fine, just don't use bright blue like I did.