---- Scoreboard player score row, based on sandbox version include("sb_info.lua") local GetTranslation = LANG.GetTranslation local GetPTranslation = LANG.GetParamTranslation SB_ROW_HEIGHT = 24 --16 local PANEL = {} function PANEL:Init() -- cannot create info card until player state is known self.info = nil self.open = false self.cols = {} self.cols[1] = vgui.Create("DLabel", self) self.cols[1]:SetText(GetTranslation("sb_ping")) self.cols[2] = vgui.Create("DLabel", self) self.cols[2]:SetText(GetTranslation("sb_deaths")) self.cols[3] = vgui.Create("DLabel", self) self.cols[3]:SetText(GetTranslation("sb_score")) self.cols[5] = vgui.Create("DLabel", self) self.cols[5]:SetText("Guest") if KARMA.IsEnabled() then self.cols[4] = vgui.Create("DLabel", self) self.cols[4]:SetText(GetTranslation("sb_karma")) end for _, c in ipairs(self.cols) do c:SetMouseInputEnabled(false) end self.tag = vgui.Create("DLabel", self) self.tag:SetText("") self.tag:SetMouseInputEnabled(false) self.sresult = vgui.Create("DImage", self) self.sresult:SetSize(16,16) self.sresult:SetMouseInputEnabled(false) self.avatar = vgui.Create( "AvatarImage", self ) self.avatar:SetSize(SB_ROW_HEIGHT, SB_ROW_HEIGHT) self.avatar:SetMouseInputEnabled(false) self.nick = vgui.Create("DLabel", self) self.nick:SetMouseInputEnabled(false) self.voice = vgui.Create("DImageButton", self) self.voice:SetSize(16,16) self:SetCursor( "hand" ) end local namecolor = { default = COLOR_WHITE, Admin = Color(255, 87, 87, 255), Moderator = Color(255, 255, 0, 255), VIP = Color(116, 1, 223, 255), VIP = Color(0, 255, 255, 255), Trusted = Color(254, 46, 247, 255), Member = Color(191, 234, 48, 255), Regular = Color(48, 126, 234, 255) God = Color(148,255,255,255) }; function GM:TTTScoreboardColorForPlayer(ply) if not IsValid(ply) then return namecolor.default end if ply:SteamID() == "STEAM_0:0:1963640" then return namecolor.default elseif ply:IsAdmin() and GetGlobalBool("ttt_highlight_admins", true) then return namecolor.default elseif ply:IsUserGroup("Head-Admin") then return namecolor.Admin elseif ply:IsUserGroup("Admin") then return namecolor.Admin elseif ply:IsUserGroup("Moderator") then return namecolor.Moderator elseif ply:IsUserGroup("VIP") then return namecolor.VIP elseif ply:IsUserGroup("Trusted") then return namecolor.Trusted elseif ply:IsUserGroup("Trial Mod") then return namecolor.Moderator elseif ply:IsUserGroup("Member") then return namecolor.Member elseif ply:IsUserGroup("God") then return namecolor.God elseif ply:IsUserGroup("Regular") then return namecolor.Regular end return namecolor.default end local function ColorForPlayer(ply) if IsValid(ply) then local c = hook.Call("TTTScoreboardColorForPlayer", GAMEMODE, ply) -- verify that we got a proper color if c and type(c) == "table" and c.r and c.b and c.g and c.a then return c else ErrorNoHalt("TTTScoreboardColorForPlayer hook returned something that isn't a color!\n") end end return namecolor.default end function PANEL:Paint() if not IsValid(self.Player) then return end -- if ( self.Player:GetFriendStatus() == "friend" ) then -- color = Color( 236, 181, 113, 255 ) -- end local ply = self.Player if ply:IsTraitor() then surface.SetDrawColor(255, 0, 0, 30) surface.DrawRect(0, 0, self:GetWide(), SB_ROW_HEIGHT) elseif ply:IsDetective() then surface.SetDrawColor(0, 0, 255, 30) surface.DrawRect(0, 0, self:GetWide(), SB_ROW_HEIGHT) end if ply == LocalPlayer() then surface.SetDrawColor( 200, 200, 200, math.Clamp(math.sin(RealTime() * 2) * 50, 0, 100)) surface.DrawRect(0, 0, self:GetWide(), SB_ROW_HEIGHT ) end return true end function PANEL:SetPlayer(ply) self.Player = ply self.avatar:SetPlayer(ply) if not self.info then local g = ScoreGroup(ply) if g == GROUP_TERROR and ply != LocalPlayer() then self.info = vgui.Create("TTTScorePlayerInfoTags", self) self.info:SetPlayer(ply) self:InvalidateLayout() elseif g == GROUP_FOUND or g == GROUP_NOTFOUND then self.info = vgui.Create("TTTScorePlayerInfoSearch", self) self.info:SetPlayer(ply) self:InvalidateLayout() end else self.info:SetPlayer(ply) self:InvalidateLayout() end self.voice.DoClick = function() if IsValid(ply) and ply != LocalPlayer() then ply:SetMuted(not ply:IsMuted()) end end self:UpdatePlayerData() end function PANEL:GetPlayer() return self.Player end function PANEL:UpdatePlayerData() if not IsValid(self.Player) then return end local ply = self.Player self.cols[1]:SetText(ply:Ping()) self.cols[2]:SetText(ply:Deaths()) self.cols[3]:SetText(ply:Frags()) if self.cols[4] then self.cols[4]:SetText(math.Round(ply:GetBaseKarma())) end self.nick:SetText(ply:Nick()) self.nick:SizeToContents() self.nick:SetTextColor(ColorForPlayer(ply)) local ptag = ply.sb_tag if ScoreGroup(ply) != GROUP_TERROR then ptag = nil end self.tag:SetText(ptag and GetTranslation(ptag.txt) or "") self.tag:SetTextColor(ptag and ptag.color or COLOR_WHITE) self.sresult:SetVisible(ply.search_result != nil) -- more blue if a detective searched them if ply.search_result and (LocalPlayer():IsDetective() or (not ply.search_result.show)) then self.sresult:SetImageColor(Color(200, 200, 255)) end -- cols are likely to need re-centering self:LayoutColumns() if self.info then self.info:UpdatePlayerData() end if self.Player != LocalPlayer() then local muted = self.Player:IsMuted() self.voice:SetImage(muted and "icon16/sound_mute.png" or "icon16/sound.png") else self.voice:Hide() end if ply:IsUserGroup("Owner") then self.cols[5]:SetText("Owner") self.cols[5]:SetTextColor(Color(255,87,87,255)) end if ply:IsUserGroup("Head-Admin") then self.cols[5]:SetText("Head-Admin") self.cols[5]:SetTextColor(Color(255,87,87,255)) end if ply:IsUserGroup("Admin") then self.cols[5]:SetText("Admin") self.cols[5]:SetTextColor(Color(255,87,87,255)) end if ply:IsUserGroup("Moderator") then self.cols[5]:SetText("Mod") self.cols[5]:SetTextColor(Color(255,255,0,255)) end if ply:IsUserGroup("VIP") then self.cols[5]:SetText("VIP") self.cols[5]:SetTextColor(Color(116,1,223,255)) end if ply:IsUserGroup("Trusted") then self.cols[5]:SetText("Trusted") self.cols[5]:SetTextColor(Color(254,46,247,255)) end if ply:IsUserGroup("Trial Mod") then self.cols[5]:SetText("Trial-Mod") self.cols[5]:SetTextColor(Color(255,255,0,255)) end if ply:IsUserGroup("VIP+") then self.cols[5]:SetText("VIP+") self.cols[5]:SetTextColor(Color(116,1,223,255)) end if ply:IsUserGroup("Member") then self.cols[5]:SetText("Member") self.cols[5]:SetTextColor(Color(191,234,48,255)) end if ply:IsUserGroup("Regular") then self.cols[5]:SetText("Regular") self.cols[5]:SetTextColor(Color(48,126,234,255)) end end function PANEL:ApplySchemeSettings() for k,v in pairs(self.cols) do v:SetFont("treb_small") v:SetTextColor(COLOR_WHITE) end self.nick:SetFont("treb_small") self.nick:SetTextColor(ColorForPlayer(self.Player)) local ptag = self.Player and self.Player.sb_tag self.tag:SetTextColor(ptag and ptag.color or COLOR_WHITE) self.tag:SetFont("treb_small") self.sresult:SetImage("icon16/magnifier.png") self.sresult:SetImageColor(Color(170, 170, 170, 150)) end function PANEL:LayoutColumns() for k,v in ipairs(self.cols) do v:SizeToContents() v:SetPos(self:GetWide() - (50*k) - v:GetWide()/2, (SB_ROW_HEIGHT - v:GetTall()) / 2) if v == self.cols[5] then v:SetPos(self:GetWide() - (50*k) - v:GetWide()/2, (SB_ROW_HEIGHT - v:GetTall()) / 2) end end self.tag:SizeToContents() self.tag:SetPos(self:GetWide() - (50 * 6) - self.tag:GetWide()/2, (SB_ROW_HEIGHT - self.tag:GetTall()) / 2) self.sresult:SetPos(self:GetWide() - (50*6) - 8, (SB_ROW_HEIGHT - 16) / 2) end function PANEL:PerformLayout() self.avatar:SetPos(0,0) self.avatar:SetSize(SB_ROW_HEIGHT,SB_ROW_HEIGHT) if not self.open then self:SetSize(self:GetWide(), SB_ROW_HEIGHT) if self.info then self.info:SetVisible(false) end elseif self.info then self:SetSize(self:GetWide(), 100 + SB_ROW_HEIGHT) self.info:SetVisible(true) self.info:SetPos(5, SB_ROW_HEIGHT + 5) self.info:SetSize(self:GetWide(), 100) self.info:PerformLayout() self:SetSize(self:GetWide(), SB_ROW_HEIGHT + self.info:GetTall()) end self.nick:SizeToContents() self.nick:SetPos(SB_ROW_HEIGHT + 10, (SB_ROW_HEIGHT - self.nick:GetTall()) / 2) self:LayoutColumns() self.voice:SetVisible(not self.open) self.voice:SetSize(16, 16) self.voice:DockMargin(4, 4, 4, 4) self.voice:Dock(RIGHT) end function PANEL:DoClick(x, y) self:SetOpen(not self.open) end function PANEL:SetOpen(o) if self.open then surface.PlaySound("ui/buttonclickrelease.wav") else surface.PlaySound("ui/buttonclick.wav") end self.open = o self:PerformLayout() self:GetParent():PerformLayout() sboard_panel:PerformLayout() end function PANEL:DoRightClick() local ply = self.Player if LocalPlayer():IsAdmin() or LocalPlayer():IsSuperAdmin() or ply:IsUserGroup("Owner") or ply:IsUserGroup("Admin") or ply:IsUserGroup("Moderator") or ply:IsUserGroup("Trial Mod") or ply:IsUserGroup("Trusted") or ply:IsUserGroup("VIP") or ply:IsUserGroup("user") or ply:IsUserGroup("VIP+") or ply:IsUserGroup("God") then surface.PlaySound("buttons/button9.wav") local options = DermaMenu() options:AddOption("Copy Name", function() SetClipboardText(ply:Nick()) surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/user_edit.png") options:AddOption("Copy SteamID", function() SetClipboardText(ply:SteamID()) surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/tag_blue.png") options:AddSpacer() options:AddOption("Open Profile", function() ply:ShowProfile() surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/world.png") options:AddOption("Friends", function() RunConsoleCommand("ulx","friends",ply:Nick()) surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/cross.png") options:AddSpacer() if IsValid(ply) then local adminop,subimg = options:AddSubMenu("Admin") subimg:SetImage("icon16/lorry.png") adminop:AddOption("Slay Next Round", function() RunConsoleCommand("ulx","slaynr",ply:Nick()) surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/cross.png") adminop:AddOption("Remove Slay", function() RunConsoleCommand("ulx","rslaynr",ply:Nick()) surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/cross.png") adminop:AddOption("Slay Now", function() RunConsoleCommand("ulx","slay",ply:Nick()) surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/cut_red.png") adminop:AddOption("Kick", function() RunConsoleCommand("ulx","kick",ply:Nick(),"You were kicked") surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/door_out.png") adminop:AddOption("Ban", function() RunConsoleCommand("ulx","ban",ply:Nick(),120,"You were banned") surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/delete.png") adminop:AddSpacer() adminop:AddOption("Mute", function() RunConsoleCommand("ulx","mute",ply:Nick()) surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/asterisk_yellow.png") adminop:AddOption("Unmute", function() RunConsoleCommand("ulx","unmute",ply:Nick()) surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/asterisk_orange.png") adminop:AddOption("Gag", function() RunConsoleCommand("ulx","gag",ply:Nick()) surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/asterisk_yellow.png") adminop:AddOption("Ungag", function() RunConsoleCommand("ulx","ungag",ply:Nick()) surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/asterisk_orange.png") adminop:AddSpacer() adminop:AddOption("Spectate", function() RunConsoleCommand("ulx","spectate",ply:Nick()) surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/zoom.png") adminop:AddOption("Force Spectate", function() RunConsoleCommand("ulx","fspec",ply:Nick()) surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/zoom.png") adminop:AddOption("Force Unspectate", function() RunConsoleCommand("ulx","unspec",ply:Nick()) surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/zoom.png") adminop:AddOption("Freeze", function() RunConsoleCommand("ulx","freeze",ply:Nick()) surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/cross.png") adminop:AddOption("Bring", function() RunConsoleCommand("ulx","bring",ply:Nick()) surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/cross.png") adminop:AddOption("GoTo", function() RunConsoleCommand("ulx","goto",ply:Nick()) surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/cross.png") adminop:AddSpacer() adminop:AddOption("Respawn", function() RunConsoleCommand("ulx","respawn",ply:Nick()) surface.PlaySound("buttons/button9.wav") end):SetImage("icon16/cross.png") adminop:AddSpacer() options:Open() end end end vgui.Register( "TTTScorePlayerRow", PANEL, "Button" )