1
0
mirror of https://github.com/Oarcinae/FactorioScenarioMultiplayerSpawn.git synced 2025-02-07 13:07:58 +02:00

Fix regrowth checkboxes not respecting previous setting if surface wasn't created yet. Surface init now defaults to the global setting. Adding a migration and change to surface init to ensure the center chunks never get deleted so that cargo-pods don't go missing.

This commit is contained in:
Oarcinae 2024-11-17 14:14:28 -05:00
parent c9b411f249
commit 229cd326c0
4 changed files with 58 additions and 12 deletions

View File

@ -336,6 +336,13 @@ function RuntimeModSettingChanged(event)
local new_value = storage.ocfg.gameplay.enable_coin_shop local new_value = storage.ocfg.gameplay.enable_coin_shop
AddRemoveOarcGuiTabForAllPlayers(OARC_ITEM_SHOP_TAB_NAME, settings.global[event.setting].value --[[@as boolean]], true) AddRemoveOarcGuiTabForAllPlayers(OARC_ITEM_SHOP_TAB_NAME, settings.global[event.setting].value --[[@as boolean]], true)
end end
--Exception for regrowth, refresh the content tab so the checkboxes get updated
if (event.setting == "oarc-mod-enable-regrowth") then
for _,player in pairs(game.players) do
OarcGuiRefreshContent(player)
end
end
end end
---A probably quit stupid function to let me lookup and set the storage.ocfg entries using a key table. ---A probably quit stupid function to let me lookup and set the storage.ocfg entries using a key table.

View File

@ -104,8 +104,9 @@ function CreateSurfaceSettingsSection(container, player)
AddSurfaceCheckboxSetting(surface_table, name, "secondary_enabled", allowed.secondary, player.admin, AddSurfaceCheckboxSetting(surface_table, name, "secondary_enabled", allowed.secondary, player.admin,
{ "oarc-settings-tab-surface-secondary-checkbox-tooltip" }) { "oarc-settings-tab-surface-secondary-checkbox-tooltip" })
local regrowth_enabled = TableContains(storage.rg.active_surfaces, name) local surface_regrowth = IsRegrowthEnabledOnSurface(name)
AddSurfaceCheckboxSetting(surface_table, name, "regrowth_enabled", regrowth_enabled, player.admin, local global_regrowth = storage.ocfg.regrowth.enable_regrowth
AddSurfaceCheckboxSetting(surface_table, name, "regrowth_enabled", surface_regrowth, player.admin and global_regrowth,
{"oarc-settings-tab-surface-regrowth-checkbox-tooltip"}) {"oarc-settings-tab-surface-regrowth-checkbox-tooltip"})
end end

View File

