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.listItems() -- Get the items in the ME system for _, item in ipairs(items) do -- Use _ instead of i since i is unused, use item directly -- Check if the item is a spell scroll if item.name == "irons_spellbooks:scroll" then local nbt = item.components["irons_spellbooks:spell_container"].data -- Get the spell data from the NBT for _, data in ipairs(nbt) do local id = data.id local level = data.level local count = item.count -- If the spell is not in the list, add it if spells[id] == nil then spells[id] = { highest = level, highest_count = count, list = {} } end -- Check if the spell is a higher level, if so, update the highest level if spells[id].highest < level then spells[id].highest = level spells[id].highest_count = count end -- Catalogue the spell table.insert(spells[id].list, {item = item, id = id, level = level, count = count}) end end end -- Go through the spells and only keep the spells that are either the highest level or 1 below the highest level for id, spell in pairs(spells) do local keep_level = spell.highest local amount_of_highest_level = spell.highest_count -- Calculate the threshold level to keep local threshold = amount_of_highest_level <= 1 and keep_level - 1 or keep_level -- Process lower level spells for removal for _, data in ipairs(spell.list) do if data.level < threshold then print(textutils.formatTime(os.time())..": Removing spell: " .. formatScrollName(data.item.displayName, data.level.."/"..spell.highest)) me.exportItemToPeripheral(data.item, trashPeripheral) end end end end -- Function to handle termination local function handleTermination() running = false print(textutils.formatTime(os.time())..": Shutting down spell management system...") end -- Register termination handler os.pullEvent = os.pullEventRaw -- Prevent terminate event from being blocked -- The main loop while running do local success, error = pcall(cleanSpells) if not success then print(textutils.formatTime(os.time())..": Error in cleanSpells: " .. tostring(error)) end -- Check for terminate event local timer = os.startTimer(check_interval) local event, param = os.pullEvent() if event == "terminate" then handleTermination() end end