3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "lua_api/l_object.h"
22 #include "lua_api/l_internal.h"
23 #include "lua_api/l_inventory.h"
24 #include "lua_api/l_item.h"
25 #include "lua_api/l_playermeta.h"
26 #include "common/c_converter.h"
27 #include "common/c_content.h"
30 #include "remoteplayer.h"
33 #include "scripting_server.h"
34 #include "server/luaentity_sao.h"
35 #include "server/player_sao.h"
36 #include "server/serverinventorymgr.h"
43 ObjectRef* ObjectRef::checkobject(lua_State *L, int narg)
45 luaL_checktype(L, narg, LUA_TUSERDATA);
46 void *ud = luaL_checkudata(L, narg, className);
47 if (!ud) luaL_typerror(L, narg, className);
48 return *(ObjectRef**)ud; // unbox pointer
51 ServerActiveObject* ObjectRef::getobject(ObjectRef *ref)
53 ServerActiveObject *co = ref->m_object;
54 if (co && co->isGone())
59 LuaEntitySAO* ObjectRef::getluaobject(ObjectRef *ref)
61 ServerActiveObject *obj = getobject(ref);
64 if (obj->getType() != ACTIVEOBJECT_TYPE_LUAENTITY)
66 return (LuaEntitySAO*)obj;
69 PlayerSAO* ObjectRef::getplayersao(ObjectRef *ref)
71 ServerActiveObject *obj = getobject(ref);
74 if (obj->getType() != ACTIVEOBJECT_TYPE_PLAYER)
76 return (PlayerSAO*)obj;
79 RemotePlayer *ObjectRef::getplayer(ObjectRef *ref)
81 PlayerSAO *playersao = getplayersao(ref);
82 if (playersao == NULL)
84 return playersao->getPlayer();
90 int ObjectRef::gc_object(lua_State *L) {
91 ObjectRef *o = *(ObjectRef **)(lua_touserdata(L, 1));
92 //infostream<<"ObjectRef::gc_object: o="<<o<<std::endl;
98 int ObjectRef::l_remove(lua_State *L)
102 ObjectRef *ref = checkobject(L, 1);
103 ServerActiveObject *co = getobject(ref);
106 if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER)
109 co->clearChildAttachments();
110 co->clearParentAttachment();
112 verbosestream << "ObjectRef::l_remove(): id=" << co->getId() << std::endl;
113 co->m_pending_removal = true;
118 // returns: {x=num, y=num, z=num}
119 int ObjectRef::l_get_pos(lua_State *L)
121 NO_MAP_LOCK_REQUIRED;
122 ObjectRef *ref = checkobject(L, 1);
123 ServerActiveObject *co = getobject(ref);
124 if (co == NULL) return 0;
125 push_v3f(L, co->getBasePosition() / BS);
129 // set_pos(self, pos)
130 int ObjectRef::l_set_pos(lua_State *L)
132 NO_MAP_LOCK_REQUIRED;
133 ObjectRef *ref = checkobject(L, 1);
134 ServerActiveObject *co = getobject(ref);
135 if (co == NULL) return 0;
137 v3f pos = checkFloatPos(L, 2);
143 // move_to(self, pos, continuous=false)
144 int ObjectRef::l_move_to(lua_State *L)
146 NO_MAP_LOCK_REQUIRED;
147 ObjectRef *ref = checkobject(L, 1);
148 ServerActiveObject *co = getobject(ref);
149 if (co == NULL) return 0;
151 v3f pos = checkFloatPos(L, 2);
153 bool continuous = readParam<bool>(L, 3);
155 co->moveTo(pos, continuous);
159 // punch(self, puncher, time_from_last_punch, tool_capabilities, dir)
160 int ObjectRef::l_punch(lua_State *L)
162 NO_MAP_LOCK_REQUIRED;
163 ObjectRef *ref = checkobject(L, 1);
164 ObjectRef *puncher_ref = checkobject(L, 2);
165 ServerActiveObject *co = getobject(ref);
166 ServerActiveObject *puncher = getobject(puncher_ref);
170 if (lua_type(L, 5) != LUA_TTABLE)
171 dir = co->getBasePosition() - puncher->getBasePosition();
173 dir = read_v3f(L, 5);
174 float time_from_last_punch = 1000000;
175 if (lua_isnumber(L, 3))
176 time_from_last_punch = lua_tonumber(L, 3);
177 ToolCapabilities toolcap = read_tool_capabilities(L, 4);
180 u16 src_original_hp = co->getHP();
181 u16 dst_origin_hp = puncher->getHP();
184 u16 wear = co->punch(dir, &toolcap, puncher, time_from_last_punch);
185 lua_pushnumber(L, wear);
187 // If the punched is a player, and its HP changed
188 if (src_original_hp != co->getHP() &&
189 co->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
190 getServer(L)->SendPlayerHPOrDie((PlayerSAO *)co,
191 PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, puncher));
194 // If the puncher is a player, and its HP changed
195 if (dst_origin_hp != puncher->getHP() &&
196 puncher->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
197 getServer(L)->SendPlayerHPOrDie((PlayerSAO *)puncher,
198 PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, co));
203 // right_click(self, clicker); clicker = an another ObjectRef
204 int ObjectRef::l_right_click(lua_State *L)
206 NO_MAP_LOCK_REQUIRED;
207 ObjectRef *ref = checkobject(L, 1);
208 ObjectRef *ref2 = checkobject(L, 2);
209 ServerActiveObject *co = getobject(ref);
210 ServerActiveObject *co2 = getobject(ref2);
211 if (co == NULL) return 0;
212 if (co2 == NULL) return 0;
219 // hp = number of hitpoints (2 * number of hearts)
221 int ObjectRef::l_set_hp(lua_State *L)
223 NO_MAP_LOCK_REQUIRED;
226 ObjectRef *ref = checkobject(L, 1);
227 luaL_checknumber(L, 2);
228 ServerActiveObject *co = getobject(ref);
233 int hp = lua_tonumber(L, 2);
236 PlayerHPChangeReason reason(PlayerHPChangeReason::SET_HP);
237 reason.from_mod = true;
238 if (lua_istable(L, 3)) {
241 lua_getfield(L, -1, "type");
242 if (lua_isstring(L, -1) &&
243 !reason.setTypeFromString(readParam<std::string>(L, -1))) {
244 errorstream << "Bad type given!" << std::endl;
248 reason.lua_reference = luaL_ref(L, LUA_REGISTRYINDEX);
252 co->setHP(hp, reason);
253 if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER)
254 getServer(L)->SendPlayerHPOrDie((PlayerSAO *)co, reason);
256 if (reason.hasLuaReference())
257 luaL_unref(L, LUA_REGISTRYINDEX, reason.lua_reference);
264 // returns: number of hitpoints (2 * number of hearts)
265 // 0 if not applicable to this type of object
266 int ObjectRef::l_get_hp(lua_State *L)
268 NO_MAP_LOCK_REQUIRED;
269 ObjectRef *ref = checkobject(L, 1);
270 ServerActiveObject *co = getobject(ref);
273 lua_pushnumber(L, 1);
276 int hp = co->getHP();
277 /*infostream<<"ObjectRef::l_get_hp(): id="<<co->getId()
278 <<" hp="<<hp<<std::endl;*/
280 lua_pushnumber(L, hp);
284 // get_inventory(self)
285 int ObjectRef::l_get_inventory(lua_State *L)
287 NO_MAP_LOCK_REQUIRED;
288 ObjectRef *ref = checkobject(L, 1);
289 ServerActiveObject *co = getobject(ref);
290 if (co == NULL) return 0;
292 InventoryLocation loc = co->getInventoryLocation();
293 if (getServerInventoryMgr(L)->getInventory(loc) != NULL)
294 InvRef::create(L, loc);
296 lua_pushnil(L); // An object may have no inventory (nil)
300 // get_wield_list(self)
301 int ObjectRef::l_get_wield_list(lua_State *L)
303 NO_MAP_LOCK_REQUIRED;
304 ObjectRef *ref = checkobject(L, 1);
305 ServerActiveObject *co = getobject(ref);
309 lua_pushstring(L, co->getWieldList().c_str());
313 // get_wield_index(self)
314 int ObjectRef::l_get_wield_index(lua_State *L)
316 NO_MAP_LOCK_REQUIRED;
317 ObjectRef *ref = checkobject(L, 1);
318 ServerActiveObject *co = getobject(ref);
322 lua_pushinteger(L, co->getWieldIndex() + 1);
326 // get_wielded_item(self)
327 int ObjectRef::l_get_wielded_item(lua_State *L)
329 NO_MAP_LOCK_REQUIRED;
330 ObjectRef *ref = checkobject(L, 1);
331 ServerActiveObject *co = getobject(ref);
334 LuaItemStack::create(L, ItemStack());
338 ItemStack selected_item;
339 co->getWieldedItem(&selected_item, nullptr);
340 LuaItemStack::create(L, selected_item);
344 // set_wielded_item(self, itemstack or itemstring or table or nil)
345 int ObjectRef::l_set_wielded_item(lua_State *L)
347 NO_MAP_LOCK_REQUIRED;
348 ObjectRef *ref = checkobject(L, 1);
349 ServerActiveObject *co = getobject(ref);
350 if (co == NULL) return 0;
352 ItemStack item = read_item(L, 2, getServer(L)->idef());
353 bool success = co->setWieldedItem(item);
354 if (success && co->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
355 getServer(L)->SendInventory((PlayerSAO *)co, true);
357 lua_pushboolean(L, success);
361 // set_armor_groups(self, groups)
362 int ObjectRef::l_set_armor_groups(lua_State *L)
364 NO_MAP_LOCK_REQUIRED;
365 ObjectRef *ref = checkobject(L, 1);
366 ServerActiveObject *co = getobject(ref);
367 if (co == NULL) return 0;
369 ItemGroupList groups;
370 read_groups(L, 2, groups);
371 co->setArmorGroups(groups);
375 // get_armor_groups(self)
376 int ObjectRef::l_get_armor_groups(lua_State *L)
378 NO_MAP_LOCK_REQUIRED;
379 ObjectRef *ref = checkobject(L, 1);
380 ServerActiveObject *co = getobject(ref);
384 push_groups(L, co->getArmorGroups());
388 // set_physics_override(self, physics_override_speed, physics_override_jump,
389 // physics_override_gravity, sneak, sneak_glitch, new_move)
390 int ObjectRef::l_set_physics_override(lua_State *L)
392 NO_MAP_LOCK_REQUIRED;
393 ObjectRef *ref = checkobject(L, 1);
394 PlayerSAO *co = (PlayerSAO *) getobject(ref);
395 if (co == NULL) return 0;
397 if (lua_istable(L, 2)) {
398 co->m_physics_override_speed = getfloatfield_default(
399 L, 2, "speed", co->m_physics_override_speed);
400 co->m_physics_override_jump = getfloatfield_default(
401 L, 2, "jump", co->m_physics_override_jump);
402 co->m_physics_override_gravity = getfloatfield_default(
403 L, 2, "gravity", co->m_physics_override_gravity);
404 co->m_physics_override_sneak = getboolfield_default(
405 L, 2, "sneak", co->m_physics_override_sneak);
406 co->m_physics_override_sneak_glitch = getboolfield_default(
407 L, 2, "sneak_glitch", co->m_physics_override_sneak_glitch);
408 co->m_physics_override_new_move = getboolfield_default(
409 L, 2, "new_move", co->m_physics_override_new_move);
410 co->m_physics_override_sent = false;
412 // old, non-table format
413 if (!lua_isnil(L, 2)) {
414 co->m_physics_override_speed = lua_tonumber(L, 2);
415 co->m_physics_override_sent = false;
417 if (!lua_isnil(L, 3)) {
418 co->m_physics_override_jump = lua_tonumber(L, 3);
419 co->m_physics_override_sent = false;
421 if (!lua_isnil(L, 4)) {
422 co->m_physics_override_gravity = lua_tonumber(L, 4);
423 co->m_physics_override_sent = false;
429 // get_physics_override(self)
430 int ObjectRef::l_get_physics_override(lua_State *L)
432 NO_MAP_LOCK_REQUIRED;
433 ObjectRef *ref = checkobject(L, 1);
434 PlayerSAO *co = (PlayerSAO *)getobject(ref);
439 lua_pushnumber(L, co->m_physics_override_speed);
440 lua_setfield(L, -2, "speed");
441 lua_pushnumber(L, co->m_physics_override_jump);
442 lua_setfield(L, -2, "jump");
443 lua_pushnumber(L, co->m_physics_override_gravity);
444 lua_setfield(L, -2, "gravity");
445 lua_pushboolean(L, co->m_physics_override_sneak);
446 lua_setfield(L, -2, "sneak");
447 lua_pushboolean(L, co->m_physics_override_sneak_glitch);
448 lua_setfield(L, -2, "sneak_glitch");
449 lua_pushboolean(L, co->m_physics_override_new_move);
450 lua_setfield(L, -2, "new_move");
454 // set_animation(self, frame_range, frame_speed, frame_blend, frame_loop)
455 int ObjectRef::l_set_animation(lua_State *L)
457 NO_MAP_LOCK_REQUIRED;
458 ObjectRef *ref = checkobject(L, 1);
459 ServerActiveObject *co = getobject(ref);
460 if (co == NULL) return 0;
462 v2f frames = v2f(1, 1);
463 if (!lua_isnil(L, 2))
464 frames = readParam<v2f>(L, 2);
465 float frame_speed = 15;
466 if (!lua_isnil(L, 3))
467 frame_speed = lua_tonumber(L, 3);
468 float frame_blend = 0;
469 if (!lua_isnil(L, 4))
470 frame_blend = lua_tonumber(L, 4);
471 bool frame_loop = true;
472 if (lua_isboolean(L, 5))
473 frame_loop = readParam<bool>(L, 5);
474 co->setAnimation(frames, frame_speed, frame_blend, frame_loop);
478 // get_animation(self)
479 int ObjectRef::l_get_animation(lua_State *L)
481 NO_MAP_LOCK_REQUIRED;
482 ObjectRef *ref = checkobject(L, 1);
483 ServerActiveObject *co = getobject(ref);
487 v2f frames = v2f(1,1);
488 float frame_speed = 15;
489 float frame_blend = 0;
490 bool frame_loop = true;
491 co->getAnimation(&frames, &frame_speed, &frame_blend, &frame_loop);
494 lua_pushnumber(L, frame_speed);
495 lua_pushnumber(L, frame_blend);
496 lua_pushboolean(L, frame_loop);
500 // set_local_animation(self, {stand/idle}, {walk}, {dig}, {walk+dig}, frame_speed)
501 int ObjectRef::l_set_local_animation(lua_State *L)
503 NO_MAP_LOCK_REQUIRED;
504 ObjectRef *ref = checkobject(L, 1);
505 RemotePlayer *player = getplayer(ref);
510 for (int i=0;i<4;i++) {
511 if (!lua_isnil(L, 2+1))
512 frames[i] = read_v2s32(L, 2+i);
514 float frame_speed = 30;
515 if (!lua_isnil(L, 6))
516 frame_speed = lua_tonumber(L, 6);
518 getServer(L)->setLocalPlayerAnimations(player, frames, frame_speed);
519 lua_pushboolean(L, true);
523 // get_local_animation(self)
524 int ObjectRef::l_get_local_animation(lua_State *L)
526 NO_MAP_LOCK_REQUIRED;
527 ObjectRef *ref = checkobject(L, 1);
528 RemotePlayer *player = getplayer(ref);
534 player->getLocalAnimations(frames, &frame_speed);
536 for (const v2s32 &frame : frames) {
537 push_v2s32(L, frame);
540 lua_pushnumber(L, frame_speed);
544 // set_eye_offset(self, v3f first pv, v3f third pv)
545 int ObjectRef::l_set_eye_offset(lua_State *L)
547 NO_MAP_LOCK_REQUIRED;
548 ObjectRef *ref = checkobject(L, 1);
549 RemotePlayer *player = getplayer(ref);
553 v3f offset_first = v3f(0, 0, 0);
554 v3f offset_third = v3f(0, 0, 0);
556 if (!lua_isnil(L, 2))
557 offset_first = read_v3f(L, 2);
558 if (!lua_isnil(L, 3))
559 offset_third = read_v3f(L, 3);
561 // Prevent abuse of offset values (keep player always visible)
562 offset_third.X = rangelim(offset_third.X,-10,10);
563 offset_third.Z = rangelim(offset_third.Z,-5,5);
564 /* TODO: if possible: improve the camera colision detetion to allow Y <= -1.5) */
565 offset_third.Y = rangelim(offset_third.Y,-10,15); //1.5*BS
567 getServer(L)->setPlayerEyeOffset(player, offset_first, offset_third);
568 lua_pushboolean(L, true);
572 // get_eye_offset(self)
573 int ObjectRef::l_get_eye_offset(lua_State *L)
575 NO_MAP_LOCK_REQUIRED;
576 ObjectRef *ref = checkobject(L, 1);
577 RemotePlayer *player = getplayer(ref);
581 push_v3f(L, player->eye_offset_first);
582 push_v3f(L, player->eye_offset_third);
586 // send_mapblock(self, pos)
587 int ObjectRef::l_send_mapblock(lua_State *L)
589 NO_MAP_LOCK_REQUIRED;
590 ObjectRef *ref = checkobject(L, 1);
592 RemotePlayer *player = getplayer(ref);
595 v3s16 p = read_v3s16(L, 2);
597 session_t peer_id = player->getPeerId();
598 bool r = getServer(L)->SendBlock(peer_id, p);
600 lua_pushboolean(L, r);
604 // set_animation_frame_speed(self, frame_speed)
605 int ObjectRef::l_set_animation_frame_speed(lua_State *L)
607 NO_MAP_LOCK_REQUIRED;
608 ObjectRef *ref = checkobject(L, 1);
609 ServerActiveObject *co = getobject(ref);
614 if (!lua_isnil(L, 2)) {
615 float frame_speed = lua_tonumber(L, 2);
616 co->setAnimationSpeed(frame_speed);
617 lua_pushboolean(L, true);
619 lua_pushboolean(L, false);
624 // set_bone_position(self, std::string bone, v3f position, v3f rotation)
625 int ObjectRef::l_set_bone_position(lua_State *L)
627 NO_MAP_LOCK_REQUIRED;
628 ObjectRef *ref = checkobject(L, 1);
629 ServerActiveObject *co = getobject(ref);
630 if (co == NULL) return 0;
633 if (!lua_isnil(L, 2))
634 bone = readParam<std::string>(L, 2);
635 v3f position = v3f(0, 0, 0);
636 if (!lua_isnil(L, 3))
637 position = check_v3f(L, 3);
638 v3f rotation = v3f(0, 0, 0);
639 if (!lua_isnil(L, 4))
640 rotation = check_v3f(L, 4);
641 co->setBonePosition(bone, position, rotation);
645 // get_bone_position(self, bone)
646 int ObjectRef::l_get_bone_position(lua_State *L)
648 NO_MAP_LOCK_REQUIRED;
649 ObjectRef *ref = checkobject(L, 1);
650 ServerActiveObject *co = getobject(ref);
655 if (!lua_isnil(L, 2))
656 bone = readParam<std::string>(L, 2);
658 v3f position = v3f(0, 0, 0);
659 v3f rotation = v3f(0, 0, 0);
660 co->getBonePosition(bone, &position, &rotation);
662 push_v3f(L, position);
663 push_v3f(L, rotation);
667 // set_attach(self, parent, bone, position, rotation)
668 int ObjectRef::l_set_attach(lua_State *L)
672 ObjectRef *ref = checkobject(L, 1);
673 ObjectRef *parent_ref = checkobject(L, 2);
674 ServerActiveObject *co = getobject(ref);
675 ServerActiveObject *parent = getobject(parent_ref);
683 throw LuaError("ObjectRef::set_attach: attaching object to itself is not allowed.");
688 v3f position = v3f(0, 0, 0);
689 v3f rotation = v3f(0, 0, 0);
690 co->getAttachment(&parent_id, &bone, &position, &rotation);
692 ServerActiveObject *old_parent = env->getActiveObject(parent_id);
693 old_parent->removeAttachmentChild(co->getId());
697 if (!lua_isnil(L, 3))
698 bone = readParam<std::string>(L, 3);
699 position = v3f(0, 0, 0);
700 if (!lua_isnil(L, 4))
701 position = read_v3f(L, 4);
702 rotation = v3f(0, 0, 0);
703 if (!lua_isnil(L, 5))
704 rotation = read_v3f(L, 5);
705 co->setAttachment(parent->getId(), bone, position, rotation);
706 parent->addAttachmentChild(co->getId());
711 int ObjectRef::l_get_attach(lua_State *L)
715 ObjectRef *ref = checkobject(L, 1);
716 ServerActiveObject *co = getobject(ref);
723 v3f position = v3f(0, 0, 0);
724 v3f rotation = v3f(0, 0, 0);
725 co->getAttachment(&parent_id, &bone, &position, &rotation);
728 ServerActiveObject *parent = env->getActiveObject(parent_id);
730 getScriptApiBase(L)->objectrefGetOrCreate(L, parent);
731 lua_pushlstring(L, bone.c_str(), bone.size());
732 push_v3f(L, position);
733 push_v3f(L, rotation);
738 int ObjectRef::l_set_detach(lua_State *L)
742 ObjectRef *ref = checkobject(L, 1);
743 ServerActiveObject *co = getobject(ref);
747 co->clearParentAttachment();
751 // set_properties(self, properties)
752 int ObjectRef::l_set_properties(lua_State *L)
754 NO_MAP_LOCK_REQUIRED;
755 ObjectRef *ref = checkobject(L, 1);
756 ServerActiveObject *co = getobject(ref);
760 ObjectProperties *prop = co->accessObjectProperties();
764 read_object_properties(L, 2, co, prop, getServer(L)->idef());
765 co->notifyObjectPropertiesModified();
769 // get_properties(self)
770 int ObjectRef::l_get_properties(lua_State *L)
772 NO_MAP_LOCK_REQUIRED;
773 ObjectRef *ref = checkobject(L, 1);
774 ServerActiveObject *co = getobject(ref);
777 ObjectProperties *prop = co->accessObjectProperties();
780 push_object_properties(L, prop);
785 int ObjectRef::l_is_player(lua_State *L)
787 NO_MAP_LOCK_REQUIRED;
788 ObjectRef *ref = checkobject(L, 1);
789 RemotePlayer *player = getplayer(ref);
790 lua_pushboolean(L, (player != NULL));
794 // set_nametag_attributes(self, attributes)
795 int ObjectRef::l_set_nametag_attributes(lua_State *L)
797 NO_MAP_LOCK_REQUIRED;
798 ObjectRef *ref = checkobject(L, 1);
799 ServerActiveObject *co = getobject(ref);
803 ObjectProperties *prop = co->accessObjectProperties();
807 lua_getfield(L, 2, "color");
808 if (!lua_isnil(L, -1)) {
809 video::SColor color = prop->nametag_color;
810 read_color(L, -1, &color);
811 prop->nametag_color = color;
815 std::string nametag = getstringfield_default(L, 2, "text", "");
816 prop->nametag = nametag;
818 co->notifyObjectPropertiesModified();
819 lua_pushboolean(L, true);
823 // get_nametag_attributes(self)
824 int ObjectRef::l_get_nametag_attributes(lua_State *L)
826 NO_MAP_LOCK_REQUIRED;
827 ObjectRef *ref = checkobject(L, 1);
828 ServerActiveObject *co = getobject(ref);
832 ObjectProperties *prop = co->accessObjectProperties();
836 video::SColor color = prop->nametag_color;
839 push_ARGB8(L, color);
840 lua_setfield(L, -2, "color");
841 lua_pushstring(L, prop->nametag.c_str());
842 lua_setfield(L, -2, "text");
846 /* LuaEntitySAO-only */
848 // set_velocity(self, {x=num, y=num, z=num})
849 int ObjectRef::l_set_velocity(lua_State *L)
851 NO_MAP_LOCK_REQUIRED;
852 ObjectRef *ref = checkobject(L, 1);
853 LuaEntitySAO *co = getluaobject(ref);
854 if (co == NULL) return 0;
855 v3f pos = checkFloatPos(L, 2);
857 co->setVelocity(pos);
861 // add_velocity(self, {x=num, y=num, z=num})
862 int ObjectRef::l_add_velocity(lua_State *L)
864 NO_MAP_LOCK_REQUIRED;
865 ObjectRef *ref = checkobject(L, 1);
866 LuaEntitySAO *co = getluaobject(ref);
869 v3f pos = checkFloatPos(L, 2);
871 co->addVelocity(pos);
875 // get_velocity(self)
876 int ObjectRef::l_get_velocity(lua_State *L)
878 NO_MAP_LOCK_REQUIRED;
879 ObjectRef *ref = checkobject(L, 1);
880 LuaEntitySAO *co = getluaobject(ref);
881 if (co == NULL) return 0;
883 v3f v = co->getVelocity();
888 // set_acceleration(self, {x=num, y=num, z=num})
889 int ObjectRef::l_set_acceleration(lua_State *L)
891 NO_MAP_LOCK_REQUIRED;
892 ObjectRef *ref = checkobject(L, 1);
893 LuaEntitySAO *co = getluaobject(ref);
894 if (co == NULL) return 0;
896 v3f pos = checkFloatPos(L, 2);
898 co->setAcceleration(pos);
902 // get_acceleration(self)
903 int ObjectRef::l_get_acceleration(lua_State *L)
905 NO_MAP_LOCK_REQUIRED;
906 ObjectRef *ref = checkobject(L, 1);
907 LuaEntitySAO *co = getluaobject(ref);
908 if (co == NULL) return 0;
910 v3f v = co->getAcceleration();
915 // set_rotation(self, {x=num, y=num, z=num})
916 // Each 'num' is in radians
917 int ObjectRef::l_set_rotation(lua_State *L)
919 NO_MAP_LOCK_REQUIRED;
920 ObjectRef *ref = checkobject(L, 1);
921 LuaEntitySAO *co = getluaobject(ref);
925 v3f rotation = check_v3f(L, 2) * core::RADTODEG;
926 co->setRotation(rotation);
930 // get_rotation(self)
931 // returns: {x=num, y=num, z=num}
932 // Each 'num' is in radians
933 int ObjectRef::l_get_rotation(lua_State *L)
935 NO_MAP_LOCK_REQUIRED;
936 ObjectRef *ref = checkobject(L, 1);
937 LuaEntitySAO *co = getluaobject(ref);
942 v3f rotation = co->getRotation() * core::DEGTORAD;
943 push_v3f(L, rotation);
947 // set_yaw(self, radians)
948 int ObjectRef::l_set_yaw(lua_State *L)
950 NO_MAP_LOCK_REQUIRED;
951 ObjectRef *ref = checkobject(L, 1);
952 LuaEntitySAO *co = getluaobject(ref);
954 if (co == NULL) return 0;
956 throw LuaError("ObjectRef::set_yaw: NaN value is not allowed.");
958 float yaw = readParam<float>(L, 2) * core::RADTODEG;
959 co->setRotation(v3f(0, yaw, 0));
964 int ObjectRef::l_get_yaw(lua_State *L)
966 NO_MAP_LOCK_REQUIRED;
967 ObjectRef *ref = checkobject(L, 1);
968 LuaEntitySAO *co = getluaobject(ref);
972 float yaw = co->getRotation().Y * core::DEGTORAD;
973 lua_pushnumber(L, yaw);
977 // set_texture_mod(self, mod)
978 int ObjectRef::l_set_texture_mod(lua_State *L)
980 NO_MAP_LOCK_REQUIRED;
981 ObjectRef *ref = checkobject(L, 1);
982 LuaEntitySAO *co = getluaobject(ref);
983 if (co == NULL) return 0;
985 std::string mod = luaL_checkstring(L, 2);
986 co->setTextureMod(mod);
990 // get_texture_mod(self)
991 int ObjectRef::l_get_texture_mod(lua_State *L)
993 NO_MAP_LOCK_REQUIRED;
994 ObjectRef *ref = checkobject(L, 1);
995 LuaEntitySAO *co = getluaobject(ref);
996 if (co == NULL) return 0;
998 std::string mod = co->getTextureMod();
999 lua_pushstring(L, mod.c_str());
1003 // set_sprite(self, p={x=0,y=0}, num_frames=1, framelength=0.2,
1004 // select_horiz_by_yawpitch=false)
1005 int ObjectRef::l_set_sprite(lua_State *L)
1007 NO_MAP_LOCK_REQUIRED;
1008 ObjectRef *ref = checkobject(L, 1);
1009 LuaEntitySAO *co = getluaobject(ref);
1010 if (co == NULL) return 0;
1013 if (!lua_isnil(L, 2))
1014 p = readParam<v2s16>(L, 2);
1016 if (!lua_isnil(L, 3))
1017 num_frames = lua_tonumber(L, 3);
1018 float framelength = 0.2;
1019 if (!lua_isnil(L, 4))
1020 framelength = lua_tonumber(L, 4);
1021 bool select_horiz_by_yawpitch = false;
1022 if (!lua_isnil(L, 5))
1023 select_horiz_by_yawpitch = readParam<bool>(L, 5);
1024 co->setSprite(p, num_frames, framelength, select_horiz_by_yawpitch);
1029 // get_entity_name(self)
1030 int ObjectRef::l_get_entity_name(lua_State *L)
1032 NO_MAP_LOCK_REQUIRED;
1033 ObjectRef *ref = checkobject(L, 1);
1034 LuaEntitySAO *co = getluaobject(ref);
1035 log_deprecated(L,"Deprecated call to \"get_entity_name");
1036 if (co == NULL) return 0;
1038 std::string name = co->getName();
1039 lua_pushstring(L, name.c_str());
1043 // get_luaentity(self)
1044 int ObjectRef::l_get_luaentity(lua_State *L)
1046 NO_MAP_LOCK_REQUIRED;
1047 ObjectRef *ref = checkobject(L, 1);
1048 LuaEntitySAO *co = getluaobject(ref);
1049 if (co == NULL) return 0;
1051 luaentity_get(L, co->getId());
1057 // is_player_connected(self)
1058 int ObjectRef::l_is_player_connected(lua_State *L)
1060 NO_MAP_LOCK_REQUIRED;
1061 // This method was once added for a bugfix, but never documented
1062 log_deprecated(L, "is_player_connected is undocumented and "
1063 "will be removed in a future release");
1064 ObjectRef *ref = checkobject(L, 1);
1065 RemotePlayer *player = getplayer(ref);
1066 lua_pushboolean(L, (player != NULL && player->getPeerId() != PEER_ID_INEXISTENT));
1070 // get_player_name(self)
1071 int ObjectRef::l_get_player_name(lua_State *L)
1073 NO_MAP_LOCK_REQUIRED;
1074 ObjectRef *ref = checkobject(L, 1);
1075 RemotePlayer *player = getplayer(ref);
1076 if (player == NULL) {
1077 lua_pushlstring(L, "", 0);
1081 lua_pushstring(L, player->getName());
1085 // get_player_velocity(self)
1086 int ObjectRef::l_get_player_velocity(lua_State *L)
1088 NO_MAP_LOCK_REQUIRED;
1089 ObjectRef *ref = checkobject(L, 1);
1090 RemotePlayer *player = getplayer(ref);
1091 if (player == NULL) {
1096 push_v3f(L, player->getSpeed() / BS);
1100 // add_player_velocity(self, {x=num, y=num, z=num})
1101 int ObjectRef::l_add_player_velocity(lua_State *L)
1103 NO_MAP_LOCK_REQUIRED;
1104 ObjectRef *ref = checkobject(L, 1);
1105 v3f vel = checkFloatPos(L, 2);
1107 PlayerSAO *co = getplayersao(ref);
1112 co->setMaxSpeedOverride(vel);
1113 getServer(L)->SendPlayerSpeed(co->getPeerID(), vel);
1117 // get_look_dir(self)
1118 int ObjectRef::l_get_look_dir(lua_State *L)
1120 NO_MAP_LOCK_REQUIRED;
1121 ObjectRef *ref = checkobject(L, 1);
1122 PlayerSAO* co = getplayersao(ref);
1123 if (co == NULL) return 0;
1125 float pitch = co->getRadLookPitchDep();
1126 float yaw = co->getRadYawDep();
1127 v3f v(std::cos(pitch) * std::cos(yaw), std::sin(pitch), std::cos(pitch) *
1134 // get_look_pitch(self)
1135 int ObjectRef::l_get_look_pitch(lua_State *L)
1137 NO_MAP_LOCK_REQUIRED;
1140 "Deprecated call to get_look_pitch, use get_look_vertical instead");
1142 ObjectRef *ref = checkobject(L, 1);
1143 PlayerSAO* co = getplayersao(ref);
1144 if (co == NULL) return 0;
1146 lua_pushnumber(L, co->getRadLookPitchDep());
1151 // get_look_yaw(self)
1152 int ObjectRef::l_get_look_yaw(lua_State *L)
1154 NO_MAP_LOCK_REQUIRED;
1157 "Deprecated call to get_look_yaw, use get_look_horizontal instead");
1159 ObjectRef *ref = checkobject(L, 1);
1160 PlayerSAO* co = getplayersao(ref);
1161 if (co == NULL) return 0;
1163 lua_pushnumber(L, co->getRadYawDep());
1167 // get_look_pitch2(self)
1168 int ObjectRef::l_get_look_vertical(lua_State *L)
1170 NO_MAP_LOCK_REQUIRED;
1171 ObjectRef *ref = checkobject(L, 1);
1172 PlayerSAO* co = getplayersao(ref);
1173 if (co == NULL) return 0;
1175 lua_pushnumber(L, co->getRadLookPitch());
1179 // get_look_yaw2(self)
1180 int ObjectRef::l_get_look_horizontal(lua_State *L)
1182 NO_MAP_LOCK_REQUIRED;
1183 ObjectRef *ref = checkobject(L, 1);
1184 PlayerSAO* co = getplayersao(ref);
1185 if (co == NULL) return 0;
1187 lua_pushnumber(L, co->getRadRotation().Y);
1191 // set_look_vertical(self, radians)
1192 int ObjectRef::l_set_look_vertical(lua_State *L)
1194 NO_MAP_LOCK_REQUIRED;
1195 ObjectRef *ref = checkobject(L, 1);
1196 PlayerSAO* co = getplayersao(ref);
1197 if (co == NULL) return 0;
1198 float pitch = readParam<float>(L, 2) * core::RADTODEG;
1200 co->setLookPitchAndSend(pitch);
1204 // set_look_horizontal(self, radians)
1205 int ObjectRef::l_set_look_horizontal(lua_State *L)
1207 NO_MAP_LOCK_REQUIRED;
1208 ObjectRef *ref = checkobject(L, 1);
1209 PlayerSAO* co = getplayersao(ref);
1210 if (co == NULL) return 0;
1211 float yaw = readParam<float>(L, 2) * core::RADTODEG;
1213 co->setPlayerYawAndSend(yaw);
1218 // set_look_pitch(self, radians)
1219 int ObjectRef::l_set_look_pitch(lua_State *L)
1221 NO_MAP_LOCK_REQUIRED;
1224 "Deprecated call to set_look_pitch, use set_look_vertical instead.");
1226 ObjectRef *ref = checkobject(L, 1);
1227 PlayerSAO* co = getplayersao(ref);
1228 if (co == NULL) return 0;
1229 float pitch = readParam<float>(L, 2) * core::RADTODEG;
1231 co->setLookPitchAndSend(pitch);
1236 // set_look_yaw(self, radians)
1237 int ObjectRef::l_set_look_yaw(lua_State *L)
1239 NO_MAP_LOCK_REQUIRED;
1242 "Deprecated call to set_look_yaw, use set_look_horizontal instead.");
1244 ObjectRef *ref = checkobject(L, 1);
1245 PlayerSAO* co = getplayersao(ref);
1246 if (co == NULL) return 0;
1247 float yaw = readParam<float>(L, 2) * core::RADTODEG;
1249 co->setPlayerYawAndSend(yaw);
1253 // set_fov(self, degrees[, is_multiplier, transition_time])
1254 int ObjectRef::l_set_fov(lua_State *L)
1256 NO_MAP_LOCK_REQUIRED;
1257 ObjectRef *ref = checkobject(L, 1);
1258 RemotePlayer *player = getplayer(ref);
1263 static_cast<f32>(luaL_checknumber(L, 2)),
1264 readParam<bool>(L, 3, false),
1265 lua_isnumber(L, 4) ? static_cast<f32>(luaL_checknumber(L, 4)) : 0.0f
1267 getServer(L)->SendPlayerFov(player->getPeerId());
1273 int ObjectRef::l_get_fov(lua_State *L)
1275 NO_MAP_LOCK_REQUIRED;
1276 ObjectRef *ref = checkobject(L, 1);
1277 RemotePlayer *player = getplayer(ref);
1281 PlayerFovSpec fov_spec = player->getFov();
1282 lua_pushnumber(L, fov_spec.fov);
1283 lua_pushboolean(L, fov_spec.is_multiplier);
1284 lua_pushnumber(L, fov_spec.transition_time);
1289 // set_breath(self, breath)
1290 int ObjectRef::l_set_breath(lua_State *L)
1292 NO_MAP_LOCK_REQUIRED;
1293 ObjectRef *ref = checkobject(L, 1);
1294 PlayerSAO* co = getplayersao(ref);
1295 if (co == NULL) return 0;
1296 u16 breath = luaL_checknumber(L, 2);
1297 co->setBreath(breath);
1303 int ObjectRef::l_get_breath(lua_State *L)
1305 NO_MAP_LOCK_REQUIRED;
1306 ObjectRef *ref = checkobject(L, 1);
1307 PlayerSAO* co = getplayersao(ref);
1308 if (co == NULL) return 0;
1310 u16 breath = co->getBreath();
1311 lua_pushinteger (L, breath);
1315 // set_attribute(self, attribute, value)
1316 int ObjectRef::l_set_attribute(lua_State *L)
1319 "Deprecated call to set_attribute, use MetaDataRef methods instead.");
1321 ObjectRef *ref = checkobject(L, 1);
1322 PlayerSAO* co = getplayersao(ref);
1326 std::string attr = luaL_checkstring(L, 2);
1327 if (lua_isnil(L, 3)) {
1328 co->getMeta().removeString(attr);
1330 std::string value = luaL_checkstring(L, 3);
1331 co->getMeta().setString(attr, value);
1336 // get_attribute(self, attribute)
1337 int ObjectRef::l_get_attribute(lua_State *L)
1340 "Deprecated call to get_attribute, use MetaDataRef methods instead.");
1342 ObjectRef *ref = checkobject(L, 1);
1343 PlayerSAO* co = getplayersao(ref);
1347 std::string attr = luaL_checkstring(L, 2);
1350 if (co->getMeta().getStringToRef(attr, value)) {
1351 lua_pushstring(L, value.c_str());
1359 // get_meta(self, attribute)
1360 int ObjectRef::l_get_meta(lua_State *L)
1362 ObjectRef *ref = checkobject(L, 1);
1363 PlayerSAO *co = getplayersao(ref);
1367 PlayerMetaRef::create(L, &co->getMeta());
1372 // set_inventory_formspec(self, formspec)
1373 int ObjectRef::l_set_inventory_formspec(lua_State *L)
1375 NO_MAP_LOCK_REQUIRED;
1376 ObjectRef *ref = checkobject(L, 1);
1377 RemotePlayer *player = getplayer(ref);
1378 if (player == NULL) return 0;
1379 std::string formspec = luaL_checkstring(L, 2);
1381 player->inventory_formspec = formspec;
1382 getServer(L)->reportInventoryFormspecModified(player->getName());
1383 lua_pushboolean(L, true);
1387 // get_inventory_formspec(self) -> formspec
1388 int ObjectRef::l_get_inventory_formspec(lua_State *L)
1390 NO_MAP_LOCK_REQUIRED;
1391 ObjectRef *ref = checkobject(L, 1);
1392 RemotePlayer *player = getplayer(ref);
1393 if (player == NULL) return 0;
1395 std::string formspec = player->inventory_formspec;
1396 lua_pushlstring(L, formspec.c_str(), formspec.size());
1400 // set_formspec_prepend(self, formspec)
1401 int ObjectRef::l_set_formspec_prepend(lua_State *L)
1403 NO_MAP_LOCK_REQUIRED;
1404 ObjectRef *ref = checkobject(L, 1);
1405 RemotePlayer *player = getplayer(ref);
1409 std::string formspec = luaL_checkstring(L, 2);
1411 player->formspec_prepend = formspec;
1412 getServer(L)->reportFormspecPrependModified(player->getName());
1413 lua_pushboolean(L, true);
1417 // get_formspec_prepend(self) -> formspec
1418 int ObjectRef::l_get_formspec_prepend(lua_State *L)
1420 NO_MAP_LOCK_REQUIRED;
1421 ObjectRef *ref = checkobject(L, 1);
1422 RemotePlayer *player = getplayer(ref);
1426 std::string formspec = player->formspec_prepend;
1427 lua_pushlstring(L, formspec.c_str(), formspec.size());
1431 // get_player_control(self)
1432 int ObjectRef::l_get_player_control(lua_State *L)
1434 NO_MAP_LOCK_REQUIRED;
1435 ObjectRef *ref = checkobject(L, 1);
1436 RemotePlayer *player = getplayer(ref);
1437 if (player == NULL) {
1438 lua_pushlstring(L, "", 0);
1442 const PlayerControl &control = player->getPlayerControl();
1444 lua_pushboolean(L, control.up);
1445 lua_setfield(L, -2, "up");
1446 lua_pushboolean(L, control.down);
1447 lua_setfield(L, -2, "down");
1448 lua_pushboolean(L, control.left);
1449 lua_setfield(L, -2, "left");
1450 lua_pushboolean(L, control.right);
1451 lua_setfield(L, -2, "right");
1452 lua_pushboolean(L, control.jump);
1453 lua_setfield(L, -2, "jump");
1454 lua_pushboolean(L, control.aux1);
1455 lua_setfield(L, -2, "aux1");
1456 lua_pushboolean(L, control.sneak);
1457 lua_setfield(L, -2, "sneak");
1458 lua_pushboolean(L, control.LMB);
1459 lua_setfield(L, -2, "LMB");
1460 lua_pushboolean(L, control.RMB);
1461 lua_setfield(L, -2, "RMB");
1462 lua_pushboolean(L, control.zoom);
1463 lua_setfield(L, -2, "zoom");
1467 // get_player_control_bits(self)
1468 int ObjectRef::l_get_player_control_bits(lua_State *L)
1470 NO_MAP_LOCK_REQUIRED;
1471 ObjectRef *ref = checkobject(L, 1);
1472 RemotePlayer *player = getplayer(ref);
1473 if (player == NULL) {
1474 lua_pushlstring(L, "", 0);
1478 lua_pushnumber(L, player->keyPressed);
1482 // hud_add(self, form)
1483 int ObjectRef::l_hud_add(lua_State *L)
1485 NO_MAP_LOCK_REQUIRED;
1486 ObjectRef *ref = checkobject(L, 1);
1487 RemotePlayer *player = getplayer(ref);
1491 HudElement *elem = new HudElement;
1492 read_hud_element(L, elem);
1494 u32 id = getServer(L)->hudAdd(player, elem);
1495 if (id == U32_MAX) {
1500 lua_pushnumber(L, id);
1504 // hud_remove(self, id)
1505 int ObjectRef::l_hud_remove(lua_State *L)
1507 NO_MAP_LOCK_REQUIRED;
1508 ObjectRef *ref = checkobject(L, 1);
1509 RemotePlayer *player = getplayer(ref);
1514 if (!lua_isnil(L, 2))
1515 id = lua_tonumber(L, 2);
1517 if (!getServer(L)->hudRemove(player, id))
1520 lua_pushboolean(L, true);
1524 // hud_change(self, id, stat, data)
1525 int ObjectRef::l_hud_change(lua_State *L)
1527 NO_MAP_LOCK_REQUIRED;
1528 ObjectRef *ref = checkobject(L, 1);
1529 RemotePlayer *player = getplayer(ref);
1533 u32 id = lua_isnumber(L, 2) ? lua_tonumber(L, 2) : -1;
1535 HudElement *e = player->getHud(id);
1540 HudElementStat stat = read_hud_change(L, e, &value);
1542 getServer(L)->hudChange(player, id, stat, value);
1544 lua_pushboolean(L, true);
1548 // hud_get(self, id)
1549 int ObjectRef::l_hud_get(lua_State *L)
1551 NO_MAP_LOCK_REQUIRED;
1552 ObjectRef *ref = checkobject(L, 1);
1553 RemotePlayer *player = getplayer(ref);
1557 u32 id = lua_tonumber(L, -1);
1559 HudElement *e = player->getHud(id);
1562 push_hud_element(L, e);
1566 // hud_set_flags(self, flags)
1567 int ObjectRef::l_hud_set_flags(lua_State *L)
1569 NO_MAP_LOCK_REQUIRED;
1570 ObjectRef *ref = checkobject(L, 1);
1571 RemotePlayer *player = getplayer(ref);
1579 const EnumString *esp = es_HudBuiltinElement;
1580 for (int i = 0; esp[i].str; i++) {
1581 if (getboolfield(L, 2, esp[i].str, flag)) {
1582 flags |= esp[i].num * flag;
1586 if (!getServer(L)->hudSetFlags(player, flags, mask))
1589 lua_pushboolean(L, true);
1593 int ObjectRef::l_hud_get_flags(lua_State *L)
1595 NO_MAP_LOCK_REQUIRED;
1596 ObjectRef *ref = checkobject(L, 1);
1597 RemotePlayer *player = getplayer(ref);
1602 lua_pushboolean(L, player->hud_flags & HUD_FLAG_HOTBAR_VISIBLE);
1603 lua_setfield(L, -2, "hotbar");
1604 lua_pushboolean(L, player->hud_flags & HUD_FLAG_HEALTHBAR_VISIBLE);
1605 lua_setfield(L, -2, "healthbar");
1606 lua_pushboolean(L, player->hud_flags & HUD_FLAG_CROSSHAIR_VISIBLE);
1607 lua_setfield(L, -2, "crosshair");
1608 lua_pushboolean(L, player->hud_flags & HUD_FLAG_WIELDITEM_VISIBLE);
1609 lua_setfield(L, -2, "wielditem");
1610 lua_pushboolean(L, player->hud_flags & HUD_FLAG_BREATHBAR_VISIBLE);
1611 lua_setfield(L, -2, "breathbar");
1612 lua_pushboolean(L, player->hud_flags & HUD_FLAG_MINIMAP_VISIBLE);
1613 lua_setfield(L, -2, "minimap");
1614 lua_pushboolean(L, player->hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE);
1615 lua_setfield(L, -2, "minimap_radar");
1620 // hud_set_hotbar_itemcount(self, hotbar_itemcount)
1621 int ObjectRef::l_hud_set_hotbar_itemcount(lua_State *L)
1623 NO_MAP_LOCK_REQUIRED;
1624 ObjectRef *ref = checkobject(L, 1);
1625 RemotePlayer *player = getplayer(ref);
1629 s32 hotbar_itemcount = lua_tonumber(L, 2);
1631 if (!getServer(L)->hudSetHotbarItemcount(player, hotbar_itemcount))
1634 lua_pushboolean(L, true);
1638 // hud_get_hotbar_itemcount(self)
1639 int ObjectRef::l_hud_get_hotbar_itemcount(lua_State *L)
1641 NO_MAP_LOCK_REQUIRED;
1642 ObjectRef *ref = checkobject(L, 1);
1643 RemotePlayer *player = getplayer(ref);
1647 lua_pushnumber(L, player->getHotbarItemcount());
1651 // hud_set_hotbar_image(self, name)
1652 int ObjectRef::l_hud_set_hotbar_image(lua_State *L)
1654 NO_MAP_LOCK_REQUIRED;
1655 ObjectRef *ref = checkobject(L, 1);
1656 RemotePlayer *player = getplayer(ref);
1660 std::string name = readParam<std::string>(L, 2);
1662 getServer(L)->hudSetHotbarImage(player, name);
1666 // hud_get_hotbar_image(self)
1667 int ObjectRef::l_hud_get_hotbar_image(lua_State *L)
1669 NO_MAP_LOCK_REQUIRED;
1670 ObjectRef *ref = checkobject(L, 1);
1671 RemotePlayer *player = getplayer(ref);
1675 const std::string &name = player->getHotbarImage();
1676 lua_pushlstring(L, name.c_str(), name.size());
1680 // hud_set_hotbar_selected_image(self, name)
1681 int ObjectRef::l_hud_set_hotbar_selected_image(lua_State *L)
1683 NO_MAP_LOCK_REQUIRED;
1684 ObjectRef *ref = checkobject(L, 1);
1685 RemotePlayer *player = getplayer(ref);
1689 std::string name = readParam<std::string>(L, 2);
1691 getServer(L)->hudSetHotbarSelectedImage(player, name);
1695 // hud_get_hotbar_selected_image(self)
1696 int ObjectRef::l_hud_get_hotbar_selected_image(lua_State *L)
1698 NO_MAP_LOCK_REQUIRED;
1699 ObjectRef *ref = checkobject(L, 1);
1700 RemotePlayer *player = getplayer(ref);
1704 const std::string &name = player->getHotbarSelectedImage();
1705 lua_pushlstring(L, name.c_str(), name.size());
1709 // set_sky(self, {base_color=, type=, textures=, clouds=, sky_colors={}})
1710 int ObjectRef::l_set_sky(lua_State *L)
1712 NO_MAP_LOCK_REQUIRED;
1713 ObjectRef *ref = checkobject(L, 1);
1714 RemotePlayer *player = getplayer(ref);
1718 bool is_colorspec = is_color_table(L, 2);
1720 SkyboxParams skybox_params = player->getSkyParams();
1721 if (lua_istable(L, 2) && !is_colorspec) {
1722 lua_getfield(L, 2, "base_color");
1723 if (!lua_isnil(L, -1))
1724 read_color(L, -1, &skybox_params.bgcolor);
1727 lua_getfield(L, 2, "type");
1728 if (!lua_isnil(L, -1))
1729 skybox_params.type = luaL_checkstring(L, -1);
1732 lua_getfield(L, 2, "textures");
1733 skybox_params.textures.clear();
1734 if (lua_istable(L, -1) && skybox_params.type == "skybox") {
1736 while (lua_next(L, -2) != 0) {
1737 // Key is at index -2 and value at index -1
1738 skybox_params.textures.emplace_back(readParam<std::string>(L, -1));
1739 // Removes the value, but keeps the key for iteration
1746 We want to avoid crashes, so we're checking even if we're not using them.
1747 However, we want to ensure that the skybox can be set to nil when
1748 using "regular" or "plain" skybox modes as textures aren't needed.
1751 if (skybox_params.textures.size() != 6 && skybox_params.textures.size() > 0)
1752 throw LuaError("Skybox expects 6 textures!");
1754 skybox_params.clouds = getboolfield_default(L, 2,
1755 "clouds", skybox_params.clouds);
1757 lua_getfield(L, 2, "sky_color");
1758 if (lua_istable(L, -1)) {
1759 lua_getfield(L, -1, "day_sky");
1760 read_color(L, -1, &skybox_params.sky_color.day_sky);
1763 lua_getfield(L, -1, "day_horizon");
1764 read_color(L, -1, &skybox_params.sky_color.day_horizon);
1767 lua_getfield(L, -1, "dawn_sky");
1768 read_color(L, -1, &skybox_params.sky_color.dawn_sky);
1771 lua_getfield(L, -1, "dawn_horizon");
1772 read_color(L, -1, &skybox_params.sky_color.dawn_horizon);
1775 lua_getfield(L, -1, "night_sky");
1776 read_color(L, -1, &skybox_params.sky_color.night_sky);
1779 lua_getfield(L, -1, "night_horizon");
1780 read_color(L, -1, &skybox_params.sky_color.night_horizon);
1783 lua_getfield(L, -1, "indoors");
1784 read_color(L, -1, &skybox_params.sky_color.indoors);
1787 // Prevent flickering clouds at dawn/dusk:
1788 skybox_params.fog_sun_tint = video::SColor(255, 255, 255, 255);
1789 lua_getfield(L, -1, "fog_sun_tint");
1790 read_color(L, -1, &skybox_params.fog_sun_tint);
1793 skybox_params.fog_moon_tint = video::SColor(255, 255, 255, 255);
1794 lua_getfield(L, -1, "fog_moon_tint");
1795 read_color(L, -1, &skybox_params.fog_moon_tint);
1798 lua_getfield(L, -1, "fog_tint_type");
1799 if (!lua_isnil(L, -1))
1800 skybox_params.fog_tint_type = luaL_checkstring(L, -1);
1803 // Because we need to leave the "sky_color" table.
1807 // Handle old set_sky calls, and log deprecated:
1808 log_deprecated(L, "Deprecated call to set_sky, please check lua_api.txt");
1810 // Fix sun, moon and stars showing when classic textured skyboxes are used
1811 SunParams sun_params = player->getSunParams();
1812 MoonParams moon_params = player->getMoonParams();
1813 StarParams star_params = player->getStarParams();
1815 // Prevent erroneous background colors
1816 skybox_params.bgcolor = video::SColor(255, 255, 255, 255);
1817 read_color(L, 2, &skybox_params.bgcolor);
1819 skybox_params.type = luaL_checkstring(L, 3);
1821 // Preserve old behaviour of the sun, moon and stars
1822 // when using the old set_sky call.
1823 if (skybox_params.type == "regular") {
1824 sun_params.visible = true;
1825 sun_params.sunrise_visible = true;
1826 moon_params.visible = true;
1827 star_params.visible = true;
1829 sun_params.visible = false;
1830 sun_params.sunrise_visible = false;
1831 moon_params.visible = false;
1832 star_params.visible = false;
1835 skybox_params.textures.clear();
1836 if (lua_istable(L, 4)) {
1838 while (lua_next(L, 4) != 0) {
1839 // Key at index -2, and value at index -1
1840 if (lua_isstring(L, -1))
1841 skybox_params.textures.emplace_back(readParam<std::string>(L, -1));
1843 skybox_params.textures.emplace_back("");
1844 // Remove the value, keep the key for the next iteration
1848 if (skybox_params.type == "skybox" && skybox_params.textures.size() != 6)
1849 throw LuaError("Skybox expects 6 textures.");
1851 skybox_params.clouds = true;
1852 if (lua_isboolean(L, 5))
1853 skybox_params.clouds = readParam<bool>(L, 5);
1855 getServer(L)->setSun(player, sun_params);
1856 getServer(L)->setMoon(player, moon_params);
1857 getServer(L)->setStars(player, star_params);
1859 getServer(L)->setSky(player, skybox_params);
1860 lua_pushboolean(L, true);
1865 int ObjectRef::l_get_sky(lua_State *L)
1867 NO_MAP_LOCK_REQUIRED;
1868 ObjectRef *ref = checkobject(L, 1);
1869 RemotePlayer *player = getplayer(ref);
1873 SkyboxParams skybox_params;
1874 skybox_params = player->getSkyParams();
1876 push_ARGB8(L, skybox_params.bgcolor);
1877 lua_pushlstring(L, skybox_params.type.c_str(), skybox_params.type.size());
1881 for (const std::string& texture : skybox_params.textures) {
1882 lua_pushlstring(L, texture.c_str(), texture.size());
1883 lua_rawseti(L, -2, i++);
1885 lua_pushboolean(L, skybox_params.clouds);
1889 // get_sky_color(self)
1890 int ObjectRef::l_get_sky_color(lua_State *L)
1892 NO_MAP_LOCK_REQUIRED;
1893 ObjectRef *ref = checkobject(L, 1);
1894 RemotePlayer *player = getplayer(ref);
1899 const SkyboxParams& skybox_params = player->getSkyParams();
1902 if (skybox_params.type == "regular") {
1903 push_ARGB8(L, skybox_params.sky_color.day_sky);
1904 lua_setfield(L, -2, "day_sky");
1905 push_ARGB8(L, skybox_params.sky_color.day_horizon);
1906 lua_setfield(L, -2, "day_horizon");
1907 push_ARGB8(L, skybox_params.sky_color.dawn_sky);
1908 lua_setfield(L, -2, "dawn_sky");
1909 push_ARGB8(L, skybox_params.sky_color.dawn_horizon);
1910 lua_setfield(L, -2, "dawn_horizon");
1911 push_ARGB8(L, skybox_params.sky_color.night_sky);
1912 lua_setfield(L, -2, "night_sky");
1913 push_ARGB8(L, skybox_params.sky_color.night_horizon);
1914 lua_setfield(L, -2, "night_horizon");
1915 push_ARGB8(L, skybox_params.sky_color.indoors);
1916 lua_setfield(L, -2, "indoors");
1918 push_ARGB8(L, skybox_params.fog_sun_tint);
1919 lua_setfield(L, -2, "fog_sun_tint");
1920 push_ARGB8(L, skybox_params.fog_moon_tint);
1921 lua_setfield(L, -2, "fog_moon_tint");
1922 lua_pushstring(L, skybox_params.fog_tint_type.c_str());
1923 lua_setfield(L, -2, "fog_tint_type");
1927 // set_sun(self, {visible, texture=, tonemap=, sunrise=, rotation=, scale=})
1928 int ObjectRef::l_set_sun(lua_State *L)
1930 NO_MAP_LOCK_REQUIRED;
1931 ObjectRef *ref = checkobject(L, 1);
1932 RemotePlayer *player = getplayer(ref);
1936 if (!lua_istable(L, 2))
1939 SunParams sun_params = player->getSunParams();
1941 sun_params.visible = getboolfield_default(L, 2,
1942 "visible", sun_params.visible);
1943 sun_params.texture = getstringfield_default(L, 2,
1944 "texture", sun_params.texture);
1945 sun_params.tonemap = getstringfield_default(L, 2,
1946 "tonemap", sun_params.tonemap);
1947 sun_params.sunrise = getstringfield_default(L, 2,
1948 "sunrise", sun_params.sunrise);
1949 sun_params.sunrise_visible = getboolfield_default(L, 2,
1950 "sunrise_visible", sun_params.sunrise_visible);
1951 sun_params.scale = getfloatfield_default(L, 2,
1952 "scale", sun_params.scale);
1954 getServer(L)->setSun(player, sun_params);
1955 lua_pushboolean(L, true);
1960 int ObjectRef::l_get_sun(lua_State *L)
1962 NO_MAP_LOCK_REQUIRED;
1963 ObjectRef *ref = checkobject(L, 1);
1964 RemotePlayer *player = getplayer(ref);
1967 const SunParams &sun_params = player->getSunParams();
1970 lua_pushboolean(L, sun_params.visible);
1971 lua_setfield(L, -2, "visible");
1972 lua_pushstring(L, sun_params.texture.c_str());
1973 lua_setfield(L, -2, "texture");
1974 lua_pushstring(L, sun_params.tonemap.c_str());
1975 lua_setfield(L, -2, "tonemap");
1976 lua_pushstring(L, sun_params.sunrise.c_str());
1977 lua_setfield(L, -2, "sunrise");
1978 lua_pushboolean(L, sun_params.sunrise_visible);
1979 lua_setfield(L, -2, "sunrise_visible");
1980 lua_pushnumber(L, sun_params.scale);
1981 lua_setfield(L, -2, "scale");
1986 // set_moon(self, {visible, texture=, tonemap=, sunrise=, rotation=, scale=})
1987 int ObjectRef::l_set_moon(lua_State *L)
1989 NO_MAP_LOCK_REQUIRED;
1990 ObjectRef *ref = checkobject(L, 1);
1991 RemotePlayer *player = getplayer(ref);
1994 if (!lua_istable(L, 2))
1997 MoonParams moon_params = player->getMoonParams();
1999 moon_params.visible = getboolfield_default(L, 2,
2000 "visible", moon_params.visible);
2001 moon_params.texture = getstringfield_default(L, 2,
2002 "texture", moon_params.texture);
2003 moon_params.tonemap = getstringfield_default(L, 2,
2004 "tonemap", moon_params.tonemap);
2005 moon_params.scale = getfloatfield_default(L, 2,
2006 "scale", moon_params.scale);
2008 getServer(L)->setMoon(player, moon_params);
2009 lua_pushboolean(L, true);
2014 int ObjectRef::l_get_moon(lua_State *L)
2016 NO_MAP_LOCK_REQUIRED;
2017 ObjectRef *ref = checkobject(L, 1);
2018 RemotePlayer *player = getplayer(ref);
2021 const MoonParams &moon_params = player->getMoonParams();
2024 lua_pushboolean(L, moon_params.visible);
2025 lua_setfield(L, -2, "visible");
2026 lua_pushstring(L, moon_params.texture.c_str());
2027 lua_setfield(L, -2, "texture");
2028 lua_pushstring(L, moon_params.tonemap.c_str());
2029 lua_setfield(L, -2, "tonemap");
2030 lua_pushnumber(L, moon_params.scale);
2031 lua_setfield(L, -2, "scale");
2036 // set_stars(self, {visible, count=, starcolor=, rotation=, scale=})
2037 int ObjectRef::l_set_stars(lua_State *L)
2039 NO_MAP_LOCK_REQUIRED;
2040 ObjectRef *ref = checkobject(L, 1);
2041 RemotePlayer *player = getplayer(ref);
2044 if (!lua_istable(L, 2))
2047 StarParams star_params = player->getStarParams();
2049 star_params.visible = getboolfield_default(L, 2,
2050 "visible", star_params.visible);
2051 star_params.count = getintfield_default(L, 2,
2052 "count", star_params.count);
2054 lua_getfield(L, 2, "star_color");
2055 if (!lua_isnil(L, -1))
2056 read_color(L, -1, &star_params.starcolor);
2059 star_params.scale = getfloatfield_default(L, 2,
2060 "scale", star_params.scale);
2062 getServer(L)->setStars(player, star_params);
2063 lua_pushboolean(L, true);
2068 int ObjectRef::l_get_stars(lua_State *L)
2070 NO_MAP_LOCK_REQUIRED;
2071 ObjectRef *ref = checkobject(L, 1);
2072 RemotePlayer *player = getplayer(ref);
2075 const StarParams &star_params = player->getStarParams();
2078 lua_pushboolean(L, star_params.visible);
2079 lua_setfield(L, -2, "visible");
2080 lua_pushnumber(L, star_params.count);
2081 lua_setfield(L, -2, "count");
2082 push_ARGB8(L, star_params.starcolor);
2083 lua_setfield(L, -2, "star_color");
2084 lua_pushnumber(L, star_params.scale);
2085 lua_setfield(L, -2, "scale");
2090 // set_clouds(self, {density=, color=, ambient=, height=, thickness=, speed=})
2091 int ObjectRef::l_set_clouds(lua_State *L)
2093 NO_MAP_LOCK_REQUIRED;
2094 ObjectRef *ref = checkobject(L, 1);
2095 RemotePlayer *player = getplayer(ref);
2098 if (!lua_istable(L, 2))
2101 CloudParams cloud_params = player->getCloudParams();
2103 cloud_params.density = getfloatfield_default(L, 2, "density", cloud_params.density);
2105 lua_getfield(L, 2, "color");
2106 if (!lua_isnil(L, -1))
2107 read_color(L, -1, &cloud_params.color_bright);
2109 lua_getfield(L, 2, "ambient");
2110 if (!lua_isnil(L, -1))
2111 read_color(L, -1, &cloud_params.color_ambient);
2114 cloud_params.height = getfloatfield_default(L, 2, "height", cloud_params.height );
2115 cloud_params.thickness = getfloatfield_default(L, 2, "thickness", cloud_params.thickness);
2117 lua_getfield(L, 2, "speed");
2118 if (lua_istable(L, -1)) {
2120 new_speed.X = getfloatfield_default(L, -1, "x", 0);
2121 new_speed.Y = getfloatfield_default(L, -1, "z", 0);
2122 cloud_params.speed = new_speed;
2126 getServer(L)->setClouds(player, cloud_params);
2127 lua_pushboolean(L, true);
2131 int ObjectRef::l_get_clouds(lua_State *L)
2133 NO_MAP_LOCK_REQUIRED;
2134 ObjectRef *ref = checkobject(L, 1);
2135 RemotePlayer *player = getplayer(ref);
2138 const CloudParams &cloud_params = player->getCloudParams();
2141 lua_pushnumber(L, cloud_params.density);
2142 lua_setfield(L, -2, "density");
2143 push_ARGB8(L, cloud_params.color_bright);
2144 lua_setfield(L, -2, "color");
2145 push_ARGB8(L, cloud_params.color_ambient);
2146 lua_setfield(L, -2, "ambient");
2147 lua_pushnumber(L, cloud_params.height);
2148 lua_setfield(L, -2, "height");
2149 lua_pushnumber(L, cloud_params.thickness);
2150 lua_setfield(L, -2, "thickness");
2152 lua_pushnumber(L, cloud_params.speed.X);
2153 lua_setfield(L, -2, "x");
2154 lua_pushnumber(L, cloud_params.speed.Y);
2155 lua_setfield(L, -2, "y");
2156 lua_setfield(L, -2, "speed");
2162 // override_day_night_ratio(self, brightness=0...1)
2163 int ObjectRef::l_override_day_night_ratio(lua_State *L)
2165 NO_MAP_LOCK_REQUIRED;
2166 ObjectRef *ref = checkobject(L, 1);
2167 RemotePlayer *player = getplayer(ref);
2171 bool do_override = false;
2173 if (!lua_isnil(L, 2)) {
2175 ratio = readParam<float>(L, 2);
2178 getServer(L)->overrideDayNightRatio(player, do_override, ratio);
2179 lua_pushboolean(L, true);
2183 // get_day_night_ratio(self)
2184 int ObjectRef::l_get_day_night_ratio(lua_State *L)
2186 NO_MAP_LOCK_REQUIRED;
2187 ObjectRef *ref = checkobject(L, 1);
2188 RemotePlayer *player = getplayer(ref);
2194 player->getDayNightRatio(&do_override, &ratio);
2197 lua_pushnumber(L, ratio);
2204 ObjectRef::ObjectRef(ServerActiveObject *object):
2207 //infostream<<"ObjectRef created for id="<<m_object->getId()<<std::endl;
2210 // Creates an ObjectRef and leaves it on top of stack
2211 // Not callable from Lua; all references are created on the C side.
2212 void ObjectRef::create(lua_State *L, ServerActiveObject *object)
2214 ObjectRef *o = new ObjectRef(object);
2215 //infostream<<"ObjectRef::create: o="<<o<<std::endl;
2216 *(void **)(lua_newuserdata(L, sizeof(void *))) = o;
2217 luaL_getmetatable(L, className);
2218 lua_setmetatable(L, -2);
2221 void ObjectRef::set_null(lua_State *L)
2223 ObjectRef *o = checkobject(L, -1);
2227 void ObjectRef::Register(lua_State *L)
2230 int methodtable = lua_gettop(L);
2231 luaL_newmetatable(L, className);
2232 int metatable = lua_gettop(L);
2234 lua_pushliteral(L, "__metatable");
2235 lua_pushvalue(L, methodtable);
2236 lua_settable(L, metatable); // hide metatable from Lua getmetatable()
2238 lua_pushliteral(L, "__index");
2239 lua_pushvalue(L, methodtable);
2240 lua_settable(L, metatable);
2242 lua_pushliteral(L, "__gc");
2243 lua_pushcfunction(L, gc_object);
2244 lua_settable(L, metatable);
2246 lua_pop(L, 1); // drop metatable
2248 markAliasDeprecated(methods);
2249 luaL_openlib(L, 0, methods, 0); // fill methodtable
2250 lua_pop(L, 1); // drop methodtable
2252 // Cannot be created from Lua
2253 //lua_register(L, className, create_object);
2256 const char ObjectRef::className[] = "ObjectRef";
2257 luaL_Reg ObjectRef::methods[] = {
2258 // ServerActiveObject
2259 luamethod(ObjectRef, remove),
2260 luamethod_aliased(ObjectRef, get_pos, getpos),
2261 luamethod_aliased(ObjectRef, set_pos, setpos),
2262 luamethod_aliased(ObjectRef, move_to, moveto),
2263 luamethod(ObjectRef, punch),
2264 luamethod(ObjectRef, right_click),
2265 luamethod(ObjectRef, set_hp),
2266 luamethod(ObjectRef, get_hp),
2267 luamethod(ObjectRef, get_inventory),
2268 luamethod(ObjectRef, get_wield_list),
2269 luamethod(ObjectRef, get_wield_index),
2270 luamethod(ObjectRef, get_wielded_item),
2271 luamethod(ObjectRef, set_wielded_item),
2272 luamethod(ObjectRef, set_armor_groups),
2273 luamethod(ObjectRef, get_armor_groups),
2274 luamethod(ObjectRef, set_animation),
2275 luamethod(ObjectRef, get_animation),
2276 luamethod(ObjectRef, set_animation_frame_speed),
2277 luamethod(ObjectRef, set_bone_position),
2278 luamethod(ObjectRef, get_bone_position),
2279 luamethod(ObjectRef, set_attach),
2280 luamethod(ObjectRef, get_attach),
2281 luamethod(ObjectRef, set_detach),
2282 luamethod(ObjectRef, set_properties),
2283 luamethod(ObjectRef, get_properties),
2284 luamethod(ObjectRef, set_nametag_attributes),
2285 luamethod(ObjectRef, get_nametag_attributes),
2286 // LuaEntitySAO-only
2287 luamethod_aliased(ObjectRef, set_velocity, setvelocity),
2288 luamethod(ObjectRef, add_velocity),
2289 luamethod_aliased(ObjectRef, get_velocity, getvelocity),
2290 luamethod_aliased(ObjectRef, set_acceleration, setacceleration),
2291 luamethod_aliased(ObjectRef, get_acceleration, getacceleration),
2292 luamethod_aliased(ObjectRef, set_yaw, setyaw),
2293 luamethod_aliased(ObjectRef, get_yaw, getyaw),
2294 luamethod(ObjectRef, set_rotation),
2295 luamethod(ObjectRef, get_rotation),
2296 luamethod_aliased(ObjectRef, set_texture_mod, settexturemod),
2297 luamethod_aliased(ObjectRef, set_sprite, setsprite),
2298 luamethod(ObjectRef, get_entity_name),
2299 luamethod(ObjectRef, get_luaentity),
2301 luamethod(ObjectRef, is_player),
2302 luamethod(ObjectRef, is_player_connected),
2303 luamethod(ObjectRef, get_player_name),
2304 luamethod(ObjectRef, get_player_velocity),
2305 luamethod(ObjectRef, add_player_velocity),
2306 luamethod(ObjectRef, get_look_dir),
2307 luamethod(ObjectRef, get_look_pitch),
2308 luamethod(ObjectRef, get_look_yaw),
2309 luamethod(ObjectRef, get_look_vertical),
2310 luamethod(ObjectRef, get_look_horizontal),
2311 luamethod(ObjectRef, set_look_horizontal),
2312 luamethod(ObjectRef, set_look_vertical),
2313 luamethod(ObjectRef, set_look_yaw),
2314 luamethod(ObjectRef, set_look_pitch),
2315 luamethod(ObjectRef, get_fov),
2316 luamethod(ObjectRef, set_fov),
2317 luamethod(ObjectRef, get_breath),
2318 luamethod(ObjectRef, set_breath),
2319 luamethod(ObjectRef, get_attribute),
2320 luamethod(ObjectRef, set_attribute),
2321 luamethod(ObjectRef, get_meta),
2322 luamethod(ObjectRef, set_inventory_formspec),
2323 luamethod(ObjectRef, get_inventory_formspec),
2324 luamethod(ObjectRef, set_formspec_prepend),
2325 luamethod(ObjectRef, get_formspec_prepend),
2326 luamethod(ObjectRef, get_player_control),
2327 luamethod(ObjectRef, get_player_control_bits),
2328 luamethod(ObjectRef, set_physics_override),
2329 luamethod(ObjectRef, get_physics_override),
2330 luamethod(ObjectRef, hud_add),
2331 luamethod(ObjectRef, hud_remove),
2332 luamethod(ObjectRef, hud_change),
2333 luamethod(ObjectRef, hud_get),
2334 luamethod(ObjectRef, hud_set_flags),
2335 luamethod(ObjectRef, hud_get_flags),
2336 luamethod(ObjectRef, hud_set_hotbar_itemcount),
2337 luamethod(ObjectRef, hud_get_hotbar_itemcount),
2338 luamethod(ObjectRef, hud_set_hotbar_image),
2339 luamethod(ObjectRef, hud_get_hotbar_image),
2340 luamethod(ObjectRef, hud_set_hotbar_selected_image),
2341 luamethod(ObjectRef, hud_get_hotbar_selected_image),
2342 luamethod(ObjectRef, set_sky),
2343 luamethod(ObjectRef, get_sky),
2344 luamethod(ObjectRef, get_sky_color),
2345 luamethod(ObjectRef, set_sun),
2346 luamethod(ObjectRef, get_sun),
2347 luamethod(ObjectRef, set_moon),
2348 luamethod(ObjectRef, get_moon),
2349 luamethod(ObjectRef, set_stars),
2350 luamethod(ObjectRef, get_stars),
2351 luamethod(ObjectRef, set_clouds),
2352 luamethod(ObjectRef, get_clouds),
2353 luamethod(ObjectRef, override_day_night_ratio),
2354 luamethod(ObjectRef, get_day_night_ratio),
2355 luamethod(ObjectRef, set_local_animation),
2356 luamethod(ObjectRef, get_local_animation),
2357 luamethod(ObjectRef, set_eye_offset),
2358 luamethod(ObjectRef, get_eye_offset),
2359 luamethod(ObjectRef, send_mapblock),