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)
 |