clientobject: add get_id()
[waspsaliva.git] / src / script / lua_api / l_clientobject.cpp
blob2adcff1a421a9cff093502869f3950058bd186ca
1 // CC0/Unlicense system32 2020
3 #include "lua_api/l_clientobject.h"
4 #include "l_internal.h"
5 #include "common/c_converter.h"
6 #include "client/client.h"
7 #include "object_properties.h"
8 #include "util/pointedthing.h"
10 // should prob do some more NULL checking
13 ClientObjectRef *ClientObjectRef::checkobject(lua_State *L, int narg)
15 luaL_checktype(L, narg, LUA_TUSERDATA);
16 void *userdata = luaL_checkudata(L, narg, className);
17 if (!userdata)
18 luaL_typerror(L, narg, className);
19 return *(ClientObjectRef**)userdata;
22 ClientActiveObject *ClientObjectRef::get_cao(ClientObjectRef *ref)
24 ClientActiveObject *obj = ref->m_object;
25 return obj;
28 GenericCAO *ClientObjectRef::get_generic_cao(ClientObjectRef *ref, lua_State *L)
30 ClientActiveObject *obj = get_cao(ref);
31 ClientEnvironment &env = getClient(L)->getEnv();
32 GenericCAO *gcao = env.getGenericCAO(obj->getId());
33 return gcao;
35 int ClientObjectRef::l_get_id(lua_State *L)
37 ClientObjectRef *ref = checkobject(L, 1);
38 GenericCAO *gcao = get_generic_cao(ref, L);
39 lua_pushvalue(L, gcao->getId());
40 return 1;
43 int ClientObjectRef::l_get_pos(lua_State *L)
45 ClientObjectRef *ref = checkobject(L, 1);
46 ClientActiveObject *cao = get_cao(ref);
47 push_v3f(L, cao->getPosition() / BS);
48 return 1;
51 int ClientObjectRef::l_get_velocity(lua_State *L)
53 ClientObjectRef *ref = checkobject(L, 1);
54 GenericCAO *gcao = get_generic_cao(ref, L);
55 push_v3f(L, gcao->getVelocity() / BS);
56 return 1;
59 int ClientObjectRef::l_get_acceleration(lua_State *L)
61 ClientObjectRef *ref = checkobject(L, 1);
62 GenericCAO *gcao = get_generic_cao(ref, L);
63 push_v3f(L, gcao->getAcceleration() / BS);
64 return 1;
67 int ClientObjectRef::l_get_rotation(lua_State *L)
69 ClientObjectRef *ref = checkobject(L, 1);
70 GenericCAO *gcao = get_generic_cao(ref, L);
71 push_v3f(L, gcao->getRotation());
72 return 1;
75 int ClientObjectRef::l_is_player(lua_State *L)
77 ClientObjectRef *ref = checkobject(L, 1);
78 GenericCAO *gcao = get_generic_cao(ref, L);
79 lua_pushboolean(L, gcao->isPlayer());
80 return 1;
83 int ClientObjectRef::l_is_local_player(lua_State *L)
85 ClientObjectRef *ref = checkobject(L, 1);
86 GenericCAO *gcao = get_generic_cao(ref, L);
87 lua_pushboolean(L, gcao->isLocalPlayer());
88 return 1;
91 int ClientObjectRef::l_get_name(lua_State *L)
93 ClientObjectRef *ref = checkobject(L, 1);
94 GenericCAO *gcao = get_generic_cao(ref, L);
95 lua_pushstring(L, gcao->getName().c_str());
96 return 1;
99 int ClientObjectRef::l_get_parent(lua_State *L)
101 ClientObjectRef *ref = checkobject(L, 1);
102 GenericCAO *gcao = get_generic_cao(ref, L);
103 create(L, gcao->getParent());
104 return 1;
107 int ClientObjectRef::l_get_nametag(lua_State *L)
109 ClientObjectRef *ref = checkobject(L, 1);
110 GenericCAO *gcao = get_generic_cao(ref, L);
111 ObjectProperties *props = gcao->getProperties();
112 lua_pushstring(L, props->nametag.c_str());
113 return 1;
116 int ClientObjectRef::l_get_item_textures(lua_State *L)
118 ClientObjectRef *ref = checkobject(L, 1);
119 GenericCAO *gcao = get_generic_cao(ref, L);
120 ObjectProperties *props = gcao->getProperties();
121 lua_newtable(L);
123 for (std::string &texture : props->textures) {
124 lua_pushstring(L, texture.c_str());
126 return 1;
129 int ClientObjectRef::l_set_visible(lua_State *L)
131 ClientObjectRef *ref = checkobject(L, 1);
132 GenericCAO *gcao = get_generic_cao(ref, L);
133 gcao->setVisible(readParam<bool>(L, -1));
134 return 0;
137 int ClientObjectRef::l_remove_from_scene(lua_State *L)
139 ClientObjectRef *ref = checkobject(L, 1);
140 GenericCAO *gcao = get_generic_cao(ref, L);
141 gcao->removeFromScene(readParam<bool>(L, -1));
142 return 0;
145 int ClientObjectRef::l_get_hp(lua_State *L)
147 ClientObjectRef *ref = checkobject(L, 1);
148 GenericCAO *gcao = get_generic_cao(ref, L);
149 lua_pushnumber(L, gcao->getHp());
150 return 1;
153 int ClientObjectRef::l_get_max_hp(lua_State *L)
155 ClientObjectRef *ref = checkobject(L, 1);
156 GenericCAO *gcao = get_generic_cao(ref, L);
157 ObjectProperties *props = gcao->getProperties();
158 lua_pushnumber(L, props->hp_max);
159 return 1;
162 int ClientObjectRef::l_punch(lua_State *L)
164 ClientObjectRef *ref = checkobject(L, 1);
165 GenericCAO *gcao = get_generic_cao(ref, L);
166 PointedThing pointed(gcao->getId(), v3f(0, 0, 0), v3s16(0, 0, 0), 0);
167 getClient(L)->interact(INTERACT_START_DIGGING, pointed);
168 return 0;
171 int ClientObjectRef::l_rightclick(lua_State *L)
173 ClientObjectRef *ref = checkobject(L, 1);
174 GenericCAO *gcao = get_generic_cao(ref, L);
175 PointedThing pointed(gcao->getId(), v3f(0, 0, 0), v3s16(0, 0, 0), 0);
176 getClient(L)->interact(INTERACT_PLACE, pointed);
177 return 0;
180 ClientObjectRef::ClientObjectRef(ClientActiveObject *object) : m_object(object)
184 void ClientObjectRef::create(lua_State *L, ClientActiveObject *object)
186 if (object) {
187 ClientObjectRef *o = new ClientObjectRef(object);
188 *(void **)(lua_newuserdata(L, sizeof(void *))) = o;
189 luaL_getmetatable(L, className);
190 lua_setmetatable(L, -2);
194 void ClientObjectRef::create(lua_State *L, s16 id)
196 create(L, ((ClientEnvironment *)getEnv(L))->getActiveObject(id));
199 int ClientObjectRef::gc_object(lua_State *L)
201 ClientObjectRef *obj = *(ClientObjectRef **)(lua_touserdata(L, 1));
202 delete obj;
203 return 0;
206 // taken from LuaLocalPlayer
207 void ClientObjectRef::Register(lua_State *L)
209 lua_newtable(L);
210 int methodtable = lua_gettop(L);
211 luaL_newmetatable(L, className);
212 int metatable = lua_gettop(L);
214 lua_pushliteral(L, "__metatable");
215 lua_pushvalue(L, methodtable);
216 lua_settable(L, metatable); // hide metatable from lua getmetatable()
218 lua_pushliteral(L, "__index");
219 lua_pushvalue(L, methodtable);
220 lua_settable(L, metatable);
222 lua_pushliteral(L, "__gc");
223 lua_pushcfunction(L, gc_object);
224 lua_settable(L, metatable);
226 lua_pop(L, 1); // Drop metatable
228 luaL_openlib(L, 0, methods, 0); // fill methodtable
229 lua_pop(L, 1); // Drop methodtable
232 const char ClientObjectRef::className[] = "ClientObjectRef";
233 luaL_Reg ClientObjectRef::methods[] = {
234 luamethod(ClientObjectRef, get_id),
235 luamethod(ClientObjectRef, get_pos),
236 luamethod(ClientObjectRef, get_velocity),
237 luamethod(ClientObjectRef, get_acceleration),
238 luamethod(ClientObjectRef, get_rotation),
239 luamethod(ClientObjectRef, is_player),
240 luamethod(ClientObjectRef, get_name),
241 luamethod(ClientObjectRef, get_parent),
242 luamethod(ClientObjectRef, get_nametag),
243 luamethod(ClientObjectRef, get_item_textures),
244 luamethod(ClientObjectRef, get_max_hp),
245 luamethod(ClientObjectRef, set_visible),
246 luamethod(ClientObjectRef, remove_from_scene),
247 luamethod(ClientObjectRef, is_local_player),
248 luamethod(ClientObjectRef, get_hp),
249 luamethod(ClientObjectRef, punch),
250 luamethod(ClientObjectRef, rightclick),
251 {0, 0}