diff --git a/[admin]/admin2/client/main/admin_server.lua b/[admin]/admin2/client/main/admin_server.lua
index 84db9afc4..5c527776c 100644
--- a/[admin]/admin2/client/main/admin_server.lua
+++ b/[admin]/admin2/client/main/admin_server.lua
@@ -106,25 +106,29 @@ function aServerTab.Create(tab)
aServerTab.FPS = guiCreateEdit(0.35, 0.710, 0.135, 0.04, fpsLimit, true, tab)
aServerTab.FPSSet = guiCreateButton(0.50, 0.710, 0.10, 0.04, "Set", true, tab, "setfpslimit")
- guiCreateHeader(0.02, 0.755, 0.30, 0.035, "Automatic scripts:", true, tab)
+ aServerTab.ServerConf = guiCreateLabel(0.03, 0.755, 0.25, 0.035, "Server configuration", true, tab)
+ aServerTab.ServerConfSet = guiCreateButton(0.35, 0.755, 0.25, 0.04, "Change", true, tab, "setserverconf")
+ aServerConfig.Open()
+
+ guiCreateHeader(0.02, 0.8, 0.30, 0.035, "Automatic scripts:", true, tab)
aServerTab.PingKickerCheck =
- guiCreateCheckBox(0.03, 0.800, 0.30, 0.04, "Ping Kicker", false, true, tab, "setpingkicker")
- aServerTab.PingKicker = guiCreateEdit(0.35, 0.800, 0.135, 0.04, "300", true, tab)
- aServerTab.PingKickerSet = guiCreateButton(0.50, 0.800, 0.10, 0.04, "Set", true, tab, "setpingkicker")
+ guiCreateCheckBox(0.03, 0.845, 0.30, 0.04, "Ping Kicker", false, true, tab, "setpingkicker")
+ aServerTab.PingKicker = guiCreateEdit(0.35, 0.845, 0.135, 0.04, "300", true, tab)
+ aServerTab.PingKickerSet = guiCreateButton(0.50, 0.845, 0.10, 0.04, "Set", true, tab, "setpingkicker")
guiSetEnabled(aServerTab.PingKicker, false)
guiSetEnabled(aServerTab.PingKickerSet, false)
aServerTab.FPSKickerCheck =
- guiCreateCheckBox(0.03, 0.845, 0.30, 0.04, "FPS Kicker", false, true, tab, "setfpskicker")
- aServerTab.FPSKicker = guiCreateEdit(0.35, 0.845, 0.135, 0.04, "5", true, tab)
- aServerTab.FPSKickerSet = guiCreateButton(0.50, 0.845, 0.10, 0.04, "Set", true, tab, "setfpskicker")
+ guiCreateCheckBox(0.03, 0.89, 0.30, 0.04, "FPS Kicker", false, true, tab, "setfpskicker")
+ aServerTab.FPSKicker = guiCreateEdit(0.35, 0.89, 0.135, 0.04, "5", true, tab)
+ aServerTab.FPSKickerSet = guiCreateButton(0.50, 0.89, 0.10, 0.04, "Set", true, tab, "setfpskicker")
guiSetEnabled(aServerTab.FPSKicker, false)
guiSetEnabled(aServerTab.FPSKickerSet, false)
aServerTab.IdleKickerCheck =
- guiCreateCheckBox(0.03, 0.890, 0.30, 0.04, "Idle Kicker", false, true, tab, "setidlekicker")
- aServerTab.IdleKicker = guiCreateEdit(0.35, 0.890, 0.135, 0.04, "10", true, tab)
- aServerTab.IdleKickerSet = guiCreateButton(0.50, 0.890, 0.10, 0.04, "Set", true, tab, "setidlekicker")
+ guiCreateCheckBox(0.03, 0.935, 0.30, 0.04, "Idle Kicker", false, true, tab, "setidlekicker")
+ aServerTab.IdleKicker = guiCreateEdit(0.35, 0.935, 0.135, 0.04, "10", true, tab)
+ aServerTab.IdleKickerSet = guiCreateButton(0.50, 0.935, 0.10, 0.04, "Set", true, tab, "setidlekicker")
guiSetEnabled(aServerTab.IdleKicker, false)
guiSetEnabled(aServerTab.IdleKickerSet, false)
@@ -287,6 +291,8 @@ function aServerTab.onClientClick(button)
else
messageBox("Invalid FPS limit: range is 25 - 32767, or 0 for default.", MB_ERROR, MB_OK)
end
+ elseif (source == aServerTab.ServerConfSet) then
+ aServerConfig.Open()
elseif (source == aServerTab.QuickReload) then
triggerServerEvent(
"aServer",
@@ -542,4 +548,4 @@ end)
function getWeatherNameFromID(weather)
return iif(aServerTab.Weathers[weather], aServerTab.Weathers[weather], "Unknown")
-end
+end
\ No newline at end of file
diff --git a/[admin]/admin2/client/widgets/admin_server_conf.lua b/[admin]/admin2/client/widgets/admin_server_conf.lua
new file mode 100644
index 000000000..9b14827d3
--- /dev/null
+++ b/[admin]/admin2/client/widgets/admin_server_conf.lua
@@ -0,0 +1,213 @@
+--[[**********************************
+*
+* Multi Theft Auto - Admin Panel
+*
+* client\widgets\admin_server_conf.lua
+*
+**************************************]]
+aServerConfig = {
+ Intervals = {
+ player_sync_interval = "Player Sync",
+ lightweight_sync_interval = "Lightweight Sync",
+ camera_sync_interval = "Camera Sync",
+ ped_sync_interval = "Ped Sync",
+ unoccupied_vehicle_sync_interval = "Unoccupied Vehicle Sync",
+ keysync_mouse_sync_interval = "Mouse Key Sync",
+ keysync_analog_sync_interval = "Analog Key Sync",
+ player_triggered_event_interval = "Player Triggered Event"
+ }
+}
+
+function aServerConfig.Open()
+ if (not isElement(aServerConfig.Form)) then
+ local x,y = guiGetScreenSize()
+
+ aServerConfig.Form = guiCreateWindow(x/2 - 240, y/2 - 215, 480, 430, "Server Configuration", false)
+
+ guiCreateHeader(0.05, 0.052, 0.3, 0.04, "Connection:", true, aServerConfig.Form)
+
+ aServerConfig.minVersion = guiCreateLabel(0.1, 0.089, 0.5, 0.04, "Minimum Client Version:", true, aServerConfig.Form)
+ aServerConfig.minVersionField = guiCreateEdit(0.725, 0.089, 0.25, 0.04, "", true, aServerConfig.Form)
+
+ aServerConfig.recVersion = guiCreateLabel(0.1, 0.141, 0.5, 0.04, "Recommended Client Version:", true, aServerConfig.Form)
+ aServerConfig.recVersionField = guiCreateEdit(0.725, 0.141, 0.25, 0.04, "", true, aServerConfig.Form)
+
+ guiCreateHeader(0.05, 0.193, 0.3, 0.04, "Performance:", true, aServerConfig.Form)
+
+ aServerConfig.bandwidth = guiCreateLabel(0.1, 0.23, 0.5, 0.04, "Bandwidth Reduction:", true, aServerConfig.Form)
+
+ aServerConfig.bandwidthCombo = guiCreateComboBox(0.725, 0.23, 0.2, 0.2, "", true, aServerConfig.Form)
+ guiComboBoxAddItem(aServerConfig.bandwidthCombo, "None")
+ guiComboBoxAddItem(aServerConfig.bandwidthCombo, "Medium")
+ guiComboBoxAddItem(aServerConfig.bandwidthCombo, "Maximum")
+
+ aServerConfig.bulletSync = guiCreateLabel(0.1, 0.292, 0.5, 0.04, "Bullet Sync:", true, aServerConfig.Form)
+ aServerConfig.bulletSyncCombo = guiCreateComboBox(0.725, 0.292, 0.2, 0.2, "", true, aServerConfig.Form)
+ guiComboBoxAddItem(aServerConfig.bulletSyncCombo, "False")
+ guiComboBoxAddItem(aServerConfig.bulletSyncCombo, "True")
+
+ aServerConfig.maxTriggers = guiCreateLabel(0.1, 0.354, 0.55, 0.04, "Max player triggered events per interval:", true, aServerConfig.Form)
+ aServerConfig.maxTriggersField = guiCreateEdit(0.725, 0.354, 0.2, 0.04, "", true, aServerConfig.Form)
+ guiEditSetMaxLength(aServerConfig.maxTriggersField, 4)
+
+ guiCreateHeader(0.05, 0.406, 0.3, 0.04, "Intervals:", true, aServerConfig.Form);
+
+ local i = 1
+ local py = 0
+ for k,v in pairs(aServerConfig.Intervals) do
+ py = 0.443 + 0.052 * (i - 1)
+ guiCreateLabel(0.1, py, 0.5, 0.04, v..":", true, aServerConfig.Form)
+
+ aServerConfig[k] = guiCreateEdit(0.725, py, 0.2, 0.04, "", true, aServerConfig.Form)
+ guiEditSetMaxLength(aServerConfig[k], 4)
+ i = i + 1
+ end
+
+ 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)
+ guiLabelSetHorizontalAlign(aServerConfig.infoLabel, "center", true)
+ guiLabelSetColor(aServerConfig.infoLabel, 255,0,0)
+ guiSetFont(aServerConfig.infoLabel, "default-bold-small")
+
+ aServerConfig.saveButton = guiCreateButton(0.25, 0.93, 0.2, 0.1, "Save", true, aServerConfig.Form)
+ aServerConfig.closeButton = guiCreateButton(0.55, 0.93, 0.2, 0.1, "Close", true, aServerConfig.Form)
+
+ guiSetVisible(aServerConfig.Form, false)
+
+ aRegister("ServerConfig", aServerConfig.Form, aServerConfig.Open, aServerConfig.Close)
+ else
+ guiSetVisible(aServerConfig.Form, true)
+ guiBringToFront(aServerConfig.Form)
+ end
+
+ addEventHandler("onClientGUIClick", aServerConfig.Form, aServerConfig.onClientClick)
+ addEventHandler('onClientGUIChanged', aServerConfig.Form, aServerConfig.onClientChanged)
+ addEventHandler("onAdminRefresh", aServerConfig.Form, aServerConfig.Refresh)
+
+ aServerConfig.Refresh()
+end
+
+function aServerConfig.Close(destroy)
+ if (destroy) then
+ destroyElement(aServerConfig.Form)
+ else
+ removeEventHandler('onClientGUIClick', aServerConfig.Form, aServerConfig.onClientClick)
+ removeEventHandler('onClientGUIChanged', aServerConfig.Form, aServerConfig.onClientChanged)
+ removeEventHandler('onAdminRefresh', aServerConfig.Form, aServerConfig.Refresh)
+
+ guiSetVisible(aServerConfig.Form, false)
+ end
+end
+
+function aServerConfig.onClientChanged()
+ local actualText = guiGetText(source)
+ local character = actualText:sub(#actualText, #actualText)
+ if (not tonumber(character) and character ~= '.' and character ~= '-') then
+ guiSetText(source, actualText:sub(0, #actualText - 1))
+ end
+end
+
+function aServerConfig.onClientClick(button)
+ if (button == "left") then
+ if (source == aServerConfig.closeButton) then
+ aServerConfig.Close()
+ elseif (source == aServerConfig.saveButton) then
+ local triggersPerInterval = guiGetText(aServerConfig.maxTriggersField)
+ local cameraSyncInterval = guiGetText(aServerConfig.camera_sync_interval)
+ local playerSyncInterval = guiGetText(aServerConfig.player_sync_interval)
+ local playerTriggeredEventInterval = guiGetText(aServerConfig.player_triggered_event_interval)
+ local keySyncAnalogInterval = guiGetText(aServerConfig.keysync_analog_sync_interval)
+ local keySyncMouseInterval = guiGetText(aServerConfig.keysync_mouse_sync_interval)
+ local pedSyncInterval = guiGetText(aServerConfig.ped_sync_interval)
+ local unoccupiedVehicleSyncInterval = guiGetText(aServerConfig.unoccupied_vehicle_sync_interval)
+ local lightWeightSyncInterval = guiGetText(aServerConfig.lightweight_sync_interval)
+
+ if (#triggersPerInterval <= 0 or tonumber(triggersPerInterval) < 1 or tonumber(triggersPerInterval) > 1000) then
+ messageBox("The range for 'Max player triggered events per interval' is: 1-1000", MB_ERROR, MB_OK)
+ return
+ end
+
+ if (#cameraSyncInterval <= 0 or tonumber(cameraSyncInterval) < 50 or tonumber(cameraSyncInterval) > 4000) then
+ messageBox("The range for 'Camera sync interval' is: 50-4000", MB_ERROR, MB_OK)
+ return
+ end
+
+ if (#playerSyncInterval <= 0 or tonumber(playerSyncInterval) < 50 or tonumber(playerSyncInterval) > 4000) then
+ messageBox("The range for 'Player sync interval' is: 50-4000", MB_ERROR, MB_OK)
+ return
+ end
+
+ if (#playerTriggeredEventInterval <= 0 or tonumber(playerTriggeredEventInterval) < 50 or tonumber(playerTriggeredEventInterval) > 5000) then
+ messageBox("The range for 'Player triggered event interval' is: 50-5000", MB_ERROR, MB_OK)
+ return
+ end
+
+ if (#keySyncAnalogInterval <= 0 or tonumber(keySyncAnalogInterval) < 50 or tonumber(keySyncAnalogInterval) > 4000) then
+ messageBox("The range for 'Analog key sync interval' is: 50-4000", MB_ERROR, MB_OK)
+ return
+ end
+
+ if (#keySyncMouseInterval <= 0 or tonumber(keySyncMouseInterval) < 50 or tonumber(keySyncMouseInterval) > 4000) then
+ messageBox("The range for 'Mouse key sync interval' is: 50-4000", MB_ERROR, MB_OK)
+ return
+ end
+
+ if (#pedSyncInterval <= 0 or tonumber(pedSyncInterval) < 50 or tonumber(pedSyncInterval) > 4000) then
+ messageBox("The range for 'Ped sync interval' is: 50-4000", MB_ERROR, MB_OK)
+ return
+ end
+
+ if (#unoccupiedVehicleSyncInterval <= 0 or tonumber(unoccupiedVehicleSyncInterval) < 50 or tonumber(unoccupiedVehicleSyncInterval) > 4000) then
+ messageBox("The range for 'Unoccupied vehicle sync interval' is: 50-4000", MB_ERROR, MB_OK)
+ return
+ end
+
+ if (#lightWeightSyncInterval <= 0 or tonumber(lightWeightSyncInterval) < 200 or tonumber(lightWeightSyncInterval) > 4000) then
+ messageBox("The range for 'Lightweight sync interval' is: 200-4000", MB_ERROR, MB_OK)
+ return
+ end
+
+ if (messageBox("Are you sure you want to save the server configuration changes?", MB_QUESTION, MB_YESNO)) then
+ triggerServerEvent("aServer", localPlayer, "setconfig", {
+ minclientversion = guiGetText(aServerConfig.minVersionField),
+ recommendedclientversion = guiGetText(aServerConfig.recVersionField),
+ bandwidth_reduction = guiComboBoxGetItemText(aServerConfig.bandwidthCombo, guiComboBoxGetSelected(aServerConfig.bandwidthCombo)):lower() or "medium",
+ bullet_sync = tostring(guiComboBoxGetSelected(aServerConfig.bulletSyncCombo)),
+ max_player_triggered_events_per_interval = triggersPerInterval,
+ camera_sync_interval = cameraSyncInterval,
+ player_sync_interval = playerSyncInterval,
+ player_triggered_event_interval = playerTriggeredEventInterval,
+ keysync_analog_sync_interval = keySyncAnalogInterval,
+ keysync_mouse_sync_interval = keySyncMouseInterval,
+ ped_sync_interval = pedSyncInterval,
+ unoccupied_vehicle_sync_interval = unoccupiedVehicleSyncInterval,
+ lightweight_sync_interval = lightWeightSyncInterval
+ })
+
+ aServerConfig.Close()
+ end
+ end
+ end
+end
+
+function aServerConfig.Refresh()
+ triggerServerEvent("aServerConfigRefresh", localPlayer)
+end
+
+addEvent("aClientConfigRefresh", true)
+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)
+ guiSetText(aServerConfig.minVersionField, minclientversion)
+ guiSetText(aServerConfig.recVersionField, recommendedclientversion)
+
+ guiComboBoxSetSelected(aServerConfig.bandwidthCombo, (bandwidthreduction == "none" and 0 or (bandwidthreduction == "medium" and 1 or 2)) or 0)
+ guiComboBoxSetSelected(aServerConfig.bulletSyncCombo, tonumber(bulletsync))
+
+ guiSetText(aServerConfig.maxTriggersField, maxplayertriggers)
+ guiSetText(aServerConfig.camera_sync_interval, camerasync_interval)
+ guiSetText(aServerConfig.player_sync_interval, playersync_interval)
+ guiSetText(aServerConfig.player_triggered_event_interval, playertriggers_interval)
+ guiSetText(aServerConfig.keysync_analog_sync_interval, keysync_analog_interval)
+ guiSetText(aServerConfig.keysync_mouse_sync_interval, keysync_mousse_interval)
+ guiSetText(aServerConfig.ped_sync_interval, pedsync_interval)
+ guiSetText(aServerConfig.unoccupied_vehicle_sync_interval, unoccupiedvehicle_interval)
+ guiSetText(aServerConfig.lightweight_sync_interval, lightweight_interval)
+end)
\ No newline at end of file
diff --git a/[admin]/admin2/conf/ACL.xml b/[admin]/admin2/conf/ACL.xml
index 7402ff4fc..2a3b86111 100644
--- a/[admin]/admin2/conf/ACL.xml
+++ b/[admin]/admin2/conf/ACL.xml
@@ -77,6 +77,7 @@
+
@@ -159,6 +160,7 @@
+
@@ -241,6 +243,7 @@
+
@@ -320,6 +323,7 @@
+
diff --git a/[admin]/admin2/meta.xml b/[admin]/admin2/meta.xml
index 2db5c37fa..9c4af5010 100644
--- a/[admin]/admin2/meta.xml
+++ b/[admin]/admin2/meta.xml
@@ -60,6 +60,7 @@
+
@@ -109,4 +110,4 @@
-
+
\ No newline at end of file
diff --git a/[admin]/admin2/server/admin_functions.lua b/[admin]/admin2/server/admin_functions.lua
index a031be18e..586aaec68 100644
--- a/[admin]/admin2/server/admin_functions.lua
+++ b/[admin]/admin2/server/admin_functions.lua
@@ -480,8 +480,14 @@ aFunctions = {
["clearchat"] = function()
clearChatBox()
return true
+ end,
+ ["setconfig"] = function(configData)
+ for k,v in pairs(configData) do
+ setServerConfigSetting(k,v, true)
+ end
+ return true
end
},
admin = {},
bans = {}
-}
+}
\ No newline at end of file
diff --git a/[admin]/admin2/server/admin_server.lua b/[admin]/admin2/server/admin_server.lua
index ae835dcab..4639f92eb 100644
--- a/[admin]/admin2/server/admin_server.lua
+++ b/[admin]/admin2/server/admin_server.lua
@@ -55,19 +55,19 @@ function aHandleIP2CUpdate()
end
function aHandleIp2cSetting()
- local enabled = get("*useip2c")
- if enabled and enabled == "true" then
- local ip2c = getResourceFromName("ip2c")
- if ip2c and getResourceState(ip2c) == "loaded" then
+ local enabled = get("*useip2c")
+ if enabled and enabled == "true" then
+ local ip2c = getResourceFromName("ip2c")
+ if ip2c and getResourceState(ip2c) == "loaded" then
-- Persistent
- startResource(ip2c, true)
- end
- elseif (not enabled) or (enabled == "false") then
- local ip2c = getResourceFromName("ip2c")
- if ip2c and getResourceState(ip2c) == "running" then
- stopResource(ip2c)
- end
- end
+ startResource(ip2c, true)
+ end
+ elseif (not enabled) or (enabled == "false") then
+ local ip2c = getResourceFromName("ip2c")
+ if ip2c and getResourceState(ip2c) == "running" then
+ stopResource(ip2c)
+ end
+ end
end
addEventHandler(
@@ -152,7 +152,7 @@ addEventHandler(
function updatePlayerCountry(player)
local isIP2CResourceRunning = getResourceFromName( "ip2c" )
- isIP2CResourceRunning = isIP2CResourceRunning and getResourceState( isIP2CResourceRunning ) == "running"
+ isIP2CResourceRunning = isIP2CResourceRunning and getResourceState( isIP2CResourceRunning ) == "running"
aPlayers[player].country = isIP2CResourceRunning and exports.ip2c:getPlayerCountry(player) or false
if aPlayers[player].country then
aPlayers[player].countryname = isIP2CResourceRunning and exports.ip2c:getCountryName(aPlayers[player].country) or false
@@ -346,6 +346,11 @@ addEventHandler(
end
)
+addEvent("aServerConfigRefresh", true)
+addEventHandler("aServerConfigRefresh", root, function()
+ triggerClientEvent(client, "aClientConfigRefresh", client, getServerConfigSetting("minclientversion"), getServerConfigSetting("recommendedclientversion"), getServerConfigSetting("bandwidth_reduction"), getServerConfigSetting("bullet_sync"), getServerConfigSetting("max_player_triggered_events_per_interval"), getServerConfigSetting("camera_sync_interval"), getServerConfigSetting("player_sync_interval"), getServerConfigSetting("player_triggered_event_interval"), getServerConfigSetting("keysync_analog_sync_interval"), getServerConfigSetting("keysync_mouse_sync_interval"), getServerConfigSetting("ped_sync_interval"), getServerConfigSetting("unoccupied_vehicle_sync_interval"), getServerConfigSetting("lightweight_sync_interval"))
+end)
+
addEvent("aMessage", true)
addEventHandler(
"aMessage",
@@ -414,9 +419,9 @@ addEventHandler(
)
addCommandHandler(get("adminChatCommandName"),
- function(thePlayer, cmd, ...)
- if (hasObjectPermissionTo(thePlayer, "general.tab_adminchat", false) and #arg > 0) then
- triggerEvent("aAdminChat", thePlayer, table.concat(arg, " "))
- end
- end
-)
+ function(thePlayer, cmd, ...)
+ if (hasObjectPermissionTo(thePlayer, "general.tab_adminchat", false) and #arg > 0) then
+ triggerEvent("aAdminChat", thePlayer, table.concat(arg, " "))
+ end
+ end
+)
\ No newline at end of file