107 lines
2.4 KiB
Lua
107 lines
2.4 KiB
Lua
local Blocks = require('blocks')
|
|
local class = require('class')
|
|
local Message = require('message')
|
|
local Util = require('util')
|
|
|
|
local device = _G.device
|
|
local fs = _G.fs
|
|
local turtle = _G.turtle
|
|
|
|
local Builder = class()
|
|
Util.merge(Builder, {
|
|
isCommandComputer = not turtle,
|
|
slots = { },
|
|
loc = { },
|
|
index = 1,
|
|
mode = 'build',
|
|
fuelItem = { id = 'minecraft:coal', dmg = 0 },
|
|
resourceSlots = 14,
|
|
facing = 'south',
|
|
})
|
|
|
|
local BUILDER_DIR = 'usr/builder'
|
|
|
|
local blockInfo = Blocks()
|
|
|
|
function Builder:getBlockCounts()
|
|
local blocks = { }
|
|
|
|
for k = self.index, #self.schematic.blocks do
|
|
local b = self.schematic.blocks[k]
|
|
local key = tostring(b.id) .. ':' .. b.dmg
|
|
local block = blocks[key]
|
|
if not block then
|
|
block = Util.shallowCopy(b)
|
|
block.qty = 0
|
|
block.need = 0
|
|
blocks[key] = block
|
|
end
|
|
block.need = block.need + 1
|
|
end
|
|
|
|
return blocks
|
|
end
|
|
|
|
function Builder:substituteBlocks(throttle)
|
|
for _,b in pairs(self.schematic.blocks) do
|
|
|
|
-- replace schematic block type with substitution
|
|
local pb = blockInfo:getPlaceableBlock(b.id, b.dmg)
|
|
|
|
Util.merge(b, pb)
|
|
|
|
b.odmg = pb.odmg or pb.dmg
|
|
|
|
local sub = self.subDB:get({ b.id, b.dmg })
|
|
if sub then
|
|
b.id, b.dmg = self.subDB:extract(sub)
|
|
end
|
|
throttle()
|
|
end
|
|
end
|
|
|
|
function Builder:reloadSchematic(throttle)
|
|
self.schematic:reload(throttle)
|
|
self:substituteBlocks(throttle)
|
|
end
|
|
|
|
function Builder:log(...)
|
|
Util.print(...)
|
|
end
|
|
|
|
function Builder:dumpInventory()
|
|
end
|
|
|
|
function Builder:logBlock(index, b)
|
|
local bdir = b.direction or ''
|
|
local logText = string.format('%d %s:%d (x:%d,z:%d:y:%d) %s',
|
|
index, b.id, b.dmg, b.x, b.z, b.y, bdir)
|
|
self:log(logText)
|
|
-- self:log(b.index) -- unique identifier of block
|
|
|
|
if device.wireless_modem then
|
|
Message.broadcast('builder', { x = b.x, y = b.y, z = b.z, heading = b.heading })
|
|
end
|
|
end
|
|
|
|
function Builder:saveProgress(index)
|
|
Util.writeTable(
|
|
fs.combine(BUILDER_DIR, self.schematic.filename .. '.progress'),
|
|
{ index = index, facing = self.facing, loc = self.loc }
|
|
)
|
|
end
|
|
|
|
function Builder:loadProgress(filename)
|
|
local progress = Util.readTable(fs.combine(BUILDER_DIR, filename))
|
|
if progress then
|
|
self.index = progress.index
|
|
if self.index > #self.schematic.blocks then
|
|
self.index = 1
|
|
end
|
|
self.facing = progress.facing or 'south'
|
|
self.loc = progress.loc or { }
|
|
end
|
|
end
|
|
|
|
return Builder
|