aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstujones11 <stujones11@server.fake>2013-12-11 20:33:39 +0000
committerShadowNinja <shadowninja@minetest.net>2013-12-12 16:11:00 -0500
commitd9ef072305b92b020ebe473765118cca0e23608a (patch)
treed3232745cfe75bed24cbaeff33c1a11409bbd139
parent33de69a173a3646d8f5b9bf91b3e48d76cd40ae6 (diff)
downloadminetest-d9ef072305b92b020ebe473765118cca0e23608a.tar.gz
minetest-d9ef072305b92b020ebe473765118cca0e23608a.tar.bz2
minetest-d9ef072305b92b020ebe473765118cca0e23608a.zip
Make line_of_sight return blocking node position
-rw-r--r--doc/lua_api.txt5
-rw-r--r--src/environment.cpp5
-rw-r--r--src/environment.h2
-rw-r--r--src/script/lua_api/l_env.cpp10
4 files changed, 16 insertions, 6 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index ae7144442..a8b671eb6 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -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
diff --git a/src/environment.cpp b/src/environment.cpp
index e4567a78e..7fe5d356a 100644
--- a/src/environment.cpp
+++ b/src/environment.cpp
@@ -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;
}
}
diff --git a/src/environment.h b/src/environment.h
index 9f9a0a23c..d9804e781 100644
--- a/src/environment.h
+++ b/src/environment.h
@@ -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; }
diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp
index 4a8150396..d01889401 100644
--- a/src/script/lua_api/l_env.cpp
+++ b/src/script/lua_api/l_env.cpp
@@ -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;
}