Tool definition transfer to client

This commit is contained in:
Perttu Ahola 2011-11-15 01:00:16 +02:00
parent 0754f2a7af
commit 4b8e4dae58
7 changed files with 92 additions and 9 deletions

View File

@ -452,7 +452,7 @@ void Client::step(float dtime)
snprintf((char*)&data[23], PASSWORD_SIZE, "%s", m_password.c_str()); snprintf((char*)&data[23], PASSWORD_SIZE, "%s", m_password.c_str());
// This should be incremented in each version // This should be incremented in each version
writeU16(&data[51], 3); writeU16(&data[51], PROTOCOL_VERSION);
// Send as unreliable // Send as unreliable
Send(0, data, false); 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; event.deathscreen.camera_point_target_z = camera_point_target.Z;
m_client_event_queue.push_back(event); m_client_event_queue.push_back(event);
} }
else if(command == TOCLIENT_TOOLDEF)
{
infostream<<"Client: Received tool definitions"<<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_tooldef->deSerialize(tmp_is);
// Resume threads
m_mesh_update_thread.setRun(true);
m_mesh_update_thread.Start();
}
else else
{ {
infostream<<"Client: Ignoring unknown command " infostream<<"Client: Ignoring unknown command "

View File

@ -22,7 +22,16 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "utility.h" #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 #define PROTOCOL_ID 0x4f457403
@ -181,6 +190,19 @@ enum ToClientCommand
u8 bool set camera point target u8 bool set camera point target
v3f1000 camera point target (to point the death cause or whatever) 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 enum ToServerCommand

View File

@ -660,6 +660,8 @@ void the_game(
server = new Server(map_dir, configpath); server = new Server(map_dir, configpath);
server->start(port); server->start(port);
} }
{ // Client scope
/* /*
Create client Create client
@ -2341,8 +2343,11 @@ void the_game(
gui_shuttingdowntext->remove();*/ gui_shuttingdowntext->remove();*/
} }
} // Client scope (must be destructed before destructing *def and tsrc
delete tooldef; delete tooldef;
delete tsrc; delete tsrc;
delete nodedef;
} }

View File

@ -2106,6 +2106,9 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
Send some initialization data Send some initialization data
*/ */
// Send tool definitions
SendToolDef(m_con, peer_id, m_toolmgr);
// Send player info to all players // Send player info to all players
SendPlayerInfos(); SendPlayerInfos();
@ -3594,6 +3597,29 @@ void Server::SendDeathscreen(con::Connection &con, u16 peer_id,
con.Send(peer_id, 0, data, true); 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<<serializeLongString(tmp_os.str());
// Make data buffer
std::string s = os.str();
SharedBuffer<u8> data((u8*)s.c_str(), s.size());
// Send as reliable
con.Send(peer_id, 0, data, true);
}
/* /*
Non-static send methods Non-static send methods
*/ */

View File

@ -508,6 +508,8 @@ private:
const std::wstring &reason); const std::wstring &reason);
static void SendDeathscreen(con::Connection &con, u16 peer_id, static void SendDeathscreen(con::Connection &con, u16 peer_id,
bool set_camera_point_target, v3f camera_point_target); bool set_camera_point_target, v3f camera_point_target);
static void SendToolDef(con::Connection &con, u16 peer_id,
IToolDefManager *tooldef);
/* /*
Non-static send methods Non-static send methods

View File

@ -85,11 +85,7 @@ class CToolDefManager: public IWritableToolDefManager
public: public:
virtual ~CToolDefManager() virtual ~CToolDefManager()
{ {
for(core::map<std::string, ToolDefinition*>::Iterator clear();
i = m_tool_definitions.getIterator();
i.atEnd() == false; i++){
delete i.getNode()->getValue();
}
} }
virtual const ToolDefinition* getToolDefinition(const std::string &toolname) const virtual const ToolDefinition* getToolDefinition(const std::string &toolname) const
{ {
@ -123,16 +119,25 @@ public:
virtual bool registerTool(std::string toolname, const ToolDefinition &def) virtual bool registerTool(std::string toolname, const ToolDefinition &def)
{ {
infostream<<"registerTool: registering tool \""<<toolname<<"\""<<std::endl; infostream<<"registerTool: registering tool \""<<toolname<<"\""<<std::endl;
core::map<std::string, ToolDefinition*>::Node *n; /*core::map<std::string, ToolDefinition*>::Node *n;
n = m_tool_definitions.find(toolname); n = m_tool_definitions.find(toolname);
if(n != NULL){ if(n != NULL){
errorstream<<"registerTool: registering tool \""<<toolname errorstream<<"registerTool: registering tool \""<<toolname
<<"\" failed: name is already registered"<<std::endl; <<"\" failed: name is already registered"<<std::endl;
return false; return false;
} }*/
m_tool_definitions[toolname] = new ToolDefinition(def); m_tool_definitions[toolname] = new ToolDefinition(def);
return true; return true;
} }
virtual void clear()
{
for(core::map<std::string, ToolDefinition*>::Iterator
i = m_tool_definitions.getIterator();
i.atEnd() == false; i++){
delete i.getNode()->getValue();
}
m_tool_definitions.clear();
}
virtual void serialize(std::ostream &os) virtual void serialize(std::ostream &os)
{ {
writeU8(os, 0); // version writeU8(os, 0); // version
@ -153,6 +158,9 @@ public:
} }
virtual void deSerialize(std::istream &is) virtual void deSerialize(std::istream &is)
{ {
// Clear everything
clear();
// Deserialize
int version = readU8(is); int version = readU8(is);
if(version != 0) throw SerializationError( if(version != 0) throw SerializationError(
"unsupported ToolDefManager version"); "unsupported ToolDefManager version");

View File

@ -72,6 +72,8 @@ public:
virtual std::string getImagename(const std::string &toolname) const =0; virtual std::string getImagename(const std::string &toolname) const =0;
virtual ToolDiggingProperties getDiggingProperties( virtual ToolDiggingProperties getDiggingProperties(
const std::string &toolname) const =0; const std::string &toolname) const =0;
virtual void serialize(std::ostream &os)=0;
}; };
class IWritableToolDefManager : public IToolDefManager class IWritableToolDefManager : public IToolDefManager
@ -85,6 +87,7 @@ public:
const std::string &toolname) const =0; const std::string &toolname) const =0;
virtual bool registerTool(std::string toolname, const ToolDefinition &def)=0; virtual bool registerTool(std::string toolname, const ToolDefinition &def)=0;
virtual void clear()=0;
virtual void serialize(std::ostream &os)=0; virtual void serialize(std::ostream &os)=0;
virtual void deSerialize(std::istream &is)=0; virtual void deSerialize(std::istream &is)=0;