Skip to content

Commit 118d58e

Browse files
authored
admin2: Add ability to change server configuration settings (#469)
1 parent 1dcb295 commit 118d58e

File tree

6 files changed

+267
-32
lines changed

6 files changed

+267
-32
lines changed

[admin]/admin2/client/main/admin_server.lua

+17-11
Original file line numberDiff line numberDiff line change
@@ -106,25 +106,29 @@ function aServerTab.Create(tab)
106106
aServerTab.FPS = guiCreateEdit(0.35, 0.710, 0.135, 0.04, fpsLimit, true, tab)
107107
aServerTab.FPSSet = guiCreateButton(0.50, 0.710, 0.10, 0.04, "Set", true, tab, "setfpslimit")
108108

109-
guiCreateHeader(0.02, 0.755, 0.30, 0.035, "Automatic scripts:", true, tab)
109+
aServerTab.ServerConf = guiCreateLabel(0.03, 0.755, 0.25, 0.035, "Server configuration", true, tab)
110+
aServerTab.ServerConfSet = guiCreateButton(0.35, 0.755, 0.25, 0.04, "Change", true, tab, "setserverconf")
111+
aServerConfig.Open()
112+
113+
guiCreateHeader(0.02, 0.8, 0.30, 0.035, "Automatic scripts:", true, tab)
110114
aServerTab.PingKickerCheck =
111-
guiCreateCheckBox(0.03, 0.800, 0.30, 0.04, "Ping Kicker", false, true, tab, "setpingkicker")
112-
aServerTab.PingKicker = guiCreateEdit(0.35, 0.800, 0.135, 0.04, "300", true, tab)
113-
aServerTab.PingKickerSet = guiCreateButton(0.50, 0.800, 0.10, 0.04, "Set", true, tab, "setpingkicker")
115+
guiCreateCheckBox(0.03, 0.845, 0.30, 0.04, "Ping Kicker", false, true, tab, "setpingkicker")
116+
aServerTab.PingKicker = guiCreateEdit(0.35, 0.845, 0.135, 0.04, "300", true, tab)
117+
aServerTab.PingKickerSet = guiCreateButton(0.50, 0.845, 0.10, 0.04, "Set", true, tab, "setpingkicker")
114118
guiSetEnabled(aServerTab.PingKicker, false)
115119
guiSetEnabled(aServerTab.PingKickerSet, false)
116120

117121
aServerTab.FPSKickerCheck =
118-
guiCreateCheckBox(0.03, 0.845, 0.30, 0.04, "FPS Kicker", false, true, tab, "setfpskicker")
119-
aServerTab.FPSKicker = guiCreateEdit(0.35, 0.845, 0.135, 0.04, "5", true, tab)
120-
aServerTab.FPSKickerSet = guiCreateButton(0.50, 0.845, 0.10, 0.04, "Set", true, tab, "setfpskicker")
122+
guiCreateCheckBox(0.03, 0.89, 0.30, 0.04, "FPS Kicker", false, true, tab, "setfpskicker")
123+
aServerTab.FPSKicker = guiCreateEdit(0.35, 0.89, 0.135, 0.04, "5", true, tab)
124+
aServerTab.FPSKickerSet = guiCreateButton(0.50, 0.89, 0.10, 0.04, "Set", true, tab, "setfpskicker")
121125
guiSetEnabled(aServerTab.FPSKicker, false)
122126
guiSetEnabled(aServerTab.FPSKickerSet, false)
123127

124128
aServerTab.IdleKickerCheck =
125-
guiCreateCheckBox(0.03, 0.890, 0.30, 0.04, "Idle Kicker", false, true, tab, "setidlekicker")
126-
aServerTab.IdleKicker = guiCreateEdit(0.35, 0.890, 0.135, 0.04, "10", true, tab)
127-
aServerTab.IdleKickerSet = guiCreateButton(0.50, 0.890, 0.10, 0.04, "Set", true, tab, "setidlekicker")
129+
guiCreateCheckBox(0.03, 0.935, 0.30, 0.04, "Idle Kicker", false, true, tab, "setidlekicker")
130+
aServerTab.IdleKicker = guiCreateEdit(0.35, 0.935, 0.135, 0.04, "10", true, tab)
131+
aServerTab.IdleKickerSet = guiCreateButton(0.50, 0.935, 0.10, 0.04, "Set", true, tab, "setidlekicker")
128132
guiSetEnabled(aServerTab.IdleKicker, false)
129133
guiSetEnabled(aServerTab.IdleKickerSet, false)
130134

@@ -287,6 +291,8 @@ function aServerTab.onClientClick(button)
287291
else
288292
messageBox("Invalid FPS limit: range is 25 - 32767, or 0 for default.", MB_ERROR, MB_OK)
289293
end
294+
elseif (source == aServerTab.ServerConfSet) then
295+
aServerConfig.Open()
290296
elseif (source == aServerTab.QuickReload) then
291297
triggerServerEvent(
292298
"aServer",
@@ -542,4 +548,4 @@ end)
542548

543549
function getWeatherNameFromID(weather)
544550
return iif(aServerTab.Weathers[weather], aServerTab.Weathers[weather], "Unknown")
545-
end
551+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
--[[**********************************
2+
*
3+
* Multi Theft Auto - Admin Panel
4+
*
5+
* client\widgets\admin_server_conf.lua
6+
*
7+
**************************************]]
8+
aServerConfig = {
9+
Intervals = {
10+
player_sync_interval = "Player Sync",
11+
lightweight_sync_interval = "Lightweight Sync",
12+
camera_sync_interval = "Camera Sync",
13+
ped_sync_interval = "Ped Sync",
14+
unoccupied_vehicle_sync_interval = "Unoccupied Vehicle Sync",
15+
keysync_mouse_sync_interval = "Mouse Key Sync",
16+
keysync_analog_sync_interval = "Analog Key Sync",
17+
player_triggered_event_interval = "Player Triggered Event"
18+
}
19+
}
20+
21+
function aServerConfig.Open()
22+
if (not isElement(aServerConfig.Form)) then
23+
local x,y = guiGetScreenSize()
24+
25+
aServerConfig.Form = guiCreateWindow(x/2 - 240, y/2 - 215, 480, 430, "Server Configuration", false)
26+
27+
guiCreateHeader(0.05, 0.052, 0.3, 0.04, "Connection:", true, aServerConfig.Form)
28+
29+
aServerConfig.minVersion = guiCreateLabel(0.1, 0.089, 0.5, 0.04, "Minimum Client Version:", true, aServerConfig.Form)
30+
aServerConfig.minVersionField = guiCreateEdit(0.725, 0.089, 0.25, 0.04, "", true, aServerConfig.Form)
31+
32+
aServerConfig.recVersion = guiCreateLabel(0.1, 0.141, 0.5, 0.04, "Recommended Client Version:", true, aServerConfig.Form)
33+
aServerConfig.recVersionField = guiCreateEdit(0.725, 0.141, 0.25, 0.04, "", true, aServerConfig.Form)
34+
35+
guiCreateHeader(0.05, 0.193, 0.3, 0.04, "Performance:", true, aServerConfig.Form)
36+
37+
aServerConfig.bandwidth = guiCreateLabel(0.1, 0.23, 0.5, 0.04, "Bandwidth Reduction:", true, aServerConfig.Form)
38+
39+
aServerConfig.bandwidthCombo = guiCreateComboBox(0.725, 0.23, 0.2, 0.2, "", true, aServerConfig.Form)
40+
guiComboBoxAddItem(aServerConfig.bandwidthCombo, "None")
41+
guiComboBoxAddItem(aServerConfig.bandwidthCombo, "Medium")
42+
guiComboBoxAddItem(aServerConfig.bandwidthCombo, "Maximum")
43+
44+
aServerConfig.bulletSync = guiCreateLabel(0.1, 0.292, 0.5, 0.04, "Bullet Sync:", true, aServerConfig.Form)
45+
aServerConfig.bulletSyncCombo = guiCreateComboBox(0.725, 0.292, 0.2, 0.2, "", true, aServerConfig.Form)
46+
guiComboBoxAddItem(aServerConfig.bulletSyncCombo, "False")
47+
guiComboBoxAddItem(aServerConfig.bulletSyncCombo, "True")
48+
49+
aServerConfig.maxTriggers = guiCreateLabel(0.1, 0.354, 0.55, 0.04, "Max player triggered events per interval:", true, aServerConfig.Form)
50+
aServerConfig.maxTriggersField = guiCreateEdit(0.725, 0.354, 0.2, 0.04, "", true, aServerConfig.Form)
51+
guiEditSetMaxLength(aServerConfig.maxTriggersField, 4)
52+
53+
guiCreateHeader(0.05, 0.406, 0.3, 0.04, "Intervals:", true, aServerConfig.Form);
54+
55+
local i = 1
56+
local py = 0
57+
for k,v in pairs(aServerConfig.Intervals) do
58+
py = 0.443 + 0.052 * (i - 1)
59+
guiCreateLabel(0.1, py, 0.5, 0.04, v..":", true, aServerConfig.Form)
60+
61+
aServerConfig[k] = guiCreateEdit(0.725, py, 0.2, 0.04, "", true, aServerConfig.Form)
62+
guiEditSetMaxLength(aServerConfig[k], 4)
63+
i = i + 1
64+
end
65+
66+
aServerConfig.infoLabel = guiCreateLabel(0, py + 0.052, 1, 0.2, "WARNING\nIf you don't know what you're doing, close this window.", true, aServerConfig.Form)
67+
guiLabelSetHorizontalAlign(aServerConfig.infoLabel, "center", true)
68+
guiLabelSetColor(aServerConfig.infoLabel, 255,0,0)
69+
guiSetFont(aServerConfig.infoLabel, "default-bold-small")
70+
71+
aServerConfig.saveButton = guiCreateButton(0.25, 0.93, 0.2, 0.1, "Save", true, aServerConfig.Form)
72+
aServerConfig.closeButton = guiCreateButton(0.55, 0.93, 0.2, 0.1, "Close", true, aServerConfig.Form)
73+
74+
guiSetVisible(aServerConfig.Form, false)
75+
76+
aRegister("ServerConfig", aServerConfig.Form, aServerConfig.Open, aServerConfig.Close)
77+
else
78+
guiSetVisible(aServerConfig.Form, true)
79+
guiBringToFront(aServerConfig.Form)
80+
end
81+
82+
addEventHandler("onClientGUIClick", aServerConfig.Form, aServerConfig.onClientClick)
83+
addEventHandler('onClientGUIChanged', aServerConfig.Form, aServerConfig.onClientChanged)
84+
addEventHandler("onAdminRefresh", aServerConfig.Form, aServerConfig.Refresh)
85+
86+
aServerConfig.Refresh()
87+
end
88+
89+
function aServerConfig.Close(destroy)
90+
if (destroy) then
91+
destroyElement(aServerConfig.Form)
92+
else
93+
removeEventHandler('onClientGUIClick', aServerConfig.Form, aServerConfig.onClientClick)
94+
removeEventHandler('onClientGUIChanged', aServerConfig.Form, aServerConfig.onClientChanged)
95+
removeEventHandler('onAdminRefresh', aServerConfig.Form, aServerConfig.Refresh)
96+
97+
guiSetVisible(aServerConfig.Form, false)
98+
end
99+
end
100+
101+
function aServerConfig.onClientChanged()
102+
local actualText = guiGetText(source)
103+
local character = actualText:sub(#actualText, #actualText)
104+
if (not tonumber(character) and character ~= '.' and character ~= '-') then
105+
guiSetText(source, actualText:sub(0, #actualText - 1))
106+
end
107+
end
108+
109+
function aServerConfig.onClientClick(button)
110+
if (button == "left") then
111+
if (source == aServerConfig.closeButton) then
112+
aServerConfig.Close()
113+
elseif (source == aServerConfig.saveButton) then
114+
local triggersPerInterval = guiGetText(aServerConfig.maxTriggersField)
115+
local cameraSyncInterval = guiGetText(aServerConfig.camera_sync_interval)
116+
local playerSyncInterval = guiGetText(aServerConfig.player_sync_interval)
117+
local playerTriggeredEventInterval = guiGetText(aServerConfig.player_triggered_event_interval)
118+
local keySyncAnalogInterval = guiGetText(aServerConfig.keysync_analog_sync_interval)
119+
local keySyncMouseInterval = guiGetText(aServerConfig.keysync_mouse_sync_interval)
120+
local pedSyncInterval = guiGetText(aServerConfig.ped_sync_interval)
121+
local unoccupiedVehicleSyncInterval = guiGetText(aServerConfig.unoccupied_vehicle_sync_interval)
122+
local lightWeightSyncInterval = guiGetText(aServerConfig.lightweight_sync_interval)
123+
124+
if (#triggersPerInterval <= 0 or tonumber(triggersPerInterval) < 1 or tonumber(triggersPerInterval) > 1000) then
125+
messageBox("The range for 'Max player triggered events per interval' is: 1-1000", MB_ERROR, MB_OK)
126+
return
127+
end
128+
129+
if (#cameraSyncInterval <= 0 or tonumber(cameraSyncInterval) < 50 or tonumber(cameraSyncInterval) > 4000) then
130+
messageBox("The range for 'Camera sync interval' is: 50-4000", MB_ERROR, MB_OK)
131+
return
132+
end
133+
134+
if (#playerSyncInterval <= 0 or tonumber(playerSyncInterval) < 50 or tonumber(playerSyncInterval) > 4000) then
135+
messageBox("The range for 'Player sync interval' is: 50-4000", MB_ERROR, MB_OK)
136+
return
137+
end
138+
139+
if (#playerTriggeredEventInterval <= 0 or tonumber(playerTriggeredEventInterval) < 50 or tonumber(playerTriggeredEventInterval) > 5000) then
140+
messageBox("The range for 'Player triggered event interval' is: 50-5000", MB_ERROR, MB_OK)
141+
return
142+
end
143+
144+
if (#keySyncAnalogInterval <= 0 or tonumber(keySyncAnalogInterval) < 50 or tonumber(keySyncAnalogInterval) > 4000) then
145+
messageBox("The range for 'Analog key sync interval' is: 50-4000", MB_ERROR, MB_OK)
146+
return
147+
end
148+
149+
if (#keySyncMouseInterval <= 0 or tonumber(keySyncMouseInterval) < 50 or tonumber(keySyncMouseInterval) > 4000) then
150+
messageBox("The range for 'Mouse key sync interval' is: 50-4000", MB_ERROR, MB_OK)
151+
return
152+
end
153+
154+
if (#pedSyncInterval <= 0 or tonumber(pedSyncInterval) < 50 or tonumber(pedSyncInterval) > 4000) then
155+
messageBox("The range for 'Ped sync interval' is: 50-4000", MB_ERROR, MB_OK)
156+
return
157+
end
158+
159+
if (#unoccupiedVehicleSyncInterval <= 0 or tonumber(unoccupiedVehicleSyncInterval) < 50 or tonumber(unoccupiedVehicleSyncInterval) > 4000) then
160+
messageBox("The range for 'Unoccupied vehicle sync interval' is: 50-4000", MB_ERROR, MB_OK)
161+
return
162+
end
163+
164+
if (#lightWeightSyncInterval <= 0 or tonumber(lightWeightSyncInterval) < 200 or tonumber(lightWeightSyncInterval) > 4000) then
165+
messageBox("The range for 'Lightweight sync interval' is: 200-4000", MB_ERROR, MB_OK)
166+
return
167+
end
168+
169+
if (messageBox("Are you sure you want to save the server configuration changes?", MB_QUESTION, MB_YESNO)) then
170+
triggerServerEvent("aServer", localPlayer, "setconfig", {
171+
minclientversion = guiGetText(aServerConfig.minVersionField),
172+
recommendedclientversion = guiGetText(aServerConfig.recVersionField),
173+
bandwidth_reduction = guiComboBoxGetItemText(aServerConfig.bandwidthCombo, guiComboBoxGetSelected(aServerConfig.bandwidthCombo)):lower() or "medium",
174+
bullet_sync = tostring(guiComboBoxGetSelected(aServerConfig.bulletSyncCombo)),
175+
max_player_triggered_events_per_interval = triggersPerInterval,
176+
camera_sync_interval = cameraSyncInterval,
177+
player_sync_interval = playerSyncInterval,
178+
player_triggered_event_interval = playerTriggeredEventInterval,
179+
keysync_analog_sync_interval = keySyncAnalogInterval,
180+
keysync_mouse_sync_interval = keySyncMouseInterval,
181+
ped_sync_interval = pedSyncInterval,
182+
unoccupied_vehicle_sync_interval = unoccupiedVehicleSyncInterval,
183+
lightweight_sync_interval = lightWeightSyncInterval
184+
})
185+
186+
aServerConfig.Close()
187+
end
188+
end
189+
end
190+
end
191+
192+
function aServerConfig.Refresh()
193+
triggerServerEvent("aServerConfigRefresh", localPlayer)
194+
end
195+
196+
addEvent("aClientConfigRefresh", true)
197+
addEventHandler("aClientConfigRefresh", localPlayer, function(minclientversion, recommendedclientversion, bandwidthreduction, bulletsync, maxplayertriggers, camerasync_interval, playersync_interval, playertriggers_interval, keysync_analog_interval, keysync_mousse_interval, pedsync_interval, unoccupiedvehicle_interval, lightweight_interval)
198+
guiSetText(aServerConfig.minVersionField, minclientversion)
199+
guiSetText(aServerConfig.recVersionField, recommendedclientversion)
200+
201+
guiComboBoxSetSelected(aServerConfig.bandwidthCombo, (bandwidthreduction == "none" and 0 or (bandwidthreduction == "medium" and 1 or 2)) or 0)
202+
guiComboBoxSetSelected(aServerConfig.bulletSyncCombo, tonumber(bulletsync))
203+
204+
guiSetText(aServerConfig.maxTriggersField, maxplayertriggers)
205+
guiSetText(aServerConfig.camera_sync_interval, camerasync_interval)
206+
guiSetText(aServerConfig.player_sync_interval, playersync_interval)
207+
guiSetText(aServerConfig.player_triggered_event_interval, playertriggers_interval)
208+
guiSetText(aServerConfig.keysync_analog_sync_interval, keysync_analog_interval)
209+
guiSetText(aServerConfig.keysync_mouse_sync_interval, keysync_mousse_interval)
210+
guiSetText(aServerConfig.ped_sync_interval, pedsync_interval)
211+
guiSetText(aServerConfig.unoccupied_vehicle_sync_interval, unoccupiedvehicle_interval)
212+
guiSetText(aServerConfig.lightweight_sync_interval, lightweight_interval)
213+
end)

[admin]/admin2/conf/ACL.xml

+4
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
<right name="command.setfpskicker" access="true" />
7878
<right name="command.setidlekicker" access="true" />
7979
<right name="command.clearchat" access="true" />
80+
<right name="command.setserverconf" access="true" />
8081
<!--Bans related-->
8182
<right name="command.ban" access="true" />
8283
<right name="command.unban" access="true" />
@@ -159,6 +160,7 @@
159160
<right name="command.setfpskicker" access="false" />
160161
<right name="command.setidlekicker" access="false" />
161162
<right name="command.clearchat" access="true" />
163+
<right name="command.setserverconf" access="false" />
162164
<!--Bans related-->
163165
<right name="command.ban" access="true" />
164166
<right name="command.unban" access="true" />
@@ -241,6 +243,7 @@
241243
<right name="command.setfpskicker" access="false" />
242244
<right name="command.setidlekicker" access="false" />
243245
<right name="command.clearchat" access="true" />
246+
<right name="command.setserverconf" access="false" />
244247
<!--Bans related-->
245248
<right name="command.ban" access="false" />
246249
<right name="command.unban" access="false" />
@@ -320,6 +323,7 @@
320323
<right name="command.setfpskicker" access="false" />
321324
<right name="command.setidlekicker" access="false" />
322325
<right name="command.clearchat" access="false" />
326+
<right name="command.setserverconf" access="false" />
323327
<!--Bans related-->
324328
<right name="command.ban" access="false" />
325329
<right name="command.unban" access="false" />

[admin]/admin2/meta.xml

+2-1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
<script src="client/widgets/admin_vehicle.lua" type="client" cache="false"/>
6161
<script src="client/widgets/admin_interior.lua" type="client" cache="false"/>
6262
<script src="client/widgets/admin_screenshot.lua" type="client" cache="false"/>
63+
<script src="client/widgets/admin_server_conf.lua" type="client" cache="false" />
6364
<script src="client/widgets/admin_ban.lua" type="client" cache="false"/>
6465
<script src="client/widgets/admin_ban_details.lua" type="client" cache="false"/>
6566
<script src="client/widgets/admin_warp.lua" type="client" cache="false"/>
@@ -109,4 +110,4 @@
109110
<setting name="#adminChatCommandName" value="a" group="General" friendlyname="Admin chat command name" desc="The command name for admin chat."/>
110111
<setting name="*useip2c" value="true" friendlyname="useip2c" group="_Advanced" accept="true,false" desc="When enabled, ip2c resource runs and fetches player countries by IP."/>
111112
</settings>
112-
</meta>
113+
</meta>

[admin]/admin2/server/admin_functions.lua

+7-1
Original file line numberDiff line numberDiff line change
@@ -480,8 +480,14 @@ aFunctions = {
480480
["clearchat"] = function()
481481
clearChatBox()
482482
return true
483+
end,
484+
["setconfig"] = function(configData)
485+
for k,v in pairs(configData) do
486+
setServerConfigSetting(k,v, true)
487+
end
488+
return true
483489
end
484490
},
485491
admin = {},
486492
bans = {}
487-
}
493+
}

0 commit comments

Comments
 (0)