Compare commits
4 Commits
main
...
turtle-cla
Author | SHA1 | Date |
---|---|---|
Jef Roosens | 8a08f15a04 | |
Jef Roosens | eecb3c7646 | |
Jef Roosens | 61b178535a | |
Jef Roosens | d5655734cb |
|
@ -0,0 +1,150 @@
|
|||
-- Created by Jef Roosens
|
||||
|
||||
-- Manages the inventory
|
||||
local Inventory = {
|
||||
selected = nil, -- Currently selected slot
|
||||
slots = nil, -- table containing contents of all slots
|
||||
items = nil, -- table containing items and their slots (fast lookup)
|
||||
free = nil, -- table containing free slots
|
||||
}
|
||||
|
||||
|
||||
function Inventory:new(o)
|
||||
o = o or {}
|
||||
setmetatable(o, self)
|
||||
self.__index = self
|
||||
|
||||
o.selected = selected or turtle.getSelectedSlot()
|
||||
|
||||
-- Update inventory if no data is provided
|
||||
-- Empty tables are also truethy
|
||||
if o.slots == nil or o.items == nil then o:update() end
|
||||
|
||||
return o
|
||||
end
|
||||
|
||||
|
||||
-- Select the given slot if valid
|
||||
--
|
||||
-- @param slot slot to select
|
||||
function Inventory:select(slot)
|
||||
-- Exit if needed
|
||||
if self.selected == slot or slot < 1 or slot > 16 then return end
|
||||
|
||||
turtle.select(slot)
|
||||
self.selected = slot
|
||||
end
|
||||
|
||||
|
||||
-- Transfer items between slots.
|
||||
--
|
||||
-- @param from slot to transfer from
|
||||
-- @param to slot to transfer to
|
||||
-- @param count amount of items to transfer. If count is not specified or count
|
||||
-- is greater than the possible transfer, the maximum transfer will be done.
|
||||
-- @return wether all items were transferred
|
||||
function Inventory:transfer(from, to, count)
|
||||
-- Exit if from is empty
|
||||
if not self.slots[from] then return true end
|
||||
|
||||
count = count or self.slots[from].count
|
||||
local return_value = true
|
||||
|
||||
-- If to isn't empty, check if we can fit it all and if they're the same
|
||||
-- item type
|
||||
if self.slots[to] then
|
||||
-- Exit if it's a differen item type or if there's no space left
|
||||
if self.slots[to].name ~= self.slots[from].name or
|
||||
self.slots[to].count == 64 then return false end
|
||||
|
||||
count = math.min(count, 64 - self.slots[to].count)
|
||||
return_value = count == self.slots[from].count
|
||||
end
|
||||
|
||||
-- Transfer the items
|
||||
self:select(from)
|
||||
turtle.transferTo(to, count)
|
||||
|
||||
self:update()
|
||||
|
||||
return return_value
|
||||
end
|
||||
|
||||
|
||||
-- Scan inventory and store updates
|
||||
function Inventory:update()
|
||||
local slots, items = {}, {}
|
||||
|
||||
for i = 1, 16 do
|
||||
local data = turtle.getItemDetail(i)
|
||||
|
||||
if data then
|
||||
slots[i] = data
|
||||
|
||||
if items[data.name] then
|
||||
table.insert(items[data.name], i)
|
||||
|
||||
else
|
||||
items[data.name] = {i}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self.slots = slots
|
||||
self.items = items
|
||||
end
|
||||
|
||||
|
||||
-- Returns wether or not the inventory contains the given item
|
||||
--
|
||||
-- @param item_name item name to look for
|
||||
-- @return bool wether or not the item is in the inventory
|
||||
function Inventory:has(item_name)
|
||||
return self.items[item_name] ~= nil
|
||||
end
|
||||
|
||||
|
||||
-- Returns wether the requested slot is free
|
||||
--
|
||||
-- @param slot slot to check
|
||||
function Inventory:is_free(slot)
|
||||
return self.slots[slot] == nil
|
||||
end
|
||||
|
||||
|
||||
-- Compact an item in the inventory; this means moving as much of the items to
|
||||
-- as little of the used slots as possible
|
||||
--
|
||||
-- @param item_name item to compact
|
||||
function Inventory:sort_item(item_name)
|
||||
-- atm we assume the item is in the inventory
|
||||
local slots = self.items[item_name]
|
||||
|
||||
local i, j = 1, 2
|
||||
|
||||
while j <= #slots do
|
||||
if self:transfer(slots[j], slots[i]) then
|
||||
j = j + 1
|
||||
|
||||
else
|
||||
i = i + 1
|
||||
j = i + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- Compact the inventory; this means moving all items to the lowest possible
|
||||
-- slots
|
||||
function Inventory:sort()
|
||||
-- Sort all items
|
||||
for item, _ in pairs(self.items) do
|
||||
self:sort_item(item)
|
||||
end
|
||||
|
||||
-- Move them all to lowest slots
|
||||
-- TODO implement this
|
||||
end
|
||||
|
||||
|
||||
return {Inventory=Inventory}
|
|
@ -0,0 +1,37 @@
|
|||
-- Created by Jef Roosens
|
||||
|
||||
-- This base class handles fuel & inventory requirements, but not movement
|
||||
local Turtle = {
|
||||
pos = {x=0, y=0, z=0},
|
||||
dir = 0, -- N, E, S, W
|
||||
inventory = nil,
|
||||
logger = require("jlib.log").Logger:new{level = -1}
|
||||
}
|
||||
|
||||
|
||||
-- Init the turtle
|
||||
--
|
||||
-- @param o turtle object
|
||||
-- @return initialized turtle object
|
||||
function Turtle:new(o)
|
||||
-- Init object
|
||||
o = o or {}
|
||||
setmetatable(o, self)
|
||||
self.__index = self
|
||||
|
||||
-- Get fuel level if not provided
|
||||
o.fuel = o.fuel or turtle.getFuelLevel()
|
||||
|
||||
-- Index inventory if none is provided
|
||||
|
||||
return o
|
||||
end
|
||||
|
||||
|
||||
-- Move the turtle
|
||||
--
|
||||
-- @param dir direction to move to: u, d, f
|
||||
-- @param n amount of blocks to move; defaults to 1
|
||||
|
||||
|
||||
return {Turtle=Turtle}
|
Loading…
Reference in New Issue