• Dealing with Panel.Think
    10 replies, posted
I made a post earlier about drawing a scoreboard. I learned that I needed to draw that scoreboard every frame for it to update. The problem is it just [b]loops into oblivion whenever the panel is active[/b]. [url]http://cloud.steampowered.com/ugc/596931038206034271/A9A1B2BF5E97EE48FCEB004E29E5E6AA07F8DD36/[/url] So how do I stop it from doing that, using code similar to this? [code] local Plys = vgui.Create( "DPanel" ) Plys:SetPos( 0, 0 ) Plys:SetSize( 260, 440 ) local Playerlist = vgui.Create("DListView") Playerlist:SetParent(Plys) Playerlist:SetPos(0, 0) Playerlist:SetSize(260, 440) Playerlist:SetMultiSelect(false) Playerlist:AddColumn("Name") Playerlist:AddColumn("Amount of kills") function Playerlist:Think() for k,v in pairs(player.GetAll()) do Playerlist:AddLine( v:Nick(), v:Frags(), v:Team()) end if #player.GetAll() == 0 then Playerlist:AddLine("No Players Online") end end [/code] I've been looking around for a while now and I can't find any documentation that tells me exactly what to do. [i]Basically I want the scoreboard to update when the panel is active, but only once.[/i]
You don't need to add all players on Think, you just need to on player join and/or when the players score changes. Panels are persistent, means when you add something the thing you added before will stay there of course.
I'm not exactly sure how to do that. Got any examples?
The best thing to do would just be to refresh the list whenever it is opened.
That's what I'm trying to do, only I don't know how.
Can you paste me all of the code please?
All the code is in my first post.
You could do something like this. [lua]local p = {} function Playerlist:Think() for k,v in pairs(p) do if not IsValid(v) then p[k] = nil; end end for k,v in pairs(player.GetAll()) do if not p[v:SteamID()] then p[v:SteamID()] = v; Playerlist:AddLine( v:Nick(), v:Frags(), v:Team()); end end if #player.GetAll() == 0 then Playerlist:AddLine("No Players Online") end end[/lua] But again, that's inefficient. It's better to update the player list just when the menu is opened.
[QUOTE=Hamsn1per;28485259]All the code is in my first post.[/QUOTE] In the picture you posted you have more than just a panel, paste me it all.
[code] include( "shared.lua" ) include( "hud.lua" ) /* include( "tabmenu.lua" ) */ --[[ Hides the original sandbox HL2 HUD ]]-- function hidehud(name) for k, v in pairs {"CHudHealth", "CHudBattery", "CHudAmmo", "CHudSecondaryAmmo"} do if name == v then return false end end end hook.Add("HUDShouldDraw", "hidehud", hidehud) --[[ Derma For The Team Selection Menu ]]-- function GM:Initialize() --Responsible for running the entire TAB menu //Background for everything teampanel = vgui.Create( "DFrame" ) teampanel:SetPos( 10, ScrH() * 0.44 ) teampanel:SetSize( 300, 500 ) teampanel:SetTitle( "" ) teampanel:SetVisible( false ) teampanel:SetDraggable( false ) teampanel:ShowCloseButton( false ) teampanel:MakePopup() teampanel.Paint = function() draw.RoundedBox ( 10, 0, 0, teampanel:GetWide(), teampanel:GetTall(), Color( 0, 0, 0, 150 ) ) end //This controls the tabs within the menu local TeamSelect = vgui.Create( "DPropertySheet" ) TeamSelect:SetParent( teampanel ) TeamSelect:SetPos( 15, 15 ) TeamSelect:SetSize( 270, 470 ) //Contains all team switch buttons local TeamList = vgui.Create ( "DPanel" ) TeamList:SetPos( 5, 0 ) TeamList:SetSize( 240, 440 ) TeamList.Paint = function() draw.RoundedBox ( 0, 0, 0, teampanel:GetWide(), teampanel:GetTall(), Color( 0, 0, 0, 150 ) ) end local padding = 55 local CITmale = padding local CITfemale = padding local Medic = padding local Tech = padding local Rebel = padding //Set Team: CitizenMale local JoinTeam = vgui.Create( "DButton" ) JoinTeam:SetParent( TeamList ) JoinTeam:SetPos( 10, 10 ) JoinTeam:SetSize( 100, 50 ) JoinTeam:SetText( "Citizen (Male)" ) JoinTeam.DoClick = function() RunConsoleCommand( "citizenmale" ) end //Set Team: CitizenFemale local JoinTeam = vgui.Create( "DButton" ) JoinTeam:SetParent( TeamList ) JoinTeam:SetPos( 10, 10 + CITmale ) JoinTeam:SetSize( 100, 50 ) JoinTeam:SetText( "Citizen (Female)" ) JoinTeam.DoClick = function() RunConsoleCommand( "citizenfemale" ) end //Set Team: Medic local JoinTeam = vgui.Create( "DButton" ) JoinTeam:SetParent( TeamList ) JoinTeam:SetPos( 10, 10 + CITmale + CITfemale ) JoinTeam:SetSize( 100, 50 ) JoinTeam:SetText( "Medic" ) JoinTeam.DoClick = function() RunConsoleCommand( "medic" ) end //Set Team: Tech local JoinTeam = vgui.Create( "DButton" ) JoinTeam:SetParent( TeamList ) JoinTeam:SetPos( 10, 10 + CITmale + CITfemale + Medic ) JoinTeam:SetSize( 100, 50 ) JoinTeam:SetText( "Tech Specialist" ) JoinTeam.DoClick = function() RunConsoleCommand( "tech" ) end //Set Team: Rebel local JoinTeam = vgui.Create( "DButton" ) JoinTeam:SetParent( TeamList ) JoinTeam:SetPos( 10, 10 + CITmale + CITfemale + Medic + Tech ) JoinTeam:SetSize( 100, 50 ) JoinTeam:SetText( "Rebel Soldier" ) JoinTeam.DoClick = function() RunConsoleCommand( "rebel" ) end //Temporary Inventory Holder local Inventory = vgui.Create ( "DPanel" ) Inventory:SetPos( 5, 0 ) Inventory:SetSize( 240, 440 ) Inventory.Paint = function() draw.RoundedBox ( 0, 0, 0, teampanel:GetWide(), teampanel:GetTall(), Color( 0, 0, 0, 150 ) ) end // Derma for player list local Plys = vgui.Create( "DPanel" ) Plys:SetPos( 0, 0 ) Plys:SetSize( 260, 440 ) local Playerlist = vgui.Create("DListView") Playerlist:SetParent(Plys) Playerlist:SetPos(0, 0) Playerlist:SetSize(260, 440) Playerlist:SetMultiSelect(false) Playerlist:AddColumn("Name") Playerlist:AddColumn("Amount of kills") function Playerlist:Think() for k,v in pairs(player.GetAll()) do Playerlist:AddLine( v:Nick(), v:Frags(), v:Team()) end if #player.GetAll() == 0 then Playerlist:AddLine("No Players Online") end end TeamSelect:AddSheet( "Class Select", TeamList, "gui/silkicons/user", false, false, "Choose Your Class" ) TeamSelect:AddSheet( "Inventory", Inventory, "gui/silkicons/user", false, false, "Your Current Inventory" ) TeamSelect:AddSheet( "Player List", Plys, "gui/silkicons/user", false, false, "Who's Playing?" ) end --[[ Functions for toggling visibility of the TAB menu ]]-- -- These overwrite the scoreboard function GM:ScoreboardShow() teampanel:SetVisible( true ) end function GM:ScoreboardHide() teampanel:SetVisible( false ) end [/code]
[lua] include( "shared.lua" ) include( "hud.lua" ) /* include( "tabmenu.lua" ) */ --[[ Hides the original sandbox HL2 HUD ]]-- function hidehud(name) for k, v in pairs {"CHudHealth", "CHudBattery", "CHudAmmo", "CHudSecondaryAmmo"} do if name == v then return false end end end hook.Add("HUDShouldDraw", "hidehud", hidehud) --[[ Derma For The Team Selection Menu ]]-- function GM:Initialize() --Responsible for running the entire TAB menu //Background for everything teampanel = vgui.Create( "DFrame" ) teampanel:SetPos( 10, ScrH() * 0.44 ) teampanel:SetSize( 300, 500 ) teampanel:SetTitle( "" ) teampanel:SetVisible( false ) teampanel:SetDraggable( false ) teampanel:ShowCloseButton( false ) teampanel:MakePopup() teampanel.Paint = function() draw.RoundedBox ( 10, 0, 0, teampanel:GetWide(), teampanel:GetTall(), Color( 0, 0, 0, 150 ) ) end //This controls the tabs within the menu local TeamSelect = vgui.Create( "DPropertySheet" ) TeamSelect:SetParent( teampanel ) TeamSelect:SetPos( 15, 15 ) TeamSelect:SetSize( 270, 470 ) //Contains all team switch buttons local TeamList = vgui.Create ( "DPanel" ) TeamList:SetPos( 5, 0 ) TeamList:SetSize( 240, 440 ) TeamList.Paint = function() draw.RoundedBox ( 0, 0, 0, teampanel:GetWide(), teampanel:GetTall(), Color( 0, 0, 0, 150 ) ) end local padding = 55 local CITmale = padding local CITfemale = padding local Medic = padding local Tech = padding local Rebel = padding //Set Team: CitizenMale local JoinTeam = vgui.Create( "DButton" ) JoinTeam:SetParent( TeamList ) JoinTeam:SetPos( 10, 10 ) JoinTeam:SetSize( 100, 50 ) JoinTeam:SetText( "Citizen (Male)" ) JoinTeam.DoClick = function() RunConsoleCommand( "citizenmale" ) end //Set Team: CitizenFemale local JoinTeam = vgui.Create( "DButton" ) JoinTeam:SetParent( TeamList ) JoinTeam:SetPos( 10, 10 + CITmale ) JoinTeam:SetSize( 100, 50 ) JoinTeam:SetText( "Citizen (Female)" ) JoinTeam.DoClick = function() RunConsoleCommand( "citizenfemale" ) end //Set Team: Medic local JoinTeam = vgui.Create( "DButton" ) JoinTeam:SetParent( TeamList ) JoinTeam:SetPos( 10, 10 + CITmale + CITfemale ) JoinTeam:SetSize( 100, 50 ) JoinTeam:SetText( "Medic" ) JoinTeam.DoClick = function() RunConsoleCommand( "medic" ) end //Set Team: Tech local JoinTeam = vgui.Create( "DButton" ) JoinTeam:SetParent( TeamList ) JoinTeam:SetPos( 10, 10 + CITmale + CITfemale + Medic ) JoinTeam:SetSize( 100, 50 ) JoinTeam:SetText( "Tech Specialist" ) JoinTeam.DoClick = function() RunConsoleCommand( "tech" ) end //Set Team: Rebel local JoinTeam = vgui.Create( "DButton" ) JoinTeam:SetParent( TeamList ) JoinTeam:SetPos( 10, 10 + CITmale + CITfemale + Medic + Tech ) JoinTeam:SetSize( 100, 50 ) JoinTeam:SetText( "Rebel Soldier" ) JoinTeam.DoClick = function() RunConsoleCommand( "rebel" ) end //Temporary Inventory Holder local Inventory = vgui.Create ( "DPanel" ) Inventory:SetPos( 5, 0 ) Inventory:SetSize( 240, 440 ) Inventory.Paint = function() draw.RoundedBox ( 0, 0, 0, teampanel:GetWide(), teampanel:GetTall(), Color( 0, 0, 0, 150 ) ) end // Derma for player list local Plys = vgui.Create( "DPanel" ) Plys:SetPos( 0, 0 ) Plys:SetSize( 260, 440 ) local Playerlist = vgui.Create("DListView") Playerlist:SetParent(Plys) Playerlist:SetPos(0, 0) Playerlist:SetSize(260, 440) Playerlist:SetMultiSelect(false) Playerlist:AddColumn("Name") Playerlist:AddColumn("Amount of kills") teampanel.PlayerList = Playerlist local function teampanel:RefreshPlayers() self.PlayerList:Clear(true) for k,v in pairs(player.GetAll()) do self.PlayerList:AddLine( v:Nick(), v:Frags(), v:Team()) end if #player.GetAll() == 0 then self.PlayerList:AddLine("No Players Online") end end TeamSelect:AddSheet( "Class Select", TeamList, "gui/silkicons/user", false, false, "Choose Your Class" ) TeamSelect:AddSheet( "Inventory", Inventory, "gui/silkicons/user", false, false, "Your Current Inventory" ) TeamSelect:AddSheet( "Player List", Plys, "gui/silkicons/user", false, false, "Who's Playing?" ) end --[[ Functions for toggling visibility of the TAB menu ]]-- -- These overwrite the scoreboard function GM:ScoreboardShow() teampanel:SetVisible( true ) teampanel:RefreshPlayers() end function GM:ScoreboardHide() teampanel:SetVisible( false ) end [/lua] Try this.
Sorry, you need to Log In to post a reply to this thread.