Skip to content

Commit 6ea558f

Browse files
authored
Fix player HP desync between client and server
1 parent ecc6f4b commit 6ea558f

File tree

3 files changed

+10
-4
lines changed

3 files changed

+10
-4
lines changed

src/network/serverpackethandler.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -826,7 +826,8 @@ void Server::handleCommand_Damage(NetworkPacket* pkt)
826826
<< std::endl;
827827

828828
PlayerHPChangeReason reason(PlayerHPChangeReason::FALL);
829-
playersao->setHP((s32)playersao->getHP() - (s32)damage, reason);
829+
playersao->setHP((s32)playersao->getHP() - (s32)damage, reason, false);
830+
SendPlayerHPOrDie(playersao, reason); // correct client side prediction
830831
}
831832
}
832833

src/server/player_sao.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ void PlayerSAO::rightClick(ServerActiveObject *clicker)
462462
m_env->getScriptIface()->on_rightclickplayer(this, clicker);
463463
}
464464

465-
void PlayerSAO::setHP(s32 hp, const PlayerHPChangeReason &reason)
465+
void PlayerSAO::setHP(s32 hp, const PlayerHPChangeReason &reason, bool send)
466466
{
467467
if (hp == (s32)m_hp)
468468
return; // Nothing to do
@@ -490,7 +490,8 @@ void PlayerSAO::setHP(s32 hp, const PlayerHPChangeReason &reason)
490490
if ((hp == 0) != (oldhp == 0))
491491
m_properties_sent = false;
492492

493-
m_env->getGameDef()->SendPlayerHPOrDie(this, reason);
493+
if (send)
494+
m_env->getGameDef()->SendPlayerHPOrDie(this, reason);
494495
}
495496

496497
void PlayerSAO::setBreath(const u16 breath, bool send)

src/server/player_sao.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,11 @@ class PlayerSAO : public UnitSAO
112112
u16 punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher,
113113
float time_from_last_punch);
114114
void rightClick(ServerActiveObject *clicker);
115-
void setHP(s32 hp, const PlayerHPChangeReason &reason);
115+
void setHP(s32 hp, const PlayerHPChangeReason &reason) override
116+
{
117+
return setHP(hp, reason, true);
118+
}
119+
void setHP(s32 hp, const PlayerHPChangeReason &reason, bool send);
116120
void setHPRaw(u16 hp) { m_hp = hp; }
117121
u16 getBreath() const { return m_breath; }
118122
void setBreath(const u16 breath, bool send = true);

0 commit comments

Comments
 (0)