Removed unsafe handling of game object and owned object
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user