Ulysses Stuff > Releases

Temporary scoreboard replacement (Until sui_scoreboard is fixed)

(1/1)

Mors Quaedam:
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.



--- Code: ---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

--- End code ---

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.

Mors Quaedam:
Still working after the GMod update - Just re-copy the code.

Deathbyrussian:
How do you change the color of the boxes and the color of the letters?

Mors Quaedam:

--- Quote from: Deathbyrussian on November 24, 2012, 11:42:33 AM ---How do you change the color of the boxes and the color of the letters?

--- End quote ---

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.

Navigation

[0] Message Index

Go to full version