surface.CreateFont("RAM_VoteFont", { font = "Trebuchet MS", size = 19, weight = 700, antialias = true, shadow = true }) surface.CreateFont("RAM_VoteFontCountdown", { font = "Tahoma", size = 32, weight = 700, antialias = true, shadow = true }) surface.CreateFont("RAM_VoteSysButton", { font = "Marlett", size = 13, weight = 0, symbol = true, }) MapVote.EndTime = 0 MapVote.Panel = false net.Receive("RAM_MapVoteStart", function() MapVote.CurrentMaps = {} MapVote.Allow = true MapVote.Votes = {} local amt = net.ReadUInt(32) for i = 1, amt do local map = net.ReadString() MapVote.CurrentMaps[#MapVote.CurrentMaps + 1] = map end MapVote.EndTime = CurTime() + net.ReadUInt(32) if(IsValid(MapVote.Panel)) then MapVote.Panel:Remove() end MapVote.Panel = vgui.Create("VoteScreen") MapVote.Panel:SetMaps(MapVote.CurrentMaps) end) net.Receive("RAM_MapVoteUpdate", function() local update_type = net.ReadUInt(3) if(update_type == MapVote.UPDATE_VOTE) then local ply = net.ReadEntity() if(IsValid(ply)) then local map_id = net.ReadUInt(32) MapVote.Votes[ply:SteamID()] = map_id if(IsValid(MapVote.Panel)) then MapVote.Panel:AddVoter(ply) end end elseif(update_type == MapVote.UPDATE_WIN) then if(IsValid(MapVote.Panel)) then MapVote.Panel:Flash(net.ReadUInt(32)) end end end) net.Receive("RAM_MapVoteCancel", function() if IsValid(MapVote.Panel) then MapVote.Panel:Remove() end end) net.Receive("RTV_Delay", function() chat.AddText(Color( 102,255,51 ), "[RTV]", Color( 255,255,255 ), " The vote has been rocked, map vote will begin on round end") end) local PANEL = {} function PANEL:Init() self:ParentToHUD() self.Canvas = vgui.Create("Panel", self) self.Canvas:MakePopup() self.Canvas:SetKeyboardInputEnabled(false) self.countDown = vgui.Create("DLabel", self.Canvas) self.countDown:SetTextColor(color_white) self.countDown:SetFont("RAM_VoteFontCountdown") self.countDown:SetText("") self.countDown:SetPos(0, 14) self.mapList = vgui.Create("DPanelList", self.Canvas) self.mapList:SetDrawBackground(false) self.mapList:SetSpacing(4) self.mapList:SetPadding(4) self.mapList:EnableHorizontal(true) self.mapList:EnableVerticalScrollbar() self.closeButton = vgui.Create("DButton", self.Canvas) self.closeButton:SetText("") self.closeButton.Paint = function(panel, w, h) derma.SkinHook("Paint", "WindowCloseButton", panel, w, h) end self.closeButton.DoClick = function() print("MapVote has started...") self:SetVisible(false) end self.maximButton = vgui.Create("DButton", self.Canvas) self.maximButton:SetText("") self.maximButton:SetDisabled(true) self.maximButton.Paint = function(panel, w, h) derma.SkinHook("Paint", "WindowMaximizeButton", panel, w, h) end self.minimButton = vgui.Create("DButton", self.Canvas) self.minimButton:SetText("") self.minimButton:SetDisabled(true) self.minimButton.Paint = function(panel, w, h) derma.SkinHook("Paint", "WindowMinimizeButton", panel, w, h) end self.Voters = {} end function PANEL:PerformLayout() local cx, cy = chat.GetChatBoxPos() self:SetPos(0, 0) self:SetSize(ScrW(), ScrH()) local extra = math.Clamp(300, 0, ScrW() - 640) self.Canvas:StretchToParent(0, 0, 0, 0) self.Canvas:SetWide(640 + extra) // self.Canvas:SetTall(cy -60) self.Canvas:SetTall(640) self.Canvas:SetPos(0, 0) self.Canvas:CenterHorizontal() self.Canvas:SetZPos(0) self.mapList:StretchToParent(0, 90, 0, 0) local buttonPos = 640 + extra - 31 * 3 self.closeButton:SetPos(buttonPos - 31 * 0, 4) self.closeButton:SetSize(31, 31) self.closeButton:SetVisible(true) self.maximButton:SetPos(buttonPos - 31 * 1, 4) self.maximButton:SetSize(31, 31) self.maximButton:SetVisible(true) self.minimButton:SetPos(buttonPos - 31 * 2, 4) self.minimButton:SetSize(31, 31) self.minimButton:SetVisible(true) end local heart_mat = Material("icon16/heart.png") local star_mat = Material("icon16/star.png") local shield_mat = Material("icon16/shield.png") function PANEL:AddVoter(voter) for k, v in pairs(self.Voters) do if(v.Player and v.Player == voter) then return false end end local icon_container = vgui.Create("Panel", self.mapList:GetCanvas()) local icon = vgui.Create("AvatarImage", icon_container) icon:SetSize(16, 16) icon:SetZPos(1000) icon:SetTooltip(voter:Name()) icon_container.Player = voter icon_container:SetTooltip(voter:Name()) icon:SetPlayer(voter, 16) if MapVote.HasExtraVotePower(voter) then icon_container:SetSize(40, 20) icon:SetPos(21, 2) icon_container.img = star_mat else icon_container:SetSize(20, 20) icon:SetPos(2, 2) end icon_container.Paint = function(s, w, h) draw.RoundedBox(4, 0, 0, w, h, Color(255, 0, 0, 80)) if(icon_container.img) then surface.SetMaterial(icon_container.img) surface.SetDrawColor(Color(255, 255, 255)) surface.DrawTexturedRect(2, 2, 16, 16) end end table.insert(self.Voters, icon_container) end function PANEL:Think() for k, v in pairs(self.mapList:GetItems()) do v.NumVotes = 0 end for k, v in pairs(self.Voters) do if(not IsValid(v.Player)) then v:Remove() else if(not MapVote.Votes[v.Player:SteamID()]) then v:Remove() else local bar = self:GetMapButton(MapVote.Votes[v.Player:SteamID()]) if(MapVote.HasExtraVotePower(v.Player)) then bar.NumVotes = bar.NumVotes + 2 else bar.NumVotes = bar.NumVotes + 1 end if(IsValid(bar)) then local CurrentPos = Vector(v.x, v.y, 0) local NewPos = Vector((bar.x + bar:GetWide()) - 21 * bar.NumVotes - 2, bar.y + (bar:GetTall() * 0.5 - 10), 0) if(not v.CurPos or v.CurPos ~= NewPos) then v:MoveTo(NewPos.x, NewPos.y, 0.3) v.CurPos = NewPos end end end end end local timeLeft = math.Round(math.Clamp(MapVote.EndTime - CurTime(), 0, math.huge)) self.countDown:SetText(tostring(timeLeft or 0).." seconds") self.countDown:SizeToContents() self.countDown:CenterHorizontal() end function PANEL:SetMaps(maps) self.mapList:Clear() for k, v in RandomPairs(maps) do local button = vgui.Create("DButton", self.mapList) button.ID = k button:SetText(v) button.DoClick = function() net.Start("RAM_MapVoteUpdate") net.WriteUInt(MapVote.UPDATE_VOTE, 3) net.WriteUInt(button.ID, 32) net.SendToServer() end do local Paint = button.Paint button.Paint = function(s, w, h) local col = Color(255, 255, 255, 10) if(button.bgColor) then col = button.bgColor end draw.RoundedBox(4, 0, 0, w, h, col) Paint(s, w, h) end end button:SetTextColor(color_white) button:SetContentAlignment(4) button:SetTextInset(8, 0) button:SetFont("RAM_VoteFont") local extra = math.Clamp(300, 0, ScrW() - 640) button:SetDrawBackground(false) button:SetTall(24) button:SetWide(285 + (extra / 2)) button.NumVotes = 0 self.mapList:AddItem(button) end end function PANEL:GetMapButton(id) for k, v in pairs(self.mapList:GetItems()) do if(v.ID == id) then return v end end return false end function PANEL:Paint() --Derma_DrawBackgroundBlur(self) local CenterY = ScrH() / 2 local CenterX = ScrW() / 2 surface.SetDrawColor(0, 0, 0, 200) surface.DrawRect(0, 0, ScrW(), ScrH()) end function PANEL:Flash(id) self:SetVisible(true) local bar = self:GetMapButton(id) if(IsValid(bar)) then timer.Simple( 0.0, function() bar.bgColor = Color( 0, 255, 255 ) surface.PlaySound( "hl1/fvox/blip.wav" ) end ) timer.Simple( 0.2, function() bar.bgColor = nil end ) timer.Simple( 0.4, function() bar.bgColor = Color( 0, 255, 255 ) surface.PlaySound( "hl1/fvox/blip.wav" ) end ) timer.Simple( 0.6, function() bar.bgColor = nil end ) timer.Simple( 0.8, function() bar.bgColor = Color( 0, 255, 255 ) surface.PlaySound( "hl1/fvox/blip.wav" ) end ) timer.Simple( 1.0, function() bar.bgColor = Color( 100, 100, 100 ) end ) end end derma.DefineControl("VoteScreen", "", PANEL, "DPanel")