incrementaltp: respect physics overrides
[waspsaliva.git] / src / script / lua_api / l_clientobject.cpp
blob022b9f34d5d65439852a9e1c6ac4ff466dee2a9e
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 if(!gcao) return 0;
40 if(!gcao) return 0;
41 lua_pushvalue(L, gcao->getId());
42 return 1;
45 int ClientObjectRef::l_get_pos(lua_State *L)
47 ClientObjectRef *ref = checkobject(L, 1);
48 ClientActiveObject *gcao = get_cao(ref);
49 if(!gcao) return 0;
50 push_v3f(L, gcao->getPosition() / BS);
51 return 1;
54 int ClientObjectRef::l_get_velocity(lua_State *L)
56 ClientObjectRef *ref = checkobject(L, 1);
57 GenericCAO *gcao = get_generic_cao(ref, L);
58 if(!gcao) return 0;
59 if(!gcao) return 0;
60 push_v3f(L, gcao->getVelocity() / BS);
61 return 1;
64 int ClientObjectRef::l_get_acceleration(lua_State *L)
66 ClientObjectRef *ref = checkobject(L, 1);
67 GenericCAO *gcao = get_generic_cao(ref, L);
68 if(!gcao) return 0;
69 if(!gcao) return 0;
70 push_v3f(L, gcao->getAcceleration() / BS);
71 return 1;
74 int ClientObjectRef::l_get_rotation(lua_State *L)
76 ClientObjectRef *ref = checkobject(L, 1);
77 GenericCAO *gcao = get_generic_cao(ref, L);
78 if(!gcao) return 0;
79 push_v3f(L, gcao->getRotation());
80 return 1;
83 int ClientObjectRef::l_is_player(lua_State *L)
85 ClientObjectRef *ref = checkobject(L, 1);
86 GenericCAO *gcao = get_generic_cao(ref, L);
87 if(!gcao) return 0;
88 lua_pushboolean(L, gcao->isPlayer());
89 return 1;
92 int ClientObjectRef::l_is_local_player(lua_State *L)
94 ClientObjectRef *ref = checkobject(L, 1);
95 GenericCAO *gcao = get_generic_cao(ref, L);
96 if(!gcao) return 0;
97 lua_pushboolean(L, gcao->isLocalPlayer());
98 return 1;
101 int ClientObjectRef::l_get_name(lua_State *L)
103 ClientObjectRef *ref = checkobject(L, 1);
104 GenericCAO *gcao = get_generic_cao(ref, L);
105 if(!gcao) return 0;
106 lua_pushstring(L, gcao->getName().c_str());
107 return 1;
110 int ClientObjectRef::l_get_parent(lua_State *L)
112 ClientObjectRef *ref = checkobject(L, 1);
113 GenericCAO *gcao = get_generic_cao(ref, L);
114 if(!gcao) return 0;
115 create(L, gcao->getParent());
116 return 1;
119 int ClientObjectRef::l_get_nametag(lua_State *L)
121 ClientObjectRef *ref = checkobject(L, 1);
122 GenericCAO *gcao = get_generic_cao(ref, L);
123 if(!gcao) return 0;
124 ObjectProperties *props = gcao->getProperties();
125 lua_pushstring(L, props->nametag.c_str());
126 return 1;
129 int ClientObjectRef::l_get_item_textures(lua_State *L)
131 ClientObjectRef *ref = checkobject(L, 1);
132 GenericCAO *gcao = get_generic_cao(ref, L);
133 if(!gcao) return 0;
134 ObjectProperties *props = gcao->getProperties();
135 lua_newtable(L);
137 for (std::string &texture : props->textures) {
138 lua_pushstring(L, texture.c_str());
140 return 1;
143 int ClientObjectRef::l_set_visible(lua_State *L)
145 ClientObjectRef *ref = checkobject(L, 1);
146 GenericCAO *gcao = get_generic_cao(ref, L);
147 if(!gcao) return 0;
148 if(!gcao) return 0;
149 gcao->setVisible(readParam<bool>(L, -1));
150 return 0;
153 int ClientObjectRef::l_remove_from_scene(lua_State *L)
155 ClientObjectRef *ref = checkobject(L, 1);
156 GenericCAO *gcao = get_generic_cao(ref, L);
157 if(!gcao) return 0;
158 if(!gcao) return 0;
159 gcao->removeFromScene(readParam<bool>(L, -1));
160 return 0;
163 int ClientObjectRef::l_remove(lua_State *L)
165 ClientObjectRef *ref = checkobject(L, 1);
166 ClientActiveObject *cao = get_cao(ref);
167 if (! cao)
168 return 0;
169 getClient(L)->getEnv().removeActiveObject(cao->getId());
171 return 0;
174 int ClientObjectRef::l_get_hp(lua_State *L)
176 ClientObjectRef *ref = checkobject(L, 1);
177 GenericCAO *gcao = get_generic_cao(ref, L);
178 if(!gcao) return 0;
179 lua_pushnumber(L, gcao->getHp());
180 return 1;
183 int ClientObjectRef::l_get_max_hp(lua_State *L)
185 ClientObjectRef *ref = checkobject(L, 1);
186 GenericCAO *gcao = get_generic_cao(ref, L);
187 if(!gcao) return 0;
188 ObjectProperties *props = gcao->getProperties();
189 lua_pushnumber(L, props->hp_max);
190 return 1;
193 int ClientObjectRef::l_punch(lua_State *L)
195 ClientObjectRef *ref = checkobject(L, 1);
196 GenericCAO *gcao = get_generic_cao(ref, L);
197 if(!gcao) return 0;
198 if(!gcao) return 0;
199 PointedThing pointed(gcao->getId(), v3f(0, 0, 0), v3s16(0, 0, 0), 0);
200 getClient(L)->interact(INTERACT_START_DIGGING, pointed);
201 return 0;
204 int ClientObjectRef::l_rightclick(lua_State *L)
206 ClientObjectRef *ref = checkobject(L, 1);
207 GenericCAO *gcao = get_generic_cao(ref, L);
208 if(!gcao) return 0;
209 PointedThing pointed(gcao->getId(), v3f(0, 0, 0), v3s16(0, 0, 0), 0);
210 getClient(L)->interact(INTERACT_PLACE, pointed);
211 return 0;
214 ClientObjectRef::ClientObjectRef(ClientActiveObject *object) : m_object(object)
218 void ClientObjectRef::create(lua_State *L, ClientActiveObject *object)
220 if (object) {
221 ClientObjectRef *o = new ClientObjectRef(object);
222 *(void **)(lua_newuserdata(L, sizeof(void *))) = o;
223 luaL_getmetatable(L, className);
224 lua_setmetatable(L, -2);
228 void ClientObjectRef::create(lua_State *L, s16 id)
230 create(L, ((ClientEnvironment *)getEnv(L))->getActiveObject(id));
233 int ClientObjectRef::gc_object(lua_State *L)
235 ClientObjectRef *obj = *(ClientObjectRef **)(lua_touserdata(L, 1));
236 delete obj;
237 return 0;
240 // taken from LuaLocalPlayer
241 void ClientObjectRef::Register(lua_State *L)
243 lua_newtable(L);
244 int methodtable = lua_gettop(L);
245 luaL_newmetatable(L, className);
246 int metatable = lua_gettop(L);
248 lua_pushliteral(L, "__metatable");
249 lua_pushvalue(L, methodtable);
250 lua_settable(L, metatable); // hide metatable from lua getmetatable()
252 lua_pushliteral(L, "__index");
253 lua_pushvalue(L, methodtable);
254 lua_settable(L, metatable);
256 lua_pushliteral(L, "__gc");
257 lua_pushcfunction(L, gc_object);
258 lua_settable(L, metatable);
260 lua_pop(L, 1); // Drop metatable
262 luaL_openlib(L, 0, methods, 0); // fill methodtable
263 lua_pop(L, 1); // Drop methodtable
266 const char ClientObjectRef::className[] = "ClientObjectRef";
267 luaL_Reg ClientObjectRef::methods[] = {
268 luamethod(ClientObjectRef, get_id),
269 luamethod(ClientObjectRef, get_pos),
270 luamethod(ClientObjectRef, get_velocity),
271 luamethod(ClientObjectRef, get_acceleration),
272 luamethod(ClientObjectRef, get_rotation),
273 luamethod(ClientObjectRef, is_player),
274 luamethod(ClientObjectRef, get_name),
275 luamethod(ClientObjectRef, get_parent),
276 luamethod(ClientObjectRef, get_nametag),
277 luamethod(ClientObjectRef, get_item_textures),
278 luamethod(ClientObjectRef, get_max_hp),
279 luamethod(ClientObjectRef, set_visible),
280 luamethod(ClientObjectRef, remove_from_scene),
281 luamethod(ClientObjectRef, remove),
282 luamethod(ClientObjectRef, is_local_player),
283 luamethod(ClientObjectRef, get_hp),
284 luamethod(ClientObjectRef, punch),
285 luamethod(ClientObjectRef, rightclick),
286 {0, 0}