Handle lua entity HP changes correctly (like punches)

fixes #11975
This commit is contained in:
sfan5 2022-05-26 21:32:51 +02:00
parent 85c824ed13
commit 303329f2d6
2 changed files with 21 additions and 10 deletions

@ -337,19 +337,9 @@ u32 LuaEntitySAO::punch(v3f dir,
if (result.did_punch) { if (result.did_punch) {
setHP((s32)getHP() - result.damage, setHP((s32)getHP() - result.damage,
PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, puncher)); PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, puncher));
// create message and add to list
sendPunchCommand();
} }
} }
if (getHP() == 0 && !isGone()) {
clearParentAttachment();
clearChildAttachments();
m_env->getScriptIface()->luaentity_on_death(m_id, puncher);
markForRemoval();
}
actionstream << puncher->getDescription() << " (id=" << puncher->getId() << actionstream << puncher->getDescription() << " (id=" << puncher->getId() <<
", hp=" << puncher->getHP() << ") punched " << ", hp=" << puncher->getHP() << ") punched " <<
getDescription() << " (id=" << m_id << ", hp=" << m_hp << getDescription() << " (id=" << m_id << ", hp=" << m_hp <<
@ -402,6 +392,20 @@ std::string LuaEntitySAO::getDescription()
void LuaEntitySAO::setHP(s32 hp, const PlayerHPChangeReason &reason) void LuaEntitySAO::setHP(s32 hp, const PlayerHPChangeReason &reason)
{ {
m_hp = rangelim(hp, 0, U16_MAX); m_hp = rangelim(hp, 0, U16_MAX);
sendPunchCommand();
if (m_hp == 0 && !isGone()) {
clearParentAttachment();
clearChildAttachments();
if (m_registered) {
ServerActiveObject *killer = nullptr;
if (reason.type == PlayerHPChangeReason::PLAYER_PUNCH)
killer = reason.object;
m_env->getScriptIface()->luaentity_on_death(m_id, killer);
}
markForRemoval();
}
} }
u16 LuaEntitySAO::getHP() const u16 LuaEntitySAO::getHP() const

@ -36,23 +36,30 @@ public:
{ {
} }
~LuaEntitySAO(); ~LuaEntitySAO();
ActiveObjectType getType() const { return ACTIVEOBJECT_TYPE_LUAENTITY; } ActiveObjectType getType() const { return ACTIVEOBJECT_TYPE_LUAENTITY; }
ActiveObjectType getSendType() const { return ACTIVEOBJECT_TYPE_GENERIC; } ActiveObjectType getSendType() const { return ACTIVEOBJECT_TYPE_GENERIC; }
virtual void addedToEnvironment(u32 dtime_s); virtual void addedToEnvironment(u32 dtime_s);
void step(float dtime, bool send_recommended); void step(float dtime, bool send_recommended);
std::string getClientInitializationData(u16 protocol_version); std::string getClientInitializationData(u16 protocol_version);
bool isStaticAllowed() const { return m_prop.static_save; } bool isStaticAllowed() const { return m_prop.static_save; }
bool shouldUnload() const { return true; } bool shouldUnload() const { return true; }
void getStaticData(std::string *result) const; void getStaticData(std::string *result) const;
u32 punch(v3f dir, const ToolCapabilities *toolcap = nullptr, u32 punch(v3f dir, const ToolCapabilities *toolcap = nullptr,
ServerActiveObject *puncher = nullptr, ServerActiveObject *puncher = nullptr,
float time_from_last_punch = 1000000.0f, float time_from_last_punch = 1000000.0f,
u16 initial_wear = 0); u16 initial_wear = 0);
void rightClick(ServerActiveObject *clicker); void rightClick(ServerActiveObject *clicker);
void setPos(const v3f &pos); void setPos(const v3f &pos);
void moveTo(v3f pos, bool continuous); void moveTo(v3f pos, bool continuous);
float getMinimumSavedMovement(); float getMinimumSavedMovement();
std::string getDescription(); std::string getDescription();
void setHP(s32 hp, const PlayerHPChangeReason &reason); void setHP(s32 hp, const PlayerHPChangeReason &reason);
u16 getHP() const; u16 getHP() const;