diff options
author | sfan5 <sfan5@live.de> | 2022-05-26 21:32:51 +0200 |
---|---|---|
committer | sfan5 <sfan5@live.de> | 2022-05-29 14:00:19 +0200 |
commit | 303329f2d6bc96f7756c72845de1bd87f62174a1 (patch) | |
tree | 5a33beaccb1d38b2c37fde0b1e69fd47faf28779 /src/server | |
parent | 85c824ed136269ee3ee0b650406ce80c8a60c014 (diff) | |
download | minetest-303329f2d6bc96f7756c72845de1bd87f62174a1.tar.gz minetest-303329f2d6bc96f7756c72845de1bd87f62174a1.tar.bz2 minetest-303329f2d6bc96f7756c72845de1bd87f62174a1.zip |
Handle lua entity HP changes correctly (like punches)
fixes #11975
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/luaentity_sao.cpp | 24 | ||||
-rw-r--r-- | src/server/luaentity_sao.h | 7 |
2 files changed, 21 insertions, 10 deletions
diff --git a/src/server/luaentity_sao.cpp b/src/server/luaentity_sao.cpp index 82f6da231..a4b37ee09 100644 --- a/src/server/luaentity_sao.cpp +++ b/src/server/luaentity_sao.cpp @@ -337,19 +337,9 @@ u32 LuaEntitySAO::punch(v3f dir, if (result.did_punch) { setHP((s32)getHP() - result.damage, 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() << ", hp=" << puncher->getHP() << ") punched " << getDescription() << " (id=" << m_id << ", hp=" << m_hp << @@ -402,6 +392,20 @@ std::string LuaEntitySAO::getDescription() void LuaEntitySAO::setHP(s32 hp, const PlayerHPChangeReason &reason) { 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 diff --git a/src/server/luaentity_sao.h b/src/server/luaentity_sao.h index 87b664a8b..5a5aea7a9 100644 --- a/src/server/luaentity_sao.h +++ b/src/server/luaentity_sao.h @@ -36,23 +36,30 @@ public: { } ~LuaEntitySAO(); + ActiveObjectType getType() const { return ACTIVEOBJECT_TYPE_LUAENTITY; } ActiveObjectType getSendType() const { return ACTIVEOBJECT_TYPE_GENERIC; } virtual void addedToEnvironment(u32 dtime_s); void step(float dtime, bool send_recommended); std::string getClientInitializationData(u16 protocol_version); + bool isStaticAllowed() const { return m_prop.static_save; } bool shouldUnload() const { return true; } void getStaticData(std::string *result) const; + u32 punch(v3f dir, const ToolCapabilities *toolcap = nullptr, ServerActiveObject *puncher = nullptr, float time_from_last_punch = 1000000.0f, u16 initial_wear = 0); + void rightClick(ServerActiveObject *clicker); + void setPos(const v3f &pos); void moveTo(v3f pos, bool continuous); float getMinimumSavedMovement(); + std::string getDescription(); + void setHP(s32 hp, const PlayerHPChangeReason &reason); u16 getHP() const; |