Skip to content

Commit

Permalink
(#1, #2) Add or fix some ItemStack, MetaDataRef and Player methods
Browse files Browse the repository at this point in the history
  • Loading branch information
SX committed Nov 23, 2020
1 parent 895b892 commit 7e376ad
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 60 deletions.
10 changes: 10 additions & 0 deletions core.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@ local function DEPRECATED(msg)
error(msg or "Attempted to use deprecated method")
end

function mineunit_export_object(obj, def)
if _G[def.name] == nil then
obj.__index = obj
setmetatable(obj, { __call = def.constructor })
_G[def.name] = obj
else
error("Error: mineunit_export_object object name is already reserved:" .. (def.name or "?"))
end
end

local function noop(...) end
local function dummy_coords(...) return { x = 123, y = 123, z = 123 } end

Expand Down
88 changes: 57 additions & 31 deletions itemstack.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,6 @@
fixture("mineunit/metadata")

local ItemStack = {}
setmetatable(ItemStack, { __call = function(value) return ItemStack._create_instance(value) end })
function ItemStack._create_instance(value)
local obj
if value == nil then
obj = {}
elseif type(value) == "string" then
error("NOT IMPLEMENTED")
elseif type(value) == "table" then
obj = table.copy(value)
else
error("NOT IMPLEMENTED")
end
obj._name = obj._name or nil
obj._description = obj._description or nil
obj._count = obj._count or 0
obj._wear = obj._wear or 0
obj._meta = obj._meta or MetaDataRef()
setmetatable(obj, ItemStack)
return obj
end
--* `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"`).
Expand All @@ -37,7 +17,9 @@ function ItemStack:set_count(count) self._count = count end
function ItemStack:get_wear() return self._wear end
--* `set_wear(wear)`: returns boolean indicating whether item was cleared
-- `wear`: number, unsigned 16 bit integer
function ItemStack:set_wear(wear) self._wear = wear end
function ItemStack:set_wear(wear)
self._wear = math.min(65535, math.max(0, wear))
end
--* `get_meta()`: returns ItemStackMetaRef. See section for more details
function ItemStack:get_meta() return self._meta end
--* `get_metadata()`: (DEPRECATED) Returns metadata (a string attached to an item stack).
Expand All @@ -50,16 +32,26 @@ function ItemStack:set_metadata(metadata) DEPRECATED("Using deprecated ItemStack
-- `description` in item metadata (See [Item Metadata].)
-- `description` in item definition
-- item name
function ItemStack:get_description() return self._description end
function ItemStack:get_description()
local value = self:get_meta():get("description")
if value then return value end
return self:get_definition().description
end
--* `get_short_description()`: returns the short description.
-- Unlike the description, this does not include new lines.
-- The engine uses the same as this function for short item descriptions.
-- Fields for finding the short description, in order:
-- `short_description` in item metadata (See [Item Metadata].)
-- `short_description` in item definition
-- first line of the description (See `get_description()`.)
-- FIXME: This is wrong
function ItemStack:get_short_description() return self._description end
function ItemStack:get_short_description()
local value = self:get_meta():get("short_description")
if value then return value end
value = self:get_definition().short_description
if value then return value end
value = self:get_description()
if value then return value:gmatch("[^\r\n]+")() end
end
--* `clear()`: removes all items from the stack, making it empty.
function ItemStack:clear() self._count = 0 end
--* `replace(item)`: replace the contents of this stack.
Expand All @@ -77,17 +69,19 @@ function ItemStack:to_table()
end
--* `get_stack_max()`: returns the maximum size of the stack (depends on the item).
function ItemStack:get_stack_max()
error("NOT IMPLEMENTED")
return self:is_known() and (self:get_definition().stack_max or 99) or 99
end
--* `get_free_space()`: returns `get_stack_max() - get_count()`.
function ItemStack:get_free_space() return self:get_stack_max() - self:get_count() end
function ItemStack:get_free_space()
return self:get_stack_max() - self:get_count()
end
--* `is_known()`: returns `true` if the item name refers to a defined item type.
function ItemStack:is_known()
error("NOT IMPLEMENTED")
return not not minetest.registered_items[self._name]
end
--* `get_definition()`: returns the item definition table.
function ItemStack:get_definition()
error("NOT IMPLEMENTED")
return minetest.registered_items[self._name] or {}
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 @@ -98,7 +92,7 @@ end
-- Increases wear by `amount` if the item is a tool
-- `amount`: number, integer
function ItemStack:add_wear(amount)
error("NOT IMPLEMENTED")
self:set_wear(self._wear + amount)
end
--* `add_item(item)`: returns leftover `ItemStack`
-- Put some item or stack onto this stack
Expand All @@ -113,12 +107,44 @@ end
-- Take (and remove) up to `n` items from this stack
-- `n`: number, default: `1`
function ItemStack:take_item(n)
error("NOT IMPLEMENTED")
n = math.min(self:get_count(), n or 1)
self:set_count(self:get_count() - n)
local stack = ItemStack(self)
stack:set_count(n)
return stack
end
--* `peek_item(n)`: returns taken `ItemStack`
-- Copy (don't remove) up to `n` items from this stack
-- `n`: number, default: `1`
function ItemStack:peek_item(n)
error("NOT IMPLEMENTED")
end
_G.ItemStack = ItemStack

mineunit_export_object(ItemStack, {
name = "ItemStack",
constructor = function(self, value)
local obj
if value == nil then
obj = {}
elseif type(value) == "string" then
local m = value:gmatch("%S+")
obj = {
-- This *should* fail if name is empty, do not "fix":
_name = m():gsub("^:", ""),
_count = (function(v) return v and tonumber(v) end)(m()),
_meta = MetaDataRef(m()),
}
elseif type(value) == "table" then
obj = table.copy(value)
obj._meta = MetaDataRef(value._meta)
else
error("NOT IMPLEMENTED")
end
obj._name = obj._name or nil
obj._count = obj._count or 0
obj._wear = obj._wear or 0
obj._meta = obj._meta or MetaDataRef()
setmetatable(obj, ItemStack)
return obj
end,
})
35 changes: 19 additions & 16 deletions metadata.lua
Original file line number Diff line number Diff line change
@@ -1,34 +1,37 @@

local MetaDataRef = {}
function MetaDataRef._create_instance(value)
local obj
if value == nil then
obj = {}
elseif type(value) == "table" then
obj = table.copy(value)
else
error("TYPE NOT IMPLEMENTED: " .. type(value))
end
obj._data = obj._data or {}
setmetatable(obj, MetaDataRef)
return obj
end
function MetaDataRef:contains(key) return self._data[key] ~= nil end
function MetaDataRef:get(key) return self._data[key] end
function MetaDataRef:set_string(key, value)
value = value ~= nil and tostring(value)
self._data[key] = value ~= "" and value
end
function MetaDataRef:get_string(key) return self._data[key] end
function MetaDataRef:get_string(key) return self._data[key] or "" end
function MetaDataRef:set_int(key, value) self:set_string(key, value) end
function MetaDataRef:get_int(key) return math.floor(tonumber(self._data[key]) or 0) end
function MetaDataRef:set_float(key, value) error("NOT IMPLEMENTED") end
function MetaDataRef:get_float(key) error("NOT IMPLEMENTED") end
function MetaDataRef:to_table() error("NOT IMPLEMENTED") end
function MetaDataRef:from_table(t) error("NOT IMPLEMENTED") end
function MetaDataRef:equals(other) error("NOT IMPLEMENTED") end
setmetatable(MetaDataRef, { __call = function(value) return MetaDataRef._create_instance(value) end })
_G.MetaDataRef = MetaDataRef

mineunit_export_object(MetaDataRef, {
name = "MetaDataRef",
constructor = function(self, value)
local obj
if value == nil then
obj = {}
elseif type(value) == "table" then
obj = table.copy(value)
else
print(value)
error("TYPE NOT IMPLEMENTED: " .. type(value))
end
obj._data = obj._data or {}
setmetatable(obj, MetaDataRef)
return obj
end,
})

-- FIXME: Node metadata should be integrated with world layout to handle set_node and its friends
local worldmeta = {}
Expand Down
53 changes: 40 additions & 13 deletions player.lua
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,44 @@ _G.minetest.get_player_by_name = function(name)
return players[name]
end

_G.Player = function(name, privs)
local player = {
_name = name or "SX",
_privs = privs or { server = 1, test_priv=1 },
get_player_control = function(self)
return {}
end,
get_player_name = function(self)
return self._name
end
}
players[player._name] = player
return player
--
-- Mineunit player fixture API
--

fixture("mineunit/metadata")

local Player = {}
--
-- Mineunit player API methods
--
function Player:_set_player_control_state(control, value)
self._controls[control] = value and value
end
function Player:_reset_player_controls()
self._controls = {}
end

--
-- Minetest player API methods
--
function Player:get_player_control()
return table.copy(self._controls)
end
function Player:get_player_name()
return self._name
end

mineunit_export_object(Player, {
name = "Player",
constructor = function(self, name, privs)
local obj = {
_name = name or "SX",
_privs = privs or { server = 1, test_priv=1 },
_controls = {},
_meta = MetaDataRef(),
}
players[obj._name] = obj
setmetatable(obj, Player)
return obj
end,
})

0 comments on commit 7e376ad

Please sign in to comment.