From 440d966b939059dfa51604eb68d61eecb12baeb4 Mon Sep 17 00:00:00 2001 From: fluxionary <25628292+fluxionary@users.noreply.github.com> Date: Sun, 9 Oct 2022 05:06:09 -0700 Subject: add an 'equals' method to ItemStack and compatibility w/ lua '==' (#12771) Co-authored-by: rubenwardy Co-authored-by: sfan5 --- src/script/lua_api/l_item.cpp | 34 ++++++++++++++++++++++++++++++++++ src/script/lua_api/l_item.h | 3 +++ 2 files changed, 37 insertions(+) (limited to 'src/script/lua_api') 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(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(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) -- cgit v1.2.3