Skip to content

Commit

Permalink
Merge pull request #166 from FFXIV-CombatReborn/remove-target-updater
Browse files Browse the repository at this point in the history
Fixed null reference bug with "AverageTimeToKill"
  • Loading branch information
NostraThomas99 authored Jun 3, 2024
2 parents ba9bcaf + fe10501 commit a1beedc
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 33 deletions.
2 changes: 1 addition & 1 deletion RotationSolver.Basic/Actions/BaseAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ public bool CanUse(out IAction act, bool skipStatusProvideCheck = false, bool sk
&& IActionHelper.IsLastAction(IActionHelper.MovingActions)) return false; //No range actions after moving.

if (DataCenter.AverageTimeToKill < Config.TimeToKill) return false;
if (DataCenter.TimeToUntargetable < Config.TimeToUntargetable) return false;
if (DataCenter.AverageTimeToKill < Config.TimeToUntargetable) return false;

PreviewTarget = TargetInfo.FindTarget(skipAoeCheck, skipStatusProvideCheck);
if (PreviewTarget == null) return false;
Expand Down
33 changes: 23 additions & 10 deletions RotationSolver.Basic/DataCenter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -376,7 +376,23 @@ public static BattleChara? DispelTarget
public static BattleChara[] AllTargets => Svc.Objects.OfType<BattleChara>().GetObjectInRadius(30)
.Where(o => !o.IsDummy() || !Service.Config.DisableTargetDummys).ToArray();

public static uint[] TreasureCharas { get; internal set; } = [];
public static uint[] TreasureCharas
{
get
{
List<uint> charas = new(5);
//60687 - 60691 For treasure hunt.
for (int i = 60687; i <= 60691; i++)
{
var b = AllTargets.FirstOrDefault(obj => obj.GetNamePlateIcon() == i);
if (b == null || b.CurrentHp == 0) continue;
charas.Add(b.ObjectId);
}

return charas.ToArray();
}
}

public static bool HasHostilesInRange => NumberOfHostilesInRange > 0;
public static bool HasHostilesInMaxRange => NumberOfHostilesInMaxRange > 0;
public static int NumberOfHostilesInRange => AllHostileTargets.Count(o => o.DistanceToPlayer() <= JobRange);
Expand Down Expand Up @@ -410,15 +426,14 @@ public static float AverageTimeToKill
{
get
{
return DataCenter.AllHostileTargets.Select(b => b.GetTimeToKill()).Where(v => !float.IsNaN(v)).Average();
var validTimes = AllHostileTargets.Select(b => b.GetTimeToKill()).Where(v => !float.IsNaN(v)).ToList();
return validTimes.Any() ? validTimes.Average() : 0;
}
}

public static float TimeToUntargetable { get; private set; }
public static bool IsHostileCastingAOE => IsCastingAreaVfx() || AllHostileTargets.Any(IsHostileCastingArea);

public static bool IsHostileCastingAOE => IsCastingAreaVfx() || DataCenter.AllHostileTargets.Any(IsHostileCastingArea);

public static bool IsHostileCastingToTank => IsCastingTankVfx() || DataCenter.AllHostileTargets.Any(IsHostileCastingTank);
public static bool IsHostileCastingToTank => IsCastingTankVfx() || AllHostileTargets.Any(IsHostileCastingTank);

public static bool HasPet
{
Expand Down Expand Up @@ -465,9 +480,9 @@ private static float GetPartyMemberHPRatio(BattleChara member)
}

public static IEnumerable<float> PartyMembersHP => RefinedHP.Values.Where(r => r > 0);
public static float PartyMembersMinHP => PartyMembersHP.Any() ? DataCenter.PartyMembersHP.Min() : 0;
public static float PartyMembersMinHP => PartyMembersHP.Any() ? PartyMembersHP.Min() : 0;
public static float PartyMembersAverHP => PartyMembersHP.Average();
public static float PartyMembersDifferHP => (float)Math.Sqrt(DataCenter.PartyMembersHP.Average(d => Math.Pow(d - DataCenter.PartyMembersAverHP, 2)));
public static float PartyMembersDifferHP => (float)Math.Sqrt(PartyMembersHP.Average(d => Math.Pow(d - PartyMembersAverHP, 2)));

public static bool HPNotFull => PartyMembersMinHP < 1;

Expand Down Expand Up @@ -516,8 +531,6 @@ public static float DPSTaken

public static ActionID LastAbility { get; private set; } = 0;

public const float DefaultAnimationLock = 0.6f;

internal static unsafe void AddActionRec(Action act)
{
if (!Player.Available) return;
Expand Down
2 changes: 0 additions & 2 deletions RotationSolver/Updaters/SocialUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,6 @@ internal static void Enable()

static async void DutyState_DutyCompleted(object? sender, ushort e)
{
if (DataCenter.PartyMembers.Length < 2) return;

await Task.Delay(new Random().Next(4000, 6000));

Service.Config.DutyEnd.AddMacro();
Expand Down
25 changes: 5 additions & 20 deletions RotationSolver/Updaters/TargetUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,14 @@ internal static partial class TargetUpdater
static readonly ObjectListDelay<BattleChara>
_raisePartyTargets = new(() => Service.Config.RaiseDelay),
_raiseAllTargets = new(() => Service.Config.RaiseDelay);
internal unsafe static void UpdateTarget()
internal static void UpdateTarget()
{
UpdateTimeToKill(DataCenter.AllHostileTargets);

UpdateNamePlate(DataCenter.AllTargets);
UpdateTimeToKill();
}

private static DateTime _lastUpdateTimeToKill = DateTime.MinValue;
private static readonly TimeSpan _timeToKillSpan = TimeSpan.FromSeconds(0.5);
private static void UpdateTimeToKill(IEnumerable<BattleChara> allTargets)
private static void UpdateTimeToKill()
{
var now = DateTime.Now;
if (now - _lastUpdateTimeToKill < _timeToKillSpan) return;
Expand All @@ -34,20 +32,7 @@ private static void UpdateTimeToKill(IEnumerable<BattleChara> allTargets)
DataCenter.RecordedHP.Dequeue();
}

DataCenter.RecordedHP.Enqueue((now, new SortedList<uint, float>(allTargets.Where(b => b != null && b.CurrentHp != 0).ToDictionary(b => b.ObjectId, b => b.GetHealthRatio()))));
}


private static void UpdateNamePlate(IEnumerable<BattleChara> allTargets)
{
List<uint> charas = new(5);
//60687 - 60691 For treasure hunt.
for (int i = 60687; i <= 60691; i++)
{
var b = allTargets.FirstOrDefault(obj => obj.GetNamePlateIcon() == i);
if (b == null || b.CurrentHp == 0) continue;
charas.Add(b.ObjectId);
}
DataCenter.TreasureCharas = [.. charas];
DataCenter.RecordedHP.Enqueue((now, new SortedList<uint, float>(DataCenter.AllTargets.Where(b => b != null && b.CurrentHp != 0).ToDictionary(b => b.ObjectId, b => b.GetHealthRatio()))));
}

}

0 comments on commit a1beedc

Please sign in to comment.