mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 01:05:48 +01: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:
		@@ -429,6 +429,9 @@ set(common_SRCS
 | 
			
		||||
	version.cpp
 | 
			
		||||
	voxel.cpp
 | 
			
		||||
	voxelalgorithms.cpp
 | 
			
		||||
	network/networkpacket.cpp
 | 
			
		||||
	network/serveropcodes.cpp
 | 
			
		||||
	network/toserverpacket.cpp
 | 
			
		||||
	${JTHREAD_SRCS}
 | 
			
		||||
	${common_SCRIPT_SRCS}
 | 
			
		||||
	${UTIL_SRCS}
 | 
			
		||||
@@ -491,6 +494,8 @@ set(minetest_SRCS
 | 
			
		||||
	sky.cpp
 | 
			
		||||
	tile.cpp
 | 
			
		||||
	wieldmesh.cpp
 | 
			
		||||
	network/clientopcodes.cpp
 | 
			
		||||
	network/toclientpacket.cpp
 | 
			
		||||
	${minetest_SCRIPT_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 "hud.h"
 | 
			
		||||
#include "particles.h"
 | 
			
		||||
#include "network/toclientpacket.h"
 | 
			
		||||
 | 
			
		||||
struct MeshMakeData;
 | 
			
		||||
class MapBlockMesh;
 | 
			
		||||
@@ -341,7 +342,57 @@ public:
 | 
			
		||||
	*/
 | 
			
		||||
	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);
 | 
			
		||||
 | 
			
		||||
	// Returns true if something was received
 | 
			
		||||
	bool AsyncProcessPacket();
 | 
			
		||||
	bool AsyncProcessData();
 | 
			
		||||
@@ -577,4 +628,3 @@ private:
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // !CLIENT_HEADER
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
#include "util/string.h"
 | 
			
		||||
#include "httpfetch.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
#include "clientserver.h"
 | 
			
		||||
#include "network/networkprotocol.h"
 | 
			
		||||
#include "filecache.h"
 | 
			
		||||
#include "filesys.h"
 | 
			
		||||
#include "hex.h"
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
 | 
			
		||||
#include "filecache.h"
 | 
			
		||||
 | 
			
		||||
#include "clientserver.h"
 | 
			
		||||
#include "network/networkprotocol.h"
 | 
			
		||||
#include "log.h"
 | 
			
		||||
#include "filesys.h"
 | 
			
		||||
#include <string>
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
#include "inventorymanager.h"
 | 
			
		||||
#include "modalMenu.h"
 | 
			
		||||
#include "guiTable.h"
 | 
			
		||||
#include "clientserver.h"
 | 
			
		||||
#include "network/networkprotocol.h"
 | 
			
		||||
 | 
			
		||||
class IGameDef;
 | 
			
		||||
class InventoryManager;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
@@ -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.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef CLIENTSERVER_HEADER
 | 
			
		||||
#define CLIENTSERVER_HEADER
 | 
			
		||||
#ifndef NETWORKPROTOCOL_HEADER
 | 
			
		||||
#define NETWORKPROTOCOL_HEADER
 | 
			
		||||
#include "util/string.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@@ -556,6 +556,8 @@ enum ToClientCommand
 | 
			
		||||
		v3f1000 first
 | 
			
		||||
		v3f1000 third
 | 
			
		||||
	*/
 | 
			
		||||
 | 
			
		||||
	TOCLIENT_NUM_MSG_TYPES = 0x53,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum ToServerCommand
 | 
			
		||||
@@ -795,7 +797,8 @@ enum ToServerCommand
 | 
			
		||||
		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
 | 
			
		||||
							
								
								
									
										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 "environment.h"
 | 
			
		||||
#include "clientiface.h"
 | 
			
		||||
#include "network/toserverpacket.h"
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <list>
 | 
			
		||||
#include <map>
 | 
			
		||||
@@ -187,6 +188,35 @@ public:
 | 
			
		||||
	void AsyncRunStep(bool initial_step=false);
 | 
			
		||||
	void Receive();
 | 
			
		||||
	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);
 | 
			
		||||
 | 
			
		||||
	// Environment must be locked when called
 | 
			
		||||
@@ -309,7 +339,7 @@ public:
 | 
			
		||||
	bool showFormspec(const char *name, const std::string &formspec, const std::string &formname);
 | 
			
		||||
	Map & getMap() { return m_env->getMap(); }
 | 
			
		||||
	ServerEnvironment & getEnv() { return *m_env; }
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	u32 hudAdd(Player *player, HudElement *element);
 | 
			
		||||
	bool hudRemove(Player *player, u32 id);
 | 
			
		||||
	bool hudChange(Player *player, u32 id, HudElementStat stat, void *value);
 | 
			
		||||
@@ -320,13 +350,13 @@ public:
 | 
			
		||||
 | 
			
		||||
	inline Address getPeerAddress(u16 peer_id)
 | 
			
		||||
			{ return m_con.GetPeerAddress(peer_id); }
 | 
			
		||||
			
 | 
			
		||||
 | 
			
		||||
	bool setLocalPlayerAnimations(Player *player, v2s32 animation_frames[4], f32 frame_speed);
 | 
			
		||||
	bool setPlayerEyeOffset(Player *player, v3f first, v3f third);
 | 
			
		||||
 | 
			
		||||
	bool setSky(Player *player, const video::SColor &bgcolor,
 | 
			
		||||
			const std::string &type, const std::vector<std::string> ¶ms);
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	bool overrideDayNightRatio(Player *player, bool do_override,
 | 
			
		||||
			float brightness);
 | 
			
		||||
 | 
			
		||||
@@ -379,7 +409,7 @@ private:
 | 
			
		||||
	void SendSetSky(u16 peer_id, const video::SColor &bgcolor,
 | 
			
		||||
			const std::string &type, const std::vector<std::string> ¶ms);
 | 
			
		||||
	void SendOverrideDayNightRatio(u16 peer_id, bool do_override, float ratio);
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
		Send a node removal/addition event to all clients except ignore_id.
 | 
			
		||||
		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/serialize.h"
 | 
			
		||||
#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>
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user