}
else if(command == TOCLIENT_TOOLDEF)
{
- infostream<<"Client: Received tool definitions"<<std::endl;
+ infostream<<"Client: Received tool definitions: packet size: "
+ <<datasize<<std::endl;
std::string datastring((char*)&data[2], datasize-2);
std::istringstream is(datastring, std::ios_base::binary);
event.type = CE_TEXTURES_UPDATED;
m_client_event_queue.push_back(event);
}
+ else if(command == TOCLIENT_NODEDEF)
+ {
+ infostream<<"Client: Received node definitions: packet size: "
+ <<datasize<<std::endl;
+
+ std::string datastring((char*)&data[2], datasize-2);
+ std::istringstream is(datastring, std::ios_base::binary);
+
+ // Stop threads while updating content definitions
+ m_mesh_update_thread.stop();
+
+ std::istringstream tmp_is(deSerializeLongString(is), std::ios::binary);
+ m_nodedef->deSerialize(tmp_is, this);
+
+ // Update texture atlas
+ if(g_settings->getBool("enable_texture_atlas"))
+ m_tsrc->buildMainAtlas(this);
+
+ // Update node textures
+ m_nodedef->updateTextures(m_tsrc);
+
+ // Resume threads
+ m_mesh_update_thread.setRun(true);
+ m_mesh_update_thread.Start();
+ }
else
{
infostream<<"Client: Ignoring unknown command "
PROTOCOL_VERSION 4:
Add TOCLIENT_TOOLDEF
Add TOCLIENT_TEXTURES
+ Add TOCLIENT_NODEDEF
*/
#define PROTOCOL_VERSION 4
u16 time (0-23999)
*/
+ // (oops, there is some gap here)
+
TOCLIENT_CHAT_MESSAGE = 0x30,
/*
u16 command
}
*/
+ TOCLIENT_NODEDEF = 0x3a,
+ /*
+ u16 command
+ u32 length of the next item
+ serialized NodeDefManager
+ */
+
//TOCLIENT_CONTENT_SENDING_MODE = 0x38,
/*
u16 command
TOSERVER_RELEASE = 0x29, // Obsolete
+ // (oops, there is some gap here)
+
TOSERVER_SIGNTEXT = 0x30, // Old signs
/*
u16 command
}
void serialize(std::ostream &os)
{
+ u16 count = 0;
std::ostringstream tmp_os(std::ios::binary);
for(u16 i=0; i<=MAX_CONTENT; i++)
{
continue;
writeU16(tmp_os, i);
f->serialize(tmp_os);
+ count++;
}
+ writeU16(os, count);
os<<serializeLongString(tmp_os.str());
}
void deSerialize(std::istream &is, IGameDef *gamedef)
{
clear();
+ u16 count = readU16(is);
std::istringstream tmp_is(deSerializeLongString(is), std::ios::binary);
- while(!tmp_is.eof()){
+ for(u16 n=0; n<count; n++){
u16 i = readU16(tmp_is);
if(i > MAX_CONTENT){
errorstream<<"ContentFeatures::deSerialize(): "
// Get node definition
virtual const ContentFeatures& get(content_t c) const=0;
virtual const ContentFeatures& get(const MapNode &n) const=0;
+
+ virtual void serialize(std::ostream &os)=0;
};
class IWritableNodeDefManager : public INodeDefManager
// Send tool definitions
SendToolDef(m_con, peer_id, m_toolmgr);
+ // Send node definitions
+ SendNodeDef(m_con, peer_id, m_nodemgr);
+
// Send player info to all players
SendPlayerInfos();
IToolDefManager *tooldef)
{
DSTACK(__FUNCTION_NAME);
+ infostream<<"Server: Sending tool definitions"<<std::endl;
std::ostringstream os(std::ios_base::binary);
/*
// Make data buffer
std::string s = os.str();
+ infostream<<"Server: Sending tool definitions: data size: "
+ <<s.size()<<std::endl;
+ SharedBuffer<u8> data((u8*)s.c_str(), s.size());
+ // Send as reliable
+ con.Send(peer_id, 0, data, true);
+}
+
+void Server::SendNodeDef(con::Connection &con, u16 peer_id,
+ INodeDefManager *nodedef)
+{
+ DSTACK(__FUNCTION_NAME);
+ infostream<<"Server: Sending node definitions"<<std::endl;
+ std::ostringstream os(std::ios_base::binary);
+
+ /*
+ u16 command
+ u32 length of the next item
+ serialized NodeDefManager
+ */
+ writeU16(os, TOCLIENT_NODEDEF);
+ std::ostringstream tmp_os(std::ios::binary);
+ nodedef->serialize(tmp_os);
+ os<<serializeLongString(tmp_os.str());
+
+ // Make data buffer
+ std::string s = os.str();
+ infostream<<"Server: Sending node definitions: data size: "
+ <<s.size()<<std::endl;
SharedBuffer<u8> data((u8*)s.c_str(), s.size());
// Send as reliable
con.Send(peer_id, 0, data, true);
bool set_camera_point_target, v3f camera_point_target);
static void SendToolDef(con::Connection &con, u16 peer_id,
IToolDefManager *tooldef);
+ static void SendNodeDef(con::Connection &con, u16 peer_id,
+ INodeDefManager *nodedef);
/*
Non-static send methods.