Fix player HP desync between client and server

This commit is contained in:
savilli 2021-10-12 21:12:49 +03:00 committed by GitHub
parent ecc6f4ba25
commit 6ea558f8ac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 10 additions and 4 deletions

@ -826,7 +826,8 @@ void Server::handleCommand_Damage(NetworkPacket* pkt)
<< std::endl; << std::endl;
PlayerHPChangeReason reason(PlayerHPChangeReason::FALL); PlayerHPChangeReason reason(PlayerHPChangeReason::FALL);
playersao->setHP((s32)playersao->getHP() - (s32)damage, reason); playersao->setHP((s32)playersao->getHP() - (s32)damage, reason, false);
SendPlayerHPOrDie(playersao, reason); // correct client side prediction
} }
} }

@ -462,7 +462,7 @@ void PlayerSAO::rightClick(ServerActiveObject *clicker)
m_env->getScriptIface()->on_rightclickplayer(this, clicker); m_env->getScriptIface()->on_rightclickplayer(this, clicker);
} }
void PlayerSAO::setHP(s32 hp, const PlayerHPChangeReason &reason) void PlayerSAO::setHP(s32 hp, const PlayerHPChangeReason &reason, bool send)
{ {
if (hp == (s32)m_hp) if (hp == (s32)m_hp)
return; // Nothing to do return; // Nothing to do
@ -490,7 +490,8 @@ void PlayerSAO::setHP(s32 hp, const PlayerHPChangeReason &reason)
if ((hp == 0) != (oldhp == 0)) if ((hp == 0) != (oldhp == 0))
m_properties_sent = false; m_properties_sent = false;
m_env->getGameDef()->SendPlayerHPOrDie(this, reason); if (send)
m_env->getGameDef()->SendPlayerHPOrDie(this, reason);
} }
void PlayerSAO::setBreath(const u16 breath, bool send) void PlayerSAO::setBreath(const u16 breath, bool send)

@ -112,7 +112,11 @@ public:
u16 punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher, u16 punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher,
float time_from_last_punch); float time_from_last_punch);
void rightClick(ServerActiveObject *clicker); void rightClick(ServerActiveObject *clicker);
void setHP(s32 hp, const PlayerHPChangeReason &reason); void setHP(s32 hp, const PlayerHPChangeReason &reason) override
{
return setHP(hp, reason, true);
}
void setHP(s32 hp, const PlayerHPChangeReason &reason, bool send);
void setHPRaw(u16 hp) { m_hp = hp; } void setHPRaw(u16 hp) { m_hp = hp; }
u16 getBreath() const { return m_breath; } u16 getBreath() const { return m_breath; }
void setBreath(const u16 breath, bool send = true); void setBreath(const u16 breath, bool send = true);