1
0

Don't destroy monster when last target type is a player (#3721)

In current Cuberite version if you are pursued by monsters you just have to disconnect and connect again to get rid of them. If no other player is in your chunk monsters will get destroyed.
This commit is contained in:
Pablo Beltrán 2017-05-21 10:29:06 +02:00 committed by Mattes D
parent 4b5a11ee95
commit 2359611c57
3 changed files with 9 additions and 2 deletions

View File

@ -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();
}
}

View File

@ -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);

View File

@ -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)
{