aboutsummaryrefslogtreecommitdiff
path: root/src/network
diff options
context:
space:
mode:
Diffstat (limited to 'src/network')
-rw-r--r--src/network/connection.cpp24
-rw-r--r--src/network/connectionthreads.cpp4
-rw-r--r--src/network/serverpackethandler.cpp21
3 files changed, 36 insertions, 13 deletions
diff --git a/src/network/connection.cpp b/src/network/connection.cpp
index 6fb676f25..f2cdbe435 100644
--- a/src/network/connection.cpp
+++ b/src/network/connection.cpp
@@ -1040,7 +1040,9 @@ bool UDPPeer::processReliableSendCommand(
- BASE_HEADER_SIZE
- RELIABLE_HEADER_SIZE;
- sanity_check(c.data.getSize() < MAX_RELIABLE_WINDOW_SIZE*512);
+ if (c.data.getSize() >= MAX_RELIABLE_WINDOW_SIZE*512)
+ return false;
+// sanity_check(c.data.getSize() < MAX_RELIABLE_WINDOW_SIZE*512);
std::list<SharedBuffer<u8>> originals;
u16 split_sequence_number = chan.readNextSplitSeqNum();
@@ -1140,7 +1142,7 @@ void UDPPeer::RunCommandQueues(
for (Channel &channel : channels) {
unsigned int commands_processed = 0;
- if ((!channel.queued_commands.empty()) &&
+ while ((!channel.queued_commands.empty()) &&
(channel.queued_reliables.size() < maxtransfer) &&
(commands_processed < maxcommands)) {
try {
@@ -1157,6 +1159,7 @@ void UDPPeer::RunCommandQueues(
<< " Failed to queue packets for peer_id: " << c->peer_id
<< ", delaying sending of " << c->data.getSize()
<< " bytes" << std::endl);
+ break;
}
}
catch (ItemNotFoundException &e) {
@@ -1544,24 +1547,31 @@ u16 Connection::createPeer(Address& sender, MTProtocols protocol, int fd)
// Get a unique peer id (2 or higher)
session_t peer_id_new = m_next_remote_peer_id;
- u16 overflow = MAX_UDP_PEERS;
+// u16 overflow = MAX_UDP_PEERS;
/*
Find an unused peer id
*/
MutexAutoLock lock(m_peers_mutex);
bool out_of_ids = false;
- for(;;) {
+ session_t peer_id_start = peer_id_new;
+ while (1) {
// Check if exists
if (m_peers.find(peer_id_new) == m_peers.end())
break;
- // Check for overflow
- if (peer_id_new == overflow) {
+// // Check for overflow
+// if (peer_id_new == overflow) {
+// out_of_ids = true;
+// break;
+// }
+ peer_id_new++; // Unsigned overflow is indeed defined, and works as expected
+
+ // Proper overflow check
+ if (peer_id_start == peer_id_new) {
out_of_ids = true;
break;
}
- peer_id_new++;
}
if (out_of_ids) {
diff --git a/src/network/connectionthreads.cpp b/src/network/connectionthreads.cpp
index 90936b43d..6de57bd88 100644
--- a/src/network/connectionthreads.cpp
+++ b/src/network/connectionthreads.cpp
@@ -614,8 +614,8 @@ void ConnectionSendThread::sendPackets(float dtime)
std::vector<session_t> pendingDisconnect;
std::map<session_t, bool> pending_unreliable;
- const unsigned int peer_packet_quota = m_iteration_packets_avaialble
- / MYMAX(peerIds.size(), 1);
+ const unsigned int peer_packet_quota = m_iteration_packets_avaialble;
+// / MYMAX(peerIds.size(), 1);
for (session_t peerId : peerIds) {
PeerHelper peer = m_connection->getPeerNoEx(peerId);
diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp
index a5ee81a9c..e22fdb771 100644
--- a/src/network/serverpackethandler.cpp
+++ b/src/network/serverpackethandler.cpp
@@ -500,8 +500,19 @@ void Server::process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao,
playersao->setFov(fov);
playersao->setWantedRange(wanted_range);
+ uint32_t old_keys = player->control.direction_keys |
+ ((uint32_t)(player->control.jump & 1) << 4) |
+ ((uint32_t)(player->control.aux1 & 1) << 5) |
+ ((uint32_t)(player->control.sneak & 1) << 6) |
+ ((uint32_t)(player->control.dig & 1) << 7) |
+ ((uint32_t)(player->control.place & 1) << 8) |
+ ((uint32_t)(player->control.zoom & 1) << 9);
+
player->control.unpackKeysPressed(keyPressed);
+ if (old_keys != keyPressed)
+ m_script->on_player_change_keys(playersao, player->control);
+
if (playersao->checkMovementCheat()) {
// Call callbacks
m_script->on_cheat(playersao, "moved_too_fast");
@@ -845,6 +856,9 @@ void Server::handleCommand_PlayerItem(NetworkPacket* pkt)
*pkt >> item;
+ if (item == playersao->getPlayer()->getWieldIndex())
+ return;
+
if (item >= player->getHotbarItemcount()) {
actionstream << "Player: " << player->getName()
<< " tried to access item=" << item
@@ -855,6 +869,7 @@ void Server::handleCommand_PlayerItem(NetworkPacket* pkt)
}
playersao->getPlayer()->setWieldIndex(item);
+ m_script->on_player_change_wield(playersao, item);
}
void Server::handleCommand_Respawn(NetworkPacket* pkt)
@@ -1028,12 +1043,10 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
/*
Check that target is reasonably close
*/
- static thread_local const bool enable_anticheat =
- !g_settings->getBool("disable_anticheat");
if ((action == INTERACT_START_DIGGING || action == INTERACT_DIGGING_COMPLETED ||
action == INTERACT_PLACE || action == INTERACT_USE) &&
- enable_anticheat && !isSingleplayer()) {
+ !isSingleplayer()) {
v3f target_pos = player_pos;
if (pointed.type == POINTEDTHING_NODE) {
target_pos = intToFloat(pointed.node_undersurface, BS);
@@ -1136,7 +1149,7 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
/* Cheat prevention */
bool is_valid_dig = true;
- if (enable_anticheat && !isSingleplayer()) {
+ if (!isSingleplayer()) {
v3s16 nocheat_p = playersao->getNoCheatDigPos();
float nocheat_t = playersao->getNoCheatDigTime();
playersao->noCheatDigEnd();