Network Layer 7 rework (Packet handling)
* Move networkcode to a dedicated directory * Rename clientserver.h to network/networkprotocol.h (Better name) and sanitize some includes * Create object NetworkPacket * It stores command (opcode) and data separated * It also stores peer_id * Data reading can be done by using a streaming interface * Change packet routing analysis * Remove old conditional analysis * Now uses function pointed analysis and add connection state ({Client,Server}::handlers) * Connection state permit to categorize condition to handle before analyze packets * Create a handler for depreciated messages, instead of duplicating codemaster
parent
15c037614f
commit
a704c04f00
|
@ -429,6 +429,9 @@ set(common_SRCS
|
||||||
version.cpp
|
version.cpp
|
||||||
voxel.cpp
|
voxel.cpp
|
||||||
voxelalgorithms.cpp
|
voxelalgorithms.cpp
|
||||||
|
network/networkpacket.cpp
|
||||||
|
network/serveropcodes.cpp
|
||||||
|
network/toserverpacket.cpp
|
||||||
${JTHREAD_SRCS}
|
${JTHREAD_SRCS}
|
||||||
${common_SCRIPT_SRCS}
|
${common_SCRIPT_SRCS}
|
||||||
${UTIL_SRCS}
|
${UTIL_SRCS}
|
||||||
|
@ -491,6 +494,8 @@ set(minetest_SRCS
|
||||||
sky.cpp
|
sky.cpp
|
||||||
tile.cpp
|
tile.cpp
|
||||||
wieldmesh.cpp
|
wieldmesh.cpp
|
||||||
|
network/clientopcodes.cpp
|
||||||
|
network/toclientpacket.cpp
|
||||||
${minetest_SCRIPT_SRCS}
|
${minetest_SCRIPT_SRCS}
|
||||||
)
|
)
|
||||||
list(SORT minetest_SRCS)
|
list(SORT minetest_SRCS)
|
||||||
|
|
2005
src/client.cpp
2005
src/client.cpp
File diff suppressed because it is too large
Load Diff
52
src/client.h
52
src/client.h
|
@ -34,6 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "localplayer.h"
|
#include "localplayer.h"
|
||||||
#include "hud.h"
|
#include "hud.h"
|
||||||
#include "particles.h"
|
#include "particles.h"
|
||||||
|
#include "network/toclientpacket.h"
|
||||||
|
|
||||||
struct MeshMakeData;
|
struct MeshMakeData;
|
||||||
class MapBlockMesh;
|
class MapBlockMesh;
|
||||||
|
@ -341,7 +342,57 @@ public:
|
||||||
*/
|
*/
|
||||||
void step(float dtime);
|
void step(float dtime);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Command Handlers
|
||||||
|
*/
|
||||||
|
|
||||||
|
void handleCommand(ToClientPacket* pkt);
|
||||||
|
|
||||||
|
void handleCommand_Null(ToClientPacket* pkt) {};
|
||||||
|
void handleCommand_Deprecated(ToClientPacket* pkt);
|
||||||
|
void handleCommand_Init(ToClientPacket* pkt);
|
||||||
|
void handleCommand_AccessDenied(ToClientPacket* pkt);
|
||||||
|
void handleCommand_RemoveNode(ToClientPacket* pkt);
|
||||||
|
void handleCommand_AddNode(ToClientPacket* pkt);
|
||||||
|
void handleCommand_BlockData(ToClientPacket* pkt);
|
||||||
|
void handleCommand_Inventory(ToClientPacket* pkt);
|
||||||
|
void handleCommand_TimeOfDay(ToClientPacket* pkt);
|
||||||
|
void handleCommand_ChatMessage(ToClientPacket* pkt);
|
||||||
|
void handleCommand_ActiveObjectRemoveAdd(ToClientPacket* pkt);
|
||||||
|
void handleCommand_ActiveObjectMessages(ToClientPacket* pkt);
|
||||||
|
void handleCommand_Movement(ToClientPacket* pkt);
|
||||||
|
void handleCommand_HP(ToClientPacket* pkt);
|
||||||
|
void handleCommand_Breath(ToClientPacket* pkt);
|
||||||
|
void handleCommand_MovePlayer(ToClientPacket* pkt);
|
||||||
|
void handleCommand_PlayerItem(ToClientPacket* pkt);
|
||||||
|
void handleCommand_DeathScreen(ToClientPacket* pkt);
|
||||||
|
void handleCommand_AnnounceMedia(ToClientPacket* pkt);
|
||||||
|
void handleCommand_Media(ToClientPacket* pkt);
|
||||||
|
void handleCommand_ToolDef(ToClientPacket* pkt);
|
||||||
|
void handleCommand_NodeDef(ToClientPacket* pkt);
|
||||||
|
void handleCommand_CraftItemDef(ToClientPacket* pkt);
|
||||||
|
void handleCommand_ItemDef(ToClientPacket* pkt);
|
||||||
|
void handleCommand_PlaySound(ToClientPacket* pkt);
|
||||||
|
void handleCommand_StopSound(ToClientPacket* pkt);
|
||||||
|
void handleCommand_Privileges(ToClientPacket* pkt);
|
||||||
|
void handleCommand_InventoryFormSpec(ToClientPacket* pkt);
|
||||||
|
void handleCommand_DetachedInventory(ToClientPacket* pkt);
|
||||||
|
void handleCommand_ShowFormSpec(ToClientPacket* pkt);
|
||||||
|
void handleCommand_SpawnParticle(ToClientPacket* pkt);
|
||||||
|
void handleCommand_AddParticleSpawner(ToClientPacket* pkt);
|
||||||
|
void handleCommand_DeleteParticleSpawner(ToClientPacket* pkt);
|
||||||
|
void handleCommand_HudAdd(ToClientPacket* pkt);
|
||||||
|
void handleCommand_HudRemove(ToClientPacket* pkt);
|
||||||
|
void handleCommand_HudChange(ToClientPacket* pkt);
|
||||||
|
void handleCommand_HudSetFlags(ToClientPacket* pkt);
|
||||||
|
void handleCommand_HudSetParam(ToClientPacket* pkt);
|
||||||
|
void handleCommand_HudSetSky(ToClientPacket* pkt);
|
||||||
|
void handleCommand_OverrideDayNightRatio(ToClientPacket* pkt);
|
||||||
|
void handleCommand_LocalPlayerAnimations(ToClientPacket* pkt);
|
||||||
|
void handleCommand_EyeOffset(ToClientPacket* pkt);
|
||||||
|
|
||||||
void ProcessData(u8 *data, u32 datasize, u16 sender_peer_id);
|
void ProcessData(u8 *data, u32 datasize, u16 sender_peer_id);
|
||||||
|
|
||||||
// Returns true if something was received
|
// Returns true if something was received
|
||||||
bool AsyncProcessPacket();
|
bool AsyncProcessPacket();
|
||||||
bool AsyncProcessData();
|
bool AsyncProcessData();
|
||||||
|
@ -577,4 +628,3 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // !CLIENT_HEADER
|
#endif // !CLIENT_HEADER
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "util/string.h"
|
#include "util/string.h"
|
||||||
#include "httpfetch.h"
|
#include "httpfetch.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
#include "clientserver.h"
|
#include "network/networkprotocol.h"
|
||||||
#include "filecache.h"
|
#include "filecache.h"
|
||||||
#include "filesys.h"
|
#include "filesys.h"
|
||||||
#include "hex.h"
|
#include "hex.h"
|
||||||
|
|
|
@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
|
||||||
#include "filecache.h"
|
#include "filecache.h"
|
||||||
|
|
||||||
#include "clientserver.h"
|
#include "network/networkprotocol.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "filesys.h"
|
#include "filesys.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
|
@ -28,7 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "inventorymanager.h"
|
#include "inventorymanager.h"
|
||||||
#include "modalMenu.h"
|
#include "modalMenu.h"
|
||||||
#include "guiTable.h"
|
#include "guiTable.h"
|
||||||
#include "clientserver.h"
|
#include "network/networkprotocol.h"
|
||||||
|
|
||||||
class IGameDef;
|
class IGameDef;
|
||||||
class InventoryManager;
|
class InventoryManager;
|
||||||
|
|
|
@ -0,0 +1,110 @@
|
||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||||
|
Copyright (C) 2015 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
|
||||||
|
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 "clientopcodes.h"
|
||||||
|
|
||||||
|
const static ToClientCommandHandler null_command_handler = {"TOCLIENT_NULL", TOCLIENT_STATE_ALL, &Client::handleCommand_Null};
|
||||||
|
|
||||||
|
const ToClientCommandHandler toClientCommandTable[TOCLIENT_NUM_MSG_TYPES] =
|
||||||
|
{
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
{ "TOCLIENT_INIT", TOCLIENT_STATE_NOT_CONNECTED, &Client::handleCommand_Init }, // 0x10
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
{ "TOCLIENT_BLOCKDATA", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_BlockData }, // 0x20
|
||||||
|
{ "TOCLIENT_ADDNODE", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_AddNode }, // 0x21
|
||||||
|
{ "TOCLIENT_REMOVENODE", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_RemoveNode }, // 0x22
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
{ "TOCLIENT_INVENTORY", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_Inventory }, // 0x27
|
||||||
|
null_command_handler,
|
||||||
|
{ "TOCLIENT_TIME_OF_DAY", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_TimeOfDay }, // 0x29
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
null_command_handler,
|
||||||
|
{ "TOCLIENT_CHAT_MESSAGE", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_ChatMessage }, // 0x30
|
||||||
|
{ "TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_ActiveObjectRemoveAdd }, // 0x31
|
||||||
|
{ "TOCLIENT_ACTIVE_OBJECT_MESSAGES", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_ActiveObjectMessages }, // 0x32
|
||||||
|
{ "TOCLIENT_HP", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_HP }, // 0x33
|
||||||
|
{ "TOCLIENT_MOVE_PLAYER", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_MovePlayer }, // 0x34
|
||||||
|
{ "TOCLIENT_ACCESS_DENIED", TOCLIENT_STATE_NOT_CONNECTED, &Client::handleCommand_AccessDenied }, // 0x35
|
||||||
|
{ "TOCLIENT_PLAYERITEM", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_PlayerItem }, // 0x36
|
||||||
|
{ "TOCLIENT_DEATHSCREEN", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_DeathScreen }, // 0x37
|
||||||
|
{ "TOCLIENT_MEDIA", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_Media }, // 0x38
|
||||||
|
{ "TOCLIENT_TOOLDEF", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_ToolDef }, // 0x39
|
||||||
|
{ "TOCLIENT_NODEDEF", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_NodeDef }, // 0x3a
|
||||||
|
{ "TOCLIENT_CRAFTITEMDEF", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_CraftItemDef }, // 0x3b
|
||||||
|
{ "TOCLIENT_ANNOUNCE_MEDIA", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_AnnounceMedia }, // 0x3c
|
||||||
|
{ "TOCLIENT_ITEMDEF", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_ItemDef }, // 0x3d
|
||||||
|
null_command_handler,
|
||||||
|
{ "TOCLIENT_PLAY_SOUND", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_PlaySound }, // 0x3f
|
||||||
|
{ "TOCLIENT_STOP_SOUND", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_StopSound }, // 0x40
|
||||||
|
{ "TOCLIENT_PRIVILEGES", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_Privileges }, // 0x41
|
||||||
|
{ "TOCLIENT_INVENTORY_FORMSPEC", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_InventoryFormSpec }, // 0x42
|
||||||
|
{ "TOCLIENT_DETACHED_INVENTORY", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_DetachedInventory }, // 0x43
|
||||||
|
{ "TOCLIENT_SHOW_FORMSPEC", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_ShowFormSpec }, // 0x44
|
||||||
|
{ "TOCLIENT_MOVEMENT", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_Movement }, // 0x45
|
||||||
|
{ "TOCLIENT_SPAWN_PARTICLE", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_SpawnParticle }, // 0x46
|
||||||
|
{ "TOCLIENT_ADD_PARTICLESPAWNER", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_AddParticleSpawner }, // 0x47
|
||||||
|
{ "TOCLIENT_DELETE_PARTICLESPAWNER", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_DeleteParticleSpawner }, // 0x48
|
||||||
|
{ "TOCLIENT_HUDADD", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_HudAdd }, // 0x49
|
||||||
|
{ "TOCLIENT_HUDRM", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_HudRemove }, // 0x4a
|
||||||
|
{ "TOCLIENT_HUDCHANGE", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_HudChange }, // 0x4b
|
||||||
|
{ "TOCLIENT_HUD_SET_FLAGS", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_HudSetFlags }, // 0x4c
|
||||||
|
{ "TOCLIENT_HUD_SET_PARAM", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_HudSetParam }, // 0x4d
|
||||||
|
{ "TOCLIENT_BREATH", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_Breath }, // 0x4e
|
||||||
|
{ "TOCLIENT_SET_SKY", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_HudSetSky }, // 0x4f
|
||||||
|
{ "TOCLIENT_OVERRIDE_DAY_NIGHT_RATIO", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_OverrideDayNightRatio }, // 0x50
|
||||||
|
{ "TOCLIENT_LOCAL_PLAYER_ANIMATIONS", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_LocalPlayerAnimations }, // 0x51
|
||||||
|
{ "TOCLIENT_EYE_OFFSET", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_EyeOffset }, // 0x52
|
||||||
|
};
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||||
|
Copyright (C) 2015 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CLIENTOPCODES_HEADER
|
||||||
|
#define CLIENTOPCODES_HEADER
|
||||||
|
|
||||||
|
#include "client.h"
|
||||||
|
#include "networkprotocol.h"
|
||||||
|
#include "toclientpacket.h"
|
||||||
|
|
||||||
|
enum ToClientConnectionState {
|
||||||
|
TOCLIENT_STATE_NOT_CONNECTED,
|
||||||
|
TOCLIENT_STATE_CONNECTED,
|
||||||
|
TOCLIENT_STATE_ALL,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ToClientCommandHandler
|
||||||
|
{
|
||||||
|
char const* name;
|
||||||
|
ToClientConnectionState state;
|
||||||
|
void (Client::*handler)(ToClientPacket* pkt);
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const ToClientCommandHandler toClientCommandTable[TOCLIENT_NUM_MSG_TYPES];
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,301 @@
|
||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||||
|
Copyright (C) 2015 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
|
||||||
|
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 "networkpacket.h"
|
||||||
|
#include "debug.h"
|
||||||
|
#include "util/serialize.h"
|
||||||
|
|
||||||
|
NetworkPacket::NetworkPacket(u8 *data, u32 datasize, u16 peer_id):
|
||||||
|
m_peer_id(peer_id)
|
||||||
|
{
|
||||||
|
m_read_offset = 0;
|
||||||
|
m_datasize = datasize - 2;
|
||||||
|
|
||||||
|
// Copy data packet to remove opcode
|
||||||
|
m_data = new u8[m_datasize];
|
||||||
|
|
||||||
|
memcpy(m_data, &data[2], m_datasize);
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPacket::~NetworkPacket()
|
||||||
|
{
|
||||||
|
delete [] m_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* NetworkPacket::getString(u32 from_offset)
|
||||||
|
{
|
||||||
|
assert(from_offset < m_datasize);
|
||||||
|
|
||||||
|
return (char*)&m_data[from_offset];
|
||||||
|
}
|
||||||
|
|
||||||
|
char NetworkPacket::getChar(u32 offset)
|
||||||
|
{
|
||||||
|
assert(offset < m_datasize);
|
||||||
|
|
||||||
|
return m_data[offset];
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPacket& NetworkPacket::operator>>(std::string& dst)
|
||||||
|
{
|
||||||
|
u16 strLen = readU16(&m_data[m_read_offset]);
|
||||||
|
m_read_offset += sizeof(u16);
|
||||||
|
|
||||||
|
dst.clear();
|
||||||
|
|
||||||
|
if (strLen == 0) {
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
dst.reserve(strLen);
|
||||||
|
dst.append((char*)&m_data[m_read_offset], strLen);
|
||||||
|
|
||||||
|
m_read_offset += strLen*sizeof(char);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPacket& NetworkPacket::operator>>(std::wstring& dst)
|
||||||
|
{
|
||||||
|
u16 strLen = readU16(&m_data[m_read_offset]);
|
||||||
|
m_read_offset += sizeof(u16);
|
||||||
|
|
||||||
|
dst.clear();
|
||||||
|
|
||||||
|
if (strLen == 0) {
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
dst.reserve(strLen);
|
||||||
|
for(u16 i=0; i<strLen; i++) {
|
||||||
|
wchar_t c16 = readU16(&m_data[m_read_offset]);
|
||||||
|
dst.append(&c16, 1);
|
||||||
|
m_read_offset += sizeof(u16);
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string NetworkPacket::readLongString()
|
||||||
|
{
|
||||||
|
u32 strLen = readU32(&m_data[m_read_offset]);
|
||||||
|
m_read_offset += sizeof(u32);
|
||||||
|
|
||||||
|
if (strLen == 0) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string dst;
|
||||||
|
|
||||||
|
dst.reserve(strLen);
|
||||||
|
dst.append((char*)&m_data[m_read_offset], strLen);
|
||||||
|
|
||||||
|
m_read_offset += strLen*sizeof(char);
|
||||||
|
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPacket& NetworkPacket::operator>>(char& dst)
|
||||||
|
{
|
||||||
|
dst = getChar(m_read_offset);
|
||||||
|
|
||||||
|
m_read_offset += sizeof(char);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
u8* NetworkPacket::getU8Ptr(u32 from_offset)
|
||||||
|
{
|
||||||
|
assert(from_offset < m_datasize);
|
||||||
|
|
||||||
|
return (u8*)&m_data[from_offset];
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 NetworkPacket::getU8(u32 offset)
|
||||||
|
{
|
||||||
|
assert(offset < m_datasize);
|
||||||
|
|
||||||
|
return m_data[offset];
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPacket& NetworkPacket::operator>>(u8& dst)
|
||||||
|
{
|
||||||
|
assert(m_read_offset < m_datasize);
|
||||||
|
dst = m_data[m_read_offset];
|
||||||
|
|
||||||
|
m_read_offset += sizeof(u8);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPacket& NetworkPacket::operator>>(bool& dst)
|
||||||
|
{
|
||||||
|
assert(m_read_offset < m_datasize);
|
||||||
|
dst = m_data[m_read_offset];
|
||||||
|
|
||||||
|
m_read_offset += sizeof(u8);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
u16 NetworkPacket::getU16(u32 from_offset)
|
||||||
|
{
|
||||||
|
assert(from_offset < m_datasize);
|
||||||
|
|
||||||
|
return readU16(&m_data[from_offset]);
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPacket& NetworkPacket::operator>>(u16& dst)
|
||||||
|
{
|
||||||
|
dst = getU16(m_read_offset);
|
||||||
|
|
||||||
|
m_read_offset += sizeof(u16);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 NetworkPacket::getU32(u32 from_offset)
|
||||||
|
{
|
||||||
|
assert(from_offset < m_datasize);
|
||||||
|
|
||||||
|
return readU32(&m_data[from_offset]);
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPacket& NetworkPacket::operator>>(u32& dst)
|
||||||
|
{
|
||||||
|
dst = getU32(m_read_offset);
|
||||||
|
|
||||||
|
m_read_offset += sizeof(u32);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 NetworkPacket::getU64(u32 from_offset)
|
||||||
|
{
|
||||||
|
assert(from_offset < m_datasize);
|
||||||
|
|
||||||
|
return readU64(&m_data[from_offset]);
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPacket& NetworkPacket::operator>>(u64& dst)
|
||||||
|
{
|
||||||
|
dst = getU64(m_read_offset);
|
||||||
|
|
||||||
|
m_read_offset += sizeof(u64);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
float NetworkPacket::getF1000(u32 from_offset)
|
||||||
|
{
|
||||||
|
assert(from_offset < m_datasize);
|
||||||
|
|
||||||
|
return readF1000(&m_data[from_offset]);
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPacket& NetworkPacket::operator>>(float& dst)
|
||||||
|
{
|
||||||
|
dst = getF1000(m_read_offset);
|
||||||
|
|
||||||
|
m_read_offset += sizeof(float);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPacket& NetworkPacket::operator>>(v2f& dst)
|
||||||
|
{
|
||||||
|
assert(m_read_offset < m_datasize);
|
||||||
|
|
||||||
|
dst = readV2F1000(&m_data[m_read_offset]);
|
||||||
|
|
||||||
|
m_read_offset += sizeof(v2f);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPacket& NetworkPacket::operator>>(v3f& dst)
|
||||||
|
{
|
||||||
|
assert(m_read_offset < m_datasize);
|
||||||
|
|
||||||
|
dst = readV3F1000(&m_data[m_read_offset]);
|
||||||
|
|
||||||
|
m_read_offset += sizeof(v3f);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
s16 NetworkPacket::getS16(u32 from_offset)
|
||||||
|
{
|
||||||
|
assert(from_offset < m_datasize);
|
||||||
|
|
||||||
|
return readS16(&m_data[from_offset]);
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPacket& NetworkPacket::operator>>(s16& dst)
|
||||||
|
{
|
||||||
|
dst = getS16(m_read_offset);
|
||||||
|
|
||||||
|
m_read_offset += sizeof(s16);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
s32 NetworkPacket::getS32(u32 from_offset)
|
||||||
|
{
|
||||||
|
assert(from_offset < m_datasize);
|
||||||
|
|
||||||
|
return readS32(&m_data[from_offset]);
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPacket& NetworkPacket::operator>>(s32& dst)
|
||||||
|
{
|
||||||
|
dst = getS32(m_read_offset);
|
||||||
|
|
||||||
|
m_read_offset += sizeof(s32);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPacket& NetworkPacket::operator>>(v2s32& dst)
|
||||||
|
{
|
||||||
|
dst = readV2S32(&m_data[m_read_offset]);
|
||||||
|
|
||||||
|
m_read_offset += sizeof(v2s32);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
v3s16 NetworkPacket::getV3S16(u32 from_offset)
|
||||||
|
{
|
||||||
|
assert(from_offset < m_datasize);
|
||||||
|
|
||||||
|
return readV3S16(&m_data[from_offset]);
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPacket& NetworkPacket::operator>>(v3s16& dst)
|
||||||
|
{
|
||||||
|
dst = getV3S16(m_read_offset);
|
||||||
|
|
||||||
|
m_read_offset += sizeof(v3s16);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
v3s32 NetworkPacket::getV3S32(u32 from_offset)
|
||||||
|
{
|
||||||
|
assert(from_offset < m_datasize);
|
||||||
|
|
||||||
|
return readV3S32(&m_data[from_offset]);
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPacket& NetworkPacket::operator>>(v3s32& dst)
|
||||||
|
{
|
||||||
|
dst = getV3S32(m_read_offset);
|
||||||
|
|
||||||
|
m_read_offset += sizeof(v3s32);
|
||||||
|
return *this;
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||||
|
Copyright (C) 2015 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NETWORKPACKET_HEADER
|
||||||
|
#define NETWORKPACKET_HEADER
|
||||||
|
|
||||||
|
#include "util/numeric.h"
|
||||||
|
#include "networkprotocol.h"
|
||||||
|
|
||||||
|
class NetworkPacket
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
NetworkPacket(u8 *data, u32 datasize, u16 peer_id);
|
||||||
|
~NetworkPacket();
|
||||||
|
|
||||||
|
// Getters
|
||||||
|
u32 getSize() { return m_datasize; }
|
||||||
|
u16 getPeerId() { return m_peer_id; }
|
||||||
|
|
||||||
|
// Data extractors
|
||||||
|
char* getString(u32 from_offset);
|
||||||
|
NetworkPacket& operator>>(std::string& dst);
|
||||||
|
NetworkPacket& operator>>(std::wstring& dst);
|
||||||
|
std::string readLongString();
|
||||||
|
|
||||||
|
char getChar(u32 offset);
|
||||||
|
NetworkPacket& operator>>(char& dst);
|
||||||
|
|
||||||
|
NetworkPacket& operator>>(bool& dst);
|
||||||
|
|
||||||
|
u8 getU8(u32 offset);
|
||||||
|
NetworkPacket& operator>>(u8& dst);
|
||||||
|
|
||||||
|
u8* getU8Ptr(u32 offset);
|
||||||
|
u16 getU16(u32 from_offset);
|
||||||
|
NetworkPacket& operator>>(u16& dst);
|
||||||
|
u32 getU32(u32 from_offset);
|
||||||
|
NetworkPacket& operator>>(u32& dst);
|
||||||
|
u64 getU64(u32 from_offset);
|
||||||
|
NetworkPacket& operator>>(u64& dst);
|
||||||
|
|
||||||
|
float getF1000(u32 offset);
|
||||||
|
NetworkPacket& operator>>(float& dst);
|
||||||
|
NetworkPacket& operator>>(v2f& dst);
|
||||||
|
NetworkPacket& operator>>(v3f& dst);
|
||||||
|
|
||||||
|
s16 getS16(u32 from_offset);
|
||||||
|
NetworkPacket& operator>>(s16& dst);
|
||||||
|
s32 getS32(u32 from_offset);
|
||||||
|
NetworkPacket& operator>>(s32& dst);
|
||||||
|
|
||||||
|
NetworkPacket& operator>>(v2s32& dst);
|
||||||
|
|
||||||
|
v3s16 getV3S16(u32 from_offset);
|
||||||
|
NetworkPacket& operator>>(v3s16& dst);
|
||||||
|
|
||||||
|
v3s32 getV3S32(u32 from_offset);
|
||||||
|
NetworkPacket& operator>>(v3s32& dst);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
u8 *m_data;
|
||||||
|
u32 m_datasize;
|
||||||
|
u32 m_read_offset;
|
||||||
|
private:
|
||||||
|
u16 m_peer_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -17,8 +17,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CLIENTSERVER_HEADER
|
#ifndef NETWORKPROTOCOL_HEADER
|
||||||
#define CLIENTSERVER_HEADER
|
#define NETWORKPROTOCOL_HEADER
|
||||||
#include "util/string.h"
|
#include "util/string.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -556,6 +556,8 @@ enum ToClientCommand
|
||||||
v3f1000 first
|
v3f1000 first
|
||||||
v3f1000 third
|
v3f1000 third
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
TOCLIENT_NUM_MSG_TYPES = 0x53,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ToServerCommand
|
enum ToServerCommand
|
||||||
|
@ -795,7 +797,8 @@ enum ToServerCommand
|
||||||
u16 len
|
u16 len
|
||||||
u8[len] full_version_string
|
u8[len] full_version_string
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
TOSERVER_NUM_MSG_TYPES = 0x44,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||||
|
Copyright (C) 2015 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
|
||||||
|
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 "serveropcodes.h"
|
||||||
|
|
||||||
|
const static ToServerCommandHandler null_command_handler = { "TOSERVER_NULL", TOSERVER_STATE_ALL, &Server::handleCommand_Null };
|
||||||
|
|
||||||
|
const ToServerCommandHandler toServerCommandTable[TOSERVER_NUM_MSG_TYPES] =
|
||||||
|
{
|
||||||
|
null_command_handler, // 0x00
|
||||||
|
null_command_handler, // 0x01
|
||||||
|
null_command_handler, // 0x02
|
||||||
|
null_command_handler, // 0x03
|
||||||
|
null_command_handler, // 0x04
|
||||||
|
null_command_handler, // 0x05
|
||||||
|
null_command_handler, // 0x06
|
||||||
|
null_command_handler, // 0x07
|
||||||
|
null_command_handler, // 0x08
|
||||||
|
null_command_handler, // 0x09
|
||||||
|
null_command_handler, // 0x0a
|
||||||
|
null_command_handler, // 0x0b
|
||||||
|
null_command_handler, // 0x0c
|
||||||
|
null_command_handler, // 0x0d
|
||||||
|
null_command_handler, // 0x0e
|
||||||
|
null_command_handler, // 0x0f
|
||||||
|
{ "TOSERVER_INIT", TOSERVER_STATE_NOT_CONNECTED, &Server::handleCommand_Init }, // 0x10
|
||||||
|
{ "TOSERVER_INIT2", TOSERVER_STATE_NOT_CONNECTED, &Server::handleCommand_Init2 }, // 0x11
|
||||||
|
null_command_handler, // 0x12
|
||||||
|
null_command_handler, // 0x13
|
||||||
|
null_command_handler, // 0x14
|
||||||
|
null_command_handler, // 0x15
|
||||||
|
null_command_handler, // 0x16
|
||||||
|
null_command_handler, // 0x17
|
||||||
|
null_command_handler, // 0x18
|
||||||
|
null_command_handler, // 0x19
|
||||||
|
null_command_handler, // 0x1a
|
||||||
|
null_command_handler, // 0x1b
|
||||||
|
null_command_handler, // 0x1c
|
||||||
|
null_command_handler, // 0x1d
|
||||||
|
null_command_handler, // 0x1e
|
||||||
|
null_command_handler, // 0x1f
|
||||||
|
null_command_handler, // 0x20
|
||||||
|
null_command_handler, // 0x21
|
||||||
|
null_command_handler, // 0x22
|
||||||
|
{ "TOSERVER_PLAYERPOS", TOSERVER_STATE_INGAME, &Server::handleCommand_PlayerPos }, // 0x23
|
||||||
|
{ "TOSERVER_GOTBLOCKS", TOSERVER_STATE_STARTUP, &Server::handleCommand_GotBlocks }, // 0x24
|
||||||
|
{ "TOSERVER_DELETEDBLOCKS", TOSERVER_STATE_INGAME, &Server::handleCommand_DeletedBlocks }, // 0x25
|
||||||
|
null_command_handler, // 0x26
|
||||||
|
{ "TOSERVER_CLICK_OBJECT", TOSERVER_STATE_INGAME, &Server::handleCommand_Deprecated }, // 0x27
|
||||||
|
{ "TOSERVER_GROUND_ACTION", TOSERVER_STATE_INGAME, &Server::handleCommand_Deprecated }, // 0x28
|
||||||
|
{ "TOSERVER_RELEASE", TOSERVER_STATE_INGAME, &Server::handleCommand_Deprecated }, // 0x29
|
||||||
|
null_command_handler, // 0x2a
|
||||||
|
null_command_handler, // 0x2b
|
||||||
|
null_command_handler, // 0x2c
|
||||||
|
null_command_handler, // 0x2d
|
||||||
|
null_command_handler, // 0x2e
|
||||||
|
null_command_handler, // 0x2f
|
||||||
|
{ "TOSERVER_SIGNTEXT", TOSERVER_STATE_INGAME, &Server::handleCommand_Deprecated }, // 0x30
|
||||||
|
{ "TOSERVER_INVENTORY_ACTION", TOSERVER_STATE_INGAME, &Server::handleCommand_InventoryAction }, // 0x31
|
||||||
|
{ "TOSERVER_CHAT_MESSAGE", TOSERVER_STATE_INGAME, &Server::handleCommand_ChatMessage }, // 0x32
|
||||||
|
{ "TOSERVER_SIGNNODETEXT", TOSERVER_STATE_INGAME, &Server::handleCommand_Deprecated }, // 0x33
|
||||||
|
{ "TOSERVER_CLICK_ACTIVEOBJECT", TOSERVER_STATE_INGAME, &Server::handleCommand_Deprecated }, // 0x34
|
||||||
|
{ "TOSERVER_DAMAGE", TOSERVER_STATE_INGAME, &Server::handleCommand_Damage }, // 0x35
|
||||||
|
{ "TOSERVER_PASSWORD", TOSERVER_STATE_INGAME, &Server::handleCommand_Password }, // 0x36
|
||||||
|
{ "TOSERVER_PLAYERITEM", TOSERVER_STATE_INGAME, &Server::handleCommand_PlayerItem }, // 0x37
|
||||||
|
{ "TOSERVER_RESPAWN", TOSERVER_STATE_INGAME, &Server::handleCommand_Respawn }, // 0x38
|
||||||
|
{ "TOSERVER_INTERACT", TOSERVER_STATE_INGAME, &Server::handleCommand_Interact }, // 0x39
|
||||||
|
{ "TOSERVER_REMOVED_SOUNDS", TOSERVER_STATE_INGAME, &Server::handleCommand_RemovedSounds }, // 0x3a
|
||||||
|
{ "TOSERVER_NODEMETA_FIELDS", TOSERVER_STATE_INGAME, &Server::handleCommand_NodeMetaFields }, // 0x3b
|
||||||
|
{ "TOSERVER_INVENTORY_FIELDS", TOSERVER_STATE_INGAME, &Server::handleCommand_InventoryFields }, // 0x3c
|
||||||
|
null_command_handler, // 0x3d
|
||||||
|
null_command_handler, // 0x3e
|
||||||
|
null_command_handler, // 0x3f
|
||||||
|
{ "TOSERVER_REQUEST_MEDIA", TOSERVER_STATE_STARTUP, &Server::handleCommand_RequestMedia }, // 0x40
|
||||||
|
{ "TOSERVER_RECEIVED_MEDIA", TOSERVER_STATE_STARTUP, &Server::handleCommand_ReceivedMedia }, // 0x41
|
||||||
|
{ "TOSERVER_BREATH", TOSERVER_STATE_INGAME, &Server::handleCommand_Breath }, // 0x42
|
||||||
|
{ "TOSERVER_CLIENT_READY", TOSERVER_STATE_STARTUP, &Server::handleCommand_ClientReady }, // 0x43
|
||||||
|
};
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||||
|
Copyright (C) 2015 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SERVEROPCODES_HEADER
|
||||||
|
#define SERVEROPCODES_HEADER
|
||||||
|
|
||||||
|
#include "server.h"
|
||||||
|
#include "networkprotocol.h"
|
||||||
|
#include "toserverpacket.h"
|
||||||
|
|
||||||
|
enum ToServerConnectionState {
|
||||||
|
TOSERVER_STATE_NOT_CONNECTED,
|
||||||
|
TOSERVER_STATE_STARTUP,
|
||||||
|
TOSERVER_STATE_INGAME,
|
||||||
|
TOSERVER_STATE_ALL,
|
||||||
|
};
|
||||||
|
struct ToServerCommandHandler
|
||||||
|
{
|
||||||
|
const std::string name;
|
||||||
|
ToServerConnectionState state;
|
||||||
|
void (Server::*handler)(ToServerPacket* pkt);
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const ToServerCommandHandler toServerCommandTable[TOSERVER_NUM_MSG_TYPES];
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||||
|
Copyright (C) 2015 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
|
||||||
|
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 "toclientpacket.h"
|
||||||
|
#include "util/serialize.h"
|
||||||
|
|
||||||
|
ToClientPacket::ToClientPacket(u8 *data, u32 datasize, u16 peer_id):
|
||||||
|
NetworkPacket(data, datasize, peer_id)
|
||||||
|
{
|
||||||
|
m_command = (ToClientCommand)readU16(&data[0]);
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||||
|
Copyright (C) 2015 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TOCLIENTPACKET_HEADER
|
||||||
|
#define TOCLIENTPACKET_HEADER
|
||||||
|
|
||||||
|
#include "util/numeric.h"
|
||||||
|
#include "networkprotocol.h"
|
||||||
|
#include "networkpacket.h"
|
||||||
|
|
||||||
|
class ToClientPacket: public NetworkPacket
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ToClientPacket(u8 *data, u32 datasize, u16 peer_id);
|
||||||
|
ToClientCommand getCommand() { return m_command; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
ToClientCommand m_command;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||||
|
Copyright (C) 2015 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
|
||||||
|
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 "toserverpacket.h"
|
||||||
|
#include "util/serialize.h"
|
||||||
|
|
||||||
|
ToServerPacket::ToServerPacket(u8 *data, u32 datasize, u16 peer_id):
|
||||||
|
NetworkPacket(data, datasize, peer_id)
|
||||||
|
{
|
||||||
|
m_command = (ToServerCommand)readU16(&data[0]);
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||||
|
Copyright (C) 2015 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TOSERVERPACKET_HEADER
|
||||||
|
#define TOSERVERPACKET_HEADER
|
||||||
|
|
||||||
|
#include "util/numeric.h"
|
||||||
|
#include "networkprotocol.h"
|
||||||
|
#include "networkpacket.h"
|
||||||
|
|
||||||
|
class ToServerPacket: public NetworkPacket
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ToServerPacket(u8 *data, u32 datasize, u16 peer_id);
|
||||||
|
ToServerCommand getCommand() { return m_command; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
ToServerCommand m_command;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
3018
src/server.cpp
3018
src/server.cpp
File diff suppressed because it is too large
Load Diff
38
src/server.h
38
src/server.h
|
@ -33,6 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "util/thread.h"
|
#include "util/thread.h"
|
||||||
#include "environment.h"
|
#include "environment.h"
|
||||||
#include "clientiface.h"
|
#include "clientiface.h"
|
||||||
|
#include "network/toserverpacket.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
@ -187,6 +188,35 @@ public:
|
||||||
void AsyncRunStep(bool initial_step=false);
|
void AsyncRunStep(bool initial_step=false);
|
||||||
void Receive();
|
void Receive();
|
||||||
PlayerSAO* StageTwoClientInit(u16 peer_id);
|
PlayerSAO* StageTwoClientInit(u16 peer_id);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Command Handlers
|
||||||
|
*/
|
||||||
|
|
||||||
|
void handleCommand(ToServerPacket* pkt);
|
||||||
|
|
||||||
|
void handleCommand_Null(ToServerPacket* pkt) {};
|
||||||
|
void handleCommand_Deprecated(ToServerPacket* pkt);
|
||||||
|
void handleCommand_Init(ToServerPacket* pkt);
|
||||||
|
void handleCommand_Init2(ToServerPacket* pkt);
|
||||||
|
void handleCommand_RequestMedia(ToServerPacket* pkt);
|
||||||
|
void handleCommand_ReceivedMedia(ToServerPacket* pkt);
|
||||||
|
void handleCommand_ClientReady(ToServerPacket* pkt);
|
||||||
|
void handleCommand_GotBlocks(ToServerPacket* pkt);
|
||||||
|
void handleCommand_PlayerPos(ToServerPacket* pkt);
|
||||||
|
void handleCommand_DeletedBlocks(ToServerPacket* pkt);
|
||||||
|
void handleCommand_InventoryAction(ToServerPacket* pkt);
|
||||||
|
void handleCommand_ChatMessage(ToServerPacket* pkt);
|
||||||
|
void handleCommand_Damage(ToServerPacket* pkt);
|
||||||
|
void handleCommand_Breath(ToServerPacket* pkt);
|
||||||
|
void handleCommand_Password(ToServerPacket* pkt);
|
||||||
|
void handleCommand_PlayerItem(ToServerPacket* pkt);
|
||||||
|
void handleCommand_Respawn(ToServerPacket* pkt);
|
||||||
|
void handleCommand_Interact(ToServerPacket* pkt);
|
||||||
|
void handleCommand_RemovedSounds(ToServerPacket* pkt);
|
||||||
|
void handleCommand_NodeMetaFields(ToServerPacket* pkt);
|
||||||
|
void handleCommand_InventoryFields(ToServerPacket* pkt);
|
||||||
|
|
||||||
void ProcessData(u8 *data, u32 datasize, u16 peer_id);
|
void ProcessData(u8 *data, u32 datasize, u16 peer_id);
|
||||||
|
|
||||||
// Environment must be locked when called
|
// Environment must be locked when called
|
||||||
|
@ -309,7 +339,7 @@ public:
|
||||||
bool showFormspec(const char *name, const std::string &formspec, const std::string &formname);
|
bool showFormspec(const char *name, const std::string &formspec, const std::string &formname);
|
||||||
Map & getMap() { return m_env->getMap(); }
|
Map & getMap() { return m_env->getMap(); }
|
||||||
ServerEnvironment & getEnv() { return *m_env; }
|
ServerEnvironment & getEnv() { return *m_env; }
|
||||||
|
|
||||||
u32 hudAdd(Player *player, HudElement *element);
|
u32 hudAdd(Player *player, HudElement *element);
|
||||||
bool hudRemove(Player *player, u32 id);
|
bool hudRemove(Player *player, u32 id);
|
||||||
bool hudChange(Player *player, u32 id, HudElementStat stat, void *value);
|
bool hudChange(Player *player, u32 id, HudElementStat stat, void *value);
|
||||||
|
@ -320,13 +350,13 @@ public:
|
||||||
|
|
||||||
inline Address getPeerAddress(u16 peer_id)
|
inline Address getPeerAddress(u16 peer_id)
|
||||||
{ return m_con.GetPeerAddress(peer_id); }
|
{ return m_con.GetPeerAddress(peer_id); }
|
||||||
|
|
||||||
bool setLocalPlayerAnimations(Player *player, v2s32 animation_frames[4], f32 frame_speed);
|
bool setLocalPlayerAnimations(Player *player, v2s32 animation_frames[4], f32 frame_speed);
|
||||||
bool setPlayerEyeOffset(Player *player, v3f first, v3f third);
|
bool setPlayerEyeOffset(Player *player, v3f first, v3f third);
|
||||||
|
|
||||||
bool setSky(Player *player, const video::SColor &bgcolor,
|
bool setSky(Player *player, const video::SColor &bgcolor,
|
||||||
const std::string &type, const std::vector<std::string> ¶ms);
|
const std::string &type, const std::vector<std::string> ¶ms);
|
||||||
|
|
||||||
bool overrideDayNightRatio(Player *player, bool do_override,
|
bool overrideDayNightRatio(Player *player, bool do_override,
|
||||||
float brightness);
|
float brightness);
|
||||||
|
|
||||||
|
@ -379,7 +409,7 @@ private:
|
||||||
void SendSetSky(u16 peer_id, const video::SColor &bgcolor,
|
void SendSetSky(u16 peer_id, const video::SColor &bgcolor,
|
||||||
const std::string &type, const std::vector<std::string> ¶ms);
|
const std::string &type, const std::vector<std::string> ¶ms);
|
||||||
void SendOverrideDayNightRatio(u16 peer_id, bool do_override, float ratio);
|
void SendOverrideDayNightRatio(u16 peer_id, bool do_override, float ratio);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Send a node removal/addition event to all clients except ignore_id.
|
Send a node removal/addition event to all clients except ignore_id.
|
||||||
Additionally, if far_players!=NULL, players further away than
|
Additionally, if far_players!=NULL, players further away than
|
||||||
|
|
|
@ -42,7 +42,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "util/numeric.h"
|
#include "util/numeric.h"
|
||||||
#include "util/serialize.h"
|
#include "util/serialize.h"
|
||||||
#include "noise.h" // PseudoRandom used for random data for compression
|
#include "noise.h" // PseudoRandom used for random data for compression
|
||||||
#include "clientserver.h" // LATEST_PROTOCOL_VERSION
|
#include "network/networkprotocol.h" // LATEST_PROTOCOL_VERSION
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue