Make line_of_sight return blocking node position
authorstujones11 <stujones11@server.fake>
Wed, 11 Dec 2013 20:33:39 +0000 (20:33 +0000)
committerShadowNinja <shadowninja@minetest.net>
Thu, 12 Dec 2013 21:11:00 +0000 (16:11 -0500)
doc/lua_api.txt
src/environment.cpp
src/environment.h
src/script/lua_api/l_env.cpp

index ae714444212d1eaa2984ce7d90825461eea54896..a8b671eb6ed3ff97380437c313effa52c96218e3 100644 (file)
@@ -1308,8 +1308,9 @@ minetest.set_mapgen_params(MapgenParams)
 ^ flags and flagmask are in the same format and have the same options as 'mgflags' in minetest.conf
 minetest.clear_objects()
 ^ clear all objects in the environments
-minetest.line_of_sight(pos1,pos2,stepsize) ->true/false
-^ checkif there is a direct line of sight between pos1 and pos2
+minetest.line_of_sight(pos1, pos2, stepsize) -> true/false, pos
+^ Check if there is a direct line of sight between pos1 and pos2
+^ Returns the position of the blocking node when false
 ^ pos1 First position
 ^ pos2 Second position
 ^ stepsize smaller gives more accurate results but requires more computing
index e4567a78e2318f8c95653bcbf15ed1af5d18e938..7fe5d356aa4993a2dc6e8da51b456ac87556b32f 100644 (file)
@@ -354,7 +354,7 @@ ServerMap & ServerEnvironment::getServerMap()
        return *m_map;
 }
 
-bool ServerEnvironment::line_of_sight(v3f pos1, v3f pos2, float stepsize)
+bool ServerEnvironment::line_of_sight(v3f pos1, v3f pos2, float stepsize, v3s16 *p)
 {
        float distance = pos1.getDistanceFrom(pos2);
 
@@ -372,6 +372,9 @@ bool ServerEnvironment::line_of_sight(v3f pos1, v3f pos2, float stepsize)
                MapNode n = getMap().getNodeNoEx(pos);
 
                if(n.param0 != CONTENT_AIR) {
+                       if (p) {
+                               *p = pos;
+                       }
                        return false;
                }
        }
index 9f9a0a23ccbf1bc6e35096086985722c769c565b..d9804e78199da863977bd49cd7f35fb1f77b15a7 100644 (file)
@@ -295,7 +295,7 @@ public:
        void step(f32 dtime);
        
        //check if there's a line of sight between two positions
-       bool line_of_sight(v3f pos1, v3f pos2, float stepsize=1.0);
+       bool line_of_sight(v3f pos1, v3f pos2, float stepsize=1.0, v3s16 *p=NULL);
 
        u32 getGameTime() { return m_game_time; }
 
index 4a815039641ee0986f0f85a2749f21026faa38c2..d0188940171bd0fac346ba1dd44e2f2b56015143 100644 (file)
@@ -648,7 +648,7 @@ int ModApiEnvMod::l_clear_objects(lua_State *L)
        return 0;
 }
 
-// minetest.line_of_sight(pos1, pos2, stepsize) -> true/false
+// minetest.line_of_sight(pos1, pos2, stepsize) -> true/false, pos
 int ModApiEnvMod::l_line_of_sight(lua_State *L) {
        float stepsize = 1.0;
 
@@ -663,7 +663,13 @@ int ModApiEnvMod::l_line_of_sight(lua_State *L) {
                stepsize = lua_tonumber(L, 3);
        }
 
-       lua_pushboolean(L, env->line_of_sight(pos1,pos2,stepsize));
+       v3s16 p;
+       bool success = env->line_of_sight(pos1, pos2, stepsize, &p);
+       lua_pushboolean(L, success);
+       if (!success) {
+               push_v3s16(L, p);
+               return 2;
+       }
        return 1;
 }