Add multi-dimension support
This commit is contained in:
parent
2a53a3c4c6
commit
fdd00e3fb6
24
dimServ.lua
Normal file
24
dimServ.lua
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
local CHANNEL = 666
|
||||||
|
|
||||||
|
settings.define("dimension", {
|
||||||
|
description = "Dimension to serve",
|
||||||
|
default = "overworld",
|
||||||
|
type = "string",
|
||||||
|
})
|
||||||
|
local dim = settings.get("dimension")
|
||||||
|
|
||||||
|
local modem = peripheral.find("modem")
|
||||||
|
assert(modem)
|
||||||
|
modem.open(CHANNEL)
|
||||||
|
|
||||||
|
print("Serving requests for dimension '" .. dim .. "'")
|
||||||
|
while true do
|
||||||
|
local event, side, channel, replyChannel, reply, distance = os.pullEvent("modem_message")
|
||||||
|
assert(channel == CHANNEL)
|
||||||
|
|
||||||
|
-- AKA we are in the same dimension
|
||||||
|
if distance then
|
||||||
|
print("Responding to request from computer #" .. replyChannel - CHANNEL)
|
||||||
|
modem.transmit(replyChannel, channel, dim)
|
||||||
|
end
|
||||||
|
end
|
19
mine.lua
19
mine.lua
@ -325,6 +325,7 @@ function Miner.new()
|
|||||||
self:equip("computercraft:wireless_modem_advanced", "right")
|
self:equip("computercraft:wireless_modem_advanced", "right")
|
||||||
rednet.open("right")
|
rednet.open("right")
|
||||||
|
|
||||||
|
self:findDimension()
|
||||||
self.pos = vector.new(0, 0, 0)
|
self.pos = vector.new(0, 0, 0)
|
||||||
self:doGPS(true)
|
self:doGPS(true)
|
||||||
|
|
||||||
@ -351,6 +352,7 @@ function Miner:sendMessage(type, msg)
|
|||||||
rednet.open("right")
|
rednet.open("right")
|
||||||
msg["type"] = type
|
msg["type"] = type
|
||||||
msg["name"] = self.name
|
msg["name"] = self.name
|
||||||
|
msg["dimension"] = self.dimension
|
||||||
msg["pos"] = self.absolutePos
|
msg["pos"] = self.absolutePos
|
||||||
rednet.broadcast(msg, PROTOCOL)
|
rednet.broadcast(msg, PROTOCOL)
|
||||||
end
|
end
|
||||||
@ -444,6 +446,23 @@ function Miner:safeMove(dir)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function Miner:findDimension()
|
||||||
|
self:equip("computercraft:wireless_modem_advanced", "right")
|
||||||
|
local m = peripheral.wrap("right")
|
||||||
|
|
||||||
|
local replyChannel = 666 + os.computerID()
|
||||||
|
m.open(replyChannel)
|
||||||
|
m.transmit(666, replyChannel)
|
||||||
|
|
||||||
|
local event, side, channel, _, reply, distance = os.pullEvent("modem_message")
|
||||||
|
assert(distance)
|
||||||
|
assert(channel == replyChannel)
|
||||||
|
self.dimension = reply
|
||||||
|
m.close(replyChannel)
|
||||||
|
|
||||||
|
print("Looks like my dimension is " .. self.dimension)
|
||||||
|
end
|
||||||
|
|
||||||
function Miner:doGPS(orientation)
|
function Miner:doGPS(orientation)
|
||||||
local x, y, z = gps.locate()
|
local x, y, z = gps.locate()
|
||||||
assert(x)
|
assert(x)
|
||||||
|
@ -1,5 +1,12 @@
|
|||||||
local PROTOCOL = "automine"
|
local PROTOCOL = "automine"
|
||||||
local TARGET = "devplayer0"
|
local TARGET = "devplayer0"
|
||||||
|
|
||||||
|
local DIM_MAP = {
|
||||||
|
overworld = "Overworld",
|
||||||
|
the_nether = "Nether",
|
||||||
|
the_end = "End",
|
||||||
|
}
|
||||||
|
|
||||||
local ICON_BASE = "https://p.nul.ie/cc/icon/"
|
local ICON_BASE = "https://p.nul.ie/cc/icon/"
|
||||||
local ORE_ICONS = {
|
local ORE_ICONS = {
|
||||||
["minecraft:coal_ore"] = "coal",
|
["minecraft:coal_ore"] = "coal",
|
||||||
@ -91,6 +98,29 @@ function MineMonitor.new(chat)
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function MineMonitor:prepareMap(msg)
|
||||||
|
local map = DIM_MAP[msg.dimension]
|
||||||
|
assert(map)
|
||||||
|
assert(self.cart.setCurrentMap(map))
|
||||||
|
|
||||||
|
local id = markerSet(msg)
|
||||||
|
local sets = self.cart.getMarkerSets()
|
||||||
|
assert(sets)
|
||||||
|
|
||||||
|
local found = false
|
||||||
|
for _, s in ipairs(sets) do
|
||||||
|
if s == id then
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if not found then
|
||||||
|
assert(self.cart.addMarkerSet(id, "AutoMiner " .. msg.name))
|
||||||
|
end
|
||||||
|
return id
|
||||||
|
end
|
||||||
|
|
||||||
function MineMonitor:setPosMarker(msg)
|
function MineMonitor:setPosMarker(msg)
|
||||||
local id = markerSet(msg)
|
local id = markerSet(msg)
|
||||||
local mId = id .. "_pos"
|
local mId = id .. "_pos"
|
||||||
@ -106,6 +136,8 @@ function MineMonitor:handleStart(msg)
|
|||||||
{text = msg.name, color = "green"},
|
{text = msg.name, color = "green"},
|
||||||
{text = " @ ", color = "white"},
|
{text = " @ ", color = "white"},
|
||||||
{text = vecToStr(msg.pos), color = "aqua"},
|
{text = vecToStr(msg.pos), color = "aqua"},
|
||||||
|
{text = " in ", color = "white"},
|
||||||
|
{text = msg.dimension, color = "aqua"},
|
||||||
{text = " found ", color = "white"},
|
{text = " found ", color = "white"},
|
||||||
{text = tostring(msg.oreCount), color = "red"},
|
{text = tostring(msg.oreCount), color = "red"},
|
||||||
{text = " ores (", color = "white"},
|
{text = " ores (", color = "white"},
|
||||||
@ -115,10 +147,8 @@ function MineMonitor:handleStart(msg)
|
|||||||
{text = "!", color = "white"},
|
{text = "!", color = "white"},
|
||||||
})
|
})
|
||||||
|
|
||||||
local id = markerSet(msg)
|
local id = self:prepareMap(msg)
|
||||||
self.cart.addMarkerSet(id, "AutoMiner " .. msg.name)
|
|
||||||
self.cart.clearMarkerSet(id)
|
self.cart.clearMarkerSet(id)
|
||||||
|
|
||||||
self:setPosMarker(msg)
|
self:setPosMarker(msg)
|
||||||
|
|
||||||
local veinPoints = {}
|
local veinPoints = {}
|
||||||
@ -143,6 +173,8 @@ function MineMonitor:handleVein(msg)
|
|||||||
{text = msg.name, color = "green"},
|
{text = msg.name, color = "green"},
|
||||||
{text = " @ ", color = "white"},
|
{text = " @ ", color = "white"},
|
||||||
{text = vecToStr(msg.pos), color = "aqua"},
|
{text = vecToStr(msg.pos), color = "aqua"},
|
||||||
|
{text = " in ", color = "white"},
|
||||||
|
{text = msg.dimension, color = "aqua"},
|
||||||
{text = " is mining ", color = "white"},
|
{text = " is mining ", color = "white"},
|
||||||
{text = tostring(msg.oreCount), color = "red"},
|
{text = tostring(msg.oreCount), color = "red"},
|
||||||
{text = " ", color = "white"},
|
{text = " ", color = "white"},
|
||||||
@ -154,7 +186,7 @@ function MineMonitor:handleVein(msg)
|
|||||||
{text = ")!", color = "white"},
|
{text = ")!", color = "white"},
|
||||||
}, TARGET)
|
}, TARGET)
|
||||||
|
|
||||||
local id = markerSet(msg)
|
local id = self:prepareMap(msg)
|
||||||
self:setPosMarker(msg)
|
self:setPosMarker(msg)
|
||||||
if msg.i ~= 1 then
|
if msg.i ~= 1 then
|
||||||
self.cart.removeMarker(id, id .. "_vein_" .. (msg.i - 1))
|
self.cart.removeMarker(id, id .. "_vein_" .. (msg.i - 1))
|
||||||
@ -166,13 +198,14 @@ function MineMonitor:handleRecall(msg)
|
|||||||
{text = msg.name, color = "green"},
|
{text = msg.name, color = "green"},
|
||||||
{text = " @ ", color = "white"},
|
{text = " @ ", color = "white"},
|
||||||
{text = vecToStr(msg.pos), color = "aqua"},
|
{text = vecToStr(msg.pos), color = "aqua"},
|
||||||
|
{text = " in ", color = "white"},
|
||||||
|
{text = msg.dimension, color = "aqua"},
|
||||||
{text = " is recalling to ", color = "white"},
|
{text = " is recalling to ", color = "white"},
|
||||||
{text = vecToStr(msg.to), color = "green"},
|
{text = vecToStr(msg.to), color = "green"},
|
||||||
{text = "!", color = "white"},
|
{text = "!", color = "white"},
|
||||||
})
|
})
|
||||||
|
|
||||||
local id = markerSet(msg)
|
local id = self:prepareMap(msg)
|
||||||
self.cart.addMarkerSet(id, "AutoMiner " .. msg.name)
|
|
||||||
self.cart.clearMarkerSet(id)
|
self.cart.clearMarkerSet(id)
|
||||||
|
|
||||||
self:setPosMarker({
|
self:setPosMarker({
|
||||||
|
@ -7,23 +7,48 @@ function Set(list)
|
|||||||
return set
|
return set
|
||||||
end
|
end
|
||||||
|
|
||||||
function awaitMessage(types, target)
|
MineRemote = {}
|
||||||
|
function MineRemote.new(target)
|
||||||
|
local self = setmetatable({}, { __index = MineRemote })
|
||||||
|
|
||||||
|
self.target = target
|
||||||
|
self:loadDimension()
|
||||||
|
rednet.open("back")
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function MineRemote:loadDimension()
|
||||||
|
local m = peripheral.wrap("back")
|
||||||
|
|
||||||
|
local replyChannel = 666 + os.computerID()
|
||||||
|
m.open(replyChannel)
|
||||||
|
m.transmit(666, replyChannel)
|
||||||
|
|
||||||
|
local event, side, channel, _, reply, distance = os.pullEvent("modem_message")
|
||||||
|
assert(distance)
|
||||||
|
assert(channel == replyChannel)
|
||||||
|
m.close(replyChannel)
|
||||||
|
self.dimension = reply
|
||||||
|
end
|
||||||
|
|
||||||
|
function MineRemote:awaitMessage(types)
|
||||||
while true do
|
while true do
|
||||||
local targetId, msg = rednet.receive(PROTOCOL)
|
local targetId, msg = rednet.receive(PROTOCOL)
|
||||||
if types[msg.type] and msg.name == target then
|
if types[msg.type] and msg.name == self.target and msg.dimension == self.dimension then
|
||||||
return targetId, msg
|
return targetId, msg
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function run(target)
|
function MineRemote:run()
|
||||||
local x, y, z = gps.locate()
|
local x, y, z = gps.locate()
|
||||||
assert(x, "Couldn't run GPS")
|
assert(x, "Couldn't run GPS")
|
||||||
local to = vector.new(math.floor(x), math.floor(y), math.floor(z))
|
local to = vector.new(math.floor(x), math.floor(y), math.floor(z))
|
||||||
print(target .. " will recall to " .. to:tostring())
|
print(self.target .. " will recall to " .. to:tostring())
|
||||||
|
|
||||||
print("Waiting for " .. target .. "...")
|
print("Waiting for " .. self.target .. "...")
|
||||||
local targetId, msg = awaitMessage(Set{"iterationStart", "veinStart"}, target)
|
local targetId, msg = self:awaitMessage(Set{"iterationStart", "veinStart"}, self.target)
|
||||||
assert(targetId)
|
assert(targetId)
|
||||||
|
|
||||||
print("Sending recall request")
|
print("Sending recall request")
|
||||||
@ -32,14 +57,14 @@ function run(target)
|
|||||||
to = to,
|
to = to,
|
||||||
}, PROTOCOL_CTRL)
|
}, PROTOCOL_CTRL)
|
||||||
|
|
||||||
local _, msg = awaitMessage(Set{"ackRecall"}, target)
|
local _, msg = self:awaitMessage(Set{"ackRecall"}, self.target)
|
||||||
assert(msg)
|
assert(msg)
|
||||||
print("Received confirmation of recall from " .. target )
|
print("Received confirmation of recall from " .. self.target )
|
||||||
end
|
end
|
||||||
|
|
||||||
if arg[1] then
|
if arg[1] then
|
||||||
rednet.open("back")
|
local r = MineRemote.new(arg[1])
|
||||||
run(arg[1])
|
r:run()
|
||||||
else
|
else
|
||||||
print("usage: " .. arg[0] .. " <target>")
|
print("usage: " .. arg[0] .. " <target>")
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user