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

Commit

Permalink
fix: fixed raid time cast using.
Browse files Browse the repository at this point in the history
  • Loading branch information
ArchiDog1998 committed Feb 29, 2024
1 parent 4c227dc commit 44b675c
Show file tree
Hide file tree
Showing 4 changed files with 202 additions and 208 deletions.
4 changes: 2 additions & 2 deletions Resources/RotationSolverRecord.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"ClickingCount": 88632,
"SayingHelloCount": 112,
"ClickingCount": 88666,
"SayingHelloCount": 113,
"SaidUsers": []
}
204 changes: 200 additions & 4 deletions RotationSolver/Updaters/RaidTimeUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,18 +81,214 @@ internal static async void EnableAsync()

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

private static void DutyState_DutyWiped(object? sender, ushort e)
{
DataCenter.RaidTimeRaw = -1;
Svc.GameNetwork.NetworkMessage += GameNetwork_NetworkMessage;
Svc.Chat.ChatMessage += Chat_ChatMessage;

}


internal static void Disable()
{
Svc.ClientState.TerritoryChanged -= ClientState_TerritoryChanged;
Svc.DutyState.DutyWiped -= DutyState_DutyWiped;
Svc.DutyState.DutyCompleted -= DutyState_DutyWiped;
Svc.GameNetwork.NetworkMessage -= GameNetwork_NetworkMessage;
Svc.Chat.ChatMessage -= Chat_ChatMessage;
}

private static void DutyState_DutyWiped(object? sender, ushort e)
{
DataCenter.RaidTimeRaw = -1;
}

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.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 (!new Regex(item["name"]).IsMatch(sender.TextValue)) continue;

if (!new Regex(item["line"]).IsMatch(message.TextValue)) continue;
item.UpdateRaidTimeOffset();
break;
}
}

private static void GameNetwork_NetworkMessage(nint dataPtr, ushort opCode, uint sourceActorId, uint targetActorId, Dalamud.Game.Network.NetworkMessageDirection direction)
{
if (direction != Dalamud.Game.Network.NetworkMessageDirection.ZoneDown) return;
OpCode op = (OpCode)opCode;

switch (op)
{
case OpCode.SystemLogMessage:
OnSystemLogMessage(dataPtr);
break;
case OpCode.ActorControlTarget:
case OpCode.ActorControlSelf:
case OpCode.ActorControl:
OnActorControl(dataPtr);
break;

case OpCode.Effect:
OnEffect(dataPtr, targetActorId);
break;

case OpCode.ActorCast:
OnCast(dataPtr, targetActorId);
break;
}
}

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

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) && item.IsShown) continue; //Maybe this is not correct.

item.UpdateRaidTimeOffset();
break;
}
}

private static void OnEffect(IntPtr dataPtr, uint targetActorId)
{
var name = Svc.Objects.SearchById(targetActorId)?.Name.TextValue ?? string.Empty;
foreach (var item in DataCenter.TimelineItems)
{
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.

item.UpdateRaidTimeOffset();
break;
}
}

private static void OnActorControl(IntPtr dataPtr)
{
foreach (var item in DataCenter.TimelineItems)
{
if (item.IsShown) continue;
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.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;
}
}

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

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

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

private static async void ClientState_TerritoryChanged(ushort id)
Expand Down
29 changes: 0 additions & 29 deletions RotationSolver/Updaters/TargetUpdater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
using ECommons.GameFunctions;
using ECommons.GameHelpers;
using RotationSolver.Basic.Configuration;
using RotationSolver.Helpers;
using Action = Lumina.Excel.GeneratedSheets.Action;

namespace RotationSolver.Updaters;
Expand All @@ -27,34 +26,6 @@ internal unsafe static void UpdateTarget()
UpdateNamePlate(battles);
}

static readonly Dictionary<uint, bool> _castingTargets = [];
private static void UpdateCastingRefine(IEnumerable<BattleChara> allTargets)
{
foreach (BattleChara b in allTargets)
{
if (!_castingTargets.TryGetValue(b.ObjectId, out var isLastCasting)) continue;
if (isLastCasting) continue;

if (!b.IsCasting) continue;

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(b.CastActionId)) continue;

item.UpdateRaidTimeOffset();
break;
}
}

foreach (BattleChara b in allTargets)
{
_castingTargets[b.ObjectId] = b.IsCasting;
}
}

private static DateTime _lastUpdateTimeToKill = DateTime.MinValue;
private static readonly TimeSpan _timeToKillSpan = TimeSpan.FromSeconds(0.5);
private static void UpdateTimeToKill(IEnumerable<BattleChara> allTargets)
Expand Down
Loading

0 comments on commit 44b675c

Please sign in to comment.