parent
e245151c5b
commit
770bde9c64
|
@ -71,24 +71,17 @@ minetest.register_globalstep(function(dtime)
|
|||
for _, p in pairs(positions) do
|
||||
minetest.place_node(p)
|
||||
end
|
||||
elseif minetest.settings:get_bool("placeoncobble") then
|
||||
local positions = minetest.find_nodes_near_under_air(pos, 5, "mcl_core:cobble", true)
|
||||
elseif minetest.settings:get_bool("autotnt") then
|
||||
local positions = minetest.find_nodes_near_under_air_except(pos, 5, item:get_name(), true)
|
||||
for i, p in pairs(positions) do
|
||||
if i > 8 then break end
|
||||
minetest.place_node(vector.add(p, {x = 0, y = 1, z = 0}))
|
||||
end
|
||||
end
|
||||
end
|
||||
if minetest.settings:get_bool("fucker") then
|
||||
local p = minetest.find_node_near(pos, 5, "group:bed", true)
|
||||
if p then
|
||||
minetest.dig_node(p)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_cheat("Scaffold", "World", "scaffold")
|
||||
minetest.register_cheat("HighwayZ", "World", "highway_z")
|
||||
minetest.register_cheat("Fucker", "World", "fucker")
|
||||
minetest.register_cheat("BlockWater", "World", "destroy_liquids")
|
||||
minetest.register_cheat("PlaceOnCobble", "World", "placeoncobble")
|
||||
minetest.register_cheat("AutoTNT", "World", "autotnt")
|
||||
|
|
|
@ -782,7 +782,6 @@ int ModApiEnvMod::l_find_node_near(lua_State *L)
|
|||
int radius = luaL_checkinteger(L, 2);
|
||||
std::vector<content_t> filter;
|
||||
collectNodeIds(L, 3, ndef, filter);
|
||||
|
||||
int start_radius = (lua_isboolean(L, 4) && readParam<bool>(L, 4)) ? 0 : 1;
|
||||
|
||||
#ifndef SERVER
|
||||
|
@ -797,6 +796,7 @@ int ModApiEnvMod::l_find_node_near(lua_State *L)
|
|||
v3s16 p = pos + i;
|
||||
content_t c = map.getNode(p).getContent();
|
||||
if (CONTAINS(filter, c)) {
|
||||
std::cout << p.X << " " << p.Y << " " << p.Z << std::endl;
|
||||
push_v3s16(L, p);
|
||||
return 1;
|
||||
}
|
||||
|
@ -869,7 +869,6 @@ int ModApiEnvMod::l_find_nodes_near_under_air(lua_State *L)
|
|||
int radius = luaL_checkinteger(L, 2);
|
||||
std::vector<content_t> filter;
|
||||
collectNodeIds(L, 3, ndef, filter);
|
||||
|
||||
int start_radius = (lua_isboolean(L, 4) && readParam<bool>(L, 4)) ? 0 : 1;
|
||||
|
||||
#ifndef SERVER
|
||||
|
@ -911,6 +910,60 @@ int ModApiEnvMod::l_find_nodes_near_under_air(lua_State *L)
|
|||
return 2;
|
||||
}
|
||||
|
||||
// find_nodes_near_under_air_except(pos, radius, nodenames, [search_center])
|
||||
// nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
|
||||
int ModApiEnvMod::l_find_nodes_near_under_air_except(lua_State *L)
|
||||
{
|
||||
GET_PLAIN_ENV_PTR;
|
||||
|
||||
const NodeDefManager *ndef = env->getGameDef()->ndef();
|
||||
Map &map = env->getMap();
|
||||
|
||||
v3s16 pos = read_v3s16(L, 1);
|
||||
int radius = luaL_checkinteger(L, 2);
|
||||
std::vector<content_t> filter;
|
||||
collectNodeIds(L, 3, ndef, filter);
|
||||
int start_radius = (lua_isboolean(L, 4) && readParam<bool>(L, 4)) ? 0 : 1;
|
||||
|
||||
#ifndef SERVER
|
||||
// Client API limitations
|
||||
if (Client *client = getClient(L))
|
||||
radius = client->CSMClampRadius(pos, radius);
|
||||
#endif
|
||||
|
||||
std::vector<u32> individual_count;
|
||||
individual_count.resize(filter.size());
|
||||
|
||||
lua_newtable(L);
|
||||
u32 i = 0;
|
||||
|
||||
for (int d = start_radius; d <= radius; d++) {
|
||||
const std::vector<v3s16> &list = FacePositionCache::getFacePositions(d);
|
||||
for (const v3s16 &posi : list) {
|
||||
v3s16 p = pos + posi;
|
||||
content_t c = map.getNode(p).getContent();
|
||||
v3s16 psurf(p.X, p.Y + 1, p.Z);
|
||||
content_t csurf = map.getNode(psurf).getContent();
|
||||
if (c == CONTENT_AIR || csurf != CONTENT_AIR)
|
||||
continue;
|
||||
auto it = std::find(filter.begin(), filter.end(), c);
|
||||
if (it == filter.end()) {
|
||||
push_v3s16(L, p);
|
||||
lua_rawseti(L, -2, ++i);
|
||||
|
||||
u32 filt_index = it - filter.begin();
|
||||
individual_count[filt_index]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
lua_createtable(L, 0, filter.size());
|
||||
for (u32 i = 0; i < filter.size(); i++) {
|
||||
lua_pushinteger(L, individual_count[i]);
|
||||
lua_setfield(L, -2, ndef->get(filter[i]).name.c_str());
|
||||
}
|
||||
return 2;
|
||||
}
|
||||
|
||||
// find_nodes_in_area(minp, maxp, nodenames, [grouped])
|
||||
int ModApiEnvMod::l_find_nodes_in_area(lua_State *L)
|
||||
{
|
||||
|
@ -1515,6 +1568,7 @@ void ModApiEnvMod::InitializeClient(lua_State *L, int top)
|
|||
API_FCT(find_node_near);
|
||||
API_FCT(find_nodes_near);
|
||||
API_FCT(find_nodes_near_under_air);
|
||||
API_FCT(find_nodes_near_under_air_except);
|
||||
API_FCT(find_nodes_in_area);
|
||||
API_FCT(find_nodes_in_area_under_air);
|
||||
API_FCT(line_of_sight);
|
||||
|
|
|
@ -134,6 +134,10 @@ private:
|
|||
// find_nodes_near_under_air(pos, radius, nodenames, search_center) -> list of positions
|
||||
// nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
|
||||
static int l_find_nodes_near_under_air(lua_State *L);
|
||||
|
||||
// find_nodes_near_under_air(pos, radius, nodenames, search_center) -> list of positions
|
||||
// nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
|
||||
static int l_find_nodes_near_under_air_except(lua_State *L);
|
||||
|
||||
// find_nodes_in_area(minp, maxp, nodenames) -> list of positions
|
||||
// nodenames: eg. {"ignore", "group:tree"} or "default:dirt"
|
||||
|
|
Loading…
Reference in New Issue