From def13858f46f21fa447b7cd110f98331e3789fa0 Mon Sep 17 00:00:00 2001 From: Loporrit <141286461+loporrit@users.noreply.github.com> Date: Sat, 22 Feb 2025 06:02:50 +0000 Subject: [PATCH] Make nameplate colors not override party role colors --- MareSynchronos/Plugin.cs | 6 ++--- MareSynchronos/Services/GuiHookService.cs | 31 +++++++++++++++++++++-- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/MareSynchronos/Plugin.cs b/MareSynchronos/Plugin.cs index 105edb0..fbb1729 100644 --- a/MareSynchronos/Plugin.cs +++ b/MareSynchronos/Plugin.cs @@ -46,8 +46,8 @@ public sealed class Plugin : IDalamudPlugin public Plugin(IDalamudPluginInterface pluginInterface, ICommandManager commandManager, IDataManager gameData, IFramework framework, IObjectTable objectTable, IClientState clientState, ICondition condition, IChatGui chatGui, IGameGui gameGui, IDtrBar dtrBar, IToastGui toastGui, IPluginLog pluginLog, ITargetManager targetManager, INotificationManager notificationManager, - ITextureProvider textureProvider, IContextMenu contextMenu, - IGameInteropProvider gameInteropProvider, INamePlateGui namePlateGui) + ITextureProvider textureProvider, IContextMenu contextMenu, IGameInteropProvider gameInteropProvider, + INamePlateGui namePlateGui, IGameConfig gameConfig, IPartyList partyList) { Plugin.Self = this; _host = new HostBuilder() @@ -166,7 +166,7 @@ public sealed class Plugin : IDalamudPlugin s.GetRequiredService>(), gameInteropProvider, chatGui, s.GetRequiredService(), s.GetRequiredService())); collection.AddScoped((s) => new GuiHookService(s.GetRequiredService>(), s.GetRequiredService(), s.GetRequiredService(), - s.GetRequiredService(), namePlateGui, s.GetRequiredService())); + s.GetRequiredService(), namePlateGui, gameConfig, partyList, s.GetRequiredService())); collection.AddHostedService(p => p.GetRequiredService()); collection.AddHostedService(p => p.GetRequiredService()); diff --git a/MareSynchronos/Services/GuiHookService.cs b/MareSynchronos/Services/GuiHookService.cs index 1478ab7..b6a81d2 100644 --- a/MareSynchronos/Services/GuiHookService.cs +++ b/MareSynchronos/Services/GuiHookService.cs @@ -17,23 +17,31 @@ public class GuiHookService : DisposableMediatorSubscriberBase private readonly DalamudUtilService _dalamudUtil; private readonly MareConfigService _configService; private readonly INamePlateGui _namePlateGui; + private readonly IGameConfig _gameConfig; + private readonly IPartyList _partyList; private readonly PairManager _pairManager; private bool _isModified = false; + private bool _namePlateRoleColorsEnabled = false; public GuiHookService(ILogger logger, DalamudUtilService dalamudUtil, MareMediator mediator, MareConfigService configService, - INamePlateGui namePlateGui, PairManager pairManager) + INamePlateGui namePlateGui, IGameConfig gameConfig, IPartyList partyList, PairManager pairManager) : base(logger, mediator) { _logger = logger; _dalamudUtil = dalamudUtil; _configService = configService; _namePlateGui = namePlateGui; + _gameConfig = gameConfig; + _partyList = partyList; _pairManager = pairManager; _namePlateGui.OnNamePlateUpdate += OnNamePlateUpdate; _namePlateGui.RequestRedraw(); + gameConfig.TryGet(Dalamud.Game.Config.UiConfigOption.NamePlateSetRoleColor, out bool isNameplateSetRoleColor); + + Mediator.Subscribe(this, (_) => GameSettingsCheck()); Mediator.Subscribe(this, (_) => RequestRedraw()); Mediator.Subscribe(this, (_) => RequestRedraw()); } @@ -72,10 +80,17 @@ public class GuiHookService : DisposableMediatorSubscriberBase var visibleUsersDict = visibleUsers.ToDictionary(u => (ulong)u.PlayerCharacterId); + var partyMembers = new nint[_partyList.Count]; + + for (int i = 0; i < _partyList.Count; ++i) + partyMembers[i] = _partyList[i]?.GameObject?.Address ?? nint.MaxValue; + foreach (var handler in handlers) { - if (visibleUsersIds.Contains(handler.GameObjectId)) + if (handler != null && visibleUsersIds.Contains(handler.GameObjectId)) { + if (_namePlateRoleColorsEnabled && partyMembers.Contains(handler.GameObject?.Address ?? nint.MaxValue)) + continue; var pair = visibleUsersDict[handler.GameObjectId]; var colors = !pair.IsApplicationBlocked ? _configService.Current.NameColors : _configService.Current.BlockedNameColors; handler.NameParts.TextWrap = ( @@ -87,6 +102,18 @@ public class GuiHookService : DisposableMediatorSubscriberBase } } + private void GameSettingsCheck() + { + if (!_gameConfig.TryGet(Dalamud.Game.Config.UiConfigOption.NamePlateSetRoleColor, out bool namePlateRoleColorsEnabled)) + return; + + if (_namePlateRoleColorsEnabled != namePlateRoleColorsEnabled) + { + _namePlateRoleColorsEnabled = namePlateRoleColorsEnabled; + RequestRedraw(force: true); + } + } + #region Colored SeString private const byte _colorTypeForeground = 0x13; private const byte _colorTypeGlow = 0x14;