diff --git a/common/multiMiner.lua b/common/multiMiner.lua index 064a956..65263f8 100644 --- a/common/multiMiner.lua +++ b/common/multiMiner.lua @@ -6,19 +6,20 @@ local Socket = require('socket') local Util = require('util') local UI = require('ui') -local colors = _G.colors -local network = _G.network -local os = _G.os -local peripheral = _G.peripheral +local colors = _G.colors +local device = _G.device +local gps = _G.gps +local network = _G.network +local os = _G.os UI:configure('multiMiner', ...) -local scanner = peripheral.find('neuralInterface') -if not scanner or not scanner.scan then +local glasses = device['plethora:glasses'] +local scanner = device['plethora:scanner'] or error('Plethora scanner must be equipped') -end -local canvas = scanner.canvas and scanner.canvas() +-- hud +local canvas = glasses and glasses.canvas() if canvas then canvas.group = canvas.addGroup({ 4, 90 }) canvas.bg = canvas.group.addRectangle(0, 0, 60, 24, 0x00000033) @@ -27,6 +28,19 @@ if canvas then canvas.text.setScale(.75) end +-- container +local canvas3d = glasses and glasses.canvas3d().create() +local box, offset + +local paused = false + +local function inBox(pt) + if not box or not box.ex then + return true + end + return Point.inBox(pt, box) +end + local function locate() for _ = 1, 3 do local pt = GPS.getPoint() @@ -70,11 +84,13 @@ local function hijackTurtle(remoteId) end local function getNextPoint(turtle) - local pt = Point.closest(turtle.getPoint(), queue) - if pt then - turtle.pt = pt - queue[pt.pkey] = nil - return pt + if not paused then + local pt = Point.closest(turtle.getPoint(), queue) + if pt then + turtle.pt = pt + queue[pt.pkey] = nil + return pt + end end end @@ -216,6 +232,54 @@ local function run(member, point) end) end +local function drawContainer(pos) + canvas3d.clear() + + local function addBox(b) + canvas3d.addBox( + b.x - offset.x + .25, + b.y - offset.y + .25 , + b.z - offset.z + .25 , + .5, .5, .5).setDepthTested(false) + end + if box and box.ex then + addBox({ x = box.x, y = box.y, z = box.z }) + addBox({ x = box.x, y = box.y, z = box.ez }) + addBox({ x = box.ex, y = box.y, z = box.z }) + addBox({ x = box.ex, y = box.y, z = box.ez }) + addBox({ x = box.x, y = box.ey, z = box.z }) + addBox({ x = box.x, y = box.ey, z = box.ez }) + addBox({ x = box.ex, y = box.ey, z = box.z }) + addBox({ x = box.ex, y = box.ey, z = box.ez }) + elseif box then + canvas3d.recenter({ -(pos.x % 1), -(pos.y % 1), -(pos.z % 1) }) + addBox(box) + end +end + +local pauseResume = { + { text = 'Pause', event = 'pause' }, + { text = 'Resume', event = 'resume' }, +} +local containerText = { + [[Set a corner to contain mining area]], + [[Set ending corner]], + [[Set again to clear]], +} + +local containTab = UI.Tab { + tabTitle = 'Contain', + button = UI.Button { + x = 2, y = 2, + text = 'Set corner', + event = 'contain' + }, + textArea = UI.TextArea { + x = 2, y = 4, + value = containerText[1], + }, +} + local blocksTab = UI.Tab { tabTitle = 'Blocks', grid = UI.ScrollingGrid { @@ -248,12 +312,14 @@ local page = UI.Page { buttons = { { text = 'Scan', event = 'scan' }, { text = 'Abort', event = 'abort' }, + pauseResume[1], }, }, tabs = UI.Tabs { y = 2, ey = -2, [1] = blocksTab, [2] = turtlesTab, + [3] = containTab, }, info = UI.Window { y = -1, @@ -312,10 +378,10 @@ function page:scan() b.y = gpt.y + b.y b.z = gpt.z + b.z b.pkey = table.concat({ b.x, b.y, b.z }, ':') - if blockTypes[b.key] then + if blockTypes[b.key] and inBox(b) then if not Util.any(turtles, function(t) - return t.pt and t.pt.pkey == b.pkey - end) then + return t.pt and t.pt.pkey == b.pkey + end) then queue[b.pkey] = b end else @@ -388,6 +454,50 @@ function page:eventHandler(event) blocksTab.grid:draw() self.tabs:selectTab(blocksTab) + elseif event.type == 'pause' then + paused = true + Util.merge(event.button, pauseResume[2]) + event.button:draw() + + elseif event.type == 'resume' then + paused = false + Util.merge(event.button, pauseResume[1]) + event.button:draw() + + elseif event.type == 'contain' then + local pt = { gps.locate() } + local pos = { + x = pt[1], + y = pt[2], + z = pt[3], + } + + if not box then + offset = { + x = math.floor(pos.x), + y = math.floor(pos.y), + z = math.floor(pos.z), + } + box = { + x = math.floor(pos.x), + y = math.floor(pos.y) - 1, + z = math.floor(pos.z), + } + containTab.textArea.value = containerText[2] + elseif not box.ex then + box.ex = math.floor(pos.x) + box.ey = math.floor(pos.y) - 1 + box.ez = math.floor(pos.z) + box = Point.normalizeBox(box) + containTab.textArea.value = containerText[3] + else + box = nil + containTab.textArea.value = containerText[1] + end + + containTab.textArea:draw() + drawContainer(pos) + elseif event.type == 'abort' then for _, v in pairs(pool) do v.abort = true @@ -401,7 +511,7 @@ function page:eventHandler(event) end Event.onInterval(3, function() - if not abort then + if not abort and not paused then page:scan() end end) @@ -456,5 +566,6 @@ end) Event.pullEvents() if canvas then + canvas3d.clear() canvas.group.remove() end diff --git a/milo/MiloRemote.lua b/milo/MiloRemote.lua index 2870f3d..359bf1c 100644 --- a/milo/MiloRemote.lua +++ b/milo/MiloRemote.lua @@ -69,6 +69,7 @@ local page = UI.Page { [ 'enter' ] = 'eject', [ 'up' ] = 'grid_up', [ 'down' ] = 'grid_down', + [ 'control-a' ] = 'eject_all', }, }, amount = UI.TextEntry { @@ -80,6 +81,7 @@ local page = UI.Page { backgroundFocusColor = colors.black, accelerators = { [ 'enter' ] = 'eject_specified', + [ 'control-a' ] = 'eject_all', }, help = 'Request amount', }, diff --git a/milo/apis/init.lua b/milo/apis/init.lua index 5e3c023..810a08a 100644 --- a/milo/apis/init.lua +++ b/milo/apis/init.lua @@ -224,8 +224,8 @@ function Milo:eject(item, count) total = total + amount count = count - amount - Sound.play('ui.button.click') - --Sound.play('entity.illusion_illager.death') + --Sound.play('ui.button.click') + Sound.play('entity.illusion_illager.death', .3) turtle.emptyInventory() end return total