56 lines
1.8 KiB
Lua
56 lines
1.8 KiB
Lua
local function findSensor()
|
|
for _, side in ipairs({"left", "right"}) do
|
|
if peripheral.getType(side) == "turtlesensorenvironment" then
|
|
return side
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function new()
|
|
return {
|
|
priority = 10,
|
|
isAvailable = function()
|
|
return findSensor() and true
|
|
end,
|
|
execute = function(currentPosition, updateSessionMap, updateServerMap)
|
|
local rawBlockInfo = peripheral.call(findSensor(), "sonicScan")
|
|
local sortedBlockInfo = aStar.newMap()
|
|
for _, blockInfo in ipairs(rawBlockInfo) do
|
|
sortedBlockInfo:set(currPos + vector.new(blockInfo.x, blockInfo.y, blockInfo.z), blockInfo)
|
|
end
|
|
local toCheckQueue = {}
|
|
for _, pos in ipairs(aStar.adjacent(currPos)) do
|
|
if sortedBlockInfo:get(pos) then
|
|
table.insert(toCheckQueue, pos)
|
|
end
|
|
end
|
|
while toCheckQueue[1] do
|
|
local pos = table.remove(toCheckQueue, 1)
|
|
local blockInfo = sortedBlockInfo:get(pos)
|
|
if blockInfo.type == "AIR" then
|
|
for _, pos2 in ipairs(aStar.adjacent(pos)) do
|
|
local blockInfo2 = sortedBlockInfo:get(pos2)
|
|
if blockInfo2 and not blockInfo2.checked then
|
|
table.insert(toCheckQueue, pos2)
|
|
end
|
|
end
|
|
updateSessionMap(pos, false)
|
|
updateServerMap(pos, false)
|
|
else
|
|
updateSessionMap(pos, true)
|
|
updateServerMap(pos, true)
|
|
end
|
|
blockInfo.checked = true
|
|
end
|
|
for _, blockInfo in ipairs(rawBlockInfo) do
|
|
local pos = currPos + vector.new(blockInfo.x, blockInfo.y, blockInfo.z)
|
|
local blockInfo = sortedBlockInfo:get(pos)
|
|
if not blockInfo.checked then
|
|
updateSessionMap(pos, blockInfo.type ~= "AIR")
|
|
end
|
|
end
|
|
end,
|
|
}
|
|
end
|