mirror of
https://github.com/moparisthebest/minetest
synced 2024-12-23 16:08:51 -05:00
Add EnvRef:get_objects_inside_radius(pos, radius)
This commit is contained in:
parent
7937813c98
commit
1c15f53318
@ -155,6 +155,7 @@
|
|||||||
-- - add_firefly(pos)
|
-- - add_firefly(pos)
|
||||||
-- - get_meta(pos) -- Get a NodeMetaRef at that position
|
-- - get_meta(pos) -- Get a NodeMetaRef at that position
|
||||||
-- - get_player_by_name(name) -- Get an ObjectRef to a player
|
-- - get_player_by_name(name) -- Get an ObjectRef to a player
|
||||||
|
-- - get_objects_inside_radius(pos, radius)
|
||||||
--
|
--
|
||||||
-- NodeMetaRef
|
-- NodeMetaRef
|
||||||
-- - get_type()
|
-- - get_type()
|
||||||
|
@ -7,12 +7,18 @@
|
|||||||
function on_step(dtime)
|
function on_step(dtime)
|
||||||
-- print("experimental on_step")
|
-- print("experimental on_step")
|
||||||
--[[
|
--[[
|
||||||
print("celeron55 dir: "..dump(
|
objs = minetest.env:get_objects_inside_radius({x=0,y=0,z=0}, 10)
|
||||||
minetest.env:get_player_by_name("celeron55"):get_look_dir()))
|
for k, obj in pairs(objs) do
|
||||||
print("celeron55 pitch: "..dump(
|
name = obj:get_player_name()
|
||||||
minetest.env:get_player_by_name("celeron55"):get_look_pitch()))
|
if name then
|
||||||
print("celeron55 yaw: "..dump(
|
print(name.." at "..dump(obj:getpos()))
|
||||||
minetest.env:get_player_by_name("celeron55"):get_look_yaw()))
|
print(name.." dir: "..dump(obj:get_look_dir()))
|
||||||
|
print(name.." pitch: "..dump(obj:get_look_pitch()))
|
||||||
|
print(name.." yaw: "..dump(obj:get_look_yaw()))
|
||||||
|
else
|
||||||
|
print("Some object at "..dump(obj:getpos()))
|
||||||
|
end
|
||||||
|
end
|
||||||
--]]
|
--]]
|
||||||
end
|
end
|
||||||
minetest.register_globalstep(on_step)
|
minetest.register_globalstep(on_step)
|
||||||
|
@ -752,6 +752,23 @@ void ServerEnvironment::addActiveBlockModifier(ActiveBlockModifier *abm)
|
|||||||
m_abms.push_back(ABMWithState(abm));
|
m_abms.push_back(ABMWithState(abm));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::set<u16> ServerEnvironment::getObjectsInsideRadius(v3f pos, float radius)
|
||||||
|
{
|
||||||
|
std::set<u16> objects;
|
||||||
|
for(core::map<u16, ServerActiveObject*>::Iterator
|
||||||
|
i = m_active_objects.getIterator();
|
||||||
|
i.atEnd()==false; i++)
|
||||||
|
{
|
||||||
|
ServerActiveObject* obj = i.getNode()->getValue();
|
||||||
|
u16 id = i.getNode()->getKey();
|
||||||
|
v3f objectpos = obj->getBasePosition();
|
||||||
|
if(objectpos.getDistanceFrom(pos) > radius)
|
||||||
|
continue;
|
||||||
|
objects.insert(id);
|
||||||
|
}
|
||||||
|
return objects;
|
||||||
|
}
|
||||||
|
|
||||||
void ServerEnvironment::clearAllObjects()
|
void ServerEnvironment::clearAllObjects()
|
||||||
{
|
{
|
||||||
infostream<<"ServerEnvironment::clearAllObjects(): "
|
infostream<<"ServerEnvironment::clearAllObjects(): "
|
||||||
|
@ -261,18 +261,24 @@ public:
|
|||||||
void activateBlock(MapBlock *block, u32 additional_dtime=0);
|
void activateBlock(MapBlock *block, u32 additional_dtime=0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ActiveBlockModifiers (TODO)
|
ActiveBlockModifiers
|
||||||
-------------------------------------------
|
-------------------------------------------
|
||||||
NOTE: Not used currently (TODO: Use or remove)
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void addActiveBlockModifier(ActiveBlockModifier *abm);
|
void addActiveBlockModifier(ActiveBlockModifier *abm);
|
||||||
|
|
||||||
/* Other stuff */
|
/*
|
||||||
|
Other stuff
|
||||||
|
-------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Find all active objects inside a radius around a point
|
||||||
|
std::set<u16> getObjectsInsideRadius(v3f pos, float radius);
|
||||||
|
|
||||||
// Clear all objects, loading and going through every MapBlock
|
// Clear all objects, loading and going through every MapBlock
|
||||||
void clearAllObjects();
|
void clearAllObjects();
|
||||||
|
|
||||||
|
// This makes stuff happen
|
||||||
void step(f32 dtime);
|
void step(f32 dtime);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -2592,6 +2592,36 @@ private:
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EnvRef:get_objects_inside_radius(pos, radius)
|
||||||
|
static int l_get_objects_inside_radius(lua_State *L)
|
||||||
|
{
|
||||||
|
// Get the table insert function
|
||||||
|
lua_getglobal(L, "table");
|
||||||
|
lua_getfield(L, -1, "insert");
|
||||||
|
int table_insert = lua_gettop(L);
|
||||||
|
// Get environemnt
|
||||||
|
EnvRef *o = checkobject(L, 1);
|
||||||
|
ServerEnvironment *env = o->m_env;
|
||||||
|
if(env == NULL) return 0;
|
||||||
|
// Do it
|
||||||
|
v3f pos = readFloatPos(L, 2);
|
||||||
|
float radius = luaL_checknumber(L, 3) * BS;
|
||||||
|
std::set<u16> ids = env->getObjectsInsideRadius(pos, radius);
|
||||||
|
lua_newtable(L);
|
||||||
|
int table = lua_gettop(L);
|
||||||
|
for(std::set<u16>::const_iterator
|
||||||
|
i = ids.begin(); i != ids.end(); i++){
|
||||||
|
ServerActiveObject *obj = env->getActiveObject(*i);
|
||||||
|
// Insert object reference into table
|
||||||
|
lua_pushvalue(L, table_insert);
|
||||||
|
lua_pushvalue(L, table);
|
||||||
|
objectref_get_or_create(L, obj);
|
||||||
|
if(lua_pcall(L, 2, 0, 0))
|
||||||
|
script_error(L, "error: %s", lua_tostring(L, -1));
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int gc_object(lua_State *L) {
|
static int gc_object(lua_State *L) {
|
||||||
EnvRef *o = *(EnvRef **)(lua_touserdata(L, 1));
|
EnvRef *o = *(EnvRef **)(lua_touserdata(L, 1));
|
||||||
delete o;
|
delete o;
|
||||||
@ -2668,6 +2698,7 @@ const luaL_reg EnvRef::methods[] = {
|
|||||||
method(EnvRef, add_firefly),
|
method(EnvRef, add_firefly),
|
||||||
method(EnvRef, get_meta),
|
method(EnvRef, get_meta),
|
||||||
method(EnvRef, get_player_by_name),
|
method(EnvRef, get_player_by_name),
|
||||||
|
method(EnvRef, get_objects_inside_radius),
|
||||||
{0,0}
|
{0,0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user