mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-10-31 15:35:21 +01:00 
			
		
		
		
	* Code modernization: src/n*, src/o* * empty function * default constructor/destructor * for range-based loops * use emplace_back instead of push_back * remove unused IWritableNodeDefManager::clone() * C++ STL header style * Pointer constness in some functions
		
			
				
	
	
		
			152 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
| Minetest
 | |
| Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
 | |
| 
 | |
| This program is free software; you can redistribute it and/or modify
 | |
| it under the terms of the GNU Lesser General Public License as published by
 | |
| the Free Software Foundation; either version 2.1 of the License, or
 | |
| (at your option) any later version.
 | |
| 
 | |
| This program is distributed in the hope that it will be useful,
 | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| GNU Lesser General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU Lesser General Public License along
 | |
| with this program; if not, write to the Free Software Foundation, Inc.,
 | |
| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | |
| */
 | |
| 
 | |
| #include "object_properties.h"
 | |
| #include "irrlichttypes_bloated.h"
 | |
| #include "exceptions.h"
 | |
| #include "util/serialize.h"
 | |
| #include "util/basic_macros.h"
 | |
| #include <sstream>
 | |
| 
 | |
| ObjectProperties::ObjectProperties()
 | |
| {
 | |
| 	textures.emplace_back("unknown_object.png");
 | |
| 	colors.emplace_back(255,255,255,255);
 | |
| }
 | |
| 
 | |
| std::string ObjectProperties::dump()
 | |
| {
 | |
| 	std::ostringstream os(std::ios::binary);
 | |
| 	os<<"hp_max="<<hp_max;
 | |
| 	os<<", physical="<<physical;
 | |
| 	os<<", collideWithObjects="<<collideWithObjects;
 | |
| 	os<<", weight="<<weight;
 | |
| 	os<<", collisionbox="<<PP(collisionbox.MinEdge)<<","<<PP(collisionbox.MaxEdge);
 | |
| 	os<<", visual="<<visual;
 | |
| 	os<<", mesh="<<mesh;
 | |
| 	os<<", visual_size="<<PP2(visual_size);
 | |
| 	os<<", textures=[";
 | |
| 	for (const std::string &texture : textures) {
 | |
| 		os<<"\""<< texture <<"\" ";
 | |
| 	}
 | |
| 	os<<"]";
 | |
| 	os<<", colors=[";
 | |
| 	for (const video::SColor &color : colors) {
 | |
| 		os << "\"" << color.getAlpha() << "," << color.getRed() << ","
 | |
| 			<< color.getGreen() << "," << color.getBlue() << "\" ";
 | |
| 	}
 | |
| 	os<<"]";
 | |
| 	os<<", spritediv="<<PP2(spritediv);
 | |
| 	os<<", initial_sprite_basepos="<<PP2(initial_sprite_basepos);
 | |
| 	os<<", is_visible="<<is_visible;
 | |
| 	os<<", makes_footstep_sound="<<makes_footstep_sound;
 | |
| 	os<<", automatic_rotate="<<automatic_rotate;
 | |
| 	os<<", backface_culling="<<backface_culling;
 | |
| 	os << ", nametag=" << nametag;
 | |
| 	os << ", nametag_color=" << "\"" << nametag_color.getAlpha() << "," << nametag_color.getRed()
 | |
| 			<< "," << nametag_color.getGreen() << "," << nametag_color.getBlue() << "\" ";
 | |
| 	return os.str();
 | |
| }
 | |
| 
 | |
| void ObjectProperties::serialize(std::ostream &os) const
 | |
| {
 | |
| 	writeU8(os, 1); // version
 | |
| 	writeS16(os, hp_max);
 | |
| 	writeU8(os, physical);
 | |
| 	writeF1000(os, weight);
 | |
| 	writeV3F1000(os, collisionbox.MinEdge);
 | |
| 	writeV3F1000(os, collisionbox.MaxEdge);
 | |
| 	os<<serializeString(visual);
 | |
| 	writeV2F1000(os, visual_size);
 | |
| 	writeU16(os, textures.size());
 | |
| 	for (const std::string &texture : textures) {
 | |
| 		os << serializeString(texture);
 | |
| 	}
 | |
| 	writeV2S16(os, spritediv);
 | |
| 	writeV2S16(os, initial_sprite_basepos);
 | |
| 	writeU8(os, is_visible);
 | |
| 	writeU8(os, makes_footstep_sound);
 | |
| 	writeF1000(os, automatic_rotate);
 | |
| 	// Added in protocol version 14
 | |
| 	os<<serializeString(mesh);
 | |
| 	writeU16(os, colors.size());
 | |
| 	for (video::SColor color : colors) {
 | |
| 		writeARGB8(os, color);
 | |
| 	}
 | |
| 	writeU8(os, collideWithObjects);
 | |
| 	writeF1000(os,stepheight);
 | |
| 	writeU8(os, automatic_face_movement_dir);
 | |
| 	writeF1000(os, automatic_face_movement_dir_offset);
 | |
| 	writeU8(os, backface_culling);
 | |
| 	os << serializeString(nametag);
 | |
| 	writeARGB8(os, nametag_color);
 | |
| 	writeF1000(os, automatic_face_movement_max_rotation_per_sec);
 | |
| 	os << serializeString(infotext);
 | |
| 	os << serializeString(wield_item);
 | |
| 
 | |
| 	// Add stuff only at the bottom.
 | |
| 	// Never remove anything, because we don't want new versions of this
 | |
| }
 | |
| 
 | |
| void ObjectProperties::deSerialize(std::istream &is)
 | |
| {
 | |
| 	int version = readU8(is);
 | |
| 	if(version == 1)
 | |
| 	{
 | |
| 		try{
 | |
| 			hp_max = readS16(is);
 | |
| 			physical = readU8(is);
 | |
| 			weight = readF1000(is);
 | |
| 			collisionbox.MinEdge = readV3F1000(is);
 | |
| 			collisionbox.MaxEdge = readV3F1000(is);
 | |
| 			visual = deSerializeString(is);
 | |
| 			visual_size = readV2F1000(is);
 | |
| 			textures.clear();
 | |
| 			u32 texture_count = readU16(is);
 | |
| 			for(u32 i=0; i<texture_count; i++){
 | |
| 				textures.push_back(deSerializeString(is));
 | |
| 			}
 | |
| 			spritediv = readV2S16(is);
 | |
| 			initial_sprite_basepos = readV2S16(is);
 | |
| 			is_visible = readU8(is);
 | |
| 			makes_footstep_sound = readU8(is);
 | |
| 			automatic_rotate = readF1000(is);
 | |
| 			mesh = deSerializeString(is);
 | |
| 			u32 color_count = readU16(is);
 | |
| 			for(u32 i=0; i<color_count; i++){
 | |
| 				colors.push_back(readARGB8(is));
 | |
| 			}
 | |
| 			collideWithObjects = readU8(is);
 | |
| 			stepheight = readF1000(is);
 | |
| 			automatic_face_movement_dir = readU8(is);
 | |
| 			automatic_face_movement_dir_offset = readF1000(is);
 | |
| 			backface_culling = readU8(is);
 | |
| 			nametag = deSerializeString(is);
 | |
| 			nametag_color = readARGB8(is);
 | |
| 			automatic_face_movement_max_rotation_per_sec = readF1000(is);
 | |
| 			infotext = deSerializeString(is);
 | |
| 			wield_item = deSerializeString(is);
 | |
| 		}catch(SerializationError &e){}
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		throw SerializationError("unsupported ObjectProperties version");
 | |
| 	}
 | |
| }
 |