Skip to content

Commit

Permalink
Make line_of_sight return blocking node position
Browse files Browse the repository at this point in the history
  • Loading branch information
stujones11 authored and ShadowNinja committed Dec 12, 2013
1 parent 33de69a commit d9ef072
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 6 deletions.
5 changes: 3 additions & 2 deletions doc/lua_api.txt
Expand Up @@ -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
Expand Down
5 changes: 4 additions & 1 deletion src/environment.cpp
Expand Up @@ -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);

Expand All @@ -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;
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/environment.h
Expand Up @@ -295,7 +295,7 @@ class ServerEnvironment : public Environment
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; }

Expand Down
10 changes: 8 additions & 2 deletions src/script/lua_api/l_env.cpp
Expand Up @@ -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;

Expand All @@ -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;
}

Expand Down

0 comments on commit d9ef072

Please sign in to comment.