From e1f6d6df24929671ee88ea38e4a02dd1f3e1d15c Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Sun, 8 Jan 2023 00:19:11 +0100 Subject: [PATCH] add warnings for missing optional plugins when respective data is received --- MareSynchronos/Configuration.cs | 1 + MareSynchronos/Managers/CachedPlayer.cs | 24 ++++++++++++++++--- .../Managers/OnlinePlayerManager.cs | 20 +++++++++++++--- MareSynchronos/MareSynchronos.csproj | 2 +- .../Models/OptionalPluginWarning.cs | 7 ++++++ MareSynchronos/Plugin.cs | 2 +- MareSynchronos/UI/SettingsUi.cs | 8 +++++++ 7 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 MareSynchronos/Models/OptionalPluginWarning.cs diff --git a/MareSynchronos/Configuration.cs b/MareSynchronos/Configuration.cs index 30e2c9d..c00c38f 100644 --- a/MareSynchronos/Configuration.cs +++ b/MareSynchronos/Configuration.cs @@ -80,6 +80,7 @@ public class Configuration : IPluginConfiguration public bool FullPause { get; set; } = false; public bool HideInfoMessages { get; set; } = false; + public bool DisableOptionalPluginWarnings { get; set; } = false; public Dictionary> UidServerComments { get; set; } = new(StringComparer.Ordinal); public Dictionary> GidServerComments { get; set; } = new(StringComparer.Ordinal); diff --git a/MareSynchronos/Managers/CachedPlayer.cs b/MareSynchronos/Managers/CachedPlayer.cs index d1b27f4..5d0bf73 100644 --- a/MareSynchronos/Managers/CachedPlayer.cs +++ b/MareSynchronos/Managers/CachedPlayer.cs @@ -61,7 +61,7 @@ public class CachedPlayer private PlayerRelatedObject? _currentCharacterEquipment; - public void ApplyCharacterData(CharacterCacheDto characterData) + public void ApplyCharacterData(CharacterCacheDto characterData, OptionalPluginWarning warning) { Logger.Debug("Received data for " + this); @@ -122,6 +122,7 @@ public class CachedPlayer bool heelsOffsetDifferent = _cachedData.HeelsOffset != characterData.HeelsOffset; if (heelsOffsetDifferent) { + Logger.Debug("Updating " + objectKind); charaDataToUpdate.Add(objectKind); continue; @@ -137,6 +138,23 @@ public class CachedPlayer } } + if (characterData.HeelsOffset != default) + { + if (!warning.ShownHeelsWarning && !_ipcManager.CheckHeelsApi()) + { + _dalamudUtil.PrintWarnChat("Received Heels data for player " + PlayerName + ", but Heels is not installed. Install Heels to experience their character fully."); + warning.ShownHeelsWarning = true; + } + } + if (!string.IsNullOrEmpty(characterData.CustomizePlusData)) + { + if (!warning.ShownCustomizePlusWarning && !_ipcManager.CheckCustomizePlusApi()) + { + _dalamudUtil.PrintWarnChat("Received Customize+ data for player " + PlayerName + ", but Customize+ is not installed. Install Customize+ to experience their character fully."); + warning.ShownCustomizePlusWarning = true; + } + } + _cachedData = characterData; DownloadAndApplyCharacter(charaDataToUpdate, updateModdedPaths); @@ -418,7 +436,7 @@ public class CachedPlayer } } - public void InitializePlayer(IntPtr character, string name, CharacterCacheDto? cache) + public void InitializePlayer(IntPtr character, string name, CharacterCacheDto? cache, OptionalPluginWarning displayedChatWarning) { if (!_isDisposed) return; IsVisible = true; @@ -434,7 +452,7 @@ public class CachedPlayer _isDisposed = false; if (cache != null) { - ApplyCharacterData(cache); + ApplyCharacterData(cache, displayedChatWarning); } } diff --git a/MareSynchronos/Managers/OnlinePlayerManager.cs b/MareSynchronos/Managers/OnlinePlayerManager.cs index 2901d41..f94bf3b 100644 --- a/MareSynchronos/Managers/OnlinePlayerManager.cs +++ b/MareSynchronos/Managers/OnlinePlayerManager.cs @@ -6,6 +6,7 @@ using System.Threading; using System.Threading.Tasks; using MareSynchronos.API; using MareSynchronos.FileCache; +using MareSynchronos.Models; using MareSynchronos.Utils; using MareSynchronos.WebAPI; using MareSynchronos.WebAPI.Utils; @@ -19,14 +20,16 @@ public class OnlinePlayerManager : IDisposable private readonly IpcManager _ipcManager; private readonly PlayerManager _playerManager; private readonly FileCacheManager _fileDbManager; + private readonly Configuration _configuration; private readonly ConcurrentDictionary _onlineCachedPlayers = new(StringComparer.Ordinal); private readonly ConcurrentDictionary _temporaryStoredCharacterCache = new(StringComparer.Ordinal); private readonly ConcurrentDictionary _playerTokenDisposal = new(); + private readonly ConcurrentDictionary _shownWarnings = new(StringComparer.Ordinal); private List OnlineVisiblePlayerHashes => _onlineCachedPlayers.Select(p => p.Value).Where(p => p.PlayerCharacter != IntPtr.Zero) .Select(p => p.PlayerNameHash).ToList(); - public OnlinePlayerManager(ApiController apiController, DalamudUtil dalamudUtil, IpcManager ipcManager, PlayerManager playerManager, FileCacheManager fileDbManager) + public OnlinePlayerManager(ApiController apiController, DalamudUtil dalamudUtil, IpcManager ipcManager, PlayerManager playerManager, FileCacheManager fileDbManager, Configuration configuration) { Logger.Verbose("Creating " + nameof(OnlinePlayerManager)); @@ -35,6 +38,7 @@ public class OnlinePlayerManager : IDisposable _ipcManager = ipcManager; _playerManager = playerManager; _fileDbManager = fileDbManager; + _configuration = configuration; _apiController.PairedClientOnline += ApiControllerOnPairedClientOnline; _apiController.PairedClientOffline += ApiControllerOnPairedClientOffline; _apiController.Connected += ApiControllerOnConnected; @@ -60,10 +64,15 @@ public class OnlinePlayerManager : IDisposable private void ApiControllerOnCharacterReceived(object? sender, CharacterReceivedEventArgs e) { + if (!_shownWarnings.ContainsKey(e.CharacterNameHash)) _shownWarnings[e.CharacterNameHash] = new() + { + ShownCustomizePlusWarning = _configuration.DisableOptionalPluginWarnings, + ShownHeelsWarning = _configuration.DisableOptionalPluginWarnings, + }; if (_onlineCachedPlayers.TryGetValue(e.CharacterNameHash, out var visiblePlayer) && visiblePlayer.IsVisible) { Logger.Debug("Received data and applying to " + e.CharacterNameHash); - visiblePlayer.ApplyCharacterData(e.CharacterData); + visiblePlayer.ApplyCharacterData(e.CharacterData, _shownWarnings[e.CharacterNameHash]); } else { @@ -205,7 +214,12 @@ public class OnlinePlayerManager : IDisposable if (existingPlayer != null) { _temporaryStoredCharacterCache.TryRemove(hashedName, out var cache); - existingPlayer.InitializePlayer(pChar.Address, pChar.Name.ToString(), cache); + if (!_shownWarnings.ContainsKey(hashedName)) _shownWarnings[hashedName] = new() + { + ShownCustomizePlusWarning = _configuration.DisableOptionalPluginWarnings, + ShownHeelsWarning = _configuration.DisableOptionalPluginWarnings, + }; + existingPlayer.InitializePlayer(pChar.Address, pChar.Name.ToString(), cache, _shownWarnings[hashedName]); } } diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index 06bc55a..76f0df6 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,7 +3,7 @@ - 0.5.24 + 0.5.25 https://github.com/Penumbra-Sync/client diff --git a/MareSynchronos/Models/OptionalPluginWarning.cs b/MareSynchronos/Models/OptionalPluginWarning.cs new file mode 100644 index 0000000..b19920c --- /dev/null +++ b/MareSynchronos/Models/OptionalPluginWarning.cs @@ -0,0 +1,7 @@ +namespace MareSynchronos.Models; + +public record OptionalPluginWarning +{ + public bool ShownHeelsWarning { get; set; } = false; + public bool ShownCustomizePlusWarning { get; set; } = false; +} diff --git a/MareSynchronos/Plugin.cs b/MareSynchronos/Plugin.cs index 95962c8..8c0ec7d 100644 --- a/MareSynchronos/Plugin.cs +++ b/MareSynchronos/Plugin.cs @@ -190,7 +190,7 @@ public sealed class Plugin : IDalamudPlugin _playerManager = new PlayerManager(_apiController, _ipcManager, characterCacheFactory, _dalamudUtil, _transientResourceManager, _periodicFileScanner); _characterCacheManager = new OnlinePlayerManager(_apiController, - _dalamudUtil, _ipcManager, _playerManager, _fileCacheManager); + _dalamudUtil, _ipcManager, _playerManager, _fileCacheManager, _configuration); } catch (Exception ex) { diff --git a/MareSynchronos/UI/SettingsUi.cs b/MareSynchronos/UI/SettingsUi.cs index 3cb7d0d..e0d2547 100644 --- a/MareSynchronos/UI/SettingsUi.cs +++ b/MareSynchronos/UI/SettingsUi.cs @@ -28,6 +28,7 @@ public class SettingsUi : Window, IDisposable private string _lastTab = string.Empty; private bool _openPopupOnAddition; private bool _hideInfoMessages; + private bool _disableOptionalPluginsWarnings; public SettingsUi(WindowSystem windowSystem, UiShared uiShared, Configuration configuration, ApiController apiController) : base("Mare Synchronos Settings") @@ -46,6 +47,7 @@ public class SettingsUi : Window, IDisposable _uiShared = uiShared; _openPopupOnAddition = _configuration.OpenPopupOnAdd; _hideInfoMessages = _configuration.HideInfoMessages; + _disableOptionalPluginsWarnings = _configuration.DisableOptionalPluginWarnings; windowSystem.AddWindow(this); } @@ -171,6 +173,12 @@ public class SettingsUi : Window, IDisposable _configuration.Save(); } UiShared.DrawHelpText("Enabling this will not print any \"Info\" labeled messages into the game chat."); + if (ImGui.Checkbox("Disable optional plugin warnings", ref _disableOptionalPluginsWarnings)) + { + _configuration.DisableOptionalPluginWarnings = _disableOptionalPluginsWarnings; + _configuration.Save(); + } + UiShared.DrawHelpText("Enabling this will not print any \"Warning\" labeled messages for missing optional plugins Heels or Customize+ in the game chat."); } private void DrawAdministration()