From 7937813c98255736c6847fe2d1302e0c6b309b04 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Wed, 28 Dec 2011 17:34:07 +0200 Subject: [PATCH] Add get_look_dir(), get_look_pitch() and get_look_yaw() for players --- data/mods/default/init.lua | 7 +- data/mods/experimental/init.lua | 15 +++++ src/player.h | 10 +++ src/scriptapi.cpp | 110 ++++++++++++++++++++++---------- 4 files changed, 107 insertions(+), 35 deletions(-) diff --git a/data/mods/default/init.lua b/data/mods/default/init.lua index 95d9c19f..1edbd3cb 100644 --- a/data/mods/default/init.lua +++ b/data/mods/default/init.lua @@ -188,6 +188,8 @@ -- ^ time_from_last_punch = time since last punch action of the puncher -- - right_click(clicker); clicker = an another ObjectRef -- - get_wield_digging_properties() -> digging property table +-- - damage_wielded_item(num) (item damage/wear range is 0-65535) +-- - add_to_inventory(itemstring): add an item to object inventory -- - add_to_inventory_later(itemstring): like above, but after callback returns (only allowed for craftitem callbacks) -- - get_hp(): returns number of hitpoints (2 * number of hearts) -- - set_hp(hp): set number of hitpoints (2 * number of hearts) @@ -202,8 +204,9 @@ -- - get_player_name(): will return nil if is not a player -- - inventory_set_list(name, {item1, item2, ...}) -- - inventory_get_list(name) -> {item1, item2, ...} --- - damage_wielded_item(num) (item damage/wear range is 0-65535) --- - add_to_inventory(itemstring): add an item to object inventory +-- - 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) -- -- Registered entities: -- - Functions receive a "luaentity" as self: diff --git a/data/mods/experimental/init.lua b/data/mods/experimental/init.lua index d180d477..52a729a4 100644 --- a/data/mods/experimental/init.lua +++ b/data/mods/experimental/init.lua @@ -2,6 +2,21 @@ -- Experimental things -- +-- For testing random stuff + +function on_step(dtime) + -- print("experimental on_step") + --[[ + print("celeron55 dir: "..dump( + minetest.env:get_player_by_name("celeron55"):get_look_dir())) + print("celeron55 pitch: "..dump( + minetest.env:get_player_by_name("celeron55"):get_look_pitch())) + print("celeron55 yaw: "..dump( + minetest.env:get_player_by_name("celeron55"):get_look_yaw())) + --]] +end +minetest.register_globalstep(on_step) + -- An example furnace-thing implemented in Lua minetest.register_node("experimental:luafurnace", { diff --git a/src/player.h b/src/player.h index 107c829f..1c9dde7e 100644 --- a/src/player.h +++ b/src/player.h @@ -102,6 +102,16 @@ public: return m_yaw; } + f32 getRadPitch() + { + return -1.0 * m_pitch * core::DEGTORAD; + } + + f32 getRadYaw() + { + return (m_yaw + 90.) * core::DEGTORAD; + } + virtual void updateName(const char *name) { snprintf(m_name, PLAYERNAME_SIZE, "%s", name); diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp index 4839f2ac..23336e32 100644 --- a/src/scriptapi.cpp +++ b/src/scriptapi.cpp @@ -167,6 +167,43 @@ void check_modname_prefix(lua_State *L, std::string &name) +"\"contains unallowed characters"); } +static void push_v3f(lua_State *L, v3f p) +{ + lua_newtable(L); + lua_pushnumber(L, p.X); + lua_setfield(L, -2, "x"); + lua_pushnumber(L, p.Y); + lua_setfield(L, -2, "y"); + lua_pushnumber(L, p.Z); + lua_setfield(L, -2, "z"); +} + +static v2s16 read_v2s16(lua_State *L, int index) +{ + v2s16 p; + luaL_checktype(L, index, LUA_TTABLE); + lua_getfield(L, index, "x"); + p.X = lua_tonumber(L, -1); + lua_pop(L, 1); + lua_getfield(L, index, "y"); + p.Y = lua_tonumber(L, -1); + lua_pop(L, 1); + return p; +} + +static v2f read_v2f(lua_State *L, int index) +{ + v2f p; + luaL_checktype(L, index, LUA_TTABLE); + lua_getfield(L, index, "x"); + p.X = lua_tonumber(L, -1); + lua_pop(L, 1); + lua_getfield(L, index, "y"); + p.Y = lua_tonumber(L, -1); + lua_pop(L, 1); + return p; +} + static v3f readFloatPos(lua_State *L, int index) { v3f pos; @@ -187,13 +224,7 @@ static v3f readFloatPos(lua_State *L, int index) static void pushFloatPos(lua_State *L, v3f p) { p /= BS; - lua_newtable(L); - lua_pushnumber(L, p.X); - lua_setfield(L, -2, "x"); - lua_pushnumber(L, p.Y); - lua_setfield(L, -2, "y"); - lua_pushnumber(L, p.Z); - lua_setfield(L, -2, "z"); + push_v3f(L, p); } static void pushpos(lua_State *L, v3s16 p) @@ -293,32 +324,6 @@ static core::aabbox3d read_aabbox3df32(lua_State *L, int index, f32 scale) return box; } -static v2s16 read_v2s16(lua_State *L, int index) -{ - v2s16 p; - luaL_checktype(L, index, LUA_TTABLE); - lua_getfield(L, index, "x"); - p.X = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_getfield(L, index, "y"); - p.Y = lua_tonumber(L, -1); - lua_pop(L, 1); - return p; -} - -static v2f read_v2f(lua_State *L, int index) -{ - v2f p; - luaL_checktype(L, index, LUA_TTABLE); - lua_getfield(L, index, "x"); - p.X = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_getfield(L, index, "y"); - p.Y = lua_tonumber(L, -1); - lua_pop(L, 1); - return p; -} - static bool getstringfield(lua_State *L, int table, const char *fieldname, std::string &result) { @@ -2222,6 +2227,42 @@ private: return 1; } + // get_look_dir(self) + static int l_get_look_dir(lua_State *L) + { + ObjectRef *ref = checkobject(L, 1); + ServerRemotePlayer *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) + static int l_get_look_pitch(lua_State *L) + { + ObjectRef *ref = checkobject(L, 1); + ServerRemotePlayer *player = getplayer(ref); + if(player == NULL) return 0; + // Do it + lua_pushnumber(L, player->getRadPitch()); + return 1; + } + + // get_look_yaw(self) + static int l_get_look_yaw(lua_State *L) + { + ObjectRef *ref = checkobject(L, 1); + ServerRemotePlayer *player = getplayer(ref); + if(player == NULL) return 0; + // Do it + lua_pushnumber(L, player->getRadYaw()); + return 1; + } + public: ObjectRef(ServerActiveObject *object): m_object(object) @@ -2310,6 +2351,9 @@ const luaL_reg ObjectRef::methods[] = { method(ObjectRef, inventory_get_list), method(ObjectRef, get_wielded_itemstring), method(ObjectRef, get_wielded_item), + method(ObjectRef, get_look_dir), + method(ObjectRef, get_look_pitch), + method(ObjectRef, get_look_yaw), {0,0} };