aboutsummaryrefslogtreecommitdiff
path: root/src/scriptapi_object.cpp
diff options
context:
space:
mode:
authorsapier <Sapier at GMX dot net>2013-05-25 00:51:02 +0200
committerKahrl <kahrl@gmx.net>2013-05-25 00:51:02 +0200
commitab433775777c4f5055bcf4d2a1cffc506c4f9961 (patch)
tree9f80c74c95cbb1efa15c0c36df8d5e35235e5554 /src/scriptapi_object.cpp
parent865f380c91ced850d1a499c91aa2ab5489624802 (diff)
downloadminetest-ab433775777c4f5055bcf4d2a1cffc506c4f9961.tar.gz
minetest-ab433775777c4f5055bcf4d2a1cffc506c4f9961.tar.bz2
minetest-ab433775777c4f5055bcf4d2a1cffc506c4f9961.zip
Move scriptapi to separate folder (by sapier)
On the lua side, notably minetest.env:<function>(<args>) should now be replaced by minetest.<function>(<args>). The old way is and will stay supported for a long time. Also: Update and clean up lua_api.txt (by celeron55) Move EnvRef to lua and remove add_rat and add_firefly (by kahrl) Add separate src/util/CMakeLists.txt, other minor fixes (by kahrl)
Diffstat (limited to 'src/scriptapi_object.cpp')
-rw-r--r--src/scriptapi_object.cpp1218
1 files changed, 0 insertions, 1218 deletions
diff --git a/src/scriptapi_object.cpp b/src/scriptapi_object.cpp
deleted file mode 100644
index 851f1761f..000000000
--- a/src/scriptapi_object.cpp
+++ /dev/null
@@ -1,1218 +0,0 @@
-/*
-Minetest
-Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 2.1 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public License along
-with this program; if not, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-
-#include "scriptapi.h"
-#include "scriptapi_object.h"
-#include "log.h"
-#include "tool.h"
-#include "scriptapi_types.h"
-#include "scriptapi_inventory.h"
-#include "scriptapi_item.h"
-#include "scriptapi_entity.h"
-#include "scriptapi_common.h"
-#include "hud.h"
-
-
-struct EnumString es_HudElementType[] =
-{
- {HUD_ELEM_IMAGE, "image"},
- {HUD_ELEM_TEXT, "text"},
- {HUD_ELEM_STATBAR, "statbar"},
- {HUD_ELEM_INVENTORY, "inventory"},
- {0, NULL},
-};
-
-struct EnumString es_HudElementStat[] =
-{
- {HUD_STAT_POS, "pos"},
- {HUD_STAT_NAME, "name"},
- {HUD_STAT_SCALE, "scale"},
- {HUD_STAT_TEXT, "text"},
- {HUD_STAT_NUMBER, "number"},
- {HUD_STAT_ITEM, "item"},
- {HUD_STAT_DIR, "direction"},
- {HUD_STAT_ALIGN, "alignment"},
- {HUD_STAT_OFFSET, "offset"},
- {0, NULL},
-};
-
-struct EnumString es_HudBuiltinElement[] =
-{
- {HUD_FLAG_HOTBAR_VISIBLE, "hotbar"},
- {HUD_FLAG_HEALTHBAR_VISIBLE, "healthbar"},
- {HUD_FLAG_CROSSHAIR_VISIBLE, "crosshair"},
- {HUD_FLAG_WIELDITEM_VISIBLE, "wielditem"},
- {0, NULL},
-};
-
-
-/*
- ObjectRef
-*/
-
-
-ObjectRef* ObjectRef::checkobject(lua_State *L, int narg)
-{
- luaL_checktype(L, narg, LUA_TUSERDATA);
- void *ud = luaL_checkudata(L, narg, className);
- if(!ud) luaL_typerror(L, narg, className);
- return *(ObjectRef**)ud; // unbox pointer
-}
-
-ServerActiveObject* ObjectRef::getobject(ObjectRef *ref)
-{
- ServerActiveObject *co = ref->m_object;
- return co;
-}
-
-LuaEntitySAO* ObjectRef::getluaobject(ObjectRef *ref)
-{
- ServerActiveObject *obj = getobject(ref);
- if(obj == NULL)
- return NULL;
- if(obj->getType() != ACTIVEOBJECT_TYPE_LUAENTITY)
- return NULL;
- return (LuaEntitySAO*)obj;
-}
-
-PlayerSAO* ObjectRef::getplayersao(ObjectRef *ref)
-{
- ServerActiveObject *obj = getobject(ref);
- if(obj == NULL)
- return NULL;
- if(obj->getType() != ACTIVEOBJECT_TYPE_PLAYER)
- return NULL;
- return (PlayerSAO*)obj;
-}
-
-Player* ObjectRef::getplayer(ObjectRef *ref)
-{
- PlayerSAO *playersao = getplayersao(ref);
- if(playersao == NULL)
- return NULL;
- return playersao->getPlayer();
-}
-
-// Exported functions
-
-// garbage collector
-int ObjectRef::gc_object(lua_State *L) {
- ObjectRef *o = *(ObjectRef **)(lua_touserdata(L, 1));
- //infostream<<"ObjectRef::gc_object: o="<<o<<std::endl;
- delete o;
- return 0;
-}
-
-// remove(self)
-int ObjectRef::l_remove(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- ServerActiveObject *co = getobject(ref);
- if(co == NULL) return 0;
- verbosestream<<"ObjectRef::l_remove(): id="<<co->getId()<<std::endl;
- co->m_removed = true;
- return 0;
-}
-
-// getpos(self)
-// returns: {x=num, y=num, z=num}
-int ObjectRef::l_getpos(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- ServerActiveObject *co = getobject(ref);
- if(co == NULL) return 0;
- v3f pos = co->getBasePosition() / BS;
- lua_newtable(L);
- lua_pushnumber(L, pos.X);
- lua_setfield(L, -2, "x");
- lua_pushnumber(L, pos.Y);
- lua_setfield(L, -2, "y");
- lua_pushnumber(L, pos.Z);
- lua_setfield(L, -2, "z");
- return 1;
-}
-
-// setpos(self, pos)
-int ObjectRef::l_setpos(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- //LuaEntitySAO *co = getluaobject(ref);
- ServerActiveObject *co = getobject(ref);
- if(co == NULL) return 0;
- // pos
- v3f pos = checkFloatPos(L, 2);
- // Do it
- co->setPos(pos);
- return 0;
-}
-
-// moveto(self, pos, continuous=false)
-int ObjectRef::l_moveto(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- //LuaEntitySAO *co = getluaobject(ref);
- ServerActiveObject *co = getobject(ref);
- if(co == NULL) return 0;
- // pos
- v3f pos = checkFloatPos(L, 2);
- // continuous
- bool continuous = lua_toboolean(L, 3);
- // Do it
- co->moveTo(pos, continuous);
- return 0;
-}
-
-// punch(self, puncher, time_from_last_punch, tool_capabilities, dir)
-int ObjectRef::l_punch(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- ServerActiveObject *co = getobject(ref);
- if(co == NULL) return 0;
-
- ServerActiveObject *puncher = 0;
- v3f dir(0,0,0);
-
- if (!lua_isnil(L,2)) {
- ObjectRef *puncher_ref = checkobject(L, 2);
- puncher = getobject(puncher_ref);
- if(puncher == NULL) return 0;
-
- dir = co->getBasePosition() - puncher->getBasePosition();
- }
-
- float time_from_last_punch = 1000000;
- if(lua_isnumber(L, 3))
- time_from_last_punch = lua_tonumber(L, 3);
-
- ToolCapabilities toolcap = read_tool_capabilities(L, 4);
-
- if(lua_type(L, 5) == LUA_TTABLE)
- dir = read_v3f(L, 5);
- dir.normalize();
-
- // Do it
- co->punch(dir, &toolcap, puncher, time_from_last_punch);
- return 0;
-}
-
-// right_click(self, clicker); clicker = an another ObjectRef
-int ObjectRef::l_right_click(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- ObjectRef *ref2 = checkobject(L, 2);
- ServerActiveObject *co = getobject(ref);
- ServerActiveObject *co2 = getobject(ref2);
- if(co == NULL) return 0;
- if(co2 == NULL) return 0;
- // Do it
- co->rightClick(co2);
- return 0;
-}
-
-// set_hp(self, hp)
-// hp = number of hitpoints (2 * number of hearts)
-// returns: nil
-int ObjectRef::l_set_hp(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- luaL_checknumber(L, 2);
- ServerActiveObject *co = getobject(ref);
- if(co == NULL) return 0;
- int hp = lua_tonumber(L, 2);
- /*infostream<<"ObjectRef::l_set_hp(): id="<<co->getId()
- <<" hp="<<hp<<std::endl;*/
- // Do it
- co->setHP(hp);
- // Return
- return 0;
-}
-
-// get_hp(self)
-// returns: number of hitpoints (2 * number of hearts)
-// 0 if not applicable to this type of object
-int ObjectRef::l_get_hp(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- ServerActiveObject *co = getobject(ref);
- if(co == NULL){
- // Default hp is 1
- lua_pushnumber(L, 1);
- return 1;
- }
- int hp = co->getHP();
- /*infostream<<"ObjectRef::l_get_hp(): id="<<co->getId()
- <<" hp="<<hp<<std::endl;*/
- // Return
- lua_pushnumber(L, hp);
- return 1;
-}
-
-// get_inventory(self)
-int ObjectRef::l_get_inventory(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- ServerActiveObject *co = getobject(ref);
- if(co == NULL) return 0;
- // Do it
- InventoryLocation loc = co->getInventoryLocation();
- if(get_server(L)->getInventory(loc) != NULL)
- InvRef::create(L, loc);
- else
- lua_pushnil(L); // An object may have no inventory (nil)
- return 1;
-}
-
-// get_wield_list(self)
-int ObjectRef::l_get_wield_list(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- ServerActiveObject *co = getobject(ref);
- if(co == NULL) return 0;
- // Do it
- lua_pushstring(L, co->getWieldList().c_str());
- return 1;
-}
-
-// get_wield_index(self)
-int ObjectRef::l_get_wield_index(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- ServerActiveObject *co = getobject(ref);
- if(co == NULL) return 0;
- // Do it
- lua_pushinteger(L, co->getWieldIndex() + 1);
- return 1;
-}
-
-// get_wielded_item(self)
-int ObjectRef::l_get_wielded_item(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- ServerActiveObject *co = getobject(ref);
- if(co == NULL){
- // Empty ItemStack
- LuaItemStack::create(L, ItemStack());
- return 1;
- }
- // Do it
- LuaItemStack::create(L, co->getWieldedItem());
- return 1;
-}
-
-// set_wielded_item(self, itemstack or itemstring or table or nil)
-int ObjectRef::l_set_wielded_item(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- ServerActiveObject *co = getobject(ref);
- if(co == NULL) return 0;
- // Do it
- ItemStack item = read_item(L, 2);
- bool success = co->setWieldedItem(item);
- lua_pushboolean(L, success);
- return 1;
-}
-
-// set_armor_groups(self, groups)
-int ObjectRef::l_set_armor_groups(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- ServerActiveObject *co = getobject(ref);
- if(co == NULL) return 0;
- // Do it
- ItemGroupList groups;
- read_groups(L, 2, groups);
- co->setArmorGroups(groups);
- return 0;
-}
-
-// set_physics_override(self, physics_override_speed, physics_override_jump, physics_override_gravity)
-int ObjectRef::l_set_physics_override(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- PlayerSAO *co = (PlayerSAO *) getobject(ref);
- if(co == NULL) return 0;
- // Do it
- if(!lua_isnil(L, 2)){
- co->m_physics_override_speed = lua_tonumber(L, 2);
- co->m_physics_override_sent = false;
- }
- if(!lua_isnil(L, 3)){
- co->m_physics_override_jump = lua_tonumber(L, 3);
- co->m_physics_override_sent = false;
- }
- if(!lua_isnil(L, 4)){
- co->m_physics_override_gravity = lua_tonumber(L, 4);
- co->m_physics_override_sent = false;
- }
- return 0;
-}
-
-// set_animation(self, frame_range, frame_speed, frame_blend)
-int ObjectRef::l_set_animation(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- ServerActiveObject *co = getobject(ref);
- if(co == NULL) return 0;
- // Do it
- v2f frames = v2f(1, 1);
- if(!lua_isnil(L, 2))
- frames = read_v2f(L, 2);
- float frame_speed = 15;
- if(!lua_isnil(L, 3))
- frame_speed = lua_tonumber(L, 3);
- float frame_blend = 0;
- if(!lua_isnil(L, 4))
- frame_blend = lua_tonumber(L, 4);
- co->setAnimation(frames, frame_speed, frame_blend);
- return 0;
-}
-
-// set_bone_position(self, std::string bone, v3f position, v3f rotation)
-int ObjectRef::l_set_bone_position(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- ServerActiveObject *co = getobject(ref);
- if(co == NULL) return 0;
- // Do it
- std::string bone = "";
- if(!lua_isnil(L, 2))
- bone = lua_tostring(L, 2);
- v3f position = v3f(0, 0, 0);
- if(!lua_isnil(L, 3))
- position = read_v3f(L, 3);
- v3f rotation = v3f(0, 0, 0);
- if(!lua_isnil(L, 4))
- rotation = read_v3f(L, 4);
- co->setBonePosition(bone, position, rotation);
- return 0;
-}
-
-// set_attach(self, parent, bone, position, rotation)
-int ObjectRef::l_set_attach(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- ObjectRef *parent_ref = checkobject(L, 2);
- ServerActiveObject *co = getobject(ref);
- ServerActiveObject *parent = getobject(parent_ref);
- if(co == NULL) return 0;
- if(parent == NULL) return 0;
- // Do it
- std::string bone = "";
- if(!lua_isnil(L, 3))
- bone = lua_tostring(L, 3);
- v3f position = v3f(0, 0, 0);
- if(!lua_isnil(L, 4))
- position = read_v3f(L, 4);
- v3f rotation = v3f(0, 0, 0);
- if(!lua_isnil(L, 5))
- rotation = read_v3f(L, 5);
- co->setAttachment(parent->getId(), bone, position, rotation);
- return 0;
-}
-
-// set_detach(self)
-int ObjectRef::l_set_detach(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- ServerActiveObject *co = getobject(ref);
- if(co == NULL) return 0;
- // Do it
- co->setAttachment(0, "", v3f(0,0,0), v3f(0,0,0));
- return 0;
-}
-
-// set_properties(self, properties)
-int ObjectRef::l_set_properties(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- ServerActiveObject *co = getobject(ref);
- if(co == NULL) return 0;
- ObjectProperties *prop = co->accessObjectProperties();
- if(!prop)
- return 0;
- read_object_properties(L, 2, prop);
- co->notifyObjectPropertiesModified();
- return 0;
-}
-
-/* LuaEntitySAO-only */
-
-// setvelocity(self, {x=num, y=num, z=num})
-int ObjectRef::l_setvelocity(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- LuaEntitySAO *co = getluaobject(ref);
- if(co == NULL) return 0;
- v3f pos = checkFloatPos(L, 2);
- // Do it
- co->setVelocity(pos);
- return 0;
-}
-
-// getvelocity(self)
-int ObjectRef::l_getvelocity(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- LuaEntitySAO *co = getluaobject(ref);
- if(co == NULL) return 0;
- // Do it
- v3f v = co->getVelocity();
- pushFloatPos(L, v);
- return 1;
-}
-
-// setacceleration(self, {x=num, y=num, z=num})
-int ObjectRef::l_setacceleration(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- LuaEntitySAO *co = getluaobject(ref);
- if(co == NULL) return 0;
- // pos
- v3f pos = checkFloatPos(L, 2);
- // Do it
- co->setAcceleration(pos);
- return 0;
-}
-
-// getacceleration(self)
-int ObjectRef::l_getacceleration(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- LuaEntitySAO *co = getluaobject(ref);
- if(co == NULL) return 0;
- // Do it
- v3f v = co->getAcceleration();
- pushFloatPos(L, v);
- return 1;
-}
-
-// setyaw(self, radians)
-int ObjectRef::l_setyaw(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- LuaEntitySAO *co = getluaobject(ref);
- if(co == NULL) return 0;
- float yaw = luaL_checknumber(L, 2) * core::RADTODEG;
- // Do it
- co->setYaw(yaw);
- return 0;
-}
-
-// getyaw(self)
-int ObjectRef::l_getyaw(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- LuaEntitySAO *co = getluaobject(ref);
- if(co == NULL) return 0;
- // Do it
- float yaw = co->getYaw() * core::DEGTORAD;
- lua_pushnumber(L, yaw);
- return 1;
-}
-
-// settexturemod(self, mod)
-int ObjectRef::l_settexturemod(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- LuaEntitySAO *co = getluaobject(ref);
- if(co == NULL) return 0;
- // Do it
- std::string mod = luaL_checkstring(L, 2);
- co->setTextureMod(mod);
- return 0;
-}
-
-// setsprite(self, p={x=0,y=0}, num_frames=1, framelength=0.2,
-// select_horiz_by_yawpitch=false)
-int ObjectRef::l_setsprite(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- LuaEntitySAO *co = getluaobject(ref);
- if(co == NULL) return 0;
- // Do it
- v2s16 p(0,0);
- if(!lua_isnil(L, 2))
- p = read_v2s16(L, 2);
- int num_frames = 1;
- if(!lua_isnil(L, 3))
- num_frames = lua_tonumber(L, 3);
- float framelength = 0.2;
- if(!lua_isnil(L, 4))
- framelength = lua_tonumber(L, 4);
- bool select_horiz_by_yawpitch = false;
- if(!lua_isnil(L, 5))
- select_horiz_by_yawpitch = lua_toboolean(L, 5);
- co->setSprite(p, num_frames, framelength, select_horiz_by_yawpitch);
- return 0;
-}
-
-// DEPRECATED
-// get_entity_name(self)
-int ObjectRef::l_get_entity_name(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- LuaEntitySAO *co = getluaobject(ref);
- if(co == NULL) return 0;
- // Do it
- std::string name = co->getName();
- lua_pushstring(L, name.c_str());
- return 1;
-}
-
-// get_luaentity(self)
-int ObjectRef::l_get_luaentity(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- LuaEntitySAO *co = getluaobject(ref);
- if(co == NULL) return 0;
- // Do it
- luaentity_get(L, co->getId());
- return 1;
-}
-
-/* Player-only */
-
-// is_player(self)
-int ObjectRef::l_is_player(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
- lua_pushboolean(L, (player != NULL));
- return 1;
-}
-
-// get_player_name(self)
-int ObjectRef::l_get_player_name(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
- if(player == NULL){
- lua_pushlstring(L, "", 0);
- return 1;
- }
- // Do it
- lua_pushstring(L, player->getName());
- return 1;
-}
-
-// get_look_dir(self)
-int ObjectRef::l_get_look_dir(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
- if(player == NULL) return 0;
- // Do it
- float pitch = player->getRadPitch();
- float yaw = player->getRadYaw();
- v3f v(cos(pitch)*cos(yaw), sin(pitch), cos(pitch)*sin(yaw));
- push_v3f(L, v);
- return 1;
-}
-
-// get_look_pitch(self)
-int ObjectRef::l_get_look_pitch(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
- if(player == NULL) return 0;
- // Do it
- lua_pushnumber(L, player->getRadPitch());
- return 1;
-}
-
-// get_look_yaw(self)
-int ObjectRef::l_get_look_yaw(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
- if(player == NULL) return 0;
- // Do it
- lua_pushnumber(L, player->getRadYaw());
- return 1;
-}
-
-// set_look_pitch(self, radians)
-int ObjectRef::l_set_look_pitch(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- PlayerSAO* co = getplayersao(ref);
- if(co == NULL) return 0;
- float pitch = luaL_checknumber(L, 2) * core::RADTODEG;
- // Do it
- co->setPitch(pitch);
- return 1;
-}
-
-// set_look_yaw(self, radians)
-int ObjectRef::l_set_look_yaw(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- PlayerSAO* co = getplayersao(ref);
- if(co == NULL) return 0;
- float yaw = luaL_checknumber(L, 2) * core::RADTODEG;
- // Do it
- co->setYaw(yaw);
- return 1;
-}
-
-// set_inventory_formspec(self, formspec)
-int ObjectRef::l_set_inventory_formspec(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
- if(player == NULL) return 0;
- std::string formspec = luaL_checkstring(L, 2);
-
- player->inventory_formspec = formspec;
- get_server(L)->reportInventoryFormspecModified(player->getName());
- lua_pushboolean(L, true);
- return 1;
-}
-
-// get_inventory_formspec(self) -> formspec
-int ObjectRef::l_get_inventory_formspec(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
- if(player == NULL) return 0;
-
- std::string formspec = player->inventory_formspec;
- lua_pushlstring(L, formspec.c_str(), formspec.size());
- return 1;
-}
-
-// get_player_control(self)
-int ObjectRef::l_get_player_control(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
- if(player == NULL){
- lua_pushlstring(L, "", 0);
- return 1;
- }
- // Do it
- PlayerControl control = player->getPlayerControl();
- lua_newtable(L);
- lua_pushboolean(L, control.up);
- lua_setfield(L, -2, "up");
- lua_pushboolean(L, control.down);
- lua_setfield(L, -2, "down");
- lua_pushboolean(L, control.left);
- lua_setfield(L, -2, "left");
- lua_pushboolean(L, control.right);
- lua_setfield(L, -2, "right");
- lua_pushboolean(L, control.jump);
- lua_setfield(L, -2, "jump");
- lua_pushboolean(L, control.aux1);
- lua_setfield(L, -2, "aux1");
- lua_pushboolean(L, control.sneak);
- lua_setfield(L, -2, "sneak");
- lua_pushboolean(L, control.LMB);
- lua_setfield(L, -2, "LMB");
- lua_pushboolean(L, control.RMB);
- lua_setfield(L, -2, "RMB");
- return 1;
-}
-
-// get_player_control_bits(self)
-int ObjectRef::l_get_player_control_bits(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
- if(player == NULL){
- lua_pushlstring(L, "", 0);
- return 1;
- }
- // Do it
- lua_pushnumber(L, player->keyPressed);
- return 1;
-}
-
-// hud_add(self, form)
-int ObjectRef::l_hud_add(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
- if (player == NULL)
- return 0;
-
- HudElement *elem = new HudElement;
-
- elem->type = (HudElementType)getenumfield(L, 2, "hud_elem_type",
- es_HudElementType, HUD_ELEM_TEXT);
-
- lua_getfield(L, 2, "position");
- elem->pos = lua_istable(L, -1) ? read_v2f(L, -1) : v2f();
- lua_pop(L, 1);
-
- lua_getfield(L, 2, "scale");
- elem->scale = lua_istable(L, -1) ? read_v2f(L, -1) : v2f();
- lua_pop(L, 1);
-
- elem->name = getstringfield_default(L, 2, "name", "");
- elem->text = getstringfield_default(L, 2, "text", "");
- elem->number = getintfield_default(L, 2, "number", 0);
- elem->item = getintfield_default(L, 2, "item", 0);
- elem->dir = getintfield_default(L, 2, "direction", 0);
-
- lua_getfield(L, 2, "alignment");
- elem->align = lua_istable(L, -1) ? read_v2f(L, -1) : v2f();
- lua_pop(L, 1);
-
- lua_getfield(L, 2, "offset");
- elem->offset = lua_istable(L, -1) ? read_v2f(L, -1) : v2f();
- lua_pop(L, 1);
-
- u32 id = get_server(L)->hudAdd(player, elem);
- if (id == (u32)-1) {
- delete elem;
- return 0;
- }
-
- lua_pushnumber(L, id);
- return 1;
-}
-
-// hud_remove(self, id)
-int ObjectRef::l_hud_remove(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
- if (player == NULL)
- return 0;
-
- u32 id = -1;
- if (!lua_isnil(L, 2))
- id = lua_tonumber(L, 2);
-
- if (!get_server(L)->hudRemove(player, id))
- return 0;
-
- lua_pushboolean(L, true);
- return 1;
-}
-
-// hud_change(self, id, stat, data)
-int ObjectRef::l_hud_change(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
- if (player == NULL)
- return 0;
-
- u32 id = !lua_isnil(L, 2) ? lua_tonumber(L, 2) : -1;
- if (id >= player->hud.size())
- return 0;
-
- HudElementStat stat = HUD_STAT_NUMBER;
- if (!lua_isnil(L, 3)) {
- int statint;
- std::string statstr = lua_tostring(L, 3);
- stat = string_to_enum(es_HudElementStat, statint, statstr) ?
- (HudElementStat)statint : HUD_STAT_NUMBER;
- }
-
- void *value = NULL;
- HudElement *e = player->hud[id];
- if (!e)
- return 0;
-
- switch (stat) {
- case HUD_STAT_POS:
- e->pos = read_v2f(L, 4);
- value = &e->pos;
- break;
- case HUD_STAT_NAME:
- e->name = lua_tostring(L, 4);
- value = &e->name;
- break;
- case HUD_STAT_SCALE:
- e->scale = read_v2f(L, 4);
- value = &e->scale;
- break;
- case HUD_STAT_TEXT:
- e->text = lua_tostring(L, 4);
- value = &e->text;
- break;
- case HUD_STAT_NUMBER:
- e->number = lua_tonumber(L, 4);
- value = &e->number;
- break;
- case HUD_STAT_ITEM:
- e->item = lua_tonumber(L, 4);
- value = &e->item;
- break;
- case HUD_STAT_DIR:
- e->dir = lua_tonumber(L, 4);
- value = &e->dir;
- case HUD_STAT_ALIGN:
- e->align = read_v2f(L, 4);
- value = &e->align;
- case HUD_STAT_OFFSET:
- e->offset = read_v2f(L, 4);
- value = &e->offset;
- }
-
- get_server(L)->hudChange(player, id, stat, value);
-
- lua_pushboolean(L, true);
- return 1;
-}
-
-// hud_get(self, id)
-int ObjectRef::l_hud_get(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
- if (player == NULL)
- return 0;
-
- u32 id = lua_tonumber(L, -1);
- if (id >= player->hud.size())
- return 0;
-
- HudElement *e = player->hud[id];
- if (!e)
- return 0;
-
- lua_newtable(L);
-
- lua_pushstring(L, es_HudElementType[(u8)e->type].str);
- lua_setfield(L, -2, "type");
-
- push_v2f(L, e->pos);
- lua_setfield(L, -2, "position");
-
- lua_pushstring(L, e->name.c_str());
- lua_setfield(L, -2, "name");
-
- push_v2f(L, e->scale);
- lua_setfield(L, -2, "scale");
-
- lua_pushstring(L, e->text.c_str());
- lua_setfield(L, -2, "text");
-
- lua_pushnumber(L, e->number);
- lua_setfield(L, -2, "number");
-
- lua_pushnumber(L, e->item);
- lua_setfield(L, -2, "item");
-
- lua_pushnumber(L, e->dir);
- lua_setfield(L, -2, "dir");
-
- return 1;
-}
-
-// hud_set_flags(self, flags)
-int ObjectRef::l_hud_set_flags(lua_State *L)
-{
- ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
- if (player == NULL)
- return 0;
-
- u32 flags = 0;
- u32 mask = 0;
- bool flag;
-
- const EnumString *esp = es_HudBuiltinElement;
- for (int i = 0; esp[i].str; i++) {
- if (getboolfield(L, 2, esp[i].str, flag)) {
- flags |= esp[i].num * flag;
- mask |= esp[i].num;
- }
- }
- if (!get_server(L)->hudSetFlags(player, flags, mask))
- return 0;
-
- lua_pushboolean(L, true);
- return 1;
-}
-
-ObjectRef::ObjectRef(ServerActiveObject *object):
- m_object(object)
-{
- //infostream<<"ObjectRef created for id="<<m_object->getId()<<std::endl;
-}
-
-ObjectRef::~ObjectRef()
-{
- /*if(m_object)
- infostream<<"ObjectRef destructing for id="
- <<m_object->getId()<<std::endl;
- else
- infostream<<"ObjectRef destructing for id=unknown"<<std::endl;*/
-}
-
-// Creates an ObjectRef and leaves it on top of stack
-// Not callable from Lua; all references are created on the C side.
-void ObjectRef::create(lua_State *L, ServerActiveObject *object)
-{
- ObjectRef *o = new ObjectRef(object);
- //infostream<<"ObjectRef::create: o="<<o<<std::endl;
- *(void **)(lua_newuserdata(L, sizeof(void *))) = o;
- luaL_getmetatable(L, className);
- lua_setmetatable(L, -2);
-}
-
-void ObjectRef::set_null(lua_State *L)
-{
- ObjectRef *o = checkobject(L, -1);
- o->m_object = NULL;
-}
-
-void ObjectRef::Register(lua_State *L)
-{
- lua_newtable(L);
- int methodtable = lua_gettop(L);
- luaL_newmetatable(L, className);
- int metatable = lua_gettop(L);
-
- lua_pushliteral(L, "__metatable");
- lua_pushvalue(L, methodtable);
- lua_settable(L, metatable); // hide metatable from Lua getmetatable()
-
- lua_pushliteral(L, "__index");
- lua_pushvalue(L, methodtable);
- lua_settable(L, metatable);
-
- lua_pushliteral(L, "__gc");
- lua_pushcfunction(L, gc_object);
- lua_settable(L, metatable);
-
- lua_pop(L, 1); // drop metatable
-
- luaL_openlib(L, 0, methods, 0); // fill methodtable
- lua_pop(L, 1); // drop methodtable
-
- // Cannot be created from Lua
- //lua_register(L, className, create_object);
-}
-
-const char ObjectRef::className[] = "ObjectRef";
-const luaL_reg ObjectRef::methods[] = {
- // ServerActiveObject
- luamethod(ObjectRef, remove),
- luamethod(ObjectRef, getpos),
- luamethod(ObjectRef, setpos),
- luamethod(ObjectRef, moveto),
- luamethod(ObjectRef, punch),
- luamethod(ObjectRef, right_click),
- luamethod(ObjectRef, set_hp),
- luamethod(ObjectRef, get_hp),
- luamethod(ObjectRef, get_inventory),
- luamethod(ObjectRef, get_wield_list),
- luamethod(ObjectRef, get_wield_index),
- luamethod(ObjectRef, get_wielded_item),
- luamethod(ObjectRef, set_wielded_item),
- luamethod(ObjectRef, set_armor_groups),
- luamethod(ObjectRef, set_physics_override),
- luamethod(ObjectRef, set_animation),
- luamethod(ObjectRef, set_bone_position),
- luamethod(ObjectRef, set_attach),
- luamethod(ObjectRef, set_detach),
- luamethod(ObjectRef, set_properties),
- // LuaEntitySAO-only
- luamethod(ObjectRef, setvelocity),
- luamethod(ObjectRef, getvelocity),
- luamethod(ObjectRef, setacceleration),
- luamethod(ObjectRef, getacceleration),
- luamethod(ObjectRef, setyaw),
- luamethod(ObjectRef, getyaw),
- luamethod(ObjectRef, settexturemod),
- luamethod(ObjectRef, setsprite),
- luamethod(ObjectRef, get_entity_name),
- luamethod(ObjectRef, get_luaentity),
- // Player-only
- luamethod(ObjectRef, is_player),
- luamethod(ObjectRef, get_player_name),
- luamethod(ObjectRef, get_look_dir),
- luamethod(ObjectRef, get_look_pitch),
- luamethod(ObjectRef, get_look_yaw),
- luamethod(ObjectRef, set_look_yaw),
- luamethod(ObjectRef, set_look_pitch),
- luamethod(ObjectRef, set_inventory_formspec),
- luamethod(ObjectRef, get_inventory_formspec),
- luamethod(ObjectRef, get_player_control),
- luamethod(ObjectRef, get_player_control_bits),
- luamethod(ObjectRef, hud_add),
- luamethod(ObjectRef, hud_remove),
- luamethod(ObjectRef, hud_change),
- luamethod(ObjectRef, hud_get),
- luamethod(ObjectRef, hud_set_flags),
- {0,0}
-};
-
-// Creates a new anonymous reference if cobj=NULL or id=0
-void objectref_get_or_create(lua_State *L,
- ServerActiveObject *cobj)
-{
- if(cobj == NULL || cobj->getId() == 0){
- ObjectRef::create(L, cobj);
- } else {
- objectref_get(L, cobj->getId());
- }
-}
-
-void objectref_get(lua_State *L, u16 id)
-{
- // Get minetest.object_refs[i]
- lua_getglobal(L, "minetest");
- lua_getfield(L, -1, "object_refs");
- luaL_checktype(L, -1, LUA_TTABLE);
- lua_pushnumber(L, id);
- lua_gettable(L, -2);
- lua_remove(L, -2); // object_refs
- lua_remove(L, -2); // minetest
-}
-
-/*
- ObjectProperties
-*/
-
-void read_object_properties(lua_State *L, int index,
- ObjectProperties *prop)
-{
- if(index < 0)
- index = lua_gettop(L) + 1 + index;
- if(!lua_istable(L, index))
- return;
-
- prop->hp_max = getintfield_default(L, -1, "hp_max", 10);
-
- getboolfield(L, -1, "physical", prop->physical);
-
- getfloatfield(L, -1, "weight", prop->weight);
-
- lua_getfield(L, -1, "collisionbox");
- if(lua_istable(L, -1))
- prop->collisionbox = read_aabb3f(L, -1, 1.0);
- lua_pop(L, 1);
-
- getstringfield(L, -1, "visual", prop->visual);
-
- getstringfield(L, -1, "mesh", prop->mesh);
-
- lua_getfield(L, -1, "visual_size");
- if(lua_istable(L, -1))
- prop->visual_size = read_v2f(L, -1);
- lua_pop(L, 1);
-
- lua_getfield(L, -1, "textures");
- if(lua_istable(L, -1)){
- prop->textures.clear();
- int table = lua_gettop(L);
- lua_pushnil(L);
- while(lua_next(L, table) != 0){
- // key at index -2 and value at index -1
- if(lua_isstring(L, -1))
- prop->textures.push_back(lua_tostring(L, -1));
- else
- prop->textures.push_back("");
- // removes value, keeps key for next iteration
- lua_pop(L, 1);
- }
- }
- lua_pop(L, 1);
-
- lua_getfield(L, -1, "colors");
- if(lua_istable(L, -1)){
- prop->colors.clear();
- int table = lua_gettop(L);
- lua_pushnil(L);
- while(lua_next(L, table) != 0){
- // key at index -2 and value at index -1
- if(lua_isstring(L, -1))
- prop->colors.push_back(readARGB8(L, -1));
- else
- prop->colors.push_back(video::SColor(255, 255, 255, 255));
- // removes value, keeps key for next iteration
- lua_pop(L, 1);
- }
- }
- lua_pop(L, 1);
-
- lua_getfield(L, -1, "spritediv");
- if(lua_istable(L, -1))
- prop->spritediv = read_v2s16(L, -1);
- lua_pop(L, 1);
-
- lua_getfield(L, -1, "initial_sprite_basepos");
- if(lua_istable(L, -1))
- prop->initial_sprite_basepos = read_v2s16(L, -1);
- lua_pop(L, 1);
-
- getboolfield(L, -1, "is_visible", prop->is_visible);
- getboolfield(L, -1, "makes_footstep_sound", prop->makes_footstep_sound);
- getfloatfield(L, -1, "automatic_rotate", prop->automatic_rotate);
-}
-
-/*
- object_reference
-*/
-
-void scriptapi_add_object_reference(lua_State *L, ServerActiveObject *cobj)
-{
- realitycheck(L);
- assert(lua_checkstack(L, 20));
- //infostream<<"scriptapi_add_object_reference: id="<<cobj->getId()<<std::endl;
- StackUnroller stack_unroller(L);
-
- // Create object on stack
- ObjectRef::create(L, cobj); // Puts ObjectRef (as userdata) on stack
- int object = lua_gettop(L);
-
- // Get minetest.object_refs table
- lua_getglobal(L, "minetest");
- lua_getfield(L, -1, "object_refs");
- luaL_checktype(L, -1, LUA_TTABLE);
- int objectstable = lua_gettop(L);
-
- // object_refs[id] = object
- lua_pushnumber(L, cobj->getId()); // Push id
- lua_pushvalue(L, object); // Copy object to top of stack
- lua_settable(L, objectstable);
-}
-
-void scriptapi_rm_object_reference(lua_State *L, ServerActiveObject *cobj)
-{
- realitycheck(L);
- assert(lua_checkstack(L, 20));
- //infostream<<"scriptapi_rm_object_reference: id="<<cobj->getId()<<std::endl;
- StackUnroller stack_unroller(L);
-
- // Get minetest.object_refs table
- lua_getglobal(L, "minetest");
- lua_getfield(L, -1, "object_refs");
- luaL_checktype(L, -1, LUA_TTABLE);
- int objectstable = lua_gettop(L);
-
- // Get object_refs[id]
- lua_pushnumber(L, cobj->getId()); // Push id
- lua_gettable(L, objectstable);
- // Set object reference to NULL
- ObjectRef::set_null(L);
- lua_pop(L, 1); // pop object
-
- // Set object_refs[id] = nil
- lua_pushnumber(L, cobj->getId()); // Push id
- lua_pushnil(L);
- lua_settable(L, objectstable);
-}