Add a Lua call to do damages / heals
authorLoic Blot <loic.blot@unix-experience.fr>
Wed, 18 Mar 2015 09:03:51 +0000 (10:03 +0100)
committerLoic Blot <loic.blot@unix-experience.fr>
Wed, 18 Mar 2015 13:52:35 +0000 (14:52 +0100)
doc/lua_api.txt
src/script/lua_api/l_object.cpp
src/script/lua_api/l_object.h

index d7e95608716a68802ac5c987cfdb92431d891d24..81a35976bb8f98e97be948412f81842349469c59 100644 (file)
@@ -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
index d8cfaf82b2fdea8f808f3ce18a0d2fcf05eaa464..079558c515bb4b2b66d98fcbf61a6ef685e9f074 100644 (file)
@@ -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),
index d51ca379f47c2707d75e891ad2acd858579247ea..94b07070c4479c8dde4ad1ae8d8523a1ba75d32b 100644 (file)
@@ -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);