• Need help i created a rule menu
    38 replies, posted
I created a rule menu and a admin menu for this addon with the admin menu you can edit, add some rules, but those rule disapear when the server restart i don't know how to do to make them stay if you need the code to help me i can put it here
You could use file.Write to save it to a file when you're done editing it, and file.Open to read the file when the server restarts.
The file.Write go in client and open in the server side ? Are you able to give me an example because the link you gave to me is to write a text helloworld
That is an example. Use it and change it to try to figure out what YOU need it to do.
For example i called RULE.ONE = ''D'ont freekill'' RULE.TWO = ''D'ont chatspam'' i need to do: file.Write( "cv_rulesmenu.txt", "RULE.ONE" ) file.Write( "cv_rulesmenu.txt", "RULE.TWO" )
Doing this, you will first create a file named vc_rulesmenu which contains the string RULE.ONE, and then right after that you overwrite it with RULE.TWO Making two file.Write with the same txt name will overwrite the last one. Use file.Write first and then to add RULE.TWO use file.Append
Use either Category or use a config file in the addon folder.
file.Writefile.Write( "rule.txt", "RuleMenu" ) RuleMenu = RuleMenu or {}; RuleMenu.Rules = RuleMenu.Rules or { "Rule 1", "Rule 2", "Rule 3", "Rule 4" }; RuleMenu.Frame = RuleMenu.Frame or nil; function RuleMenu:OpenRuleMenu() local frame = vgui.Create( "DFrame" ); frame:SetTitle( "Rules" ); frame:SetSize( 300, 360 ); frame:MakePopup(); RuleMenu.Frame = frame; local richtext = vgui.Create( "RichText", frame ) richtext:Dock( FILL ) richtext:InsertColorChange( 192, 192, 192, 255 ) richtext.Paint = function() richtext.m_FontName = "titlefont" richtext:SetFontInternal( "titlefont" ) richtext:SetBGColor(Color(0,0,0,0)) richtext.Paint = nil end function frame:SetRules() richtext:SetText( "" ); for i, v in pairs( RuleMenu.Rules ) do richtext:AppendText( v .. "\n" ); end end frame:SetRules(); end net.Receive("OpenRuleMenu", function() RuleMenu:OpenRuleMenu(); end ); function RuleMenu:OpenAdminRuleMenu() local frame = vgui.Create( "DFrame" ) frame:SetSize( 400, 105 ) frame:Center() frame:MakePopup() local rebuildEntry; local default = "Select which rule to edit."; local y = 35; local selectRule = vgui.Create( "DComboBox", frame ); selectRule:SetText( default ); selectRule:SetPos( 5, y ); function frame:RebuildSelect() selectRule:Clear(); selectRule:SetSize( frame:GetWide() - 10, 30 ); for i, v in pairs( RuleMenu.Rules ) do selectRule:AddChoice( v ); end end frame:RebuildSelect(); y = y + selectRule:GetTall() + 5; local selectButton = vgui.Create( "DButton", frame ); selectButton:SetPos( 5, y ); selectButton:SetSize( selectRule:GetSize() ); selectButton:SetText( "Go" ); selectButton.DoClick = function() if( selectRule:GetText() == default ) then LocalPlayer():ChatPrint( "Select a rule!" ); return; end for i, v in pairs( RuleMenu.Rules ) do if( v == selectRule:GetText() ) then rebuildEntry( i ); end end end y = y + selectButton:GetTall() + 5; local hasClicked = false; local TextEntry = vgui.Create( "DTextEntry", frame ) -- create the form as a child of frame TextEntry:SetPos( 5, y ) TextEntry:SetSize( selectButton:GetSize() ) TextEntry:SetVisible( false ); y = y + TextEntry:GetTall() + 5; local Save = vgui.Create( "DButton", frame ); Save:SetText( "Save rule" ); Save:SetVisible( false ); Save:SetPos( 5, y ); Save:SetSize( TextEntry:GetSize() ); function rebuildEntry( i ) if( !hasClicked ) then TextEntry:SetVisible( true ); Save:SetVisible( true ); frame:SetTall( frame:GetTall() + 70 ); end TextEntry:SetText( RuleMenu.Rules[ i ] ) Save.DoClick = function() RuleMenu.Rules[ i ] = TextEntry:GetText(); frame:RebuildSelect(); end end end net.Receive("OpenAdminRuleMenu", function() RuleMenu:OpenAdminRuleMenu(); end ); RuleMenu:OpenRuleMenu(); surface.CreateFont( "titlefont", {  font = "Impact",  size = 25,  weight = 500,  blursize = 0,  scanlines = 0,  antialias = true } ) -------------------CONFIG------------------- PANEL_TITLE = "Rules" RULES = { "Rule 1", "Rule 2", "Rule 3", "Rule 4", "Rule 5", "Rule 6", "Rule 7", "Rule 8", "Rule 9", "Rule 10", } --------------------------------------------- local text = "" local frame = nil local frameadmin = nil surface.CreateFont( "titlefont", {  font = "Impact",  size = 25,  weight = 500,  blursize = 0,  scanlines = 0,  antialias = true } ) So it gonna be like that ?
I would do it like this, but i have not tried it. RulesPanelConfig = {} -------------------CONFIG------------------- RulesPanelConfig.PanelTitle = "Rules" RulesPanelConfig.Rules = { "Rule 1", "Rule 2", "Rule 3", "Rule 4", "Rule 5", "Rule 6", "Rule 7", "Rule 8", "Rule 9", "Rule 10", } RuleMenu.Frame = RuleMenu.Frame ornil; function RuleMenu:OpenRuleMenu()local frame = vgui.Create( "DFrame" ); frame:SetTitle(RulesPanelConfig.PanelTitle); frame:SetSize( 300, 360 ); frame:MakePopup(); RuleMenu.Frame = frame; local richtext = vgui.Create( "RichText", frame ) richtext:Dock( FILL ) richtext:InsertColorChange( 192, 192, 192, 255 ) richtext.Paint = function() richtext.m_FontName = "titlefont" richtext:SetFontInternal( "titlefont" ) richtext:SetBGColor(Color(0,0,0,0)) richtext.Paint = nilendfunction frame:SetRules() richtext:SetText( "" ); for i, v inpairs( RulesPanelConfig.Rules ) do richtext:AppendText( v .. "\n" ); endend frame:SetRules(); end net.Receive("OpenRuleMenu", function() RuleMenu:OpenRuleMenu(); end ); function RuleMenu:OpenAdminRuleMenu()local frame = vgui.Create( "DFrame" ) frame:SetSize( 400, 105 ) frame:Center() frame:MakePopup() local rebuildEntry; local default = "Select which rule to edit."; local y = 35; local selectRule = vgui.Create( "DComboBox", frame ); selectRule:SetText( default ); selectRule:SetPos( 5, y ); function frame:RebuildSelect() selectRule:Clear(); selectRule:SetSize( frame:GetWide() - 10, 30 ); for i, v inpairs( RuleMenu.Rules ) do selectRule:AddChoice( v ); endend frame:RebuildSelect(); y = y + selectRule:GetTall() + 5; local selectButton = vgui.Create( "DButton", frame ); selectButton:SetPos( 5, y ); selectButton:SetSize( selectRule:GetSize() ); selectButton:SetText( "Go" ); selectButton.DoClick = function()if( selectRule:GetText() == default ) then LocalPlayer():ChatPrint( "Select a rule!" ); return; endfor i, v inpairs( RuleMenu.Rules ) doif( v == selectRule:GetText() ) then rebuildEntry( i ); endendend y = y + selectButton:GetTall() + 5; local hasClicked = false; local TextEntry = vgui.Create( "DTextEntry", frame ) -- create the form as a child of frame TextEntry:SetPos( 5, y ) TextEntry:SetSize( selectButton:GetSize() ) TextEntry:SetVisible( false ); y = y + TextEntry:GetTall() + 5; local Save = vgui.Create( "DButton", frame ); Save:SetText( "Save rule" ); Save:SetVisible( false ); Save:SetPos( 5, y ); Save:SetSize( TextEntry:GetSize() ); function rebuildEntry( i )if( !hasClicked ) then TextEntry:SetVisible( true ); Save:SetVisible( true ); frame:SetTall( frame:GetTall() + 70 ); end TextEntry:SetText( RuleMenu.Rules[ i ] ) Save.DoClick = function() RuleMenu.Rules[ i ] = TextEntry:GetText(); frame:RebuildSelect(); endendend net.Receive("OpenAdminRuleMenu", function() RuleMenu:OpenAdminRuleMenu(); end ); RuleMenu:OpenRuleMenu(); surface.CreateFont( "titlefont", {  font = "Impact",  size = 25,  weight = 500,  blursize = 0,  scanlines = 0,  antialias = true } ) ---------------------------------------------local text = ""local frame = nillocal frameadmin = nil surface.CreateFont( "titlefont", {  font = "Impact",  size = 25,  weight = 500,  blursize = 0,  scanlines = 0,  antialias = true } )
It doesn't help me for my file.Write i don't understand how to do that im really bad
What don’t you understand? The wiki tells you exactly how to use it.
How it work in the wiki they told file.Write( "helloworld.txt", "This is the content!" ) I don't know which part of my addons I need to put there
which part of your addons to put there? At the part where you want to have the file created
Put them where the addon changes what the rules are.
file.Write( "rule.txt", RULES ) PANEL_TITLE = "Rules" RULES = { "Rule 1", "Rule 2", "Rule 3", "Rule 4", "Rule 5", "Rule 6", "Rule 7", "Rule 8", "Rule 9", "Rule 10", } So like this
Nope. file.Write needs a string, not a table.
Use this to save the table util.TableToJSON and this to load after util.JSONToTable
even tho this is not my thread im gonna ask quickly. Lets say i have a addon with several settings, and i want to save all settings in a txt file. Could i put the settings into a table, convert it into a string, put it in a txt file and then read the string again to use the specific parts of the string for the settings?
Settings = {} Settings.Explode = false function SetExplode(b) Settings.Explode = b SaveSettings() end function SaveSettings() file.Write("settings.txt", util.TableToJSON(Settings)) end function LoadSettings() if (file.Exists("settings.txt","DATA")) then Settings = util.JSONToTable(file.Read("settings.txt")) end end LoadSettings() That's the minimal usage of using a text file for settings
Thx
RuleMenu = {} RuleMenu.Explode = falsefunction SetExplode(b)   RuleMenu.Explode = b   SaveSettings() endfunction SaveRuleMenu()   file.Write("settings.txt", util.TableToJSON(RuleMenu)) endfunction LoadSettings()if (file.Exists("settings.txt","DATA")) then     RuleMenu = util.JSONToTable(file.Read("settings.txt"))   endend LoadSettings() RuleMenu = RuleMenu or {}; RuleMenu.Rules = RuleMenu.Rules or { "Rule 1", "Rule 2", "Rule 3", "Rule 4" }; RuleMenu.Frame = RuleMenu.Frame or nil; function RuleMenu:OpenRuleMenu() local frame = vgui.Create( "DFrame" ); frame:SetTitle( "Rules" ); frame:SetSize( 300, 360 ); frame:MakePopup(); RuleMenu.Frame = frame; local richtext = vgui.Create( "RichText", frame ) richtext:Dock( FILL ) richtext:InsertColorChange( 192, 192, 192, 255 ) richtext.Paint = function() richtext.m_FontName = "titlefont" richtext:SetFontInternal( "titlefont" ) richtext:SetBGColor(Color(0,0,0,0)) richtext.Paint = nil end function frame:SetRules() richtext:SetText( "" ); for i, v in pairs( RuleMenu.Rules ) do richtext:AppendText( v .. "\n" ); end end frame:SetRules(); end net.Receive("OpenRuleMenu", function() RuleMenu:OpenRuleMenu(); end ); function RuleMenu:OpenAdminRuleMenu() local frame = vgui.Create( "DFrame" ) frame:SetSize( 400, 105 ) frame:Center() frame:MakePopup() local rebuildEntry; local default = "Select which rule to edit."; local y = 35; local selectRule = vgui.Create( "DComboBox", frame ); selectRule:SetText( default ); selectRule:SetPos( 5, y ); function frame:RebuildSelect() selectRule:Clear(); selectRule:SetSize( frame:GetWide() - 10, 30 ); for i, v in pairs( RuleMenu.Rules ) do selectRule:AddChoice( v ); end end frame:RebuildSelect(); y = y + selectRule:GetTall() + 5; local selectButton = vgui.Create( "DButton", frame ); selectButton:SetPos( 5, y ); selectButton:SetSize( selectRule:GetSize() ); selectButton:SetText( "Go" ); selectButton.DoClick = function() if( selectRule:GetText() == default ) then LocalPlayer():ChatPrint( "Select a rule!" ); return; end for i, v in pairs( RuleMenu.Rules ) do if( v == selectRule:GetText() ) then rebuildEntry( i ); end end end y = y + selectButton:GetTall() + 5; local hasClicked = false; local TextEntry = vgui.Create( "DTextEntry", frame ) -- create the form as a child of frame TextEntry:SetPos( 5, y ) TextEntry:SetSize( selectButton:GetSize() ) TextEntry:SetVisible( false ); y = y + TextEntry:GetTall() + 5; local Save = vgui.Create( "DButton", frame ); Save:SetText( "Save rule" ); Save:SetVisible( false ); Save:SetPos( 5, y ); Save:SetSize( TextEntry:GetSize() ); function rebuildEntry( i ) if( !hasClicked ) then TextEntry:SetVisible( true ); Save:SetVisible( true ); frame:SetTall( frame:GetTall() + 70 ); end TextEntry:SetText( RuleMenu.Rules[ i ] ) Save.DoClick = function() RuleMenu.Rules[ i ] = TextEntry:GetText(); frame:RebuildSelect(); end end end net.Receive("OpenAdminRuleMenu", function() RuleMenu:OpenAdminRuleMenu(); end ); RuleMenu:OpenRuleMenu(); surface.CreateFont( "titlefont", {  font = "Impact",  size = 25,  weight = 500,  blursize = 0,  scanlines = 0,  antialias = true } ) -------------------CONFIG------------------- PANEL_TITLE = "Rules" RULES = { "Rule 1", "Rule 2", "Rule 3", "Rule 4", "Rule 5", "Rule 6", "Rule 7", "Rule 8", "Rule 9", "Rule 10", } --------------------------------------------- local text = "" local frame = nil local frameadmin = nil surface.CreateFont( "titlefont", {  font = "Impact",  size = 25,  weight = 500,  blursize = 0,  scanlines = 0,  antialias = true } ) It doesn't work
Error or anything?
No i have nothing, the menu just didn't open
How are you trying to open the admin menu? Command? Ect. Show us the code.
That's my clientside RuleMenu = RuleMenu or {}; RuleMenu.Rules = RuleMenu.Rules or { "Rule 1", "Rule 2", "Rule 3", "Rule 4" }; RuleMenu.Frame = RuleMenu.Frame or nil; function RuleMenu:OpenRuleMenu() local frame = vgui.Create( "DFrame" ); frame:SetTitle( "Rules" ); frame:SetSize( 300, 360 ); frame:MakePopup(); RuleMenu.Frame = frame; local richtext = vgui.Create( "RichText", frame ) richtext:Dock( FILL ) richtext:InsertColorChange( 192, 192, 192, 255 ) richtext.Paint = function() richtext.m_FontName = "titlefont" richtext:SetFontInternal( "titlefont" ) richtext:SetBGColor(Color(0,0,0,0)) richtext.Paint = nil end function frame:SetRules() richtext:SetText( "" ); for i, v in pairs( RuleMenu.Rules ) do richtext:AppendText( v .. "\n" ); end end frame:SetRules(); end net.Receive("OpenRuleMenu", function() RuleMenu:OpenRuleMenu(); end ); function RuleMenu:OpenAdminRuleMenu() local frame = vgui.Create( "DFrame" ) frame:SetSize( 400, 105 ) frame:Center() frame:MakePopup() local rebuildEntry; local default = "Select which rule to edit."; local y = 35; local selectRule = vgui.Create( "DComboBox", frame ); selectRule:SetText( default ); selectRule:SetPos( 5, y ); function frame:RebuildSelect() selectRule:Clear(); selectRule:SetSize( frame:GetWide() - 10, 30 ); for i, v in pairs( RuleMenu.Rules ) do selectRule:AddChoice( v ); end end frame:RebuildSelect(); y = y + selectRule:GetTall() + 5; local selectButton = vgui.Create( "DButton", frame ); selectButton:SetPos( 5, y ); selectButton:SetSize( selectRule:GetSize() ); selectButton:SetText( "Go" ); selectButton.DoClick = function() if( selectRule:GetText() == default ) then LocalPlayer():ChatPrint( "Select a rule!" ); return; end for i, v in pairs( RuleMenu.Rules ) do if( v == selectRule:GetText() ) then rebuildEntry( i ); end end end y = y + selectButton:GetTall() + 5; local hasClicked = false; local TextEntry = vgui.Create( "DTextEntry", frame ) -- create the form as a child of frame TextEntry:SetPos( 5, y ) TextEntry:SetSize( selectButton:GetSize() ) TextEntry:SetVisible( false ); y = y + TextEntry:GetTall() + 5; local Save = vgui.Create( "DButton", frame ); Save:SetText( "Save rule" ); Save:SetVisible( false ); Save:SetPos( 5, y ); Save:SetSize( TextEntry:GetSize() ); function rebuildEntry( i ) if( !hasClicked ) then TextEntry:SetVisible( true ); Save:SetVisible( true ); frame:SetTall( frame:GetTall() + 70 ); end TextEntry:SetText( RuleMenu.Rules[ i ] ) Save.DoClick = function() RuleMenu.Rules[ i ] = TextEntry:GetText(); frame:RebuildSelect(); end end end net.Receive("OpenAdminRuleMenu", function() RuleMenu:OpenAdminRuleMenu(); end ); RuleMenu:OpenRuleMenu(); surface.CreateFont( "titlefont", {  font = "Impact",  size = 25,  weight = 500,  blursize = 0,  scanlines = 0,  antialias = true } ) -------------------CONFIG------------------- PANEL_TITLE = "Rules" RULES = { "Rule 1", "Rule 2", "Rule 3", "Rule 4", "Rule 5", "Rule 6", "Rule 7", "Rule 8", "Rule 9", "Rule 10", } --------------------------------------------- local text = "" local frame = nil local frameadmin = nil surface.CreateFont( "titlefont", {  font = "Impact",  size = 25,  weight = 500,  blursize = 0,  scanlines = 0,  antialias = true } ) That's my serverside -- lua/autorun/server --That's the command that is used to open the menu local PANEL_COMMAND = "/rules" util.AddNetworkString("OpenRuleMenu") hook.Add("PlayerSay", "OpenTheRuleMenuPLS", function(ply, text, public)     if string.lower( text ) == PANEL_COMMAND then         net.Start("OpenRuleMenu")         net.Send(ply)         return ""     end end) local PANEL_ADMINCOMMAND = "/adminrules" util.AddNetworkString("OpenAdminRuleMenu") hook.Add("PlayerSay", "OpenTheAdminRuleMenuPLS", function(ply, text, public)     if string.lower( text ) == PANEL_ADMINCOMMAND then         net.Start("OpenAdminRuleMenu")         net.Send(ply)         return ""     end end) file.Write( "rules.txt", "what to write" )
Try this code. https://pastebin.com/G0Q6RDVY
Thx now my menu open correctly, but the rules doesn't save after a server restart
Did u do a menu like this: https://puu.sh/Aj5dI/9103d4a2cf.png ? i could try helping u if u want
No it's just a little menu for my server everythings is already created but im not able to do that when a server restart all the rules stay in the menu, because i made an admin menu to change the rules
Why did u do an admin menu at all? I mean rules won't change suddenly ingame.. You can do a simple config doing that and then just read the config variables and load them.
Sorry, you need to Log In to post a reply to this thread.