aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoic Blot <loic.blot@unix-experience.fr>2015-03-18 10:03:51 +0100
committerLoic Blot <loic.blot@unix-experience.fr>2015-03-18 14:52:35 +0100
commit467fc0ddc912ae38c3bf9fcb99e0b66d7478eec0 (patch)
treefc0258fd520517b9e490e515414aac57cecdb963
parent8f2e9bfbc2bba03e4bf3c0fcc4d4a36ac0c9569e (diff)
downloadminetest-467fc0ddc912ae38c3bf9fcb99e0b66d7478eec0.tar.gz
minetest-467fc0ddc912ae38c3bf9fcb99e0b66d7478eec0.tar.bz2
minetest-467fc0ddc912ae38c3bf9fcb99e0b66d7478eec0.zip
Add a Lua call to do damages / heals
-rw-r--r--doc/lua_api.txt1
-rw-r--r--src/script/lua_api/l_object.cpp41
-rw-r--r--src/script/lua_api/l_object.h6
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);