Skip to content

Commit

Permalink
Implement get_node with a get_node_raw
Browse files Browse the repository at this point in the history
  • Loading branch information
Desour committed Feb 18, 2024
1 parent 7ef4fc3 commit bee78f4
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 36 deletions.
15 changes: 15 additions & 0 deletions builtin/common/item_s.lua
Expand Up @@ -239,3 +239,18 @@ if core.set_read_node and core.set_push_node then
core.set_push_node(push_node)
core.set_push_node = nil
end

if INIT == "game" then
local get_node_raw = core.get_node_raw
core.get_node_raw = nil

function core.get_node(pos)
local content, param1, param2 = get_node_raw(pos.x, pos.y, pos.z)
return {name = content2name[content], param1 = param1, param2 = param2}
end

function core.get_node_or_nil(pos)
local content, param1, param2, pos_ok = get_node_raw(pos.x, pos.y, pos.z)
return pos_ok and {name = content2name[content], param1 = param1, param2 = param2} or nil
end
end
41 changes: 13 additions & 28 deletions src/script/lua_api/l_env.cpp
Expand Up @@ -324,39 +324,25 @@ int ModApiEnv::l_swap_node(lua_State *L)
return 1;
}

// get_node(pos)
// pos = {x=num, y=num, z=num}
int ModApiEnv::l_get_node(lua_State *L)
{
GET_ENV_PTR;

// pos
v3s16 pos = read_v3s16(L, 1);
// Do it
MapNode n = env->getMap().getNode(pos);
// Return node
pushnode(L, n);
return 1;
}

// get_node_or_nil(pos)
// pos = {x=num, y=num, z=num}
int ModApiEnv::l_get_node_or_nil(lua_State *L)
// get_node_raw(x, y, z) -> content, param1, param2, pos_ok
int ModApiEnv::l_get_node_raw(lua_State *L)
{
GET_ENV_PTR;

// pos
v3s16 pos = read_v3s16(L, 1);
double x = lua_tonumber(L, 1);
double y = lua_tonumber(L, 2);
double z = lua_tonumber(L, 3);
v3s16 pos = doubleToInt(v3d(x, y, z), 1.0);
// Do it
bool pos_ok;
MapNode n = env->getMap().getNode(pos, &pos_ok);
if (pos_ok) {
// Return node
pushnode(L, n);
} else {
lua_pushnil(L);
}
return 1;
// Return node and pos_ok
lua_pushinteger(L, n.getContent());
lua_pushinteger(L, n.getParam1());
lua_pushinteger(L, n.getParam2());
lua_pushboolean(L, pos_ok);
return 4;
}

// get_node_light(pos, timeofday)
Expand Down Expand Up @@ -1479,8 +1465,7 @@ void ModApiEnv::Initialize(lua_State *L, int top)
API_FCT(swap_node);
API_FCT(add_item);
API_FCT(remove_node);
API_FCT(get_node);
API_FCT(get_node_or_nil);
API_FCT(get_node_raw);
API_FCT(get_node_light);
API_FCT(get_natural_light);
API_FCT(place_node);
Expand Down
12 changes: 4 additions & 8 deletions src/script/lua_api/l_env.h
Expand Up @@ -74,13 +74,9 @@ class ModApiEnv : public ModApiEnvBase {
// pos = {x=num, y=num, z=num}
static int l_swap_node(lua_State *L);

// get_node(pos)
// pos = {x=num, y=num, z=num}
static int l_get_node(lua_State *L);

// get_node_or_nil(pos)
// pos = {x=num, y=num, z=num}
static int l_get_node_or_nil(lua_State *L);
// get_node_raw(x, y, z) -> content, param1, param2, pos_ok
// Used to implement get_node and get_node_or_nil in lua.
static int l_get_node_raw(lua_State *L);

// get_node_light(pos, timeofday)
// pos = {x=num, y=num, z=num}
Expand Down Expand Up @@ -245,7 +241,7 @@ class ModApiEnv : public ModApiEnvBase {

/*
* Duplicates of certain env APIs that operate not on the global
* map but on a VoxelManipulator. This is for emerge scripting.
* map but on a VoxelManipulator. This is for emerge scripting.
*/
class ModApiEnvVM : public ModApiEnvBase {
private:
Expand Down

0 comments on commit bee78f4

Please sign in to comment.