1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-02-09 13:37:02 +02:00

Portable chest tweaks

This commit is contained in:
Gerkiz 2020-09-04 17:05:15 +02:00
parent c781099666
commit 03ad5a166f

View File

@ -2,6 +2,8 @@ local Event = require 'utils.event'
local Global = require 'utils.global'
local Color = require 'utils.color_presets'
local Gui = require 'utils.gui'
local m_gui = require 'mod-gui'
local mod = m_gui.get_button_flow
local this = {
inf_chests = {},
@ -30,6 +32,7 @@ local size = 35
local main_button_name = Gui.uid_name()
local main_frame_name = Gui.uid_name()
local stack_slider_name = Gui.uid_name()
local delete_mode_name = Gui.uid_name()
local Public = {}
@ -60,12 +63,13 @@ local function clear_gui(player)
end
local function create_button(player)
player.gui.top.add(
mod(player).add(
{
type = 'sprite-button',
sprite = 'item/logistic-chest-requester',
name = main_button_name,
tooltip = 'Portable inventory stash!'
tooltip = 'Portable inventory stash!',
style = m_gui.button_style
}
)
end
@ -89,7 +93,7 @@ local function validate_player(player)
return true
end
local function item(item_name, item_count, player, chest_id)
local function item(item_name, item_count, player, storage)
local stack_size = this.stack_size[player.index]
local item_stack
if stack_size then
@ -100,17 +104,12 @@ local function item(item_name, item_count, player, chest_id)
local diff = item_count - item_stack
if not this.inf_storage[chest_id] then
this.inf_storage[chest_id] = {}
end
local storage = this.inf_storage[chest_id]
if diff > 0 then
local count = player.remove({name = item_name, count = diff})
if not storage[item_name] then
this.inf_storage[chest_id][item_name] = count
storage[item_name] = count
else
this.inf_storage[chest_id][item_name] = storage[item_name] + count
storage[item_name] = storage[item_name] + count
end
elseif diff < 0 then
if not storage[item_name] or storage[item_name] <= 0 then
@ -118,18 +117,18 @@ local function item(item_name, item_count, player, chest_id)
end
if storage[item_name] > (diff * -1) then
local inserted = player.insert({name = item_name, count = (diff * -1)})
this.inf_storage[chest_id][item_name] = storage[item_name] - inserted
storage[item_name] = storage[item_name] - inserted
else
player.insert({name = item_name, count = storage[item_name]})
this.inf_storage[chest_id][item_name] = 0
storage[item_name] = 0
end
end
::continue::
end
local function update_chest()
for chest_id, chest in pairs(this.inf_chests) do
if not chest.valid then
for chest_id, player in pairs(this.inf_chests) do
if not player.valid then
goto continue
end
local storage = this.inf_storage[chest_id]
@ -137,21 +136,21 @@ local function update_chest()
goto continue
end
local inv = chest.get_inventory(defines.inventory.character_main)
local inv = player.get_inventory(defines.inventory.character_main)
if not inv or not inv.valid then
return
goto continue
end
local content = inv.get_contents()
for item_name, item_count in pairs(content) do
if storage[item_name] then
item(item_name, item_count, inv, chest_id)
item(item_name, item_count, inv, storage)
end
end
for item_name, _ in pairs(this.inf_storage[chest_id]) do
for item_name, _ in pairs(storage) do
if not content[item_name] then
item(item_name, 0, inv, chest_id)
item(item_name, 0, inv, storage)
end
end
@ -183,7 +182,7 @@ local function draw_main_frame(player, target, chest_id)
local btn =
tbl.add {
type = 'sprite-button',
tooltip = '[color=blue]Info![/color]\nYou can easily remove an item by left/right-clicking it.\n\nItems selected in the table below will remove all stacks except one from the player inventory.\nIf the stack-size is bigger in the personal stash than the players inventory stack then the players inventory will automatically refill from the personal stash.\n\n[color=red]Usage[/color]\nPressing the following keys will do the following actions:\nCTRL: Retrieves all stacks from clicked item\nSHIFT:Retrieves a stack from clicked item.\nStack-Size slider will always ensure that you have <x> amounts of stacks in your inventory.',
tooltip = '[color=blue]Info![/color]\nYou can easily remove an item by left/right-clicking it.\n\nItems selected in the table below will remove all stacks except one from the player inventory.\nIf the stack-size is bigger in the personal stash than the players inventory stack then the players inventory will automatically refill from the personal stash.\n\n[color=red]Usage[/color]\nPressing the following keys will do the following actions:\nCTRL: Retrieves all stacks from clicked item\nSHIFT:Retrieves a stack from clicked item.\nStack-Size slider will always ensure that you have <x> amounts of stacks in your inventory.\n\n[color=red]Deleting[/color]\nDelete Mode: Will delete the clicked item instantly.',
sprite = 'utility/questionmark'
}
btn.style.height = 20
@ -191,7 +190,7 @@ local function draw_main_frame(player, target, chest_id)
btn.enabled = false
btn.focus()
if this.ores_only then
if not player.admin and this.ores_only then
this.total_slots[player.index] = 6
end
@ -212,7 +211,7 @@ local function draw_main_frame(player, target, chest_id)
}
text.style.single_line = false
local tbl_2 = tbl.add {type = 'table', column_count = 2}
local tbl_2 = tbl.add {type = 'table', column_count = 4}
local stack_size = this.stack_size[player.index]
local stack_value = tbl_2.add({type = 'label', caption = 'Stack Size: ' .. stack_size .. ' '})
@ -233,6 +232,13 @@ local function draw_main_frame(player, target, chest_id)
slider.style.width = 115
Gui.set_data(slider, data)
local delete_mode = tbl_2.add({type = 'label', caption = ' Delete Mode: '})
delete_mode.style.font = 'default-bold'
local checkbox = tbl_2.add({type = 'checkbox', name = delete_mode_name, state = false})
data.checkbox = checkbox
Gui.set_data(checkbox, data)
tbl.add({type = 'line'})
player.opened = frame
@ -246,7 +252,8 @@ local function draw_main_frame(player, target, chest_id)
this.inf_gui[player.index] = {
item_frame = items,
frame = frame,
updated = false
updated = false,
delete_mode = false
}
end
@ -262,9 +269,14 @@ local function update_gui()
goto continue
end
local chest_id = this.player_chests[player.index].chest_id
local data = this.player_chests[player.index]
if not data then
goto continue
end
local chest_id = data.chest_id
if not chest_id then
return
goto continue
end
if this.inf_gui[player.index].updated then
goto continue
@ -286,6 +298,8 @@ local function update_gui()
end
::no_storage::
local delete_mode = this.inf_gui[player.index].delete_mode
local btn
for item_name, item_count in pairs(items) do
btn =
@ -299,6 +313,9 @@ local function update_gui()
btn.enabled = true
btn.style.height = size
btn.style.width = size
if delete_mode then
btn.tooltip = 'Press to delete this item.'
end
btn.focus()
end
@ -348,28 +365,34 @@ local function gui_click(event)
local ctrl = event.control
local name = element.name
local storage = this.inf_storage[chest_id]
local delete_mode = this.inf_gui[player.index].delete_mode
if not storage then
return
end
if delete_mode then
storage[name] = nil
this.inf_gui[player.index].updated = false
return
end
if this.editor[player.index] then
if not storage[name] then
return
end
if ctrl then
storage[name] = storage[name] + 5000000
this.inf_gui[player.index].updated = false
goto update
elseif shift then
storage[name] = storage[name] - 5000000
this.inf_gui[player.index].updated = false
if storage[name] <= 0 then
storage[name] = nil
end
goto update
end
if this.inf_gui[player.index] then
this.inf_gui[player.index].updated = false
end
end
if storage[name] and storage[name] <= 0 then
@ -515,7 +538,7 @@ local function on_player_joined_game(event)
this.total_slots[player.index] = 50
end
if not player.gui.top[main_button_name] then
if not mod(player)[main_button_name] then
create_button(player)
end
end
@ -566,15 +589,8 @@ Gui.on_click(
Gui.on_value_changed(
stack_slider_name,
function(event)
local player = game.get_player(event.player_index)
if not player or not player.valid or not player.character then
return
end
local player = event.player
local element = event.element
if not element or not element.valid then
return
end
local data = Gui.get_data(element)
local stack_value = data.stack_value
@ -592,6 +608,28 @@ Gui.on_value_changed(
if main_frame and main_frame.valid then
this.stack_size[player.index] = element.slider_value
stack_value.caption = 'Stack Size: ' .. this.stack_size[player.index] .. ' '
this.inf_gui[player.index].updated = false
end
end
)
Gui.on_checked_state_changed(
delete_mode_name,
function(event)
local player = event.player
local element = event.element
local data = Gui.get_data(element)
local checkbox = data.checkbox
if not checkbox or not checkbox.valid then
return
end
local screen = player.gui.screen
local main_frame = screen[main_frame_name]
if main_frame and main_frame.valid then
this.inf_gui[player.index].delete_mode = element.state
this.inf_gui[player.index].updated = false
end
end
)