Removed unsafe handling of game object and owned object

This commit is contained in:
cake
2026-01-16 15:54:38 +01:00
parent f6a5c85c2d
commit d8b4122ec3
4 changed files with 291 additions and 202 deletions

View File

@@ -2885,6 +2885,62 @@ internal sealed class PairHandlerAdapter : DisposableMediatorSubscriberBase, IPa
TryHandleVisibilityUpdate();
}
private void KickOwnedObjectRetryFromTracked()
{
if (!IsVisible || IsPaused() || !CanApplyNow() || _charaHandler is null || _charaHandler.Address == nint.Zero)
return;
var data = _cachedData ?? LastReceivedCharacterData ?? _pairStateCache.TryLoad(Ident);
if (data is null)
return;
static HashSet<PlayerChanges> BuildOwnedChanges(CharacterData d, ObjectKind k)
{
var set = new HashSet<PlayerChanges>();
if (d.FileReplacements.TryGetValue(k, out var repls) && repls is { Count: > 0 })
set.Add(PlayerChanges.ModFiles);
if (d.GlamourerData.TryGetValue(k, out var g) && !string.IsNullOrEmpty(g))
set.Add(PlayerChanges.Glamourer);
if (d.CustomizePlusData.TryGetValue(k, out var c) && !string.IsNullOrEmpty(c))
set.Add(PlayerChanges.Customize);
if (set.Count > 0)
set.Add(PlayerChanges.ForcedRedraw);
return set;
}
var kinds = new[] { ObjectKind.MinionOrMount, ObjectKind.Pet, ObjectKind.Companion };
lock (_ownedRetryGate)
{
foreach (var k in kinds)
{
if (!HasAppearanceDataForKind(data, k))
continue;
var changes = BuildOwnedChanges(data, k);
if (changes.Count == 0)
continue;
_pendingOwnedChanges[k] = changes;
}
if (_pendingOwnedChanges.Count == 0)
return;
_ownedRetryCts = _ownedRetryCts?.CancelRecreate() ?? new CancellationTokenSource();
if (_ownedRetryTask.IsCompleted)
_ownedRetryTask = Task.Run(() => OwnedObjectRetryLoopAsync(_ownedRetryCts.Token), CancellationToken.None);
}
Logger.LogDebug("{handler}: Kicked owned-object retry from ActorTracked (pending: {pending})",
GetLogIdentifier(), string.Join(", ", _pendingOwnedChanges.Keys));
}
private void TryHandleVisibilityUpdate()
{
if (_charaHandler?.Address != nint.Zero && !IsVisible && !_pauseRequested)
@@ -3386,6 +3442,8 @@ internal sealed class PairHandlerAdapter : DisposableMediatorSubscriberBase, IPa
return;
ScheduleOwnedObjectRetry(ownedKind, changes);
KickOwnedObjectRetryFromTracked();
}
private static HashSet<PlayerChanges> BuildOwnedChangeSetForKind(CharacterData data, ObjectKind kind)