diff options
Diffstat (limited to 'src/script/lua_api/l_item.cpp')
-rw-r--r-- | src/script/lua_api/l_item.cpp | 95 |
1 files changed, 35 insertions, 60 deletions
diff --git a/src/script/lua_api/l_item.cpp b/src/script/lua_api/l_item.cpp index bf73e78c1..c555e90fd 100644 --- a/src/script/lua_api/l_item.cpp +++ b/src/script/lua_api/l_item.cpp @@ -41,7 +41,7 @@ int LuaItemStack::gc_object(lua_State *L) // __tostring metamethod int LuaItemStack::mt_tostring(lua_State *L) { - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); std::string itemstring = o->m_stack.getItemString(false); lua_pushfstring(L, "ItemStack(\"%s\")", itemstring.c_str()); return 1; @@ -51,7 +51,7 @@ int LuaItemStack::mt_tostring(lua_State *L) int LuaItemStack::l_is_empty(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; lua_pushboolean(L, item.empty()); return 1; @@ -61,7 +61,7 @@ int LuaItemStack::l_is_empty(lua_State *L) int LuaItemStack::l_get_name(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; lua_pushstring(L, item.name.c_str()); return 1; @@ -71,7 +71,7 @@ int LuaItemStack::l_get_name(lua_State *L) int LuaItemStack::l_set_name(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; bool status = true; @@ -89,7 +89,7 @@ int LuaItemStack::l_set_name(lua_State *L) int LuaItemStack::l_get_count(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; lua_pushinteger(L, item.count); return 1; @@ -99,7 +99,7 @@ int LuaItemStack::l_get_count(lua_State *L) int LuaItemStack::l_set_count(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; bool status; @@ -120,7 +120,7 @@ int LuaItemStack::l_set_count(lua_State *L) int LuaItemStack::l_get_wear(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; lua_pushinteger(L, item.wear); return 1; @@ -130,7 +130,7 @@ int LuaItemStack::l_get_wear(lua_State *L) int LuaItemStack::l_set_wear(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; bool status; @@ -151,7 +151,7 @@ int LuaItemStack::l_set_wear(lua_State *L) int LuaItemStack::l_get_meta(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStackMetaRef::create(L, o); return 1; } @@ -161,7 +161,7 @@ int LuaItemStack::l_get_meta(lua_State *L) int LuaItemStack::l_get_metadata(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; const std::string &value = item.metadata.getString(""); lua_pushlstring(L, value.c_str(), value.size()); @@ -173,7 +173,7 @@ int LuaItemStack::l_get_metadata(lua_State *L) int LuaItemStack::l_set_metadata(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; size_t len = 0; @@ -188,7 +188,7 @@ int LuaItemStack::l_set_metadata(lua_State *L) int LuaItemStack::l_get_description(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); std::string desc = o->m_stack.getDescription(getGameDef(L)->idef()); lua_pushstring(L, desc.c_str()); return 1; @@ -198,7 +198,7 @@ int LuaItemStack::l_get_description(lua_State *L) int LuaItemStack::l_get_short_description(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); std::string desc = o->m_stack.getShortDescription(getGameDef(L)->idef()); lua_pushstring(L, desc.c_str()); return 1; @@ -208,7 +208,7 @@ int LuaItemStack::l_get_short_description(lua_State *L) int LuaItemStack::l_clear(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); o->m_stack.clear(); lua_pushboolean(L, true); return 1; @@ -218,7 +218,7 @@ int LuaItemStack::l_clear(lua_State *L) int LuaItemStack::l_replace(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); o->m_stack = read_item(L, 2, getGameDef(L)->idef()); lua_pushboolean(L, true); return 1; @@ -228,7 +228,7 @@ int LuaItemStack::l_replace(lua_State *L) int LuaItemStack::l_to_string(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); std::string itemstring = o->m_stack.getItemString(); lua_pushstring(L, itemstring.c_str()); return 1; @@ -238,7 +238,7 @@ int LuaItemStack::l_to_string(lua_State *L) int LuaItemStack::l_to_table(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); const ItemStack &item = o->m_stack; if(item.empty()) { @@ -278,7 +278,7 @@ int LuaItemStack::l_to_table(lua_State *L) int LuaItemStack::l_get_stack_max(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; lua_pushinteger(L, item.getStackMax(getGameDef(L)->idef())); return 1; @@ -288,7 +288,7 @@ int LuaItemStack::l_get_stack_max(lua_State *L) int LuaItemStack::l_get_free_space(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; lua_pushinteger(L, item.freeSpace(getGameDef(L)->idef())); return 1; @@ -299,7 +299,7 @@ int LuaItemStack::l_get_free_space(lua_State *L) int LuaItemStack::l_is_known(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; bool is_known = item.isKnown(getGameDef(L)->idef()); lua_pushboolean(L, is_known); @@ -312,7 +312,7 @@ int LuaItemStack::l_is_known(lua_State *L) int LuaItemStack::l_get_definition(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; // Get registered_items[name] @@ -334,7 +334,7 @@ int LuaItemStack::l_get_definition(lua_State *L) int LuaItemStack::l_get_tool_capabilities(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; const ToolCapabilities &prop = item.getToolCapabilities(getGameDef(L)->idef()); @@ -349,7 +349,7 @@ int LuaItemStack::l_get_tool_capabilities(lua_State *L) int LuaItemStack::l_add_wear(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; int amount = lua_tointeger(L, 2); bool result = item.addWear(amount, getGameDef(L)->idef()); @@ -367,7 +367,7 @@ int LuaItemStack::l_add_wear(lua_State *L) int LuaItemStack::l_add_wear_by_uses(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; u32 max_uses = readParam<int>(L, 2); u32 add_wear = calculateResultWear(max_uses, item.wear); @@ -381,7 +381,7 @@ int LuaItemStack::l_add_wear_by_uses(lua_State *L) int LuaItemStack::l_add_item(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; ItemStack newitem = read_item(L, -1, getGameDef(L)->idef()); ItemStack leftover = item.addItem(newitem, getGameDef(L)->idef()); @@ -395,7 +395,7 @@ int LuaItemStack::l_add_item(lua_State *L) int LuaItemStack::l_item_fits(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; ItemStack newitem = read_item(L, 2, getGameDef(L)->idef()); ItemStack restitem; @@ -409,7 +409,7 @@ int LuaItemStack::l_item_fits(lua_State *L) int LuaItemStack::l_take_item(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; u32 takecount = 1; if(!lua_isnone(L, 2)) @@ -423,7 +423,7 @@ int LuaItemStack::l_take_item(lua_State *L) int LuaItemStack::l_peek_item(lua_State *L) { NO_MAP_LOCK_REQUIRED; - LuaItemStack *o = checkobject(L, 1); + LuaItemStack *o = checkObject<LuaItemStack>(L, 1); ItemStack &item = o->m_stack; u32 peekcount = 1; if(!lua_isnone(L, 2)) @@ -464,14 +464,9 @@ int LuaItemStack::create(lua_State *L, const ItemStack &item) return 1; } -LuaItemStack *LuaItemStack::checkobject(lua_State *L, int narg) -{ - return *(LuaItemStack **)luaL_checkudata(L, narg, className); -} - void *LuaItemStack::packIn(lua_State *L, int idx) { - LuaItemStack *o = checkobject(L, idx); + LuaItemStack *o = checkObject<LuaItemStack>(L, idx); return new ItemStack(o->getItem()); } @@ -485,32 +480,12 @@ void LuaItemStack::packOut(lua_State *L, void *ptr) void LuaItemStack::Register(lua_State *L) { - lua_newtable(L); - int methodtable = lua_gettop(L); - luaL_newmetatable(L, className); - int metatable = lua_gettop(L); - - // hide metatable from Lua getmetatable() - lua_pushliteral(L, "__metatable"); - lua_pushvalue(L, methodtable); - lua_settable(L, metatable); - - lua_pushliteral(L, "__index"); - lua_pushvalue(L, methodtable); - lua_settable(L, metatable); - - lua_pushliteral(L, "__gc"); - lua_pushcfunction(L, gc_object); - lua_settable(L, metatable); - - lua_pushliteral(L, "__tostring"); - lua_pushcfunction(L, mt_tostring); - lua_settable(L, metatable); - - lua_pop(L, 1); // drop metatable - - luaL_register(L, nullptr, methods); // fill methodtable - lua_pop(L, 1); // drop methodtable + static const luaL_Reg metamethods[] = { + {"__tostring", mt_tostring}, + {"__gc", gc_object}, + {0, 0} + }; + registerClass(L, className, methods, metamethods); // Can be created from Lua (ItemStack(itemstack or itemstring or table or nil)) lua_register(L, className, create_object); |