]> git.lizzy.rs Git - minetest.git/commitdiff
No damage effects on hp_max change (#11846)
authorLars Müller <34514239+appgurueu@users.noreply.github.com>
Sat, 11 Jun 2022 18:00:40 +0000 (20:00 +0200)
committerGitHub <noreply@github.com>
Sat, 11 Jun 2022 18:00:40 +0000 (20:00 +0200)
src/client/client.cpp
src/client/clientevent.h
src/client/game.cpp
src/network/clientpackethandler.cpp
src/script/common/c_content.cpp
src/server.cpp
src/server.h
src/server/player_sao.cpp
src/server/player_sao.h

index d81ee434ed66535b2aa96dbca14ccd8f9cff9c87..37d4bd816b82284d03c932bd6527aa1646c482e1 100644 (file)
@@ -493,6 +493,7 @@ void Client::step(float dtime)
                        ClientEvent *event = new ClientEvent();
                        event->type = CE_PLAYER_DAMAGE;
                        event->player_damage.amount = damage;
+                       event->player_damage.effect = true;
                        m_client_event_queue.push(event);
                }
        }
index 17d3aedd6acc30cd5f9b5b1be0091200c110c3c5..243a945969595eaf1c28f24d24936158284822cc 100644 (file)
@@ -87,6 +87,7 @@ struct ClientEvent
                struct
                {
                        u16 amount;
+                       bool effect;
                } player_damage;
                struct
                {
index 44105463147eefa227ce2d27e3896a55bade3e90..5db472ee03d21402197c6070a521eed83ea84f46 100644 (file)
@@ -2605,6 +2605,9 @@ void Game::handleClientEvent_PlayerDamage(ClientEvent *event, CameraOrientation
        if (client->modsLoaded())
                client->getScript()->on_damage_taken(event->player_damage.amount);
 
+       if (!event->player_damage.effect)
+               return;
+
        // Damage flash and hurt tilt are not used at death
        if (client->getHP() > 0) {
                LocalPlayer *player = client->getEnv().getLocalPlayer();
index 78ace6a811a406eb10de65b69702112312b4a7f4..5fee908a35235536a1507ae288493ff162a4c5c8 100644 (file)
@@ -570,6 +570,10 @@ void Client::handleCommand_HP(NetworkPacket *pkt)
 
        u16 hp;
        *pkt >> hp;
+       bool damage_effect = true;
+       try {
+               *pkt >> damage_effect;
+       } catch (PacketError &e) {};
 
        player->hp = hp;
 
@@ -581,6 +585,7 @@ void Client::handleCommand_HP(NetworkPacket *pkt)
                ClientEvent *event = new ClientEvent();
                event->type = CE_PLAYER_DAMAGE;
                event->player_damage.amount = oldhp - hp;
+               event->player_damage.effect = damage_effect;
                m_client_event_queue.push(event);
        }
 }
index f232e9e5de6e81a72abe3fe53808c591ae0c8c62..33f42cd4a01fb19eb406c272b664b4c0e151b532 100644 (file)
@@ -198,7 +198,7 @@ void read_object_properties(lua_State *L, int index,
                prop->hp_max = (u16)rangelim(hp_max, 0, U16_MAX);
 
                if (prop->hp_max < sao->getHP()) {
-                       PlayerHPChangeReason reason(PlayerHPChangeReason::SET_HP);
+                       PlayerHPChangeReason reason(PlayerHPChangeReason::SET_HP_MAX);
                        sao->setHP(prop->hp_max, reason);
                }
        }
index 013c039c3c13ef1ac342240cdb5e37c05b7942e5..97d2b69b4737ef0e300124fb538e457347e0cad9 100644 (file)
@@ -1107,7 +1107,7 @@ PlayerSAO* Server::StageTwoClientInit(session_t peer_id)
        SendInventory(playersao, false);
 
        // Send HP
-       SendPlayerHP(playersao);
+       SendPlayerHP(playersao, false);
 
        // Send death screen
        if (playersao->isDead())
@@ -1374,7 +1374,7 @@ void Server::SendMovement(session_t peer_id)
 void Server::HandlePlayerHPChange(PlayerSAO *playersao, const PlayerHPChangeReason &reason)
 {
        m_script->player_event(playersao, "health_changed");
-       SendPlayerHP(playersao);
+       SendPlayerHP(playersao, reason.type != PlayerHPChangeReason::SET_HP_MAX);
 
        // Send to other clients
        playersao->sendPunchCommand();
@@ -1383,15 +1383,15 @@ void Server::HandlePlayerHPChange(PlayerSAO *playersao, const PlayerHPChangeReas
                HandlePlayerDeath(playersao, reason);
 }
 
-void Server::SendPlayerHP(PlayerSAO *playersao)
+void Server::SendPlayerHP(PlayerSAO *playersao, bool effect)
 {
-       SendHP(playersao->getPeerID(), playersao->getHP());
+       SendHP(playersao->getPeerID(), playersao->getHP(), effect);
 }
 
-void Server::SendHP(session_t peer_id, u16 hp)
+void Server::SendHP(session_t peer_id, u16 hp, bool effect)
 {
-       NetworkPacket pkt(TOCLIENT_HP, 1, peer_id);
-       pkt << hp;
+       NetworkPacket pkt(TOCLIENT_HP, 3, peer_id);
+       pkt << hp << effect;
        Send(&pkt);
 }
 
index f1958701f4355e7e50a94bdd4e28ee56da9151c7..79db913aac5e90c9d607f0e05eeaf42ec4990839 100644 (file)
@@ -353,7 +353,7 @@ class Server : public con::PeerHandler, public MapEventReceiver,
        void printToConsoleOnly(const std::string &text);
 
        void HandlePlayerHPChange(PlayerSAO *sao, const PlayerHPChangeReason &reason);
-       void SendPlayerHP(PlayerSAO *sao);
+       void SendPlayerHP(PlayerSAO *sao, bool effect);
        void SendPlayerBreath(PlayerSAO *sao);
        void SendInventory(PlayerSAO *playerSAO, bool incremental);
        void SendMovePlayer(session_t peer_id);
@@ -439,7 +439,7 @@ class Server : public con::PeerHandler, public MapEventReceiver,
        void init();
 
        void SendMovement(session_t peer_id);
-       void SendHP(session_t peer_id, u16 hp);
+       void SendHP(session_t peer_id, u16 hp, bool effect);
        void SendBreath(session_t peer_id, u16 breath);
        void SendAccessDenied(session_t peer_id, AccessDeniedCode reason,
                const std::string &custom_reason, bool reconnect = false);
index 27759ba9d73b5d3b49ae19e8d4dd8da922f456bf..c5f6d0a247108a608e0b193207ad0928dd72b614 100644 (file)
@@ -495,7 +495,7 @@ void PlayerSAO::setHP(s32 target_hp, const PlayerHPChangeReason &reason, bool fr
                m_hp = hp;
                m_env->getGameDef()->HandlePlayerHPChange(this, reason);
        } else if (from_client)
-               m_env->getGameDef()->SendPlayerHP(this);
+               m_env->getGameDef()->SendPlayerHP(this, true);
 }
 
 void PlayerSAO::setBreath(const u16 breath, bool send)
index b84bf1e823ed49d834740bce58b5d3e8dc4b0c0b..5f48cae67af887c2a28cf55ee134407a2b93f787 100644 (file)
@@ -235,6 +235,7 @@ struct PlayerHPChangeReason
        enum Type : u8
        {
                SET_HP,
+               SET_HP_MAX, // internal type to allow distinguishing hp reset and damage (for effects)
                PLAYER_PUNCH,
                FALL,
                NODE_DAMAGE,
@@ -277,6 +278,7 @@ struct PlayerHPChangeReason
        {
                switch (type) {
                case PlayerHPChangeReason::SET_HP:
+               case PlayerHPChangeReason::SET_HP_MAX:
                        return "set_hp";
                case PlayerHPChangeReason::PLAYER_PUNCH:
                        return "punch";