Send Player HP when setHP (or a setHP caller) is called instead of looping and testin...
authorLoic Blot <loic.blot@unix-experience.fr>
Mon, 2 Mar 2015 16:31:31 +0000 (17:31 +0100)
committerLoic Blot <loic.blot@unix-experience.fr>
Tue, 3 Mar 2015 15:06:04 +0000 (16:06 +0100)
src/content_sao.cpp
src/content_sao.h
src/network/packethandlers/server.cpp
src/script/lua_api/l_object.cpp
src/server.cpp
src/server.h

index 8cb8fa788303143de89018c0d5379bf4186e54db..835996cc7e90710349ec796ce6135f5646dd4cfd 100644 (file)
@@ -718,7 +718,6 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
        // public
        m_moved(false),
        m_inventory_not_sent(false),
-       m_hp_not_sent(false),
        m_breath_not_sent(false),
        m_wielded_item_not_sent(false),
        m_physics_override_speed(1),
@@ -1081,27 +1080,18 @@ void PlayerSAO::setHP(s16 hp)
 {
        s16 oldhp = m_player->hp;
 
-       if(hp < 0)
+       if (hp < 0)
                hp = 0;
-       else if(hp > PLAYER_MAX_HP)
+       else if (hp > PLAYER_MAX_HP)
                hp = PLAYER_MAX_HP;
 
-       if(hp < oldhp && g_settings->getBool("enable_damage") == false)
-       {
-               m_hp_not_sent = true; // fix wrong prediction on client
-               return;
-       }
-
        m_player->hp = hp;
 
-       if(hp != oldhp) {
-               m_hp_not_sent = true;
-               if(oldhp > hp)
-                       m_damage += oldhp - hp;
-       }
+       if (oldhp > hp)
+               m_damage += (oldhp - hp);
 
        // Update properties on death
-       if((hp == 0) != (oldhp == 0))
+       if ((hp == 0) != (oldhp == 0))
                m_properties_sent = false;
 }
 
index 05f727e162c24f0a2b7513359b1ccd3f5ad0087a..efbece3cad2273d722a85fba41e01b1cef428215 100644 (file)
@@ -318,7 +318,6 @@ public:
        // Some flags used by Server
        bool m_moved;
        bool m_inventory_not_sent;
-       bool m_hp_not_sent;
        bool m_breath_not_sent;
        bool m_wielded_item_not_sent;
 
index 137327e0b1e4120e78480e14cc0d683d4f04cd2c..d9ba8c314a5780fa02aba5804e003def818bfc6c 100644 (file)
@@ -893,12 +893,7 @@ void Server::handleCommand_Damage(NetworkPacket* pkt)
                                << std::endl;
 
                playersao->setHP(playersao->getHP() - damage);
-
-               if (playersao->getHP() == 0 && playersao->m_hp_not_sent)
-                       DiePlayer(pkt->getPeerId());
-
-               if (playersao->m_hp_not_sent)
-                       SendPlayerHP(pkt->getPeerId());
+               SendPlayerHPOrDie(playersao->getPeerID(), playersao->getHP() == 0);
        }
 }
 
@@ -1048,8 +1043,8 @@ void Server::handleCommand_Respawn(NetworkPacket* pkt)
 
        RespawnPlayer(pkt->getPeerId());
 
-       actionstream<<player->getName()<<" respawns at "
-                       <<PP(player->getPosition()/BS)<<std::endl;
+       actionstream << player->getName() << " respawns at "
+                       << PP(player->getPosition()/BS) << std::endl;
 
        // ActiveObject is added to environment in AsyncRunStep after
        // the previous addition has been succesfully removed
@@ -1234,8 +1229,24 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
                                                ).normalize();
                        float time_from_last_punch =
                                playersao->resetTimeFromLastPunch();
+
+                       s16 src_original_hp = pointed_object->getHP();
+                       s16 dst_origin_hp = playersao->getHP();
+
                        pointed_object->punch(dir, &toolcap, playersao,
                                        time_from_last_punch);
+
+                       // If the object is a player and its HP changed
+                       if (src_original_hp != pointed_object->getHP() &&
+                                       pointed_object->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
+                               SendPlayerHPOrDie(((PlayerSAO*)pointed_object)->getPeerID(),
+                                               pointed_object->getHP() == 0);
+                       }
+
+                       // If the puncher is a player and its HP changed
+                       if (dst_origin_hp != playersao->getHP()) {
+                               SendPlayerHPOrDie(playersao->getPeerID(), playersao->getHP() == 0);
+                       }
                }
 
        } // action == 0
