Skip to content

Commit

Permalink
Merge pull request #63 from S-S-X/update-metadata
Browse files Browse the repository at this point in the history
Update metadata, itemstack and add compare_block_status
  • Loading branch information
S-S-X authored Dec 1, 2021
2 parents b11ca0c + 1160172 commit 40f92fa
Show file tree
Hide file tree
Showing 6 changed files with 709 additions and 145 deletions.
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

0 comments on commit 40f92fa

Please sign in to comment.