mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-11 23:04:52 +09:00
96 lines
4.6 KiB
Lua
96 lines
4.6 KiB
Lua
local progress_dialog = require("modules/inventory_sync/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")
|
|
|
|
function download_inventory(playerName, data, number, total)
|
|
local player = game.players[playerName]
|
|
if player == nil then return end
|
|
if number then
|
|
if global.download_cache[playerName] == nil then
|
|
global.download_cache[playerName] = ""
|
|
end
|
|
-- Append data to download cache
|
|
global.download_cache[playerName] = global.download_cache[playerName] .. data
|
|
end
|
|
|
|
if number ~= total then
|
|
-- Show progress in console
|
|
-- game.players[playerName].print("Downloaded "..(number + 1).."/"..total.." parts")
|
|
-- Show progress in GUI
|
|
progress_dialog(player, number+1, total)
|
|
|
|
-- Request next segment
|
|
rcon.print("Segment downloaded")
|
|
else
|
|
-- Recreate player character
|
|
player.set_controller {
|
|
type = defines.controllers.god,
|
|
}
|
|
player.create_character()
|
|
-- Load downloaded inventory
|
|
local serialized_player = game.json_to_table(global.download_cache[playerName])
|
|
global.download_cache[playerName] = nil -- remove data to lower mapsize
|
|
local player = game.players[playerName]
|
|
-- 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)]
|
|
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.character_crafting_speed_modifier = serialized_player.character_crafting_speed_modifier
|
|
player.character_mining_speed_modifier = serialized_player.character_mining_speed_modifier
|
|
player.character_additional_mining_categories = serialized_player.character_additional_mining_categories
|
|
player.character_running_speed_modifier = serialized_player.character_running_speed_modifier
|
|
player.character_build_distance_bonus = serialized_player.character_build_distance_bonus
|
|
player.character_item_drop_distance_bonus = serialized_player.character_item_drop_distance_bonus
|
|
player.character_reach_distance_bonus = serialized_player.character_reach_distance_bonus
|
|
player.character_resource_reach_distance_bonus = serialized_player.character_resource_reach_distance_bonus
|
|
player.character_item_pickup_distance_bonus = serialized_player.character_item_pickup_distance_bonus
|
|
player.character_loot_pickup_distance_bonus = serialized_player.character_loot_pickup_distance_bonus
|
|
player.character_inventory_slots_bonus = serialized_player.character_inventory_slots_bonus
|
|
player.character_trash_slot_count_bonus = serialized_player.character_trash_slot_count_bonus
|
|
player.character_maximum_following_robot_count_bonus = serialized_player.character_maximum_following_robot_count_bonus
|
|
player.character_health_bonus = serialized_player.character_health_bonus
|
|
player.character_personal_logistic_requests_enabled = serialized_player.character_personal_logistic_requests_enabled
|
|
|
|
if serialized_player.flashlight then
|
|
player.enable_flashlight()
|
|
else
|
|
player.disable_flashlight()
|
|
end
|
|
|
|
local startTick = global["inv_sync_download_start_tick "..game.players[playerName].name]
|
|
game.print("Imported inventory for "..playerName.." in "..game.tick - startTick.." ticks")
|
|
end
|
|
end
|
|
|
|
return download_inventory
|