From 467fc0ddc912ae38c3bf9fcb99e0b66d7478eec0 Mon Sep 17 00:00:00 2001 From: Loic Blot Date: Wed, 18 Mar 2015 10:03:51 +0100 Subject: [PATCH] Add a Lua call to do damages / heals --- doc/lua_api.txt | 1 + src/script/lua_api/l_object.cpp | 41 ++++++++++++++++++++++++++++++--- src/script/lua_api/l_object.h | 6 +++++ 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index d7e956087..81a35976b 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2336,6 +2336,7 @@ This is basically a reference to a C++ `ServerActiveObject` * `right_click(clicker)`; `clicker` is another `ObjectRef` * `get_hp()`: returns number of hitpoints (2 * number of hearts) * `set_hp(hp)`: set number of hitpoints (2 * number of hearts) +* `apply_damage(damage)`: set amount of damage to object. If damage < 0, heal the target * `get_inventory()`: returns an `InvRef` * `get_wield_list()`: returns the name of the inventory list the wielded item is in * `get_wield_index()`: returns the index of the wielded item diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index d8cfaf82b..079558c51 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -29,6 +29,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "content_sao.h" #include "server.h" #include "hud.h" +#include "settings.h" +#include "main.h" struct EnumString es_HudElementType[] = @@ -255,10 +257,10 @@ int ObjectRef::l_set_hp(lua_State *L) ObjectRef *ref = checkobject(L, 1); luaL_checknumber(L, 2); ServerActiveObject *co = getobject(ref); - if(co == NULL) return 0; + if(co == NULL) + return 0; int hp = lua_tonumber(L, 2); - /*infostream<<"ObjectRef::l_set_hp(): id="<getId() - <<" hp="<setHP(hp); if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) { @@ -289,6 +291,38 @@ int ObjectRef::l_get_hp(lua_State *L) return 1; } +// apply_damage(self, damage) +// damage = amount of damage to apply +// if damage is negative, heal the player +// returns: nil +int ObjectRef::l_apply_damage(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + ObjectRef *ref = checkobject(L, 1); + luaL_checknumber(L, 2); + ServerActiveObject *co = getobject(ref); + if(co == NULL) + return 0; + + int damage = lua_tonumber(L, 2); + + // No damage, no heal => do nothing + if (damage == 0) + return 0; + + // If damage is positive (not healing) and damage is disabled, ignore + if (damage > 0 && g_settings->getBool("enable_damage") == false) + return 0; + + // Do damage/heal + co->setHP(co->getHP() - damage); + if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + getServer(L)->SendPlayerHPOrDie(((PlayerSAO*)co)->getPeerID(), co->getHP() == 0); + } + + return 0; +} + // get_inventory(self) int ObjectRef::l_get_inventory(lua_State *L) { @@ -1345,6 +1379,7 @@ const luaL_reg ObjectRef::methods[] = { luamethod(ObjectRef, right_click), luamethod(ObjectRef, set_hp), luamethod(ObjectRef, get_hp), + luamethod(ObjectRef, apply_damage), luamethod(ObjectRef, get_inventory), luamethod(ObjectRef, get_wield_list), luamethod(ObjectRef, get_wield_index), diff --git a/src/script/lua_api/l_object.h b/src/script/lua_api/l_object.h index d51ca379f..94b07070c 100644 --- a/src/script/lua_api/l_object.h +++ b/src/script/lua_api/l_object.h @@ -83,6 +83,12 @@ private: // 0 if not applicable to this type of object static int l_get_hp(lua_State *L); + // apply_damage(self, damage) + // damage = amount of damage to apply + // if damage is negative, heal the player + // returns: nil + static int l_apply_damage(lua_State *L); + // get_inventory(self) static int l_get_inventory(lua_State *L);