Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Turtle = Class.new();
- function Turtle.new.default()
- local self = setmetatable({}, Turtle);
- self.eventListeners = {};
- return self;
- end
- function Turtle.new.number.number.number.number(x, y, z, f)
- local self = Turtle()
- self.x, self.y, self.z, self.f = x, y, z, f
- return self
- end
- local function _turn(object, hand, n)
- for i = 1, n do
- turtle["turn" .. hand]();
- object:notify("turned", hand:lower(), i - 1);
- end
- end
- local function _move(object, move, n, dig, attack)
- for i = n, 1, -1 do
- while not turtle[move]() do
- if not dig(object) then
- if not attack(object) then return i - 1 end
- end
- end
- object:notify("moved", move, i - 1);
- end
- end
- local function _dig(detect, dig)
- while detect() do
- dig()
- if not (dig == turtle.digDown) then
- sleep(0.5)
- end
- end
- end
- function Turtle:forward(n)
- _move(self, "forward", n or 1, turtle.dig, turtle.detect, turtle.attack);
- end
- function Turtle:up(n)
- _move(self, "up", n or 1, turtle.digUp, turtle.detectUp, turtle.attackUp);
- end
- function Turtle:down(n)
- _move(self, "down", n or 1, turtle.digDown, turtle.detectDown, turtle.attackDown);
- end
- function Turtle:right(n)
- _turn(self, "Right", n or 1);
- end
- function Turtle:left(n)
- _turn(self, "Left", n or 1);
- end
- local function _dig_back(object)
- _turn(object, "Right", 2);
- local success = turtle.dig()
- _turn(object, "Right", 2);
- return success
- end
- local function _attack_back()
- _turn("Right", 2);
- return turtle.attack()
- end
- function Turtle:dig()
- _dig(turtle.detect, turtle.dig);
- end
- function Turtle:digUp()
- _dig(turtle.detectUp, turtle.digUp);
- end
- function Turtle:digDown()
- _dig(turtle.detectDown, turtle.digDown);
- end
- function Turtle:_suck()
- if turtle.suck() or turtle.suckDown() or turtle.suckUp() then
- self:notify("inventoryChanged");
- end
- end
- function Turtle:back(n)
- _move(self, "back", n or 1, _dig_back, _attack_back)
- end
- function Turtle:addEventListener(event, listener)
- if not self.eventListeners[event] then
- self.eventListeners[event] = {};
- end
- table.insert(self.eventListeners[event], listener);
- end
- function Turtle:removeLastListener(event)
- table.remove(self.eventListeners[event], #self.eventListeners[event] - 1);
- end
- function Turtle:notify(event, ...)
- if (self.eventListeners[event]) then
- for _, v in pairs(self.eventListeners[event]) do
- v(...);
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement