1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2025-03-03 14:53:01 +02:00

Merge branch 'develop' of https://github.com/Valansch/RedMew into gui_settings

This commit is contained in:
grilledham 2019-05-27 20:46:38 +01:00
commit d4667992d1
2 changed files with 47 additions and 7 deletions

View File

@ -29,7 +29,7 @@ Public.events = {
local memory = {
-- when already scheduled, no new schedules have to be added
sync_scheduled = false,
sync_scheduled = {},
-- when locked it won't schedule anything to prevent recursion syncing back to server
locked = false,
@ -43,13 +43,16 @@ local function schedule_sync_to_server(player_index)
set_timeout_in_ticks(1, do_sync_settings_to_server, {
player_index = player_index
})
memory.sync_scheduled = true
memory.sync_scheduled[player_index] = true
end
do_sync_settings_to_server = Token.register(function(params)
local player_index = params.player_index;
local player = game.get_player(player_index)
if not player or not player.valid then
-- The player doesn't exist or got removed, ensure it's reset so it doesn't
-- stay on scheduled
memory.sync_scheduled[player_index] = nil
return
end
@ -57,7 +60,7 @@ do_sync_settings_to_server = Token.register(function(params)
Server.set_data('player_settings', player.name, Settings.all(player_index))
-- mark it as updated
memory.sync_scheduled = false
memory.sync_scheduled[player_index] = nil
raise_event(Public.events.on_synced_to_server, {
player = player
@ -65,7 +68,8 @@ do_sync_settings_to_server = Token.register(function(params)
end)
local function setting_set(event)
if memory.locked or memory.sync_scheduled then
local player_index = event.player_index
if memory.locked or memory.sync_scheduled[player_index] then
return
end
@ -73,7 +77,7 @@ local function setting_set(event)
return
end
schedule_sync_to_server(event.player_index)
schedule_sync_to_server(player_index)
end
local on_player_settings_get = Token.register(function (data)

View File

@ -71,6 +71,11 @@ local settings_type = {
local settings = {}
local memory = {}
local raw_callback_setting = {
callback = function (input)
return true, input
end
}
Global.register(memory, function (tbl) memory = tbl end)
@ -158,7 +163,7 @@ end
function Public.set(player_index, name, value)
local setting = settings[name]
if not setting then
error(format('Setting "%s" does not exist.', name), 2)
setting = raw_callback_setting
end
local success, sanitized_value = setting.callback(value)
@ -196,7 +201,7 @@ end
function Public.get(player_index, name)
local setting = settings[name]
if not setting then
return error(format('Setting "%s" does not exist.', name), 2)
return nil
end
local player_settings = memory[player_index]
@ -226,9 +231,40 @@ function Public.all(player_index)
end
end
-- not all settings might be mapped, edge-case is triggered when the
-- server contains settings that are not known in this instance
for name, value in pairs(player_settings) do
if output[name] == nil then
output[name] = value
end
end
return output
end
---Removes a value for a setting for a given name, giving it the default value.
---
---@param player_index number
---@param name string
function Public.unset(player_index, name)
local player_settings = memory[player_index]
if not player_settings then
player_settings = {}
memory[player_index] = player_settings
end
local old_value = player_settings[name]
player_settings[name] = nil
raise_event(Public.events.on_setting_set, {
setting_name = name,
old_value = old_value,
new_value = nil,
player_index = player_index,
value_changed = old_value ~= nil
})
end
---Returns the full settings data, note that this is a reference, do not modify
---this data unless you know what you're doing!
function Public.get_setting_metadata()