116 lines
4.4 KiB
Lua
116 lines
4.4 KiB
Lua
-------------------------------------------------------------------------------
|
|
--[[Picker Blueprinter]] --
|
|
-------------------------------------------------------------------------------
|
|
--Mirroring and Upgradeing code from "Foreman", by "Choumiko"
|
|
|
|
local Event = require('__stdlib__/stdlib/event/event')
|
|
local Area = require('__stdlib__/stdlib/area/area')
|
|
local Inventory = require('__stdlib__/stdlib/entity/inventory')
|
|
local Entity = require('__stdlib__/stdlib/entity/entity')
|
|
|
|
local lib = require('__PickerAtheneum__/utils/lib')
|
|
|
|
local function blueprint_single_entity(player, entity, target_name, area)
|
|
if area:size() > 0 then
|
|
local bp = lib.get_planner(player, 'picker-blueprint-tool', 'Pipette Blueprint')
|
|
if bp then
|
|
bp.clear_blueprint()
|
|
bp.label = 'Pipette Blueprint'
|
|
bp.allow_manual_label_change = false
|
|
-- Build from surface
|
|
bp.create_blueprint {
|
|
surface = entity.surface,
|
|
force = player.force,
|
|
area = area,
|
|
always_include_tiles = false
|
|
}
|
|
|
|
-- Remove garbage
|
|
local found = false
|
|
for i, ent in pairs(bp.get_blueprint_entities() or {}) do
|
|
if ent.name == target_name then
|
|
bp.set_blueprint_entities {ent}
|
|
found = true
|
|
break
|
|
end
|
|
end
|
|
if not found then
|
|
return bp.clear() and nil
|
|
end
|
|
else
|
|
player.print({'picker.msg-cant-insert-blueprint'})
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Make Simple Blueprint --Makes a simple blueprint of the selected entity, including recipes/modules
|
|
local function make_simple_blueprint(event)
|
|
local player = game.get_player(event.player_index)
|
|
if player.controller_type ~= defines.controllers.ghost and player.mod_settings['picker-simple-blueprint'].value then
|
|
if player.selected and not (player.selected.type == 'resource' or player.selected.has_flag('not-blueprintable')) then
|
|
if not (player.cursor_stack.valid_for_read) then
|
|
local entity = player.selected
|
|
if player.clear_cursor() then
|
|
if entity.force == player.force and Entity.damaged(entity) and lib.get_planner(player, 'repair-tool') then
|
|
return
|
|
else
|
|
local area = Area(entity.bounding_box)
|
|
blueprint_single_entity(player, entity, player.selected.name, area)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
Event.register('picker-make-ghost', make_simple_blueprint)
|
|
|
|
--(( Blueprint Book tools ))--
|
|
local function add_empty_bp_to_book(event)
|
|
local player = game.players[event.player_index]
|
|
local stack = player.cursor_stack
|
|
if (stack.valid_for_read and stack.is_blueprint_book) then
|
|
local inv = stack.get_inventory(defines.inventory.item_main)
|
|
if inv then
|
|
local index = 0
|
|
for i = #inv, 1, -1 do
|
|
if inv[i].valid_for_read and not inv[i].is_blueprint_setup() then
|
|
index = i
|
|
break
|
|
end
|
|
end
|
|
if index > 0 then
|
|
stack.active_index = index
|
|
else
|
|
inv.insert('blueprint')
|
|
stack.active_index = #inv
|
|
end
|
|
end
|
|
end
|
|
end
|
|
Event.register('picker-add-empty-bp-to-book', add_empty_bp_to_book)
|
|
|
|
local function _clear_empty_bp(slot)
|
|
if slot.valid_for_read and not slot.is_blueprint_setup() then
|
|
slot.clear()
|
|
end
|
|
end
|
|
local function clean_empty_bps_in_book(event)
|
|
local player = game.players[event.player_index]
|
|
local stack = player.cursor_stack
|
|
if stack.valid_for_read and stack.is_blueprint_book then
|
|
local inv = stack.get_inventory(defines.inventory.item_main)
|
|
if inv and not inv.is_empty() then
|
|
local change_index = not (inv[stack.active_index].valid_for_read and inv[stack.active_index].is_blueprint_setup())
|
|
|
|
Inventory.each_reverse(inv, _clear_empty_bp)
|
|
|
|
if change_index then
|
|
local _, idx = inv.find_item_stack('blueprint')
|
|
stack.active_index = idx or 1
|
|
-- Cycling blueprints in books raises cursor changed event, but we can't emulate that anymore.
|
|
end
|
|
end
|
|
end
|
|
end
|
|
Event.register('picker-clean-empty-bps-in-book', clean_empty_bps_in_book) --))
|