LuaItemStack: Add __tostring metamethod (#8785)
* LuaItemStack: Add __tostring metamethod * Clean up LuaItemStack::checkobject
This commit is contained in:
		
							parent
							
								
									09e285f38c
								
							
						
					
					
						commit
						b16f841756
					
				| @ -20,6 +20,8 @@ local function basic_dump(o) | ||||
| 	-- dump's output is intended for humans. | ||||
| 	--elseif tp == "function" then | ||||
| 	--	return string.format("loadstring(%q)", string.dump(o)) | ||||
| 	elseif tp == "userdata" then | ||||
| 		return tostring(o) | ||||
| 	else | ||||
| 		return string.format("<%s>", tp) | ||||
| 	end | ||||
|  | ||||
| @ -56,28 +56,31 @@ ItemStack::ItemStack(const std::string &name_, u16 count_, | ||||
| 		count = 1; | ||||
| } | ||||
| 
 | ||||
| void ItemStack::serialize(std::ostream &os) const | ||||
| void ItemStack::serialize(std::ostream &os, bool serialize_meta) const | ||||
| { | ||||
| 	if (empty()) | ||||
| 		return; | ||||
| 
 | ||||
| 	// Check how many parts of the itemstring are needed
 | ||||
| 	int parts = 1; | ||||
| 	if(count != 1) | ||||
| 		parts = 2; | ||||
| 	if(wear != 0) | ||||
| 		parts = 3; | ||||
| 	if (!metadata.empty()) | ||||
| 		parts = 4; | ||||
| 	else if (wear != 0) | ||||
| 		parts = 3; | ||||
| 	else if (count != 1) | ||||
| 		parts = 2; | ||||
| 
 | ||||
| 	os<<serializeJsonStringIfNeeded(name); | ||||
| 	if(parts >= 2) | ||||
| 		os<<" "<<count; | ||||
| 	if(parts >= 3) | ||||
| 		os<<" "<<wear; | ||||
| 	os << serializeJsonStringIfNeeded(name); | ||||
| 	if (parts >= 2) | ||||
| 		os << " " << count; | ||||
| 	if (parts >= 3) | ||||
| 		os << " " << wear; | ||||
| 	if (parts >= 4) { | ||||
| 		os << " "; | ||||
| 		metadata.serialize(os); | ||||
| 		if (serialize_meta) | ||||
| 			metadata.serialize(os); | ||||
| 		else | ||||
| 			os << "<metadata size=" << metadata.size() << ">"; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -240,10 +243,10 @@ void ItemStack::deSerialize(const std::string &str, IItemDefManager *itemdef) | ||||
| 	deSerialize(is, itemdef); | ||||
| } | ||||
| 
 | ||||
| std::string ItemStack::getItemString() const | ||||
| std::string ItemStack::getItemString(bool include_meta) const | ||||
| { | ||||
| 	std::ostringstream os(std::ios::binary); | ||||
| 	serialize(os); | ||||
| 	serialize(os, include_meta); | ||||
| 	return os.str(); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -40,13 +40,13 @@ struct ItemStack | ||||
| 	~ItemStack() = default; | ||||
| 
 | ||||
| 	// Serialization
 | ||||
| 	void serialize(std::ostream &os) const; | ||||
| 	void serialize(std::ostream &os, bool serialize_meta = true) const; | ||||
| 	// Deserialization. Pass itemdef unless you don't want aliases resolved.
 | ||||
| 	void deSerialize(std::istream &is, IItemDefManager *itemdef = NULL); | ||||
| 	void deSerialize(const std::string &s, IItemDefManager *itemdef = NULL); | ||||
| 
 | ||||
| 	// Returns the string used for inventory
 | ||||
| 	std::string getItemString() const; | ||||
| 	std::string getItemString(bool include_meta = true) const; | ||||
| 	// Returns the tooltip
 | ||||
| 	std::string getDescription(IItemDefManager *itemdef) const; | ||||
| 
 | ||||
|  | ||||
| @ -37,6 +37,15 @@ int LuaItemStack::gc_object(lua_State *L) | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| // __tostring metamethod
 | ||||
| int LuaItemStack::mt_tostring(lua_State *L) | ||||
| { | ||||
| 	LuaItemStack *o = checkobject(L, 1); | ||||
| 	std::string itemstring = o->m_stack.getItemString(false); | ||||
| 	lua_pushfstring(L, "ItemStack(\"%s\")", itemstring.c_str()); | ||||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| // is_empty(self) -> true/false
 | ||||
| int LuaItemStack::l_is_empty(lua_State *L) | ||||
| { | ||||
| @ -433,12 +442,9 @@ int LuaItemStack::create(lua_State *L, const ItemStack &item) | ||||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| LuaItemStack* LuaItemStack::checkobject(lua_State *L, int narg) | ||||
| LuaItemStack *LuaItemStack::checkobject(lua_State *L, int narg) | ||||
| { | ||||
| 	luaL_checktype(L, narg, LUA_TUSERDATA); | ||||
| 	void *ud = luaL_checkudata(L, narg, className); | ||||
| 	if(!ud) luaL_typerror(L, narg, className); | ||||
| 	return *(LuaItemStack**)ud;  // unbox pointer
 | ||||
| 	return *(LuaItemStack **)luaL_checkudata(L, narg, className); | ||||
| } | ||||
| 
 | ||||
| void LuaItemStack::Register(lua_State *L) | ||||
| @ -448,9 +454,10 @@ void LuaItemStack::Register(lua_State *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);  // hide metatable from Lua getmetatable()
 | ||||
| 	lua_settable(L, metatable); | ||||
| 
 | ||||
| 	lua_pushliteral(L, "__index"); | ||||
| 	lua_pushvalue(L, methodtable); | ||||
| @ -460,12 +467,16 @@ void LuaItemStack::Register(lua_State *L) | ||||
| 	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_openlib(L, 0, methods, 0);  // fill methodtable
 | ||||
| 	lua_pop(L, 1);  // drop methodtable
 | ||||
| 
 | ||||
| 	// Can be created from Lua (LuaItemStack(itemstack or itemstring or table or nil))
 | ||||
| 	// Can be created from Lua (ItemStack(itemstack or itemstring or table or nil))
 | ||||
| 	lua_register(L, className, create_object); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -34,6 +34,9 @@ private: | ||||
| 	// garbage collector
 | ||||
| 	static int gc_object(lua_State *L); | ||||
| 
 | ||||
| 	// __tostring metamethod
 | ||||
| 	static int mt_tostring(lua_State *L); | ||||
| 
 | ||||
| 	// is_empty(self) -> true/false
 | ||||
| 	static int l_is_empty(lua_State *L); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user