mirror of
https://github.com/Wyrrrd/Autofilter.git
synced 2026-03-25 16:09:49 +01:00
Fix and add stuff
- Add shortcut tile - Fix filter mode - Fix check mode - Add uk locale
This commit is contained in:
129
control.lua
129
control.lua
@@ -1,6 +1,20 @@
|
||||
--control.lua
|
||||
|
||||
--functions definitions
|
||||
local function get_item_name(item)
|
||||
if not item then
|
||||
return
|
||||
end
|
||||
local itemname = item
|
||||
if type(itemname) ~= "string" then
|
||||
itemname = itemname.name
|
||||
if type(itemname) ~= "string" then
|
||||
itemname = itemname.name
|
||||
end
|
||||
end
|
||||
return itemname
|
||||
end
|
||||
|
||||
local function concatenate_tables(table1,table2)
|
||||
for i = 1,#table2 do
|
||||
table1[#table1+1]=table2[i]
|
||||
@@ -16,6 +30,16 @@ local function string_to_table(str)
|
||||
return words
|
||||
end
|
||||
|
||||
local function toggle_shortcut(event)
|
||||
local player = game.get_player(event.player_index)
|
||||
local input = event.prototype_name or event.input_name
|
||||
|
||||
if player and input == "autofilter" then
|
||||
-- Toggle shortcut state
|
||||
player.set_shortcut_toggled(input, not player.is_shortcut_toggled(input))
|
||||
end
|
||||
end
|
||||
|
||||
local function is_filter_empty(inserter)
|
||||
for slot = 1,inserter.filter_slot_count do
|
||||
if inserter.get_filter(slot) then
|
||||
@@ -44,38 +68,49 @@ end
|
||||
|
||||
local function remove_noninsertable_items(items,entity)
|
||||
local search_inventories = {
|
||||
defines.inventory.fuel,
|
||||
defines.inventory.chest,
|
||||
defines.inventory.furnace_source,
|
||||
defines.inventory.roboport_robot,
|
||||
defines.inventory.roboport_material,
|
||||
defines.inventory.assembling_machine_input,
|
||||
defines.inventory.lab_input,
|
||||
defines.inventory.item_main,
|
||||
defines.inventory.rocket_silo_rocket,
|
||||
defines.inventory.rocket_silo_input,
|
||||
defines.inventory.cargo_wagon,
|
||||
defines.inventory.turret_ammo,
|
||||
defines.inventory.artillery_turret_ammo,
|
||||
defines.inventory.artillery_wagon_ammo,
|
||||
defines.inventory.spider_ammo,
|
||||
defines.inventory.hub_main,
|
||||
defines.inventory.cargo_landing_pad_main
|
||||
chest = {defines.inventory.chest},
|
||||
furnace = {defines.inventory.furnace_source},
|
||||
roboport = {defines.inventory.roboport_robot, defines.inventory.roboport_material},
|
||||
assembling_machine = {defines.inventory.assembling_machine_input},
|
||||
lab = {defines.inventory.lab_input},
|
||||
rocket_silo = {defines.inventory.rocket_silo_rocket, defines.inventory.rocket_silo_input},
|
||||
cargo_wagon = {defines.inventory.cargo_wagon},
|
||||
turret = {defines.inventory.turret_ammo},
|
||||
artillery_turret = {defines.inventory.artillery_turret_ammo},
|
||||
artillery_wagon = {defines.inventory.artillery_wagon_ammo},
|
||||
spider = {defines.inventory.spider_ammo},
|
||||
hub = {defines.inventory.hub_main},
|
||||
cargo_landing_pad = {defines.inventory.cargo_landing_pad_main}
|
||||
}
|
||||
|
||||
local insert_items = {}
|
||||
local no_inventory_flag = true
|
||||
local item_insertable_flag = false
|
||||
|
||||
for i=1,#items do
|
||||
for _,search_inventory in pairs(search_inventories) do
|
||||
local inventory = entity.get_inventory(search_inventory)
|
||||
if inventory then
|
||||
no_inventory_flag = false
|
||||
if inventory.can_insert(items[i]) then
|
||||
item_insertable_flag = true
|
||||
|
||||
-- Check fuel inventory
|
||||
local inventory = entity.get_fuel_inventory()
|
||||
if inventory and inventory.valid then
|
||||
no_inventory_flag = false
|
||||
if inventory.can_insert({name=items[i]}) then
|
||||
item_insertable_flag = true
|
||||
end
|
||||
end
|
||||
|
||||
-- Check other inventories
|
||||
if search_inventories[entity.prototype] then
|
||||
for _,search_inventory in pairs(search_inventories[entity.prototype]) do
|
||||
inventory = entity.get_inventory(search_inventory)
|
||||
if inventory and inventory.valid then
|
||||
no_inventory_flag = false
|
||||
if inventory.can_insert({name=items[i]}) then
|
||||
item_insertable_flag = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if no_inventory_flag then
|
||||
insert_items = items
|
||||
break
|
||||
@@ -91,16 +126,30 @@ end
|
||||
local function get_items_by_content(inventory)
|
||||
local content_items = {}
|
||||
for _,item in pairs(inventory.get_contents()) do
|
||||
content_items[#content_items+1] = item.name
|
||||
content_items[#content_items+1] = get_item_name(item)
|
||||
end
|
||||
return content_items
|
||||
end
|
||||
|
||||
local function get_items_by_filter(inventory)
|
||||
local function get_items_by_inventory_filter(inventory)
|
||||
local filter_items = {}
|
||||
for slot = 1,#inventory do
|
||||
if inventory.get_filter(slot) then
|
||||
filter_items[#filter_items+1] = inventory.get_filter(slot)
|
||||
filter_items[#filter_items+1] = get_item_name(inventory.get_filter(slot))
|
||||
end
|
||||
end
|
||||
return filter_items
|
||||
end
|
||||
|
||||
local function get_items_by_entity_filter(entity)
|
||||
local filter_items = {}
|
||||
for slot = 1,entity.filter_slot_count do
|
||||
if entity.get_filter(slot) then
|
||||
-- Debug message
|
||||
if __DebugAdapter then
|
||||
__DebugAdapter.print("[Autofilter] " .. get_item_name(entity.get_filter(slot)))
|
||||
end
|
||||
filter_items[#filter_items+1] = get_item_name(entity.get_filter(slot))
|
||||
end
|
||||
end
|
||||
return filter_items
|
||||
@@ -118,12 +167,9 @@ local function get_items_by_transport_line(belt)
|
||||
end
|
||||
|
||||
local function on_built_entity(event)
|
||||
-- Read settings
|
||||
local enabled = game.players[event.player_index].mod_settings["autofilter_enabled"].value
|
||||
local mode = string_to_table(game.players[event.player_index].mod_settings["autofilter_mode"].value)
|
||||
|
||||
if enabled then
|
||||
if game.players[event.player_index].is_shortcut_toggled("autofilter") then
|
||||
local inserter = event.entity
|
||||
local mode = string_to_table(game.players[event.player_index].mod_settings["autofilter_mode"].value)
|
||||
if inserter and inserter.valid and inserter.type == "inserter" then
|
||||
if inserter.filter_slot_count then
|
||||
if not inserter.use_filters and is_filter_empty(inserter) and inserter.inserter_filter_mode == "whitelist" then
|
||||
@@ -165,7 +211,17 @@ local function on_built_entity(event)
|
||||
elseif step == "filter" then
|
||||
-- Read inventory filter at pickup, write to filter
|
||||
if inventory_pickup and inventory_pickup.is_filtered() then
|
||||
items = concatenate_tables(items,get_items_by_filter(inventory_pickup))
|
||||
items = concatenate_tables(items,get_items_by_inventory_filter(inventory_pickup))
|
||||
if __DebugAdapter then
|
||||
__DebugAdapter.print("[Autofilter] Inventory: " .. table.concat(items,", "))
|
||||
end
|
||||
end
|
||||
-- Read entity filter at pickup, write to filter
|
||||
if pickup[1].filter_slot_count > 0 then
|
||||
items = concatenate_tables(items,get_items_by_entity_filter(pickup[1]))
|
||||
if __DebugAdapter then
|
||||
__DebugAdapter.print("[Autofilter] Entity: " .. table.concat(items,", "))
|
||||
end
|
||||
end
|
||||
elseif step == "belt" then
|
||||
-- Read belt transport lines at pickup, write to filter
|
||||
@@ -182,20 +238,20 @@ local function on_built_entity(event)
|
||||
|
||||
-- Filter candidate cleanup
|
||||
if #items > 0 then
|
||||
-- Deduplication
|
||||
items = deduplicate_items(items)
|
||||
|
||||
-- Debug message
|
||||
if __DebugAdapter then
|
||||
__DebugAdapter.print("[Autofilter] Inserter at (" .. inserter.position.x .. "," .. inserter.position.y .. ") had its filter set to: " .. table.concat(items,", "))
|
||||
end
|
||||
|
||||
-- Deduplication
|
||||
items = deduplicate_items(items)
|
||||
|
||||
-- Enable filters
|
||||
inserter.use_filters = true
|
||||
|
||||
-- Writing filters until full
|
||||
for slot = 1, inserter.filter_slot_count do
|
||||
inserter.set_filter(slot,items[slot])
|
||||
inserter.set_filter(slot,items[slot])
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -206,4 +262,5 @@ local function on_built_entity(event)
|
||||
end
|
||||
|
||||
--event handling
|
||||
script.on_event({defines.events.on_lua_shortcut, "autofilter"}, toggle_shortcut)
|
||||
script.on_event(defines.events.on_built_entity, on_built_entity,{{filter="type", type = "inserter"}})
|
||||
Reference in New Issue
Block a user