diff options
Diffstat (limited to '')
-rw-r--r-- | src/Entities/LeashKnot.cpp | 61 |
1 files changed, 42 insertions, 19 deletions
diff --git a/src/Entities/LeashKnot.cpp b/src/Entities/LeashKnot.cpp index 51002531d..a86dc9d53 100644 --- a/src/Entities/LeashKnot.cpp +++ b/src/Entities/LeashKnot.cpp @@ -1,4 +1,4 @@ - + #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules #include "LeashKnot.h" @@ -38,42 +38,58 @@ void cLeashKnot::OnRightClicked(cPlayer & a_Player) -void cLeashKnot::TiePlayersLeashedMobs(cPlayer & a_Player, bool a_ShouldBroadcast) +void cLeashKnot::TiePlayersLeashedMobs(cPlayer & a_Player, bool a_ShouldBroadCast) { // Check leashed nearby mobs to tie them to this knot - // taking world from player (instead from this) because this can be called before entity was initialized - a_Player.GetWorld()->ForEachEntityInBox(cBoundingBox(GetPosition(), 8, 8, -4), [&](cEntity & a_Entity) + class LookForLeasheds : public cEntityCallback + { + public: + cLeashKnot * m_Knot; + cPlayer * m_Player; + bool m_ShouldBroadcast; + + LookForLeasheds(cLeashKnot * a_Knot, cPlayer * a_PlayerLeashedTo, bool a_ShouldBroadcast) : + m_Knot(a_Knot), + m_Player(a_PlayerLeashedTo), + m_ShouldBroadcast(a_ShouldBroadcast) + { + } + + virtual bool Item(cEntity * a_Entity) override { // If the entity is not a monster skip it - if (a_Entity.GetEntityType() != cEntity::eEntityType::etMonster) + if (a_Entity->GetEntityType() != cEntity::eEntityType::etMonster) { return false; } - auto & PotentialLeashed = static_cast<cMonster&>(a_Entity); + cMonster * PotentialLeashed = static_cast<cMonster*>(a_Entity); // If can't be leashed skip it - if (!PotentialLeashed.CanBeLeashed()) + if (!PotentialLeashed->CanBeLeashed()) { return false; } // If it's not leashed to the player skip it if ( - !PotentialLeashed.IsLeashed() || - !PotentialLeashed.GetLeashedTo()->IsPlayer() || - (PotentialLeashed.GetLeashedTo()->GetUniqueID() != a_Player.GetUniqueID()) + !PotentialLeashed->IsLeashed() || + !PotentialLeashed->GetLeashedTo()->IsPlayer() || + (PotentialLeashed->GetLeashedTo()->GetUniqueID() != m_Player->GetUniqueID()) ) { return false; } // All conditions met, unleash from player and leash to fence - PotentialLeashed.Unleash(false, false); - PotentialLeashed.LeashTo(*this, a_ShouldBroadcast); + PotentialLeashed->Unleash(false, false); + PotentialLeashed->LeashTo(*m_Knot, m_ShouldBroadcast); return false; } - ); + } LookForLeashedsCallback(this, &a_Player, a_ShouldBroadCast); + + // taking world from player (instead from this) because this can be called before entity was initialized + a_Player.GetWorld()->ForEachEntityInBox(cBoundingBox(GetPosition(), 8, 8, -4), LookForLeashedsCallback); } @@ -142,19 +158,26 @@ void cLeashKnot::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) cLeashKnot * cLeashKnot::FindKnotAtPos(cWorldInterface & a_WorldInterface, Vector3i a_BlockPos) { - cLeashKnot * LeashKnot = nullptr; - a_WorldInterface.ForEachEntityInBox(cBoundingBox(a_BlockPos, 0.5, 1), [&](cEntity & a_Entity) + class LookForKnot : public cEntityCallback + { + public: + cLeashKnot * m_LeashKnot = nullptr; + + virtual bool Item(cEntity * a_Entity) override { - if (a_Entity.IsLeashKnot()) + if (a_Entity->IsLeashKnot()) { - LeashKnot = static_cast<cLeashKnot *>(&a_Entity); + m_LeashKnot = reinterpret_cast<cLeashKnot *>(a_Entity); return true; } return false; } - ); - return LeashKnot; + } CallbackFindKnot; + + a_WorldInterface.ForEachEntityInBox(cBoundingBox(a_BlockPos, 0.5, 1), CallbackFindKnot); + + return CallbackFindKnot.m_LeashKnot; } |