Skip to content

Commit 9f3fc72

Browse files
committedMar 13, 2015
Handle the newly added TOCLIENT_ACCESS_DENIED and TOCLIENT_DELETE_PARTICLESPAWNER
* Rename the handlers from _Legacy to regular, because here we can use same handlers * Fix some packet names and pseudo handlers
1 parent 126f36c commit 9f3fc72

File tree

5 files changed

+156
-52
lines changed

5 files changed

+156
-52
lines changed
 

Diff for: ‎src/client.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
350350
void handleCommand_Null(NetworkPacket* pkt) {};
351351
void handleCommand_Deprecated(NetworkPacket* pkt);
352352
void handleCommand_Init(NetworkPacket* pkt);
353-
void handleCommand_AccessDenied_Legacy(NetworkPacket* pkt);
353+
void handleCommand_AccessDenied(NetworkPacket* pkt);
354354
void handleCommand_RemoveNode(NetworkPacket* pkt);
355355
void handleCommand_AddNode(NetworkPacket* pkt);
356356
void handleCommand_BlockData(NetworkPacket* pkt);
@@ -379,7 +379,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
379379
void handleCommand_ShowFormSpec(NetworkPacket* pkt);
380380
void handleCommand_SpawnParticle(NetworkPacket* pkt);
381381
void handleCommand_AddParticleSpawner(NetworkPacket* pkt);
382-
void handleCommand_DeleteParticleSpawner_Legacy(NetworkPacket* pkt);
382+
void handleCommand_DeleteParticleSpawner(NetworkPacket* pkt);
383383
void handleCommand_HudAdd(NetworkPacket* pkt);
384384
void handleCommand_HudRemove(NetworkPacket* pkt);
385385
void handleCommand_HudChange(NetworkPacket* pkt);

Diff for: ‎src/network/clientopcodes.cpp

+22-21
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,22 @@ const static ToClientCommandHandler null_command_handler = {"TOCLIENT_NULL", TOC
2424

2525
const ToClientCommandHandler toClientCommandTable[TOCLIENT_NUM_MSG_TYPES] =
2626
{
27-
null_command_handler,
28-
null_command_handler,
29-
null_command_handler,
30-
null_command_handler,
31-
null_command_handler,
32-
null_command_handler,
33-
null_command_handler,
34-
null_command_handler,
35-
null_command_handler,
36-
null_command_handler,
37-
null_command_handler,
38-
null_command_handler,
39-
null_command_handler,
40-
null_command_handler,
41-
null_command_handler,
42-
null_command_handler,
27+
null_command_handler, // 0x00 (never use this)
28+
null_command_handler, // 0x01
29+
null_command_handler, // 0x02
30+
null_command_handler, // 0x03
31+
null_command_handler, // 0x04
32+
null_command_handler, // 0x05
33+
null_command_handler, // 0x06
34+
null_command_handler, // 0x07
35+
null_command_handler, // 0x08
36+
null_command_handler, // 0x09
37+
{ "TOCLIENT_ACCESS_DENIED", TOCLIENT_STATE_NOT_CONNECTED, &Client::handleCommand_AccessDenied }, // 0x0A
38+
null_command_handler, // 0x0B
39+
null_command_handler, // 0x0C
40+
null_command_handler, // 0x0D
41+
null_command_handler, // 0x0E
42+
null_command_handler, // 0x0F
4343
{ "TOCLIENT_INIT", TOCLIENT_STATE_NOT_CONNECTED, &Client::handleCommand_Init }, // 0x10
4444
null_command_handler,
4545
null_command_handler,
@@ -77,7 +77,7 @@ const ToClientCommandHandler toClientCommandTable[TOCLIENT_NUM_MSG_TYPES] =
7777
{ "TOCLIENT_ACTIVE_OBJECT_MESSAGES", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_ActiveObjectMessages }, // 0x32
7878
{ "TOCLIENT_HP", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_HP }, // 0x33
7979
{ "TOCLIENT_MOVE_PLAYER", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_MovePlayer }, // 0x34
80-
{ "TOCLIENT_ACCESS_DENIED_LEGACY", TOCLIENT_STATE_NOT_CONNECTED, &Client::handleCommand_AccessDenied_Legacy }, // 0x35
80+
{ "TOCLIENT_ACCESS_DENIED_LEGACY", TOCLIENT_STATE_NOT_CONNECTED, &Client::handleCommand_AccessDenied }, // 0x35
8181
{ "TOCLIENT_PLAYERITEM", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_PlayerItem }, // 0x36
8282
{ "TOCLIENT_DEATHSCREEN", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_DeathScreen }, // 0x37
8383
{ "TOCLIENT_MEDIA", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_Media }, // 0x38
@@ -96,7 +96,7 @@ const ToClientCommandHandler toClientCommandTable[TOCLIENT_NUM_MSG_TYPES] =
9696
{ "TOCLIENT_MOVEMENT", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_Movement }, // 0x45
9797
{ "TOCLIENT_SPAWN_PARTICLE", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_SpawnParticle }, // 0x46
9898
{ "TOCLIENT_ADD_PARTICLESPAWNER", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_AddParticleSpawner }, // 0x47
99-
{ "TOCLIENT_DELETE_PARTICLESPAWNER", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_DeleteParticleSpawner_Legacy }, // 0x48
99+
{ "TOCLIENT_DELETE_PARTICLESPAWNER_LEGACY", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_DeleteParticleSpawner }, // 0x48
100100
{ "TOCLIENT_HUDADD", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_HudAdd }, // 0x49
101101
{ "TOCLIENT_HUDRM", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_HudRemove }, // 0x4a
102102
{ "TOCLIENT_HUDCHANGE", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_HudChange }, // 0x4b
@@ -107,6 +107,7 @@ const ToClientCommandHandler toClientCommandTable[TOCLIENT_NUM_MSG_TYPES] =
107107
{ "TOCLIENT_OVERRIDE_DAY_NIGHT_RATIO", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_OverrideDayNightRatio }, // 0x50
108108
{ "TOCLIENT_LOCAL_PLAYER_ANIMATIONS", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_LocalPlayerAnimations }, // 0x51
109109
{ "TOCLIENT_EYE_OFFSET", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_EyeOffset }, // 0x52
110+
{ "TOCLIENT_DELETE_PARTICLESPAWNER", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_DeleteParticleSpawner }, // 0x53
110111
};
111112

112113
const static ServerCommandFactory null_command_factory = { "TOSERVER_NULL", 0, false };
@@ -128,8 +129,8 @@ const ServerCommandFactory serverCommandFactoryTable[TOSERVER_NUM_MSG_TYPES] =
128129
null_command_factory, // 0x0c
129130
null_command_factory, // 0x0d
130131
null_command_factory, // 0x0e
131-
null_command_factory, // 0x0f
132-
{ "TOSERVER_INIT", 1, false }, // 0x10
132+
{ "TOSERVER_INIT", 1, false }, // 0x0F
133+
{ "TOSERVER_INIT_LEGACY", 1, false }, // 0x10
133134
{ "TOSERVER_INIT2", 1, true }, // 0x11
134135
null_command_factory, // 0x12
135136
null_command_factory, // 0x13
@@ -174,7 +175,7 @@ const ServerCommandFactory serverCommandFactoryTable[TOSERVER_NUM_MSG_TYPES] =
174175
{ "TOSERVER_REMOVED_SOUNDS", 1, true }, // 0x3a
175176
{ "TOSERVER_NODEMETA_FIELDS", 0, true }, // 0x3b
176177
{ "TOSERVER_INVENTORY_FIELDS", 0, true }, // 0x3c
177-
null_command_factory, // 0x3d
178+
{ "TOSERVER_PASSWORD", 0, true }, // 0x3d
178179
null_command_factory, // 0x3e
179180
null_command_factory, // 0x3f
180181
{ "TOSERVER_REQUEST_MEDIA", 1, true }, // 0x40

Diff for: ‎src/network/networkprotocol.h

+78-2
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,16 @@ with this program; if not, write to the Free Software Foundation, Inc.,
108108
PROTOCOL_VERSION 24:
109109
ContentFeatures version 7
110110
ContentFeatures: change number of special tiles to 6 (CF_SPECIAL_COUNT)
111+
PROTOCOL_VERSION 25:
112+
Rename TOCLIENT_ACCESS_DENIED to TOCLIENT_ACCESS_DENIED_LEGAGY
113+
Rename TOCLIENT_DELETE_PARTICLESPAWNER to TOCLIENT_DELETE_PARTICLESPAWNER_LEGACY
114+
Rename TOSERVER_PASSWORD to TOSERVER_PASSWORD_LEGACY
115+
Rename TOSERVER_INIT to TOSERVER_INIT_LEGACY
116+
Add TOCLIENT_ACCESS_DENIED new opcode (0x0A), using error codes
117+
for standard error, keeping customisation possible. This
118+
permit translation
119+
Add TOCLIENT_DELETE_PARTICLESPAWNER (0x53), fixing the u16 read and
120+
reading u32
111121
*/
112122

113123
#define LATEST_PROTOCOL_VERSION 24
@@ -133,6 +143,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
133143

134144
enum ToClientCommand
135145
{
146+
TOCLIENT_ACCESS_DENIED = 0x0A,
147+
/*
148+
u16 command
149+
u16 reason_length
150+
wstring reason
151+
*/
152+
136153
TOCLIENT_INIT = 0x10,
137154
/*
138155
Server's reply to TOSERVER_INIT.
@@ -460,7 +477,7 @@ enum ToClientCommand
460477
TOCLIENT_DELETE_PARTICLESPAWNER_LEGACY = 0x48,
461478
/*
462479
u16 command
463-
u32 id
480+
u16 id
464481
*/
465482

466483
TOCLIENT_HUDADD = 0x49,
@@ -557,11 +574,30 @@ enum ToClientCommand
557574
v3f1000 third
558575
*/
559576

560-
TOCLIENT_NUM_MSG_TYPES = 0x53,
577+
TOCLIENT_DELETE_PARTICLESPAWNER = 0x53,
578+
/*
579+
u16 command
580+
u32 id
581+
*/
582+
583+
TOCLIENT_NUM_MSG_TYPES = 0x54,
561584
};
562585

563586
enum ToServerCommand
564587
{
588+
TOSERVER_INIT = 0x0F,
589+
/*
590+
Sent first after connected.
591+
592+
[0] u16 TOSERVER_INIT
593+
[2] u8 SER_FMT_VER_HIGHEST_READ
594+
[3] u8 compression_modes
595+
[4] std::string player_name
596+
[4+*] std::string password (new in some version)
597+
[4+*+*] u16 minimum supported network protocol version (added sometime)
598+
[4+*+*+2] u16 maximum supported network protocol version (added later than the previous one)
599+
*/
600+
565601
TOSERVER_INIT_LEGACY = 0x10,
566602
/*
567603
Sent first after connected.
@@ -767,6 +803,15 @@ enum ToServerCommand
767803
u8[len] field value
768804
*/
769805

806+
TOSERVER_PASSWORD = 0x3d,
807+
/*
808+
Sent to change password.
809+
810+
[0] u16 TOSERVER_PASSWORD
811+
[2] std::string old password
812+
[2+*] std::string new password
813+
*/
814+
770815
TOSERVER_REQUEST_MEDIA = 0x40,
771816
/*
772817
u16 command
@@ -801,4 +846,35 @@ enum ToServerCommand
801846
TOSERVER_NUM_MSG_TYPES = 0x44,
802847
};
803848

849+
enum AccessDeniedCode {
850+
SERVER_ACCESSDENIED_WRONG_PASSWORD = 0,
851+
SERVER_ACCESSDENIED_UNEXPECTED_DATA = 1,
852+
SERVER_ACCESSDENIED_SINGLEPLAYER = 2,
853+
SERVER_ACCESSDENIED_WRONG_VERSION = 3,
854+
SERVER_ACCESSDENIED_WRONG_CHARS_IN_NAME = 4,
855+
SERVER_ACCESSDENIED_WRONG_NAME = 5,
856+
SERVER_ACCESSDENIED_TOO_MANY_USERS = 6,
857+
SERVER_ACCESSDENIED_EMPTY_PASSWORD = 7,
858+
SERVER_ACCESSDENIED_ALREADY_CONNECTED = 8,
859+
SERVER_ACCESSDENIED_CUSTOM_STRING = 9,
860+
SERVER_ACCESSDENIED_MAX = 10,
861+
};
862+
863+
enum NetProtoCompressionMode {
864+
NETPROTO_COMPRESSION_ZLIB = 0,
865+
};
866+
867+
const static std::wstring accessDeniedStrings[SERVER_ACCESSDENIED_MAX] = {
868+
L"Invalid password",
869+
L"Your client sent something server didn't expect. Try reconnecting or updating your client",
870+
L"The server is running in simple singleplayer mode. You cannot connect.",
871+
L"Your client's version is not supported.\nPlease contact server administrator.",
872+
L"Name contains unallowed characters",
873+
L"Name is not allowed",
874+
L"Too many users.",
875+
L"Empty passwords are disallowed. Set a password and try again.",
876+
L"Another client is connected with this name. If your client closed unexpectedly, try again in a minute.",
877+
L"",
878+
};
879+
804880
#endif

Diff for: ‎src/network/packethandlers/client.cpp

+33-7
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,32 @@ void Client::handleCommand_Init(NetworkPacket* pkt)
8989
m_state = LC_Init;
9090
}
9191

92-
void Client::handleCommand_AccessDenied_Legacy(NetworkPacket* pkt)
92+
void Client::handleCommand_AccessDenied(NetworkPacket* pkt)
9393
{
9494
// The server didn't like our password. Note, this needs
9595
// to be processed even if the serialisation format has
9696
// not been agreed yet, the same as TOCLIENT_INIT.
9797
m_access_denied = true;
9898
m_access_denied_reason = L"Unknown";
99-
if (pkt->getSize() >= 2) {
100-
*pkt >> m_access_denied_reason;
99+
100+
if (pkt->getCommand() == TOCLIENT_ACCESS_DENIED) {
101+
u8 denyCode = SERVER_ACCESSDENIED_UNEXPECTED_DATA;
102+
if(pkt->getSize() >= 1) {
103+
*pkt >> denyCode;
104+
}
105+
if (denyCode == SERVER_ACCESSDENIED_CUSTOM_STRING) {
106+
*pkt >> m_access_denied_reason;
107+
}
108+
else if (denyCode < SERVER_ACCESSDENIED_MAX) {
109+
m_access_denied_reason = accessDeniedStrings[denyCode];
110+
}
111+
}
112+
// 13/03/15 Legacy code from 0.4.12 and lesser. must stay 1 year
113+
// for compat with old clients
114+
else {
115+
if (pkt->getSize() >= 2) {
116+
*pkt >> m_access_denied_reason;
117+
}
101118
}
102119
}
103120

@@ -822,15 +839,24 @@ void Client::handleCommand_AddParticleSpawner(NetworkPacket* pkt)
822839
}
823840

824841

825-
void Client::handleCommand_DeleteParticleSpawner_Legacy(NetworkPacket* pkt)
842+
void Client::handleCommand_DeleteParticleSpawner(NetworkPacket* pkt)
826843
{
827-
u16 id;
844+
u16 legacy_id;
845+
u32 id;
846+
847+
// Modification set 13/03/15, 1 year of compat for protocol v24
848+
if (pkt->getCommand() == TOCLIENT_DELETE_PARTICLESPAWNER_LEGACY) {
849+
*pkt >> legacy_id;
850+
}
851+
else {
852+
*pkt >> id;
853+
}
828854

829-
*pkt >> id;
830855

831856
ClientEvent event;
832857
event.type = CE_DELETE_PARTICLESPAWNER;
833-
event.delete_particlespawner.id = (u32) id;
858+
event.delete_particlespawner.id =
859+
(pkt->getCommand() == TOCLIENT_DELETE_PARTICLESPAWNER_LEGACY ? (u32) legacy_id : id);
834860

835861
m_client_event_queue.push(event);
836862
}

Diff for: ‎src/network/serveropcodes.cpp

+21-20
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const static ToServerCommandHandler null_command_handler = { "TOSERVER_NULL", TO
2424

2525
const ToServerCommandHandler toServerCommandTable[TOSERVER_NUM_MSG_TYPES] =
2626
{
27-
null_command_handler, // 0x00
27+
null_command_handler, // 0x00 (never use this)
2828
null_command_handler, // 0x01
2929
null_command_handler, // 0x02
3030
null_command_handler, // 0x03
@@ -40,7 +40,7 @@ const ToServerCommandHandler toServerCommandTable[TOSERVER_NUM_MSG_TYPES] =
4040
null_command_handler, // 0x0d
4141
null_command_handler, // 0x0e
4242
null_command_handler, // 0x0f
43-
{ "TOSERVER_INIT_LEGACY", TOSERVER_STATE_NOT_CONNECTED, &Server::handleCommand_Init_Legacy }, // 0x10
43+
{ "TOSERVER_INIT_LEGACY", TOSERVER_STATE_NOT_CONNECTED, &Server::handleCommand_Init_Legacy }, // 0x10
4444
{ "TOSERVER_INIT2", TOSERVER_STATE_NOT_CONNECTED, &Server::handleCommand_Init2 }, // 0x11
4545
null_command_handler, // 0x12
4646
null_command_handler, // 0x13
@@ -98,23 +98,23 @@ const static ClientCommandFactory null_command_factory = { "TOCLIENT_NULL", 0, f
9898

9999
const ClientCommandFactory clientCommandFactoryTable[TOCLIENT_NUM_MSG_TYPES] =
100100
{
101-
null_command_factory,
102-
null_command_factory,
103-
null_command_factory,
104-
null_command_factory,
105-
null_command_factory,
106-
null_command_factory,
107-
null_command_factory,
108-
null_command_factory,
109-
null_command_factory,
110-
null_command_factory,
111-
null_command_factory,
112-
null_command_factory,
113-
null_command_factory,
114-
null_command_factory,
115-
null_command_factory,
116-
null_command_factory,
117-
{ "TOCLIENT_INIT", 0, true }, // 0x10
101+
null_command_factory, // 0x00
102+
null_command_factory, // 0x01
103+
null_command_factory, // 0x02
104+
null_command_factory, // 0x03
105+
null_command_factory, // 0x04
106+
null_command_factory, // 0x05
107+
null_command_factory, // 0x06
108+
null_command_factory, // 0x07
109+
null_command_factory, // 0x08
110+
null_command_factory, // 0x09
111+
{ "TOCLIENT_ACCESS_DENIED", 0, true }, // 0x0A
112+
null_command_factory, // 0x0B
113+
null_command_factory, // 0x0C
114+
null_command_factory, // 0x0D
115+
null_command_factory, // 0x0E
116+
null_command_factory, // 0x0F
117+
{ "TOCLIENT_INIT", 0, true }, // 0x10
118118
null_command_factory,
119119
null_command_factory,
120120
null_command_factory,
@@ -151,7 +151,7 @@ const ClientCommandFactory clientCommandFactoryTable[TOCLIENT_NUM_MSG_TYPES] =
151151
{ "TOCLIENT_ACTIVE_OBJECT_MESSAGES", 0, true }, // 0x32 Special packet, sent by 0 (rel) and 1 (unrel) channel
152152
{ "TOCLIENT_HP", 0, true }, // 0x33
153153
{ "TOCLIENT_MOVE_PLAYER", 0, true }, // 0x34
154-
{ "TOCLIENT_ACCESS_DENIED_LEGACY", 0, true }, // 0x35
154+
{ "TOCLIENT_ACCESS_DENIED_LEGACY", 0, true }, // 0x35
155155
{ "TOCLIENT_PLAYERITEM", 0, false }, // 0x36 obsolete
156156
{ "TOCLIENT_DEATHSCREEN", 0, true }, // 0x37
157157
{ "TOCLIENT_MEDIA", 2, true }, // 0x38
@@ -181,4 +181,5 @@ const ClientCommandFactory clientCommandFactoryTable[TOCLIENT_NUM_MSG_TYPES] =
181181
{ "TOCLIENT_OVERRIDE_DAY_NIGHT_RATIO", 0, true }, // 0x50
182182
{ "TOCLIENT_LOCAL_PLAYER_ANIMATIONS", 0, true }, // 0x51
183183
{ "TOCLIENT_EYE_OFFSET", 0, true }, // 0x52
184+
{ "TOCLIENT_DELETE_PARTICLESPAWNER", 0, true }, // 0x53
184185
};

0 commit comments

Comments
 (0)
Please sign in to comment.