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

Commit

Permalink
fix: timeline check.
Browse files Browse the repository at this point in the history
  • Loading branch information
ArchiDog1998 committed Mar 1, 2024
1 parent 74e2afe commit 0a5f5a8
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 112 deletions.
67 changes: 53 additions & 14 deletions RotationSolver.Basic/Data/TimelineItem.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using ECommons.DalamudServices;
using Newtonsoft.Json.Linq;
using System.Text.RegularExpressions;
using static Dalamud.Interface.Utility.Raii.ImRaii;

namespace RotationSolver.Basic.Data;
internal enum TimelineType : byte
Expand All @@ -14,7 +15,7 @@ internal enum TimelineType : byte
ActorControl,
}

internal readonly struct TimelineItem(float time, string name, TimelineType type, string[] ids, JObject? obj, RaidLangs langs)
internal readonly struct TimelineItem(float time, string name, TimelineType type, JObject? obj, RaidLangs langs)
{
private RaidLangs.Lang Lang
{
Expand Down Expand Up @@ -51,21 +52,64 @@ public string Name

public bool IsShown => Name is not "--Reset--" and not "--sync--";

public string this[string propertyName]
public bool this[string propertyName, uint matchValue]
=> this[propertyName, matchValue.ToString("X")];

public bool this[string propertyName, string matchString]
{
get
{
var prop = Object?[propertyName]?.ToString() ?? string.Empty;
foreach (var pair in Lang.replaceSync)
foreach (var str in this[propertyName])
{
prop = prop.Replace(pair.Key, pair.Value);
var prop = str;
if (new Regex(prop).IsMatch(matchString))
{
return true;
}
}
return prop;

return false;
}
}

public TimelineItem(float time, string name, string type, string[] ids, JObject? obj, RaidLangs langs)
: this(time, name, GetTypeFromName(type), ids, obj, langs)
public string[] this[string propertyName]
{
get
{
string[] strings = [];

var strRelay = Object?[propertyName];

if (strRelay == null) return [];

if (strRelay is JArray array)
{
strings = [.. array.Select(i => i.ToString())];
}
else
{
strings = [strRelay?.ToString() ?? string.Empty];
}

var list = new List<string>(strings.Length);
foreach (var str in strings)
{
if (string.IsNullOrEmpty(str)) continue;

var prop = str;

foreach (var pair in Lang.replaceSync)
{
prop = prop.Replace(pair.Key, pair.Value);
}
list.Add(prop);
}
return [.. list];
}
}

public TimelineItem(float time, string name, string type, JObject? obj, RaidLangs langs)
: this(time, name, GetTypeFromName(type), obj, langs)
{

}
Expand Down Expand Up @@ -123,19 +167,14 @@ public void UpdateRaidTimeOffset()
}
}

public bool IsIdMatched(uint id)
{
return ids.Any(i => new Regex(i).IsMatch(id.ToString("X")));
}

