1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2024-12-12 10:04:40 +02:00
RedMew/features/autofill.lua
RedRafe 26e1c28dc0
Factorio 2.0 update (#1436)
* Init Factorio 2.0 update

* add credits

* fix test module

* I know luackeck, I know

* Fixes

* Fix bad event.player_index handling

* Hotfixes

* Remove all filter inserters

* Migrate removed items

* Deprecating spidertron control and landfill features
2024-10-22 20:22:35 +01:00

144 lines
3.6 KiB
Lua

local Event = require 'utils.event'
local Game = require 'utils.game'
local Global = require 'utils.global'
local Settings = require 'utils.redmew_settings'
local pairs = pairs
local settings_get = Settings.get
local settings_set = Settings.set
local settings_validate = Settings.validate
local enable_autofill_name = 'autofill.enabled'
local ammo_count_name = 'autofill.ammo_count'
Settings.register(enable_autofill_name, Settings.types.boolean, true, 'autofill.enable')
Settings.register(ammo_count_name, Settings.types.positive_integer, 10, 'autofill.ammo_count')
local Public = {}
local Ammos = require 'features.autofill_compatibility'
local default_ammos = Ammos.ammo
Public.ammo_locales = Ammos.locale
local player_ammos = {} -- player_index -> dict of name -> bool
Global.register(
player_ammos,
function(tbl)
player_ammos = tbl
end
)
local function copy(tbl)
local result = {}
for k, v in pairs(tbl) do
result[k] = v
end
return result
end
function Public.get_player_ammos(player_index)
return player_ammos[player_index] or default_ammos
end
local get_player_ammos = Public.get_player_ammos
function Public.set_player_ammo(player_index, name, value)
local pa = player_ammos[player_index] or copy(default_ammos)
pa[name] = value
player_ammos[player_index] = pa
end
local function entity_built(event)
local entity = event.entity
if not entity.valid then
return
end
if entity.type ~= 'ammo-turret' then
return
end
local player_index = event.player_index
local player = game.get_player(player_index)
if not player or not player.valid then
return
end
local enabled = settings_get(player_index, enable_autofill_name)
if not enabled then
return
end
local inventory = player.get_main_inventory()
if not inventory or not inventory.valid then
return
end
local stack = {name = nil, count = settings_get(player_index, ammo_count_name)}
for name, ammo_enabled in pairs(get_player_ammos(player_index)) do
if not ammo_enabled then
goto continue
end
stack.name = name
local removed = inventory.remove(stack)
if removed > 0 then
stack.count = removed
local inserted = entity.insert(stack)
local diff = removed - inserted
if diff > 0 then
stack.count = diff
inventory.insert(stack)
end
local remaining_count = inventory.get_item_count(name)
Game.create_local_flying_text(
{
surface = player.surface,
position = entity.position,
text = {'autofill.insert_item', inserted, Ammos.locale[name], remaining_count}
}
)
break
end
::continue::
end
end
Event.add(defines.events.on_built_entity, entity_built)
function Public.get_enabled(player_index)
return settings_get(player_index, enable_autofill_name)
end
function Public.set_enabled(player_index, value)
settings_set(player_index, enable_autofill_name, value)
end
function Public.get_ammo_count(player_index)
return settings_get(player_index, ammo_count_name)
end
function Public.set_ammo_count(player_index, value)
if settings_validate(ammo_count_name, value) == nil then
settings_set(player_index, ammo_count_name, value)
return true
else
return false
end
end
Public.enable_autofill_name = enable_autofill_name
Public.ammo_count_name = ammo_count_name
return Public