From bbfd6eb3d3e66486f9599430c0192d47a9a244f4 Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Sun, 30 Apr 2023 00:46:02 +0200 Subject: [PATCH] idk, probably some crashfixes or so --- MareSynchronos/Interop/IpcManager.cs | 44 +++++++++---------- .../PlayerData/Factories/PlayerDataFactory.cs | 2 +- .../PlayerData/Handlers/GameObjectHandler.cs | 2 +- .../PlayerData/Pairs/CachedPlayer.cs | 6 +-- MareSynchronos/PlayerData/Pairs/Pair.cs | 2 + MareSynchronos/Services/DalamudUtilService.cs | 16 +++---- .../WebAPI/Files/FileDownloadManager.cs | 3 -- 7 files changed, 34 insertions(+), 41 deletions(-) diff --git a/MareSynchronos/Interop/IpcManager.cs b/MareSynchronos/Interop/IpcManager.cs index b587029..27ded92 100644 --- a/MareSynchronos/Interop/IpcManager.cs +++ b/MareSynchronos/Interop/IpcManager.cs @@ -171,9 +171,9 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase public async Task CustomizePlusRevert(IntPtr character) { if (!CheckCustomizePlusApi()) return; - await _dalamudUtil.RunOnFrameworkThread(() => + await _dalamudUtil.RunOnFrameworkThread(async () => { - var gameObj = _dalamudUtil.CreateGameObject(character); + var gameObj = await _dalamudUtil.CreateGameObject(character).ConfigureAwait(true); if (gameObj is Character c) { Logger.LogTrace("CustomizePlus reverting for {chara}", c.Address.ToString("X")); @@ -185,9 +185,9 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase public async Task CustomizePlusSetBodyScale(IntPtr character, string scale) { if (!CheckCustomizePlusApi() || string.IsNullOrEmpty(scale)) return; - await _dalamudUtil.RunOnFrameworkThread(() => + await _dalamudUtil.RunOnFrameworkThread(async () => { - var gameObj = _dalamudUtil.CreateGameObject(character); + var gameObj = await _dalamudUtil.CreateGameObject(character).ConfigureAwait(true); if (gameObj is Character c) { string decodedScale = Encoding.UTF8.GetString(Convert.FromBase64String(scale)); @@ -217,7 +217,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase try { await _glamourerApplicationSemaphore.WaitAsync().ConfigureAwait(true); - var gameObj = _dalamudUtil.CreateGameObject(handler.Address); + var gameObj = await _dalamudUtil.CreateGameObject(handler.Address).ConfigureAwait(false); if (gameObj is Character c) { await PenumbraRedrawAsync(logger, handler, applicationId, () => _glamourerApplyAll!.InvokeAction(customization, c), fireAndForget, token).ConfigureAwait(false); @@ -235,10 +235,10 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase try { await _glamourerApplicationSemaphore.WaitAsync().ConfigureAwait(false); - var gameObj = _dalamudUtil.CreateGameObject(handler.Address); + var gameObj = await _dalamudUtil.CreateGameObject(handler.Address).ConfigureAwait(false); if (gameObj is Character c) { - await PenumbraRedrawAsync(logger, handler, applicationid, () => _glamourerApplyOnlyEquipment!.InvokeAction(customization, c), fireAndForget, token).ConfigureAwait(false); + await PenumbraRedrawAsync(logger, handler, applicationid, () => _glamourerApplyOnlyCustomization!.InvokeAction(customization, c), fireAndForget, token).ConfigureAwait(false); await PenumbraRedrawAsync(logger, handler, applicationid, () => _glamourerApplyOnlyEquipment!.InvokeAction(equipment, c), fireAndForget, token).ConfigureAwait(false); } } @@ -253,7 +253,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase if (!CheckGlamourerApi()) return string.Empty; try { - var gameObj = _dalamudUtil.CreateGameObject(character); + var gameObj = await _dalamudUtil.CreateGameObject(character).ConfigureAwait(false); if (gameObj is Character c) { var glamourerString = await _dalamudUtil.RunOnFrameworkThread(() => _glamourerGetAllCustomization!.InvokeFunc(c)).ConfigureAwait(false); @@ -274,9 +274,9 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase public async Task HeelsRestoreOffsetForPlayer(IntPtr character) { if (!CheckHeelsApi()) return; - await _dalamudUtil.RunOnFrameworkThread(() => + await _dalamudUtil.RunOnFrameworkThread(async () => { - var gameObj = _dalamudUtil.CreateGameObject(character); + var gameObj = await _dalamudUtil.CreateGameObject(character).ConfigureAwait(true); if (gameObj != null) { Logger.LogTrace("Restoring Heels data to {chara}", character.ToString("X")); @@ -288,9 +288,9 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase public async Task HeelsSetOffsetForPlayer(IntPtr character, float offset) { if (!CheckHeelsApi()) return; - await _dalamudUtil.RunOnFrameworkThread(() => + await _dalamudUtil.RunOnFrameworkThread(async () => { - var gameObj = _dalamudUtil.CreateGameObject(character); + var gameObj = await _dalamudUtil.CreateGameObject(character).ConfigureAwait(true); if (gameObj != null) { Logger.LogTrace("Applying Heels data to {chara}", character.ToString("X")); @@ -302,9 +302,9 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase public async Task HonorificClearTitle(nint character) { if (!CheckHonorificApi()) return; - await _dalamudUtil.RunOnFrameworkThread(() => + await _dalamudUtil.RunOnFrameworkThread(async () => { - var gameObj = _dalamudUtil.CreateGameObject(character); + var gameObj = await _dalamudUtil.CreateGameObject(character).ConfigureAwait(true); if (gameObj is PlayerCharacter c) { Logger.LogTrace("Honorific removing for {addr}", c.Address.ToString("X")); @@ -323,10 +323,10 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase public async Task HonorificSetTitle(IntPtr character, string honorificData) { if (!CheckHonorificApi()) return; - await _dalamudUtil.RunOnFrameworkThread(() => + await _dalamudUtil.RunOnFrameworkThread(async () => { Logger.LogTrace("Applying Honorific data to {chara}", character.ToString("X")); - var gameObj = _dalamudUtil.CreateGameObject(character); + var gameObj = await _dalamudUtil.CreateGameObject(character).ConfigureAwait(true); if (gameObj is PlayerCharacter pc) { if (string.IsNullOrEmpty(honorificData)) @@ -352,9 +352,9 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase public async Task PalettePlusRemovePalette(IntPtr character) { if (!CheckPalettePlusApi()) return; - await _dalamudUtil.RunOnFrameworkThread(() => + await _dalamudUtil.RunOnFrameworkThread(async () => { - var gameObj = _dalamudUtil.CreateGameObject(character); + var gameObj = await _dalamudUtil.CreateGameObject(character).ConfigureAwait(true); if (gameObj is Character c) { Logger.LogTrace("PalettePlus removing for {addr}", c.Address.ToString("X")); @@ -366,9 +366,9 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase public async Task PalettePlusSetPalette(IntPtr character, string palette) { if (!CheckPalettePlusApi()) return; - await _dalamudUtil.RunOnFrameworkThread(() => + await _dalamudUtil.RunOnFrameworkThread(async () => { - var gameObj = _dalamudUtil.CreateGameObject(character); + var gameObj = await _dalamudUtil.CreateGameObject(character).ConfigureAwait(true); if (gameObj is Character c) { string decodedPalette = Encoding.UTF8.GetString(Convert.FromBase64String(palette)); @@ -398,7 +398,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase if (!CheckPenumbraApi() || _dalamudUtil.IsZoning) return; await _dalamudUtil.RunOnFrameworkThread(async () => { - var gameObj = _dalamudUtil.CreateGameObject(handler.Address); + var gameObj = await _dalamudUtil.CreateGameObject(handler.Address).ConfigureAwait(true); if (gameObj is Character c) { await PenumbraRedrawAsync(logger, handler, applicationId, () => _penumbraRedrawObject!.Invoke(c, RedrawType.Redraw), fireAndForget, token).ConfigureAwait(false); @@ -626,7 +626,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase private void OnHonorificLocalCharacterTitleChanged(string title, bool isPrefix) { - Mediator.Publish(new HonorificMessage((isPrefix ? 0 : 1) + title)); + Mediator.Publish(new HonorificMessage((isPrefix ? 1 : 0) + title)); } private void OnPalettePlusPaletteChange(Character character, string palette) diff --git a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs index a47a268..701927d 100644 --- a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs +++ b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs @@ -316,7 +316,7 @@ public class PlayerDataFactory // wait until chara is not drawing and present so nothing spontaneously explodes await _dalamudUtil.WaitWhileCharacterIsDrawing(_logger, playerRelatedObject, Guid.NewGuid(), 30000, ct: token).ConfigureAwait(false); int totalWaitTime = 10000; - while (!DalamudUtilService.IsObjectPresent(_dalamudUtil.CreateGameObject(charaPointer)) && totalWaitTime > 0) + while (!DalamudUtilService.IsObjectPresent(await _dalamudUtil.RunOnFrameworkThread(() => _dalamudUtil.CreateGameObject(charaPointer).GetAwaiter().GetResult()).ConfigureAwait(false)) && totalWaitTime > 0) { _logger.LogTrace("Character is null but it shouldn't be, waiting"); await Task.Delay(50, token).ConfigureAwait(false); diff --git a/MareSynchronos/PlayerData/Handlers/GameObjectHandler.cs b/MareSynchronos/PlayerData/Handlers/GameObjectHandler.cs index 09e6b0c..a434ef2 100644 --- a/MareSynchronos/PlayerData/Handlers/GameObjectHandler.cs +++ b/MareSynchronos/PlayerData/Handlers/GameObjectHandler.cs @@ -164,7 +164,7 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase Address = curPtr; if (addrDiff) { - GameObjectLazy = new(() => _dalamudUtil.CreateGameObject(curPtr)); + GameObjectLazy = new(() => _dalamudUtil.CreateGameObject(curPtr).GetAwaiter().GetResult()); } var chara = (Character*)curPtr; var name = new ByteString(chara->GameObject.Name).ToString(); diff --git a/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs b/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs index 9b30d76..fd8cd0d 100644 --- a/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs +++ b/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs @@ -204,8 +204,8 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase { await _ipcManager.PenumbraRemoveTemporaryCollection(Logger, applicationId, PlayerName!).ConfigureAwait(false); token.ThrowIfCancellationRequested(); - await _ipcManager.PenumbraSetTemporaryMods(Logger, applicationId, PlayerName!, - _charaHandler?.GameObjectLazy?.Value.ObjectTableIndex(), moddedPaths, manipulationData).ConfigureAwait(false); + var objTableIndex = await _dalamudUtil.RunOnFrameworkThread(() => _charaHandler!.GameObjectLazy!.Value.ObjectTableIndex()).ConfigureAwait(false); + await _ipcManager.PenumbraSetTemporaryMods(Logger, applicationId, PlayerName!, objTableIndex, moddedPaths, manipulationData).ConfigureAwait(false); token.ThrowIfCancellationRequested(); } @@ -485,7 +485,7 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase if (string.IsNullOrEmpty(PlayerName)) { var pc = _dalamudUtil.FindPlayerByNameHash(OnlineUser.Ident); - if (pc == null) return; + if (pc == default((string, nint))) return; Logger.LogDebug("One-Time Initializing {this}", this); Initialize(pc.Name.ToString()); Logger.LogDebug("One-Time Initialized {this}", this); diff --git a/MareSynchronos/PlayerData/Pairs/Pair.cs b/MareSynchronos/PlayerData/Pairs/Pair.cs index 3db557d..ca2c0db 100644 --- a/MareSynchronos/PlayerData/Pairs/Pair.cs +++ b/MareSynchronos/PlayerData/Pairs/Pair.cs @@ -92,6 +92,8 @@ public class Pair { try { + if (CachedPlayer != null) return; + _creationSemaphore.Wait(); if (dto == null && _onlineUserIdentDto == null) diff --git a/MareSynchronos/Services/DalamudUtilService.cs b/MareSynchronos/Services/DalamudUtilService.cs index ab53dec..267fd64 100644 --- a/MareSynchronos/Services/DalamudUtilService.cs +++ b/MareSynchronos/Services/DalamudUtilService.cs @@ -30,7 +30,7 @@ public class DalamudUtilService : IHostedService private readonly List ClassJobIdsIgnoredForPets = new() { 30 }; private uint? _classJobId = 0; private DateTime _delayedFrameworkUpdateCheck = DateTime.Now; - private Dictionary _playerCharas = new(StringComparer.Ordinal); + private Dictionary _playerCharas = new(StringComparer.Ordinal); private bool _sentBetweenAreas = false; public DalamudUtilService(ILogger logger, ClientState clientState, ObjectTable objectTable, Framework framework, @@ -77,9 +77,9 @@ public class DalamudUtilService : IHostedService return obj != null && obj.IsValid(); } - public Dalamud.Game.ClientState.Objects.Types.GameObject? CreateGameObject(IntPtr reference) + public async Task CreateGameObject(IntPtr reference) { - return _objectTable.CreateObjectReference(reference); + return await RunOnFrameworkThread(() => _objectTable.CreateObjectReference(reference)).ConfigureAwait(false); } public Dalamud.Game.ClientState.Objects.Types.Character? GetCharacterFromObjectTableByIndex(int index) @@ -94,12 +94,6 @@ public class DalamudUtilService : IHostedService return await RunOnFrameworkThread(() => GetCompanionInternal(playerPointer)).ConfigureAwait(false); } - public unsafe IntPtr GetMinion(IntPtr? playerPointer = null) - { - playerPointer ??= PlayerPointer; - return (IntPtr)((Character*)playerPointer)->CompanionObject; - } - public unsafe IntPtr GetMinionOrMount(IntPtr? playerPointer = null) { playerPointer ??= PlayerPointer; @@ -230,7 +224,7 @@ public class DalamudUtilService : IHostedService return _gameGui.WorldToScreen(obj.Position, out var screenPos) ? screenPos : Vector2.Zero; } - internal PlayerCharacter? FindPlayerByNameHash(string ident) + internal (string Name, nint Address) FindPlayerByNameHash(string ident) { _playerCharas.TryGetValue(ident, out var result); return result; @@ -245,7 +239,7 @@ public class DalamudUtilService : IHostedService { if (_clientState.LocalPlayer?.IsDead ?? false) return; - _playerCharas = _performanceCollector.LogPerformance(this, "ObjTableToCharas", () => _objectTable.OfType().ToDictionary(p => p.GetHash256(), p => p, StringComparer.Ordinal)); + _playerCharas = _performanceCollector.LogPerformance(this, "ObjTableToCharas", () => _objectTable.OfType().ToDictionary(p => p.GetHash256(), p => (p.Name.ToString(), p.Address), StringComparer.Ordinal)); if (GposeTarget != null && !IsInGpose) { diff --git a/MareSynchronos/WebAPI/Files/FileDownloadManager.cs b/MareSynchronos/WebAPI/Files/FileDownloadManager.cs index cc486f5..b107343 100644 --- a/MareSynchronos/WebAPI/Files/FileDownloadManager.cs +++ b/MareSynchronos/WebAPI/Files/FileDownloadManager.cs @@ -146,9 +146,6 @@ public partial class FileDownloadManager : DisposableMediatorSubscriberBase { Logger.LogDebug("Downloading files for {id}", gameObjectHandler.Name); - // force create lazy - _ = gameObjectHandler.GameObjectLazy.Value; - List downloadFileInfoFromService = new(); downloadFileInfoFromService.AddRange(await FilesGetSizes(fileReplacement.Select(f => f.Hash).ToList(), ct).ConfigureAwait(false));