aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorsfan5 <sfan5@live.de>2022-05-26 21:32:51 +0200
committersfan5 <sfan5@live.de>2022-05-29 14:00:19 +0200
commit303329f2d6bc96f7756c72845de1bd87f62174a1 (patch)
tree5a33beaccb1d38b2c37fde0b1e69fd47faf28779 /src/server
parent85c824ed136269ee3ee0b650406ce80c8a60c014 (diff)
downloadminetest-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.cpp24
-rw-r--r--src/server/luaentity_sao.h7
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;