diff --git a/doc/lua_api.txt b/doc/lua_api.txt index eb05d117e..7d8fa149f 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -1228,6 +1228,8 @@ Player-only: (no-op for other objects) - get_look_dir(): get camera direction as a unit vector - get_look_pitch(): pitch in radians - get_look_yaw(): yaw in radians (wraps around pretty randomly as of now) +- set_look_pitch(radians): sets look pitch +- set_look_yaw(radians): sets look yaw - set_inventory_formspec(formspec) ^ Redefine player's inventory form ^ Should usually be called in on_joinplayer diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 1e02ea5a5..d7afc31d8 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -1230,6 +1230,20 @@ void PlayerSAO::moveTo(v3f pos, bool continuous) m_moved = true; } +void PlayerSAO::setYaw(float yaw) +{ + m_player->setYaw(yaw); + // Force change on client + m_moved = true; +} + +void PlayerSAO::setPitch(float pitch) +{ + m_player->setPitch(pitch); + // Force change on client + m_moved = true; +} + int PlayerSAO::punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher, diff --git a/src/content_sao.h b/src/content_sao.h index 2fd1034eb..e5b89d447 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -147,6 +147,8 @@ public: void setBasePosition(const v3f &position); void setPos(v3f pos); void moveTo(v3f pos, bool continuous); + void setYaw(float); + void setPitch(float); /* Interaction interface diff --git a/src/scriptapi_object.cpp b/src/scriptapi_object.cpp index ba72840c0..a0f93cbba 100644 --- a/src/scriptapi_object.cpp +++ b/src/scriptapi_object.cpp @@ -27,7 +27,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "scriptapi_entity.h" #include "scriptapi_common.h" - /* ObjectRef */ @@ -582,6 +581,30 @@ int ObjectRef::l_get_look_yaw(lua_State *L) 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) { @@ -755,6 +778,8 @@ const luaL_reg ObjectRef::methods[] = { 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), diff --git a/src/scriptapi_object.h b/src/scriptapi_object.h index ba1e7db39..a37abbb78 100644 --- a/src/scriptapi_object.h +++ b/src/scriptapi_object.h @@ -1,5 +1,5 @@ /* -Minetest-c55 +Minetest Copyright (C) 2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify @@ -169,6 +169,12 @@ private: // get_look_yaw(self) static int l_get_look_yaw(lua_State *L); + // set_look_pitch(self, radians) + static int l_set_look_pitch(lua_State *L); + + // set_look_yaw(self, radians) + static int l_set_look_yaw(lua_State *L); + // set_inventory_formspec(self, formspec) static int l_set_inventory_formspec(lua_State *L);