]> 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 91caee0bd9ba452049619bff55502569dd9826ba..c81d15d5b6dbe8b37e4a4c9914e71f6eafde6af0 100644 (file)
@@ -473,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;
@@ -609,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) &&
@@ -625,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;
@@ -774,7 +776,7 @@ void Server::handleCommand_ChatMessage(NetworkPacket* pkt)
 
 void Server::handleCommand_Damage(NetworkPacket* pkt)
 {
-       u8 damage;
+       u16 damage;
 
        *pkt >> damage;
 
@@ -797,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()
@@ -810,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);
        }
 }
@@ -950,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");
@@ -967,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: "
@@ -1107,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());
@@ -1151,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);
@@ -1164,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);