View difference between Paste ID: qUjna46M and d4ugSj2p
SHOW: | | - or go back to the newest paste.
1-
-- enchantTurtle.lua
1+
-- enchantSorter.lua
2
-- Sorts items from an input chest into three outputs and logs to a monitor.
3-
-- Wrap the input chest in front
3+
4-
local frontChest = peripheral.wrap("front")
4+
-----------------------------------------------------------
5-
if not frontChest then
5+
-- ░█  CONFIG
6-
  error("❌ No chest detected in front of the turtle")
6+
-----------------------------------------------------------
7
local INPUT_CHEST     = "minecraft:chest_25"
8
local ENCHANTED_CHEST = "minecraft:chest_29"
9-
-- Helper to test if the chest is empty
9+
local NORMAL_CHEST    = "minecraft:chest_30"
10-
local function isChestEmpty(chest)
10+
local OVERFLOW_CHEST  = "minecraft:chest_31"
11-
  -- chest.list() returns a sparse table of slots → items
11+
local MONITOR_NAME    = "monitor_4"      -- wrapped below
12-
  return next(chest.list()) == nil
12+
13
-----------------------------------------------------------
14
-- ░█  WRAP PERIPHERALS
15-
-- Main sorting loop
15+
-----------------------------------------------------------
16-
while not isChestEmpty(frontChest) do
16+
local inputChest = peripheral.wrap(INPUT_CHEST)
17-
  -- Always work in turtle slot 1
17+
local monitor    = peripheral.wrap(MONITOR_NAME)
18-
  turtle.select(1)
18+
19-
  -- Grab exactly one item from the chest in front
19+
if not inputChest then error("Input chest not found: "..INPUT_CHEST) end
20-
  -- (succeeds only if there was at least one)
20+
if not monitor   then error("Monitor not found: "..MONITOR_NAME) end
21-
  if not turtle.suck(1) then
21+
22-
    -- nothing left?
22+
-----------------------------------------------------------
23-
    break
23+
-- ░█  MONITOR INITIALISATION
24
-----------------------------------------------------------
25
monitor.setTextScale(0.5)            -- 1 = readable but roomy  :contentReference[oaicite:0]{index=0}
26-
  -- Inspect what we just pulled
26+
monitor.setBackgroundColor(colors.black)
27-
  local tDetail = turtle.getItemDetail(1)
27+
monitor.setTextColor(colors.white)
28-
  if tDetail and tDetail.enchantments and #tDetail.enchantments > 0 then
28+
monitor.clear()
29-
    -- Enchanted → drop up
29+
monitor.setCursorPos(1,1)
30-
    if not turtle.dropUp() then
30+
31-
      error("Could not drop enchanted item above!")
31+
local monW, monH = monitor.getSize()    -- width/height of the monitor  :contentReference[oaicite:1]{index=1}
32
local line = 1                          -- current cursor Y on the monitor
33-
    print(("🔼 Enchanted: %s ×1"):format(tDetail.name))
33+
34-
  else
34+
local function log(msg)
35-
    -- Unenchanted → drop down
35+
  -- print to computer terminal
36-
    if not turtle.dropDown() then
36+
  print(msg)
37-
      error("Could not drop normal item below!")
37+
38
  -- print to monitor, scrolling when needed
39-
    print(("🔽 Normal:    %s ×1"):format(tDetail and tDetail.name or "<unknown>"))
39+
  monitor.setCursorPos(1, line)
40
  monitor.clearLine()
41
  monitor.write(msg)
42
  line = line + 1
43-
print("✅ All items sorted.")
43+
  if line > monH then
44
    monitor.scroll(1)                   -- scroll display up one line  :contentReference[oaicite:2]{index=2}
45
    line = monH
46
  end
47
end
48
49
-----------------------------------------------------------
50
-- ░█  HELPER FUNCTIONS
51
-----------------------------------------------------------
52
local chestLabels = {
53
  [ENCHANTED_CHEST] = "Enchanted Chest",
54
  [NORMAL_CHEST]    = "Normal Chest",
55
  [OVERFLOW_CHEST]  = "Overflow Chest",
56
}
57
58
local function moveStack(fromChest, slot, destName, itemDetail)
59
  local moved = fromChest.pushItems(destName, slot)  -- move whole stack  :contentReference[oaicite:3]{index=3}
60
  log(string.format(
61
    "Moved %-3d %-30s -> %s",
62
    moved, itemDetail.displayName, chestLabels[destName] or destName
63
  ))
64
end
65
66
local function isStackable(item)      -- multi-stack items go to overflow
67
  return item.maxCount and item.maxCount > 1
68
end
69
70
local function isEnchanted(item)
71
  return item.enchantments and #item.enchantments > 0
72
end
73
74
-----------------------------------------------------------
75
-- ░█  MAIN SORT LOOP
76
-----------------------------------------------------------
77
local function sortOnce()
78
  local totalSlots = inputChest.size()                           -- :contentReference[oaicite:4]{index=4}
79
  for slot = 1, totalSlots do
80
    local detail = inputChest.getItemDetail(slot)
81
    if detail then
82
      if isStackable(detail) then
83
        moveStack(inputChest, slot, OVERFLOW_CHEST, detail)
84
      else
85
        if isEnchanted(detail) then
86
          moveStack(inputChest, slot, ENCHANTED_CHEST, detail)
87
        else
88
          moveStack(inputChest, slot, NORMAL_CHEST, detail)
89
        end
90
      end
91
    end
92
  end
93
end
94
95
-----------------------------------------------------------
96
-- ░█  CONTINUOUS RUN
97
-----------------------------------------------------------
98
log("=== enchantSorter started ===")
99
while true do
100
  sortOnce()
101
  os.sleep(5)
102
end