]> git.lizzy.rs Git - minetest.git/commitdiff
PlayerSAO: Run on_player_hpchange raw change values (#10478)
authorSmallJoker <SmallJoker@users.noreply.github.com>
Thu, 12 Nov 2020 18:15:41 +0000 (19:15 +0100)
committerGitHub <noreply@github.com>
Thu, 12 Nov 2020 18:15:41 +0000 (19:15 +0100)
The callback is only run when a change in HP is to be expected.
Following cases will not trigger the callback:
 * Dead player damaged further
 * Healing full-health player
 * Change of 0 HP

src/server/player_sao.cpp

index 9fb53380c35bed6fb6f88ca733475502b0919044..62515d1c938f02aa5743c6c2ab1b5263c0fcdce3 100644 (file)
@@ -458,20 +458,25 @@ u16 PlayerSAO::punch(v3f dir,
 
 void PlayerSAO::setHP(s32 hp, const PlayerHPChangeReason &reason)
 {
-       s32 oldhp = m_hp;
+       if (hp == (s32)m_hp)
+               return; // Nothing to do
 
-       hp = rangelim(hp, 0, m_prop.hp_max);
+       if (m_hp <= 0 && hp < (s32)m_hp)
+               return; // Cannot take more damage
 
-       if (oldhp != hp) {
-               s32 hp_change = m_env->getScriptIface()->on_player_hpchange(this, hp - oldhp, reason);
+       {
+               s32 hp_change = m_env->getScriptIface()->on_player_hpchange(this, hp - m_hp, reason);
                if (hp_change == 0)
                        return;
 
-               hp = rangelim(oldhp + hp_change, 0, m_prop.hp_max);
+               hp = m_hp + hp_change;
        }
 
+       s32 oldhp = m_hp;
+       hp = rangelim(hp, 0, m_prop.hp_max);
+
        if (hp < oldhp && isImmortal())
-               return;
+               return; // Do not allow immortal players to be damaged
 
        m_hp = hp;