Core/Movement: Fix a potential crash on newly created pets.

Port From (https://github.com/TrinityCore/TrinityCore/commit/3d9d6fbcb80eaab72acbe6ef09b9b1c29f2439c7)
This commit is contained in:
hondacrx
2021-09-26 10:31:46 -04:00
parent ad1975b277
commit 9d5cf1d4ae
3 changed files with 13 additions and 8 deletions
+1 -1
View File
@@ -523,7 +523,7 @@ namespace Game.Entities
if (creature.HasUnitTypeMask(UnitTypeMask.Minion) && !creature.IsInCombat()) if (creature.HasUnitTypeMask(UnitTypeMask.Minion) && !creature.IsInCombat())
{ {
var top = creature.GetMotionMaster().Top(); var top = creature.GetMotionMaster().TopOrNull();
if (top != null && top.GetMovementGeneratorType() == MovementGeneratorType.Follow) if (top != null && top.GetMovementGeneratorType() == MovementGeneratorType.Follow)
{ {
Unit followed = ((AbstractFollower)top).GetTarget(); Unit followed = ((AbstractFollower)top).GetTarget();
@@ -73,12 +73,12 @@ namespace Game.Movement
return true; return true;
} }
bool mutualChase = IsMutualChase(owner, target); bool mutualChase = IsMutualChase(owner, target);
float hitboxSum = owner.GetCombatReach() + target.GetCombatReach(); float hitboxSum = owner.GetCombatReach() + target.GetCombatReach();
float minRange = _range.HasValue ? _range.Value.MinRange + hitboxSum : SharedConst.ContactDistance; float minRange = _range.HasValue ? _range.Value.MinRange + hitboxSum : SharedConst.ContactDistance;
float minTarget = (_range.HasValue ? _range.Value.MinTolerance : 0.0f) + hitboxSum; float minTarget = (_range.HasValue ? _range.Value.MinTolerance : 0.0f) + hitboxSum;
float maxRange = _range.HasValue ? _range.Value.MaxRange + hitboxSum : owner.GetMeleeRange(target); // melee range already includes hitboxes float maxRange = _range.HasValue ? _range.Value.MaxRange + hitboxSum : owner.GetMeleeRange(target); // melee range already includes hitboxes
float maxTarget = _range.HasValue ? _range.Value.MaxTolerance + hitboxSum : SharedConst.ContactDistance + hitboxSum; float maxTarget = _range.HasValue ? _range.Value.MaxTolerance + hitboxSum : SharedConst.ContactDistance + hitboxSum;
ChaseAngle? angle = mutualChase ? null : _angle; ChaseAngle? angle = mutualChase ? null : _angle;
// if we're already moving, periodically check if we're already in the expected range... // if we're already moving, periodically check if we're already in the expected range...
@@ -195,7 +195,7 @@ namespace Game.Movement
static bool IsMutualChase(Unit owner, Unit target) static bool IsMutualChase(Unit owner, Unit target)
{ {
IMovementGenerator gen = target.GetMotionMaster().Top(); IMovementGenerator gen = target.GetMotionMaster().TopOrNull();
if (gen == null || gen.GetMovementGeneratorType() != MovementGeneratorType.Chase) if (gen == null || gen.GetMovementGeneratorType() != MovementGeneratorType.Chase)
return false; return false;
return ((ChaseMovementGenerator)gen).GetTarget() == owner; return ((ChaseMovementGenerator)gen).GetTarget() == owner;
+5
View File
@@ -804,6 +804,11 @@ namespace Game.Movement
int Size() { return _top + 1; } int Size() { return _top + 1; }
public IMovementGenerator TopOrNull()
{
return Empty() ? null : Top();
}
public IMovementGenerator Top() public IMovementGenerator Top()
{ {
Cypher.Assert(!Empty()); Cypher.Assert(!Empty());