From 3dc7e93f0813990fa00a381c47673a4a903ca3a3 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Fri, 2 Sep 2022 13:28:21 +0200 Subject: [PATCH] add backend possiblity to define general settings per ActivityContext & polish up the code a bit --- .../Configuration/PluginConfiguration.cs | 66 +++++++- .../Configuration/PluginConfigurationUI.cs | 44 +++++- .../Data/NameplateFreeCompanyVisibility.cs | 5 +- PlayerTags/Data/NameplateTitlePosition.cs | 5 +- PlayerTags/Data/NameplateTitleVisibility.cs | 5 +- .../Features/NameplateTagTargetFeature.cs | 148 +++++------------- 6 files changed, 156 insertions(+), 117 deletions(-) diff --git a/PlayerTags/Configuration/PluginConfiguration.cs b/PlayerTags/Configuration/PluginConfiguration.cs index ac0998c..288d169 100644 --- a/PlayerTags/Configuration/PluginConfiguration.cs +++ b/PlayerTags/Configuration/PluginConfiguration.cs @@ -12,11 +12,69 @@ namespace PlayerTags.Configuration public class PluginConfiguration : IPluginConfiguration { public int Version { get; set; } = 0; - public bool IsVisible = false; - public NameplateFreeCompanyVisibility NameplateFreeCompanyVisibility = NameplateFreeCompanyVisibility.Default; - public NameplateTitleVisibility NameplateTitleVisibility = NameplateTitleVisibility.WhenHasTags; - public NameplateTitlePosition NameplateTitlePosition = NameplateTitlePosition.AlwaysAboveName; + + private const NameplateFreeCompanyVisibility DefaultNameplateFreeCompanyVisibility = Data.NameplateFreeCompanyVisibility.Default; + private const NameplateTitleVisibility DefaultNameplateTitleVisibility = Data.NameplateTitleVisibility.WhenHasTags; + private const NameplateTitlePosition DefaultNameplateTitlePosition = Data.NameplateTitlePosition.AlwaysAboveName; + + [JsonProperty("NameplateFreeCompanyVisibilityV2")] + public Dictionary NameplateFreeCompanyVisibility = new Dictionary() + { + { ActivityContext.None, DefaultNameplateFreeCompanyVisibility }, + { ActivityContext.PveDuty, DefaultNameplateFreeCompanyVisibility }, + { ActivityContext.PvpDuty, DefaultNameplateFreeCompanyVisibility } + }; + [JsonProperty("NameplateTitleVisibilityV2")] + public Dictionary NameplateTitleVisibility = new Dictionary() + { + { ActivityContext.None, DefaultNameplateTitleVisibility }, + { ActivityContext.PveDuty, DefaultNameplateTitleVisibility }, + { ActivityContext.PvpDuty, DefaultNameplateTitleVisibility } + }; + [JsonProperty("NameplateTitlePositionV2")] + public Dictionary NameplateTitlePosition = new Dictionary() + { + { ActivityContext.None, DefaultNameplateTitlePosition }, + { ActivityContext.PveDuty, DefaultNameplateTitlePosition }, + { ActivityContext.PvpDuty, DefaultNameplateTitlePosition } + }; + + #region Obsulate Properties + + [JsonProperty("NameplateFreeCompanyVisibility"), Obsolete] + private NameplateFreeCompanyVisibility NameplateFreeCompanyVisibilityV1 + { + set + { + NameplateFreeCompanyVisibility[ActivityContext.None] = value; + NameplateFreeCompanyVisibility[ActivityContext.PveDuty] = value; + NameplateFreeCompanyVisibility[ActivityContext.PvpDuty] = value; + } + } + [JsonProperty("NameplateTitleVisibility"), Obsolete] + public NameplateTitleVisibility NameplateTitleVisibilityV1 + { + set + { + NameplateTitleVisibility[ActivityContext.None] = value; + NameplateTitleVisibility[ActivityContext.PveDuty] = value; + NameplateTitleVisibility[ActivityContext.PvpDuty] = value; + } + } + [JsonProperty("NameplateTitlePosition"), Obsolete] + public NameplateTitlePosition NameplateTitlePositionV1 + { + set + { + NameplateTitlePosition[ActivityContext.None] = value; + NameplateTitlePosition[ActivityContext.PveDuty] = value; + NameplateTitlePosition[ActivityContext.PvpDuty] = value; + } + } + + #endregion + public bool IsPlayerNameRandomlyGenerated = false; public bool IsCustomTagsContextMenuEnabled = true; public bool IsShowInheritedPropertiesEnabled = true; diff --git a/PlayerTags/Configuration/PluginConfigurationUI.cs b/PlayerTags/Configuration/PluginConfigurationUI.cs index c25073c..f5e3a10 100644 --- a/PlayerTags/Configuration/PluginConfigurationUI.cs +++ b/PlayerTags/Configuration/PluginConfigurationUI.cs @@ -1,4 +1,5 @@ -using Dalamud.Game.ClientState.Objects.SubKinds; +using Dalamud.Configuration; +using Dalamud.Game.ClientState.Objects.SubKinds; using Dalamud.Game.Text.SeStringHandling; using Dalamud.Interface; using Dalamud.Logging; @@ -25,6 +26,7 @@ namespace PlayerTags.Configuration private PluginConfiguration m_PluginConfiguration; private PluginData m_PluginData; + private PropertyProxy propertyProxy; private InheritableValue? m_ColorPickerPopupDataContext; @@ -32,6 +34,7 @@ namespace PlayerTags.Configuration { m_PluginConfiguration = config; m_PluginData = pluginData; + propertyProxy = new PropertyProxy(config); } public void Draw() @@ -63,9 +66,9 @@ namespace PlayerTags.Configuration ImGui.Spacing(); ImGui.Spacing(); DrawHeading(Strings.Loc_Static_Nameplates); - DrawComboBox(true, true, false, ref m_PluginConfiguration.NameplateFreeCompanyVisibility, () => m_PluginConfiguration.Save(m_PluginData)); - DrawComboBox(true, true, false, ref m_PluginConfiguration.NameplateTitleVisibility, () => m_PluginConfiguration.Save(m_PluginData)); - DrawComboBox(true, true, false, ref m_PluginConfiguration.NameplateTitlePosition, () => m_PluginConfiguration.Save(m_PluginData)); + DrawComboBox(true, true, false, ref propertyProxy.NameplateFreeCompanyVisibility, () => m_PluginConfiguration.Save(m_PluginData)); + DrawComboBox(true, true, false, ref propertyProxy.NameplateTitleVisibility, () => m_PluginConfiguration.Save(m_PluginData)); + DrawComboBox(true, true, false, ref propertyProxy.NameplateTitlePosition, () => m_PluginConfiguration.Save(m_PluginData)); ImGui.Spacing(); @@ -1159,5 +1162,38 @@ namespace PlayerTags.Configuration currentColumn++; } } + + private class PropertyProxy + { + private PluginConfiguration pluginConfig; + + public NameplateFreeCompanyVisibility NameplateFreeCompanyVisibility; + public NameplateTitleVisibility NameplateTitleVisibility; + public NameplateTitlePosition NameplateTitlePosition; + + public PropertyProxy(PluginConfiguration config) + { + pluginConfig = config; + } + + public void LoadData() + { + NameplateFreeCompanyVisibility = pluginConfig.NameplateFreeCompanyVisibility[ActivityContext.None]; + NameplateTitleVisibility = pluginConfig.NameplateTitleVisibility[ActivityContext.None]; + NameplateTitlePosition = pluginConfig.NameplateTitlePosition[ActivityContext.None]; + } + + public void SaveData() + { + foreach (var key in pluginConfig.NameplateFreeCompanyVisibility.Keys) + pluginConfig.NameplateFreeCompanyVisibility[key] = NameplateFreeCompanyVisibility; + + foreach (var key in pluginConfig.NameplateTitleVisibility.Keys) + pluginConfig.NameplateTitleVisibility[key] = NameplateTitleVisibility; + + foreach (var key in pluginConfig.NameplateTitlePosition.Keys) + pluginConfig.NameplateTitlePosition[key] = NameplateTitlePosition; + } + } } } diff --git a/PlayerTags/Data/NameplateFreeCompanyVisibility.cs b/PlayerTags/Data/NameplateFreeCompanyVisibility.cs index 9f00b2d..6308f8c 100644 --- a/PlayerTags/Data/NameplateFreeCompanyVisibility.cs +++ b/PlayerTags/Data/NameplateFreeCompanyVisibility.cs @@ -1,5 +1,8 @@ -namespace PlayerTags.Data +using Newtonsoft.Json; + +namespace PlayerTags.Data { + [JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public enum NameplateFreeCompanyVisibility { Default, diff --git a/PlayerTags/Data/NameplateTitlePosition.cs b/PlayerTags/Data/NameplateTitlePosition.cs index 7c8613e..08052d8 100644 --- a/PlayerTags/Data/NameplateTitlePosition.cs +++ b/PlayerTags/Data/NameplateTitlePosition.cs @@ -1,5 +1,8 @@ -namespace PlayerTags.Data +using Newtonsoft.Json; + +namespace PlayerTags.Data { + [JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public enum NameplateTitlePosition { Default, diff --git a/PlayerTags/Data/NameplateTitleVisibility.cs b/PlayerTags/Data/NameplateTitleVisibility.cs index 0cba968..3914b47 100644 --- a/PlayerTags/Data/NameplateTitleVisibility.cs +++ b/PlayerTags/Data/NameplateTitleVisibility.cs @@ -1,5 +1,8 @@ -namespace PlayerTags.Data +using Newtonsoft.Json; + +namespace PlayerTags.Data { + [JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] public enum NameplateTitleVisibility { Default, diff --git a/PlayerTags/Features/NameplateTagTargetFeature.cs b/PlayerTags/Features/NameplateTagTargetFeature.cs index 9de7908..6152244 100644 --- a/PlayerTags/Features/NameplateTagTargetFeature.cs +++ b/PlayerTags/Features/NameplateTagTargetFeature.cs @@ -2,9 +2,11 @@ using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling.Payloads; +using Lumina.Excel.GeneratedSheets; using PlayerTags.Configuration; using PlayerTags.Data; using PlayerTags.GameInterface.Nameplates; +using PlayerTags.Inheritables; using System; using System.Collections.Generic; using System.Linq; @@ -98,41 +100,25 @@ namespace PlayerTags.Features private void Nameplate_PlayerNameplateUpdated(PlayerNameplateUpdatedArgs args) { var beforeTitleBytes = args.Title.Encode(); - AddTagsToNameplate(args.PlayerCharacter, args.Name, args.Title, args.FreeCompany/*, out isNameChanged, out isTitleChanged, out isFreeCompanyChanged*/); - - if (m_PluginConfiguration.NameplateTitlePosition == NameplateTitlePosition.AlwaysAboveName) - { + AddTagsToNameplate(args.PlayerCharacter, args.Name, args.Title, args.FreeCompany); + + if (m_PluginConfiguration.NameplateTitlePosition[ActivityContextManager.CurrentActivityContext] == NameplateTitlePosition.AlwaysAboveName) args.IsTitleAboveName = true; - } - else if (m_PluginConfiguration.NameplateTitlePosition == NameplateTitlePosition.AlwaysBelowName) - { + else if (m_PluginConfiguration.NameplateTitlePosition[ActivityContextManager.CurrentActivityContext] == NameplateTitlePosition.AlwaysBelowName) args.IsTitleAboveName = false; - } - if (m_PluginConfiguration.NameplateTitleVisibility == NameplateTitleVisibility.Default) - { - } - else if (m_PluginConfiguration.NameplateTitleVisibility == NameplateTitleVisibility.Always) - { + if (m_PluginConfiguration.NameplateTitleVisibility[ActivityContextManager.CurrentActivityContext] == NameplateTitleVisibility.Always) args.IsTitleVisible = true; - } - else if (m_PluginConfiguration.NameplateTitleVisibility == NameplateTitleVisibility.Never) - { + else if (m_PluginConfiguration.NameplateTitleVisibility[ActivityContextManager.CurrentActivityContext] == NameplateTitleVisibility.Never) args.IsTitleVisible = false; - } - else if (m_PluginConfiguration.NameplateTitleVisibility == NameplateTitleVisibility.WhenHasTags) + else if (m_PluginConfiguration.NameplateTitleVisibility[ActivityContextManager.CurrentActivityContext] == NameplateTitleVisibility.WhenHasTags) { bool hasTitleChanged = !beforeTitleBytes.SequenceEqual(args.Title.Encode()); args.IsTitleVisible = hasTitleChanged; } - if (m_PluginConfiguration.NameplateFreeCompanyVisibility == NameplateFreeCompanyVisibility.Default) - { - } - else if (m_PluginConfiguration.NameplateFreeCompanyVisibility == NameplateFreeCompanyVisibility.Never) - { + if (m_PluginConfiguration.NameplateFreeCompanyVisibility[ActivityContextManager.CurrentActivityContext] == NameplateFreeCompanyVisibility.Never) args.FreeCompany.Payloads.Clear(); - } } /// @@ -174,13 +160,7 @@ namespace PlayerTags.Features if (playerCharacter.ClassJob.GameData != null && m_PluginData.JobTags.TryGetValue(playerCharacter.ClassJob.GameData.Abbreviation, out var jobTag)) { if (jobTag.TagTargetInNameplates.InheritedValue != null && jobTag.TagPositionInNameplates.InheritedValue != null) - { - var payloads = GetPayloads(jobTag, gameObject); - if (payloads.Any()) - { - AddPayloadChanges(jobTag.TagTargetInNameplates.InheritedValue.Value, jobTag.TagPositionInNameplates.InheritedValue.Value, payloads, nameplateChanges); - } - } + checkTag(jobTag); } // Add the randomly generated name tag payload @@ -191,9 +171,7 @@ namespace PlayerTags.Features { var generatedName = RandomNameGenerator.Generate(characterName); if (generatedName != null) - { AddPayloadChanges(NameplateElement.Name, TagPosition.Replace, Enumerable.Empty().Append(new TextPayload(generatedName)), nameplateChanges); - } } } @@ -203,15 +181,16 @@ namespace PlayerTags.Features { var customTag = m_PluginData.CustomTags.FirstOrDefault(tag => tag.CustomId.Value == customTagId); if (customTag != null) + checkTag(customTag); + } + + void checkTag(Tag tag) + { + if (tag.TagTargetInNameplates.InheritedValue != null && tag.TagPositionInNameplates.InheritedValue != null) { - if (customTag.TagTargetInNameplates.InheritedValue != null && customTag.TagPositionInNameplates.InheritedValue != null) - { - var payloads = GetPayloads(customTag, gameObject); - if (payloads.Any()) - { - AddPayloadChanges(customTag.TagTargetInNameplates.InheritedValue.Value, customTag.TagPositionInNameplates.InheritedValue.Value, payloads, nameplateChanges); - } - } + var payloads = GetPayloads(tag, gameObject); + if (payloads.Any()) + AddPayloadChanges(tag.TagTargetInNameplates.InheritedValue.Value, tag.TagPositionInNameplates.InheritedValue.Value, payloads, nameplateChanges); } } } @@ -220,23 +199,16 @@ namespace PlayerTags.Features foreach ((var nameplateElement, var stringChanges) in nameplateChanges) { SeString? seString = null; + if (nameplateElement == NameplateElement.Name) - { seString = name; - } else if (nameplateElement == NameplateElement.Title) - { seString = title; - } else if (nameplateElement == NameplateElement.FreeCompany) - { seString = freeCompany; - } if (seString != null) - { ApplyStringChanges(seString, stringChanges); - } } if (gameObject is PlayerCharacter playerCharacter1) @@ -247,71 +219,35 @@ namespace PlayerTags.Features { var customTag = m_PluginData.CustomTags.FirstOrDefault(tag => tag.CustomId.Value == customTagId); if (customTag != null) - { - if (IsTagVisible(customTag, gameObject)) - { - if (customTag.TextColor.InheritedValue != null) - { - if (name.Payloads.Any(payload => payload is TextPayload) - && customTag.IsTextColorAppliedToNameplateName.InheritedValue != null - && customTag.IsTextColorAppliedToNameplateName.InheritedValue.Value) - { - name.Payloads.Insert(0, (new UIForegroundPayload(customTag.TextColor.InheritedValue.Value))); - name.Payloads.Add(new UIForegroundPayload(0)); - } - - if (title.Payloads.Any(payload => payload is TextPayload) - && customTag.IsTextColorAppliedToNameplateTitle.InheritedValue != null - && customTag.IsTextColorAppliedToNameplateTitle.InheritedValue.Value) - { - title.Payloads.Insert(0, (new UIForegroundPayload(customTag.TextColor.InheritedValue.Value))); - title.Payloads.Add(new UIForegroundPayload(0)); - } - - if (freeCompany.Payloads.Any(payload => payload is TextPayload) - && customTag.IsTextColorAppliedToNameplateFreeCompany.InheritedValue != null - && customTag.IsTextColorAppliedToNameplateFreeCompany.InheritedValue.Value) - { - freeCompany.Payloads.Insert(0, (new UIForegroundPayload(customTag.TextColor.InheritedValue.Value))); - freeCompany.Payloads.Add(new UIForegroundPayload(0)); - } - } - } - } + applyTextColor(customTag); } if (playerCharacter1.ClassJob.GameData != null && m_PluginData.JobTags.TryGetValue(playerCharacter1.ClassJob.GameData.Abbreviation, out var jobTag)) + applyTextColor(jobTag); + + + void applyTextColor(Tag tag) { - if (IsTagVisible(jobTag, gameObject)) + if (IsTagVisible(tag, gameObject)) { - if (jobTag.TextColor.InheritedValue != null) + if (tag.TextColor.InheritedValue != null) { - if (name.Payloads.Any(payload => payload is TextPayload) - && jobTag.IsTextColorAppliedToNameplateName.InheritedValue != null - && jobTag.IsTextColorAppliedToNameplateName.InheritedValue.Value) - { - name.Payloads.Insert(0, (new UIForegroundPayload(jobTag.TextColor.InheritedValue.Value))); - name.Payloads.Add(new UIForegroundPayload(0)); - } - - if (title.Payloads.Any(payload => payload is TextPayload) - && jobTag.IsTextColorAppliedToNameplateTitle.InheritedValue != null - && jobTag.IsTextColorAppliedToNameplateTitle.InheritedValue.Value) - { - title.Payloads.Insert(0, (new UIForegroundPayload(jobTag.TextColor.InheritedValue.Value))); - title.Payloads.Add(new UIForegroundPayload(0)); - } - - if (freeCompany.Payloads.Any(payload => payload is TextPayload) - && jobTag.IsTextColorAppliedToNameplateFreeCompany.InheritedValue != null - && jobTag.IsTextColorAppliedToNameplateFreeCompany.InheritedValue.Value) - { - freeCompany.Payloads.Insert(0, (new UIForegroundPayload(jobTag.TextColor.InheritedValue.Value))); - freeCompany.Payloads.Add(new UIForegroundPayload(0)); - } + applyTextColor2(name, tag.IsTextColorAppliedToNameplateName, tag.TextColor); + applyTextColor2(title, tag.IsTextColorAppliedToNameplateTitle, tag.TextColor); + applyTextColor2(freeCompany, tag.IsTextColorAppliedToNameplateFreeCompany, tag.TextColor); } } - } + } + void applyTextColor2(SeString destPayload, InheritableValue enableFlag, InheritableValue colorValue) + { + if (destPayload.Payloads.Any(payload => payload is TextPayload) + && enableFlag.InheritedValue != null + && enableFlag.InheritedValue.Value) + { + destPayload.Payloads.Insert(0, (new UIForegroundPayload(colorValue.InheritedValue.Value))); + destPayload.Payloads.Add(new UIForegroundPayload(0)); + } + } } } }