meigrafd

CraftOS: Auto-detect peripherals and cache wrappers

Jan 18th, 2026
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.70 KB | None | 0 0
  1. -- Auto-detect peripherals and cache wrappers
  2. -- Works in CC:Tweaked / CraftOS
  3.  
  4. local function detectPeripherals()
  5.     local names = peripheral.getNames()
  6.  
  7.     local byName = {}     -- byName["left"] = { name="left", type="monitor", methods=..., p=wrapper }
  8.     local byType = {}     -- byType["monitor"] = { entry1, entry2, ... }
  9.  
  10.     for i = 1, #names do
  11.         local name = names[i]
  12.         local pType = peripheral.getType(name) or "unknown"
  13.         local methods = peripheral.getMethods(name) or {}
  14.  
  15.         local entry = {
  16.             name = name,
  17.             type = pType,
  18.             methods = methods,
  19.             p = peripheral.wrap(name)
  20.         }
  21.  
  22.         byName[name] = entry
  23.  
  24.         if not byType[pType] then
  25.             byType[pType] = {}
  26.         end
  27.         byType[pType][#byType[pType] + 1] = entry
  28.     end
  29.  
  30.     return {
  31.         byName = byName,
  32.         byType = byType
  33.     }
  34. end
  35.  
  36. local function pickOne(cache, pType, preferredName)
  37.     if preferredName and cache.byName[preferredName] and cache.byName[preferredName].type == pType then
  38.         return cache.byName[preferredName].p, cache.byName[preferredName]
  39.     end
  40.  
  41.     local list = cache.byType[pType]
  42.     if list and #list > 0 then
  43.         return list[1].p, list[1]
  44.     end
  45.  
  46.     return nil, nil
  47. end
  48.  
  49. -- Example usage:
  50. local cache = detectPeripherals()
  51.  
  52. local monitor, monInfo = pickOne(cache, "monitor", "top")
  53. if monitor then
  54.     monitor.setTextScale(0.5)
  55.     monitor.clear()
  56.     monitor.setCursorPos(1, 1)
  57.     monitor.write("Monitor: " .. monInfo.name)
  58. end
  59.  
  60. local modem, modemInfo = pickOne(cache, "modem")
  61. if modem then
  62.     -- example: open a channel if wireless modem etc.
  63.     -- modem.open(123)
  64. end
  65.  
Advertisement
Add Comment
Please, Sign In to add comment