aboutsummaryrefslogtreecommitdiff
path: root/src/script/lua_api
diff options
context:
space:
mode:
Diffstat (limited to 'src/script/lua_api')
-rw-r--r--src/script/lua_api/l_client.cpp2
-rw-r--r--src/script/lua_api/l_clientobject.cpp59
-rw-r--r--src/script/lua_api/l_clientobject.h2
-rw-r--r--src/script/lua_api/l_localplayer.cpp2
4 files changed, 56 insertions, 9 deletions
diff --git a/src/script/lua_api/l_client.cpp b/src/script/lua_api/l_client.cpp
index 484af2ec3..916983982 100644
--- a/src/script/lua_api/l_client.cpp
+++ b/src/script/lua_api/l_client.cpp
@@ -520,7 +520,7 @@ int ModApiClient::l_get_objects_inside_radius(lua_State *L)
int i = 0;
lua_createtable(L, objs.size(), 0);
for (const auto obj : objs) {
- ClientObjectRef::create(L, obj.obj); // TODO: getObjectRefOrCreate
+ push_objectRef(L, obj.obj->getId());
lua_rawseti(L, -2, ++i);
}
return 1;
diff --git a/src/script/lua_api/l_clientobject.cpp b/src/script/lua_api/l_clientobject.cpp
index 8a4647d45..5a1123169 100644
--- a/src/script/lua_api/l_clientobject.cpp
+++ b/src/script/lua_api/l_clientobject.cpp
@@ -48,6 +48,8 @@ ClientActiveObject *ClientObjectRef::get_cao(ClientObjectRef *ref)
GenericCAO *ClientObjectRef::get_generic_cao(ClientObjectRef *ref, lua_State *L)
{
ClientActiveObject *obj = get_cao(ref);
+ if (! obj)
+ return nullptr;
ClientEnvironment &env = getClient(L)->getEnv();
GenericCAO *gcao = env.getGenericCAO(obj->getId());
return gcao;
@@ -57,6 +59,8 @@ int ClientObjectRef::l_get_pos(lua_State *L)
{
ClientObjectRef *ref = checkobject(L, 1);
ClientActiveObject *cao = get_cao(ref);
+ if (! cao)
+ return 0;
push_v3f(L, cao->getPosition() / BS);
return 1;
}
@@ -65,6 +69,8 @@ int ClientObjectRef::l_get_velocity(lua_State *L)
{
ClientObjectRef *ref = checkobject(L, 1);
GenericCAO *gcao = get_generic_cao(ref, L);
+ if (! gcao)
+ return 0;
push_v3f(L, gcao->getVelocity() / BS);
return 1;
}
@@ -73,6 +79,8 @@ int ClientObjectRef::l_get_acceleration(lua_State *L)
{
ClientObjectRef *ref = checkobject(L, 1);
GenericCAO *gcao = get_generic_cao(ref, L);
+ if (! gcao)
+ return 0;
push_v3f(L, gcao->getAcceleration() / BS);
return 1;
}
@@ -81,6 +89,8 @@ int ClientObjectRef::l_get_rotation(lua_State *L)
{
ClientObjectRef *ref = checkobject(L, 1);
GenericCAO *gcao = get_generic_cao(ref, L);
+ if (! gcao)
+ return 0;
push_v3f(L, gcao->getRotation());
return 1;
}
@@ -89,6 +99,8 @@ int ClientObjectRef::l_is_player(lua_State *L)
{
ClientObjectRef *ref = checkobject(L, 1);
GenericCAO *gcao = get_generic_cao(ref, L);
+ if (! gcao)
+ return 0;
lua_pushboolean(L, gcao->isPlayer());
return 1;
}
@@ -97,6 +109,8 @@ int ClientObjectRef::l_is_local_player(lua_State *L)
{
ClientObjectRef *ref = checkobject(L, 1);
GenericCAO *gcao = get_generic_cao(ref, L);
+ if (! gcao)
+ return 0;
lua_pushboolean(L, gcao->isLocalPlayer());
return 1;
}
@@ -105,6 +119,8 @@ int ClientObjectRef::l_get_name(lua_State *L)
{
ClientObjectRef *ref = checkobject(L, 1);
GenericCAO *gcao = get_generic_cao(ref, L);
+ if (! gcao)
+ return 0;
lua_pushstring(L, gcao->getName().c_str());
return 1;
}
@@ -113,7 +129,12 @@ int ClientObjectRef::l_get_attach(lua_State *L)
{
ClientObjectRef *ref = checkobject(L, 1);
GenericCAO *gcao = get_generic_cao(ref, L);
- create(L, gcao->getParent());
+ if (! gcao)
+ return 0;
+ ClientActiveObject *parent = gcao->getParent();
+ if (! parent)
+ return 0;
+ push_objectRef(L, parent->getId());
return 1;
}
@@ -122,6 +143,8 @@ int ClientObjectRef::l_get_nametag(lua_State *L)
log_deprecated(L,"Deprecated call to get_nametag, use get_properties().nametag instead");
ClientObjectRef *ref = checkobject(L, 1);
GenericCAO *gcao = get_generic_cao(ref, L);
+ if (! gcao)
+ return 0;
ObjectProperties *props = gcao->getProperties();
lua_pushstring(L, props->nametag.c_str());
return 1;
@@ -132,6 +155,8 @@ int ClientObjectRef::l_get_item_textures(lua_State *L)
log_deprecated(L,"Deprecated call to get_item_textures, use get_properties().textures instead");
ClientObjectRef *ref = checkobject(L, 1);
GenericCAO *gcao = get_generic_cao(ref, L);
+ if (! gcao)
+ return 0;
ObjectProperties *props = gcao->getProperties();
lua_newtable(L);
@@ -146,6 +171,8 @@ int ClientObjectRef::l_get_max_hp(lua_State *L)
log_deprecated(L,"Deprecated call to get_max_hp, use get_properties().hp_max instead");
ClientObjectRef *ref = checkobject(L, 1);
GenericCAO *gcao = get_generic_cao(ref, L);
+ if (! gcao)
+ return 0;
ObjectProperties *props = gcao->getProperties();
lua_pushnumber(L, props->hp_max);
return 1;
@@ -155,6 +182,8 @@ int ClientObjectRef::l_get_properties(lua_State *L)
{
ClientObjectRef *ref = checkobject(L, 1);
GenericCAO *gcao = get_generic_cao(ref, L);
+ if (! gcao)
+ return 0;
ObjectProperties *prop = gcao->getProperties();
push_object_properties(L, prop);
return 1;
@@ -164,6 +193,8 @@ int ClientObjectRef::l_set_properties(lua_State *L)
{
ClientObjectRef *ref = checkobject(L, 1);
GenericCAO *gcao = get_generic_cao(ref, L);
+ if (! gcao)
+ return 0;
ObjectProperties prop = *gcao->getProperties();
read_object_properties(L, 2, nullptr, &prop, getClient(L)->idef());
gcao->setProperties(prop);
@@ -174,6 +205,8 @@ int ClientObjectRef::l_get_hp(lua_State *L)
{
ClientObjectRef *ref = checkobject(L, 1);
GenericCAO *gcao = get_generic_cao(ref, L);
+ if (! gcao)
+ return 0;
lua_pushnumber(L, gcao->getHp());
return 1;
}
@@ -182,6 +215,8 @@ int ClientObjectRef::l_punch(lua_State *L)
{
ClientObjectRef *ref = checkobject(L, 1);
GenericCAO *gcao = get_generic_cao(ref, L);
+ if (! gcao)
+ return 0;
PointedThing pointed(gcao->getId(), v3f(0, 0, 0), v3s16(0, 0, 0), 0);
getClient(L)->interact(INTERACT_START_DIGGING, pointed);
return 0;
@@ -191,6 +226,8 @@ int ClientObjectRef::l_rightclick(lua_State *L)
{
ClientObjectRef *ref = checkobject(L, 1);
GenericCAO *gcao = get_generic_cao(ref, L);
+ if (! gcao)
+ return 0;
PointedThing pointed(gcao->getId(), v3f(0, 0, 0), v3s16(0, 0, 0), 0);
getClient(L)->interact(INTERACT_PLACE, pointed);
return 0;
@@ -200,6 +237,8 @@ int ClientObjectRef::l_remove(lua_State *L)
{
ClientObjectRef *ref = checkobject(L, 1);
ClientActiveObject *cao = get_cao(ref);
+ if (! cao)
+ return 0;
getClient(L)->getEnv().removeActiveObject(cao->getId());
return 0;
@@ -209,6 +248,8 @@ int ClientObjectRef::l_set_nametag_images(lua_State *L)
{
ClientObjectRef *ref = checkobject(L, 1);
GenericCAO *gcao = get_generic_cao(ref, L);
+ if (! gcao)
+ return 0;
gcao->nametag_images.clear();
if(lua_istable(L, 2)){
lua_pushnil(L);
@@ -228,12 +269,10 @@ ClientObjectRef::ClientObjectRef(ClientActiveObject *object) : m_object(object)
void ClientObjectRef::create(lua_State *L, ClientActiveObject *object)
{
- if (object) {
- ClientObjectRef *o = new ClientObjectRef(object);
- *(void **)(lua_newuserdata(L, sizeof(void *))) = o;
- luaL_getmetatable(L, className);
- lua_setmetatable(L, -2);
- }
+ ClientObjectRef *o = new ClientObjectRef(object);
+ *(void **)(lua_newuserdata(L, sizeof(void *))) = o;
+ luaL_getmetatable(L, className);
+ lua_setmetatable(L, -2);
}
void ClientObjectRef::create(lua_State *L, s16 id)
@@ -241,6 +280,12 @@ void ClientObjectRef::create(lua_State *L, s16 id)
create(L, ((ClientEnvironment *)getEnv(L))->getActiveObject(id));
}
+void ClientObjectRef::set_null(lua_State *L)
+{
+ ClientObjectRef *obj = checkobject(L, -1);
+ obj->m_object = nullptr;
+}
+
int ClientObjectRef::gc_object(lua_State *L)
{
ClientObjectRef *obj = *(ClientObjectRef **)(lua_touserdata(L, 1));
diff --git a/src/script/lua_api/l_clientobject.h b/src/script/lua_api/l_clientobject.h
index 60d10dcf6..c4c95cb41 100644
--- a/src/script/lua_api/l_clientobject.h
+++ b/src/script/lua_api/l_clientobject.h
@@ -35,6 +35,8 @@ public:
static void create(lua_State *L, ClientActiveObject *object);
static void create(lua_State *L, s16 id);
+ static void set_null(lua_State *L);
+
static ClientObjectRef *checkobject(lua_State *L, int narg);
private:
diff --git a/src/script/lua_api/l_localplayer.cpp b/src/script/lua_api/l_localplayer.cpp
index 747657016..b8673379a 100644
--- a/src/script/lua_api/l_localplayer.cpp
+++ b/src/script/lua_api/l_localplayer.cpp
@@ -483,7 +483,7 @@ int LuaLocalPlayer::l_get_object(lua_State *L)
ClientEnvironment &env = getClient(L)->getEnv();
ClientActiveObject *obj = env.getGenericCAO(player->getCAO()->getId());
- ClientObjectRef::create(L, obj);
+ push_objectRef(L, obj->getId());
return 1;
}