Advertisement
GnoX

Turtle

Jul 14th, 2014
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.61 KB | None | 0 0
  1. Turtle = Class.new();
  2.  
  3. function Turtle.new.default()
  4.     local self = setmetatable({}, Turtle);
  5.     self.eventListeners = {};
  6.  
  7.     return self;
  8. end
  9.  
  10. function Turtle.new.number.number.number.number(x, y, z, f)
  11.     local self = Turtle()
  12.     self.x, self.y, self.z, self.f = x, y, z, f
  13.     return self
  14. end
  15.  
  16. local function _turn(object, hand, n)
  17.     for i = 1, n do
  18.         turtle["turn" .. hand]();
  19.         object:notify("turned", hand:lower(), i - 1);
  20.     end
  21. end
  22.  
  23. local function _move(object, move, n, dig, attack)
  24.     for i = n, 1, -1 do
  25.         while not turtle[move]() do
  26.             if not dig(object) then
  27.                 if not attack(object) then return i - 1 end
  28.             end
  29.         end
  30.         object:notify("moved", move, i - 1);
  31.     end
  32. end
  33.  
  34. local function _dig(detect, dig)
  35.     while detect() do
  36.         dig()
  37.         if not (dig == turtle.digDown) then
  38.             sleep(0.5)
  39.         end
  40.     end
  41. end
  42.  
  43. function Turtle:forward(n)
  44.     _move(self, "forward", n or 1, turtle.dig, turtle.detect, turtle.attack);
  45. end
  46.  
  47. function Turtle:up(n)
  48.     _move(self, "up", n or 1, turtle.digUp, turtle.detectUp, turtle.attackUp);
  49. end
  50.  
  51. function Turtle:down(n)
  52.     _move(self, "down", n or 1, turtle.digDown, turtle.detectDown, turtle.attackDown);
  53. end
  54.  
  55. function Turtle:right(n)
  56.     _turn(self, "Right", n or 1);
  57. end
  58.  
  59. function Turtle:left(n)
  60.     _turn(self, "Left", n or 1);
  61. end
  62.  
  63. local function _dig_back(object)
  64.     _turn(object, "Right", 2);
  65.     local success = turtle.dig()
  66.     _turn(object, "Right", 2);
  67.     return success
  68. end
  69.  
  70. local function _attack_back()
  71.     _turn("Right", 2);
  72.     return turtle.attack()
  73. end
  74.  
  75. function Turtle:dig()
  76.     _dig(turtle.detect, turtle.dig);
  77. end
  78.  
  79. function Turtle:digUp()
  80.     _dig(turtle.detectUp, turtle.digUp);
  81. end
  82.  
  83. function Turtle:digDown()
  84.     _dig(turtle.detectDown, turtle.digDown);
  85. end
  86.  
  87. function Turtle:_suck()
  88.     if turtle.suck() or turtle.suckDown() or turtle.suckUp() then
  89.         self:notify("inventoryChanged");
  90.     end
  91. end
  92.  
  93. function Turtle:back(n)
  94.     _move(self, "back", n or 1, _dig_back, _attack_back)
  95. end
  96.  
  97. function Turtle:addEventListener(event, listener)
  98.     if not self.eventListeners[event] then
  99.         self.eventListeners[event] = {};
  100.     end
  101.  
  102.     table.insert(self.eventListeners[event], listener);
  103. end
  104.  
  105. function Turtle:removeLastListener(event)
  106.     table.remove(self.eventListeners[event], #self.eventListeners[event] - 1);
  107. end
  108.  
  109. function Turtle:notify(event, ...)
  110.     if (self.eventListeners[event]) then
  111.         for _, v in pairs(self.eventListeners[event]) do
  112.             v(...);
  113.         end
  114.     end
  115. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement