X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fnetwork%2Fserverpackethandler.cpp;h=c81d15d5b6dbe8b37e4a4c9914e71f6eafde6af0;hb=b994a35d978d3f1dd172ff9a77515d4fcba5e89c;hp=2d810836ba5785a40b67aebf5e858e06188b4ec7;hpb=dfc81983491417c5cd1c99d7db05e421c409379d;p=dragonfireclient.git diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index 2d810836b..c81d15d5b 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -320,7 +320,7 @@ void Server::handleCommand_Init2(NetworkPacket* pkt) float time_speed = g_settings->getFloat("time_speed"); SendTimeOfDay(pkt->getPeerId(), time, time_speed); - SendCSMFlavourLimits(pkt->getPeerId()); + SendCSMRestrictionFlags(pkt->getPeerId()); // Warnings about protocol version can be issued here if (getClient(pkt->getPeerId())->net_proto_version < LATEST_PROTOCOL_VERSION) { @@ -402,11 +402,8 @@ void Server::handleCommand_ClientReady(NetworkPacket* pkt) m_clients.event(peer_id, CSE_SetClientReady); m_script->on_joinplayer(playersao); // Send shutdown timer if shutdown has been scheduled - if (m_shutdown_timer > 0.0f) { - std::wstringstream ws; - ws << L"*** Server shutting down in " - << duration_to_string(myround(m_shutdown_timer)).c_str() << "."; - SendChatMessage(pkt->getPeerId(), ws.str()); + if (m_shutdown_state.isTimerRunning()) { + SendChatMessage(pkt->getPeerId(), m_shutdown_state.getShutdownTimerMessage()); } } @@ -476,8 +473,8 @@ void Server::process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao, playersao->setBasePosition(position); player->setSpeed(speed); - playersao->setPitch(pitch); - playersao->setYaw(yaw); + playersao->setLookPitch(pitch); + playersao->setPlayerYaw(yaw); playersao->setFov(fov); playersao->setWantedRange(wanted_range); player->keyPressed = keyPressed; @@ -612,7 +609,9 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) ma->to_inv.applyCurrentPlayer(player->getName()); setInventoryModified(ma->from_inv, false); - setInventoryModified(ma->to_inv, false); + if (ma->from_inv != ma->to_inv) { + setInventoryModified(ma->to_inv, false); + } bool from_inv_is_current_player = (ma->from_inv.type == InventoryLocation::PLAYER) && @@ -628,7 +627,7 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) // Check for out-of-range interaction if (remote->type == InventoryLocation::NODEMETA) { v3f node_pos = intToFloat(remote->p, BS); - v3f player_pos = player->getPlayerSAO()->getBasePosition(); + v3f player_pos = player->getPlayerSAO()->getEyePosition(); f32 d = player_pos.getDistanceFrom(node_pos); if (!checkInteractDistance(player, d, "inventory")) return; @@ -777,7 +776,7 @@ void Server::handleCommand_ChatMessage(NetworkPacket* pkt) void Server::handleCommand_Damage(NetworkPacket* pkt) { - u8 damage; + u16 damage; *pkt >> damage; @@ -800,7 +799,7 @@ void Server::handleCommand_Damage(NetworkPacket* pkt) return; } - if (g_settings->getBool("enable_damage")) { + if (!playersao->isImmortal()) { if (playersao->isDead()) { verbosestream << "Server::ProcessData(): Info: " "Ignoring damage as player " << player->getName() @@ -813,7 +812,7 @@ void Server::handleCommand_Damage(NetworkPacket* pkt) << std::endl; PlayerHPChangeReason reason(PlayerHPChangeReason::FALL); - playersao->setHP(playersao->getHP() - damage, reason); + playersao->setHP((s32)playersao->getHP() - (s32)damage, reason); SendPlayerHPOrDie(playersao, reason); } } @@ -953,7 +952,7 @@ void Server::handleCommand_Respawn(NetworkPacket* pkt) // the previous addition has been successfully removed } -bool Server::checkInteractDistance(RemotePlayer *player, const f32 d, const std::string what) +bool Server::checkInteractDistance(RemotePlayer *player, const f32 d, const std::string &what) { PlayerSAO *playersao = player->getPlayerSAO(); const InventoryList *hlist = playersao->getInventory()->getList("hand"); @@ -970,8 +969,9 @@ bool Server::checkInteractDistance(RemotePlayer *player, const f32 d, const std: else if (max_d < 0) max_d = BS * 4.0f; - // cube diagonal: sqrt(3) = 1.732 - if (d > max_d * 1.732) { + // Cube diagonal * 1.5 for maximal supported node extents: + // sqrt(3) * 1.5 ≅ 2.6 + if (d > max_d + 2.6f * BS) { actionstream << "Player " << player->getName() << " tried to access " << what << " from too far: " @@ -1110,7 +1110,9 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) if ((action == 0 || action == 2 || action == 3 || action == 4) && enable_anticheat && !isSingleplayer()) { - float d = player_pos.getDistanceFrom(pointed_pos_under); + float d = playersao->getEyePosition() + .getDistanceFrom(pointed_pos_under); + if (!checkInteractDistance(player, d, pointed.dump())) { // Re-send block to revert change on client-side RemoteClient *client = getClient(pkt->getPeerId()); @@ -1154,10 +1156,6 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) if (pointed_object->isGone()) return; - actionstream<getName()<<" punches object " - <getDescription()<getWieldedItemOrHand(); ToolCapabilities toolcap = punchitem.getToolCapabilities(m_itemdef); @@ -1167,8 +1165,8 @@ void Server::handleCommand_Interact(NetworkPacket* pkt) float time_from_last_punch = playersao->resetTimeFromLastPunch(); - s16 src_original_hp = pointed_object->getHP(); - s16 dst_origin_hp = playersao->getHP(); + u16 src_original_hp = pointed_object->getHP(); + u16 dst_origin_hp = playersao->getHP(); pointed_object->punch(dir, &toolcap, playersao, time_from_last_punch); @@ -1514,9 +1512,11 @@ void Server::handleCommand_InventoryFields(NetworkPacket* pkt) if (peer_state_iterator != m_formspec_state_data.end()) { const std::string &server_formspec_name = peer_state_iterator->second; if (client_formspec_name == server_formspec_name) { - m_script->on_playerReceiveFields(playersao, client_formspec_name, fields); - if (fields["quit"] == "true") + auto it = fields.find("quit"); + if (it != fields.end() && it->second == "true") m_formspec_state_data.erase(peer_state_iterator); + + m_script->on_playerReceiveFields(playersao, client_formspec_name, fields); return; } actionstream << "'" << player->getName()