From 0c10704d1f0e8ac1573ecc9ccdddd14690dcca38 Mon Sep 17 00:00:00 2001 From: Lukas Pioch Date: Wed, 7 Dec 2016 21:15:30 +0100 Subject: [PATCH] Export GetPosition and GetSpeed from cEntity as a copy instead of a pointer to lua. --- src/Bindings/ManualBindings.cpp | 46 +++++++++++++++++++++++++++++++++ src/Entities/Entity.h | 8 ++++-- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/Bindings/ManualBindings.cpp b/src/Bindings/ManualBindings.cpp index 083a30f2a..1fe3c0f9f 100644 --- a/src/Bindings/ManualBindings.cpp +++ b/src/Bindings/ManualBindings.cpp @@ -3799,6 +3799,50 @@ static int tolua_cCompositeChat_UnderlineUrls(lua_State * tolua_S) +static int tolua_cEntity_GetPosition(lua_State * tolua_S) +{ + cLuaState L(tolua_S); + + // Get the params: + cEntity * self = reinterpret_cast(tolua_tousertype(tolua_S, 1, nullptr)); + if (self == nullptr) + { + LOGWARNING("%s: invalid self (%p)", __FUNCTION__, static_cast(self)); + return 0; + } + + L.Push(Mtolua_new((Vector3d)(self->GetPosition()))); + + tolua_register_gc(L, lua_gettop(L)); // Make Lua own the object + return 1; +} + + + + + +static int tolua_cEntity_GetSpeed(lua_State * tolua_S) +{ + cLuaState L(tolua_S); + + // Get the params: + cEntity * self = reinterpret_cast(tolua_tousertype(tolua_S, 1, nullptr)); + if (self == nullptr) + { + LOGWARNING("%s: invalid self (%p)", __FUNCTION__, static_cast(self)); + return 0; + } + + L.Push(Mtolua_new((Vector3d)(self->GetSpeed()))); + + tolua_register_gc(L, lua_gettop(L)); // Make Lua own the object + return 1; +} + + + + + void cManualBindings::Bind(lua_State * tolua_S) { tolua_beginmodule(tolua_S, nullptr); @@ -3878,6 +3922,8 @@ void cManualBindings::Bind(lua_State * tolua_S) tolua_beginmodule(tolua_S, "cEntity"); tolua_constant(tolua_S, "INVALID_ID", cEntity::INVALID_ID); + tolua_function(tolua_S, "GetPosition", tolua_cEntity_GetPosition); + tolua_function(tolua_S, "GetSpeed", tolua_cEntity_GetSpeed); tolua_endmodule(tolua_S); tolua_beginmodule(tolua_S, "cFile"); diff --git a/src/Entities/Entity.h b/src/Entities/Entity.h index 4833f8b5c..c9d445de7 100644 --- a/src/Entities/Entity.h +++ b/src/Entities/Entity.h @@ -191,7 +191,6 @@ public: double GetHeadYaw (void) const { return m_HeadYaw; } // In degrees double GetHeight (void) const { return m_Height; } double GetMass (void) const { return m_Mass; } - const Vector3d & GetPosition (void) const { return m_Position; } double GetPosX (void) const { return m_Position.x; } double GetPosY (void) const { return m_Position.y; } double GetPosZ (void) const { return m_Position.z; } @@ -199,7 +198,6 @@ public: double GetPitch (void) const { return m_Rot.y; } // In degrees, [-180, +180), but normal client clips to [-90, +90] double GetRoll (void) const { return m_Rot.z; } // In degrees, unused in current client Vector3d GetLookVector(void) const; - const Vector3d & GetSpeed (void) const { return m_Speed; } double GetSpeedX (void) const { return m_Speed.x; } double GetSpeedY (void) const { return m_Speed.y; } double GetSpeedZ (void) const { return m_Speed.z; } @@ -292,6 +290,12 @@ public: // tolua_end + /** Exported in ManualBindings */ + const Vector3d & GetPosition(void) const { return m_Position; } + + /** Exported in ManualBindings */ + const Vector3d & GetSpeed(void) const { return m_Speed; } + /** Destroy the entity without scheduling memory freeing. This should only be used by cChunk or cClientHandle for internal memory management. */ void DestroyNoScheduling(bool a_ShouldBroadcast);