From: SmallJoker Date: Thu, 12 Nov 2020 18:15:41 +0000 (+0100) Subject: PlayerSAO: Run on_player_hpchange raw change values (#10478) X-Git-Tag: 03-12-2020~13^2~26 X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=adffef2b94f2d9cb3104cbc75e315cda3c0728aa;p=dragonfireclient.git PlayerSAO: Run on_player_hpchange raw change values (#10478) 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 --- diff --git a/src/server/player_sao.cpp b/src/server/player_sao.cpp index 9fb53380c..62515d1c9 100644 --- a/src/server/player_sao.cpp +++ b/src/server/player_sao.cpp @@ -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;