index 73f6e93b3ee20ebe2c1d1db9ab56d0b05958ca39..e6a50c3bacbbb1053ce689e2e19071539063c610 100644 (file)
@@ -208,8 +208,26 @@ int ObjectRef::l_punch(lua_State *L)
                time_from_last_punch = lua_tonumber(L, 3);
        ToolCapabilities toolcap = read_tool_capabilities(L, 4);
        dir.normalize();
+
+       s16 src_original_hp = co->getHP();
+       s16 dst_origin_hp = puncher->getHP();
+
        // Do it
        co->punch(dir, &toolcap, puncher, time_from_last_punch);
+
+       // If the punched is a player, and its HP changed
+       if (src_original_hp != co->getHP() &&
+                       co->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
+               getServer(L)->SendPlayerHPOrDie(((PlayerSAO*)co)->getPeerID(),
+                               co->getHP() == 0);
+       }
+
+       // If the puncher is a player, and its HP changed
+       if (dst_origin_hp != puncher->getHP() &&
+                       puncher->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
+               getServer(L)->SendPlayerHPOrDie(((PlayerSAO*)puncher)->getPeerID(),
+                               puncher->getHP() == 0);
+       }
        return 0;
 }
 
@@ -243,6 +261,9 @@ int ObjectRef::l_set_hp(lua_State *L)
                        <<" hp="<<hp<<std::endl;*/
        // Do it
        co->setHP(hp);
+       if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
+               getServer(L)->SendPlayerHPOrDie(((PlayerSAO*)co)->getPeerID(), co->getHP() == 0);
+       }
        // Return
        return 0;
 }
index 6a1e8085b530b5c8f343239d511a30540085d5fe..3536471bf46f09a0bb36f4ef2a3cf9a8987e56de 100644 (file)
@@ -604,17 +604,6 @@ void Server::AsyncRunStep(bool initial_step)
                        if(playersao == NULL)
                                continue;
 
-                       /*
-                               Handle player HPs (die if hp=0)
-                       */
-                       if(playersao->m_hp_not_sent && g_settings->getBool("enable_damage"))
-                       {
-                               if(playersao->getHP() == 0)
-                                       DiePlayer(*i);
-                               else
-                                       SendPlayerHP(*i);
-                       }
-
                        /*
                                Send player breath if changed
                        */
@@ -1889,7 +1878,6 @@ void Server::SendPlayerHP(u16 peer_id)
        DSTACK(__FUNCTION_NAME);
        PlayerSAO *playersao = getPlayerSAO(peer_id);
        assert(playersao);
-       playersao->m_hp_not_sent = false;
        SendHP(peer_id, playersao->getHP());
        m_script->player_event(playersao,"health_changed");
 
@@ -2588,9 +2576,9 @@ void Server::DiePlayer(u16 peer_id)
        PlayerSAO *playersao = getPlayerSAO(peer_id);
        assert(playersao);
 
-       infostream<<"Server::DiePlayer(): Player "
-                       <<playersao->getPlayer()->getName()
-                       <<" dies"<<std::endl;
+       infostream << "Server::DiePlayer(): Player "
+                       << playersao->getPlayer()->getName()
+                       << " dies" << std::endl;
 
        playersao->setHP(0);
 
@@ -2608,13 +2596,15 @@ void Server::RespawnPlayer(u16 peer_id)
        PlayerSAO *playersao = getPlayerSAO(peer_id);
        assert(playersao);
 
-       infostream<<"Server::RespawnPlayer(): Player "
-                       <<playersao->getPlayer()->getName()
-                       <<" respawns"<<std::endl;
+       infostream << "Server::RespawnPlayer(): Player "
+                       << playersao->getPlayer()->getName()
+                       << " respawns" << std::endl;
 
        playersao->setHP(PLAYER_MAX_HP);
        playersao->setBreath(PLAYER_MAX_BREATH);
 
+       SendPlayerHP(peer_id);
+
        bool repositioned = m_script->on_respawnplayer(playersao);
        if(!repositioned){
                v3f pos = findSpawnPos(m_env->getServerMap());
index fa9f9ebcf491e1066bbb7058cc2fabd2fc261116..5dbbcd22b2f4d0ed152d6814780eff6d355d279f 100644 (file)
@@ -372,6 +372,7 @@ public:
                        u8* ser_vers, u16* prot_vers, u8* major, u8* minor, u8* patch,
                        std::string* vers_string);
 
+       void SendPlayerHPOrDie(u16 peer_id, bool die) { die ? DiePlayer(peer_id) : SendPlayerHP(peer_id); }
        // Bind address
        Address m_bind_addr;