Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 15 additions & 10 deletions UIOptimization/RealQueuePosition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,13 @@ public unsafe class RealQueuePosition : DailyModuleBase
};

private DateTime ETA = DateTime.Now;


private static readonly CompSig SetStringArrayDataValueAndSig = new("48 83 EC ?? 0F B6 44 24 ?? C6 44 24");
private delegate void SetStringArrayDataValueAndUpdateDelegate(StringArrayData* data, int index, byte* content, byte a4, byte a5);
private static SetStringArrayDataValueAndUpdateDelegate? SetStringArrayDataValueAndUpdate;

private readonly CompSig AgentWorldTravelUpdaterSig = new("40 53 56 57 41 54 41 57 48 81 EC ?? ?? ?? ?? 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 84 24 ?? ?? ?? ?? 4C 8B FA");
private delegate bool AgentWorldTravelUpdateDelegate(nint a1, NumberArrayData* a2, StringArrayData* a3, bool a4);
private delegate bool AgentWorldTravelUpdateDelegate(nint a1, nint a2, nint a3, bool a4);
private static Hook<AgentWorldTravelUpdateDelegate> AgentWorldTravelUpdateHook;

private static readonly CompSig UpdateWorldTravelDataSig = new("48 89 5C 24 ?? 48 89 74 24 ?? 57 48 83 EC ?? 48 8B D9 48 8B FA 0F B6 4A");
Expand All @@ -35,6 +39,8 @@ public unsafe class RealQueuePosition : DailyModuleBase

public override void Init()
{
SetStringArrayDataValueAndUpdate ??= SetStringArrayDataValueAndSig.GetDelegate<SetStringArrayDataValueAndUpdateDelegate>();

AgentWorldTravelUpdateHook ??= AgentWorldTravelUpdaterSig.GetHook<AgentWorldTravelUpdateDelegate>(AgentWorldTravelUpdaterDetour);
AgentWorldTravelUpdateHook.Enable();

Expand Down Expand Up @@ -74,7 +80,7 @@ private void UpdateWorldTravelDataDetour(nint a1, nint a2)
UpdateWorldTravelDataHook.Original(a1, a2);
}

private bool AgentWorldTravelUpdaterDetour(nint a1, NumberArrayData* a2, StringArrayData* a3, bool a4)
private bool AgentWorldTravelUpdaterDetour(nint a1, nint a2, nint a3, bool a4)
{
var agentData = (nint)AgentWorldTravel.Instance();
if (agentData == nint.Zero || !(*(bool*)(agentData + 0x120)))
Expand All @@ -84,19 +90,18 @@ private bool AgentWorldTravelUpdaterDetour(nint a1, NumberArrayData* a2, StringA
if (!result) return false;

var index = 5;

if (a2->IntArray[5] > 0)
{
if (*(int*)(*(nint*)(a2 + 32) + 20) > 0)
index = 6;
}

var position = *(uint*)(agentData + 0x12c);
var positionStr = $"{LuminaCache.GetRow<Addon>(10988).Text.ExtractText()}: #{position}";
a3->SetValue(index, positionStr);

fixed (byte* strPtr = Encoding.UTF8.GetBytes(positionStr))
SetStringArrayDataValueAndUpdate((StringArrayData*)a3, index, strPtr, 0, 1);

var queueTime = TimeSpan.FromSeconds(*(int*)(agentData + 0x128));
var info = GetLoc("RealQueuePosition-ETA", @$"{queueTime:mm\:ss}", @$"{ETA - DateTime.Now:mm\:ss}");
a3->SetValue(index + 1, info);
fixed (byte* strBytesPtr = Encoding.UTF8.GetBytes(info))
SetStringArrayDataValueAndUpdate((StringArrayData*)a3, index + 1, strBytesPtr, 0, 1);

return true;
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 代码改进的必要性
    该修改引入了新的委托 SetStringArrayDataValueAndUpdateDelegate 和相关的签名 SetStringArrayDataValueAndSig,并替换了原有的 a3->SetValue 调用方式。这种修改可能是为了统一或优化字符串数组数据的设置逻辑,具有一定的改进意义。

  2. 逻辑错误或潜在运行时错误

    • AgentWorldTravelUpdaterDetour 方法中,a2 的类型从 NumberArrayData* 改为 nint,但后续代码中仍然通过指针操作访问 a2 的数据(如 *(int*)(*(nint*)(a2 + 32) + 20))。这种操作存在潜在的风险,因为 a2 的类型已经改变,可能会导致内存访问错误或未定义行为。
    • 使用 fixed 语句将字符串转换为 byte* 指针时,如果字符串内容为空或转换失败,可能会导致空指针异常。
  3. 兼容性问题

    • 修改后的代码中,AgentWorldTravelUpdateDelegate 的签名发生了变化(a2a3 的类型从指针改为 nint),这可能会影响其他依赖于该委托的代码部分,导致兼容性问题。
  4. 代码结构优化建议

    • 可以将 SetStringArrayDataValueAndUpdate 的初始化和调用逻辑封装到一个单独的方法中,以提高代码的可读性和复用性。
    • 对于 fixed 语句的使用,建议添加空值检查,以避免潜在的空指针异常。
  5. 潜在性能问题

    • 使用 Encoding.UTF8.GetBytes 将字符串转换为字节数组可能会带来一定的性能开销,尤其是在频繁调用的场景下。如果性能是关键,可以考虑缓存转换结果或使用更高效的方式。
  6. 安全性问题

    • 代码中没有明显的敏感信息泄露风险。
    • 代码中未涉及运行来路不明的外部代码,安全性较好。

改进建议

  • 修复 a2 的类型不匹配问题,确保指针操作的安全性。
  • 添加对 fixed 语句中字符串的空值检查。
  • 封装 SetStringArrayDataValueAndUpdate 的调用逻辑,提高代码的可读性和复用性。
  • 考虑优化字符串转换的性能开销,尤其是在高频调用场景下。

Expand Down