165 lines
5.3 KiB
Lua
165 lines
5.3 KiB
Lua
local mod_gui = require("mod-gui")
|
|
local Event = require("__stdlib__/stdlib/event/event")
|
|
local Changes = require("__stdlib__/stdlib/event/changes")
|
|
local UPGui = require("upgrade-planner/gui")
|
|
local UPGuiEvent = require("upgrade-planner/gui-events")
|
|
local UPEntityUpgrade = require("upgrade-planner/entity-upgrade")
|
|
|
|
-----------------------------------------------
|
|
-- Initialization
|
|
-----------------------------------------------
|
|
Changes.register("mod_versions", "upgrade-planner/mod-upgrade")
|
|
|
|
local function global_init()
|
|
global.current_config = {}
|
|
global["config-tmp"] = {}
|
|
global.storage = {}
|
|
global.storage_index = {}
|
|
global.default_bot = {}
|
|
end
|
|
|
|
local function player_init(player_idx)
|
|
global.default_bot[player_idx] = global.default_bot[player_idx] or false
|
|
global.current_config[player_idx] = global.current_config[player_idx] or {}
|
|
global.storage_index[player_idx] = global.storage_index[player_idx] or 1
|
|
global.storage[player_idx] = global.storage[player_idx] or {}
|
|
end
|
|
|
|
Event.register(Event.core_events.init, function()
|
|
global_init()
|
|
for player_idx, player in pairs(game.players) do
|
|
UPGui.init(player)
|
|
player_init(player_idx)
|
|
end
|
|
end)
|
|
|
|
-- Verify if all items selected for upgrade still exists (e.g. modded items)
|
|
local function verify_all_configs()
|
|
local items = game.item_prototypes
|
|
local verify_config = function(config)
|
|
local changed = false
|
|
for k, entry in pairs(config) do
|
|
local to = items[entry.to]
|
|
local from = items[entry.from]
|
|
if not (to and from) then
|
|
log("Deleted invalid config: " .. k .. serpent.line(entry))
|
|
entry[k] = nil
|
|
changed = true
|
|
end
|
|
end
|
|
return changed
|
|
end
|
|
for name, config in pairs(global.current_config) do
|
|
local changed = verify_config(config)
|
|
if changed then
|
|
UPGui.open_frame(game.players[name])
|
|
UPGui.open_frame(game.players[name])
|
|
end
|
|
end
|
|
for _, config in pairs(global["config-tmp"]) do verify_config(config) end
|
|
for _, storage in pairs(global.storage) do
|
|
for _, config in pairs(storage) do verify_config(config) end
|
|
end
|
|
end
|
|
|
|
Event.register(Event.core_events.on_configuration_changed, function(event)
|
|
if not event or not event.mod_changes then return end
|
|
verify_all_configs()
|
|
end)
|
|
|
|
Event.register(defines.events.on_player_joined_game, function(event)
|
|
local player = game.players[event.player_index]
|
|
UPGui.init(player)
|
|
player_init(event.player_index)
|
|
end)
|
|
|
|
Event.register(defines.events.on_pre_player_removed, function(event)
|
|
global.default_bot[event.player_index] = nil
|
|
global.current_config[event.player_index] = nil
|
|
global.storage_index[event.player_index] = nil
|
|
global.storage[event.player_index] = nil
|
|
end)
|
|
|
|
-----------------------------------------------
|
|
-- GUI events
|
|
-----------------------------------------------
|
|
|
|
UPGuiEvent.register()
|
|
|
|
-----------------------------------------------
|
|
-- Upgrade handling
|
|
-----------------------------------------------
|
|
Event.register(defines.events.on_player_selected_area, function(event)
|
|
if global.default_bot[event.player_index] then
|
|
UPEntityUpgrade.upgrade_area_bot(event)
|
|
else
|
|
UPEntityUpgrade.upgrade_area_player(event)
|
|
end
|
|
end)
|
|
Event.register(defines.events.on_player_alt_selected_area, function(event)
|
|
if global.default_bot[event.player_index] then
|
|
UPEntityUpgrade.upgrade_area_player(event)
|
|
else
|
|
UPEntityUpgrade.upgrade_area_bot(event)
|
|
end
|
|
end)
|
|
|
|
-----------------------------------------------
|
|
-- Key bindings
|
|
-----------------------------------------------
|
|
Event.register("upgrade-planner-hide", function(event)
|
|
local player = game.players[event.player_index]
|
|
local button_flow = mod_gui.get_button_flow(player)
|
|
if button_flow["upgrade_planner_config_button"] then
|
|
button_flow["upgrade_planner_config_button"].visible =
|
|
not button_flow.upgrade_planner_config_button.visible
|
|
return
|
|
end
|
|
local button = button_flow.add {
|
|
type = "sprite-button",
|
|
name = "upgrade_planner_config_button",
|
|
style = mod_gui.button_style,
|
|
sprite = "item/upgrade-builder",
|
|
tooltip = {"upgrade-planner.button-tooltip"},
|
|
}
|
|
button.visible = true
|
|
end)
|
|
|
|
--- Clean up additional upgrade planner items
|
|
-- Whenever more than one Upgrade planner is in a player inventory, destroy it.
|
|
-- If a planner lands in the trash inventory, destroy it.
|
|
Event.register({
|
|
defines.events.on_player_trash_inventory_changed,
|
|
defines.events.on_player_main_inventory_changed,
|
|
}, function(event)
|
|
local player = game.players[event.player_index]
|
|
local is_trash = event.name ==
|
|
defines.events.on_player_trash_inventory_changed
|
|
local inventory
|
|
|
|
if is_trash then
|
|
inventory = player.get_inventory(defines.inventory.character_trash)
|
|
elseif is_trash == false then
|
|
inventory = player.get_main_inventory()
|
|
else
|
|
return
|
|
end
|
|
|
|
if game.item_prototypes["upgrade-builder"] then
|
|
if is_trash then
|
|
local upgrade_builder = inventory.find_item_stack("upgrade-builder")
|
|
if upgrade_builder then upgrade_builder.clear() end
|
|
else
|
|
local cnt = inventory.get_item_count("upgrade-builder")
|
|
if cnt > 1 then
|
|
inventory.remove {name = "upgrade-builder", count = cnt - 1}
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
Event.register(defines.events.on_player_dropped_item, function(event)
|
|
local stack = event.entity and event.entity.stack
|
|
if (stack.name == "upgrade-builder") then event.entity.destroy() end
|
|
end)
|