Advertisement
melzneni

TurtiLib toggle item

Aug 18th, 2023 (edited)
410
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.45 KB | None | 0 0
  1. local storage
  2. local save
  3. local selected
  4.  
  5. local ID_ITEM_PICKAXE = "minecraft:diamond_pickaxe"
  6. local ID_ITEM_ENDER_MODEM = "computercraft:wireless_modem_advanced"
  7.  
  8. local api = {}
  9.  
  10. local function getItemName(id)
  11. local name = turtle.getItemDetail(id)
  12. if name == nil then
  13. return nil
  14. end
  15. return name.name
  16. end
  17.  
  18. local toggleItemSwitchToPickaxeHook = function()
  19. local slot = storage.slot
  20. ThreadManager.blockExecutionOfOtherThreads()
  21. if slot ~= nil and getItemName(slot + 1) == ID_ITEM_PICKAXE then
  22. local selectedSlot = turtle.getSelectedSlot()
  23. turtle.select(slot + 1)
  24. if storage.side == "right" then
  25. turtle.equipRight()
  26. else
  27. turtle.equipLeft()
  28. end
  29. printDebug("switched to pickaxe", getItemName(slot + 1))
  30. turtle.select(selectedSlot)
  31. end
  32. ThreadManager.unblockExecutionOfOtherThreads()
  33. end
  34.  
  35. local toggleItemSwitchToModemHook = function()
  36. local slot = storage.slot
  37. ThreadManager.blockExecutionOfOtherThreads()
  38. if slot ~= nil and getItemName(slot + 1) == ID_ITEM_ENDER_MODEM then
  39. local selectedSlot = turtle.getSelectedSlot()
  40. turtle.select(slot + 1)
  41. if storage.side == "right" then
  42. turtle.equipRight()
  43. else
  44. turtle.equipLeft()
  45. end
  46. printDebug("switched to modem", getItemName(slot + 1))
  47. turtle.select(selectedSlot)
  48. end
  49. ThreadManager.unblockExecutionOfOtherThreads()
  50. end
  51.  
  52. installPreExecutionHook(turtle, "dig", "lib:toggleItem", toggleItemSwitchToPickaxeHook)
  53. installPreExecutionHook(turtle, "digUp", "lib:toggleItem", toggleItemSwitchToPickaxeHook)
  54. installPreExecutionHook(turtle, "digDown", "lib:toggleItem", toggleItemSwitchToPickaxeHook)
  55. installPreExecutionHook(rednet, "open", "lib:toggleItem", toggleItemSwitchToModemHook)
  56. installPreExecutionHook(rednet, "isOpen", "lib:toggleItem", toggleItemSwitchToModemHook)
  57. installPreExecutionHook(rednet, "receive", "lib:toggleItem", toggleItemSwitchToModemHook)
  58. installPreExecutionHook(rednet, "send", "lib:toggleItem", toggleItemSwitchToModemHook)
  59. installPreExecutionHook(rednet, "broadcast", "lib:toggleItem", toggleItemSwitchToModemHook)
  60. installPreExecutionHook(peripheral, "find", "lib:toggleItem", toggleItemSwitchToModemHook)
  61.  
  62. installPreExecutionHook(gps, "locate", "lib:toggleItem", toggleItemSwitchToModemHook)
  63.  
  64. function api.configureItemSwitch(slot, side, idTool, idModem)
  65. if not idTool then
  66. idTool = ID_ITEM_PICKAXE
  67. end
  68. if not idModem then
  69. idModem = ID_ITEM_ENDER_MODEM
  70. end
  71. if side ~= "left" and side ~= "right" then
  72. error("invalid side, must be either 'left' or 'right'")
  73. end
  74. if storage.slot then
  75. invokeHook("unprotectSlot", storage.slot, "lib:toggleItem")
  76. end
  77. invokeHook("protectSlot", slot, "lib:toggleItem")
  78. storage.slot = slot
  79. storage.side = side
  80. storage.idTool = idTool
  81. storage.idModem = idModem
  82. save()
  83. end
  84.  
  85. function api.getItemSwitchSlot()
  86. return storage.slot
  87. end
  88.  
  89. function api.getItemSwitchSide()
  90. return storage.side
  91. end
  92.  
  93. function api.getIdTool()
  94. return storage.idTool
  95. end
  96.  
  97. function api.getIdModem()
  98. return storage.idModem
  99. end
  100.  
  101. return {
  102. name = 'toggleItem',
  103. api = api,
  104. onInitStorage = function(_storage, _save)
  105. storage = _storage
  106. save = _save
  107. end,
  108. dependencies = {
  109. '7q32mZDG' -- protect slot
  110. }
  111. }
  112.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement