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
);
18 luaL_typerror(L
, narg
, className
);
19 return *(ClientObjectRef
**)userdata
;
22 ClientActiveObject
*ClientObjectRef::get_cao(ClientObjectRef
*ref
)
24 ClientActiveObject
*obj
= ref
->m_object
;
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());
35 int ClientObjectRef::l_get_id(lua_State
*L
)
37 ClientObjectRef
*ref
= checkobject(L
, 1);
38 GenericCAO
*gcao
= get_generic_cao(ref
, L
);
41 lua_pushvalue(L
, gcao
->getId());
45 int ClientObjectRef::l_get_pos(lua_State
*L
)
47 ClientObjectRef
*ref
= checkobject(L
, 1);
48 ClientActiveObject
*gcao
= get_cao(ref
);
50 push_v3f(L
, gcao
->getPosition() / BS
);
54 int ClientObjectRef::l_get_velocity(lua_State
*L
)
56 ClientObjectRef
*ref
= checkobject(L
, 1);
57 GenericCAO
*gcao
= get_generic_cao(ref
, L
);
60 push_v3f(L
, gcao
->getVelocity() / BS
);
64 int ClientObjectRef::l_get_acceleration(lua_State
*L
)
66 ClientObjectRef
*ref
= checkobject(L
, 1);
67 GenericCAO
*gcao
= get_generic_cao(ref
, L
);
70 push_v3f(L
, gcao
->getAcceleration() / BS
);
74 int ClientObjectRef::l_get_rotation(lua_State
*L
)
76 ClientObjectRef
*ref
= checkobject(L
, 1);
77 GenericCAO
*gcao
= get_generic_cao(ref
, L
);
79 push_v3f(L
, gcao
->getRotation());
83 int ClientObjectRef::l_is_player(lua_State
*L
)
85 ClientObjectRef
*ref
= checkobject(L
, 1);
86 GenericCAO
*gcao
= get_generic_cao(ref
, L
);
88 lua_pushboolean(L
, gcao
->isPlayer());
92 int ClientObjectRef::l_is_local_player(lua_State
*L
)
94 ClientObjectRef
*ref
= checkobject(L
, 1);
95 GenericCAO
*gcao
= get_generic_cao(ref
, L
);
97 lua_pushboolean(L
, gcao
->isLocalPlayer());
101 int ClientObjectRef::l_get_name(lua_State
*L
)
103 ClientObjectRef
*ref
= checkobject(L
, 1);
104 GenericCAO
*gcao
= get_generic_cao(ref
, L
);
106 lua_pushstring(L
, gcao
->getName().c_str());
110 int ClientObjectRef::l_get_parent(lua_State
*L
)
112 ClientObjectRef
*ref
= checkobject(L
, 1);
113 GenericCAO
*gcao
= get_generic_cao(ref
, L
);
115 create(L
, gcao
->getParent());
119 int ClientObjectRef::l_get_nametag(lua_State
*L
)
121 ClientObjectRef
*ref
= checkobject(L
, 1);
122 GenericCAO
*gcao
= get_generic_cao(ref
, L
);
124 ObjectProperties
*props
= gcao
->getProperties();
125 lua_pushstring(L
, props
->nametag
.c_str());
129 int ClientObjectRef::l_get_item_textures(lua_State
*L
)
131 ClientObjectRef
*ref
= checkobject(L
, 1);
132 GenericCAO
*gcao
= get_generic_cao(ref
, L
);
134 ObjectProperties
*props
= gcao
->getProperties();
137 for (std::string
&texture
: props
->textures
) {
138 lua_pushstring(L
, texture
.c_str());
143 int ClientObjectRef::l_set_visible(lua_State
*L
)
145 ClientObjectRef
*ref
= checkobject(L
, 1);
146 GenericCAO
*gcao
= get_generic_cao(ref
, L
);
149 gcao
->setVisible(readParam
<bool>(L
, -1));
153 int ClientObjectRef::l_remove_from_scene(lua_State
*L
)
155 ClientObjectRef
*ref
= checkobject(L
, 1);
156 GenericCAO
*gcao
= get_generic_cao(ref
, L
);
159 gcao
->removeFromScene(readParam
<bool>(L
, -1));
163 int ClientObjectRef::l_remove(lua_State
*L
)
165 ClientObjectRef
*ref
= checkobject(L
, 1);
166 ClientActiveObject
*cao
= get_cao(ref
);
169 getClient(L
)->getEnv().removeActiveObject(cao
->getId());
174 int ClientObjectRef::l_get_hp(lua_State
*L
)
176 ClientObjectRef
*ref
= checkobject(L
, 1);
177 GenericCAO
*gcao
= get_generic_cao(ref
, L
);
179 lua_pushnumber(L
, gcao
->getHp());
183 int ClientObjectRef::l_get_max_hp(lua_State
*L
)
185 ClientObjectRef
*ref
= checkobject(L
, 1);
186 GenericCAO
*gcao
= get_generic_cao(ref
, L
);
188 ObjectProperties
*props
= gcao
->getProperties();
189 lua_pushnumber(L
, props
->hp_max
);
193 int ClientObjectRef::l_punch(lua_State
*L
)
195 ClientObjectRef
*ref
= checkobject(L
, 1);
196 GenericCAO
*gcao
= get_generic_cao(ref
, L
);
199 PointedThing
pointed(gcao
->getId(), v3f(0, 0, 0), v3s16(0, 0, 0), 0);
200 getClient(L
)->interact(INTERACT_START_DIGGING
, pointed
);
204 int ClientObjectRef::l_rightclick(lua_State
*L
)
206 ClientObjectRef
*ref
= checkobject(L
, 1);
207 GenericCAO
*gcao
= get_generic_cao(ref
, L
);
209 PointedThing
pointed(gcao
->getId(), v3f(0, 0, 0), v3s16(0, 0, 0), 0);
210 getClient(L
)->interact(INTERACT_PLACE
, pointed
);
214 ClientObjectRef::ClientObjectRef(ClientActiveObject
*object
) : m_object(object
)
218 void ClientObjectRef::create(lua_State
*L
, ClientActiveObject
*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));
240 // taken from LuaLocalPlayer
241 void ClientObjectRef::Register(lua_State
*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
),