Added check if context user is in range or in object table.

This commit is contained in:
CakeAndBanana
2025-09-30 05:50:39 +02:00
parent 1fa2f063e8
commit 597a0beb91

View File

@@ -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<IPlayerCharacter>()
.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<IPlayerCharacter>()
.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<World>()!;
@@ -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);