forked from Mirrorlandia_minetest/minetest
Node definitions transfer
This commit is contained in:
parent
eed727c61b
commit
6da8cb00e2
@ -1507,7 +1507,8 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
|
||||
}
|
||||
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);
|
||||
@ -1589,6 +1590,31 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
|
||||
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 "
|
||||
|
@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
PROTOCOL_VERSION 4:
|
||||
Add TOCLIENT_TOOLDEF
|
||||
Add TOCLIENT_TEXTURES
|
||||
Add TOCLIENT_NODEDEF
|
||||
*/
|
||||
|
||||
#define PROTOCOL_VERSION 4
|
||||
@ -119,6 +120,8 @@ enum ToClientCommand
|
||||
u16 time (0-23999)
|
||||
*/
|
||||
|
||||
// (oops, there is some gap here)
|
||||
|
||||
TOCLIENT_CHAT_MESSAGE = 0x30,
|
||||
/*
|
||||
u16 command
|
||||
@ -211,6 +214,13 @@ enum ToClientCommand
|
||||
}
|
||||
*/
|
||||
|
||||
TOCLIENT_NODEDEF = 0x3a,
|
||||
/*
|
||||
u16 command
|
||||
u32 length of the next item
|
||||
serialized NodeDefManager
|
||||
*/
|
||||
|
||||
//TOCLIENT_CONTENT_SENDING_MODE = 0x38,
|
||||
/*
|
||||
u16 command
|
||||
@ -304,6 +314,8 @@ enum ToServerCommand
|
||||
|
||||
TOSERVER_RELEASE = 0x29, // Obsolete
|
||||
|
||||
// (oops, there is some gap here)
|
||||
|
||||
TOSERVER_SIGNTEXT = 0x30, // Old signs
|
||||
/*
|
||||
u16 command
|
||||
|
@ -451,6 +451,7 @@ public:
|
||||
}
|
||||
void serialize(std::ostream &os)
|
||||
{
|
||||
u16 count = 0;
|
||||
std::ostringstream tmp_os(std::ios::binary);
|
||||
for(u16 i=0; i<=MAX_CONTENT; i++)
|
||||
{
|
||||
@ -459,14 +460,17 @@ public:
|
||||
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(): "
|
||||
|
@ -278,6 +278,8 @@ public:
|
||||
// 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
|
||||
|
@ -2145,6 +2145,9 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
|
||||
// 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();
|
||||
|
||||
@ -3637,6 +3640,7 @@ void Server::SendToolDef(con::Connection &con, u16 peer_id,
|
||||
IToolDefManager *tooldef)
|
||||
{
|
||||
DSTACK(__FUNCTION_NAME);
|
||||
infostream<<"Server: Sending tool definitions"<<std::endl;
|
||||
std::ostringstream os(std::ios_base::binary);
|
||||
|
||||
/*
|
||||
@ -3651,6 +3655,34 @@ void Server::SendToolDef(con::Connection &con, u16 peer_id,
|
||||
|
||||
// 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);
|
||||
|
@ -513,6 +513,8 @@ private:
|
||||
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.
|
||||
|
Loading…
Reference in New Issue
Block a user