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

Commit

Permalink
fix: add a feature for target the treasure hunt in order.
Browse files Browse the repository at this point in the history
  • Loading branch information
ArchiDog1998 committed Feb 11, 2023
1 parent 90623c1 commit 97d71c4
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 14 deletions.
1 change: 0 additions & 1 deletion RotationSolver/Actions/BaseAction/BaseAction_Target.cs
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,6 @@ private bool TargetAreaMove(float range, bool mustUse)
}
else
{

var availableCharas = TargetUpdater.AllTargets.Where(b => b.ObjectId != Service.ClientState.LocalPlayer.ObjectId);
var target = TargetFilter.GetObjectInRadius(availableCharas, range).FindTargetForMoving(mustUse);
if (target == null) return false;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
using Dalamud.Game.ClientState.Objects.Types;
using FFXIVClientStructs.FFXIV.Client.Game.UI;
using RotationSolver.Helpers;
using System;
using System.Collections.Generic;
using System.Linq;

namespace RotationSolver.Data;
namespace RotationSolver.Helpers;

public struct MarkingHelper
public class MarkingHelper
{
private unsafe static long GetMarker(uint index) => MarkingController.Instance()->MarkerArray[index];

Expand Down
14 changes: 9 additions & 5 deletions RotationSolver/Helpers/ObjectHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ namespace RotationSolver.Helpers;

internal static class ObjectHelper
{
static readonly SortedList<EventHandlerType, uint[]> _eventType = new SortedList<EventHandlerType, uint[]>()
static readonly EventHandlerType[] _eventType = new EventHandlerType[]
{
{EventHandlerType.TreasureHuntDirector, new uint[] {60094 } },
{EventHandlerType.Quest, new uint[] {71224} },
EventHandlerType.TreasureHuntDirector,
EventHandlerType.Quest,
};

private unsafe static BNpcBase GetObjectNPC(this GameObject obj)
Expand All @@ -37,9 +37,10 @@ internal static bool HasPositional(this GameObject obj)

internal static unsafe bool IsOthersPlayers(this GameObject obj)
{
if (_eventType.TryGetValue(obj.GetAddress()->EventId.Type, out var id))
//SpecialType but no NamePlateIcon
if (_eventType.Contains(obj.GetAddress()->EventId.Type))
{
return !id.Contains( obj.GetAddress()->NamePlateIconId);
return obj.GetNamePlateIcon() == 0;
}
return false;
}
Expand All @@ -48,6 +49,9 @@ internal static unsafe bool IsNPCEnemy(this GameObject obj) => obj.GetObjectKind
&& obj.GetBattleNPCSubkind() == BattleNpcSubKind.Enemy;

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

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

internal static unsafe BattleNpcSubKind GetBattleNPCSubkind(this GameObject obj) => (BattleNpcSubKind)obj.GetAddress()->SubKind;

internal static unsafe uint FateId(this GameObject obj) => obj.GetAddress()->FateId;
Expand Down
24 changes: 20 additions & 4 deletions RotationSolver/Helpers/TargetFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ internal static BattleChara DefaultFindHostile(IEnumerable<BattleChara> availabl
if (availableCharas == null || !availableCharas.Any()) return null;

//找到被标记攻击的怪
if (Service.Configuration.ChooseAttackMark &&
MarkingHelper.GetAttackMarkChara(availableCharas) is BattleChara b && b != null) return b;
var b = MarkingHelper.GetAttackMarkChara(availableCharas);
if (Service.Configuration.ChooseAttackMark && b != null) return b;

//去掉停止标记的怪
if (Service.Configuration.FilterStopMark)
Expand All @@ -46,9 +46,12 @@ internal static BattleChara DefaultFindHostile(IEnumerable<BattleChara> availabl
if (charas?.Any() ?? false) availableCharas = charas;
}

//根据默认设置排序怪
availableCharas = DefaultTargetingType(availableCharas);
b = GetTopPriorityHostile(availableCharas);
if (b != null) return b;

//根据默认设置排序怪
availableCharas = DefaultTargetingType(availableCharas.Where(b =>
!TargetUpdater.TreasureCharas.Contains(b.ObjectId)));

//找到体积一样小的
float radius = availableCharas.FirstOrDefault().HitboxRadius;
Expand All @@ -57,6 +60,19 @@ internal static BattleChara DefaultFindHostile(IEnumerable<BattleChara> availabl
.OrderBy(DistanceToPlayer).First();
}

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;
}

internal static T FindTargetForMoving<T>(this IEnumerable<T> charas, bool mustUse) where T : GameObject
{
if (mustUse)
Expand Down
3 changes: 3 additions & 0 deletions RotationSolver/Updaters/TargetUpdater_Hostile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@ private unsafe static void UpdateHostileTargets(IEnumerable<BattleChara> allTarg
{
if (!b.IsNPCEnemy()) return false;

//Dead.
if (b.CurrentHp == 0) return false;

if (!b.IsTargetable()) return false;

if (b.StatusList.Any(StatusHelper.IsInvincible)) return false;
Expand Down
4 changes: 3 additions & 1 deletion RotationSolver/Updaters/TargetUpdater_Major.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,12 @@ internal static partial class TargetUpdater
internal static IEnumerable<GameObject> AllTargets { get; private set; }
internal static void UpdateTarget()
{
AllTargets = TargetFilter.GetObjectInRadius(Service.ObjectTable, 30);
var wholeTargets = Service.ObjectTable.GetObjectInRadius(60);
AllTargets = wholeTargets.GetObjectInRadius(30);
var battles = AllTargets.OfType<BattleChara>();
UpdateHostileTargets(battles);
UpdateFriends(battles);
UpdateNamePlate(wholeTargets.OfType<BattleChara>());
}
}
}
26 changes: 26 additions & 0 deletions RotationSolver/Updaters/TargetUpdater_NamePlate.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using Dalamud.Game.ClientState.Objects.Types;
using RotationSolver.Helpers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RotationSolver.Updaters;

internal static partial class TargetUpdater
{
public static uint[] TreasureCharas { get; private set; }
private static void UpdateNamePlate(IEnumerable<BattleChara> allTargets)
{
List<uint> charas = new List<uint>(5);
//60701 - 60705 For treasure hunt.
for (int i = 60701; i <= 60705; i++)
{
var b = allTargets.FirstOrDefault(obj => obj.GetNamePlateIcon() == i);
if (b == null || b.CurrentHp == 0) continue;
charas.Add(b.ObjectId);
}
TreasureCharas = charas.ToArray();
}
}

0 comments on commit 97d71c4

Please sign in to comment.