Advertisement
Guest User

Untitled

a guest
Jan 15th, 2013
367
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --[[ Code by NeverCast
  2.      This should be loaded like a typical api
  3.      Feel free to name it what you like
  4. --]]
  5. local directions = { [0]=0,[1]=1,[2]=2,[3]=3,[4]=4,[5]=5,["down"] = 0, ["up"] = 1, ["-Z"] = 2, ["+Z"] = 3, ["-X"] = 4, ["+X"] = 5, ["+Y"] = 1, ["-Y"] = 0}
  6. directions.south = directions["+Z"]
  7. directions.east = directions["+X"]
  8. directions.north = directions["-Z"]
  9. directions.west = directions["-X"]
  10.  
  11. local knownUUIDs = {}
  12. -- Bugged UUIDS
  13. knownUUIDs["27DFD405"] = {55, 0} -- Chest
  14. knownUUIDs["2748D405"] = {280, 0} -- Stick
  15. knownUUIDs["27D9D405"] = {58, 0} -- Crafting Table
  16. knownUUIDs["2F94D404"] = {4256, 1} -- Floppy Disk
  17. knownUUIDs["25A1D405"] = {1226, 0} -- Disk Drive
  18.  
  19. -- Just so i can read it :P
  20. function DEC_HEX(IN)
  21.     local B,K,OUT,I,D=16,"0123456789ABCDEF","",0
  22.     while IN>0 do
  23.         I=I+1
  24.         IN, D= math.floor(IN/B), (IN % B) + 1
  25.         OUT=string.sub(K,D,D)..OUT
  26.     end
  27.     return OUT
  28. end
  29.  
  30. -- Gets the Unique ID based on the ID and Meta
  31. function getID(id, meta)
  32.   if meta == nil then -- If meta doesn't exist, it should equal 0
  33.     meta = 0
  34.   end
  35.   meta = bit.bxor(meta, 0x6E6C) -- encode meta, 0x6E6C = 28268
  36.   local uuid = bit.bxor(id, 0x4F89) * 0x8000 + bit.bxor(meta, 0x3A69) -- encode id, add space for metadata, encode metadata. result: IIIIMMMM where I = id and M = meta
  37.   return uuid
  38. end
  39.  
  40. -- Get a stack table from a single uuid and amount
  41. -- This does all the math to reverse the unique ID algorithm that RG wrote.
  42. -- Valid for version 2.3
  43. function getStack(uuid, c)
  44.         local sUUID = DEC_HEX(uuid)
  45.         local id = 0
  46.         local metadata = 0
  47.         if knownUUIDs[sUUID] ~= nil then -- If ID is logged:
  48.           id = knownUUIDs[sUUID][1]
  49.           metadata = knownUUIDs[sUUID][2]
  50.         else -- If ID is not logged:
  51.           -- Reverse RG's fancy math
  52.           local subt = bit.band(uuid, 0xFFFF) -- get last four digits, meta
  53.           local dexorm = bit.bxor(subt, 0x3A69) -- decode meta; (a xor n) xor n = a, as long as no digits are lost
  54.           metadata = bit.bxor(dexorm, 0x6E6C) -- decode modified id
  55.           id = bit.bxor((uuid-subt)/0x8000, 0x4F89) -- seperate id, divide by 0x8000, then decode
  56.           -- Confirm id
  57.           if uuid ~= getID(id, metadata) then
  58.             print("Decode failed!")
  59.             print("Original: " .. sUUID)
  60.             print("Result: " .. DEC_HEX(getID(id, metadata)))
  61.             print("If this is a mod block/item, it means the " ..
  62.                    "turtle could not find it's ID and/or metadata.")
  63.             error()
  64.           end
  65.           -- put it in to a nice table
  66.           knownUUIDs[sUUID] = {id, metadata}
  67.           print("Logging " .. sUUID .. " as " .. id .. ":" .. metadata)
  68.         end
  69.         local stack = {}
  70.         stack.amount = c
  71.         stack.id = id
  72.         stack.meta = metadata
  73.         return stack
  74. end
  75.  
  76. -- Get stacks from an Interactive Sorter
  77. -- direction   : the direction of the Interactive Sorter Peripheral
  78. -- invDirection: the direction of the inventory from the peripheral
  79. -- valid options for invDirection are 0,1,2,3,4,5 ( original values),
  80. -- north, south, east, west, up, down, and the +/-X,Y,Z strings.
  81. -- (see directions variable)
  82. function getStacks(direction, invDirection)
  83.         if not peripheral.isPresent(direction) then
  84.                 return false, "No Peripheral"
  85.         end
  86.         if peripheral.getType(direction) ~= "interactiveSorter" then
  87.                 return false, "Not a sorter"
  88.         end
  89.         local stacks = {}
  90.         for uuid,count in pairs(peripheral.call(direction, "list", directions[invDirection])) do
  91.                 table.insert(stacks, getStack(uuid, count))
  92.         end
  93.         return true, stacks    
  94. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement