Clean up client and server command sending / tables

This commit is contained in:
sfan5 2024-01-24 18:23:11 +01:00
parent 2b99dabdac
commit 397682a5b0
9 changed files with 79 additions and 119 deletions

@ -83,8 +83,10 @@ u32 PacketCounter::sum() const
void PacketCounter::print(std::ostream &o) const void PacketCounter::print(std::ostream &o) const
{ {
for (const auto &it : m_packets) { for (const auto &it : m_packets) {
auto name = it.first >= TOCLIENT_NUM_MSG_TYPES ? "?" auto name = it.first >= TOCLIENT_NUM_MSG_TYPES ? nullptr
: toClientCommandTable[it.first].name; : toClientCommandTable[it.first].name;
if (!name)
name = "?";
o << "cmd " << it.first << " (" << name << ") count " o << "cmd " << it.first << " (" << name << ") count "
<< it.second << std::endl; << it.second << std::endl;
} }
@ -991,27 +993,25 @@ inline void Client::handleCommand(NetworkPacket* pkt)
void Client::ProcessData(NetworkPacket *pkt) void Client::ProcessData(NetworkPacket *pkt)
{ {
ToClientCommand command = (ToClientCommand) pkt->getCommand(); ToClientCommand command = (ToClientCommand) pkt->getCommand();
u32 sender_peer_id = pkt->getPeerId();
//infostream<<"Client: received command="<<command<<std::endl; m_packetcounter.add(static_cast<u16>(command));
m_packetcounter.add((u16)command);
g_profiler->graphAdd("client_received_packets", 1); g_profiler->graphAdd("client_received_packets", 1);
/* /*
If this check is removed, be sure to change the queue If this check is removed, be sure to change the queue
system to know the ids system to know the ids
*/ */
if(sender_peer_id != PEER_ID_SERVER) { if (pkt->getPeerId() != PEER_ID_SERVER) {
infostream << "Client::ProcessData(): Discarding data not " infostream << "Client::ProcessData(): Discarding data not "
"coming from server: peer_id=" << sender_peer_id << " command=" << pkt->getCommand() "coming from server: peer_id=" << static_cast<int>(pkt->getPeerId())
<< std::endl; << " command=" << static_cast<unsigned>(command) << std::endl;
return; return;
} }
// Command must be handled into ToClientCommandHandler // Command must be handled into ToClientCommandHandler
if (command >= TOCLIENT_NUM_MSG_TYPES) { if (command >= TOCLIENT_NUM_MSG_TYPES) {
infostream << "Client: Ignoring unknown command " infostream << "Client: Ignoring unknown command "
<< command << std::endl; << static_cast<unsigned>(command) << std::endl;
return; return;
} }
@ -1027,24 +1027,19 @@ void Client::ProcessData(NetworkPacket *pkt)
if (m_server_ser_ver == SER_FMT_VER_INVALID) { if (m_server_ser_ver == SER_FMT_VER_INVALID) {
infostream << "Client: Server serialization" infostream << "Client: Server serialization"
" format invalid or not initialized." " format invalid. Skipping incoming command "
" Skipping incoming command=" << command << std::endl; << static_cast<unsigned>(command) << std::endl;
return; return;
} }
/*
Handle runtime commands
*/
handleCommand(pkt); handleCommand(pkt);
} }
void Client::Send(NetworkPacket* pkt) void Client::Send(NetworkPacket* pkt)
{ {
m_con->Send(PEER_ID_SERVER, auto &scf = serverCommandFactoryTable[pkt->getCommand()];
serverCommandFactoryTable[pkt->getCommand()].channel, FATAL_ERROR_IF(!scf.name, "packet type missing in table");
pkt, m_con->Send(PEER_ID_SERVER, scf.channel, pkt, scf.reliable);
serverCommandFactoryTable[pkt->getCommand()].reliable);
} }
// Will fill up 12 + 12 + 4 + 4 + 4 + 1 + 1 + 1 bytes // Will fill up 12 + 12 + 4 + 4 + 4 + 1 + 1 + 1 bytes

@ -784,10 +784,21 @@ void ClientInterface::UpdatePlayerList()
} }
} }
void ClientInterface::send(session_t peer_id, u8 channelnum, void ClientInterface::send(session_t peer_id, NetworkPacket *pkt)
NetworkPacket *pkt, bool reliable)
{ {
m_con->Send(peer_id, channelnum, pkt, reliable); auto &ccf = clientCommandFactoryTable[pkt->getCommand()];
FATAL_ERROR_IF(!ccf.name, "packet type missing in table");
m_con->Send(peer_id, ccf.channel, pkt, ccf.reliable);
}
void ClientInterface::sendCustom(session_t peer_id, u8 channel, NetworkPacket *pkt, bool reliable)
{
// check table anyway to prevent mistakes
FATAL_ERROR_IF(!clientCommandFactoryTable[pkt->getCommand()].name,
"packet type missing in table");
m_con->Send(peer_id, channel, pkt, reliable);
} }
void ClientInterface::sendToAll(NetworkPacket *pkt) void ClientInterface::sendToAll(NetworkPacket *pkt)
@ -797,9 +808,9 @@ void ClientInterface::sendToAll(NetworkPacket *pkt)
RemoteClient *client = client_it.second; RemoteClient *client = client_it.second;
if (client->net_proto_version != 0) { if (client->net_proto_version != 0) {
m_con->Send(client->peer_id, auto &ccf = clientCommandFactoryTable[pkt->getCommand()];
clientCommandFactoryTable[pkt->getCommand()].channel, pkt, FATAL_ERROR_IF(!ccf.name, "packet type missing in table");
clientCommandFactoryTable[pkt->getCommand()].reliable); m_con->Send(client->peer_id, ccf.channel, pkt, ccf.reliable);
} }
} }
} }

@ -482,8 +482,11 @@ public:
/* get list of client player names */ /* get list of client player names */
const std::vector<std::string> &getPlayerNames() const { return m_clients_names; } const std::vector<std::string> &getPlayerNames() const { return m_clients_names; }
/* send message to client */ /* send to one client */
void send(session_t peer_id, u8 channelnum, NetworkPacket *pkt, bool reliable); void send(session_t peer_id, NetworkPacket *pkt);
/* send to one client, deviating from the standard params */
void sendCustom(session_t peer_id, u8 channel, NetworkPacket *pkt, bool reliable);
/* send to all clients */ /* send to all clients */
void sendToAll(NetworkPacket *pkt); void sendToAll(NetworkPacket *pkt);

@ -19,8 +19,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
*/ */
#include "clientopcodes.h" #include "clientopcodes.h"
#include "client/client.h"
const static ToClientCommandHandler null_command_handler = {"TOCLIENT_NULL", TOCLIENT_STATE_ALL, &Client::handleCommand_Null}; const static ToClientCommandHandler null_command_handler =
{"TOCLIENT_NULL", TOCLIENT_STATE_ALL, &Client::handleCommand_Null};
const ToClientCommandHandler toClientCommandTable[TOCLIENT_NUM_MSG_TYPES] = const ToClientCommandHandler toClientCommandTable[TOCLIENT_NUM_MSG_TYPES] =
{ {
@ -126,7 +128,7 @@ const ToClientCommandHandler toClientCommandTable[TOCLIENT_NUM_MSG_TYPES] =
{ "TOCLIENT_SET_LIGHTING", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_SetLighting }, // 0x63, { "TOCLIENT_SET_LIGHTING", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_SetLighting }, // 0x63,
}; };
const static ServerCommandFactory null_command_factory = { "TOSERVER_NULL", 0, false }; const static ServerCommandFactory null_command_factory = { nullptr, 0, false };
/* /*
Channels used for Client -> Server communication Channels used for Client -> Server communication
@ -223,5 +225,5 @@ const ServerCommandFactory serverCommandFactoryTable[TOSERVER_NUM_MSG_TYPES] =
{ "TOSERVER_FIRST_SRP", 1, true }, // 0x50 { "TOSERVER_FIRST_SRP", 1, true }, // 0x50
{ "TOSERVER_SRP_BYTES_A", 1, true }, // 0x51 { "TOSERVER_SRP_BYTES_A", 1, true }, // 0x51
{ "TOSERVER_SRP_BYTES_M", 1, true }, // 0x52 { "TOSERVER_SRP_BYTES_M", 1, true }, // 0x52
{ "TOSERVER_UPDATE_CLIENT_INFO", 1, true }, // 0x53 { "TOSERVER_UPDATE_CLIENT_INFO", 2, true }, // 0x53
}; };

@ -20,10 +20,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#pragma once #pragma once
#include "client/client.h"
#include "networkprotocol.h" #include "networkprotocol.h"
class NetworkPacket; class NetworkPacket;
class Client;
enum ToClientConnectionState { enum ToClientConnectionState {
TOCLIENT_STATE_NOT_CONNECTED, TOCLIENT_STATE_NOT_CONNECTED,

@ -251,7 +251,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
typedef u16 session_t; typedef u16 session_t;
enum ToClientCommand enum ToClientCommand : u16
{ {
TOCLIENT_HELLO = 0x02, TOCLIENT_HELLO = 0x02,
/* /*
@ -288,9 +288,7 @@ enum ToClientCommand
u8 (bool) reconnect u8 (bool) reconnect
*/ */
TOCLIENT_INIT_LEGACY = 0x10, // Obsolete TOCLIENT_BLOCKDATA = 0x20,
TOCLIENT_BLOCKDATA = 0x20, //TODO: Multiple blocks
TOCLIENT_ADDNODE = 0x21, TOCLIENT_ADDNODE = 0x21,
/* /*
v3s16 position v3s16 position
@ -299,23 +297,15 @@ enum ToClientCommand
*/ */
TOCLIENT_REMOVENODE = 0x22, TOCLIENT_REMOVENODE = 0x22,
TOCLIENT_PLAYERPOS = 0x23, // Obsolete
TOCLIENT_PLAYERINFO = 0x24, // Obsolete
TOCLIENT_OPT_BLOCK_NOT_FOUND = 0x25, // Obsolete
TOCLIENT_SECTORMETA = 0x26, // Obsolete
TOCLIENT_INVENTORY = 0x27, TOCLIENT_INVENTORY = 0x27,
/* /*
[0] u16 command [0] u16 command
[2] serialized inventory [2] serialized inventory
*/ */
TOCLIENT_OBJECTDATA = 0x28, // Obsolete
TOCLIENT_TIME_OF_DAY = 0x29, TOCLIENT_TIME_OF_DAY = 0x29,
/* /*
u16 time (0-23999) u16 time (0-23999)
Added in a later version:
f1000 time_speed f1000 time_speed
*/ */
@ -337,8 +327,6 @@ enum ToClientCommand
bool should_be_cached bool should_be_cached
*/ */
// (oops, there is some gap here)
TOCLIENT_CHAT_MESSAGE = 0x2F, TOCLIENT_CHAT_MESSAGE = 0x2F,
/* /*
u8 version u8 version
@ -349,8 +337,6 @@ enum ToClientCommand
wstring message wstring message
*/ */
TOCLIENT_CHAT_MESSAGE_OLD = 0x30, // Obsolete
TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD = 0x31, TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD = 0x31,
/* /*
u16 count of removed objects u16 count of removed objects
@ -424,26 +410,13 @@ enum ToClientCommand
string url string url
*/ */
TOCLIENT_TOOLDEF = 0x39,
/*
u32 length of the next item
serialized ToolDefManager
*/
TOCLIENT_NODEDEF = 0x3a, TOCLIENT_NODEDEF = 0x3a,
/* /*
u32 length of the next item u32 length of the next item
serialized NodeDefManager serialized NodeDefManager
*/ */
TOCLIENT_CRAFTITEMDEF = 0x3b,
/*
u32 length of the next item
serialized CraftiItemDefManager
*/
TOCLIENT_ANNOUNCE_MEDIA = 0x3c, TOCLIENT_ANNOUNCE_MEDIA = 0x3c,
/* /*
u32 number of files u32 number of files
for each texture { for each texture {
@ -647,8 +620,6 @@ enum ToClientCommand
*/ */
TOCLIENT_DELETE_PARTICLESPAWNER_LEGACY = 0x48, // Obsolete
TOCLIENT_HUDADD = 0x49, TOCLIENT_HUDADD = 0x49,
/* /*
u32 id u32 id
@ -882,7 +853,7 @@ enum ToClientCommand
TOCLIENT_NUM_MSG_TYPES = 0x64, TOCLIENT_NUM_MSG_TYPES = 0x64,
}; };
enum ToServerCommand enum ToServerCommand : u16
{ {
TOSERVER_INIT = 0x02, TOSERVER_INIT = 0x02,
/* /*
@ -895,14 +866,10 @@ enum ToServerCommand
std::string player name std::string player name
*/ */
TOSERVER_INIT_LEGACY = 0x10, // Obsolete
TOSERVER_INIT2 = 0x11, TOSERVER_INIT2 = 0x11,
/* /*
Sent as an ACK for TOCLIENT_INIT. Sent as an ACK for TOCLIENT_AUTH_ACCEPT.
After this, the server can send data. After this, the server can send data.
[0] u16 TOSERVER_INIT2
*/ */
TOSERVER_MODCHANNEL_JOIN = 0x17, TOSERVER_MODCHANNEL_JOIN = 0x17,
@ -925,10 +892,6 @@ enum ToServerCommand
std::string message std::string message
*/ */
TOSERVER_GETBLOCK = 0x20, // Obsolete
TOSERVER_ADDNODE = 0x21, // Obsolete
TOSERVER_REMOVENODE = 0x22, // Obsolete
TOSERVER_PLAYERPOS = 0x23, TOSERVER_PLAYERPOS = 0x23,
/* /*
[0] u16 command [0] u16 command
@ -961,12 +924,6 @@ enum ToServerCommand
... ...
*/ */
TOSERVER_ADDNODE_FROM_INVENTORY = 0x26, // Obsolete
TOSERVER_CLICK_OBJECT = 0x27, // Obsolete
TOSERVER_GROUND_ACTION = 0x28, // Obsolete
TOSERVER_RELEASE = 0x29, // Obsolete
TOSERVER_SIGNTEXT = 0x30, // Obsolete
TOSERVER_INVENTORY_ACTION = 0x31, TOSERVER_INVENTORY_ACTION = 0x31,
/* /*
See InventoryAction in inventorymanager.h See InventoryAction in inventorymanager.h
@ -978,16 +935,11 @@ enum ToServerCommand
wstring message wstring message
*/ */
TOSERVER_SIGNNODETEXT = 0x33, // Obsolete
TOSERVER_CLICK_ACTIVEOBJECT = 0x34, // Obsolete
TOSERVER_DAMAGE = 0x35, TOSERVER_DAMAGE = 0x35,
/* /*
u8 amount u8 amount
*/ */
TOSERVER_PASSWORD_LEGACY = 0x36, // Obsolete
TOSERVER_PLAYERITEM = 0x37, TOSERVER_PLAYERITEM = 0x37,
/* /*
Sent to change selected item. Sent to change selected item.
@ -1063,8 +1015,6 @@ enum ToServerCommand
u32 token u32 token
*/ */
TOSERVER_BREATH = 0x42, // Obsolete
TOSERVER_CLIENT_READY = 0x43, TOSERVER_CLIENT_READY = 0x43,
/* /*
u8 major u8 major

@ -19,8 +19,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
*/ */
#include "serveropcodes.h" #include "serveropcodes.h"
#include "server.h"
const static ToServerCommandHandler null_command_handler = { "TOSERVER_NULL", TOSERVER_STATE_ALL, &Server::handleCommand_Null }; const static ToServerCommandHandler null_command_handler =
{ "TOSERVER_NULL", TOSERVER_STATE_ALL, &Server::handleCommand_Null };
const ToServerCommandHandler toServerCommandTable[TOSERVER_NUM_MSG_TYPES] = const ToServerCommandHandler toServerCommandTable[TOSERVER_NUM_MSG_TYPES] =
{ {
@ -110,7 +112,7 @@ const ToServerCommandHandler toServerCommandTable[TOSERVER_NUM_MSG_TYPES] =
{ "TOSERVER_UPDATE_CLIENT_INFO", TOSERVER_STATE_INGAME, &Server::handleCommand_UpdateClientInfo }, // 0x53 { "TOSERVER_UPDATE_CLIENT_INFO", TOSERVER_STATE_INGAME, &Server::handleCommand_UpdateClientInfo }, // 0x53
}; };
const static ClientCommandFactory null_command_factory = { "TOCLIENT_NULL", 0, false }; const static ClientCommandFactory null_command_factory = { nullptr, 0, false };
/* /*
Channels used for Server -> Client communication Channels used for Server -> Client communication
@ -140,7 +142,7 @@ const ClientCommandFactory clientCommandFactoryTable[TOCLIENT_NUM_MSG_TYPES] =
null_command_factory, // 0x0D null_command_factory, // 0x0D
null_command_factory, // 0x0E null_command_factory, // 0x0E
null_command_factory, // 0x0F null_command_factory, // 0x0F
{ "TOCLIENT_INIT", 0, true }, // 0x10 null_command_factory, // 0x10
null_command_factory, // 0x11 null_command_factory, // 0x11
null_command_factory, // 0x12 null_command_factory, // 0x12
null_command_factory, // 0x13 null_command_factory, // 0x13
@ -217,7 +219,7 @@ const ClientCommandFactory clientCommandFactoryTable[TOCLIENT_NUM_MSG_TYPES] =
{ "TOCLIENT_SET_SUN", 0, true }, // 0x5a { "TOCLIENT_SET_SUN", 0, true }, // 0x5a
{ "TOCLIENT_SET_MOON", 0, true }, // 0x5b { "TOCLIENT_SET_MOON", 0, true }, // 0x5b
{ "TOCLIENT_SET_STARS", 0, true }, // 0x5c { "TOCLIENT_SET_STARS", 0, true }, // 0x5c
null_command_factory, // 0x5d { "TOCLIENT_MOVE_PLAYER_REL", 0, true }, // 0x5d
null_command_factory, // 0x5e null_command_factory, // 0x5e
null_command_factory, // 0x5f null_command_factory, // 0x5f
{ "TOCLIENT_SRP_BYTES_S_B", 0, true }, // 0x60 { "TOCLIENT_SRP_BYTES_S_B", 0, true }, // 0x60

@ -20,10 +20,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#pragma once #pragma once
#include "server.h"
#include "networkprotocol.h" #include "networkprotocol.h"
class NetworkPacket; class NetworkPacket;
class Server;
enum ToServerConnectionState { enum ToServerConnectionState {
TOSERVER_STATE_NOT_CONNECTED, TOSERVER_STATE_NOT_CONNECTED,
@ -33,7 +33,7 @@ enum ToServerConnectionState {
}; };
struct ToServerCommandHandler struct ToServerCommandHandler
{ {
const std::string name; const char *name;
ToServerConnectionState state; ToServerConnectionState state;
void (Server::*handler)(NetworkPacket* pkt); void (Server::*handler)(NetworkPacket* pkt);
}; };

@ -1062,11 +1062,13 @@ void Server::Receive(float timeout)
infostream << "Server::Receive(): SerializationError: what()=" infostream << "Server::Receive(): SerializationError: what()="
<< e.what() << std::endl; << e.what() << std::endl;
} catch (const ClientStateError &e) { } catch (const ClientStateError &e) {
errorstream << "ProcessData: peer=" << peer_id << " what()=" errorstream << "ClientStateError: peer=" << peer_id << " what()="
<< e.what() << std::endl; << e.what() << std::endl;
DenyAccess(peer_id, SERVER_ACCESSDENIED_UNEXPECTED_DATA); DenyAccess(peer_id, SERVER_ACCESSDENIED_UNEXPECTED_DATA);
} catch (const con::PeerNotFoundException &e) { } catch (con::PeerNotFoundException &e) {
// Do nothing infostream << "Server: PeerNotFoundException" << std::endl;
} catch (ClientNotFoundException &e) {
infostream << "Server: ClientNotFoundException" << std::endl;
} }
} }
} }
@ -1189,7 +1191,7 @@ void Server::ProcessData(NetworkPacket *pkt)
// Command must be handled into ToServerCommandHandler // Command must be handled into ToServerCommandHandler
if (command >= TOSERVER_NUM_MSG_TYPES) { if (command >= TOSERVER_NUM_MSG_TYPES) {
infostream << "Server: Ignoring unknown command " infostream << "Server: Ignoring unknown command "
<< command << std::endl; << static_cast<unsigned>(command) << std::endl;
return; return;
} }
@ -1201,9 +1203,9 @@ void Server::ProcessData(NetworkPacket *pkt)
u8 peer_ser_ver = getClient(peer_id, CS_InitDone)->serialization_version; u8 peer_ser_ver = getClient(peer_id, CS_InitDone)->serialization_version;
if(peer_ser_ver == SER_FMT_VER_INVALID) { if(peer_ser_ver == SER_FMT_VER_INVALID) {
errorstream << "Server::ProcessData(): Cancelling: Peer" errorstream << "Server: Peer serialization format invalid. "
" serialization format invalid or not initialized." "Skipping incoming command "
" Skipping incoming command=" << command << std::endl; << static_cast<unsigned>(command) << std::endl;
return; return;
} }
@ -1216,9 +1218,10 @@ void Server::ProcessData(NetworkPacket *pkt)
if (m_clients.getClientState(peer_id) < CS_Active) { if (m_clients.getClientState(peer_id) < CS_Active) {
if (command == TOSERVER_PLAYERPOS) return; if (command == TOSERVER_PLAYERPOS) return;
errorstream << "Got packet command: " << command << " for peer id " errorstream << "Server: Got packet command "
<< peer_id << " but client isn't active yet. Dropping packet " << static_cast<unsigned>(command)
<< std::endl; << " for peer id " << peer_id
<< " but client isn't active yet. Dropping packet." << std::endl;
return; return;
} }
@ -1346,15 +1349,13 @@ void Server::printToConsoleOnly(const std::string &text)
void Server::Send(NetworkPacket *pkt) void Server::Send(NetworkPacket *pkt)
{ {
FATAL_ERROR_IF(pkt->getPeerId() == 0, "Server::Send() missing peer ID");
Send(pkt->getPeerId(), pkt); Send(pkt->getPeerId(), pkt);
} }
void Server::Send(session_t peer_id, NetworkPacket *pkt) void Server::Send(session_t peer_id, NetworkPacket *pkt)
{ {
m_clients.send(peer_id, m_clients.send(peer_id, pkt);
clientCommandFactoryTable[pkt->getCommand()].channel,
pkt,
clientCommandFactoryTable[pkt->getCommand()].reliable);
} }
void Server::SendMovement(session_t peer_id) void Server::SendMovement(session_t peer_id)
@ -2137,9 +2138,8 @@ void Server::SendActiveObjectMessages(session_t peer_id, const std::string &data
pkt.putRawString(datas.c_str(), datas.size()); pkt.putRawString(datas.c_str(), datas.size());
m_clients.send(pkt.getPeerId(), auto &ccf = clientCommandFactoryTable[pkt.getCommand()];
reliable ? clientCommandFactoryTable[pkt.getCommand()].channel : 1, m_clients.sendCustom(pkt.getPeerId(), reliable ? ccf.channel : 1, &pkt, reliable);
&pkt, reliable);
} }
void Server::SendCSMRestrictionFlags(session_t peer_id) void Server::SendCSMRestrictionFlags(session_t peer_id)
@ -2237,12 +2237,12 @@ s32 Server::playSound(ServerPlayingSound &params, bool ephemeral)
<< params.spec.loop << params.spec.fade << params.spec.pitch << params.spec.loop << params.spec.fade << params.spec.pitch
<< ephemeral << params.spec.start_time; << ephemeral << params.spec.start_time;
bool as_reliable = !ephemeral; const bool as_reliable = !ephemeral;
for (const session_t peer_id : dst_clients) { for (const session_t peer_id : dst_clients) {
if (!ephemeral) if (!ephemeral)
params.clients.insert(peer_id); params.clients.insert(peer_id);
m_clients.send(peer_id, 0, &pkt, as_reliable); m_clients.sendCustom(peer_id, 0, &pkt, as_reliable);
} }
if (!ephemeral) if (!ephemeral)
@ -2261,8 +2261,7 @@ void Server::stopSound(s32 handle)
pkt << handle; pkt << handle;
for (session_t peer_id : psound.clients) { for (session_t peer_id : psound.clients) {
// Send as reliable Send(peer_id, &pkt);
m_clients.send(peer_id, 0, &pkt, true);
} }
// Remove sound reference // Remove sound reference
@ -2282,8 +2281,7 @@ void Server::fadeSound(s32 handle, float step, float gain)
pkt << handle << step << gain; pkt << handle << step << gain;
for (session_t peer_id : psound.clients) { for (session_t peer_id : psound.clients) {
// Send as reliable Send(peer_id, &pkt);
m_clients.send(peer_id, 0, &pkt, true);
} }
// Remove sound reference // Remove sound reference
@ -2340,8 +2338,7 @@ void Server::sendNodeChangePkt(NetworkPacket &pkt, v3s16 block_pos,
continue; continue;
} }
// Send as reliable Send(client_id, &pkt);
m_clients.send(client_id, 0, &pkt, true);
} }
} }
@ -3670,8 +3667,8 @@ bool Server::dynamicAddMedia(std::string filepath,
to push the media over ALL channels to ensure it is processed before to push the media over ALL channels to ensure it is processed before
it is used. In practice this means channels 1 and 0. it is used. In practice this means channels 1 and 0.
*/ */
m_clients.send(peer_id, 1, &legacy_pkt, true); m_clients.sendCustom(peer_id, 1, &legacy_pkt, true);
m_clients.send(peer_id, 0, &legacy_pkt, true); m_clients.sendCustom(peer_id, 0, &legacy_pkt, true);
} else { } else {
waiting.emplace(peer_id); waiting.emplace(peer_id);
Send(peer_id, &pkt); Send(peer_id, &pkt);