91 lines
3.1 KiB
Lua
91 lines
3.1 KiB
Lua
--[[
|
|
"title": "Auto Deconstruct",
|
|
"author": "mindmix",
|
|
"description": "This mod marks drills that have no more resources to mine for deconstruction."
|
|
--]]
|
|
local Event = require('__stdlib__/stdlib/event/event')
|
|
local Entity = require('__stdlib__/stdlib/entity/entity')
|
|
local table = require('__stdlib__/stdlib/utils/table')
|
|
local push_tick = require('__PickerAtheneum__/scripts/intra-mod-ticker')
|
|
|
|
local auto_deconstruct_event = Event.generate_event_name('picker-auto-deconstruct')
|
|
|
|
local targets =
|
|
table.array_to_dictionary {
|
|
'container',
|
|
'logistic-container',
|
|
'infinity-container'
|
|
}
|
|
|
|
local enabled = not script.active_mods['AutoDeconstruct']
|
|
|
|
local function has_other_drop_targets(entity)
|
|
local filter = {force = entity.force, position = entity.position, radius = 6, type = 'mining-drill'}
|
|
for _, ent in pairs(entity.surface.find_entities_filtered(filter)) do
|
|
if ent.drop_target == entity and not ent.to_be_deconstructed(entity.force) then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
local function deconstructable(entity)
|
|
return Entity.can_deconstruct(entity) and Entity.count_circuit_connections(entity) <= 1 and not Entity.has_fluidbox(entity)
|
|
end
|
|
|
|
local function check_for_deconstruction(event)
|
|
local drill = event.entity
|
|
|
|
if not (drill and drill.valid) then
|
|
return
|
|
end
|
|
|
|
if drill.status == defines.entity_status.no_minable_resources then
|
|
if drill.to_be_deconstructed(drill.force) or not deconstructable(drill) then
|
|
return
|
|
end
|
|
|
|
if not drill.order_deconstruction(drill.force) then
|
|
return
|
|
end
|
|
|
|
if settings.global['picker-autodeconstruct-target'].value then
|
|
local target = drill.drop_target
|
|
if target and targets[target.type] and deconstructable(target) and not has_other_drop_targets(target) then
|
|
target.order_deconstruction(drill.force)
|
|
end
|
|
end
|
|
elseif not event.ran_once then
|
|
-- no_minable_resources is false when the depleted event is triggered.
|
|
-- Push it back into the queue to run on the next available tick.
|
|
event.ran_once = true
|
|
push_tick(event)
|
|
end
|
|
end
|
|
Event.on_event(auto_deconstruct_event, check_for_deconstruction)
|
|
|
|
local function on_resource_depleted(event)
|
|
if settings.global['picker-autodeconstruct'].value then
|
|
local resource = event.entity
|
|
local filter = {type = 'mining-drill', radius = 6, position = resource.position}
|
|
for _, drill in pairs(resource.surface.find_entities_filtered(filter)) do
|
|
push_tick {
|
|
name = auto_deconstruct_event,
|
|
entity = drill,
|
|
added_on = event.tick,
|
|
events_per_tick = 10
|
|
}
|
|
end
|
|
end
|
|
end
|
|
Event.on_event_if(enabled, defines.events.on_resource_depleted, on_resource_depleted)
|
|
|
|
local function init()
|
|
for _, surface in pairs(game.surfaces) do
|
|
for _, drill in pairs(surface.find_entities_filtered {type = 'mining-drill'}) do
|
|
check_for_deconstruction({entity = drill})
|
|
end
|
|
end
|
|
end
|
|
Event.on_init_if(enabled, init)
|