From a1c48f4853b234e920e96671c4ff218567d4f2d4 Mon Sep 17 00:00:00 2001 From: Marvin Kopf Date: Tue, 2 Feb 2016 14:44:10 +0100 Subject: Fix cPawn pushing cPawn instances can no longer push an entity they are attached to. cEntity now has a IsAttachedTo method. --- src/Entities/Entity.cpp | 13 +++++++++++++ src/Entities/Entity.h | 3 +++ src/Entities/Pawn.cpp | 6 ++++++ 3 files changed, 22 insertions(+) diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index d4097f734..593bc6aca 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -1864,6 +1864,19 @@ bool cEntity::IsA(const char * a_ClassName) const +bool cEntity::IsAttachedTo(const cEntity * a_Entity) const +{ + if ((m_AttachedTo != nullptr) && (a_Entity->GetUniqueID() == m_AttachedTo->GetUniqueID())) + { + return true; + } + return false; +} + + + + + void cEntity::SetHeadYaw(double a_HeadYaw) { m_HeadYaw = a_HeadYaw; diff --git a/src/Entities/Entity.h b/src/Entities/Entity.h index 3715fb5c4..dbfc019e7 100644 --- a/src/Entities/Entity.h +++ b/src/Entities/Entity.h @@ -423,6 +423,9 @@ public: /** Detaches from the currently attached entity, if any */ virtual void Detach(void); + /** Returns true if this entity is attached to the specified entity */ + bool IsAttachedTo(const cEntity * a_Entity) const; + /** Makes sure head yaw is not over the specified range. */ void WrapHeadYaw(); diff --git a/src/Entities/Pawn.cpp b/src/Entities/Pawn.cpp index 6b404f7e0..2d86dfecf 100644 --- a/src/Entities/Pawn.cpp +++ b/src/Entities/Pawn.cpp @@ -73,6 +73,12 @@ void cPawn::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) return false; } + // do not push a boat / minecart you're sitting in + if (m_Pusher->IsAttachedTo(a_Entity)) + { + return false; + } + Vector3d v3Delta = a_Entity->GetPosition() - m_Pusher->GetPosition(); v3Delta.y = 0.0; // we only push sideways v3Delta *= 1.0 / (v3Delta.Length() + 0.01); // we push harder if we're close -- cgit v1.2.3