diff options
| author | Alexander Pickering <Alexander.Pickering@anondomain.site90.net> | 2016-04-16 02:02:00 -0400 |
|---|---|---|
| committer | Alexander Pickering <Alexander.Pickering@anondomain.site90.net> | 2016-04-16 02:02:00 -0400 |
| commit | 7e5db609550cca0d8b8a76c4bf78ba4658962167 (patch) | |
| tree | 4df54e0c4eccff0b022e0732c258b7b193fd6cfe /gamemode/cl_scoreboard.lua | |
| download | gmstranded-7e5db609550cca0d8b8a76c4bf78ba4658962167.tar.gz gmstranded-7e5db609550cca0d8b8a76c4bf78ba4658962167.tar.bz2 gmstranded-7e5db609550cca0d8b8a76c4bf78ba4658962167.zip | |
Initial commit
Diffstat (limited to 'gamemode/cl_scoreboard.lua')
| -rw-r--r-- | gamemode/cl_scoreboard.lua | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/gamemode/cl_scoreboard.lua b/gamemode/cl_scoreboard.lua new file mode 100644 index 0000000..e832a4a --- /dev/null +++ b/gamemode/cl_scoreboard.lua @@ -0,0 +1,231 @@ + +surface.CreateFont( "ScoreboardText", { + font = "Tahoma", + size = 16, + weight = 1000, + antialias = true, + additive = false, +} ) + +surface.CreateFont( "ScoreboardSub", { + font = "coolvetica", + size = 24, + weight = 500, + antialias = true, + additive = false, +} ) + +surface.CreateFont( "ScoreboardHead", { + font = "coolvetica", + size = 48, + weight = 500, + antialias = true, + additive = false, +} ) + +function GM:ScoreboardShow() + GAMEMODE.ShowScoreboard = true +end + +function GM:ScoreboardHide() + GAMEMODE.ShowScoreboard = false +end + +function GM:GetTeamScoreInfo() + local TeamInfo = {} + + for id, pl in pairs(player.GetAll()) do + local _team = pl:Team() + local _frags = pl:Frags() + local _deaths = pl:Deaths() + local _ping = pl:Ping() + + if (!TeamInfo[_team]) then + TeamInfo[_team] = {} + TeamInfo[_team].TeamName = team.GetName(_team) + TeamInfo[_team].Color = team.GetColor(_team) + TeamInfo[_team].Players = {} + end + + local PlayerInfo = {} + PlayerInfo.Frags = _frags + PlayerInfo.Deaths = pl:GetNWInt("Survival") + PlayerInfo.Score = _frags + PlayerInfo.Ping = _ping + PlayerInfo.Name = pl:Nick() + PlayerInfo.PlayerObj = pl + + if ( pl:IsAdmin() ) then PlayerInfo.Name = "[ADMIN] " .. PlayerInfo.Name end + if ( pl:IsDeveloper() ) then PlayerInfo.Name = "[DEVELOPER] " .. pl:Nick() end + if ( pl:GetNWBool( "AFK" ) ) then PlayerInfo.Name = PlayerInfo.Name .. " [AFK]" end + + local insertPos = #TeamInfo[_team].Players + 1 + for idx, info in pairs(TeamInfo[_team].Players) do + if (PlayerInfo.Frags > info.Frags) then + insertPos = idx + break + elseif (PlayerInfo.Frags == info.Frags) then + if (PlayerInfo.Deaths < info.Deaths) then + insertPos = idx + break + elseif (PlayerInfo.Deaths == info.Deaths) then + if (PlayerInfo.Name < info.Name) then + insertPos = idx + break + end + end + end + end + + table.insert( TeamInfo[ _team ].Players, insertPos, PlayerInfo ) + end + + return TeamInfo +end + +function GM:HUDDrawScoreBoard() + if ( !GAMEMODE.ShowScoreboard ) then return end + + if ( !GAMEMODE.ScoreDesign ) then + GAMEMODE.ScoreDesign = {} + GAMEMODE.ScoreDesign.HeaderY = 0 + GAMEMODE.ScoreDesign.Height = ScrH() / 2 + end + + local alpha = 255 + local ScoreboardInfo = self:GetTeamScoreInfo() + local xOffset = ScrW() / 8 + local yOffset = 32 + local scrWidth = ScrW() + local scrHeight = ScrH() - 64 + local boardWidth = scrWidth - ( 2 * xOffset ) + local boardHeight = scrHeight + local colWidth = 75 + + boardWidth = math.Clamp( boardWidth, 400, 600 ) + boardHeight = GAMEMODE.ScoreDesign.Height + + xOffset = (ScrW() - boardWidth) / 2.0 + yOffset = (ScrH() - boardHeight) / 2.0 + yOffset = yOffset - ScrH() / 4.0 + yOffset = math.Clamp( yOffset, 32, ScrH() ) + + surface.SetDrawColor( 0, 0, 0, 200 ) + surface.DrawRect( xOffset, yOffset, boardWidth, boardHeight ) + + surface.SetDrawColor( 0, 0, 0, 150 ) + surface.DrawOutlinedRect( xOffset, yOffset, boardWidth, boardHeight ) + + surface.SetDrawColor( 0, 0, 0, 50 ) + //surface.DrawOutlinedRect( xOffset - 1, yOffset - 1, boardWidth + 2, boardHeight + 2 ) + + local hostname = GetGlobalString( "ServerName" ) + local gamemodeName = GAMEMODE.Name .. " - " .. GAMEMODE.Author + + if ( string.len( hostname ) > 32 ) then + surface.SetFont("ScoreboardSub") + else + surface.SetFont("ScoreboardHead") + end + + surface.SetTextColor(255, 255, 255, 255) + local txWidth, txHeight = surface.GetTextSize( hostname ) + local y = yOffset + 5 + surface.SetTextPos(xOffset + (boardWidth / 2) - (txWidth / 2), y) + surface.DrawText(hostname) + + /*y = y + txHeight + 2 + + surface.SetTextColor(255, 255, 255, 255) + surface.SetFont("ScoreboardSub") + local txWidth, txHeight = surface.GetTextSize(gamemodeName) + surface.SetTextPos(xOffset + (boardWidth / 2) - (txWidth / 2), y) + surface.DrawText(gamemodeName)*/ + + y = y + txHeight + 4 + GAMEMODE.ScoreDesign.HeaderY = y - yOffset + + surface.SetDrawColor(0, 0, 0, 100) + surface.DrawRect(xOffset, y - 1, boardWidth, 1) + + surface.SetDrawColor(255, 255, 255, 20) + surface.DrawRect(xOffset + boardWidth - (colWidth * 1), y, colWidth, boardHeight - y + yOffset) + + surface.SetDrawColor(255, 255, 255, 20) + surface.DrawRect(xOffset + boardWidth - (colWidth * 3), y, colWidth, boardHeight - y + yOffset) + + surface.SetFont("ScoreboardText") + local txWidth, txHeight = surface.GetTextSize("W") + + surface.SetDrawColor(0, 0, 0, 100) + surface.DrawRect(xOffset, y, boardWidth, txHeight + 6) + + y = y + 2 + + surface.SetTextPos(xOffset + 16, y) + surface.DrawText("#Name") + surface.SetTextPos(xOffset + boardWidth - (colWidth * 3) + 8, y) + surface.DrawText("#Score") + surface.SetTextPos(xOffset + boardWidth - (colWidth * 2) + 8, y) + surface.DrawText("Level") + surface.SetTextPos(xOffset + boardWidth - (colWidth * 1) + 8, y) + surface.DrawText("#Ping") + + y = y + txHeight + 4 + + local yPosition = y + for team, info in pairs(ScoreboardInfo) do + local teamText = info.TeamName .. " (" .. #info.Players .. " Players)" + + surface.SetFont("ScoreboardText") + if (info.Color.r < 50 and info.Color.g < 50 and info.Color.b < 50) then surface.SetTextColor(255, 255, 255, 255) else surface.SetTextColor(0, 0, 0, 255) end + + txWidth, txHeight = surface.GetTextSize(teamText) + surface.SetDrawColor(info.Color.r, info.Color.g, info.Color.b, 255) + surface.DrawRect(xOffset + 1, yPosition, boardWidth - 2, txHeight + 4) + yPosition = yPosition + 2 + surface.SetTextPos(xOffset + boardWidth / 2 - txWidth / 2, yPosition) + + surface.DrawText(teamText) + yPosition = yPosition + txHeight + 4 + + for index, plinfo in pairs(info.Players) do + surface.SetFont("ScoreboardText") + surface.SetTextColor(info.Color.r, info.Color.g, info.Color.b, 200) + surface.SetTextPos(xOffset + 16, yPosition) + txWidth, txHeight = surface.GetTextSize(plinfo.Name) + + if (plinfo.PlayerObj == LocalPlayer()) then + surface.SetDrawColor(info.Color.r, info.Color.g, info.Color.b, 64) + surface.DrawRect(xOffset + 1, yPosition, boardWidth - 2, txHeight + 2) + surface.SetTextColor(info.Color.r, info.Color.g, info.Color.b, 255) + end + + local px, py = xOffset + 16, yPosition + local textcolor = Color(info.Color.r, info.Color.g, info.Color.b, alpha) + local shadowcolor = Color(0, 0, 0, alpha * 0.8) + + draw.SimpleText(plinfo.Name, "ScoreboardText", px + 1, py + 1, shadowcolor) + draw.SimpleText(plinfo.Name, "ScoreboardText", px, py, textcolor) + + px = xOffset + boardWidth - (colWidth * 3) + 8 + draw.SimpleText(plinfo.Frags, "ScoreboardText", px + 1, py + 1, shadowcolor) + draw.SimpleText(plinfo.Frags, "ScoreboardText", px, py, textcolor) + + px = xOffset + boardWidth - (colWidth * 2) + 8 + draw.SimpleText(plinfo.Deaths, "ScoreboardText", px + 1, py + 1, shadowcolor) + draw.SimpleText(plinfo.Deaths, "ScoreboardText", px, py, textcolor) + + px = xOffset + boardWidth - (colWidth * 1) + 8 + draw.SimpleText(plinfo.Ping, "ScoreboardText", px + 1, py + 1, shadowcolor) + draw.SimpleText(plinfo.Ping, "ScoreboardText", px, py, textcolor) + + yPosition = yPosition + txHeight + 3 + end + end + + yPosition = yPosition + 1 + + GAMEMODE.ScoreDesign.Height = (GAMEMODE.ScoreDesign.Height * 2) + (yPosition - yOffset) + GAMEMODE.ScoreDesign.Height = GAMEMODE.ScoreDesign.Height / 3 +end |
