Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ---- Unlike sandbox, we have teams to deal with, so here's an extra panel in the
- ---- hierarchy that handles a set of player rows belonging to its team.
- include("sb_row.lua")
- local function CompareScore(pa, pb)
- if not ValidPanel(pa) then return false end
- if not ValidPanel(pb) then return true end
- local a = pa:GetPlayer()
- local b = pb:GetPlayer()
- if not IsValid(a) then return false end
- if not IsValid(b) then return true end
- if a:Frags() == b:Frags() then return a:Deaths() < b:Deaths() end
- return a:Frags() > b:Frags()
- end
- local PANEL = {}
- function PANEL:Init()
- self.name = "Unnamed"
- self.color = COLOR_WHITE
- self.rows = {}
- self.rowcount = 0
- self.rows_sorted = {}
- self.group = "spec"
- end
- function PANEL:SetGroupInfo(name, color, group)
- self.name = name
- self.color = color
- self.group = group
- end
- local bgcolor = Color(20,20,20, 150)
- function PANEL:Paint()
- -- Darkened background
- draw.RoundedBox(8, 0, 0, self:GetWide(), self:GetTall(), bgcolor)
- surface.SetFont("treb_small")
- -- Header bg
- local txt = self.name .. " (" .. self.rowcount .. ")"
- local w, h = surface.GetTextSize(txt)
- draw.RoundedBox(8, 0, 0, w + 24, 20, self.color)
- -- Shadow
- surface.SetTextPos(11, 11 - h/2)
- surface.SetTextColor(0,0,0, 200)
- surface.DrawText(txt)
- -- Text
- surface.SetTextPos(10, 10 - h/2)
- surface.SetTextColor(255,255,255,255)
- surface.DrawText(txt)
- -- Alternating row background
- local y = 24
- for i, row in ipairs(self.rows_sorted) do
- if (i % 2) != 0 then
- surface.SetDrawColor(75,75,75, 100)
- surface.DrawRect(0, y, self:GetWide(), row:GetTall())
- end
- y = y + row:GetTall() + 1
- end
- -- Column darkening
- local scr = sboard_panel.ply_frame.scroll.Enabled and 16 or 0
- surface.SetDrawColor(0,0,0, 80)
- if sboard_panel.cols then
- local cx = self:GetWide() - scr
- for k,v in ipairs(sboard_panel.cols) do
- cx = cx - v.Width
- if k % 2 == 1 then -- Draw for odd numbered columns
- surface.DrawRect(cx-v.Width/2, 0, v.Width, self:GetTall())
- end
- end
- else
- -- If columns are not setup yet, fall back to darkening the areas for the
- -- default columns
- surface.DrawRect(self:GetWide() - 175 - 25 - scr, 0, 50, self:GetTall())
- surface.DrawRect(self:GetWide() - 75 - 25 - scr, 0, 50, self:GetTall())
- end
- end
- function PANEL:AddPlayerRow(ply)
- if ScoreGroup(ply) == self.group and not self.rows[ply] then
- local row = vgui.Create("TTTScorePlayerRow", self)
- row:SetPlayer(ply)
- self.rows[ply] = row
- self.rowcount = table.Count(self.rows)
- -- row:InvalidateLayout()
- -- must force layout immediately or it takes its sweet time to do so
- self:PerformLayout()
- --self:InvalidateLayout()
- end
- end
- function PANEL:HasPlayerRow(ply)
- return self.rows[ply] != nil
- end
- function PANEL:HasRows()
- return self.rowcount > 0
- end
- function PANEL:UpdateSortCache()
- self.rows_sorted = {}
- for k,v in pairs(self.rows) do
- table.insert(self.rows_sorted, v)
- end
- table.sort(self.rows_sorted, CompareScore)
- end
- function PANEL:UpdatePlayerData()
- local to_remove = {}
- for k,v in pairs(self.rows) do
- -- Player still belongs in this group?
- if ValidPanel(v) and IsValid(v:GetPlayer()) and ScoreGroup(v:GetPlayer()) == self.group then
- v:UpdatePlayerData()
- else
- -- can't remove now, will break pairs
- table.insert(to_remove, k)
- end
- end
- if #to_remove == 0 then return end
- for k,ply in pairs(to_remove) do
- local pnl = self.rows[ply]
- if ValidPanel(pnl) then
- pnl:Remove()
- end
- -- print(CurTime(), "Removed player", ply)
- self.rows[ply] = nil
- end
- self.rowcount = table.Count(self.rows)
- self:UpdateSortCache()
- self:InvalidateLayout()
- end
- function PANEL:PerformLayout()
- if self.rowcount < 1 then
- self:SetVisible(false)
- return
- end
- self:SetSize(self:GetWide(), 30 + self.rowcount + self.rowcount * SB_ROW_HEIGHT)
- -- Sort and layout player rows
- self:UpdateSortCache()
- local y = 24
- for k, v in ipairs(self.rows_sorted) do
- v:SetPos(0, y)
- v:SetSize(self:GetWide(), v:GetTall())
- y = y + v:GetTall() + 1
- end
- self:SetSize(self:GetWide(), 30 + (y - 24))
- end
- vgui.Register("TTTScoreGroup", PANEL, "Panel")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement