From 1151d1bf2ec28692af473faa0f550569b230d820 Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Thu, 5 Oct 2023 23:53:48 +0200 Subject: [PATCH] fix multiple redraws, fix wrong files being allowed to send --- .../PlayerData/Factories/PlayerDataFactory.cs | 7 ++-- .../PlayerData/Handlers/PairHandler.cs | 35 +++++-------------- 2 files changed, 14 insertions(+), 28 deletions(-) diff --git a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs index b215fb5..737e539 100644 --- a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs +++ b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs @@ -20,6 +20,8 @@ public class PlayerDataFactory private readonly PerformanceCollectorService _performanceCollector; private readonly TransientResourceManager _transientResourceManager; + private static readonly string[] AllowedExtensionsForGamePaths = { ".mdl", ".tex", ".mtrl", ".tmb", ".pap", ".avfx", ".atex", ".sklb", ".eid", ".phyb", ".scd", ".skp", ".shpk" }; + public PlayerDataFactory(ILogger logger, DalamudUtilService dalamudUtil, IpcManager ipcManager, TransientResourceManager transientResourceManager, FileCacheManager fileReplacementFactory, PerformanceCollectorService performanceCollector) @@ -142,12 +144,13 @@ public class PlayerDataFactory Stopwatch st = Stopwatch.StartNew(); // gather static replacements from render model - var data = await _ipcManager.PenumbraGetCharacterData(_logger, playerRelatedObject).ConfigureAwait(false); + var data = (await _ipcManager.PenumbraGetCharacterData(_logger, playerRelatedObject).ConfigureAwait(false))![0]; if (data == null) throw new InvalidOperationException("Penumbra returned null data"); previousData.FileReplacements[objectKind] = - new HashSet(data[0]!.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)), FileReplacementComparer.Instance) + new HashSet(data.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)), FileReplacementComparer.Instance) .Where(p => p.HasFileReplacement).ToHashSet(); + previousData.FileReplacements[objectKind].RemoveWhere(c => c.GamePaths.Any(g => !AllowedExtensionsForGamePaths.Any(e => g.EndsWith(e, StringComparison.OrdinalIgnoreCase)))); _logger.LogDebug("== Static Replacements =="); foreach (var replacement in previousData.FileReplacements[objectKind].Where(i => i.HasFileReplacement).OrderBy(i => i.GamePaths.First(), StringComparer.OrdinalIgnoreCase)) diff --git a/MareSynchronos/PlayerData/Handlers/PairHandler.cs b/MareSynchronos/PlayerData/Handlers/PairHandler.cs index 12adae8..947cf93 100644 --- a/MareSynchronos/PlayerData/Handlers/PairHandler.cs +++ b/MareSynchronos/PlayerData/Handlers/PairHandler.cs @@ -33,7 +33,6 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase private CancellationTokenSource? _downloadCancellationTokenSource = new(); private bool _forceApplyMods = false; private string _penumbraCollection; - private CancellationTokenSource _redrawCts = new(); public PairHandler(ILogger logger, OnlineUserIdentDto onlineUser, GameObjectHandlerFactory gameObjectHandlerFactory, @@ -210,6 +209,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase try { + bool alreadyRedrawn = false; if (handler.Address == nint.Zero) { return; @@ -249,13 +249,18 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase case PlayerChanges.Glamourer: if (charaData.GlamourerData.TryGetValue(changes.Key, out var glamourerData)) { + alreadyRedrawn = true; await _ipcManager.GlamourerApplyAllAsync(Logger, handler, glamourerData, applicationId, token).ConfigureAwait(false); } break; case PlayerChanges.ModFiles: case PlayerChanges.ModManip: - await _ipcManager.PenumbraRedrawAsync(Logger, handler, applicationId, token).ConfigureAwait(false); + if (!alreadyRedrawn) + { + alreadyRedrawn = true; + await _ipcManager.PenumbraRedrawAsync(Logger, handler, applicationId, token).ConfigureAwait(false); + } break; } token.ThrowIfCancellationRequested(); @@ -419,7 +424,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase else if (_charaHandler?.Address == nint.Zero && IsVisible) { IsVisible = false; - _charaHandler?.Invalidate(); + _charaHandler.Invalidate(); _downloadCancellationTokenSource?.CancelDispose(); _downloadCancellationTokenSource = null; Logger.LogTrace("{this} visibility changed, now: {visi}", this, IsVisible); @@ -431,7 +436,6 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase PlayerName = name; _charaHandler = _gameObjectHandlerFactory.Create(ObjectKind.Player, () => _dalamudUtil.GetPlayerCharacterFromCachedTableByIdent(OnlineUser.Ident), false).GetAwaiter().GetResult(); - Mediator.Subscribe(this, IpcManagerOnPenumbraRedrawEvent); Mediator.Subscribe(this, async (_) => { if (string.IsNullOrEmpty(_cachedData?.HonorificData)) return; @@ -442,28 +446,6 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase _ipcManager.PenumbraAssignTemporaryCollectionAsync(Logger, _penumbraCollection, _charaHandler.GetGameObject()!.ObjectIndex).GetAwaiter().GetResult(); } - private void IpcManagerOnPenumbraRedrawEvent(PenumbraRedrawMessage msg) - { - var player = _dalamudUtil.GetCharacterFromObjectTableByIndex(msg.ObjTblIdx); - if (player == null || !string.Equals(player.Name.ToString(), PlayerName, StringComparison.OrdinalIgnoreCase)) return; - _redrawCts = _redrawCts.CancelRecreate(); - _redrawCts.CancelAfter(TimeSpan.FromSeconds(30)); - var token = _redrawCts.Token; - - _ = Task.Run(async () => - { - var applicationId = Guid.NewGuid(); - await _dalamudUtil.WaitWhileCharacterIsDrawing(Logger, _charaHandler!, applicationId, ct: token).ConfigureAwait(false); - Logger.LogDebug("Unauthorized character change detected"); - if (_cachedData != null) - { - await ApplyCustomizationDataAsync(applicationId, new(ObjectKind.Player, - new HashSet(new[] { PlayerChanges.Palette, PlayerChanges.Customize, PlayerChanges.Heels, PlayerChanges.Glamourer })), - _cachedData, token).ConfigureAwait(false); - } - }, token); - } - private async Task RevertCustomizationDataAsync(ObjectKind objectKind, string name, Guid applicationId) { nint address = _dalamudUtil.GetPlayerCharacterFromCachedTableByIdent(OnlineUser.Ident); @@ -537,6 +519,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase moddedDictionary = new Dictionary(StringComparer.Ordinal); ConcurrentDictionary outputDict = new(StringComparer.Ordinal); bool hasMigrationChanges = false; + try { var replacementList = charaData.FileReplacements.SelectMany(k => k.Value.Where(v => string.IsNullOrEmpty(v.FileSwapPath))).ToList();