mirror of
https://github.com/luanti-org/luanti.git
synced 2025-08-01 17:38:41 +00:00
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 code
This commit is contained in:
parent
15c037614f
commit
a704c04f00
20 changed files with 3519 additions and 2426 deletions
110
src/network/clientopcodes.cpp
Normal file
110
src/network/clientopcodes.cpp
Normal file
|
@ -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
|
||||
};
|
43
src/network/clientopcodes.h
Normal file
43
src/network/clientopcodes.h
Normal file
|
@ -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
|
301
src/network/networkpacket.cpp
Normal file
301
src/network/networkpacket.cpp
Normal file
|
@ -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;
|
||||
}
|
86
src/network/networkpacket.h
Normal file
86
src/network/networkpacket.h
Normal file
|
@ -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
|
804
src/network/networkprotocol.h
Normal file
804
src/network/networkprotocol.h
Normal file
|
@ -0,0 +1,804 @@
|
|||
/*
|
||||
Minetest
|
||||
Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||
|
||||
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 NETWORKPROTOCOL_HEADER
|
||||
#define NETWORKPROTOCOL_HEADER
|
||||
#include "util/string.h"
|
||||
|
||||
/*
|
||||
changes by PROTOCOL_VERSION:
|
||||
|
||||
PROTOCOL_VERSION 3:
|
||||
Base for writing changes here
|
||||
PROTOCOL_VERSION 4:
|
||||
Add TOCLIENT_MEDIA
|
||||
Add TOCLIENT_TOOLDEF
|
||||
Add TOCLIENT_NODEDEF
|
||||
Add TOCLIENT_CRAFTITEMDEF
|
||||
Add TOSERVER_INTERACT
|
||||
Obsolete TOSERVER_CLICK_ACTIVEOBJECT
|
||||
Obsolete TOSERVER_GROUND_ACTION
|
||||
PROTOCOL_VERSION 5:
|
||||
Make players to be handled mostly as ActiveObjects
|
||||
PROTOCOL_VERSION 6:
|
||||
Only non-cached textures are sent
|
||||
PROTOCOL_VERSION 7:
|
||||
Add TOCLIENT_ITEMDEF
|
||||
Obsolete TOCLIENT_TOOLDEF
|
||||
Obsolete TOCLIENT_CRAFTITEMDEF
|
||||
Compress the contents of TOCLIENT_ITEMDEF and TOCLIENT_NODEDEF
|
||||
PROTOCOL_VERSION 8:
|
||||
Digging based on item groups
|
||||
Many things
|
||||
PROTOCOL_VERSION 9:
|
||||
ContentFeatures and NodeDefManager use a different serialization
|
||||
format; better for future version cross-compatibility
|
||||
Many things
|
||||
PROTOCOL_VERSION 10:
|
||||
TOCLIENT_PRIVILEGES
|
||||
Version raised to force 'fly' and 'fast' privileges into effect.
|
||||
Node metadata change (came in later; somewhat incompatible)
|
||||
PROTOCOL_VERSION 11:
|
||||
TileDef in ContentFeatures
|
||||
Nodebox drawtype
|
||||
(some dev snapshot)
|
||||
TOCLIENT_INVENTORY_FORMSPEC
|
||||
(0.4.0, 0.4.1)
|
||||
PROTOCOL_VERSION 12:
|
||||
TOSERVER_INVENTORY_FIELDS
|
||||
16-bit node ids
|
||||
TOCLIENT_DETACHED_INVENTORY
|
||||
PROTOCOL_VERSION 13:
|
||||
InventoryList field "Width" (deserialization fails with old versions)
|
||||
PROTOCOL_VERSION 14:
|
||||
Added transfer of player pressed keys to the server
|
||||
Added new messages for mesh and bone animation, as well as attachments
|
||||
GENERIC_CMD_SET_ANIMATION
|
||||
GENERIC_CMD_SET_BONE_POSITION
|
||||
GENERIC_CMD_SET_ATTACHMENT
|
||||
PROTOCOL_VERSION 15:
|
||||
Serialization format changes
|
||||
PROTOCOL_VERSION 16:
|
||||
TOCLIENT_SHOW_FORMSPEC
|
||||
PROTOCOL_VERSION 17:
|
||||
Serialization format change: include backface_culling flag in TileDef
|
||||
Added rightclickable field in nodedef
|
||||
TOCLIENT_SPAWN_PARTICLE
|
||||
TOCLIENT_ADD_PARTICLESPAWNER
|
||||
TOCLIENT_DELETE_PARTICLESPAWNER
|
||||
PROTOCOL_VERSION 18:
|
||||
damageGroups added to ToolCapabilities
|
||||
sound_place added to ItemDefinition
|
||||
PROTOCOL_VERSION 19:
|
||||
GENERIC_CMD_SET_PHYSICS_OVERRIDE
|
||||
PROTOCOL_VERSION 20:
|
||||
TOCLIENT_HUDADD
|
||||
TOCLIENT_HUDRM
|
||||
TOCLIENT_HUDCHANGE
|
||||
TOCLIENT_HUD_SET_FLAGS
|
||||
PROTOCOL_VERSION 21:
|
||||
TOCLIENT_BREATH
|
||||
TOSERVER_BREATH
|
||||
range added to ItemDefinition
|
||||
drowning, leveled and liquid_range added to ContentFeatures
|
||||
stepheight and collideWithObjects added to object properties
|
||||
version, heat and humidity transfer in MapBock
|
||||
automatic_face_movement_dir and automatic_face_movement_dir_offset
|
||||
added to object properties
|
||||
PROTOCOL_VERSION 22:
|
||||
add swap_node
|
||||
PROTOCOL_VERSION 23:
|
||||
TOSERVER_CLIENT_READY
|
||||
PROTOCOL_VERSION 24:
|
||||
ContentFeatures version 7
|
||||
ContentFeatures: change number of special tiles to 6 (CF_SPECIAL_COUNT)
|
||||
*/
|
||||
|
||||
#define LATEST_PROTOCOL_VERSION 24
|
||||
|
||||
// Server's supported network protocol range
|
||||
#define SERVER_PROTOCOL_VERSION_MIN 13
|
||||
#define SERVER_PROTOCOL_VERSION_MAX LATEST_PROTOCOL_VERSION
|
||||
|
||||
// Client's supported network protocol range
|
||||
#define CLIENT_PROTOCOL_VERSION_MIN 13
|
||||
#define CLIENT_PROTOCOL_VERSION_MAX LATEST_PROTOCOL_VERSION
|
||||
|
||||
// Constant that differentiates the protocol from random data and other protocols
|
||||
#define PROTOCOL_ID 0x4f457403
|
||||
|
||||
#define PASSWORD_SIZE 28 // Maximum password length. Allows for
|
||||
// base64-encoded SHA-1 (27+\0).
|
||||
|
||||
#define FORMSPEC_API_VERSION 1
|
||||
#define FORMSPEC_VERSION_STRING "formspec_version[" TOSTRING(FORMSPEC_API_VERSION) "]"
|
||||
|
||||
#define TEXTURENAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.-"
|
||||
|
||||
enum ToClientCommand
|
||||
{
|
||||
TOCLIENT_INIT = 0x10,
|
||||
/*
|
||||
Server's reply to TOSERVER_INIT.
|
||||
Sent second after connected.
|
||||
|
||||
[0] u16 TOSERVER_INIT
|
||||
[2] u8 deployed version
|
||||
[3] v3s16 player's position + v3f(0,BS/2,0) floatToInt'd
|
||||
[12] u64 map seed (new as of 2011-02-27)
|
||||
[20] f1000 recommended send interval (in seconds) (new as of 14)
|
||||
|
||||
NOTE: The position in here is deprecated; position is
|
||||
explicitly sent afterwards
|
||||
*/
|
||||
|
||||
TOCLIENT_BLOCKDATA = 0x20, //TODO: Multiple blocks
|
||||
TOCLIENT_ADDNODE = 0x21,
|
||||
/*
|
||||
u16 command
|
||||
v3s16 position
|
||||
serialized mapnode
|
||||
u8 keep_metadata // Added in protocol version 22
|
||||
*/
|
||||
TOCLIENT_REMOVENODE = 0x22,
|
||||
|
||||
TOCLIENT_PLAYERPOS = 0x23, // Obsolete
|
||||
/*
|
||||
[0] u16 command
|
||||
// Followed by an arbitary number of these:
|
||||
// Number is determined from packet length.
|
||||
[N] u16 peer_id
|
||||
[N+2] v3s32 position*100
|
||||
[N+2+12] v3s32 speed*100
|
||||
[N+2+12+12] s32 pitch*100
|
||||
[N+2+12+12+4] s32 yaw*100
|
||||
*/
|
||||
|
||||
TOCLIENT_PLAYERINFO = 0x24, // Obsolete
|
||||
/*
|
||||
[0] u16 command
|
||||
// Followed by an arbitary number of these:
|
||||
// Number is determined from packet length.
|
||||
[N] u16 peer_id
|
||||
[N] char[20] name
|
||||
*/
|
||||
|
||||
TOCLIENT_OPT_BLOCK_NOT_FOUND = 0x25, // Obsolete
|
||||
|
||||
TOCLIENT_SECTORMETA = 0x26, // Obsolete
|
||||
/*
|
||||
[0] u16 command
|
||||
[2] u8 sector count
|
||||
[3...] v2s16 pos + sector metadata
|
||||
*/
|
||||
|
||||
TOCLIENT_INVENTORY = 0x27,
|
||||
/*
|
||||
[0] u16 command
|
||||
[2] serialized inventory
|
||||
*/
|
||||
|
||||
TOCLIENT_OBJECTDATA = 0x28, // Obsolete
|
||||
/*
|
||||
Sent as unreliable.
|
||||
|
||||
u16 command
|
||||
u16 number of player positions
|
||||
for each player:
|
||||
u16 peer_id
|
||||
v3s32 position*100
|
||||
v3s32 speed*100
|
||||
s32 pitch*100
|
||||
s32 yaw*100
|
||||
u16 count of blocks
|
||||
for each block:
|
||||
v3s16 blockpos
|
||||
block objects
|
||||
*/
|
||||
|
||||
TOCLIENT_TIME_OF_DAY = 0x29,
|
||||
/*
|
||||
u16 command
|
||||
u16 time (0-23999)
|
||||
Added in a later version:
|
||||
f1000 time_speed
|
||||
*/
|
||||
|
||||
// (oops, there is some gap here)
|
||||
|
||||
TOCLIENT_CHAT_MESSAGE = 0x30,
|
||||
/*
|
||||
u16 command
|
||||
u16 length
|
||||
wstring message
|
||||
*/
|
||||
|
||||
TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD = 0x31,
|
||||
/*
|
||||
u16 command
|
||||
u16 count of removed objects
|
||||
for all removed objects {
|
||||
u16 id
|
||||
}
|
||||
u16 count of added objects
|
||||
for all added objects {
|
||||
u16 id
|
||||
u8 type
|
||||
u32 initialization data length
|
||||
string initialization data
|
||||
}
|
||||
*/
|
||||
|
||||
TOCLIENT_ACTIVE_OBJECT_MESSAGES = 0x32,
|
||||
/*
|
||||
u16 command
|
||||
for all objects
|
||||
{
|
||||
u16 id
|
||||
u16 message length
|
||||
string message
|
||||
}
|
||||
*/
|
||||
|
||||
TOCLIENT_HP = 0x33,
|
||||
/*
|
||||
u16 command
|
||||
u8 hp
|
||||
*/
|
||||
|
||||
TOCLIENT_MOVE_PLAYER = 0x34,
|
||||
/*
|
||||
u16 command
|
||||
v3f1000 player position
|
||||
f1000 player pitch
|
||||
f1000 player yaw
|
||||
*/
|
||||
|
||||
TOCLIENT_ACCESS_DENIED = 0x35,
|
||||
/*
|
||||
u16 command
|
||||
u16 reason_length
|
||||
wstring reason
|
||||
*/
|
||||
|
||||
TOCLIENT_PLAYERITEM = 0x36, // Obsolete
|
||||
/*
|
||||
u16 command
|
||||
u16 count of player items
|
||||
for all player items {
|
||||
u16 peer id
|
||||
u16 length of serialized item
|
||||
string serialized item
|
||||
}
|
||||
*/
|
||||
|
||||
TOCLIENT_DEATHSCREEN = 0x37,
|
||||
/*
|
||||
u16 command
|
||||
u8 bool set camera point target
|
||||
v3f1000 camera point target (to point the death cause or whatever)
|
||||
*/
|
||||
|
||||
TOCLIENT_MEDIA = 0x38,
|
||||
/*
|
||||
u16 command
|
||||
u16 total number of texture bunches
|
||||
u16 index of this bunch
|
||||
u32 number of files in this bunch
|
||||
for each file {
|
||||
u16 length of name
|
||||
string name
|
||||
u32 length of data
|
||||
data
|
||||
}
|
||||
u16 length of remote media server url (if applicable)
|
||||
string url
|
||||
*/
|
||||
|
||||
TOCLIENT_TOOLDEF = 0x39,
|
||||
/*
|
||||
u16 command
|
||||
u32 length of the next item
|
||||
serialized ToolDefManager
|
||||
*/
|
||||
|
||||
TOCLIENT_NODEDEF = 0x3a,
|
||||
/*
|
||||
u16 command
|
||||
u32 length of the next item
|
||||
serialized NodeDefManager
|
||||
*/
|
||||
|
||||
TOCLIENT_CRAFTITEMDEF = 0x3b,
|
||||
/*
|
||||
u16 command
|
||||
u32 length of the next item
|
||||
serialized CraftiItemDefManager
|
||||
*/
|
||||
|
||||
TOCLIENT_ANNOUNCE_MEDIA = 0x3c,
|
||||
|
||||
/*
|
||||
u16 command
|
||||
u32 number of files
|
||||
for each texture {
|
||||
u16 length of name
|
||||
string name
|
||||
u16 length of sha1_digest
|
||||
string sha1_digest
|
||||
}
|
||||
*/
|
||||
|
||||
TOCLIENT_ITEMDEF = 0x3d,
|
||||
/*
|
||||
u16 command
|
||||
u32 length of next item
|
||||
serialized ItemDefManager
|
||||
*/
|
||||
|
||||
TOCLIENT_PLAY_SOUND = 0x3f,
|
||||
/*
|
||||
u16 command
|
||||
s32 sound_id
|
||||
u16 len
|
||||
u8[len] sound name
|
||||
s32 gain*1000
|
||||
u8 type (0=local, 1=positional, 2=object)
|
||||
s32[3] pos_nodes*10000
|
||||
u16 object_id
|
||||
u8 loop (bool)
|
||||
*/
|
||||
|
||||
TOCLIENT_STOP_SOUND = 0x40,
|
||||
/*
|
||||
u16 command
|
||||
s32 sound_id
|
||||
*/
|
||||
|
||||
TOCLIENT_PRIVILEGES = 0x41,
|
||||
/*
|
||||
u16 command
|
||||
u16 number of privileges
|
||||
for each privilege
|
||||
u16 len
|
||||
u8[len] privilege
|
||||
*/
|
||||
|
||||
TOCLIENT_INVENTORY_FORMSPEC = 0x42,
|
||||
/*
|
||||
u16 command
|
||||
u32 len
|
||||
u8[len] formspec
|
||||
*/
|
||||
|
||||
TOCLIENT_DETACHED_INVENTORY = 0x43,
|
||||
/*
|
||||
[0] u16 command
|
||||
u16 len
|
||||
u8[len] name
|
||||
[2] serialized inventory
|
||||
*/
|
||||
|
||||
TOCLIENT_SHOW_FORMSPEC = 0x44,
|
||||
/*
|
||||
[0] u16 command
|
||||
u32 len
|
||||
u8[len] formspec
|
||||
u16 len
|
||||
u8[len] formname
|
||||
*/
|
||||
|
||||
TOCLIENT_MOVEMENT = 0x45,
|
||||
/*
|
||||
u16 command
|
||||
f1000 movement_acceleration_default
|
||||
f1000 movement_acceleration_air
|
||||
f1000 movement_acceleration_fast
|
||||
f1000 movement_speed_walk
|
||||
f1000 movement_speed_crouch
|
||||
f1000 movement_speed_fast
|
||||
f1000 movement_speed_climb
|
||||
f1000 movement_speed_jump
|
||||
f1000 movement_liquid_fluidity
|
||||
f1000 movement_liquid_fluidity_smooth
|
||||
f1000 movement_liquid_sink
|
||||
f1000 movement_gravity
|
||||
*/
|
||||
|
||||
TOCLIENT_SPAWN_PARTICLE = 0x46,
|
||||
/*
|
||||
u16 command
|
||||
v3f1000 pos
|
||||
v3f1000 velocity
|
||||
v3f1000 acceleration
|
||||
f1000 expirationtime
|
||||
f1000 size
|
||||
u8 bool collisiondetection
|
||||
u8 bool vertical
|
||||
u32 len
|
||||
u8[len] texture
|
||||
*/
|
||||
|
||||
TOCLIENT_ADD_PARTICLESPAWNER = 0x47,
|
||||
/*
|
||||
u16 command
|
||||
u16 amount
|
||||
f1000 spawntime
|
||||
v3f1000 minpos
|
||||
v3f1000 maxpos
|
||||
v3f1000 minvel
|
||||
v3f1000 maxvel
|
||||
v3f1000 minacc
|
||||
v3f1000 maxacc
|
||||
f1000 minexptime
|
||||
f1000 maxexptime
|
||||
f1000 minsize
|
||||
f1000 maxsize
|
||||
u8 bool collisiondetection
|
||||
u8 bool vertical
|
||||
u32 len
|
||||
u8[len] texture
|
||||
u32 id
|
||||
*/
|
||||
|
||||
TOCLIENT_DELETE_PARTICLESPAWNER = 0x48,
|
||||
/*
|
||||
u16 command
|
||||
u32 id
|
||||
*/
|
||||
|
||||
TOCLIENT_HUDADD = 0x49,
|
||||
/*
|
||||
u16 command
|
||||
u32 id
|
||||
u8 type
|
||||
v2f1000 pos
|
||||
u32 len
|
||||
u8[len] name
|
||||
v2f1000 scale
|
||||
u32 len2
|
||||
u8[len2] text
|
||||
u32 number
|
||||
u32 item
|
||||
u32 dir
|
||||
v2f1000 align
|
||||
v2f1000 offset
|
||||
v3f1000 world_pos
|
||||
v2s32 size
|
||||
*/
|
||||
|
||||
TOCLIENT_HUDRM = 0x4a,
|
||||
/*
|
||||
u16 command
|
||||
u32 id
|
||||
*/
|
||||
|
||||
TOCLIENT_HUDCHANGE = 0x4b,
|
||||
/*
|
||||
u16 command
|
||||
u32 id
|
||||
u8 stat
|
||||
[v2f1000 data |
|
||||
u32 len
|
||||
u8[len] data |
|
||||
u32 data]
|
||||
*/
|
||||
|
||||
TOCLIENT_HUD_SET_FLAGS = 0x4c,
|
||||
/*
|
||||
u16 command
|
||||
u32 flags
|
||||
u32 mask
|
||||
*/
|
||||
|
||||
TOCLIENT_HUD_SET_PARAM = 0x4d,
|
||||
/*
|
||||
u16 command
|
||||
u16 param
|
||||
u16 len
|
||||
u8[len] value
|
||||
*/
|
||||
|
||||
TOCLIENT_BREATH = 0x4e,
|
||||
/*
|
||||
u16 command
|
||||
u16 breath
|
||||
*/
|
||||
|
||||
TOCLIENT_SET_SKY = 0x4f,
|
||||
/*
|
||||
u16 command
|
||||
u8[4] color (ARGB)
|
||||
u8 len
|
||||
u8[len] type
|
||||
u16 count
|
||||
foreach count:
|
||||
u8 len
|
||||
u8[len] param
|
||||
*/
|
||||
|
||||
TOCLIENT_OVERRIDE_DAY_NIGHT_RATIO = 0x50,
|
||||
/*
|
||||
u16 command
|
||||
u8 do_override (boolean)
|
||||
u16 day-night ratio 0...65535
|
||||
*/
|
||||
|
||||
TOCLIENT_LOCAL_PLAYER_ANIMATIONS = 0x51,
|
||||
/*
|
||||
u16 command
|
||||
v2s32 stand/idle
|
||||
v2s32 walk
|
||||
v2s32 dig
|
||||
v2s32 walk+dig
|
||||
f1000 frame_speed
|
||||
*/
|
||||
|
||||
TOCLIENT_EYE_OFFSET = 0x52,
|
||||
/*
|
||||
u16 command
|
||||
v3f1000 first
|
||||
v3f1000 third
|
||||
*/
|
||||
|
||||
TOCLIENT_NUM_MSG_TYPES = 0x53,
|
||||
};
|
||||
|
||||
enum ToServerCommand
|
||||
{
|
||||
TOSERVER_INIT=0x10,
|
||||
/*
|
||||
Sent first after connected.
|
||||
|
||||
[0] u16 TOSERVER_INIT
|
||||
[2] u8 SER_FMT_VER_HIGHEST_READ
|
||||
[3] u8[20] player_name
|
||||
[23] u8[28] password (new in some version)
|
||||
[51] u16 minimum supported network protocol version (added sometime)
|
||||
[53] u16 maximum supported network protocol version (added later than the previous one)
|
||||
*/
|
||||
|
||||
TOSERVER_INIT2 = 0x11,
|
||||
/*
|
||||
Sent as an ACK for TOCLIENT_INIT.
|
||||
After this, the server can send data.
|
||||
|
||||
[0] u16 TOSERVER_INIT2
|
||||
*/
|
||||
|
||||
TOSERVER_GETBLOCK=0x20, // Obsolete
|
||||
TOSERVER_ADDNODE = 0x21, // Obsolete
|
||||
TOSERVER_REMOVENODE = 0x22, // Obsolete
|
||||
|
||||
TOSERVER_PLAYERPOS = 0x23,
|
||||
/*
|
||||
[0] u16 command
|
||||
[2] v3s32 position*100
|
||||
[2+12] v3s32 speed*100
|
||||
[2+12+12] s32 pitch*100
|
||||
[2+12+12+4] s32 yaw*100
|
||||
[2+12+12+4+4] u32 keyPressed
|
||||
*/
|
||||
|
||||
TOSERVER_GOTBLOCKS = 0x24,
|
||||
/*
|
||||
[0] u16 command
|
||||
[2] u8 count
|
||||
[3] v3s16 pos_0
|
||||
[3+6] v3s16 pos_1
|
||||
...
|
||||
*/
|
||||
|
||||
TOSERVER_DELETEDBLOCKS = 0x25,
|
||||
/*
|
||||
[0] u16 command
|
||||
[2] u8 count
|
||||
[3] v3s16 pos_0
|
||||
[3+6] v3s16 pos_1
|
||||
...
|
||||
*/
|
||||
|
||||
TOSERVER_ADDNODE_FROM_INVENTORY = 0x26, // Obsolete
|
||||
/*
|
||||
[0] u16 command
|
||||
[2] v3s16 pos
|
||||
[8] u16 i
|
||||
*/
|
||||
|
||||
TOSERVER_CLICK_OBJECT = 0x27, // Obsolete
|
||||
/*
|
||||
length: 13
|
||||
[0] u16 command
|
||||
[2] u8 button (0=left, 1=right)
|
||||
[3] v3s16 blockpos
|
||||
[9] s16 id
|
||||
[11] u16 item
|
||||
*/
|
||||
|
||||
TOSERVER_GROUND_ACTION = 0x28, // Obsolete
|
||||
/*
|
||||
length: 17
|
||||
[0] u16 command
|
||||
[2] u8 action
|
||||
[3] v3s16 nodepos_undersurface
|
||||
[9] v3s16 nodepos_abovesurface
|
||||
[15] u16 item
|
||||
actions:
|
||||
0: start digging (from undersurface)
|
||||
1: place block (to abovesurface)
|
||||
2: stop digging (all parameters ignored)
|
||||
3: digging completed
|
||||
*/
|
||||
|
||||
TOSERVER_RELEASE = 0x29, // Obsolete
|
||||
|
||||
// (oops, there is some gap here)
|
||||
|
||||
TOSERVER_SIGNTEXT = 0x30, // Old signs, obsolete
|
||||
/*
|
||||
u16 command
|
||||
v3s16 blockpos
|
||||
s16 id
|
||||
u16 textlen
|
||||
textdata
|
||||
*/
|
||||
|
||||
TOSERVER_INVENTORY_ACTION = 0x31,
|
||||
/*
|
||||
See InventoryAction in inventory.h
|
||||
*/
|
||||
|
||||
TOSERVER_CHAT_MESSAGE = 0x32,
|
||||
/*
|
||||
u16 command
|
||||
u16 length
|
||||
wstring message
|
||||
*/
|
||||
|
||||
TOSERVER_SIGNNODETEXT = 0x33, // obsolete
|
||||
/*
|
||||
u16 command
|
||||
v3s16 p
|
||||
u16 textlen
|
||||
textdata
|
||||
*/
|
||||
|
||||
TOSERVER_CLICK_ACTIVEOBJECT = 0x34, // Obsolete
|
||||
/*
|
||||
length: 7
|
||||
[0] u16 command
|
||||
[2] u8 button (0=left, 1=right)
|
||||
[3] u16 id
|
||||
[5] u16 item
|
||||
*/
|
||||
|
||||
TOSERVER_DAMAGE = 0x35,
|
||||
/*
|
||||
u16 command
|
||||
u8 amount
|
||||
*/
|
||||
|
||||
TOSERVER_PASSWORD=0x36,
|
||||
/*
|
||||
Sent to change password.
|
||||
|
||||
[0] u16 TOSERVER_PASSWORD
|
||||
[2] u8[28] old password
|
||||
[30] u8[28] new password
|
||||
*/
|
||||
|
||||
TOSERVER_PLAYERITEM=0x37,
|
||||
/*
|
||||
Sent to change selected item.
|
||||
|
||||
[0] u16 TOSERVER_PLAYERITEM
|
||||
[2] u16 item
|
||||
*/
|
||||
|
||||
TOSERVER_RESPAWN=0x38,
|
||||
/*
|
||||
u16 TOSERVER_RESPAWN
|
||||
*/
|
||||
|
||||
TOSERVER_INTERACT = 0x39,
|
||||
/*
|
||||
[0] u16 command
|
||||
[2] u8 action
|
||||
[3] u16 item
|
||||
[5] u32 length of the next item
|
||||
[9] serialized PointedThing
|
||||
actions:
|
||||
0: start digging (from undersurface) or use
|
||||
1: stop digging (all parameters ignored)
|
||||
2: digging completed
|
||||
3: place block or item (to abovesurface)
|
||||
4: use item
|
||||
|
||||
(Obsoletes TOSERVER_GROUND_ACTION and TOSERVER_CLICK_ACTIVEOBJECT.)
|
||||
*/
|
||||
|
||||
TOSERVER_REMOVED_SOUNDS = 0x3a,
|
||||
/*
|
||||
u16 command
|
||||
u16 len
|
||||
s32[len] sound_id
|
||||
*/
|
||||
|
||||
TOSERVER_NODEMETA_FIELDS = 0x3b,
|
||||
/*
|
||||
u16 command
|
||||
v3s16 p
|
||||
u16 len
|
||||
u8[len] form name (reserved for future use)
|
||||
u16 number of fields
|
||||
for each field:
|
||||
u16 len
|
||||
u8[len] field name
|
||||
u32 len
|
||||
u8[len] field value
|
||||
*/
|
||||
|
||||
TOSERVER_INVENTORY_FIELDS = 0x3c,
|
||||
/*
|
||||
u16 command
|
||||
u16 len
|
||||
u8[len] form name (reserved for future use)
|
||||
u16 number of fields
|
||||
for each field:
|
||||
u16 len
|
||||
u8[len] field name
|
||||
u32 len
|
||||
u8[len] field value
|
||||
*/
|
||||
|
||||
TOSERVER_REQUEST_MEDIA = 0x40,
|
||||
/*
|
||||
u16 command
|
||||
u16 number of files requested
|
||||
for each file {
|
||||
u16 length of name
|
||||
string name
|
||||
}
|
||||
*/
|
||||
|
||||
TOSERVER_RECEIVED_MEDIA = 0x41,
|
||||
/*
|
||||
u16 command
|
||||
*/
|
||||
|
||||
TOSERVER_BREATH = 0x42,
|
||||
/*
|
||||
u16 command
|
||||
u16 breath
|
||||
*/
|
||||
|
||||
TOSERVER_CLIENT_READY = 0x43,
|
||||
/*
|
||||
u8 major
|
||||
u8 minor
|
||||
u8 patch
|
||||
u8 reserved
|
||||
u16 len
|
||||
u8[len] full_version_string
|
||||
*/
|
||||
|
||||
TOSERVER_NUM_MSG_TYPES = 0x44,
|
||||
};
|
||||
|
||||
#endif
|
95
src/network/serveropcodes.cpp
Normal file
95
src/network/serveropcodes.cpp
Normal file
|
@ -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
|
||||
};
|
43
src/network/serveropcodes.h
Normal file
43
src/network/serveropcodes.h
Normal file
|
@ -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
|
28
src/network/toclientpacket.cpp
Normal file
28
src/network/toclientpacket.cpp
Normal file
|
@ -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]);
|
||||
}
|
38
src/network/toclientpacket.h
Normal file
38
src/network/toclientpacket.h
Normal file
|
@ -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
|
28
src/network/toserverpacket.cpp
Normal file
28
src/network/toserverpacket.cpp
Normal file
|
@ -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]);
|
||||
}
|
38
src/network/toserverpacket.h
Normal file
38
src/network/toserverpacket.h
Normal file
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue