mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-12 23:04:52 +09:00
108 lines
4.1 KiB
Lua
108 lines
4.1 KiB
Lua
local progress_dialog = require("modules/inventory_sync/gui/progress_dialog")
|
|
local serialize = require("modules/clusterio/serialize")
|
|
local load_crafting_queue = require("modules/inventory_sync/load_crafting_queue")
|
|
local inventories = require("modules/inventory_sync/define_player_inventories")
|
|
local ensure_character = require("modules/inventory_sync/ensure_character")
|
|
local player_stat_keys = require("modules/inventory_sync/define_player_stat_keys")
|
|
|
|
function download_inventory(player_name, data, number, total)
|
|
local player = game.get_player(player_name)
|
|
if player == nil then
|
|
log("Player not found! "..player_name)
|
|
return
|
|
end
|
|
if number then
|
|
if global.inventory_sync.download_cache[player_name] == nil then
|
|
global.inventory_sync.download_cache[player_name] = ""
|
|
end
|
|
-- Append data to download cache
|
|
global.inventory_sync.download_cache[player_name] = global.inventory_sync.download_cache[player_name] .. data
|
|
end
|
|
|
|
if number ~= total then
|
|
-- Show progress in console
|
|
-- player.print("Downloaded "..(number + 1).."/"..total.." parts")
|
|
-- Show progress in GUI
|
|
progress_dialog(player, number+1, total)
|
|
|
|
-- Request next segment
|
|
rcon.print("Segment downloaded")
|
|
|
|
-- Reset sync_start_tick to indicate master connection
|
|
global.inventory_sync.players[player_name].sync_start_tick = game.tick
|
|
else
|
|
-- Stop tracking master connection status, sync is complete
|
|
global.inventory_sync.players[player_name].sync_start_tick = 0
|
|
|
|
-- Handle dirty inventory
|
|
if global.inventory_sync.players[player_name].dirty_inventory then
|
|
clean_dirty_inventory(player)
|
|
end
|
|
|
|
-- Recreate player character
|
|
ensure_character(player)
|
|
|
|
-- Remove freeplay skip cutscene label
|
|
if player.gui.screen.skip_cutscene_label then
|
|
player.gui.screen.skip_cutscene_label.destroy()
|
|
end
|
|
|
|
local character = player.character or player.cutscene_character
|
|
|
|
-- Load downloaded inventory
|
|
local serialized_player = game.json_to_table(global.inventory_sync.download_cache[player_name])
|
|
global.inventory_sync.download_cache[player_name] = nil -- remove data to lower mapsize
|
|
|
|
-- Load inventories
|
|
for _, inv in pairs(inventories) do
|
|
local inventory = player.get_inventory(inv)
|
|
if inventory ~= nil and serialized_player.inventories[tostring(inv)] ~= nil then
|
|
serialize.deserialize_inventory(inventory, serialized_player.inventories[tostring(inv)])
|
|
end
|
|
end
|
|
|
|
-- Load personal logistics slots
|
|
for i = 1, 200 do
|
|
local slot = serialized_player.personal_logistic_slots[tostring(i+1)] -- 1 is empty to force array to be spare
|
|
if slot ~= nil then
|
|
player.set_personal_logistic_slot(i, slot)
|
|
end
|
|
end
|
|
|
|
-- Load hotbar, don't overwrite empty slots
|
|
for i = 1, 100 do
|
|
-- if serialized_player.hotbar[i] ~= nil then
|
|
player.set_quick_bar_slot(i, game.item_prototypes[serialized_player.hotbar[i]])
|
|
-- end
|
|
end
|
|
|
|
-- Load crafting queue
|
|
load_crafting_queue(serialized_player.crafting_queue, player)
|
|
|
|
-- Misc
|
|
player.cheat_mode = serialized_player.cheat_mode
|
|
player.force = serialized_player.force -- Force by name as string
|
|
player.tag = serialized_player.tag
|
|
player.color = serialized_player.color
|
|
player.chat_color = serialized_player.chat_color
|
|
|
|
-- Player stats
|
|
for _,v in pairs(player_stat_keys) do
|
|
character[v] = serialized_player[v]
|
|
end
|
|
|
|
if serialized_player.flashlight then
|
|
player.enable_flashlight()
|
|
else
|
|
player.disable_flashlight()
|
|
end
|
|
|
|
local startTick = global.inventory_sync.download_start_tick[player.name]
|
|
local log_line = "Imported inventory for "..player_name.." in "..game.tick - startTick.." ticks"
|
|
player.print(log_line)
|
|
log("[inventory_sync] "..log_line)
|
|
end
|
|
end
|
|
|
|
return download_inventory
|