aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRiley Adams <radar6255@yahoo.com>2023-04-10 18:04:52 -0400
committerGitHub <noreply@github.com>2023-04-10 23:04:52 +0100
commit73391013f7fbc0558b96146e2014bdcf3c675e4d (patch)
tree194359ce008c07fc25e971cf68d496907c5812e3
parent1d88d85f1c132fc0c84cb19f5540ebab822c9c58 (diff)
downloadminetest-73391013f7fbc0558b96146e2014bdcf3c675e4d.tar.xz
Add node pos to node damage HP change reason (#13196)
-rw-r--r--doc/lua_api.txt1
-rw-r--r--src/script/cpp_api/s_base.cpp3
-rw-r--r--src/server/player_sao.cpp5
-rw-r--r--src/server/player_sao.h3
4 files changed, 10 insertions, 2 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 2179f44b5..3e85da2f6 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -5266,6 +5266,7 @@ Call these functions only at load time!
* `fall`
* `node_damage`: `damage_per_second` from a neighboring node.
`reason.node` will hold the node name or nil.
+ `reason.node_pos` will hold the position of the node
* `drown`
* `respawn`
* Any of the above types may have additional fields from mods.
diff --git a/src/script/cpp_api/s_base.cpp b/src/script/cpp_api/s_base.cpp
index b91f59613..c2b2f8a90 100644
--- a/src/script/cpp_api/s_base.cpp
+++ b/src/script/cpp_api/s_base.cpp
@@ -488,6 +488,9 @@ void ScriptApiBase::pushPlayerHPChangeReason(lua_State *L, const PlayerHPChangeR
if (!reason.node.empty()) {
lua_pushstring(L, reason.node.c_str());
lua_setfield(L, -2, "node");
+
+ push_v3s16(L, reason.node_pos);
+ lua_setfield(L, -2, "node_pos");
}
}
diff --git a/src/server/player_sao.cpp b/src/server/player_sao.cpp
index 9aa7ce39f..1255a4461 100644
--- a/src/server/player_sao.cpp
+++ b/src/server/player_sao.cpp
@@ -185,6 +185,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
if (!isImmortal() && m_node_hurt_interval.step(dtime, 1.0f)) {
u32 damage_per_second = 0;
std::string nodename;
+ v3s16 node_pos;
// Lowest and highest damage points are 0.1 within collisionbox
float dam_top = m_prop.collisionbox.MaxEdge.Y - 0.1f;
@@ -198,6 +199,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
if (c.damage_per_second > damage_per_second) {
damage_per_second = c.damage_per_second;
nodename = c.name;
+ node_pos = p;
}
}
@@ -209,11 +211,12 @@ void PlayerSAO::step(float dtime, bool send_recommended)
if (c.damage_per_second > damage_per_second) {
damage_per_second = c.damage_per_second;
nodename = c.name;
+ node_pos = ptop;
}
if (damage_per_second != 0 && m_hp > 0) {
s32 newhp = (s32)m_hp - (s32)damage_per_second;
- PlayerHPChangeReason reason(PlayerHPChangeReason::NODE_DAMAGE, nodename);
+ PlayerHPChangeReason reason(PlayerHPChangeReason::NODE_DAMAGE, nodename, node_pos);
setHP(newhp, reason);
}
}
diff --git a/src/server/player_sao.h b/src/server/player_sao.h
index bd190d323..6d8498d8d 100644
--- a/src/server/player_sao.h
+++ b/src/server/player_sao.h
@@ -245,6 +245,7 @@ struct PlayerHPChangeReason
ServerActiveObject *object = nullptr;
// For NODE_DAMAGE
std::string node;
+ v3s16 node_pos;
inline bool hasLuaReference() const { return lua_reference >= 0; }
@@ -296,5 +297,5 @@ struct PlayerHPChangeReason
{
}
- PlayerHPChangeReason(Type type, std::string node) : type(type), node(node) {}
+ PlayerHPChangeReason(Type type, std::string node, v3s16 node_pos) : type(type), node(node), node_pos(node_pos) {}
};