From: Perttu Ahola Date: Mon, 14 Nov 2011 23:00:16 +0000 (+0200) Subject: Tool definition transfer to client X-Git-Url: http://81.2.79.47:8989/gitweb/?a=commitdiff_plain;h=4b8e4dae589cabef054991c08eb2cd47c867994a;p=zefram%2Fminetest%2Fminetest_engine.git Tool definition transfer to client --- diff --git a/src/client.cpp b/src/client.cpp index d5abcd7d..1daeeba3 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -452,7 +452,7 @@ void Client::step(float dtime) snprintf((char*)&data[23], PASSWORD_SIZE, "%s", m_password.c_str()); // This should be incremented in each version - writeU16(&data[51], 3); + writeU16(&data[51], PROTOCOL_VERSION); // Send as unreliable Send(0, data, false); @@ -1506,6 +1506,23 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) event.deathscreen.camera_point_target_z = camera_point_target.Z; m_client_event_queue.push_back(event); } + else if(command == TOCLIENT_TOOLDEF) + { + infostream<<"Client: Received tool definitions"<deSerialize(tmp_is); + + // Resume threads + m_mesh_update_thread.setRun(true); + m_mesh_update_thread.Start(); + } else { infostream<<"Client: Ignoring unknown command " diff --git a/src/clientserver.h b/src/clientserver.h index 0f692569..ef8188b2 100644 --- a/src/clientserver.h +++ b/src/clientserver.h @@ -22,7 +22,16 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "utility.h" -#define PROTOCOL_VERSION 3 +/* + changes by PROTOCOL_VERSION: + + PROTOCOL_VERSION 3: + Base for writing changes here + PROTOCOL_VERSION 4: + Add TOCLIENT_TOOLDEF +*/ + +#define PROTOCOL_VERSION 4 #define PROTOCOL_ID 0x4f457403 @@ -181,6 +190,19 @@ enum ToClientCommand u8 bool set camera point target v3f1000 camera point target (to point the death cause or whatever) */ + + TOCLIENT_TOOLDEF = 0x38, + /* + u16 command + u32 length of the next item + serialized ToolDefManager + */ + + //TOCLIENT_CONTENT_SENDING_MODE = 0x38, + /* + u16 command + u8 mode (0 = off, 1 = on) + */ }; enum ToServerCommand diff --git a/src/game.cpp b/src/game.cpp index bf601dd2..ae45e514 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -660,6 +660,8 @@ void the_game( server = new Server(map_dir, configpath); server->start(port); } + + { // Client scope /* Create client @@ -2341,8 +2343,11 @@ void the_game( gui_shuttingdowntext->remove();*/ } + } // Client scope (must be destructed before destructing *def and tsrc + delete tooldef; delete tsrc; + delete nodedef; } diff --git a/src/server.cpp b/src/server.cpp index 75fb7cd7..ca00ed29 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2106,6 +2106,9 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) Send some initialization data */ + // Send tool definitions + SendToolDef(m_con, peer_id, m_toolmgr); + // Send player info to all players SendPlayerInfos(); @@ -3594,6 +3597,29 @@ void Server::SendDeathscreen(con::Connection &con, u16 peer_id, con.Send(peer_id, 0, data, true); } +void Server::SendToolDef(con::Connection &con, u16 peer_id, + IToolDefManager *tooldef) +{ + DSTACK(__FUNCTION_NAME); + std::ostringstream os(std::ios_base::binary); + + /* + u16 command + u32 length of the next item + serialized ToolDefManager + */ + writeU16(os, TOCLIENT_TOOLDEF); + std::ostringstream tmp_os(std::ios::binary); + tooldef->serialize(tmp_os); + os< data((u8*)s.c_str(), s.size()); + // Send as reliable + con.Send(peer_id, 0, data, true); +} + /* Non-static send methods */ diff --git a/src/server.h b/src/server.h index e1a58382..4b17887e 100644 --- a/src/server.h +++ b/src/server.h @@ -508,6 +508,8 @@ private: const std::wstring &reason); static void SendDeathscreen(con::Connection &con, u16 peer_id, bool set_camera_point_target, v3f camera_point_target); + static void SendToolDef(con::Connection &con, u16 peer_id, + IToolDefManager *tooldef); /* Non-static send methods diff --git a/src/tooldef.cpp b/src/tooldef.cpp index 1c85dbd8..1284a52a 100644 --- a/src/tooldef.cpp +++ b/src/tooldef.cpp @@ -85,11 +85,7 @@ class CToolDefManager: public IWritableToolDefManager public: virtual ~CToolDefManager() { - for(core::map::Iterator - i = m_tool_definitions.getIterator(); - i.atEnd() == false; i++){ - delete i.getNode()->getValue(); - } + clear(); } virtual const ToolDefinition* getToolDefinition(const std::string &toolname) const { @@ -123,16 +119,25 @@ public: virtual bool registerTool(std::string toolname, const ToolDefinition &def) { infostream<<"registerTool: registering tool \""<::Node *n; + /*core::map::Node *n; n = m_tool_definitions.find(toolname); if(n != NULL){ errorstream<<"registerTool: registering tool \""<::Iterator + i = m_tool_definitions.getIterator(); + i.atEnd() == false; i++){ + delete i.getNode()->getValue(); + } + m_tool_definitions.clear(); + } virtual void serialize(std::ostream &os) { writeU8(os, 0); // version @@ -153,6 +158,9 @@ public: } virtual void deSerialize(std::istream &is) { + // Clear everything + clear(); + // Deserialize int version = readU8(is); if(version != 0) throw SerializationError( "unsupported ToolDefManager version"); diff --git a/src/tooldef.h b/src/tooldef.h index 2c758d90..41ee1154 100644 --- a/src/tooldef.h +++ b/src/tooldef.h @@ -72,6 +72,8 @@ public: virtual std::string getImagename(const std::string &toolname) const =0; virtual ToolDiggingProperties getDiggingProperties( const std::string &toolname) const =0; + + virtual void serialize(std::ostream &os)=0; }; class IWritableToolDefManager : public IToolDefManager @@ -85,6 +87,7 @@ public: const std::string &toolname) const =0; virtual bool registerTool(std::string toolname, const ToolDefinition &def)=0; + virtual void clear()=0; virtual void serialize(std::ostream &os)=0; virtual void deSerialize(std::istream &is)=0;