2022-12-17 15:15:34 +00:00
|
|
|
--[[
|
|
|
|
Itemscript - A simplified set of methods for item manipulation.
|
|
|
|
|
|
|
|
Author: Andrew Lalis <andrewlalisofficial@gmail.com>
|
|
|
|
|
|
|
|
|
|
|
|
]]--
|
2022-12-17 15:35:11 +00:00
|
|
|
VERSION = "0.0.1"
|
|
|
|
|
2022-12-17 15:15:34 +00:00
|
|
|
local t = turtle
|
|
|
|
|
|
|
|
-- The itemscript module. Functions defined within this table are exported.
|
|
|
|
local itemscript = {}
|
|
|
|
|
2022-12-21 11:27:05 +00:00
|
|
|
-- Determines if an item stack matches the given name.
|
|
|
|
-- If fuzzy, then the item name will be matched against the given name.
|
|
|
|
local function stackMatches(itemStack, name, fuzzy)
|
2022-12-17 15:15:34 +00:00
|
|
|
return itemStack ~= nil and
|
|
|
|
(
|
|
|
|
(not fuzzy and itemStack.name == name) or
|
|
|
|
string.find(itemStack.name, name)
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2022-12-21 11:27:05 +00:00
|
|
|
--[[
|
|
|
|
The following describes an item filter:
|
|
|
|
A table containing a filter mechanism.
|
|
|
|
{
|
|
|
|
filterFunction = stackMatches,
|
|
|
|
fuzzy = false,
|
|
|
|
whitelist = true
|
|
|
|
}
|
|
|
|
The filterFunction is defined like so:
|
|
|
|
function filterFunction(item, filter)
|
|
|
|
return true | false
|
|
|
|
end
|
|
|
|
]]--
|
|
|
|
|
2022-12-21 11:33:19 +00:00
|
|
|
function itemscript.makeFilter(var, fuzzy, whitelist)
|
2022-12-21 11:27:05 +00:00
|
|
|
local filter = {
|
|
|
|
filterFunction = nil,
|
|
|
|
fuzzy = fuzzy or false,
|
|
|
|
whitelist = whitelist
|
|
|
|
}
|
|
|
|
if type(var) == "string" then
|
|
|
|
-- If the filter is a single item name, define a single-item filter that matches against the name.
|
|
|
|
filter.filterFunction = function (item, filter)
|
|
|
|
local matches = stackMatches(item, var, filter.fuzzy)
|
|
|
|
if filter.whitelist then
|
|
|
|
return matches
|
|
|
|
else
|
|
|
|
return not matches
|
|
|
|
end
|
|
|
|
end
|
|
|
|
elseif type(var) == "table" then
|
|
|
|
-- If the filter is a list of item names, define a multi-item filter.
|
|
|
|
filter.filterFunction = function (item, filter)
|
|
|
|
for _, itemName in pairs(var) do
|
|
|
|
if filter.whitelist and stackMatches(item, itemName, filter.fuzzy) then
|
|
|
|
return true
|
|
|
|
elseif not filter.whitelist and not stackMatches(item, itemName, filter.fuzzy) then
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
-- If whitelist and we couldn't find a match, return false.
|
|
|
|
-- If blacklist and we couldn't find a non-match, return true.
|
|
|
|
return not filter.whitelist
|
|
|
|
end
|
|
|
|
elseif type(var) == "function" then
|
|
|
|
-- Otherwise, just use the provided filter.
|
|
|
|
filter.filterFunction = var
|
|
|
|
end
|
|
|
|
filter.apply = function(item)
|
|
|
|
return filter.filterFunction(item, filter)
|
|
|
|
end
|
|
|
|
return filter
|
|
|
|
end
|
|
|
|
|
2022-12-17 15:15:34 +00:00
|
|
|
-- Gets the total number of items of a certain type in the turtle's inventory.
|
2022-12-21 11:27:05 +00:00
|
|
|
function itemscript.totalCount(filter)
|
2022-12-17 15:15:34 +00:00
|
|
|
local count = 0
|
|
|
|
for i = 1, 16 do
|
|
|
|
local item = t.getItemDetail(i)
|
2022-12-21 11:27:05 +00:00
|
|
|
if filter.apply(item) then
|
2022-12-17 15:15:34 +00:00
|
|
|
count = count + item.count
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return count
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Selects a slot containing at least one of the given item type.
|
|
|
|
-- Returns a boolean indicating whether we could find and select the item.
|
2022-12-21 11:27:05 +00:00
|
|
|
function itemscript.select(filter)
|
2022-12-17 15:15:34 +00:00
|
|
|
for i = 1, 16 do
|
|
|
|
local item = t.getItemDetail(i)
|
2022-12-21 11:27:05 +00:00
|
|
|
if filter.apply(item) then
|
2022-12-17 15:15:34 +00:00
|
|
|
t.select(i)
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
2022-12-21 11:27:05 +00:00
|
|
|
-- Helper function to drop items in a flexible way, using a drop function and filtering function.
|
|
|
|
local function dropFiltered(dropFunction, filter)
|
2022-12-17 15:15:34 +00:00
|
|
|
for i = 1, 16 do
|
|
|
|
local item = t.getItemDetail(i)
|
2022-12-21 11:27:05 +00:00
|
|
|
if filter.apply(item) then
|
2022-12-17 15:15:34 +00:00
|
|
|
t.select(i)
|
|
|
|
dropFunction()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-12-21 11:27:05 +00:00
|
|
|
function itemscript.dropAll(filter)
|
|
|
|
dropFiltered(t.drop, filter)
|
2022-12-17 15:15:34 +00:00
|
|
|
end
|
|
|
|
|
2022-12-21 11:27:05 +00:00
|
|
|
function itemscript.dropAllDown(filter)
|
|
|
|
dropFiltered(t.dropDown, filter)
|
2022-12-17 20:46:14 +00:00
|
|
|
end
|
|
|
|
|
2022-12-21 11:27:05 +00:00
|
|
|
function itemscript.dropAllUp(filter)
|
|
|
|
dropFiltered(t.dropUp, filter)
|
2022-12-17 15:15:34 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
-- Cleans up the turtle's inventory by compacting all stacks of items.
|
|
|
|
function itemscript.organize()
|
|
|
|
error("Not yet implemented.")
|
|
|
|
end
|
|
|
|
|
|
|
|
return itemscript
|