diff options
author | fluxionary <25628292+fluxionary@users.noreply.github.com> | 2022-10-09 05:06:09 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-09 08:06:09 -0400 |
commit | 440d966b939059dfa51604eb68d61eecb12baeb4 (patch) | |
tree | 702416d3686b168cee90e1029a766161267277c6 /src | |
parent | b2a3f53b297d4aec37f8272992f8e9b465d43a43 (diff) | |
download | minetest-440d966b939059dfa51604eb68d61eecb12baeb4.tar.xz |
add an 'equals' method to ItemStack and compatibility w/ lua '==' (#12771)
Co-authored-by: rubenwardy <rw@rubenwardy.com>
Co-authored-by: sfan5 <sfan5@live.de>
Diffstat (limited to 'src')
-rw-r--r-- | src/script/lua_api/l_item.cpp | 34 | ||||
-rw-r--r-- | src/script/lua_api/l_item.h | 3 |
2 files changed, 37 insertions, 0 deletions
diff --git a/src/script/lua_api/l_item.cpp b/src/script/lua_api/l_item.cpp index c555e90fd..f33dd1fef 100644 --- a/src/script/lua_api/l_item.cpp +++ b/src/script/lua_api/l_item.cpp @@ -433,6 +433,38 @@ int LuaItemStack::l_peek_item(lua_State *L) return 1; } +// equals(self, other) -> bool +int LuaItemStack::l_equals(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + LuaItemStack *o1 = checkObject<LuaItemStack>(L, 1); + + // checks for non-userdata argument + if (!lua_isuserdata(L, 2)) { + lua_pushboolean(L, false); + return 1; + } + + // check that the argument is an ItemStack + if (!lua_getmetatable(L, 2)) { + lua_pushboolean(L, false); + return 1; + } + lua_getfield(L, LUA_REGISTRYINDEX, className); + if (!lua_rawequal(L, -1, -2)) { + lua_pushboolean(L, false); + return 1; + } + + LuaItemStack *o2 = checkObject<LuaItemStack>(L, 2); + + ItemStack &item1 = o1->m_stack; + ItemStack &item2 = o2->m_stack; + + lua_pushboolean(L, item1 == item2); + return 1; +} + LuaItemStack::LuaItemStack(const ItemStack &item): m_stack(item) { @@ -483,6 +515,7 @@ void LuaItemStack::Register(lua_State *L) static const luaL_Reg metamethods[] = { {"__tostring", mt_tostring}, {"__gc", gc_object}, + {"__eq", l_equals}, {0, 0} }; registerClass(L, className, methods, metamethods); @@ -522,6 +555,7 @@ const luaL_Reg LuaItemStack::methods[] = { luamethod(LuaItemStack, item_fits), luamethod(LuaItemStack, take_item), luamethod(LuaItemStack, peek_item), + luamethod(LuaItemStack, equals), {0,0} }; diff --git a/src/script/lua_api/l_item.h b/src/script/lua_api/l_item.h index 8f4b25cf4..a4cc706d8 100644 --- a/src/script/lua_api/l_item.h +++ b/src/script/lua_api/l_item.h @@ -140,6 +140,9 @@ private: // peek_item(self, peekcount=1) -> itemstack static int l_peek_item(lua_State *L); + // equals(self, other) -> bool + static int l_equals(lua_State *L); + public: DISABLE_CLASS_COPY(LuaItemStack) |