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

Commit

Permalink
fix: add addedCombatant feature for timeraid.
Browse files Browse the repository at this point in the history
  • Loading branch information
ArchiDog1998 committed Mar 2, 2024
1 parent ffcd482 commit 69249b3
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 3 deletions.
4 changes: 4 additions & 0 deletions RotationSolver.Basic/Data/TimelineItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ internal enum TimelineType : byte
StartsUsing,
SystemLogMessage,
ActorControl,
AddedCombatant,
}

internal readonly struct TimelineItem(float time, string name, TimelineType type, JObject? obj, RaidLangs langs, float? jumpTime, float windowMin, float windowMax)
Expand Down Expand Up @@ -141,6 +142,9 @@ private static TimelineType GetTypeFromName(string type)
case "SystemLogMessage":
return TimelineType.SystemLogMessage;

case "AddedCombatant":
return TimelineType.AddedCombatant;

default:
#if DEBUG
Svc.Log.Warning($"New timelinetype: {type}");
Expand Down
47 changes: 44 additions & 3 deletions RotationSolver/Updaters/RaidTimeUpdater.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
using ECommons.DalamudServices;
using Dalamud.Game.ClientState.Objects.SubKinds;
using ECommons.DalamudServices;
using Lumina.Excel.GeneratedSheets;
using Newtonsoft.Json.Linq;
using RotationSolver.Basic.Configuration.Timeline;
using RotationSolver.UI;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Xml.Linq;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace RotationSolver.Updaters;
Expand All @@ -21,6 +24,42 @@ public static string GetLink(uint id)
}

internal static void UpdateTimeline()
{
UpdateTimelineEvent();
UpdateTimelineAddCombat();
}

static readonly Dictionary<uint, bool> _isInCombat = [];
private static void UpdateTimelineAddCombat()
{
if (DataCenter.TimelineItems.Length == 0) return;
foreach (var obj in Svc.Objects.OfType<BattleChara>())
{
if (obj is PlayerCharacter) continue;
var id = obj.ObjectId;
var newInCombat = obj.InCombat();

if (_isInCombat.TryGetValue(id, out var inCombat)
&& !inCombat && newInCombat)
{
var name = GetNameFromObjectId(id);

foreach (var item in DataCenter.TimelineItems)
{
if (!item.IsInWindow) continue;
if (item.Type is not TimelineType.AddedCombatant) continue;

if (!item["name", name]) continue;

item.UpdateRaidTimeOffset();
break;
}
}
_isInCombat[id] = newInCombat;
}
}

private static void UpdateTimelineEvent()
{
if (!Service.Config.Timeline.TryGetValue(Svc.ClientState.TerritoryType, out var timeline)) return;

Expand Down Expand Up @@ -64,6 +103,7 @@ internal static void UpdateTimeline()
#endif
}
}

}

internal static async void EnableAsync()
Expand Down Expand Up @@ -269,6 +309,7 @@ private static string GetNameFromObjectId(uint id)

private static async void ClientState_TerritoryChanged(ushort id)
{
_isInCombat.Clear();
if (PathForRaids.ContainsKey(id))
{
RotationConfigWindow._territoryId = id;
Expand Down Expand Up @@ -344,7 +385,7 @@ static async Task<TimelineItem[]> DownloadRaidTimeAsync(string path, RaidLangs l
var str = await message.Content.ReadAsStringAsync();

var result = new List<TimelineItem>();
var matches = TimeLineItem().Matches(str).Cast<Match>();
var matches = str.Split('\n').Select(s => TimeLineItem().Match(s)).Cast<Match>();
var dict = new Dictionary<string, float>();

foreach (var timelineItem in matches)
Expand Down Expand Up @@ -449,7 +490,7 @@ static async Task<TimelineItem[]> DownloadRaidTimeAsync(string path, RaidLangs l
[GeneratedRegex(" .*? {")]
private static partial Regex Type();

[GeneratedRegex("[\\d\\.]+.*")]
[GeneratedRegex("^[\\d\\.]+.*")]
private static partial Regex TimeLineItem();

[GeneratedRegex("^[\\d\\.]+")]
Expand Down

0 comments on commit 69249b3

Please sign in to comment.