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

Commit

Permalink
fix: add hp check, make healing more precise.
Browse files Browse the repository at this point in the history
  • Loading branch information
ArchiDog1998 committed Apr 25, 2023
1 parent f36fd13 commit 9acae08
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 1 deletion.
16 changes: 15 additions & 1 deletion RotationSolver/Updaters/TargetUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,9 @@ private unsafe static void UpdateFriends(IEnumerable<BattleChara> allTargets)
DataCenter.WeakenPeople.Delay(DataCenter.PartyMembers.Where(p => p.StatusList.Any(StatusHelper.CanDispel)));
DataCenter.DyingPeople.Delay(DataCenter.WeakenPeople.Where(p => p.StatusList.Any(StatusHelper.IsDangerous)));

DataCenter.PartyMembersHP = DataCenter.PartyMembers.Select(ObjectHelper.GetHealthRatio).Where(r => r > 0);
DataCenter.PartyMembersHP = DataCenter.PartyMembers
.Where(p => p.DistanceToPlayer() <= 30)
.Select(GetPartyMemberHPRatio).Where(r => r > 0);
if (DataCenter.PartyMembersHP.Any())
{
DataCenter.PartyMembersAverHP = DataCenter.PartyMembersHP.Average();
Expand All @@ -240,6 +242,18 @@ private unsafe static void UpdateFriends(IEnumerable<BattleChara> allTargets)
UpdateCanHeal(Service.Player);
}

private static float GetPartyMemberHPRatio(BattleChara member)
{
if((DateTime.Now - Watcher.HealTime).TotalSeconds > 0.5
|| !Watcher.HealHP.TryGetValue(member.ObjectId, out var hp))
{
return member.GetHealthRatio();
}

return member.CurrentHp == 0 ? 0
: Math.Min(1, (hp + member.CurrentHp) / (float)member.MaxHp);
}


private static IEnumerable<BattleChara> GetPartyMembers(IEnumerable<BattleChara> allTargets)
{
Expand Down
6 changes: 6 additions & 0 deletions RotationSolver/Watcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ public class Watcher : IDisposable
[Signature("4C 89 44 24 ?? 55 56 41 54 41 55 41 56", DetourName = nameof(ReceiveAbilityEffect))]
private static Hook<ReceiveAbilityDelegate> _receiveAbilityHook;

public static DateTime HealTime { get; private set; } = DateTime.Now;
public static Dictionary<uint, ushort> HealHP { get; private set; } = new Dictionary<uint, ushort>();
public Watcher()
{
SignatureHelper.Initialise(this);
Expand Down Expand Up @@ -87,6 +89,10 @@ private static void ActionFromSelf(uint sourceId, ActionEffectSet set, uint id)

if (tar == null || action == null) return;

HealHP = set.TargetEffects.Where(e => e[0].Type == ActionEffectType.Heal).ToDictionary(e =>
e.Target.ObjectId, e => e[0].Value);
HealTime = DateTime.Now;

//Record
DataCenter.AddActionRec(set.Action);
ShowStrSelf = set.ToString();
Expand Down

0 comments on commit 9acae08

Please sign in to comment.