Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update metadata, itemstack and add compare_block_status #63

Merged
merged 8 commits into from
Dec 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 48 additions & 19 deletions itemstack.lua
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ local ItemStack = {}
--* `is_empty()`: returns `true` if stack is empty.
function ItemStack:is_empty() return self._count < 1 end
--* `get_name()`: returns item name (e.g. `"default:stone"`).
function ItemStack:get_name() return self._name end
function ItemStack:get_name() return self._count > 0 and self._name or "" end
--* `set_name(item_name)`: returns a boolean indicating whether the item was cleared.
function ItemStack:set_name(item_name)
assert.is_string(item_name, "ItemStack:set_name expected item_name to be string")
Expand Down Expand Up @@ -67,7 +67,11 @@ function ItemStack:clear() self._count = 0 end
--* `replace(item)`: replace the contents of this stack.
-- `item` can also be an itemstring or table.
function ItemStack:replace(item)
error("NOT IMPLEMENTED")
local stack = mineunit.utils.type(item) == "ItemStack" and item or ItemStack(item)
self._name = stack._name
self._count = stack._count
self._wear = stack._wear
self._meta = stack._meta
end
--* `to_string()`: returns the stack in itemstring form.
-- https://github.com/minetest/minetest/blob/5.4.0/src/inventory.cpp#L59-L85
Expand All @@ -81,13 +85,15 @@ function ItemStack:to_string()
end
--* `to_table()`: returns the stack in Lua table form.
function ItemStack:to_table()
-- FIXME: Format is probably wrong, missing something or has too much something. Check actual spec and fix.
return {
name = self:get_name(),
count = self:get_count(),
wear = self:get_wear(),
meta = self:get_meta():to_table(),
}
-- NOTE: `metadata` field is not and probably will not be here, engine does add it but it seems to be legacy thing.
if self:get_count() > 0 then
return {
name = self:get_name(),
count = self:get_count(),
wear = self:get_wear(),
meta = self:get_meta():to_table().fields,
}
end
end
--* `get_stack_max()`: returns the maximum size of the stack (depends on the item).
function ItemStack:get_stack_max()
Expand All @@ -99,11 +105,11 @@ function ItemStack:get_free_space()
end
--* `is_known()`: returns `true` if the item name refers to a defined item type.
function ItemStack:is_known()
return not not minetest.registered_items[self._name]
return not not core.registered_items[self._name]
end
--* `get_definition()`: returns the item definition table.
function ItemStack:get_definition()
return minetest.registered_items[self._name] or minetest.registered_items.unknown
return core.registered_items[self._name] or core.registered_items.unknown
end
--* `get_tool_capabilities()`: returns the digging properties of the item,
-- or those of the hand if none are defined for this item type.
Expand All @@ -119,17 +125,28 @@ end
--* `add_item(item)`: returns leftover `ItemStack`
-- Put some item or stack onto this stack
function ItemStack:add_item(item)
local stack_max = self:get_stack_max()
local stack = ItemStack(item)
local leftover = ItemStack(item)
if item:is_empty() then
return leftover
end
if self:is_empty() then
self:replace(leftover)
leftover:set_count(0)
return leftover
end

local stack_max = item:get_stack_max()
local count = self:get_count()
local space = stack_max - count
if stack:get_count() > space then
self:set_count(stack_max)
leftover:set_count(stack:get_count() - space)
else
self:set_count(count + stack:get_count())
leftover:set_count(0)
if space > 0 and self:get_name() == leftover:get_name() then
local input_count = leftover:get_count()
if input_count > space then
self:set_count(stack_max)
leftover:set_count(input_count - space)
else
self:set_count(count + input_count)
leftover:set_count(0)
end
end
return leftover
end
Expand Down Expand Up @@ -170,6 +187,18 @@ function ItemStack:__tostring()
return 'ItemStack("' .. self:get_name() .. (count > 1 and " "..count or "") .. '")'
end

-- TODO: Allows `same` assertions but in corner cases makes mod code to return true where engine would return false.
-- Requires either overriding luassert `same` (nice for users) or only allowing special assertions (not so nice).
function ItemStack:__eq(other)
if mineunit.utils.type(other) == "ItemStack" then
return self:get_name() == other:get_name()
and self._count == other._count
and self._wear == other._wear
and self._meta == other._meta
end
return false
end

mineunit.export_object(ItemStack, {
name = "ItemStack",
constructor = function(self, value)
Expand Down
Loading