Allow nil as puncher e.g. to do damage by tnt
authorsapier <Sapier at GMX dot net>
Sat, 4 May 2013 23:44:55 +0000 (01:44 +0200)
committerPilzAdam <pilzadam@minetest.net>
Sun, 19 May 2013 23:18:45 +0000 (01:18 +0200)
src/content_sao.cpp
src/scriptapi_object.cpp

index 24a9186f77c0e1e0a8d6d0589f3f873ce36ba830..47b94a5d93af316a38ec1debf26155bed13907f4 100644 (file)
@@ -673,8 +673,14 @@ int LuaEntitySAO::punch(v3f dir,
        {
                setHP(getHP() - result.damage);
                
+
+               std::string punchername = "nil";
+
+               if ( puncher != 0 )
+                       punchername = puncher->getDescription();
+
                actionstream<<getDescription()<<" punched by "
-                               <<puncher->getDescription()<<", damage "<<result.damage
+                               <<punchername<<", damage "<<result.damage
                                <<" hp, health now "<<getHP()<<" hp"<<std::endl;
                
                {
@@ -1307,8 +1313,13 @@ int PlayerSAO::punch(v3f dir,
        HitParams hitparams = getHitParams(m_armor_groups, toolcap,
                        time_from_last_punch);
 
+       std::string punchername = "nil";
+
+       if ( puncher != 0 )
+               punchername = puncher->getDescription();
+
        actionstream<<"Player "<<m_player->getName()<<" punched by "
-                       <<puncher->getDescription()<<", damage "<<hitparams.hp
+                       <<punchername<<", damage "<<hitparams.hp
                        <<" HP"<<std::endl;
 
        setHP(getHP() - hitparams.hp);
index 4dfdeb8c88ee85a6aa30f63ef059d7451b5b0866..851f1761f15159de44217a996d66f64035afab6b 100644 (file)
@@ -182,21 +182,30 @@ int ObjectRef::l_moveto(lua_State *L)
 int ObjectRef::l_punch(lua_State *L)
 {
        ObjectRef *ref = checkobject(L, 1);
-       ObjectRef *puncher_ref = checkobject(L, 2);
        ServerActiveObject *co = getobject(ref);
-       ServerActiveObject *puncher = getobject(puncher_ref);
        if(co == NULL) return 0;
-       if(puncher == NULL) return 0;
-       v3f dir;
-       if(lua_type(L, 5) != LUA_TTABLE)
+
+       ServerActiveObject *puncher = 0;
+       v3f dir(0,0,0);
+
+       if (!lua_isnil(L,2)) {
+               ObjectRef *puncher_ref = checkobject(L, 2);
+               puncher = getobject(puncher_ref);
+               if(puncher == NULL) return 0;
+
                dir = co->getBasePosition() - puncher->getBasePosition();
-       else
-               dir = read_v3f(L, 5);
+       }
+
        float time_from_last_punch = 1000000;
        if(lua_isnumber(L, 3))
                time_from_last_punch = lua_tonumber(L, 3);
+
        ToolCapabilities toolcap = read_tool_capabilities(L, 4);
+
+       if(lua_type(L, 5) == LUA_TTABLE)
+               dir = read_v3f(L, 5);
        dir.normalize();
+
        // Do it
        co->punch(dir, &toolcap, puncher, time_from_last_punch);
        return 0;