diff options
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/connection.cpp | 24 | ||||
-rw-r--r-- | src/network/connectionthreads.cpp | 4 | ||||
-rw-r--r-- | src/network/serverpackethandler.cpp | 21 |
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(); |