diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp index ece59828e..f49175922 100644 --- a/src/Mobs/Monster.cpp +++ b/src/Mobs/Monster.cpp @@ -100,6 +100,7 @@ cMonster::cMonster(const AString & a_ConfigName, eMonsterType a_MobType, const A , m_RelativeWalkSpeed(1) , m_Age(1) , m_AgingTimer(20 * 60 * 20) // about 20 minutes + , m_WasLastTargetAPlayer(false) , m_Target(nullptr) { if (!a_ConfigName.empty()) @@ -945,6 +946,7 @@ void cMonster::SetTarget (cPawn * a_NewTarget) ASSERT(a_NewTarget->IsTicking()); // Notify the new target that we are now targeting it. m_Target->TargetingMe(this); + m_WasLastTargetAPlayer = m_Target->IsPlayer(); } } diff --git a/src/Mobs/Monster.h b/src/Mobs/Monster.h index 1c3d9c37a..3aaadb57f 100644 --- a/src/Mobs/Monster.h +++ b/src/Mobs/Monster.h @@ -176,6 +176,9 @@ public: */ static cMonster * NewMonsterFromType(eMonsterType a_MobType); + /** Returns if this mob last target was a player to avoid destruction on player quit */ + bool WasLastTargetAPlayer() const { return m_WasLastTargetAPlayer; } + protected: /** The pathfinder instance handles pathfinding for this monster. */ @@ -251,6 +254,8 @@ protected: int m_Age; int m_AgingTimer; + bool m_WasLastTargetAPlayer; + /** Adds a random number of a_Item between a_Min and a_Max to itemdrops a_Drops */ void AddRandomDropItem(cItems & a_Drops, unsigned int a_Min, unsigned int a_Max, short a_Item, short a_ItemHealth = 0); diff --git a/src/World.cpp b/src/World.cpp index 447e2cf25..d4be3addb 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -1149,8 +1149,8 @@ void cWorld::TickMobs(std::chrono::milliseconds a_Dt) { Monster->Tick(m_Dt, *(a_Entity->GetParentChunk())); } - // Destroy far hostile mobs - else if ((Monster->GetMobFamily() == cMonster::eFamily::mfHostile)) + // Destroy far hostile mobs except if last target was a player + else if ((Monster->GetMobFamily() == cMonster::eFamily::mfHostile) && !Monster->WasLastTargetAPlayer()) { if (Monster->GetMobType() != eMonsterType::mtWolf) {