Skip to content
This repository has been archived by the owner on Aug 28, 2024. It is now read-only.

Commit

Permalink
fix: add top priority hostile for hunting log.
Browse files Browse the repository at this point in the history
  • Loading branch information
ArchiDog1998 committed Feb 12, 2023
1 parent c729c1c commit b468063
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 41 deletions.
22 changes: 21 additions & 1 deletion RotationSolver/Helpers/ObjectHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ internal static unsafe bool IsOthersPlayers(this GameObject obj)
static readonly EventHandlerType[] _someSpecialEvent = new EventHandlerType[]
{
EventHandlerType.PublicContentDirector, //Island Sanctuary..
EventHandlerType.FateDirector, //Island Sanctuary..
EventHandlerType.FateDirector,
};
internal static unsafe bool IsNPCEnemy(this GameObject obj)
=> obj.GetObjectKind() == ObjectKind.BattleNpc
Expand All @@ -63,6 +63,10 @@ private unsafe static bool CanAttack(this GameObject actor)

internal static unsafe ObjectKind GetObjectKind(this GameObject obj) => (ObjectKind)obj.GetAddress()->ObjectKind;

internal static bool IsTopPriorityHostile(this GameObject obj)
//Hunting log and weapon.
=> obj.GetNamePlateIcon() is 60092 or 60096;

internal static unsafe uint GetNamePlateIcon(this GameObject obj) => obj.GetAddress()->NamePlateIconId;
internal static unsafe EventHandlerType GetEventType(this GameObject obj) => obj.GetAddress()->EventId.Type;

Expand Down Expand Up @@ -186,4 +190,20 @@ private static uint GetHealthFromMulty(float mult)

return (uint)(multi * Service.ClientState.LocalPlayer.MaxHp);
}

/// <summary>
/// 对象<paramref name="obj"/>距玩家的距离
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
internal static float DistanceToPlayer(this GameObject obj)
{
if (obj == null) return float.MaxValue;
var player = Service.ClientState.LocalPlayer;
if (player == null) return float.MaxValue;

var distance = Vector3.Distance(player.Position, obj.Position) - player.HitboxRadius;
distance -= Math.Max(obj.HitboxRadius, Service.Configuration.ObjectMinRadius);
return distance;
}
}
42 changes: 10 additions & 32 deletions RotationSolver/Helpers/TargetFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,14 @@ internal static BattleChara DefaultFindHostile(IEnumerable<BattleChara> availabl
if (charas?.Any() ?? false) availableCharas = charas;
}

b = GetTopPriorityHostile(availableCharas);
b = availableCharas.FirstOrDefault(ObjectHelper.IsTopPriorityHostile);
if (b != null) return b;

if (TargetUpdater.TreasureCharas.Length > 0)
{
return availableCharas.FirstOrDefault(b => b.ObjectId == TargetUpdater.TreasureCharas[0]);
}

//根据默认设置排序怪
availableCharas = DefaultTargetingType(availableCharas.Where(b =>
!TargetUpdater.TreasureCharas.Contains(b.ObjectId)));
Expand All @@ -57,27 +62,14 @@ internal static BattleChara DefaultFindHostile(IEnumerable<BattleChara> availabl
float radius = availableCharas.FirstOrDefault().HitboxRadius;

return availableCharas.Where(c => c.HitboxRadius == radius)
.OrderBy(DistanceToPlayer).FirstOrDefault();
}

private static BattleChara GetTopPriorityHostile(IEnumerable<BattleChara> availableCharas)
{
//Hunting log and weapon.
var b = availableCharas.FirstOrDefault(b => b.GetNamePlateIcon() is 60092 or 60096);
if (b != null) return b;

if(TargetUpdater.TreasureCharas.Length > 0)
{
return availableCharas.FirstOrDefault(b => b.ObjectId == TargetUpdater.TreasureCharas[0]);
}
return null;
.OrderBy(ObjectHelper.DistanceToPlayer).FirstOrDefault();
}

internal static T FindTargetForMoving<T>(this IEnumerable<T> charas, bool mustUse) where T : GameObject
{
if (mustUse)
{
var tar = charas.OrderBy(DistanceToPlayer).FirstOrDefault();
var tar = charas.OrderBy(ObjectHelper.DistanceToPlayer).FirstOrDefault();
if(tar == null) return null;
if (tar.DistanceToPlayer() < 1) return tar;
return null;
Expand Down Expand Up @@ -108,7 +100,7 @@ private static T FindMoveTargetFaceDirection<T>(IEnumerable<T> charas) where T :
Vector2 dirVec = new Vector2(dir.Z, dir.X);
double angle = Math.Acos(Vector2.Dot(dirVec, faceVec) / dirVec.Length() / faceVec.Length());
return angle <= Math.PI * Service.Configuration.MoveTargetAngle / 360;
}).OrderByDescending(DistanceToPlayer);
}).OrderByDescending(ObjectHelper.DistanceToPlayer);

