fix multiple redraws, fix wrong files being allowed to send
This commit is contained in:
		| @@ -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<PlayerDataFactory> 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<FileReplacement>(data[0]!.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)), FileReplacementComparer.Instance) | ||||
|                 new HashSet<FileReplacement>(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)) | ||||
|   | ||||
| @@ -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<PairHandler> 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<PenumbraRedrawMessage>(this, IpcManagerOnPenumbraRedrawEvent); | ||||
|         Mediator.Subscribe<HonorificReadyMessage>(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<PlayerChanges>(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<string, string>(StringComparer.Ordinal); | ||||
|         ConcurrentDictionary<string, string> outputDict = new(StringComparer.Ordinal); | ||||
|         bool hasMigrationChanges = false; | ||||
|  | ||||
|         try | ||||
|         { | ||||
|             var replacementList = charaData.FileReplacements.SelectMany(k => k.Value.Where(v => string.IsNullOrEmpty(v.FileSwapPath))).ToList(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 rootdarkarchon
					rootdarkarchon