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% condition, add MapEffect condition.
Browse files Browse the repository at this point in the history
  • Loading branch information
ArchiDog1998 committed Oct 31, 2023
1 parent b692be9 commit f05db68
Show file tree
Hide file tree
Showing 9 changed files with 122 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,10 @@ protected override bool IsTrueInside(ICustomRotation rotation)
result = tar.CurrentHp > GCD;
break;

case TargetConditionType.HPRatio:
result = tar.GetHealthRatio() > DistanceOrTime;
break;

case TargetConditionType.MP:
result = tar.CurrentMp > GCD;
break;
Expand Down Expand Up @@ -132,6 +136,7 @@ internal enum TargetConditionType : byte
CastingActionTimeUntil,
TimeToKill,
HP,
HPRatio,
MP,
TargetName,
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,45 @@ internal class TerritoryCondition : DelayCondition
{
public TerritoryConditionType TerritoryConditionType = TerritoryConditionType.TerritoryContentType;

public int Param1 = 0;
public int Position = 0;
public int Param1 = 0, Param2 = 0;
public string Name = "Not Chosen";
public int Condition;
public float TimeStart, TimeEnd;

protected override bool IsTrueInside(ICustomRotation rotation)
{
bool result = TerritoryConditionType switch
bool result = false;
switch (TerritoryConditionType)
{
TerritoryConditionType.TerritoryContentType => (int)DataCenter.TerritoryContentType == Param1,
TerritoryConditionType.DutyName => Name == DataCenter.ContentFinderName,
TerritoryConditionType.TerritoryName => Name == DataCenter.TerritoryName,
_ => false,
};
case TerritoryConditionType.TerritoryContentType:
result = (int)DataCenter.TerritoryContentType == Param1;
break;

case TerritoryConditionType.DutyName:
result = Name == DataCenter.ContentFinderName;
break;

case TerritoryConditionType.TerritoryName:
result= Name == DataCenter.TerritoryName;
break;

case TerritoryConditionType.MapEffect:
foreach (var effect in DataCenter.MapEffects.Reverse())
{
var time = effect.TimeDuration.TotalSeconds;
if ( time > TimeStart && time < TimeEnd
&& effect.Position == Position
&& effect.Param1 == Param1
&& effect.Param2 == Param2)
{
result = true;
break;
}
}

break;
}
return Condition > 0 ? !result : result;
}
}
Expand All @@ -26,4 +52,5 @@ internal enum TerritoryConditionType : byte
TerritoryContentType,
TerritoryName,
DutyName,
MapEffect,
}
20 changes: 20 additions & 0 deletions RotationSolver.Basic/Data/MapEffectData.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace RotationSolver.Basic.Data;

public readonly struct MapEffectData
{
public readonly uint Position;

public readonly ushort Param1, Param2;

public readonly DateTime Time;

public readonly TimeSpan TimeDuration => DateTime.Now - Time;

public MapEffectData(uint position, ushort param1, ushort param2)
{
Time = DateTime.Now;
Position = position;
Param1 = param1;
Param2 = param2;
}
}
6 changes: 5 additions & 1 deletion RotationSolver.Basic/DataCenter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ namespace RotationSolver.Basic;

internal static class DataCenter
{
internal static Queue<MapEffectData> MapEffects { get; } = new(64);

/// <summary>
/// This one never be null.
/// </summary>
Expand Down Expand Up @@ -449,13 +451,15 @@ internal static unsafe void AddActionRec(Action act)
_actions.Enqueue(new ActionRec(_timeLastActionUsed, act));
}

internal static void ResetAllLastActions()
internal static void ResetAllRecords()
{
LastAction = 0;
LastGCD = 0;
LastAbility = 0;
_timeLastActionUsed = DateTime.Now;
_actions.Clear();

DataCenter.MapEffects.Clear();
}

internal static void AddDamageRec(float damageRatio)
Expand Down
1 change: 1 addition & 0 deletions RotationSolver/Localization/EnumTranslations.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ internal static class EnumTranslations
TargetConditionType.CastingActionTimeUntil => LocalizationManager.RightLang.TargetConditionType_CastingActionTimeUntil,
TargetConditionType.TimeToKill => LocalizationManager.RightLang.TargetConditionType_TimeToKill,
TargetConditionType.HP => LocalizationManager.RightLang.TargetConditionType_HP,
TargetConditionType.HPRatio => LocalizationManager.RightLang.TargetConditionType_HPRatio,
TargetConditionType.MP => LocalizationManager.RightLang.TargetConditionType_MP,
TargetConditionType.TargetName => LocalizationManager.RightLang.TargetConditionType_TargetName,
_ => string.Empty,
Expand Down
1 change: 1 addition & 0 deletions RotationSolver/Localization/Strings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,7 @@ internal class Strings
public string TargetConditionType_CastingAction { get; set; } = "Casting Action";
public string TargetConditionType_CastingActionTimeUntil { get; set; } = "Casting Action Time Until";
public string TargetConditionType_HP { get; set; } = "HP";
public string TargetConditionType_HPRatio { get; set; } = "HP%";
public string TargetConditionType_MP { get; set; } = "MP";
public string TargetConditionType_TargetName { get; set; } = "Target Name";

Expand Down
44 changes: 43 additions & 1 deletion RotationSolver/UI/ConditionDrawer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -899,6 +899,12 @@ void DrawStatusIcon()
ImGui.DragFloat($"s##CastingActionTimeUntil{targetCondition.GetHashCode()}", ref targetCondition.DistanceOrTime, .1f);
break;

