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
);
39 lua_pushvalue(L
, gcao
->getId());
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
);
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
);
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
);
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());
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());
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());
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());
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());
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());
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();
123 for (std::string
&texture
: props
->textures
) {
124 lua_pushstring(L
, texture
.c_str());
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));
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));
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());
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
);
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
);
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
);
180 ClientObjectRef::ClientObjectRef(ClientActiveObject
*object
) : m_object(object
)
184 void ClientObjectRef::create(lua_State
*L
, ClientActiveObject
*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));
206 // taken from LuaLocalPlayer
207 void ClientObjectRef::Register(lua_State
*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
),