better turtle.equip

This commit is contained in:
kepler155c@gmail.com
2019-03-07 13:14:47 -05:00
parent e5f1374325
commit d3e8a158b4
11 changed files with 167 additions and 129 deletions

View File

@@ -1,6 +1,7 @@
{ {
required = { required = {
'core', 'core',
'turtle',
}, },
title = 'Programs for farming resources', title = 'Programs for farming resources',
repository = 'kepler155c/opus-apps/{{OPUS_BRANCH}}/farms', repository = 'kepler155c/opus-apps/{{OPUS_BRANCH}}/farms',

View File

@@ -1,4 +1,4 @@
local Peripheral = require('peripheral') local Equipper = require('turtle.equipper')
local Point = require('point') local Point = require('point')
local Util = require('util') local Util = require('util')
@@ -18,34 +18,14 @@ local Runners = {
Blaze = false, Blaze = false,
} }
local function equip(side, item, rawName) Equipper.equipLeft('minecraft:diamond_sword')
local equipped = Peripheral.lookup('side/' .. side) Equipper.equipRight('plethora:module:2', 'plethora:scanner')
if equipped and equipped.type == item then
return true
end
if not turtle.equip(side, rawName or item) then
if not turtle.selectSlotWithQuantity(0) then
error('No slots available')
end
turtle.equip(side)
if not turtle.equip(side, item) then
error('Unable to equip ' .. item)
end
end
turtle.select(1)
end
equip('left', 'minecraft:diamond_sword')
equip('right', 'plethora:scanner', 'plethora:module:2')
local scanner = device['plethora:scanner'] local scanner = device['plethora:scanner']
local facing = scanner.getBlockMeta(0, 0, 0).state.facing local facing = scanner.getBlockMeta(0, 0, 0).state.facing
turtle.point.heading = Point.facings[facing].heading turtle.point.heading = Point.facings[facing].heading
equip('right', 'plethora:sensor', 'plethora:module:3') Equipper.equipRight('plethora:module:3', 'plethora:sensor')
local sensor = device['plethora:sensor'] local sensor = device['plethora:sensor']
turtle.setMovementStrategy('goto') turtle.setMovementStrategy('goto')
@@ -55,9 +35,9 @@ local function findChests()
if chest then if chest then
return { chest } return { chest }
end end
equip('right', 'plethora:scanner', 'plethora:module:2') Equipper.equipRight('plethora:module:2', 'plethora:scanner')
local chests = scanner.scan() local chests = scanner.scan()
equip('right', 'plethora:sensor', 'plethora:module:3') Equipper.equipRight('plethora:module:3', 'plethora:sensor')
Util.filterInplace(chests, function(b) Util.filterInplace(chests, function(b)
if b.name == 'minecraft:chest' or if b.name == 'minecraft:chest' or

View File

@@ -1,3 +1,4 @@
local Equipper = require('turtle.equipper')
local Point = require('point') local Point = require('point')
local Util = require('util') local Util = require('util')
@@ -17,9 +18,8 @@ local FUEL = Util.transpose {
'minecraft:blaze_rod:0', 'minecraft:blaze_rod:0',
} }
local scanner = device['plethora:scanner'] or Equipper.equipRight('plethora:module:2', 'plethora:scanner')
turtle.equip('right', 'plethora:module:2') and device['plethora:scanner'] or local scanner = device['plethora:scanner']
error('Plethora scanner required')
local crops = Util.readTable(CONFIG_FILE) or { local crops = Util.readTable(CONFIG_FILE) or {
['minecraft:wheat'] = ['minecraft:wheat'] =
@@ -126,7 +126,7 @@ local function scan()
end end
local function harvest(blocks) local function harvest(blocks)
turtle.equip('right', 'minecraft:diamond_pickaxe') Equipper.equipRight('minecraft:diamond_pickaxe')
local dropped local dropped
@@ -185,11 +185,11 @@ local function harvest(blocks)
elseif b.action == 'bump' then elseif b.action == 'bump' then
if turtle.faceAgainst(b) then if turtle.faceAgainst(b) then
turtle.equip('right', 'plethora:module:3') Equipper.equipRight('plethora:module:3', 'plethora:sensor')
os.sleep(.5) os.sleep(.5)
-- search the ground for the dropped cactus -- search the ground for the dropped cactus
local sensed = peripheral.call('right', 'sense') local sensed = peripheral.call('right', 'sense')
turtle.equip('right', 'minecraft:diamond_pickaxe') Equipper.equipRight('minecraft:diamond_pickaxe')
Util.filterInplace(sensed, function(s) Util.filterInplace(sensed, function(s)
if s.displayName == 'item.tile.cactus' then if s.displayName == 'item.tile.cactus' then
s.x = Util.round(s.x) + turtle.point.x s.x = Util.round(s.x) + turtle.point.x
@@ -217,7 +217,7 @@ local function harvest(blocks)
end end
end end
end) end)
turtle.equip('right', 'plethora:module:2') Equipper.equipRight('plethora:module:2', 'plethora:scanner')
end end
local s, m = turtle.run(function() local s, m = turtle.run(function()

View File

@@ -1,6 +1,6 @@
local Adapter = require('core.chestAdapter18') local Adapter = require('core.chestAdapter18')
local Config = require('config') local Config = require('config')
local Peripheral = require('peripheral') local Equipper = require('turtle.equipper')
local Util = require('util') local Util = require('util')
local device = _G.device local device = _G.device
@@ -30,28 +30,8 @@ local ANIMALS = {
local animal = ANIMALS[config.animal] local animal = ANIMALS[config.animal]
local function equip(side, item, rawName) Equipper.equipLeft('minecraft:diamond_sword')
local equipped = Peripheral.lookup('side/' .. side) Equipper.equipRight('plethora:module:3', 'plethora:sensor')
if equipped and equipped.type == item then
return true
end
if not turtle.equip(side, rawName or item) then
if not turtle.selectSlotWithQuantity(0) then
error('No slots available')
end
turtle.equip(side)
if not turtle.equip(side, item) then
error('Unable to equip ' .. item)
end
end
turtle.select(1)
end
equip('left', 'minecraft:diamond_sword')
equip('right', 'plethora:sensor', 'plethora:module:3')
local sensor = device['plethora:sensor'] local sensor = device['plethora:sensor']
@@ -84,7 +64,7 @@ local function getAnimalCount()
end end
local function butcher() local function butcher()
turtle.equip('right', 'minecraft:diamond_sword') Equipper.equipRight('minecraft:diamond_sword')
turtle.select(1) turtle.select(1)
turtle.attack() turtle.attack()
@@ -92,7 +72,7 @@ local function butcher()
turtle.turnRight() turtle.turnRight()
turtle.attack() turtle.attack()
end end
turtle.equip('right', 'plethora:module:3') Equipper.equipRight('plethora:module:3', 'plethora:sensor')
turtle.eachFilledSlot(function(slot) turtle.eachFilledSlot(function(slot)
if not retain[slot.name] then if not retain[slot.name] then

View File

@@ -1,4 +1,4 @@
local Peripheral = require('peripheral') local Equipper = require('turtle.equipper')
local Point = require('point') local Point = require('point')
local Util = require('util') local Util = require('util')
@@ -11,29 +11,8 @@ local STARTUP_FILE = 'usr/autorun/spawner.lua'
local mobTypes = { } local mobTypes = { }
local function equip(side, item, rawName) Equipper.equipLeft('minecraft:diamond_sword')
local equipped = Peripheral.lookup('side/' .. side) Equipper.equipRight('plethora:module:2', 'plethora:scanner')
if equipped and equipped.type == item then
return true
end
if not turtle.equip(side, rawName or item) then
if not turtle.selectSlotWithQuantity(0) then
error('No slots available')
end
turtle.equip(side)
if not turtle.equip(side, item) then
error('Unable to equip ' .. item)
end
end
turtle.select(1)
end
equip('left', 'minecraft:diamond_sword')
equip('right', 'plethora:scanner', 'plethora:module:2')
local scanner = device['plethora:scanner'] local scanner = device['plethora:scanner']
turtle.reset() turtle.reset()
@@ -51,7 +30,7 @@ Util.filterInplace(data, function(b)
end) end)
local chest = Point.closest(spawner, data) or error('missing drop off chest') local chest = Point.closest(spawner, data) or error('missing drop off chest')
equip('right', 'plethora:sensor', 'plethora:module:3') Equipper.equipRight('plethora:module:3', 'plethora:sensor')
local sensor = device['plethora:sensor'] local sensor = device['plethora:sensor']
if not fs.exists(STARTUP_FILE) then if not fs.exists(STARTUP_FILE) then

View File

@@ -1,3 +1,4 @@
local Equipper = require('turtle.equipper')
local GPS = require('gps') local GPS = require('gps')
local Point = require('point') local Point = require('point')
local Util = require('util') local Util = require('util')
@@ -469,7 +470,7 @@ local function makeKey(b)
end end
local function findDroppedSaplings() local function findDroppedSaplings()
equip('left', 'plethora:sensor', SENSOR) Equipper.equipLeft(SENSOR, 'plethora:sensor')
local raw = peripheral.call('left', 'sense') local raw = peripheral.call('left', 'sense')
local sensed = Util.reduce(raw, function(acc, b) local sensed = Util.reduce(raw, function(acc, b)
@@ -490,7 +491,7 @@ end
local function scan(pt, filter, blocks) local function scan(pt, filter, blocks)
turtle.pathfind(pt) turtle.pathfind(pt)
equip('left', 'plethora:scanner', SCANNER) Equipper.equipLeft(SCANNER, 'plethora:scanner')
local raw = peripheral.call('left', 'scan') local raw = peripheral.call('left', 'scan')
return Util.reduce(raw, function(acc, b) return Util.reduce(raw, function(acc, b)
@@ -595,7 +596,7 @@ local function fell()
local pt = Util.shallowCopy(HOME_PT) local pt = Util.shallowCopy(HOME_PT)
while Util.any(blocks, function(b) return b.y > pt.y + 6 end) do while Util.any(blocks, function(b) return b.y > pt.y + 6 end) do
-- tree might be above low scan range, do a scan higher up -- tree might be above low scan range, do a scan higher up
equip('left', PICKAXE) Equipper.equipLeft(PICKAXE)
pt.y = pt.y + 8 pt.y = pt.y + 8
blocks = scan(pt, filter, blocks) blocks = scan(pt, filter, blocks)
end end
@@ -605,7 +606,7 @@ local function fell()
-- add any locations that need saplings -- add any locations that need saplings
getPlantLocations(blocks) getPlantLocations(blocks)
equip('left', PICKAXE) Equipper.equipLeft(PICKAXE)
if not Util.empty(blocks) then if not Util.empty(blocks) then
print('Chopping') print('Chopping')
@@ -657,12 +658,12 @@ end
local function findHome() local function findHome()
local pt = GPS.getPoint(2) or error('GPS not found') local pt = GPS.getPoint(2) or error('GPS not found')
equip('left', SCANNER) Equipper.equipLeft(SCANNER, 'plethora:scanner')
local facing = peripheral.call('left', 'getBlockMeta', 0, 0, 0).state.facing local facing = peripheral.call('left', 'getBlockMeta', 0, 0, 0).state.facing
pt.heading = Point.facings[facing].heading pt.heading = Point.facings[facing].heading
equip('left', PICKAXE) Equipper.equipLeft(PICKAXE)
if not state.home then if not state.home then
setState('home', pt) setState('home', pt)
@@ -716,8 +717,8 @@ local function updateClock()
end end
local function startupCheck() local function startupCheck()
equip('right', 'modem', MODEM) Equipper.equipRight(MODEM, 'modem')
equip('left', PICKAXE) Equipper.equipLeft(PICKAXE)
local slots = turtle.getSummedInventory() local slots = turtle.getSummedInventory()

View File

@@ -1,4 +1,7 @@
{ {
required = {
'turtle',
},
title = 'Turtle mining programs', title = 'Turtle mining programs',
repository = 'kepler155c/opus-apps/{{OPUS_BRANCH}}/miners', repository = 'kepler155c/opus-apps/{{OPUS_BRANCH}}/miners',
description = [[Provides two types of automated mining: description = [[Provides two types of automated mining:

View File

@@ -136,7 +136,7 @@ local function run(member)
for _ = 1, 3 do for _ = 1, 3 do
Sound.play('block.note.pling') Sound.play('block.note.pling')
os.sleep(.3) os.sleep(.3)
end end
end end
end end
turtle.go({ y = pt.y }) turtle.go({ y = pt.y })

View File

@@ -9,11 +9,12 @@
Plethora scanner Plethora scanner
Bucket Bucket
--]] --]]
local Event = require('event') local Event = require('event')
local GPS = require('gps') local Equipper = require('turtle.equipper')
local Point = require('point') local GPS = require('gps')
local UI = require('ui') local Point = require('point')
local Util = require('util') local UI = require('ui')
local Util = require('util')
local colors = _G.colors local colors = _G.colors
local fs = _G.fs local fs = _G.fs
@@ -316,26 +317,10 @@ local function collectDrops(suckAction)
end end
end end
local function equip(side, item)
if not turtle.equip(side, item) then
if not turtle.selectSlotWithQuantity(0) then
ejectTrash()
end
if not turtle.selectSlotWithQuantity(0) then
turtle.select(16)
turtle.drop()
end
turtle.equip(side)
if not turtle.equip(side, item) then
error('Unable to equip ' .. item)
end
end
end
local function scan() local function scan()
equip('left', 'plethora:module:2') Equipper.equipLeft('plethora:module:2', 'plethora:scanner')
local blocks = peripheral.call('left', 'scan') local blocks = peripheral.call('left', 'scan')
equip('left', 'minecraft:diamond_pickaxe') Equipper.equipLeft('minecraft:diamond_pickaxe')
local throttle = Util.throttle() local throttle = Util.throttle()
local bedrock = -256 local bedrock = -256
@@ -507,11 +492,8 @@ end
-- in plethora code, we can override initialize with a scanner version -- in plethora code, we can override initialize with a scanner version
turtle.initialize = function() turtle.initialize = function()
if turtle.isEquipped('modem') ~= 'right' then Equipper.equipRight('computercraft:advanced_modem', 'modem')
equip('right', 'computercraft:advanced_modem') Equipper.equipLeft('minecraft:diamond_pickaxe')
end
equip('left', 'minecraft:diamond_pickaxe')
local function verify(item) local function verify(item)
if not turtle.has(item) then if not turtle.has(item) then
@@ -526,11 +508,11 @@ turtle.initialize = function()
--os.sleep(5) --os.sleep(5)
local pt = GPS.getPoint(2) or error('GPS not found') local pt = GPS.getPoint(2) or error('GPS not found')
equip('left', 'plethora:module') Equipper.equipLeft('plethora:module:2', 'plethora:scanner')
local facing = peripheral.call('left', 'getBlockMeta', 0, 0, 0).state.facing local facing = peripheral.call('left', 'getBlockMeta', 0, 0, 0).state.facing
pt.heading = Point.facings[facing].heading pt.heading = Point.facings[facing].heading
turtle.setPoint(pt, true) turtle.setPoint(pt, true)
equip('left', 'minecraft:diamond_pickaxe') Equipper.equipLeft('minecraft:diamond_pickaxe')
end end
local function main() local function main()

109
turtle/apis/equipper.lua Normal file
View File

@@ -0,0 +1,109 @@
local peripheral = _G.peripheral
local turtle = _G.turtle
local Equipper = { }
local SCANNER_EQUIPPED = 'plethora:scanner'
local SCANNER_INV = 'plethora:module:2'
local reversed = {
left = 'right',
right = 'left'
}
local function getEquipped()
Equipper.equipped = { }
Equipper.equipped.left = peripheral.getType('left')
Equipper.equipped.right = peripheral.getType('right')
if not Equipper.equipped.left or not Equipper.equipped.right then
-- try to detect non-peripheral type items - such as minecraft:diamond_pickaxe
local side = Equipper.isEquipped(SCANNER_EQUIPPED)
local meta
if side then
meta = peripheral.call(side, 'getBlockMeta', 0, 0, 0)
elseif turtle.has(SCANNER_INV) then
local swapSide = peripheral.getType('right') == 'modem' and 'left' or 'right'
turtle.equip(swapSide, SCANNER_INV)
meta = peripheral.call(swapSide, 'getBlockMeta', 0, 0, 0)
end
if meta then
if not Equipper.equipped.left then
Equipper.equipped.left = meta.turtle.left and meta.turtle.left.id
end
if not Equipper.equipped.right then
Equipper.equipped.right = meta.turtle.right and meta.turtle.right.id
end
elseif not Equipper.equipped.left then
local slot = Equipper.uneqip('left')
if slot then
Equipper.equipped.left = slot.name .. ':' .. slot.damage
end
elseif not Equipper.equipped.right then
local slot = Equipper.uneqip('right')
if slot then
Equipper.equipped.right = slot.name .. ':' .. slot.damage
end
end
end
_debug("Detected Equipped")
_debug(Equipper.equipped)
end
function Equipper.unequip(side)
local slot = turtle.selectOpenSlot()
if not slot then
error('No slots available')
end
turtle.equip(side)
Equipper.equipped[side] = nil
return turtle.getItemDetail(slot)
end
function Equipper.isEquipped(name)
if not Equipper.equipped then
getEquipped()
end
return Equipper.equipped.left == name and 'left' or
Equipper.equipped.right == name and 'right'
end
function Equipper.equip(side, invName, equippedName)
if not Equipper.equipped then
getEquipped()
end
-- is it already equipped ?
if Equipper.equipped[side] == (equippedName or invName) then
return
end
-- is it equipped on other side ?
if Equipper.equipped[reversed[side]] == (equippedName or invName) then
Equipper.unequip(reversed[side])
end
local s, m = turtle.equip(side, invName)
if not s then
error(string.format('Unable to equip %s\n%s', (equippedName or invName), m))
end
Equipper.equipped[side] = peripheral.getType(side) or invName
_debug("Equipped: " .. invName)
_debug(Equipper.equipped)
end
function Equipper.equipLeft(invName, equippedName)
Equipper.equip('left', invName, equippedName)
end
function Equipper.equipRight(invName, equippedName)
Equipper.equip('right', invName, equippedName)
end
return Equipper

View File

@@ -1,7 +1,9 @@
local Point = require('point') local Equipper = require('turtle.equipper')
local Point = require('point')
local device = _G.device local device = _G.device
local turtle = _G.turtle local peripheral = _G.device
local turtle = _G.turtle
local MAX_FUEL = turtle.getFuelLimit() local MAX_FUEL = turtle.getFuelLimit()
@@ -13,9 +15,10 @@ if not turtle.has('minecraft:bucket') then
error('bucket required') error('bucket required')
end end
local scanner = device['plethora:scanner'] or local swapSide = peripheral.getType('right') == 'modem' and 'left' or 'right'
turtle.equip('left', 'plethora:module:2') and device['plethora:scanner'] or Equipper.equip(swapSide, 'plethora:module:2', 'plethora:scanner')
error('Plethora scanner required')
local scanner = device['plethora:scanner']
if not turtle.select('minecraft:bucket') then if not turtle.select('minecraft:bucket') then
error('bucket required') error('bucket required')
@@ -60,7 +63,7 @@ turtle.gotoY(0)
turtle.go({ x = 0, y = 0, z = 0 }) turtle.go({ x = 0, y = 0, z = 0 })
turtle.set({ status = 'idle' }) turtle.set({ status = 'idle' })
turtle.unequip('left') turtle.unequip(swapSide)
print('Fuel: ' .. turtle.getFuelLevel()) print('Fuel: ' .. turtle.getFuelLevel())
if not s and m then if not s and m then