mirror of
https://github.com/luanti-org/luanti.git
synced 2025-07-02 16:38:41 +00:00
Help modders deal with object invalidation (#14769)
* Skip invalid objects in raycasts * Add `ObjectRef:is_valid` method * Add object inside radius / area iterators which skip invalid objects * Update docs to clarify object invalidation and how to deal with it --------- Co-authored-by: sfan5 <sfan5@live.de>
This commit is contained in:
parent
d5444e1172
commit
8ed55b3aff
6 changed files with 134 additions and 12 deletions
|
@ -155,6 +155,7 @@ void LuaLBM::trigger(ServerEnvironment *env, v3s16 p,
|
|||
int LuaRaycast::l_next(lua_State *L)
|
||||
{
|
||||
GET_PLAIN_ENV_PTR;
|
||||
ServerEnvironment *senv = dynamic_cast<ServerEnvironment*>(env);
|
||||
|
||||
bool csm = false;
|
||||
#ifndef SERVER
|
||||
|
@ -163,7 +164,17 @@ int LuaRaycast::l_next(lua_State *L)
|
|||
|
||||
LuaRaycast *o = checkObject<LuaRaycast>(L, 1);
|
||||
PointedThing pointed;
|
||||
env->continueRaycast(&o->state, &pointed);
|
||||
for (;;) {
|
||||
env->continueRaycast(&o->state, &pointed);
|
||||
if (pointed.type != POINTEDTHING_OBJECT)
|
||||
break;
|
||||
if (!senv)
|
||||
break;
|
||||
const auto *obj = senv->getActiveObject(pointed.object_id);
|
||||
if (obj && !obj->isGone())
|
||||
break;
|
||||
// skip gone object
|
||||
}
|
||||
if (pointed.type == POINTEDTHING_NOTHING)
|
||||
lua_pushnil(L);
|
||||
else
|
||||
|
|
|
@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
|
||||
#include "lua_api/l_object.h"
|
||||
#include <cmath>
|
||||
#include <lua.h>
|
||||
#include "lua_api/l_internal.h"
|
||||
#include "lua_api/l_inventory.h"
|
||||
#include "lua_api/l_item.h"
|
||||
|
@ -106,6 +107,13 @@ int ObjectRef::l_remove(lua_State *L)
|
|||
return 0;
|
||||
}
|
||||
|
||||
// is_valid(self)
|
||||
int ObjectRef::l_is_valid(lua_State *L)
|
||||
{
|
||||
lua_pushboolean(L, getobject(checkObject<ObjectRef>(L, 1)) != nullptr);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// get_pos(self)
|
||||
int ObjectRef::l_get_pos(lua_State *L)
|
||||
{
|
||||
|
@ -2646,6 +2654,7 @@ const char ObjectRef::className[] = "ObjectRef";
|
|||
luaL_Reg ObjectRef::methods[] = {
|
||||
// ServerActiveObject
|
||||
luamethod(ObjectRef, remove),
|
||||
luamethod(ObjectRef, is_valid),
|
||||
luamethod_aliased(ObjectRef, get_pos, getpos),
|
||||
luamethod_aliased(ObjectRef, set_pos, setpos),
|
||||
luamethod(ObjectRef, add_pos),
|
||||
|
|
|
@ -67,6 +67,9 @@ private:
|
|||
// remove(self)
|
||||
static int l_remove(lua_State *L);
|
||||
|
||||
// is_valid(self)
|
||||
static int l_is_valid(lua_State *L);
|
||||
|
||||
// get_pos(self)
|
||||
static int l_get_pos(lua_State *L);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue