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

Commit

Permalink
fix: delay healing.
Browse files Browse the repository at this point in the history
  • Loading branch information
ArchiDog1998 committed Jan 31, 2023
1 parent 866f0b0 commit e746d62
Show file tree
Hide file tree
Showing 7 changed files with 31 additions and 17 deletions.
3 changes: 3 additions & 0 deletions RotationSolver/Configuration/PluginConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,9 @@ public class PluginConfiguration : IPluginConfiguration
public float HostileDelayMin = 0;
public float HostileDelayMax = 0;

public float HealDelayMin = 0;
public float HealDelayMax = 0;

public string PositionalErrorText = string.Empty;

public int MoveTargetAngle = 24;
Expand Down
20 changes: 10 additions & 10 deletions RotationSolver/Data/RandomDelay.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,37 +11,37 @@ internal struct RandomDelay
{
DateTime _startDelayTime = DateTime.MinValue;
float _delayTime = -1;
Func<bool> _getCheck;
Func<(float min, float max)> _getRange;
Random _ran = new Random(DateTime.Now.Millisecond);

public bool Check => _getCheck?.Invoke() ?? false;
public RandomDelay(Func<bool> getCheck, Func<(float min, float max)> getRange)
bool _lastValue = false;
public RandomDelay(Func<(float min, float max)> getRange)
{
_getCheck = getCheck;
_getRange = getRange;
}

public bool Update()
public bool Delay(bool originData)
{
if(_getCheck == null || _getRange == null) return false;
if(_getRange == null) return false;

if (!Check)
if (!originData)
{
_lastValue = false;
_delayTime = -1;
return false;
}

//Not start
if (_delayTime < 0)
//Not start And changed.
if (_delayTime < 0 && !_lastValue)
{
_lastValue = true;
_startDelayTime = DateTime.Now;
var range = _getRange();
_delayTime = range.min + (float)_ran.NextDouble() * (range.max - range.min);
}
//Times up
else if ((DateTime.Now - _startDelayTime).TotalSeconds >= _delayTime)
{
//I set it.
_delayTime = -1;
return true;
}
Expand Down
6 changes: 3 additions & 3 deletions RotationSolver/Helpers/TargetFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ internal static BattleChara DefaultFindHostile(IEnumerable<BattleChara> availabl
.OrderBy(DistanceToPlayer).First();
}

internal static GameObject FindTargetForMoving(this IEnumerable<GameObject> charas, bool mustUse)
internal static T FindTargetForMoving<T>(this IEnumerable<T> charas, bool mustUse) where T : GameObject
{
if (mustUse)
{
Expand All @@ -78,7 +78,7 @@ internal static GameObject FindTargetForMoving(this IEnumerable<GameObject> char
}

const float DISTANCE_TO_MOVE = 3;
private static GameObject FindMoveTargetFaceDirection(IEnumerable<GameObject> charas)
private static T FindMoveTargetFaceDirection<T>(IEnumerable<T> charas) where T : GameObject
{
Vector3 pPosition = Service.ClientState.LocalPlayer.Position;
float rotation = Service.ClientState.LocalPlayer.Rotation;
Expand All @@ -97,7 +97,7 @@ private static GameObject FindMoveTargetFaceDirection(IEnumerable<GameObject> ch
return tars.FirstOrDefault();
}

private static GameObject FindMoveTargetScreenCenter(IEnumerable<GameObject> charas)
private static T FindMoveTargetScreenCenter<T>(IEnumerable<T> charas) where T : GameObject
{
var pPosition = Service.ClientState.LocalPlayer.Position;
if (!Service.GameGui.WorldToScreen(pPosition, out var playerScrPos)) return null;
Expand Down
1 change: 1 addition & 0 deletions RotationSolver/Rotations/Basic/DRK_Base.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Dalamud.Game.ClientState.JobGauge.Types;
using Dalamud.Game.ClientState.Objects.Types;
using RotationSolver.Actions;
using RotationSolver.Actions.BaseAction;
using RotationSolver.Data;
Expand Down
1 change: 1 addition & 0 deletions RotationSolver/Rotations/Basic/GNB_Base.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Dalamud.Game.ClientState.JobGauge.Types;
using Dalamud.Game.ClientState.Objects.Types;
using RotationSolver.Actions;
using RotationSolver.Actions.BaseAction;
using RotationSolver.Data;
Expand Down
8 changes: 4 additions & 4 deletions RotationSolver/Updaters/ActionUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,7 @@ public static TimeSpan CombatTime
}
}

private static RandomDelay _GCDDelay = new RandomDelay(() => WeaponRemain <= Service.Configuration.WeaponFaster,
() => (Service.Configuration.WeaponDelayMin, Service.Configuration.WeaponDelayMax));
private static RandomDelay _GCDDelay = new RandomDelay(() => (Service.Configuration.WeaponDelayMin, Service.Configuration.WeaponDelayMax));

internal static float WeaponRemain { get; private set; } = 0;

Expand Down Expand Up @@ -188,9 +187,10 @@ internal unsafe static void DoAction()
|| *(bool*)((IntPtr)ActionManager.Instance() + 0x68)) return;

//GCD
if (_GCDDelay.Check)
var canUseGCD = WeaponRemain <= Service.Configuration.WeaponFaster;
if (canUseGCD)
{
if (_GCDDelay.Update()) RSCommands.DoAnAction(true);
if (_GCDDelay.Delay(canUseGCD)) RSCommands.DoAnAction(true);
return;
}

Expand Down
9 changes: 9 additions & 0 deletions RotationSolver/Updaters/TargetUpdater_Friends.cs
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,9 @@ private unsafe static void UpdateFriends(IEnumerable<BattleChara> allTargets)
#endregion
}

private static RandomDelay _healDelay = new RandomDelay(() => (Service.Configuration.HealDelayMin, Service.Configuration.HealDelayMax));


static void UpdateCanHeal(PlayerCharacter player)
{
var job = (ClassJobID)player.ClassJob.Id;
Expand All @@ -165,6 +168,12 @@ static void UpdateCanHeal(PlayerCharacter player)
CanHealAreaSpell = PartyMembersDifferHP < Service.Configuration.HealthDifference && PartyMembersAverHP < ConfigurationHelper.GetHealAreafSpell(job) - ratio;
}

//Delay
CanHealSingleAbility = _healDelay.Delay(CanHealSingleAbility);
CanHealSingleSpell = _healDelay.Delay(CanHealSingleSpell);
CanHealAreaAbility = _healDelay.Delay(CanHealAreaAbility);
CanHealAreaSpell = _healDelay.Delay(CanHealAreaSpell);

PartyMembersMinHP = PartyMembersHP.Any() ? PartyMembersHP.Min() : 0;
HPNotFull = PartyMembersMinHP < 1;
}
Expand Down

0 comments on commit e746d62

Please sign in to comment.