diff options
author | Loic Blot <loic.blot@unix-experience.fr> | 2015-03-18 10:03:51 +0100 |
---|---|---|
committer | Loic Blot <loic.blot@unix-experience.fr> | 2015-03-18 14:52:35 +0100 |
commit | 467fc0ddc912ae38c3bf9fcb99e0b66d7478eec0 (patch) | |
tree | fc0258fd520517b9e490e515414aac57cecdb963 | |
parent | 8f2e9bfbc2bba03e4bf3c0fcc4d4a36ac0c9569e (diff) | |
download | minetest-467fc0ddc912ae38c3bf9fcb99e0b66d7478eec0.tar.gz minetest-467fc0ddc912ae38c3bf9fcb99e0b66d7478eec0.tar.bz2 minetest-467fc0ddc912ae38c3bf9fcb99e0b66d7478eec0.zip |
Add a Lua call to do damages / heals
-rw-r--r-- | doc/lua_api.txt | 1 | ||||
-rw-r--r-- | src/script/lua_api/l_object.cpp | 41 | ||||
-rw-r--r-- | 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="<<co->getId() - <<" hp="<<hp<<std::endl;*/ + // Do it co->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); |