From 4774323154a2d07c656ee477c7424440ef3914ef Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Fri, 3 Oct 2014 22:23:56 +0100 Subject: More player speed/position overrides * Fixes #1300 --- src/Entities/Entity.cpp | 156 +++--------------------------------------------- src/Entities/Entity.h | 103 ++++++++++++++++++++++---------- src/Entities/Player.cpp | 39 ++++++++++-- src/Entities/Player.h | 15 +++-- 4 files changed, 122 insertions(+), 191 deletions(-) diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index da85dec50..02fcd5f1b 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -1456,17 +1456,6 @@ void cEntity::SetSwimState(cChunk & a_Chunk) -void cEntity::DoSetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ) -{ - m_Speed.Set(a_SpeedX, a_SpeedY, a_SpeedZ); - - WrapSpeed(); -} - - - - - void cEntity::HandleAir(void) { // Ref.: http://www.minecraftwiki.net/wiki/Chunk_format @@ -1770,15 +1759,6 @@ void cEntity::SetHeadYaw(double a_HeadYaw) -void cEntity::SetHeight(double a_Height) -{ - m_Height = a_Height; -} - - - - - void cEntity::SetMass(double a_Mass) { // Make sure that mass is not zero. 1g is the default because we @@ -1823,97 +1803,18 @@ void cEntity::SetRoll(double a_Roll) -void cEntity::SetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ) +void cEntity::SetSpeed(const Vector3d & a_Speed) { - DoSetSpeed(a_SpeedX, a_SpeedY, a_SpeedZ); -} - - - - -void cEntity::SetSpeedX(double a_SpeedX) -{ - SetSpeed(a_SpeedX, m_Speed.y, m_Speed.z); -} - - - - -void cEntity::SetSpeedY(double a_SpeedY) -{ - SetSpeed(m_Speed.x, a_SpeedY, m_Speed.z); -} - - - - -void cEntity::SetSpeedZ(double a_SpeedZ) -{ - SetSpeed(m_Speed.x, m_Speed.y, a_SpeedZ); -} - - - - - -void cEntity::SetWidth(double a_Width) -{ - m_Width = a_Width; -} - - - - - -void cEntity::AddPosX(double a_AddPosX) -{ - m_Pos.x += a_AddPosX; -} - - - - -void cEntity::AddPosY(double a_AddPosY) -{ - m_Pos.y += a_AddPosY; -} - - - - -void cEntity::AddPosZ(double a_AddPosZ) -{ - m_Pos.z += a_AddPosZ; -} - - - - -void cEntity::AddPosition(double a_AddPosX, double a_AddPosY, double a_AddPosZ) -{ - m_Pos.x += a_AddPosX; - m_Pos.y += a_AddPosY; - m_Pos.z += a_AddPosZ; -} - - - - -void cEntity::AddSpeed(double a_AddSpeedX, double a_AddSpeedY, double a_AddSpeedZ) -{ - m_Speed.x += a_AddSpeedX; - m_Speed.y += a_AddSpeedY; - m_Speed.z += a_AddSpeedZ; + m_Speed = a_Speed; WrapSpeed(); } - -void cEntity::AddSpeedX(double a_AddSpeedX) +void cEntity::AddSpeed(const Vector3d & a_AddSpeed) { - m_Speed.x += a_AddSpeedX; + m_Speed += a_AddSpeed; WrapSpeed(); } @@ -1921,20 +1822,17 @@ void cEntity::AddSpeedX(double a_AddSpeedX) -void cEntity::AddSpeedY(double a_AddSpeedY) +void cEntity::SetPosition(const Vector3d & a_Pos) { - m_Speed.y += a_AddSpeedY; - WrapSpeed(); + m_Pos = a_Pos; } - -void cEntity::AddSpeedZ(double a_AddSpeedZ) +void cEntity::AddPosition(const Vector3d & a_AddPos) { - m_Speed.z += a_AddSpeedZ; - WrapSpeed(); + m_Pos += a_AddPos; } @@ -1983,41 +1881,3 @@ Vector3d cEntity::GetLookVector(void) const - -//////////////////////////////////////////////////////////////////////////////// -// Set position -void cEntity::SetPosition(double a_PosX, double a_PosY, double a_PosZ) -{ - m_Pos.Set(a_PosX, a_PosY, a_PosZ); -} - - - - - -void cEntity::SetPosX(double a_PosX) -{ - m_Pos.x = a_PosX; -} - - - - - -void cEntity::SetPosY(double a_PosY) -{ - m_Pos.y = a_PosY; -} - - - - - -void cEntity::SetPosZ(double a_PosZ) -{ - m_Pos.z = a_PosZ; -} - - - - diff --git a/src/Entities/Entity.h b/src/Entities/Entity.h index 3fa7e80c1..3d7177fd4 100644 --- a/src/Entities/Entity.h +++ b/src/Entities/Entity.h @@ -205,45 +205,88 @@ public: int GetChunkZ(void) const {return (int)floor(m_Pos.z / cChunkDef::Width); } void SetHeadYaw (double a_HeadYaw); - void SetHeight (double a_Height); + void SetHeight (double a_Height) { m_Height = a_Height; } + void SetWidth (double a_Width) { m_Width = a_Width; } void SetMass (double a_Mass); - void SetPosX (double a_PosX); - void SetPosY (double a_PosY); - void SetPosZ (double a_PosZ); - void SetPosition(double a_PosX, double a_PosY, double a_PosZ); - void SetPosition(const Vector3d & a_Pos) { SetPosition(a_Pos.x, a_Pos.y, a_Pos.z); } void SetRot (const Vector3f & a_Rot); // OBSOLETE, use individual SetYaw(), SetPitch(), SetRoll() components void SetYaw (double a_Yaw); // In degrees, normalizes to [-180, +180) void SetPitch (double a_Pitch); // In degrees, normalizes to [-180, +180) void SetRoll (double a_Roll); // In degrees, normalizes to [-180, +180) - /** Sets the speed of the entity, measured in m / sec */ - void SetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ); + /** Sets the speed of the entity, measured in m / sec + The default implementation just sets the member variable value; + overrides can provide further processing, such as forcing players to move at the given speed + */ + virtual void SetSpeed(const Vector3d & a_Speed); /** Sets the speed of the entity, measured in m / sec */ - void SetSpeed(const Vector3d & a_Speed) { SetSpeed(a_Speed.x, a_Speed.y, a_Speed.z); } - - /** Sets the speed in the X axis, leaving the other speed components intact. Measured in m / sec. */ - void SetSpeedX(double a_SpeedX); - - /** Sets the speed in the Y axis, leaving the other speed components intact. Measured in m / sec. */ - void SetSpeedY(double a_SpeedY); + void SetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ) { SetSpeed(Vector3d(a_SpeedX, a_SpeedY, a_SpeedZ)); } - /** Sets the speed in the Z axis, leaving the other speed components intact. Measured in m / sec. */ - void SetSpeedZ(double a_SpeedZ); + /** Sets the speed in the X axis, leaving the other speed components intact. Measured in m / sec */ + void SetSpeedX(double a_SpeedX) { SetSpeed(a_SpeedX, m_Speed.y, m_Speed.z); } - void SetWidth (double a_Width); + /** Sets the speed in the Y axis, leaving the other speed components intact. Measured in m / sec */ + void SetSpeedY(double a_SpeedY) { SetSpeed(m_Speed.x, a_SpeedY, m_Speed.z); } - void AddPosX (double a_AddPosX); - void AddPosY (double a_AddPosY); - void AddPosZ (double a_AddPosZ); - void AddPosition(double a_AddPosX, double a_AddPosY, double a_AddPosZ); - void AddPosition(const Vector3d & a_AddPos) { AddPosition(a_AddPos.x, a_AddPos.y, a_AddPos.z); } - void AddSpeed (double a_AddSpeedX, double a_AddSpeedY, double a_AddSpeedZ); - void AddSpeed (const Vector3d & a_AddSpeed) { AddSpeed(a_AddSpeed.x, a_AddSpeed.y, a_AddSpeed.z); } - void AddSpeedX (double a_AddSpeedX); - void AddSpeedY (double a_AddSpeedY); - void AddSpeedZ (double a_AddSpeedZ); + /** Sets the speed in the Z axis, leaving the other speed components intact. Measured in m / sec */ + void SetSpeedZ(double a_SpeedZ) { SetSpeed(m_Speed.x, m_Speed.y, a_SpeedZ); } + + + /** Adds to the speed of the entity, measured in m / sec + The default implementation just increases the member variable value; + overrides can provide further processing, such as forcing players to move at the given speed + */ + virtual void AddSpeed(const Vector3d & a_AddSpeed); + + /** Adds to the speed of the entity, measured in m / sec */ + void AddSpeed(double a_AddSpeedX, double a_AddSpeedY, double a_AddSpeedZ) { AddSpeed(Vector3d(a_AddSpeedX, a_AddSpeedY, a_AddSpeedZ)); } + + /** Adds to the X speed of the entity, measured in m / sec */ + void AddSpeedX(double a_AddSpeedX) { AddSpeed(a_AddSpeedX, m_Speed.y, m_Speed.z); } + + /** Adds to the Y speed of the entity, measured in m / sec */ + void AddSpeedY(double a_AddSpeedY) { AddSpeed(m_Speed.x, a_AddSpeedY, m_Speed.z); } + + /** Adds to the Z speed of the entity, measured in m / sec */ + void AddSpeedZ(double a_AddSpeedZ) { AddSpeed(m_Speed.x, m_Speed.y, a_AddSpeedZ); } + + + /** Sets the absolute position of an entity + The default implementation just sets the member variable value; + overrides can provide further processing, such as teleporting players to the specified location + */ + virtual void SetPosition(const Vector3d & a_Pos); + + /** Sets the absolute position of an entity */ + void SetPosition(double a_PosX, double a_PosY, double a_PosZ) { SetPosition(Vector3d(a_PosX, a_PosY, a_PosZ)); } + + /** Sets the absolute X position of an entity */ + void SetPosX(double a_PosX) { SetPosition(a_PosX, m_Pos.y, m_Pos.z); } + + /** Sets the absolute Y position of an entity */ + void SetPosY(double a_PosY) { SetPosition(m_Pos.x, a_PosY, m_Pos.z); } + + /** Sets the absolute Z position of an entity */ + void SetPosZ(double a_PosZ) { SetPosition(m_Pos.x, m_Pos.y, a_PosZ); } + + + /** Adds to the absolute position of an entity + The default implementation just adds to the member variable value; + overrides can provide further processing, such as teleporting players to the specified location + */ + virtual void AddPosition(const Vector3d & a_AddPos); + + /** Adds to the absolute position of an entity */ + void AddPosition(double a_AddPosX, double a_AddPosY, double a_AddPosZ) { AddPosition(Vector3d(a_AddPosX, a_AddPosY, a_AddPosZ)); } + + /** Adds to the absolute X position of an entity */ + void AddPosX(double a_AddPosX) { AddPosition(a_AddPosX, m_Pos.y, m_Pos.z); } + + /** Adds to the absolute Y position of an entity */ + void AddPosY(double a_AddPosY) { AddPosition(m_Pos.x, a_AddPosY, m_Pos.z); } + + /** Adds to the absolute Z position of an entity */ + void AddPosZ(double a_AddPosZ) { AddPosition(m_Pos.x, m_Pos.y, a_AddPosZ); } virtual void HandleSpeedFromAttachee(float a_Forward, float a_Sideways); void SteerVehicle(float a_Forward, float a_Sideways); @@ -529,10 +572,6 @@ protected: /// Time, in ticks, since the last damage dealt by the void. Reset to zero when moving out of the void. int m_TicksSinceLastVoidDamage; - /** Does the actual speed-setting. The default implementation just sets the member variable value; - overrides can provide further processing, such as forcing players to move at the given speed. */ - virtual void DoSetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ); - virtual void Destroyed(void) {} // Called after the entity has been destroyed /** Applies friction to an entity diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp index f58a0a016..3a0d96e7d 100644 --- a/src/Entities/Player.cpp +++ b/src/Entities/Player.cpp @@ -1271,7 +1271,7 @@ unsigned int cPlayer::AwardAchievement(const eStatistic a_Ach) void cPlayer::TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ) { - SetPosition(a_PosX, a_PosY, a_PosZ); + cEntity::SetPosition(a_PosX, a_PosY, a_PosZ); m_LastGroundHeight = (float)a_PosY; m_LastJumpHeight = (float)a_PosY; m_bIsTeleporting = true; @@ -1325,20 +1325,23 @@ Vector3d cPlayer::GetThrowSpeed(double a_SpeedCoeff) const -void cPlayer::ForceSetSpeed(const Vector3d & a_Speed) +void cPlayer::SetSpeed(const Vector3d & a_Speed) { - SetSpeed(a_Speed); + super::SetSpeed(a_Speed); + + // Send the speed to the client + m_ClientHandle->SendEntityVelocity(*this); } -void cPlayer::DoSetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ) +void cPlayer::AddSpeed(const Vector3d & a_Speed) { - super::DoSetSpeed(a_SpeedX, a_SpeedY, a_SpeedZ); + super::AddSpeed(a_Speed); - // Send the speed to the client so he actualy moves + // Send the speed to the client m_ClientHandle->SendEntityVelocity(*this); } @@ -1346,6 +1349,30 @@ void cPlayer::DoSetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ) +void cPlayer::SetPosition(const Vector3d & a_Position) +{ + super::SetPosition(a_Position); + + // Teleport the client + TeleportToCoords(a_Position.x, a_Position.y, a_Position.z); +} + + + + + +void cPlayer::AddPosition(const Vector3d & a_Position) +{ + super::AddPosition(a_Position); + + // Teleport the client + TeleportToCoords(GetPosX(), GetPosY(), GetPosZ()); +} + + + + + void cPlayer::MoveTo( const Vector3d & a_NewPos) { if ((a_NewPos.y < -990) && (GetPosY() > -100)) diff --git a/src/Entities/Player.h b/src/Entities/Player.h index 22d6a2ae2..556a118b5 100644 --- a/src/Entities/Player.h +++ b/src/Entities/Player.h @@ -201,10 +201,6 @@ public: // Sets the current gamemode, doesn't check validity, doesn't send update packets to client void LoginSetGameMode(eGameMode a_GameMode); - /** Forces the player to move in the given direction. - @deprecated Use SetSpeed instead. */ - void ForceSetSpeed(const Vector3d & a_Speed); // tolua_export - /** Tries to move to a new position, with attachment-related checks (y == -999) */ void MoveTo(const Vector3d & a_NewPos); // tolua_export @@ -585,7 +581,16 @@ protected: AString m_CustomName; /** Sets the speed and sends it to the client, so that they are forced to move so. */ - virtual void DoSetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ) override; + virtual void SetSpeed(const Vector3d & a_Speed) override; + + /** Adds to the speed and sends it to the client, so that they are forced to move so. */ + virtual void AddSpeed(const Vector3d & a_Speed) override; + + /** Sets the speed and sends it to the client, so that they are forced to move so. */ + virtual void SetPosition(const Vector3d & a_Position) override; + + /** Adds to the speed and sends it to the client, so that they are forced to move so. */ + virtual void AddPosition(const Vector3d & a_Position) override; void ResolvePermissions(void); void ResolveGroups(void); -- cgit v1.2.3