public override string ToString()
{
return $"""
IsShown: {IsShown},
Time: {Time},
Name: {Name},
Type: {Type},
Ids: {string.Join(", ", ids)}
Ids: {string.Join(", ", this["id"])}
""";
}
}
2 changes: 1 addition & 1 deletion RotationSolver.Basic/Rotations/CustomRotation_Ability.cs
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ private bool GeneralUsingAbility(JobRole role, out IAction? act)
/// </summary>
/// <param name="nextGCD">The next gcd action.</param>
/// <param name="act">Result action.</param>
/// <returns>Can we use it.</returns>
//<returns>Can we use it.</returns>
protected virtual bool EmergencyAbility(IAction nextGCD, out IAction? act)
{
if (nextGCD is BaseAction action)
Expand Down
141 changes: 44 additions & 97 deletions RotationSolver/Updaters/RaidTimeUpdater.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
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;

namespace RotationSolver.Updaters;
internal static partial class RaidTimeUpdater
Expand Down Expand Up @@ -114,21 +117,23 @@ private static void DutyState_DutyWiped(object? sender, ushort e)

private static void Chat_ChatMessage(Dalamud.Game.Text.XivChatType type, uint senderId, ref Dalamud.Game.Text.SeStringHandling.SeString sender, ref Dalamud.Game.Text.SeStringHandling.SeString message, ref bool isHandled)
{
var name = GetNameFromObjectId(senderId);

#if DEBUG
//Svc.Log.Debug(sender.TextValue.ToString());
#endif

foreach (var item in DataCenter.TimelineItems)
{
if (item.IsShown) continue;
if (item.Time < DataCenter.RaidTimeRaw) continue;
if (item.Type is not TimelineType.GameLog) continue;

var typeString = ((uint)type).ToString("X4");
if (!new Regex(item["code"]).IsMatch(typeString)) continue;
if (!item["code", typeString]) continue;
if (!item["name", name]) continue;
if (!item["line", message.TextValue]) continue;

//if (!new Regex(item["name"]).IsMatch(sender.TextValue)) continue;

if (!new Regex(item["line"]).IsMatch(message.TextValue)) continue;
item.UpdateRaidTimeOffset();
break;
}
Expand Down Expand Up @@ -162,15 +167,16 @@ private static void GameNetwork_NetworkMessage(nint dataPtr, ushort opCode, uint

private static void OnCast(IntPtr dataPtr, uint targetActorId)
{
var name = Svc.Objects.SearchById(targetActorId)?.Name.TextValue ?? string.Empty;
var name = GetNameFromObjectId(targetActorId);

foreach (var item in DataCenter.TimelineItems)
{
if (item.IsShown) continue;
if (item.Time < DataCenter.RaidTimeRaw) continue;
if (item.Type is not TimelineType.StartsUsing) continue;
if (!item.IsIdMatched(ReadUshort(dataPtr, 0))) continue;
if (!new Regex(item["source"]).IsMatch(name)) continue;

if (!item["id", ReadUshort(dataPtr, 0)]) continue;
if (!item["source", name]) continue;

item.UpdateRaidTimeOffset();
break;
Expand All @@ -179,14 +185,16 @@ private static void OnCast(IntPtr dataPtr, uint targetActorId)

private static void OnEffect(IntPtr dataPtr, uint targetActorId)
{
var name = Svc.Objects.SearchById(targetActorId)?.Name.TextValue ?? string.Empty;
var name = GetNameFromObjectId(targetActorId);

foreach (var item in DataCenter.TimelineItems)
{
if (item.IsShown) continue;
if (item.Time < DataCenter.RaidTimeRaw) continue;
if (item.Type is not TimelineType.Ability) continue;

if (!item.IsIdMatched(ReadUint(dataPtr, 28))) continue;
if (!new Regex(item["source"]).IsMatch(name) && item.IsShown) continue; //Maybe this is not correct.
if (!item["id", ReadUint(dataPtr, 28)]) continue;
if (!item["source", name]) continue;

item.UpdateRaidTimeOffset();
break;
Expand All @@ -201,50 +209,11 @@ private static void OnActorControl(IntPtr dataPtr)
if (item.Time < DataCenter.RaidTimeRaw) continue;
if (item.Type is not TimelineType.ActorControl) continue;

var command = item["command"];
if (!string.IsNullOrEmpty(command))
{
if (!new Regex(command).IsMatch(ReadUint(dataPtr, 8).ToString("X")))
{
continue;
}
}

var data0 = item["data0"];
if (!string.IsNullOrEmpty(data0))
{
if (!new Regex(data0).IsMatch(ReadUshort(dataPtr, 12).ToString("X")))
{
continue;
}
}

var data1 = item["data1"];
if (!string.IsNullOrEmpty(data1))
{
if (!new Regex(data1).IsMatch(ReadUshort(dataPtr, 14).ToString("X")))
{
continue;
}
}

var data2 = item["data2"];
if (!string.IsNullOrEmpty(data2))
{
if (!new Regex(data2).IsMatch(ReadUshort(dataPtr, 16).ToString("X")))
{
continue;
}
}

var data3 = item["data3"];
if (!string.IsNullOrEmpty(data3))
{
if (!new Regex(data3).IsMatch(ReadUshort(dataPtr, 18).ToString("X")))
{
continue;
}
}
if (!item["command", ReadUint(dataPtr, 8)]) continue;
if (!item["data0", ReadUshort(dataPtr, 12)]) continue;
if (!item["data1", ReadUshort(dataPtr, 14)]) continue;
if (!item["data2", ReadUshort(dataPtr, 16)]) continue;
if (!item["data3", ReadUshort(dataPtr, 18)]) continue;

item.UpdateRaidTimeOffset();
break;
Expand All @@ -258,34 +227,12 @@ private static void OnSystemLogMessage(IntPtr dataPtr)
if (item.IsShown) continue;
if (item.Time < DataCenter.RaidTimeRaw) continue;
if (item.Type is not TimelineType.SystemLogMessage) continue;
if (!item.IsIdMatched(ReadUint(dataPtr, 4))) continue;

var param0 = item["param0"];
if (!string.IsNullOrEmpty(param0))
{
if (!new Regex(param0).IsMatch(ReadUint(dataPtr, 8).ToString("X")))
{
continue;
}
}

var param1 = item["param1"];
if (!string.IsNullOrEmpty(param1))
{
if (!new Regex(param1).IsMatch(ReadUint(dataPtr, 12).ToString("X")))
{
continue;
}
}
if (!item["id", ReadUint(dataPtr, 4)]) continue;
if (!item["param0", ReadUint(dataPtr, 8)]) continue;
if (!item["param1", ReadUint(dataPtr, 12)]) continue;
if (!item["param2", ReadUint(dataPtr, 16)]) continue;

var param2 = item["param2"];
if (!string.IsNullOrEmpty(param2))
{
if (!new Regex(param2).IsMatch(ReadUint(dataPtr, 16).ToString("X")))
{
continue;
}
}
item.UpdateRaidTimeOffset();
break;
}
Expand All @@ -301,6 +248,21 @@ private unsafe static uint ReadUint(IntPtr dataPtr, int offset)
return *(uint*)(dataPtr + offset);
}

private static string GetNameFromObjectId(uint id)
{
var obj = Svc.Objects.SearchById(id);
var nameId = obj is BattleChara battle ? battle.NameId : 0;
var name = Svc.Data.GetExcelSheet<BNpcName>()?.GetRow(nameId)?.Singular.RawString;

if (!string.IsNullOrEmpty(name)) return name;

#if DEBUG
return "Failed to find the NPC name!";
#else
return obj?.Name.TextValue ?? string.Empty;
#endif
}

private static async void ClientState_TerritoryChanged(ushort id)
{
if (PathForRaids.ContainsKey(id))
Expand Down Expand Up @@ -393,22 +355,7 @@ static async Task<TimelineItem[]> DownloadRaidTimeAsync(string path, RaidLangs l

var timelineStr = ActionGetter().Match(timeline).Value;

JObject? item = null;
string[] ids = [];
if (!string.IsNullOrEmpty(timelineStr))
{
item = JObject.Parse(timelineStr);

var id = item["id"];
if (id is JArray array)
{
ids = [.. array.Select(i => i.ToString())];
}
else
{
ids = [id?.ToString() ?? string.Empty];
}
}
var item = string.IsNullOrEmpty(timelineStr) ? null : JObject.Parse(timelineStr);

var rest = timeline[header.Length..];
var type = Type().Match(rest)?.Value ?? string.Empty;
Expand All @@ -417,7 +364,7 @@ static async Task<TimelineItem[]> DownloadRaidTimeAsync(string path, RaidLangs l
type = type[1..^2].Split(' ').LastOrDefault() ?? string.Empty;
}

result.Add(new (time, name, type, ids, item, lang));
result.Add(new (time, name, type, item, lang));
}
catch (Exception ex)
{
Expand Down

0 comments on commit 0a5f5a8

Please sign in to comment.