using ACE.Entity.Enum;
namespace ACE.Server.WorldObjects
{
///
/// Handles pets waking up monsters
///
partial class CombatPet
{
///
/// Wakes up any monsters within the applicable range
///
public void PetCheckMonsters()
{
//if (!Attackable) return;
var creatures = PhysicsObj.ObjMaint.GetVisibleTargetsValuesOfTypeCreature();
foreach (var monster in creatures)
{
if (monster.IsDead) continue;
//if (Location.SquaredDistanceTo(monster.Location) <= monster.VisualAwarenessRangeSq)
if (PhysicsObj.get_distance_sq_to_object(monster.PhysicsObj, true) <= monster.VisualAwarenessRangeSq)
PetAlertMonster(monster);
}
}
///
/// Wakes up a monster if it can be alerted
///
private bool PetAlertMonster(Creature monster)
{
if (!monster.Attackable || monster.MonsterState != State.Idle || (monster.Tolerance & PlayerCombatPet_MoveExclude) != 0)
return false;
// if the combat pet's owner belongs to a faction,
// and the monster also belongs to the same faction, don't aggro the monster?
if (SameFaction(monster))
{
// unless the pet owner or the pet is being retaliated against?
if (!monster.HasRetaliateTarget(P_PetOwner) && !monster.HasRetaliateTarget(this))
return false;
monster.AddRetaliateTarget(this);
}
monster.AttackTarget = this;
monster.WakeUp();
return true;
}
///
/// Called when a combat pet attacks a monster
///
public void PetOnAttackMonster(Creature monster)
{
/*Console.WriteLine($"{Name}.PetOnAttackMonster({monster.Name})");
Console.WriteLine($"Attackable: {monster.Attackable}");
Console.WriteLine($"Tolerance: {monster.Tolerance}");*/
// faction mobs will retaliate against combat pets belonging to the same faction
if (monster.SameFaction(this))
monster.AddRetaliateTarget(this);
if (monster.MonsterState == State.Idle && (monster.Tolerance & PlayerCombatPet_RetaliateExclude) == 0)
{
monster.AttackTarget = this;
monster.WakeUp();
}
}
}
}