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

Commit

Permalink
fix: add actor control watcher and make timeline as jobs.
Browse files Browse the repository at this point in the history
  • Loading branch information
ArchiDog1998 committed Feb 29, 2024
1 parent 071c14b commit 388d131
Show file tree
Hide file tree
Showing 10 changed files with 113 additions and 75 deletions.
2 changes: 1 addition & 1 deletion Resources/RotationSolverRecord.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"ClickingCount": 88321,
"SayingHelloCount": 96,
"SayingHelloCount": 103,
"SaidUsers": []
}
3 changes: 2 additions & 1 deletion RotationSolver.Basic/Configuration/Configs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -749,7 +749,8 @@ public const string

public Dictionary<uint, string> DutyRotationChoice { get; set; } = [];

public Dictionary<uint, Dictionary<float, List<ITimelineItem>>> Timeline { get; set; } = [];
[JobConfig]
private readonly Dictionary<uint, Dictionary<float, List<ITimelineItem>>> _timeline = [];

public void Save()
{
Expand Down
4 changes: 2 additions & 2 deletions RotationSolver.Basic/Data/TimelineItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ private RaidLangs.Lang Lang
{
var key = Svc.ClientState.ClientLanguage switch
{
Dalamud.ClientLanguage.English => "",
Dalamud.ClientLanguage.Japanese => "ja",
Dalamud.ClientLanguage.German => "de",
Dalamud.ClientLanguage.French => "fr",
(Dalamud.ClientLanguage)4 => "cn",
_ => "ko",
(Dalamud.ClientLanguage)5 => "ko",
_ => "",
};

if (langs.langs.TryGetValue(key, out var lang)) return lang;
Expand Down
4 changes: 1 addition & 3 deletions RotationSolver.Basic/Rotations/CustomRotation_GCD.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using ECommons.DalamudServices;

namespace RotationSolver.Basic.Rotations;
namespace RotationSolver.Basic.Rotations;

partial class CustomRotation
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ private void Execute(SourceProductionContext context, ImmutableArray<(VariableDe

var fieldTypeStr = field.Declaration.Type;
var fieldType = model.GetTypeInfo(fieldTypeStr).Type!;
var fieldStr = fieldTypeStr.ToString();
var fieldStr = fieldType.GetFullMetadataName();

var names = new List<string>();
foreach (var attrSet in field.AttributeLists)
Expand Down
2 changes: 1 addition & 1 deletion RotationSolver.SourceGenerators/JobConfigGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ private void Execute(SourceProductionContext context, ImmutableArray<(VariableDe

var fieldTypeStr = field.Declaration.Type;
var fieldType = model.GetTypeInfo(fieldTypeStr).Type!;
var fieldStr = fieldTypeStr.ToString();
var fieldStr = fieldType.GetFullMetadataName();

var names = new List<string>();
foreach (var attrSet in field.AttributeLists)
Expand Down
3 changes: 2 additions & 1 deletion RotationSolver/Localization/Localization.json
Original file line number Diff line number Diff line change
Expand Up @@ -338,5 +338,6 @@
"RotationSolver.Basic.Data.AutoStatus.AntiKnockback": "AntiKnockback",
"RotationSolver.Basic.Data.AutoStatus.Burst": "Burst",
"RotationSolver.Basic.Data.AutoStatus.Speed": "Speed",
"RotationSolver.Basic.Data.AutoStatus.LimitBreak": "LimitBreak"
"RotationSolver.Basic.Data.AutoStatus.LimitBreak": "LimitBreak",
"RotationSolver.Data.UiString.ConfigWindow_Condition_DutyName": "Duty Name"
}
6 changes: 2 additions & 4 deletions RotationSolver/UI/RotationConfigWindow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -647,7 +647,7 @@ private void DrawBody()
{
HeaderSize = 12,
};
private static uint _territoryId = 0;
internal static uint _territoryId = 0;
private static string _territorySearch = string.Empty;
private static void DrawTimeline()
{
Expand All @@ -661,9 +661,7 @@ static string GetName(TerritoryType? territory)
var territory = Svc.Data.GetExcelSheet<TerritoryType>();
if (territory == null) return;

var territories = RaidTimeUpdater.PathForRaids.Keys.Select(territory.GetRow).ToArray();

var names = territories.Select(GetName).ToArray();
var territories = RaidTimeUpdater.PathForRaids.Keys.OrderByDescending(i => i).Select(territory.GetRow).ToArray();

var rightTerritory = territory?.GetRow(_territoryId);
var name = GetName(rightTerritory);
Expand Down
14 changes: 10 additions & 4 deletions RotationSolver/Updaters/RaidTimeUpdater.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using ECommons.DalamudServices;
using Newtonsoft.Json.Linq;
using RotationSolver.Basic.Configuration.Timeline;
using RotationSolver.UI;
using System.Text.RegularExpressions;

namespace RotationSolver.Updaters;
Expand Down Expand Up @@ -47,10 +48,8 @@ internal static void UpdateTimeline()
}
}

internal static async Task EnableAsync()
internal static async void EnableAsync()
{
Svc.ClientState.TerritoryChanged += ClientState_TerritoryChanged;
ClientState_TerritoryChanged(Svc.ClientState.TerritoryType);
Svc.DutyState.DutyWiped += DutyState_DutyWiped;
Svc.DutyState.DutyCompleted += DutyState_DutyWiped;

Expand All @@ -73,6 +72,9 @@ internal static async Task EnableAsync()
var name = items[1][1..^1];
PathForRaids[id] = name;
}

Svc.ClientState.TerritoryChanged += ClientState_TerritoryChanged;
ClientState_TerritoryChanged(Svc.ClientState.TerritoryType);
}

private static void DutyState_DutyWiped(object? sender, ushort e)
Expand All @@ -89,6 +91,10 @@ internal static void Disable()

private static async void ClientState_TerritoryChanged(ushort id)
{
if (PathForRaids.ContainsKey(id))
{
RotationConfigWindow._territoryId = id;
}
try
{
DataCenter.TimelineItems = await GetRaidAsync(id) ?? [];
Expand Down Expand Up @@ -129,7 +135,7 @@ static async Task<TimelineItem[]> GetRaidAsync(ushort id)
{
return _savedTimeLines[id] = await DownloadRaidAsync(path);
}
return null;
return [];
}

static async Task<RaidLangs> DownloadRaidLangsAsync(string path)
Expand Down
148 changes: 91 additions & 57 deletions RotationSolver/Watcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@
using FFXIVClientStructs.FFXIV.Client.Game;
using Lumina.Excel.GeneratedSheets;
using RotationSolver.Basic.Configuration;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using static Dalamud.Interface.Utility.Raii.ImRaii;
using GameObject = FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject;

namespace RotationSolver;
Expand Down Expand Up @@ -71,6 +69,9 @@ public static void Enable()

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)
{
#if DEBUG
//Svc.Log.Debug(sender.TextValue.ToString());
#endif
foreach (var item in DataCenter.TimelineItems)
{
if (item.Time < DataCenter.RaidTimeRaw) continue;
Expand All @@ -79,7 +80,8 @@ private static void Chat_ChatMessage(Dalamud.Game.Text.XivChatType type, uint se
var typeString = ((uint)type).ToString("X4");
if (!new Regex(item["code"]).IsMatch(typeString)) continue;

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

if (!new Regex(item["line"]).IsMatch(message.TextValue)) continue;
item.UpdateRaidTimeOffset();
break;
Expand All @@ -96,59 +98,101 @@ private static void GameNetwork_NetworkMessage(nint dataPtr, ushort opCode, uint
case OpCode.SystemLogMessage:
OnSystemLogMessage(dataPtr);
break;
//case OpCode.ActorControlTarget:
// var bytes = new byte[32];
// Marshal.Copy(dataPtr, bytes, 0, 32);
// Svc.Log.Debug("ActorControlTarget: " + HexString(bytes));
// break;
//case OpCode.ActorControlSelf:
// bytes = new byte[32];
// Marshal.Copy(dataPtr, bytes, 0, 32);
// Svc.Log.Debug("ActorControlSelf: " + HexString(bytes));
// break;
//case OpCode.ActorControl:
// OnActorControl(dataPtr);
// break;
case OpCode.ActorControlTarget:
case OpCode.ActorControlSelf:
case OpCode.ActorControl:
OnActorControl(dataPtr);
break;
}
}

//private static void OnActorControl(IntPtr dataPtr)
//{
// foreach (var item in DataCenter.TimelineItems)
// {
// if (item.Time < DataCenter.RaidTimeRaw) continue;
// if (item.Type is not TimelineType.ActorControl) continue;
// //if (!item.IsIdMatched(ReadNumber(dataPtr, 4))) continue;

// //var param1 = item["param1"];
// //if (!string.IsNullOrEmpty(param1))
// //{
// // if (!new Regex(param1).IsMatch(ReadNumber(dataPtr, 12).ToString("X")))
// // {
// // continue;
// // }
// //}
// //item.UpdateRaidTimeOffset();
// break;
// }

// var bytes = new byte[32];
// Marshal.Copy(dataPtr, bytes, 0, 32);
// Svc.Log.Debug("ActorControl: " + HexString(bytes));
//}
private static void OnActorControl(IntPtr dataPtr)
{
foreach (var item in DataCenter.TimelineItems)
{
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;
}
}

item.UpdateRaidTimeOffset();
break;
}
}

private static void OnSystemLogMessage(IntPtr dataPtr)
{
foreach (var item in DataCenter.TimelineItems)
{
if (item.Time < DataCenter.RaidTimeRaw) continue;
if (item.Type is not TimelineType.SystemLogMessage) continue;
if (!item.IsIdMatched(ReadNumber(dataPtr, 4))) 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(ReadNumber(dataPtr, 12).ToString("X")))
if(!new Regex(param1).IsMatch(ReadUint(dataPtr, 12).ToString("X")))
{
continue;
}
}

var param2 = item["param2"];
if (!string.IsNullOrEmpty(param2))
{
if (!new Regex(param2).IsMatch(ReadUint(dataPtr, 16).ToString("X")))
{
continue;
}
Expand All @@ -158,25 +202,14 @@ private static void OnSystemLogMessage(IntPtr dataPtr)
}
}

private unsafe static uint ReadNumber(IntPtr dataPtr, int offset)
private unsafe static ushort ReadUshort(IntPtr dataPtr, int offset)
{
return *(uint*)(dataPtr + offset);
return *(ushort*)(dataPtr + offset);
}

private static string HexString(byte[] bytes)
private unsafe static uint ReadUint(IntPtr dataPtr, int offset)
{
var str = Convert.ToHexString(bytes);

string result = string.Empty;
for (int i = 0; i < str.Length; i++)
{
if (i % 4 == 0)
{
result += " ";
}
result += str[i];
}
return result;
return *(uint*)(dataPtr + offset);
}

public static void Disable()
Expand Down Expand Up @@ -275,6 +308,7 @@ private static void ActionFromEnemy(ActionEffectSet set)
if (item.Time < DataCenter.RaidTimeRaw) continue;
if (item.Type is not TimelineType.Ability) continue;
if (!item.IsIdMatched(set.Action?.RowId ?? 0)) continue;
//if (!new Regex(item["source"]).IsMatch(set.Source?.Name.TextValue ?? string.Empty)) continue;

item.UpdateRaidTimeOffset();
break;
Expand Down

0 comments on commit 388d131

Please sign in to comment.