From 60e434e4ac4ea2274e9203b78509106440056105 Mon Sep 17 00:00:00 2001 From: Hornwitser Date: Fri, 13 Aug 2021 06:17:59 +0200 Subject: [PATCH] Fix inventory_sync player created/removed Create entries for players that are present in the save on server startup to preserving their inventory and fix attempting to reference the player object after it had been removed in on_player_removed. --- .../inventory_sync/module/inventory_sync.lua | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/plugins/inventory_sync/module/inventory_sync.lua b/plugins/inventory_sync/module/inventory_sync.lua index 72b7c1f7..a8c69ed0 100644 --- a/plugins/inventory_sync/module/inventory_sync.lua +++ b/plugins/inventory_sync/module/inventory_sync.lua @@ -19,6 +19,24 @@ local handle_gui_events = require("modules/inventory_sync/gui/handle_gui_events" local dialog_failed_download = require("modules/inventory_sync/gui/dialog_failed_download") local clean_dirty_inventory = require("modules/inventory_sync/script/clean_dirty_inventory") + +local function create_player(player, dirty) + global.inventory_sync.players[player.name] = { + dirty_inventory = dirty, -- Player has a temporary non-synced inventory that should be persisted + sync_start_tick = 0, -- To track download failure timeout + } +end + +local function remove_player(player) + -- Remove inventory download performance counter + global.inventory_sync.download_start_tick[player.name] = nil + -- Remove stored crafting queue + global.inventory_sync.saved_crafting_queue[player.name] = nil + -- Remove other player data + global.inventory_sync.players[player.name] = nil +end + + inventory_sync = {} inventory_sync.welcome_new_player = welcome_new_player -- This function is called by instance.js as /sc inventory_sync.download_inventory("danielv", Escaped JSON string, package_number, total_packages_count) with data from the master @@ -48,26 +66,21 @@ inventory_sync.events[clusterio_api.events.on_server_startup] = function(event) if not global.inventory_sync.players then global.inventory_sync.players = {} end + + for _, player in pairs(game.players) do + if not global.inventory_sync.players[player.name] then + create_player(player, true) + end + end end -- Cleanup -inventory_sync.events[defines.events.on_player_removed] = function(event) - local player = game.get_player(event.player_index) - - -- Remove inventory download performance counter - global.inventory_sync.download_start_tick[player.name] = nil - -- Remove stored crafting queue - global.inventory_sync.saved_crafting_queue[player.name] = nil - -- Remove other player data - global.inventory_sync.players[player.name] = nil +inventory_sync.events[defines.events.on_pre_player_removed] = function(event) + remove_player(game.get_player(event.player_index)) end inventory_sync.events[defines.events.on_player_created] = function(event) - local player = game.get_player(event.player_index) - global.inventory_sync.players[player.name] = { - dirty_inventory = false, -- Player has a temporary non-synced inventory that should be persisted - sync_start_tick = 0, -- To track download failure timeout - } + create_player(game.get_player(event.player_index), false) end inventory_sync.events[defines.events.on_gui_click] = handle_gui_events