]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/network/serverpackethandler.cpp
minimal: Move get_craft_result tests to test mod
[dragonfireclient.git] / src / network / serverpackethandler.cpp
index 2d810836ba5785a40b67aebf5e858e06188b4ec7..c81d15d5b6dbe8b37e4a4c9914e71f6eafde6af0 100644 (file)
@@ -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<<player->getName()<<" punches object "
-                                       <<pointed.object_id<<": "
-                                       <<pointed_object->getDescription()<<std::endl;
-
                        ItemStack punchitem = playersao->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()