View difference between Paste ID: M5AkfTpV and ip9BkExD
SHOW: | | - or go back to the newest paste.
1-
scanner = peripheral.wrap("back")
1+
local scanner = peripheral.wrap("back") 
2-
 
2+
local delay = 3 -- Scanning delay (seconds)
3
4-
term.clear()
4+
-- Target Definitions - choose ONE of these options:
5-
term.setCursorPos(1, 1)
5+
6-
blocks, err = scanner.scan(16)
6+
-- OPTION 1: Single block type
7-
found = false
7+
-- local targetBlock = "minecraft:iron_ore"
8-
 
8+
-- local isMultipleTargets = false
9-
for id, block in pairs(blocks) do
9+
10-
    if block["name"] == "allthemodium:allthemodium_ore" or block["name"] == "allthemodium:allthemodium_slate_ore" then
10+
-- OPTION 2: Multiple block types (finds clusters of ANY of these blocks connected together)
11-
    found = true
11+
local targetBlocks = {
12-
    term.write(block["name"])
12+
    "allthemodium:allthemodium_ore",
13-
    term.write(" at ")
13+
    "allthemodium:allthemodium_slate_ore",
14-
    print(string.format("x:%d z:%d y:%d", block["x"], block["z"], block["y"]))
14+
    "minecraft:ancient_debris"
15
}
16
local isMultipleTargets = true
17-
if not found then
17+
18-
print("Nothing found")
18+
-- Function to check if a block is a target
19
local function isTargetBlock(blockName)
20-
sleep(3)
20+
    if isMultipleTargets then
21-
end
21+
        for _, targetName in pairs(targetBlocks) do
22
            if blockName == targetName then
23
                return true
24
            end
25
        end
26
        return false
27
    else
28
        return blockName == targetBlock
29
    end
30
end
31
32
-- Checks if two blocks are adjacent (including diagonals)
33
local function areConnected(a, b)
34
    local dx, dy, dz = 
35
        math.abs(a.x - b.x),
36
        math.abs(a.y - b.y),
37
        math.abs(a.z - b.z)
38
    return (dx <= 1 and dy <= 1 and dz <= 1)
39
end
40
41
-- Finds clusters of connected blocks
42
local function findClusters(blocks)
43
    local clusters = {}
44
    local visited = {}
45
    
46
    for i, block in pairs(blocks) do
47
        if not visited[i] and isTargetBlock(block.name) then
48
            local cluster = {}
49
            local stack = {block}
50
            visited[i] = true
51
            
52
            while #stack > 0 do
53
                local current = table.remove(stack)
54
                table.insert(cluster, current)
55
                
56
                -- Check neighboring blocks
57
                for j, neighbor in pairs(blocks) do
58
                    if not visited[j] and isTargetBlock(neighbor.name) and areConnected(current, neighbor) then
59
                        visited[j] = true
60
                        table.insert(stack, neighbor)
61
                    end
62
                end
63
            end
64
            
65
            if #cluster >= 2 then
66
                table.insert(clusters, cluster)
67
            end
68
        end
69
    end
70
    
71
    return clusters
72
end
73
74
-- Formats cardinal directions
75
local function getDirectionString(x, y, z)
76
    local dirX = (x > 0) and "EAST" or "WEST"
77
    local dirZ = (z > 0) and "SOUTH" or "NORTH"
78
    local dirY = (y > 0) and "UP" or "DOWN"
79
    
80
    return string.format("%d %s, %d %s, %d %s",
81
        math.abs(x), dirX,
82
        math.abs(z), dirZ,
83
        math.abs(y), dirY
84
    )
85
end
86
87
-- Get display name for current targets
88
local function getTargetDisplayName()
89
    if isMultipleTargets then
90
        if #targetBlocks <= 2 then
91
            -- If just a couple targets, show them all
92
            return table.concat(targetBlocks, " & ")
93
        else
94
            -- If many targets, show count
95
            return #targetBlocks .. " different ores"
96
        end
97
    else
98
        return targetBlock
99
    end
100
end
101
102
-- Main loop
103
while true do
104
    term.clear()
105
    term.setCursorPos(1, 1)
106
    
107
    -- Display target block info
108
    term.setTextColor(colors.yellow)
109
    print("SCANNING FOR: ")
110
    term.setTextColor(colors.lime)
111
    print(getTargetDisplayName())
112
    
113
    -- Countdown
114
    term.setTextColor(colors.orange)
115
    print("\nScanning in...")
116
    for i = delay, 1, -1 do
117
        term.setTextColor(i % 2 == 0 and colors.red or colors.yellow)
118
        term.write(tostring(i) .. (i > 1 and "... " or ""))
119
        sleep(1)
120
    end
121
    
122
    -- Scan and detect clusters
123
    local blocks = scanner.scan(16)
124
    if not blocks then
125
        term.setTextColor(colors.red)
126
        print("Scanner error!")
127
        sleep(delay)
128
        goto continue
129
    end
130
    
131
    local clusters = findClusters(blocks)
132
    
133
    -- Display results
134
    if #clusters > 0 then
135
        term.setTextColor(colors.green)
136
        print(string.format("\nFound %d cluster(s)!", #clusters))
137
        for i, cluster in ipairs(clusters) do
138
            -- Pick the first block to navigate to
139
            local target = cluster[1]
140
            term.setTextColor(colors.cyan)
141
            print("\n[Cluster " .. i .. " - " .. #cluster .. " blocks]")
142
            term.setTextColor(colors.lightBlue)
143
            print("Block type: " .. target.name)
144
            print("Navigate to:")
145
            term.setTextColor(colors.white)
146
            print(getDirectionString(target.x, target.y, target.z))
147
        end
148
    else
149
        term.setTextColor(colors.red)
150
        print("\nNo clusters found.")
151
    end
152
    
153
    term.setTextColor(colors.gray)
154
    print("\nRescanning...")
155
    sleep(delay)
156
    
157
    ::continue::
158
end
159