Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local me = peripheral.find("meBridge")
- 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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement