diff --git a/LightlessSync/UI/ContextMenu.cs b/LightlessSync/UI/ContextMenu.cs index 6cdc90c..b828cdd 100644 --- a/LightlessSync/UI/ContextMenu.cs +++ b/LightlessSync/UI/ContextMenu.cs @@ -90,6 +90,10 @@ internal class ContextMenu : IHostedService if (string.IsNullOrEmpty(target.TargetName) || target.TargetObjectId == 0 || target.TargetHomeWorld.RowId == 0) return; + IPlayerCharacter? targetData = GetPlayerFromObjectTable(target); + if (targetData == null || targetData.Address == IntPtr.Zero) + return; + var world = GetWorld(target.TargetHomeWorld.RowId); if (!IsWorldValid(world)) return; @@ -100,7 +104,7 @@ internal class ContextMenu : IHostedService PrefixChar = 'L', UseDefaultPrefix = false, PrefixColor = 708, - OnClicked = async _ => await HandleSelection(args) + OnClicked = async _ => await HandleSelection(args).ConfigureAwait(false) }); } @@ -115,11 +119,7 @@ internal class ContextMenu : IHostedService try { - var targetData = _objectTable - .OfType() - .FirstOrDefault(p => - string.Equals(p.Name.TextValue, target.TargetName, StringComparison.OrdinalIgnoreCase) && - p.HomeWorld.RowId == target.TargetHomeWorld.RowId); + IPlayerCharacter? targetData = GetPlayerFromObjectTable(target); if (targetData == null || targetData.Address == IntPtr.Zero) { @@ -139,6 +139,15 @@ internal class ContextMenu : IHostedService } } + private IPlayerCharacter? GetPlayerFromObjectTable(MenuTargetDefault target) + { + return _objectTable + .OfType() + .FirstOrDefault(p => + string.Equals(p.Name.TextValue, target.TargetName, StringComparison.OrdinalIgnoreCase) && + p.HomeWorld.RowId == target.TargetHomeWorld.RowId); + } + private World GetWorld(uint worldId) { var sheet = _gameData.GetExcelSheet()!; @@ -162,6 +171,7 @@ internal class ContextMenu : IHostedService return luminaWorlds.FirstOrDefault(x => x.RowId == worldId); } + private static bool IsChineseJapaneseKoreanString(string text) => text.All(IsChineseJapaneseKoreanCharacter); private static bool IsChineseJapaneseKoreanCharacter(char c) => (c >= 0x4E00 && c <= 0x9FFF);