return tars.FirstOrDefault();
}
Expand All @@ -129,7 +121,7 @@ private static T FindMoveTargetScreenCenter<T>(IEnumerable<T> charas) where T :
if (dir.Y > 0) return false;

return Math.Abs(dir.X / dir.Y) < Math.Tan(Math.PI * Service.Configuration.MoveTargetAngle / 360);
}).OrderByDescending(DistanceToPlayer);
}).OrderByDescending(ObjectHelper.DistanceToPlayer);

return tars.FirstOrDefault();
}
Expand Down Expand Up @@ -351,21 +343,7 @@ internal static IEnumerable<T> GetObjectInRadius<T>(this IEnumerable<T> objects,
return objects.Where(o => o.DistanceToPlayer() <= radius);
}

/// <summary>
/// 对象<paramref name="obj"/>距玩家的距离
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
internal static float DistanceToPlayer(this GameObject obj)
{
if (obj == null) return float.MaxValue;
var player = Service.ClientState.LocalPlayer;
if (player == null) return float.MaxValue;

var distance = Vector3.Distance(player.Position, obj.Position) - player.HitboxRadius;
distance -= Math.Max(obj.HitboxRadius, Service.Configuration.ObjectMinRadius);
return distance;
}

private static IEnumerable<BattleChara> DefaultTargetingType(IEnumerable<BattleChara> charas)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ private bool MovingAbility(byte abilitiesRemaining, SpecialCommandType specialTy
act = null;
if (specialType == SpecialCommandType.MoveForward && MoveForwardAbility(abilitiesRemaining, out act))
{
if (act is BaseAction b && TargetFilter.DistanceToPlayer(b.Target) > 5) return true;
if (act is BaseAction b && ObjectHelper.DistanceToPlayer(b.Target) > 5) return true;
}
else if (specialType == SpecialCommandType.MoveBack)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,11 @@ internal RoleAction(ActionID actionID, JobRole[] roles, bool isFriendly = false,
{
if (TargetUpdater.DyingPeople.Any())
{
return TargetUpdater.DyingPeople.OrderBy(b => TargetFilter.DistanceToPlayer(b)).First();
return TargetUpdater.DyingPeople.OrderBy(ObjectHelper.DistanceToPlayer).First();
}
else if (TargetUpdater.WeakenPeople.Any())
{
return TargetUpdater.WeakenPeople.OrderBy(b => TargetFilter.DistanceToPlayer(b)).First();
return TargetUpdater.WeakenPeople.OrderBy(ObjectHelper.DistanceToPlayer).First();
}
return null;
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ private IAction GCD(byte abilityRemain, bool helpDefenseAOE, bool helpDefenseSin

if (specialType == SpecialCommandType.MoveForward && MoveGCD(out act))
{
if (act is BaseAction b && TargetFilter.DistanceToPlayer(b.Target) > 5) return act;
if (act is BaseAction b && ObjectHelper.DistanceToPlayer(b.Target) > 5) return act;
}

//General Heal
Expand Down
7 changes: 4 additions & 3 deletions RotationSolver/Updaters/TargetUpdater_Hostile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -121,12 +121,13 @@ private static IEnumerable<BattleChara> GetHostileTargets(IEnumerable<BattleChar

var hostiles = allattackableTargets.Where(t =>
{
if (ids.Contains(t.ObjectId)) return true;
if (t.TargetObject == Service.ClientState.LocalPlayer) return true;

//Remove other's treasure.
if (t.IsOthersPlayers()) return false;

if (ids.Contains(t.ObjectId)) return true;
if (t.TargetObject == Service.ClientState.LocalPlayer) return true;
if (t.IsTopPriorityHostile()) return true;

return fateId > 0 ? t.FateId() == fateId : t.TargetObject is BattleChara;
});

Expand Down
2 changes: 1 addition & 1 deletion RotationSolver/Updaters/TargetUpdater_NamePlate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace RotationSolver.Updaters;

internal static partial class TargetUpdater
{
public static uint[] TreasureCharas { get; private set; }
public static uint[] TreasureCharas { get; private set; } = new uint[0];
private static void UpdateNamePlate(IEnumerable<BattleChara> allTargets)
{
List<uint> charas = new List<uint>(5);
Expand Down

0 comments on commit b468063

Please sign in to comment.