diff --git a/MareSynchronos/Interop/IpcManager.cs b/MareSynchronos/Interop/IpcManager.cs index 6cce579..ef81ad7 100644 --- a/MareSynchronos/Interop/IpcManager.cs +++ b/MareSynchronos/Interop/IpcManager.cs @@ -359,13 +359,12 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase public async Task PalettePlusSetPalette(IntPtr character, string palette) { if (!CheckPalettePlusApi()) return; + string decodedPalette = Encoding.UTF8.GetString(Convert.FromBase64String(palette)); var gameObj = await _dalamudUtil.CreateGameObject(character).ConfigureAwait(false); if (gameObj is Character c) { await _dalamudUtil.RunOnFrameworkThread(() => { - string decodedPalette = Encoding.UTF8.GetString(Convert.FromBase64String(palette)); - if (string.IsNullOrEmpty(decodedPalette)) { Logger.LogTrace("PalettePlus removing for {addr}", c.Address.ToString("X")); diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index efdd26a..85d0b03 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,7 +3,7 @@ - 0.8.31 + 0.8.32 https://github.com/Penumbra-Sync/client diff --git a/MareSynchronos/PlayerData/Handlers/GameObjectHandler.cs b/MareSynchronos/PlayerData/Handlers/GameObjectHandler.cs index 681abcc..5e7172b 100644 --- a/MareSynchronos/PlayerData/Handlers/GameObjectHandler.cs +++ b/MareSynchronos/PlayerData/Handlers/GameObjectHandler.cs @@ -105,25 +105,17 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase { return await _dalamudUtil.RunOnFrameworkThread(() => { - nint curPtr = IntPtr.Zero; - try + var curPtr = _getAddress.Invoke(); + + if (curPtr == IntPtr.Zero) { - curPtr = CurrentAddress().GetAwaiter().GetResult(); - - if (curPtr == IntPtr.Zero) return true; - - var drawObj = GetDrawObj(curPtr); - return IsBeingDrawn(drawObj, curPtr); - } - catch (Exception) - { - if (curPtr != IntPtr.Zero) - { - return true; - } - + Address = IntPtr.Zero; + DrawObjectAddress = IntPtr.Zero; return false; } + + var drawObj = GetDrawObj(curPtr); + return IsBeingDrawn(drawObj, curPtr); }).ConfigureAwait(false); } diff --git a/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs b/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs index afdccab..145d234 100644 --- a/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs +++ b/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs @@ -195,6 +195,10 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase { throw new InvalidOperationException("Player name not equal to requested name, pointer invalid"); } + if (handler.Address == IntPtr.Zero) + { + throw new InvalidOperationException("Player pointer is zero, pointer invalid"); + } } private async Task ApplyBaseData(Guid applicationId, Dictionary moddedPaths, string manipulationData, CancellationToken token) diff --git a/MareSynchronos/UI/DownloadUi.cs b/MareSynchronos/UI/DownloadUi.cs index 10cb382..7807226 100644 --- a/MareSynchronos/UI/DownloadUi.cs +++ b/MareSynchronos/UI/DownloadUi.cs @@ -213,6 +213,7 @@ public class DownloadUi : WindowMediatorSubscriberBase public override bool DrawConditions() { + if (_uiShared.EditTrackerPosition) return true; if (!_configService.Current.ShowTransferWindow && !_configService.Current.ShowTransferBars) return false; if (!_currentDownloads.Any() && !_fileTransferManager.CurrentUploads.Any() && !_uploadingPlayers.Any()) return false; if (!IsOpen) return false; diff --git a/MareSynchronos/WebAPI/SignalR/ApiController.cs b/MareSynchronos/WebAPI/SignalR/ApiController.cs index f340bb6..11b73f6 100644 --- a/MareSynchronos/WebAPI/SignalR/ApiController.cs +++ b/MareSynchronos/WebAPI/SignalR/ApiController.cs @@ -174,11 +174,30 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM ServerState = ServerState.Connected; + var currentClientVer = Assembly.GetExecutingAssembly().GetName().Version!; + if (_connectionDto.ServerVersion != IMareHub.ApiVersion) { await StopConnection(ServerState.VersionMisMatch).ConfigureAwait(false); + if (_connectionDto.CurrentClientVersion > currentClientVer) + { + Mediator.Publish(new NotificationMessage("Client incompatible", + $"Your client is outdated ({currentClientVer.Major}.{currentClientVer.Minor}.{currentClientVer.Build}), current is: " + + $"{_connectionDto.CurrentClientVersion.Major}.{_connectionDto.CurrentClientVersion.Minor}.{_connectionDto.CurrentClientVersion.Build}. " + + $"This client version is incompatible and will not be able to connect. Please update your Mare Synchronos client.", + Dalamud.Interface.Internal.Notifications.NotificationType.Error)); + } return; } + + if (_connectionDto.CurrentClientVersion > currentClientVer) + { + Mediator.Publish(new NotificationMessage("Client outdated", + $"Your client is oudated ({currentClientVer.Major}.{currentClientVer.Minor}.{currentClientVer.Build}), current is: " + + $"{_connectionDto.CurrentClientVersion.Major}.{_connectionDto.CurrentClientVersion.Minor}.{_connectionDto.CurrentClientVersion.Build}. " + + $"Please keep your Mare Synchronos client up-to-date.", + Dalamud.Interface.Internal.Notifications.NotificationType.Error)); + } } catch (HttpRequestException ex) {