case TargetConditionType.HPRatio:
ImGui.SameLine();
ImGui.SetNextItemWidth(Math.Max(150 * ImGuiHelpers.GlobalScale, ImGui.CalcTextSize(targetCondition.DistanceOrTime.ToString()).X));
ImGui.DragFloat($"##HPRatio{targetCondition.GetHashCode()}", ref targetCondition.DistanceOrTime, .1f);
break;

case TargetConditionType.MP:
case TargetConditionType.HP:
ImGui.SameLine();
Expand Down Expand Up @@ -929,7 +935,7 @@ void DrawStatusIcon()
public static string[] DutyNames => _dutyNames ??= new HashSet<string>(Service.GetSheet<ContentFinderCondition>()?
.Select(t => t?.Name?.RawString ?? string.Empty).Where(s => !string.IsNullOrEmpty(s)).Reverse()).ToArray();

private static void DrawAfter(this TerritoryCondition territoryCondition, ICustomRotation rotation)
private static void DrawAfter(this TerritoryCondition territoryCondition, ICustomRotation _)
{
DrawByteEnum($"##Category{territoryCondition.GetHashCode()}", ref territoryCondition.TerritoryConditionType, EnumTranslations.ToName);

Expand Down Expand Up @@ -970,6 +976,42 @@ private static void DrawAfter(this TerritoryCondition territoryCondition, ICusto
territoryCondition.Name = i;
}, LocalizationManager.RightLang.ConfigWindow_Condition_DutyName);
break;

case TerritoryConditionType.MapEffect:
ImGui.SameLine();

ImGui.Text("Pos:");
ImGui.SameLine();
ImGui.SetNextItemWidth(Math.Max(150 * ImGuiHelpers.GlobalScale, ImGui.CalcTextSize(territoryCondition.Position.ToString()).X));
ImGui.DragInt($"##Position{territoryCondition.GetHashCode()}", ref territoryCondition.Position, .1f);

ImGui.SameLine();

ImGui.Text("Param1:");
ImGui.SameLine();
ImGui.SetNextItemWidth(Math.Max(150 * ImGuiHelpers.GlobalScale, ImGui.CalcTextSize(territoryCondition.Param1.ToString()).X));
ImGui.DragInt($"##Param1{territoryCondition.GetHashCode()}", ref territoryCondition.Param1, .1f);

ImGui.SameLine();

ImGui.Text("Param2:");
ImGui.SameLine();
ImGui.SetNextItemWidth(Math.Max(150 * ImGuiHelpers.GlobalScale, ImGui.CalcTextSize(territoryCondition.Param2.ToString()).X));
ImGui.DragInt($"##Param2{territoryCondition.GetHashCode()}", ref territoryCondition.Param2, .1f);

ImGui.SameLine();

ImGui.Text("Time Offset:");
ImGui.SameLine();
const float MIN = 0, MAX = 60;

ImGui.SetNextItemWidth(150 * ImGuiHelpers.GlobalScale);
if (ImGui.DragFloatRange2($"##TimeOffset {territoryCondition.GetHashCode()}", ref territoryCondition.TimeStart, ref territoryCondition.TimeEnd, 0.1f, MIN, MAX))
{
territoryCondition.TimeStart = Math.Max(Math.Min(territoryCondition.TimeStart, territoryCondition.TimeEnd), MIN);
territoryCondition.TimeEnd = Math.Min(Math.Max(territoryCondition.TimeStart, territoryCondition.TimeEnd), MAX);
}
break;
}
}
#endregion
Expand Down
4 changes: 2 additions & 2 deletions RotationSolver/Updaters/SocialUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ static async void DutyState_DutyCompleted(object sender, ushort e)

static void ClientState_TerritoryChanged(ushort id)
{
DataCenter.ResetAllLastActions();
DataCenter.ResetAllRecords();

var territory = Service.GetSheet<TerritoryType>().GetRow(id);
_canSaying = territory?.ContentFinderCondition?.Value?.RowId != 0;
Expand Down Expand Up @@ -109,7 +109,7 @@ static void DutyState_DutyStarted(object sender, ushort e)
static void DutyState_DutyWiped(object sender, ushort e)
{
if (!Player.Available) return;
DataCenter.ResetAllLastActions();
DataCenter.ResetAllRecords();
}

internal static void Disable()
Expand Down
12 changes: 11 additions & 1 deletion RotationSolver/Watcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public static class Watcher
private static Dalamud.Hooking.Hook<OnUseAction> _useActionHook;
#endif

public static ICallGateSubscriber<object, object> IpcSubscriber;
private static ICallGateSubscriber<object, object> IpcSubscriber;

public static void Enable()
{
Expand All @@ -34,6 +34,15 @@ public static void Enable()

ActionEffect.ActionEffectEvent += ActionFromEnemy;
ActionEffect.ActionEffectEvent += ActionFromSelf;
MapEffect.Init((a1, position, param1, param2) =>
{
if(DataCenter.MapEffects.Count >= 64)
{
DataCenter.MapEffects.TryDequeue(out _);
}

DataCenter.MapEffects.Enqueue(new MapEffectData(position, param1, param2));
});
}

public static void Disable()
Expand All @@ -42,6 +51,7 @@ public static void Disable()
_useActionHook?.Dispose();
#endif
IpcSubscriber.Unsubscribe(UpdateRTTDetour);
MapEffect.Dispose();
ActionEffect.ActionEffectEvent -= ActionFromEnemy;
ActionEffect.ActionEffectEvent -= ActionFromSelf;
}
Expand Down

0 comments on commit f05db68

Please sign in to comment.