@ -56,8 +56,13 @@ function RegrowthInit()
---@type RemovalListEntry[] ---@type RemovalListEntry[]
storage.rg.removal_list = {} storage.rg.removal_list = {}
for _,planet in pairs(game.planets) do
local surface_name = planet.name
RegrowthInitSurface(surface_name, storage.ocfg.regrowth.enable_regrowth)
end
for surface_name,_ in pairs(game.surfaces) do for surface_name,_ in pairs(game.surfaces) do
InitSurface(surface_name --[[@as string]]) RegrowthInitSurface(surface_name --[[@as string]], storage.ocfg.regrowth.enable_regrowth)
end end
end end
@ -65,7 +70,7 @@ end
---@param event EventData.on_surface_created ---@param event EventData.on_surface_created
---@return nil ---@return nil
function RegrowthSurfaceCreated(event) function RegrowthSurfaceCreated(event)
InitSurface(game.surfaces[event.surface_index].name) RegrowthInitSurface(game.surfaces[event.surface_index].name, nil) -- Leave activated as default or existing setting.
end end
---Called when a surface is deleted. This is used to remove surfaces from the regrowth map. ---Called when a surface is deleted. This is used to remove surfaces from the regrowth map.
@ -79,10 +84,13 @@ end
---Initialize the new surface for regrowth ---Initialize the new surface for regrowth
---@param surface_name string - The surface name to act on ---@param surface_name string - The surface name to act on
---@param activate boolean? - If set, the surface will be enabled/disabled for regrowth
---@return nil ---@return nil
function InitSurface(surface_name) function RegrowthInitSurface(surface_name, activate)
if IsSurfaceBlacklisted(surface_name) then return end
if (not IsSurfaceBlacklisted(surface_name) and not TableContains(storage.rg.active_surfaces, surface_name)) then -- First time setup only? TODO: This code is not very logical (if one time only, why check for nil...)
if (not TableContains(storage.rg.active_surfaces, surface_name)) then
log("Adding surface to regrowth: " .. surface_name) log("Adding surface to regrowth: " .. surface_name)
-- Add a new surface to the regrowth map (Don't overwrite if it already exists) -- Add a new surface to the regrowth map (Don't overwrite if it already exists)
@ -101,8 +109,21 @@ function InitSurface(surface_name)
storage.rg.we_current_surface = surface_name storage.rg.we_current_surface = surface_name
end end
storage.rg[surface_name].active = true
table.insert(storage.rg.active_surfaces, surface_name) table.insert(storage.rg.active_surfaces, surface_name)
-- TODO: Hopefully a temporary measure to make sure map center never gets deleted.
-- If we can detect and redirect cargo-pods, then this can be removed.
for i = -2, 2 do
for j = -2, 2 do
MarkChunkSafe(surface_name, { x = i, y = j }, true)
end
end
end
if (activate ~= nil) then
storage.rg[surface_name].active = activate
elseif (storage.rg[surface_name].active == nil) then
storage.rg[surface_name].active = storage.ocfg.regrowth.enable_regrowth
end end
end end
@ -143,7 +164,7 @@ end
---@param surface_name string - The surface name to act on ---@param surface_name string - The surface name to act on
---@return nil ---@return nil
function RegrowthEnableSurface(surface_name) function RegrowthEnableSurface(surface_name)
InitSurface(surface_name) RegrowthInitSurface(surface_name, true)
end end
---Trigger an immediate cleanup of any chunks that are marked for removal. ---Trigger an immediate cleanup of any chunks that are marked for removal.
@ -412,8 +433,8 @@ function GetNextChunkAndUpdateIter()
storage.rg.current_surface = next_surface_info.surface storage.rg.current_surface = next_surface_info.surface
storage.rg.current_surface_index = next_surface_info.index storage.rg.current_surface_index = next_surface_info.index
-- Surface may not exist -- Surface may not exist or may not be active
if game.surfaces[storage.rg.current_surface] ~= nil then if game.surfaces[storage.rg.current_surface] ~= nil and storage.rg[next_surface_info.surface].active then
storage.rg.chunk_iter = game.surfaces[storage.rg.current_surface].get_chunks() storage.rg.chunk_iter = game.surfaces[storage.rg.current_surface].get_chunks()
next_chunk = storage.rg.chunk_iter() next_chunk = storage.rg.chunk_iter()
end end
@ -442,8 +463,8 @@ function GetNextChunkAndUpdateWorldEaterIter()
storage.rg.we_current_surface = next_surface_info.surface storage.rg.we_current_surface = next_surface_info.surface
storage.rg.we_current_surface_index = next_surface_info.index storage.rg.we_current_surface_index = next_surface_info.index
-- Surface may not exist -- Surface may not exist or may not be active
if game.surfaces[storage.rg.we_current_surface] ~= nil then if game.surfaces[storage.rg.we_current_surface] ~= nil and storage.rg[next_surface_info.surface].active then
storage.rg.we_chunk_iter = game.surfaces[storage.rg.we_current_surface].get_chunks() storage.rg.we_chunk_iter = game.surfaces[storage.rg.we_current_surface].get_chunks()
next_chunk = storage.rg.we_chunk_iter() next_chunk = storage.rg.we_chunk_iter()
end end

View File

@ -0,0 +1,17 @@
---For each planet's surface, mark the center of the map permanently safe from regrowth.
-- If we can detect and redirect cargo-pods, then this can be removed.
-- TODO: Hopefully a temporary measure to make sure map center never gets deleted.
-- If we can detect and redirect cargo-pods, then this can be removed.
-- Loop through each surface
for _,surface in pairs(game.surfaces) do
if (storage.rg[surface.name] ~= nil) then
for i = -2, 2 do
for j = -2, 2 do
MarkChunkSafe(surface.name, { x = i, y = j }, true)
end
end
log("Applying migration for V2.1.13: Marked center of "..surface.name.." safe from regrowth.")
end
end