Author Topic: Temporary scoreboard replacement (Until sui_scoreboard is fixed)  (Read 11439 times)

0 Members and 1 Guest are viewing this topic.

Offline Mors Quaedam

  • Newbie
  • *
  • Posts: 30
  • Karma: 1
Temporary scoreboard replacement (Until sui_scoreboard is fixed)
« 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.


Code: [Select]
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.

Offline Mors Quaedam

  • Newbie
  • *
  • Posts: 30
  • Karma: 1
Re: Temporary scoreboard replacement (Until sui_scoreboard is fixed)
« Reply #1 on: November 13, 2012, 01:36:42 PM »
Still working after the GMod update - Just re-copy the code.

Offline Deathbyrussian

  • Newbie
  • *
  • Posts: 2
  • Karma: 0
Re: Temporary scoreboard replacement (Until sui_scoreboard is fixed)
« Reply #2 on: November 24, 2012, 11:42:33 AM »
How do you change the color of the boxes and the color of the letters?

Offline Mors Quaedam

  • Newbie
  • *
  • Posts: 30
  • Karma: 1
Re: Temporary scoreboard replacement (Until sui_scoreboard is fixed)
« Reply #3 on: November 25, 2012, 06:05:21 AM »
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.