Files
factorio-clusterio/plugins/inventory_sync/module/inventory_sync.lua
T

69 lines
2.6 KiB
Lua

--[[
When a player leaves the game, serialize their inventory and upload it to the master.
When a player joins the game, send a request to the master server for the players inventory.
When the master sends an inventory, parse it and give it to the player.
]]
local clusterio_api = require("modules/clusterio/api")
local add_commands = require("modules/inventory_sync/commands")
local upload_inventory = require("modules/inventory_sync/upload_inventory")
local download_inventory = require("modules/inventory_sync/download_inventory")
inventory_sync = {}
inventory_sync.add_commands = add_commands
inventory_sync.events = {}
-- Cleanup
inventory_sync.events[defines.events.on_player_removed] = function(event)
local player = game.players[event.player_index]
-- Remove inventory download performance counter
global["inv_sync_download_start_tick "..player.name] = nil
-- Remove stored crafting queue
global["saved_crafting_queue_"..player.name] = nil
end
-- Download inventory from master
inventory_sync.events[defines.events.on_player_joined_game] = function(event)
local playerIndex = event.player_index
inventory_sync.initiateInventoryDownload(playerIndex)
end
-- Upload inventory when a player leaves the game. Triggers on restart after crash if player was online during crash.
inventory_sync.events[defines.events.on_player_left_game] = function(event)
local playerIndex = event.player_index
inventory_sync.uploadInventory(playerIndex)
global.download_cache[playerIndex] = "" -- Clear cache to avoid leaking memory to people quitting during download
end
function inventory_sync.initiateInventoryDownload(playerIndex)
local player = game.players[playerIndex]
player.print("Initiating inventory download...")
global["inv_sync_download_start_tick "..player.name] = game.tick
if global.download_cache == nil then
global.download_cache = {}
end
global.download_cache[playerIndex] = ""
clusterio_api.send_json("inventory_sync_download", {
player_name = player.name
})
-- Set player into ghost mode for duration of download
local character = player.character
player.set_controller {
type = defines.controllers.ghost,
}
if character ~= nil then character.destroy() end
end
-- This function is called by instance.js as /sc inventory_sync.downloadInventory("danielv", Escaped JSON string, package_number, total_packages_count) with data from the master
inventory_sync.downloadInventory = download_inventory
-- This function is called internally when a player leaves the game for their inventory to upload to the master
inventory_sync.uploadInventory = upload_inventory
return inventory_sync