local me = peripheral.find("me_bridge") local trashPeripheral = "minecraft:chest_0" local check_interval = 20 local running = true print(textutils.formatTime(os.time())..": Spell management system started. Checking every " .. check_interval .. " seconds.") local function trim(string) return string:gsub("^%s*(.-)%s*$", "%1") end local function formatScrollName(name, level) name = trim(name:gsub("%[", ""):gsub("Scroll]", "")) return string.format("%s (Level %s)", name, level) end -- Function to clean up spells in the ME system local function cleanSpells() local spells = {} local items = me.getItems() local itemsToTrash = {} -- Scan all items and track highest level per spell ID for _, item in ipairs(items) do if item.name == "irons_spellbooks:scroll" then local nbt = item.components["irons_spellbooks:spell_container"].data -- Since there's only one spell per scroll, take the first (and only) entry local data = nbt[1] if data then local id = data.id local level = data.level if not spells[id] or spells[id].highest < level then spells[id] = {highest = level} end -- Mark for potential trashing if not the highest table.insert(itemsToTrash, {item = item, id = id, level = level}) end end end -- Now, trash items that are not the highest level for their spell ID for _, trashData in ipairs(itemsToTrash) do local spell = spells[trashData.id] if trashData.level < spell.highest then print(textutils.formatTime(os.time())..": Removing spell: " .. formatScrollName(trashData.item.displayName, trashData.level .. "/" .. spell.highest)) me.exportItem(trashData.item, trashPeripheral) end end end -- Function to handle termination local function handleTermination() running = false print(textutils.formatTime(os.time())..": Shutting down spell management system...") end -- Check for ME bridge if not me then error("ME Bridge peripheral not found!") end -- Initial cleanup print(textutils.formatTime(os.time())..": Performing initial spell cleanup...") local success, err = pcall(cleanSpells) if not success then print(textutils.formatTime(os.time())..": Initial error in cleanSpells: " .. tostring(err)) end -- The main loop: wait for timer or termination while running do local timer = os.startTimer(check_interval) local event = os.pullEvent() if event == "timer" then local success, err = pcall(cleanSpells) if not success then print(textutils.formatTime(os.time())..": Error in cleanSpells: " .. tostring(err)) end elseif event == "terminate" then handleTermination() break end end