From c5b85d9688578845836f930f43ac354fe6775a56 Mon Sep 17 00:00:00 2001 From: xPumaa <35280763+xPumaa@users.noreply.github.com> Date: Fri, 19 Aug 2022 01:09:42 +0200 Subject: [PATCH 01/12] Compatibility for FileSystemWatchers under OSX --- MareSynchronos/Plugin.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MareSynchronos/Plugin.cs b/MareSynchronos/Plugin.cs index 1502066..9b46449 100644 --- a/MareSynchronos/Plugin.cs +++ b/MareSynchronos/Plugin.cs @@ -63,6 +63,10 @@ namespace MareSynchronos _apiController = new ApiController(_configuration, _dalamudUtil); _ipcManager = new IpcManager(PluginInterface, _dalamudUtil); + // Compatibility for FileSystemWatchers under OSX + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + Environment.SetEnvironmentVariable("MONO_MANAGED_WATCHER", "enabled"); + _fileCacheManager = new FileCacheManager(_ipcManager, _configuration); _fileDialogManager = new FileDialogManager(); From 61d6458707b5c0a92dfb0911288ec32e5ec1385b Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Fri, 19 Aug 2022 11:35:43 +0200 Subject: [PATCH 02/12] fix imports and update to api11 --- MareAPI | 2 +- MareSynchronos/MareSynchronos.csproj | 2 +- MareSynchronos/Plugin.cs | 1 + MareSynchronos/WebAPI/ApIController.Functions.Files.cs | 5 +---- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/MareAPI b/MareAPI index 21fe024..374cc31 160000 --- a/MareAPI +++ b/MareAPI @@ -1 +1 @@ -Subproject commit 21fe024dfb8cecad466dfc8ceef15040300ad342 +Subproject commit 374cc31babec9ac37aa21104d7fc02e41cd0d38e diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index 1fe4706..8633aa1 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,7 +3,7 @@ - 0.3.4 + 0.3.5 https://github.com/Penumbra-Sync/client diff --git a/MareSynchronos/Plugin.cs b/MareSynchronos/Plugin.cs index 9b46449..3fcf4fa 100644 --- a/MareSynchronos/Plugin.cs +++ b/MareSynchronos/Plugin.cs @@ -13,6 +13,7 @@ using MareSynchronos.WebAPI; using Dalamud.Interface.Windowing; using MareSynchronos.UI; using MareSynchronos.Utils; +using System.Runtime.InteropServices; namespace MareSynchronos { diff --git a/MareSynchronos/WebAPI/ApIController.Functions.Files.cs b/MareSynchronos/WebAPI/ApIController.Functions.Files.cs index 2d7809f..2c224be 100644 --- a/MareSynchronos/WebAPI/ApIController.Functions.Files.cs +++ b/MareSynchronos/WebAPI/ApIController.Functions.Files.cs @@ -74,10 +74,7 @@ namespace MareSynchronos.WebAPI Logger.Debug("Downloading files (Download ID " + currentDownloadId + ")"); List downloadFileInfoFromService = new List(); - foreach (var file in fileReplacementDto) - { - downloadFileInfoFromService.Add(await _mareHub!.InvokeAsync(Api.InvokeFileGetFileSize, file.Hash, ct)); - } + downloadFileInfoFromService.AddRange(await _mareHub!.InvokeAsync>(Api.InvokeGetFilesSizes, fileReplacementDto.Select(f => f.Hash).ToList(), ct)); CurrentDownloads[currentDownloadId] = downloadFileInfoFromService.Distinct().Select(d => new DownloadFileTransfer(d)) .Where(d => d.CanBeTransferred).ToList(); From 0d3fbc245bd34d68a0190502d5774973b90f8821 Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Wed, 24 Aug 2022 01:40:21 +0200 Subject: [PATCH 03/12] test version for .net6/dalamudapi7 --- MareSynchronos/Factories/CharacterDataFactory.cs | 2 +- MareSynchronos/Managers/CachedPlayer.cs | 10 ++++++---- MareSynchronos/Managers/PlayerManager.cs | 1 - MareSynchronos/MareSynchronos.csproj | 12 ++++++------ MareSynchronos/UI/CompactUI.cs | 2 +- Penumbra | 2 +- 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/MareSynchronos/Factories/CharacterDataFactory.cs b/MareSynchronos/Factories/CharacterDataFactory.cs index 58547ed..ee851d9 100644 --- a/MareSynchronos/Factories/CharacterDataFactory.cs +++ b/MareSynchronos/Factories/CharacterDataFactory.cs @@ -169,7 +169,7 @@ public class CharacterDataFactory private void AddReplacementsFromTexture(string texPath, ObjectKind objectKind, CharacterData cache, int inheritanceLevel = 0, bool doNotReverseResolve = true) { - if (texPath.IsNullOrEmpty()) return; + if (string.IsNullOrEmpty(texPath)) return; //Logger.Verbose("Adding File Replacement for Texture " + texPath); diff --git a/MareSynchronos/Managers/CachedPlayer.cs b/MareSynchronos/Managers/CachedPlayer.cs index 8ef1d8c..335eb43 100644 --- a/MareSynchronos/Managers/CachedPlayer.cs +++ b/MareSynchronos/Managers/CachedPlayer.cs @@ -9,9 +9,9 @@ using FFXIVClientStructs.FFXIV.Client.Game.Character; using MareSynchronos.API; using MareSynchronos.FileCacheDB; using MareSynchronos.Interop; +using MareSynchronos.Models; using MareSynchronos.Utils; using MareSynchronos.WebAPI; -using Penumbra.GameData.Structs; namespace MareSynchronos.Managers; @@ -59,7 +59,7 @@ public class CachedPlayer private CharacterCacheDto _cachedData = new(); - private CharacterEquipment? _currentCharacterEquipment; + private PlayerRelatedObject? _currentCharacterEquipment; public void ApplyCharacterData(CharacterCacheDto characterData) { @@ -363,7 +363,8 @@ public class CachedPlayer _dalamudUtil.FrameworkUpdate += DalamudUtilOnFrameworkUpdate; _ipcManager.PenumbraRedrawEvent += IpcManagerOnPenumbraRedrawEvent; _originalGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter); - _currentCharacterEquipment = new CharacterEquipment(PlayerCharacter); + _currentCharacterEquipment = new PlayerRelatedObject(ObjectKind.Player, IntPtr.Zero, IntPtr.Zero, + () => _dalamudUtil.GetPlayerCharacterFromObjectTableByName(PlayerName)?.Address ?? IntPtr.Zero); _isDisposed = false; if (cache != null) { @@ -382,7 +383,8 @@ public class CachedPlayer return; } - if (!_currentCharacterEquipment!.CompareAndUpdate(PlayerCharacter)) + _currentCharacterEquipment?.CheckAndUpdateObject(); + if (_currentCharacterEquipment?.HasUnprocessedUpdate ?? false) { OnPlayerChanged(); } diff --git a/MareSynchronos/Managers/PlayerManager.cs b/MareSynchronos/Managers/PlayerManager.cs index b925018..d23bbed 100644 --- a/MareSynchronos/Managers/PlayerManager.cs +++ b/MareSynchronos/Managers/PlayerManager.cs @@ -29,7 +29,6 @@ namespace MareSynchronos.Managers private CancellationTokenSource? _playerChangedCts = new(); private DateTime _lastPlayerObjectCheck; - private CharacterEquipment? _currentCharacterEquipment = new(); private List playerRelatedObjects = new List(); diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index 8633aa1..3153f8f 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,14 +3,14 @@ - 0.3.5 + 0.3.6 https://github.com/Penumbra-Sync/client - net5.0-windows7.0 + net6.0-windows x64 enable latest @@ -21,15 +21,15 @@ - $(appdata)\XIVLauncher\addon\Hooks\dev\ + $(appdata)\XIVLauncher\addon\Hooks\6692d56\ - + - - + + diff --git a/MareSynchronos/UI/CompactUI.cs b/MareSynchronos/UI/CompactUI.cs index 3097f10..e63cbe0 100644 --- a/MareSynchronos/UI/CompactUI.cs +++ b/MareSynchronos/UI/CompactUI.cs @@ -167,7 +167,7 @@ namespace MareSynchronos.UI _showUidForEntry.TryGetValue(entry.OtherUID, out var showUidInsteadOfName); if (!showUidInsteadOfName && _configuration.GetCurrentServerUidComments().TryGetValue(entry.OtherUID, out var playerText)) { - if (playerText.IsNullOrEmpty()) + if (string.IsNullOrEmpty(playerText)) { playerText = entry.OtherUID; } diff --git a/Penumbra b/Penumbra index cfc441b..cfeb20a 160000 --- a/Penumbra +++ b/Penumbra @@ -1 +1 @@ -Subproject commit cfc441b9b1acaaf1bf2da758bd875cfb5229ab60 +Subproject commit cfeb20a18efc41221ca5aaa2f3562c93536a8f4d From 5cdb9e6dfa680b027b9494d18723e4031287d3fd Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Wed, 24 Aug 2022 22:02:56 +0200 Subject: [PATCH 04/12] fix minions/mounts for 6.2, todo: remove penumbra redraw once glamourer is available --- MareAPI | 2 +- .../Factories/CharacterDataFactory.cs | 19 ++++---- MareSynchronos/Managers/CachedPlayer.cs | 46 ++++++++----------- MareSynchronos/Managers/PlayerManager.cs | 5 +- MareSynchronos/MareSynchronos.csproj | 2 +- MareSynchronos/Models/PlayerRelatedObject.cs | 39 ++++++++-------- .../WebAPI/ApiController.Connectivity.cs | 26 +++++++++-- Penumbra | 2 +- 8 files changed, 72 insertions(+), 69 deletions(-) diff --git a/MareAPI b/MareAPI index 374cc31..37d4eb5 160000 --- a/MareAPI +++ b/MareAPI @@ -1 +1 @@ -Subproject commit 374cc31babec9ac37aa21104d7fc02e41cd0d38e +Subproject commit 37d4eb5b1d8fc7d6adba0d58fa3cfdf79542700f diff --git a/MareSynchronos/Factories/CharacterDataFactory.cs b/MareSynchronos/Factories/CharacterDataFactory.cs index ee851d9..5ea8582 100644 --- a/MareSynchronos/Factories/CharacterDataFactory.cs +++ b/MareSynchronos/Factories/CharacterDataFactory.cs @@ -31,14 +31,14 @@ public class CharacterDataFactory _ipcManager = ipcManager; } - public CharacterData BuildCharacterData(CharacterData previousData, ObjectKind objectKind, IntPtr playerPointer, CancellationToken token) + public unsafe CharacterData BuildCharacterData(CharacterData previousData, ObjectKind objectKind, IntPtr playerPointer, CancellationToken token) { if (!_ipcManager.Initialized) { throw new ArgumentException("Penumbra is not connected"); } - if (playerPointer == IntPtr.Zero) + if (playerPointer == IntPtr.Zero || ((Character*)playerPointer)->GameObject.GetDrawObject() == null) { Logger.Verbose("Pointer was zero for " + objectKind); previousData.FileReplacements.Remove(objectKind); @@ -198,6 +198,11 @@ public class CharacterDataFactory private unsafe CharacterData CreateCharacterData(CharacterData previousData, ObjectKind objectKind, IntPtr charaPointer, CancellationToken token) { + if (previousData.FileReplacements.ContainsKey(objectKind)) + { + previousData.FileReplacements[objectKind].Clear(); + } + Stopwatch st = Stopwatch.StartNew(); var chara = _dalamudUtil.CreateGameObject(charaPointer)!; while (!_dalamudUtil.IsObjectPresent(chara)) @@ -207,17 +212,9 @@ public class CharacterDataFactory } _dalamudUtil.WaitWhileCharacterIsDrawing(charaPointer); - if (previousData.FileReplacements.ContainsKey(objectKind)) - { - previousData.FileReplacements[objectKind].Clear(); - } - previousData.ManipulationString = _ipcManager.PenumbraGetMetaManipulations(); - if (objectKind is not ObjectKind.Mount) - { - previousData.GlamourerString[objectKind] = _ipcManager.GlamourerGetCharacterCustomization(chara); - } + previousData.GlamourerString[objectKind] = _ipcManager.GlamourerGetCharacterCustomization(chara); var human = (Human*)((Character*)charaPointer)->GameObject.GetDrawObject(); for (var mdlIdx = 0; mdlIdx < human->CharacterBase.SlotCount; ++mdlIdx) diff --git a/MareSynchronos/Managers/CachedPlayer.cs b/MareSynchronos/Managers/CachedPlayer.cs index 335eb43..a7b62fd 100644 --- a/MareSynchronos/Managers/CachedPlayer.cs +++ b/MareSynchronos/Managers/CachedPlayer.cs @@ -236,14 +236,18 @@ public class CachedPlayer Logger.Debug( $"Request Redraw for {PlayerName}"); _ipcManager.GlamourerApplyAll(glamourerData, PlayerCharacter.Address); + // todo: remove + _ipcManager.PenumbraRedraw(PlayerCharacter.Address); } - else if (objectKind == ObjectKind.Minion) + else if (objectKind == ObjectKind.MinionOrMount) { - var minion = ((Character*)PlayerCharacter.Address)->CompanionObject; - if (minion != null) + var minionOrMount = ((Character*)PlayerCharacter.Address)->CompanionObject; + if (minionOrMount != null) { - Logger.Debug($"Request Redraw for Minion"); - _ipcManager.GlamourerApplyAll(glamourerData, obj: (IntPtr)minion); + Logger.Debug($"Request Redraw for Minion/Mount"); + _ipcManager.GlamourerApplyAll(glamourerData, obj: (IntPtr)minionOrMount); + // todo: remove + _ipcManager.PenumbraRedraw((IntPtr)minionOrMount); } } else if (objectKind == ObjectKind.Pet) @@ -253,6 +257,8 @@ public class CachedPlayer { Logger.Debug("Request Redraw for Pet"); _ipcManager.GlamourerApplyAll(glamourerData, pet); + // todo: remove + _ipcManager.PenumbraRedraw(pet); } } else if (objectKind == ObjectKind.Companion) @@ -262,15 +268,8 @@ public class CachedPlayer { Logger.Debug("Request Redraw for Companion"); _ipcManager.GlamourerApplyAll(glamourerData, companion); - } - } - else if (objectKind == ObjectKind.Mount) - { - var mount = ((CharaExt*)PlayerCharacter.Address)->Mount; - if (mount != null) - { - Logger.Debug($"Request Redraw for Mount"); - _ipcManager.PenumbraRedraw((IntPtr)mount); + // todo: remove + _ipcManager.PenumbraRedraw(companion); } } } @@ -283,13 +282,15 @@ public class CachedPlayer { _ipcManager.GlamourerApplyOnlyCustomization(_originalGlamourerData, PlayerCharacter); _ipcManager.GlamourerApplyOnlyEquipment(_lastGlamourerData, PlayerCharacter); + // todo: remove + _ipcManager.PenumbraRedraw(PlayerCharacter.Address); } - else if (objectKind == ObjectKind.Minion) + else if (objectKind == ObjectKind.MinionOrMount) { - var minion = ((Character*)PlayerCharacter.Address)->CompanionObject; - if (minion != null) + var minionOrMount = ((Character*)PlayerCharacter.Address)->CompanionObject; + if (minionOrMount != null) { - _ipcManager.PenumbraRedraw((IntPtr)minion); + _ipcManager.PenumbraRedraw((IntPtr)minionOrMount); } } else if (objectKind == ObjectKind.Pet) @@ -308,14 +309,6 @@ public class CachedPlayer _ipcManager.PenumbraRedraw(companion); } } - else if (objectKind == ObjectKind.Mount) - { - var mount = ((CharaExt*)PlayerCharacter.Address)->Mount; - if (mount != null) - { - _ipcManager.PenumbraRedraw((IntPtr)mount); - } - } } public void DisposePlayer() @@ -429,6 +422,7 @@ public class CachedPlayer Logger.Debug($"Player {PlayerName} changed, PenumbraRedraw is {RequestedPenumbraRedraw}"); if (!RequestedPenumbraRedraw && PlayerCharacter is not null) { + _currentCharacterEquipment.HasUnprocessedUpdate = false; Logger.Debug($"Saving new Glamourer data"); _lastGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter!); } diff --git a/MareSynchronos/Managers/PlayerManager.cs b/MareSynchronos/Managers/PlayerManager.cs index d23bbed..feca223 100644 --- a/MareSynchronos/Managers/PlayerManager.cs +++ b/MareSynchronos/Managers/PlayerManager.cs @@ -5,12 +5,10 @@ using System; using System.Threading; using System.Threading.Tasks; using MareSynchronos.API; -using Penumbra.GameData.Structs; using FFXIVClientStructs.FFXIV.Client.Game.Character; using System.Collections.Generic; using System.Linq; using MareSynchronos.Models; -using MareSynchronos.Interop; namespace MareSynchronos.Managers { @@ -55,10 +53,9 @@ namespace MareSynchronos.Managers playerRelatedObjects = new List() { new PlayerRelatedObject(ObjectKind.Player, IntPtr.Zero, IntPtr.Zero, () => _dalamudUtil.PlayerPointer), - new PlayerRelatedObject(ObjectKind.Minion, IntPtr.Zero, IntPtr.Zero, () => (IntPtr)((Character*)_dalamudUtil.PlayerPointer)->CompanionObject), + new PlayerRelatedObject(ObjectKind.MinionOrMount, IntPtr.Zero, IntPtr.Zero, () => (IntPtr)((Character*)_dalamudUtil.PlayerPointer)->CompanionObject), new PlayerRelatedObject(ObjectKind.Pet, IntPtr.Zero, IntPtr.Zero, () => _dalamudUtil.GetPet()), new PlayerRelatedObject(ObjectKind.Companion, IntPtr.Zero, IntPtr.Zero, () => _dalamudUtil.GetCompanion()), - new PlayerRelatedObject(ObjectKind.Mount, IntPtr.Zero, IntPtr.Zero, () => (IntPtr)((CharaExt*)_dalamudUtil.PlayerPointer)->Mount), }; } diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index 3153f8f..33749dd 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -21,7 +21,7 @@ - $(appdata)\XIVLauncher\addon\Hooks\6692d56\ + $(appdata)\XIVLauncher\addon\Hooks\Dev\ diff --git a/MareSynchronos/Models/PlayerRelatedObject.cs b/MareSynchronos/Models/PlayerRelatedObject.cs index 08b4393..62096f1 100644 --- a/MareSynchronos/Models/PlayerRelatedObject.cs +++ b/MareSynchronos/Models/PlayerRelatedObject.cs @@ -47,7 +47,7 @@ namespace MareSynchronos.Models var chara = (Character*)curPtr; bool addr = Address == IntPtr.Zero || Address != curPtr; bool equip = CompareAndUpdateByteData(chara->EquipSlotData, chara->CustomizeData); - bool drawObj = (chara->GameObject.DrawObject != null && (IntPtr)chara->GameObject.DrawObject != DrawObjectAddress); + bool drawObj = (IntPtr)chara->GameObject.DrawObject != DrawObjectAddress; var name = new Utf8String(chara->GameObject.Name).ToString(); bool nameChange = (name != _name); if (addr || equip || drawObj || nameChange) @@ -98,33 +98,30 @@ namespace MareSynchronos.Models } } - if (ObjectKind is not ObjectKind.Mount) + var newHatState = Marshal.ReadByte((IntPtr)customizeData + 30, 0); + var newWeaponOrVisorState = Marshal.ReadByte((IntPtr)customizeData + 31, 0); + if (newHatState != HatState) { - var newHatState = Marshal.ReadByte((IntPtr)customizeData + 30, 0); - var newWeaponOrVisorState = Marshal.ReadByte((IntPtr)customizeData + 31, 0); - if (newHatState != HatState) + if (HatState != null && !hasChanges && !HasUnprocessedUpdate) { - if (HatState != null && !hasChanges && !HasUnprocessedUpdate) - { - Logger.Debug("Not Sending Update, only Hat changed"); - DoNotSendUpdate = true; - } - HatState = newHatState; - hasChanges = true; + Logger.Debug("Not Sending Update, only Hat changed"); + DoNotSendUpdate = true; } + HatState = newHatState; + hasChanges = true; + } - newWeaponOrVisorState &= 0b1101; // ignore drawing weapon + newWeaponOrVisorState &= 0b1101; // ignore drawing weapon - if (newWeaponOrVisorState != VisorWeaponState) + if (newWeaponOrVisorState != VisorWeaponState) + { + if (VisorWeaponState != null && !hasChanges && !HasUnprocessedUpdate) { - if (VisorWeaponState != null && !hasChanges && !HasUnprocessedUpdate) - { - Logger.Debug("Not Sending Update, only Visor/Weapon changed"); - DoNotSendUpdate = true; - } - VisorWeaponState = newWeaponOrVisorState; - hasChanges = true; + Logger.Debug("Not Sending Update, only Visor/Weapon changed"); + DoNotSendUpdate = true; } + VisorWeaponState = newWeaponOrVisorState; + hasChanges = true; } return hasChanges; diff --git a/MareSynchronos/WebAPI/ApiController.Connectivity.cs b/MareSynchronos/WebAPI/ApiController.Connectivity.cs index 4df15ba..bb87e34 100644 --- a/MareSynchronos/WebAPI/ApiController.Connectivity.cs +++ b/MareSynchronos/WebAPI/ApiController.Connectivity.cs @@ -124,12 +124,24 @@ namespace MareSynchronos.WebAPI private string ApiUri => _pluginConfiguration.ApiUri; public int OnlineUsers => SystemInfoDto.OnlineUsers; - public ServerState ServerState { get; private set; } + private ServerState _serverState; + public ServerState ServerState + { + get => _serverState; + private set + { + Logger.Debug($"New ServerState: {value}, prev ServerState: {_serverState}"); + _serverState = value; + } + } public async Task CreateConnections() { + await StopConnection(_connectionCancellationTokenSource.Token); + if (_pluginConfiguration.FullPause) { + Logger.Info("Not recreating Connection, paused"); ServerState = ServerState.Disconnected; _connectionDto = null; return; @@ -137,8 +149,6 @@ namespace MareSynchronos.WebAPI Logger.Info("Recreating Connection"); - await StopConnection(_connectionCancellationTokenSource.Token); - _connectionCancellationTokenSource.Cancel(); _connectionCancellationTokenSource = new CancellationTokenSource(); var token = _connectionCancellationTokenSource.Token; @@ -298,9 +308,9 @@ namespace MareSynchronos.WebAPI CurrentUploads.Clear(); CurrentDownloads.Clear(); _uploadCancellationTokenSource?.Cancel(); - Logger.Info("Connection closed"); Disconnected?.Invoke(); ServerState = ServerState.Offline; + Logger.Info("Connection closed"); return Task.CompletedTask; } @@ -337,6 +347,14 @@ namespace MareSynchronos.WebAPI await _mareHub.DisposeAsync(); _mareHub = null; } + + if (ServerState != ServerState.Disconnected) + { + while (ServerState != ServerState.Offline) + { + await Task.Delay(16); + } + } } } } diff --git a/Penumbra b/Penumbra index cfeb20a..e66ca7c 160000 --- a/Penumbra +++ b/Penumbra @@ -1 +1 @@ -Subproject commit cfeb20a18efc41221ca5aaa2f3562c93536a8f4d +Subproject commit e66ca7c5805bf23a82b51649e7f5f75baabe4bc7 From 258d19711ada1e09976ad52ea27909e8ee4eaea8 Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Wed, 24 Aug 2022 22:36:14 +0200 Subject: [PATCH 05/12] fix companion (wtf SE) --- MareSynchronos/Factories/CharacterDataFactory.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/MareSynchronos/Factories/CharacterDataFactory.cs b/MareSynchronos/Factories/CharacterDataFactory.cs index 5ea8582..d9a8606 100644 --- a/MareSynchronos/Factories/CharacterDataFactory.cs +++ b/MareSynchronos/Factories/CharacterDataFactory.cs @@ -38,7 +38,19 @@ public class CharacterDataFactory throw new ArgumentException("Penumbra is not connected"); } - if (playerPointer == IntPtr.Zero || ((Character*)playerPointer)->GameObject.GetDrawObject() == null) + bool pointerIsZero = true; + try + { + pointerIsZero = playerPointer == IntPtr.Zero || ((Character*)playerPointer)->GameObject.GetDrawObject() == null; + } + catch (Exception ex) + { + Logger.Warn("Could not create data for " + objectKind); + Logger.Warn(ex.Message); + Logger.Warn(ex.StackTrace ?? string.Empty); + } + + if (pointerIsZero) { Logger.Verbose("Pointer was zero for " + objectKind); previousData.FileReplacements.Remove(objectKind); From cbe45a8ad6174a8739fca6eaaa0ac3ee6634e9f9 Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Thu, 25 Aug 2022 01:26:23 +0200 Subject: [PATCH 06/12] add vanity uid to UI --- MareAPI | 2 +- MareSynchronos/Managers/CachedPlayer.cs | 2 +- MareSynchronos/UI/CompactUI.cs | 21 +++++++++++---------- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/MareAPI b/MareAPI index 37d4eb5..645dd0b 160000 --- a/MareAPI +++ b/MareAPI @@ -1 +1 @@ -Subproject commit 37d4eb5b1d8fc7d6adba0d58fa3cfdf79542700f +Subproject commit 645dd0b18f815cb7ccd81f37e84ded9cf650c3f3 diff --git a/MareSynchronos/Managers/CachedPlayer.cs b/MareSynchronos/Managers/CachedPlayer.cs index a7b62fd..a25849e 100644 --- a/MareSynchronos/Managers/CachedPlayer.cs +++ b/MareSynchronos/Managers/CachedPlayer.cs @@ -422,7 +422,7 @@ public class CachedPlayer Logger.Debug($"Player {PlayerName} changed, PenumbraRedraw is {RequestedPenumbraRedraw}"); if (!RequestedPenumbraRedraw && PlayerCharacter is not null) { - _currentCharacterEquipment.HasUnprocessedUpdate = false; + _currentCharacterEquipment!.HasUnprocessedUpdate = false; Logger.Debug($"Saving new Glamourer data"); _lastGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter!); } diff --git a/MareSynchronos/UI/CompactUI.cs b/MareSynchronos/UI/CompactUI.cs index e63cbe0..07668ed 100644 --- a/MareSynchronos/UI/CompactUI.cs +++ b/MareSynchronos/UI/CompactUI.cs @@ -132,7 +132,8 @@ namespace MareSynchronos.UI var buttonSize = UiShared.GetIconButtonSize(pauseIcon); var trashButtonSize = UiShared.GetIconButtonSize(FontAwesomeIcon.Trash); - var textSize = ImGui.CalcTextSize(entry.OtherUID); + var entryUID = string.IsNullOrEmpty(entry.VanityUID) ? entry.OtherUID : entry.VanityUID; + var textSize = ImGui.CalcTextSize(entryUID); var originalY = ImGui.GetCursorPosY(); var buttonSizes = buttonSize.Y + trashButtonSize.Y; @@ -144,7 +145,7 @@ namespace MareSynchronos.UI UiShared.ColorText(FontAwesomeIcon.ArrowUp.ToIconString(), ImGuiColors.DalamudRed); ImGui.PopFont(); - UiShared.AttachToolTip(entry.OtherUID + " has not added you back"); + UiShared.AttachToolTip(entryUID + " has not added you back"); } else if (entry.IsPaused || entry.IsPausedFromOthers) { @@ -152,7 +153,7 @@ namespace MareSynchronos.UI UiShared.ColorText(FontAwesomeIcon.PauseCircle.ToIconString(), ImGuiColors.DalamudYellow); ImGui.PopFont(); - UiShared.AttachToolTip("Pairing status with " + entry.OtherUID + " is paused"); + UiShared.AttachToolTip("Pairing status with " + entryUID + " is paused"); } else { @@ -160,7 +161,7 @@ namespace MareSynchronos.UI UiShared.ColorText(FontAwesomeIcon.Check.ToIconString(), ImGuiColors.ParsedGreen); ImGui.PopFont(); - UiShared.AttachToolTip("You are paired with " + entry.OtherUID); + UiShared.AttachToolTip("You are paired with " + entryUID); } var textIsUid = true; @@ -169,7 +170,7 @@ namespace MareSynchronos.UI { if (string.IsNullOrEmpty(playerText)) { - playerText = entry.OtherUID; + playerText = entryUID; } else { @@ -178,7 +179,7 @@ namespace MareSynchronos.UI } else { - playerText = entry.OtherUID; + playerText = entryUID; } ImGui.SameLine(); @@ -189,7 +190,7 @@ namespace MareSynchronos.UI ImGui.TextUnformatted(playerText); if (textIsUid) ImGui.PopFont(); UiShared.AttachToolTip("Left click to switch between UID display and nick" + Environment.NewLine + - "Right click to change nick for " + entry.OtherUID); + "Right click to change nick for " + entryUID); if (ImGui.IsItemClicked(ImGuiMouseButton.Left)) { var prevState = textIsUid; @@ -240,7 +241,7 @@ namespace MareSynchronos.UI _apiController.PairedClients.Remove(entry); } } - UiShared.AttachToolTip("Hold CTRL and click to unpair permanently from " + entry.OtherUID); + UiShared.AttachToolTip("Hold CTRL and click to unpair permanently from " + entryUID); if (entry.IsSynced) { @@ -251,8 +252,8 @@ namespace MareSynchronos.UI _ = _apiController.SendPairedClientPauseChange(entry.OtherUID, !entry.IsPaused); } UiShared.AttachToolTip(!entry.IsPaused - ? "Pause pairing with " + entry.OtherUID - : "Resume pairing with " + entry.OtherUID); + ? "Pause pairing with " + entryUID + : "Resume pairing with " + entryUID); } } From 4e2d371f105b90f97c44e32bc07132f4deed85a4 Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Thu, 25 Aug 2022 14:09:50 +0200 Subject: [PATCH 07/12] check for glamourer api and if not present do not use glamourer --- MareSynchronos/Managers/CachedPlayer.cs | 57 ++++++++++++++++++------- MareSynchronos/UI/UIShared.cs | 1 - 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/MareSynchronos/Managers/CachedPlayer.cs b/MareSynchronos/Managers/CachedPlayer.cs index a25849e..7741180 100644 --- a/MareSynchronos/Managers/CachedPlayer.cs +++ b/MareSynchronos/Managers/CachedPlayer.cs @@ -235,9 +235,14 @@ public class CachedPlayer RequestedPenumbraRedraw = true; Logger.Debug( $"Request Redraw for {PlayerName}"); - _ipcManager.GlamourerApplyAll(glamourerData, PlayerCharacter.Address); - // todo: remove - _ipcManager.PenumbraRedraw(PlayerCharacter.Address); + if (_ipcManager.CheckGlamourerApi()) + { + _ipcManager.GlamourerApplyAll(glamourerData, PlayerCharacter.Address); + } + else + { + _ipcManager.PenumbraRedraw(PlayerCharacter.Address); + } } else if (objectKind == ObjectKind.MinionOrMount) { @@ -245,9 +250,14 @@ public class CachedPlayer if (minionOrMount != null) { Logger.Debug($"Request Redraw for Minion/Mount"); - _ipcManager.GlamourerApplyAll(glamourerData, obj: (IntPtr)minionOrMount); - // todo: remove - _ipcManager.PenumbraRedraw((IntPtr)minionOrMount); + if (_ipcManager.CheckGlamourerApi()) + { + _ipcManager.GlamourerApplyAll(glamourerData, obj: (IntPtr)minionOrMount); + } + else + { + _ipcManager.PenumbraRedraw((IntPtr)minionOrMount); + } } } else if (objectKind == ObjectKind.Pet) @@ -256,9 +266,14 @@ public class CachedPlayer if (pet != IntPtr.Zero) { Logger.Debug("Request Redraw for Pet"); - _ipcManager.GlamourerApplyAll(glamourerData, pet); - // todo: remove - _ipcManager.PenumbraRedraw(pet); + if (_ipcManager.CheckGlamourerApi()) + { + _ipcManager.GlamourerApplyAll(glamourerData, pet); + } + else + { + _ipcManager.PenumbraRedraw(pet); + } } } else if (objectKind == ObjectKind.Companion) @@ -267,9 +282,14 @@ public class CachedPlayer if (companion != IntPtr.Zero) { Logger.Debug("Request Redraw for Companion"); - _ipcManager.GlamourerApplyAll(glamourerData, companion); - // todo: remove - _ipcManager.PenumbraRedraw(companion); + if (_ipcManager.CheckGlamourerApi()) + { + _ipcManager.GlamourerApplyAll(glamourerData, companion); + } + else + { + _ipcManager.PenumbraRedraw(companion); + } } } } @@ -280,10 +300,15 @@ public class CachedPlayer if (objectKind == ObjectKind.Player) { - _ipcManager.GlamourerApplyOnlyCustomization(_originalGlamourerData, PlayerCharacter); - _ipcManager.GlamourerApplyOnlyEquipment(_lastGlamourerData, PlayerCharacter); - // todo: remove - _ipcManager.PenumbraRedraw(PlayerCharacter.Address); + if (_ipcManager.CheckGlamourerApi()) + { + _ipcManager.GlamourerApplyOnlyCustomization(_originalGlamourerData, PlayerCharacter); + _ipcManager.GlamourerApplyOnlyEquipment(_lastGlamourerData, PlayerCharacter); + } + else + { + _ipcManager.PenumbraRedraw(PlayerCharacter.Address); + } } else if (objectKind == ObjectKind.MinionOrMount) { diff --git a/MareSynchronos/UI/UIShared.cs b/MareSynchronos/UI/UIShared.cs index d4ff9c5..e6226ad 100644 --- a/MareSynchronos/UI/UIShared.cs +++ b/MareSynchronos/UI/UIShared.cs @@ -40,7 +40,6 @@ namespace MareSynchronos.UI public static bool CtrlPressed() => (GetKeyState(0xA2) & 0x8000) != 0 || (GetKeyState(0xA3) & 0x8000) != 0; - // todo remove after rework public ApiController ApiController => _apiController; public UiShared(IpcManager ipcManager, ApiController apiController, FileCacheManager fileCacheManager, FileDialogManager fileDialogManager, Configuration pluginConfiguration, DalamudUtil dalamudUtil, DalamudPluginInterface pluginInterface, Dalamud.Localization localization) From 1d6d390dd6e85535b7adaf818483a8d283aa206b Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Thu, 25 Aug 2022 20:36:21 +0200 Subject: [PATCH 08/12] fix mounts --- MareSynchronos/Managers/CachedPlayer.cs | 8 ++++---- MareSynchronos/Managers/IpcManager.cs | 19 +++++++++++++------ MareSynchronos/MareSynchronos.csproj | 2 +- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/MareSynchronos/Managers/CachedPlayer.cs b/MareSynchronos/Managers/CachedPlayer.cs index 7741180..82041f1 100644 --- a/MareSynchronos/Managers/CachedPlayer.cs +++ b/MareSynchronos/Managers/CachedPlayer.cs @@ -235,7 +235,7 @@ public class CachedPlayer RequestedPenumbraRedraw = true; Logger.Debug( $"Request Redraw for {PlayerName}"); - if (_ipcManager.CheckGlamourerApi()) + if (_ipcManager.CheckGlamourerApi() && !string.IsNullOrEmpty(glamourerData)) { _ipcManager.GlamourerApplyAll(glamourerData, PlayerCharacter.Address); } @@ -250,7 +250,7 @@ public class CachedPlayer if (minionOrMount != null) { Logger.Debug($"Request Redraw for Minion/Mount"); - if (_ipcManager.CheckGlamourerApi()) + if (_ipcManager.CheckGlamourerApi() && !string.IsNullOrEmpty(glamourerData)) { _ipcManager.GlamourerApplyAll(glamourerData, obj: (IntPtr)minionOrMount); } @@ -266,7 +266,7 @@ public class CachedPlayer if (pet != IntPtr.Zero) { Logger.Debug("Request Redraw for Pet"); - if (_ipcManager.CheckGlamourerApi()) + if (_ipcManager.CheckGlamourerApi() && !string.IsNullOrEmpty(glamourerData)) { _ipcManager.GlamourerApplyAll(glamourerData, pet); } @@ -282,7 +282,7 @@ public class CachedPlayer if (companion != IntPtr.Zero) { Logger.Debug("Request Redraw for Companion"); - if (_ipcManager.CheckGlamourerApi()) + if (_ipcManager.CheckGlamourerApi() && !string.IsNullOrEmpty(glamourerData)) { _ipcManager.GlamourerApplyAll(glamourerData, companion); } diff --git a/MareSynchronos/Managers/IpcManager.cs b/MareSynchronos/Managers/IpcManager.cs index 7aa4a75..e2ce186 100644 --- a/MareSynchronos/Managers/IpcManager.cs +++ b/MareSynchronos/Managers/IpcManager.cs @@ -143,12 +143,19 @@ namespace MareSynchronos.Managers public string GlamourerGetCharacterCustomization(GameObject character) { if (!CheckGlamourerApi()) return string.Empty; - var glamourerString = _glamourerGetAllCustomization!.InvokeFunc(character); - byte[] bytes = Convert.FromBase64String(glamourerString); - // ignore transparency - bytes[88] = 128; - bytes[89] = 63; - return Convert.ToBase64String(bytes); + try + { + var glamourerString = _glamourerGetAllCustomization!.InvokeFunc(character); + byte[] bytes = Convert.FromBase64String(glamourerString); + // ignore transparency + bytes[88] = 128; + bytes[89] = 63; + return Convert.ToBase64String(bytes); + } + catch + { + return string.Empty; + } } public void GlamourerRevertCharacterCustomization(GameObject character) diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index 33749dd..06ce8cc 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,7 +3,7 @@ - 0.3.6 + 0.3.7 https://github.com/Penumbra-Sync/client From 99dca93fb9de0ad4fe8a5324990d42ae88623692 Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Thu, 25 Aug 2022 20:38:07 +0200 Subject: [PATCH 09/12] delete sqlite garbage from project --- MareSynchronos/MareSynchronos.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index 06ce8cc..667bf24 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -84,7 +84,7 @@ - + From 1401656cbafa6cfda7e6f20ab507e9fd8ce91802 Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Fri, 26 Aug 2022 16:02:28 +0200 Subject: [PATCH 10/12] add fallback transports --- MareSynchronos/MareSynchronos.csproj | 2 +- MareSynchronos/WebAPI/ApiController.Connectivity.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index 667bf24..f3094c9 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,7 +3,7 @@ - 0.3.7 + 0.3.8 https://github.com/Penumbra-Sync/client diff --git a/MareSynchronos/WebAPI/ApiController.Connectivity.cs b/MareSynchronos/WebAPI/ApiController.Connectivity.cs index bb87e34..010fbc5 100644 --- a/MareSynchronos/WebAPI/ApiController.Connectivity.cs +++ b/MareSynchronos/WebAPI/ApiController.Connectivity.cs @@ -297,7 +297,7 @@ namespace MareSynchronos.WebAPI .WithUrl(ApiUri + hubName, options => { options.Headers.Add("Authorization", SecretKey); - options.Transports = HttpTransportType.WebSockets; + options.Transports = HttpTransportType.WebSockets | HttpTransportType.ServerSentEvents | HttpTransportType.LongPolling; }) .WithAutomaticReconnect(new ForeverRetryPolicy()) .Build(); From a7a3ae66a970edd05fb3ac0fc46d118cfbd9446d Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Wed, 31 Aug 2022 16:27:28 +0200 Subject: [PATCH 11/12] connectivity fixes --- MareSynchronos/Managers/CachedPlayer.cs | 6 +++-- MareSynchronos/MareSynchronos.csproj | 2 +- MareSynchronos/Models/PlayerRelatedObject.cs | 10 ++----- .../WebAPI/ApiController.Connectivity.cs | 26 ++++++++----------- 4 files changed, 18 insertions(+), 26 deletions(-) diff --git a/MareSynchronos/Managers/CachedPlayer.cs b/MareSynchronos/Managers/CachedPlayer.cs index 82041f1..5070de0 100644 --- a/MareSynchronos/Managers/CachedPlayer.cs +++ b/MareSynchronos/Managers/CachedPlayer.cs @@ -426,7 +426,9 @@ public class CachedPlayer _penumbraRedrawEventTask = Task.Run(() => { PlayerCharacter = player; - _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerCharacter.Address); + using var cts = new CancellationTokenSource(); + cts.CancelAfter(TimeSpan.FromSeconds(5)); + _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerCharacter.Address, cts.Token); if (RequestedPenumbraRedraw == false) { @@ -445,9 +447,9 @@ public class CachedPlayer private void OnPlayerChanged() { Logger.Debug($"Player {PlayerName} changed, PenumbraRedraw is {RequestedPenumbraRedraw}"); + _currentCharacterEquipment!.HasUnprocessedUpdate = false; if (!RequestedPenumbraRedraw && PlayerCharacter is not null) { - _currentCharacterEquipment!.HasUnprocessedUpdate = false; Logger.Debug($"Saving new Glamourer data"); _lastGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter!); } diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index f3094c9..01b3da1 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,7 +3,7 @@ - 0.3.8 + 0.3.9 https://github.com/Penumbra-Sync/client diff --git a/MareSynchronos/Models/PlayerRelatedObject.cs b/MareSynchronos/Models/PlayerRelatedObject.cs index 62096f1..39a021d 100644 --- a/MareSynchronos/Models/PlayerRelatedObject.cs +++ b/MareSynchronos/Models/PlayerRelatedObject.cs @@ -60,17 +60,11 @@ namespace MareSynchronos.Models HasUnprocessedUpdate = true; } } - else + else if (Address != IntPtr.Zero || DrawObjectAddress != IntPtr.Zero) { - if (Address != IntPtr.Zero || DrawObjectAddress != IntPtr.Zero) - { - Address = IntPtr.Zero; - DrawObjectAddress = IntPtr.Zero; - HasUnprocessedUpdate = true; - } - Address = IntPtr.Zero; DrawObjectAddress = IntPtr.Zero; + Logger.Verbose(ObjectKind + " Changed: " + _name + ", now: " + Address + ", " + DrawObjectAddress); } } diff --git a/MareSynchronos/WebAPI/ApiController.Connectivity.cs b/MareSynchronos/WebAPI/ApiController.Connectivity.cs index 010fbc5..ca96f60 100644 --- a/MareSynchronos/WebAPI/ApiController.Connectivity.cs +++ b/MareSynchronos/WebAPI/ApiController.Connectivity.cs @@ -137,16 +137,19 @@ namespace MareSynchronos.WebAPI public async Task CreateConnections() { - await StopConnection(_connectionCancellationTokenSource.Token); + Logger.Debug("CreateConnections called"); if (_pluginConfiguration.FullPause) { Logger.Info("Not recreating Connection, paused"); ServerState = ServerState.Disconnected; _connectionDto = null; + await StopConnection(_connectionCancellationTokenSource.Token); return; } + await StopConnection(_connectionCancellationTokenSource.Token); + Logger.Info("Recreating Connection"); _connectionCancellationTokenSource.Cancel(); @@ -198,7 +201,6 @@ namespace MareSynchronos.WebAPI await InitializeData(token); _mareHub.Closed += MareHubOnClosed; - _mareHub.Reconnected += MareHubOnReconnected; _mareHub.Reconnecting += MareHubOnReconnecting; } } @@ -314,24 +316,15 @@ namespace MareSynchronos.WebAPI return Task.CompletedTask; } - private async Task MareHubOnReconnected(string? arg) - { - Logger.Info("Connection restored"); - await Task.Delay(TimeSpan.FromSeconds(new Random().Next(5, 10))); - - _ = Task.Run(CreateConnections); - } - private Task MareHubOnReconnecting(Exception? arg) { - CurrentUploads.Clear(); - CurrentDownloads.Clear(); - _uploadCancellationTokenSource?.Cancel(); ServerState = ServerState.Disconnected; Logger.Warn("Connection closed... Reconnecting"); Logger.Warn(arg?.Message ?? string.Empty); Logger.Warn(arg?.StackTrace ?? string.Empty); Disconnected?.Invoke(); + ServerState = ServerState.Offline; + _ = Task.Run(CreateConnections); return Task.CompletedTask; } @@ -340,11 +333,14 @@ namespace MareSynchronos.WebAPI if (_mareHub is not null) { Logger.Info("Stopping existing connection"); - await _mareHub.StopAsync(token); _mareHub.Closed -= MareHubOnClosed; - _mareHub.Reconnected -= MareHubOnReconnected; _mareHub.Reconnecting += MareHubOnReconnecting; + await _mareHub.StopAsync(token); await _mareHub.DisposeAsync(); + CurrentUploads.Clear(); + CurrentDownloads.Clear(); + _uploadCancellationTokenSource?.Cancel(); + Disconnected?.Invoke(); _mareHub = null; } From 3fefd35b02a995e2c5871cb783cc7258b6721f2b Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Thu, 1 Sep 2022 22:01:53 +0200 Subject: [PATCH 12/12] fix connection on logout --- MareSynchronos/MareSynchronos.csproj | 2 +- MareSynchronos/UI/CompactUI.cs | 9 ++++++++- MareSynchronos/WebAPI/ApiController.Connectivity.cs | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index 01b3da1..093d1cf 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,7 +3,7 @@ - 0.3.9 + 0.3.10 https://github.com/Penumbra-Sync/client diff --git a/MareSynchronos/UI/CompactUI.cs b/MareSynchronos/UI/CompactUI.cs index 07668ed..7191066 100644 --- a/MareSynchronos/UI/CompactUI.cs +++ b/MareSynchronos/UI/CompactUI.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Numerics; using System.Reflection; @@ -33,7 +34,13 @@ namespace MareSynchronos.UI private float _windowContentWidth = 0; public CompactUi(WindowSystem windowSystem, - UiShared uiShared, Configuration configuration, ApiController apiController) : base("Mare Synchronos " + Assembly.GetExecutingAssembly().GetName().Version + "###MareSynchronosMainUI") + UiShared uiShared, Configuration configuration, ApiController apiController) +#if DEBUG + : base("Mare Synchronos " + new FileInfo(Assembly.GetExecutingAssembly().Location) .LastWriteTime.ToString("yyyyMMddHHmmss")+ "###MareSynchronosMainUI") +#else + : base("Mare Synchronos " + Assembly.GetExecutingAssembly().GetName().Version + "###MareSynchronosMainUI") +#endif + { Logger.Verbose("Creating " + nameof(CompactUi)); diff --git a/MareSynchronos/WebAPI/ApiController.Connectivity.cs b/MareSynchronos/WebAPI/ApiController.Connectivity.cs index ca96f60..0d12587 100644 --- a/MareSynchronos/WebAPI/ApiController.Connectivity.cs +++ b/MareSynchronos/WebAPI/ApiController.Connectivity.cs @@ -68,6 +68,7 @@ namespace MareSynchronos.WebAPI private void DalamudUtilOnLogOut() { Task.Run(async () => await StopConnection(_connectionCancellationTokenSource.Token)); + ServerState = ServerState.Offline; } private void DalamudUtilOnLogIn()