summaryrefslogtreecommitdiff
path: root/src/script/lua_api/l_object.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/script/lua_api/l_object.cpp')
-rw-r--r--src/script/lua_api/l_object.cpp39
1 files changed, 30 insertions, 9 deletions
diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp
index 5fc6f9d3c..e4c478df7 100644
--- a/src/script/lua_api/l_object.cpp
+++ b/src/script/lua_api/l_object.cpp
@@ -194,13 +194,14 @@ int ObjectRef::l_punch(lua_State *L)
// If the punched is a player, and its HP changed
if (src_original_hp != co->getHP() &&
co->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
- getServer(L)->SendPlayerHPOrDie((PlayerSAO *)co);
+ getServer(L)->SendPlayerHPOrDie((PlayerSAO *)co, PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, puncher));
}
// If the puncher is a player, and its HP changed
if (dst_origin_hp != puncher->getHP() &&
puncher->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
- getServer(L)->SendPlayerHPOrDie((PlayerSAO *)puncher);
+ getServer(L)->SendPlayerHPOrDie((PlayerSAO *)puncher,
+ PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, co));
}
return 0;
}
@@ -226,17 +227,36 @@ int ObjectRef::l_right_click(lua_State *L)
int ObjectRef::l_set_hp(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
+
+ // Get Object
ObjectRef *ref = checkobject(L, 1);
luaL_checknumber(L, 2);
ServerActiveObject *co = getobject(ref);
- if (co == NULL) return 0;
+ if (co == NULL)
+ return 0;
+
+ // Get HP
int hp = lua_tonumber(L, 2);
- /*infostream<<"ObjectRef::l_set_hp(): id="<<co->getId()
- <<" hp="<<hp<<std::endl;*/
+
+ // Get Reason
+ PlayerHPChangeReason reason(PlayerHPChangeReason::SET_HP);
+ reason.from_mod = true;
+ if (lua_istable(L, 3)) {
+ lua_pushvalue(L, 3);
+
+ lua_getfield(L, -1, "type");
+ if (lua_isstring(L, -1) && !reason.setTypeFromString(lua_tostring(L, -1))) {
+ errorstream << "Bad type given!" << std::endl;
+ }
+ lua_pop(L, 1);
+
+ reason.lua_reference = luaL_ref(L, LUA_REGISTRYINDEX);
+ }
+
// Do it
- co->setHP(hp);
+ co->setHP(hp, reason);
if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER)
- getServer(L)->SendPlayerHPOrDie((PlayerSAO *)co);
+ getServer(L)->SendPlayerHPOrDie((PlayerSAO *)co, reason);
// Return
return 0;
@@ -729,9 +749,10 @@ int ObjectRef::l_set_properties(lua_State *L)
return 0;
read_object_properties(L, 2, prop, getServer(L)->idef());
if (prop->hp_max < co->getHP()) {
- co->setHP(prop->hp_max);
+ PlayerHPChangeReason reason(PlayerHPChangeReason::SET_HP);
+ co->setHP(prop->hp_max, reason);
if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER)
- getServer(L)->SendPlayerHPOrDie((PlayerSAO *)co);
+ getServer(L)->SendPlayerHPOrDie((PlayerSAO *)co, reason);
}
co->notifyObjectPropertiesModified();
return 0;