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.
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.