From 55a97f4605a263f4b670b447cd4af9ffa1a8d472 Mon Sep 17 00:00:00 2001
From: sapier <Sapier at GMX dot net>
Date: Sun, 5 May 2013 01:44:55 +0200
Subject: [PATCH] Allow nil as puncher e.g. to do damage by tnt

---
 src/content_sao.cpp      | 15 +++++++++++++--
 src/scriptapi_object.cpp | 23 ++++++++++++++++-------
 2 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/src/content_sao.cpp b/src/content_sao.cpp
index 24a9186f7..47b94a5d9 100644
--- a/src/content_sao.cpp
+++ b/src/content_sao.cpp
@@ -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);
diff --git a/src/scriptapi_object.cpp b/src/scriptapi_object.cpp
index 4dfdeb8c8..851f1761f 100644
--- a/src/scriptapi_object.cpp
+++ b/src/scriptapi_object.cpp
@@ -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;
-- 
GitLab