add master toggle via sub-command
This commit is contained in:
@@ -23,6 +23,7 @@ namespace PlayerTags.Configuration
|
||||
public int RootVersion { get; private set; } = DEFAULT_CONFIG_VERSION;
|
||||
public int Version { get; set; } = DEFAULT_CONFIG_VERSION;
|
||||
public bool IsVisible = false;
|
||||
public bool EnabledGlobal = true;
|
||||
|
||||
[JsonProperty("GeneralOptionsV2")]
|
||||
public Dictionary<ActivityType, GeneralOptionsClass> GeneralOptions = new()
|
||||
|
||||
@@ -102,14 +102,8 @@ namespace PlayerTags.Features
|
||||
}
|
||||
}
|
||||
|
||||
private PluginConfiguration m_PluginConfiguration;
|
||||
private PluginData m_PluginData;
|
||||
|
||||
public ChatTagTargetFeature(PluginConfiguration pluginConfiguration, PluginData pluginData)
|
||||
public ChatTagTargetFeature(PluginConfiguration pluginConfiguration, PluginData pluginData) : base(pluginConfiguration, pluginData)
|
||||
{
|
||||
m_PluginConfiguration = pluginConfiguration;
|
||||
m_PluginData = pluginData;
|
||||
|
||||
PluginServices.ChatGui.ChatMessage += Chat_ChatMessage;
|
||||
}
|
||||
|
||||
@@ -121,7 +115,7 @@ namespace PlayerTags.Features
|
||||
|
||||
private void Chat_ChatMessage(XivChatType type, uint senderId, ref SeString sender, ref SeString message, ref bool isHandled)
|
||||
{
|
||||
if (m_PluginConfiguration.GeneralOptions[ActivityContextManager.CurrentActivityContext.ActivityType].IsApplyTagsToAllChatMessagesEnabled)
|
||||
if (EnableGlobal && pluginConfiguration.GeneralOptions[ActivityContextManager.CurrentActivityContext.ActivityType].IsApplyTagsToAllChatMessagesEnabled)
|
||||
{
|
||||
AddTagsToChat(sender, type, true);
|
||||
AddTagsToChat(message, type, false);
|
||||
@@ -347,7 +341,7 @@ namespace PlayerTags.Features
|
||||
if (stringMatch.GameObject is PlayerCharacter playerCharacter)
|
||||
{
|
||||
// Add the job tag
|
||||
if (playerCharacter.ClassJob.GameData != null && m_PluginData.JobTags.TryGetValue(playerCharacter.ClassJob.GameData.Abbreviation, out var jobTag))
|
||||
if (playerCharacter.ClassJob.GameData != null && pluginData.JobTags.TryGetValue(playerCharacter.ClassJob.GameData.Abbreviation, out var jobTag))
|
||||
{
|
||||
if (isTagEnabled(jobTag))
|
||||
{
|
||||
@@ -361,7 +355,7 @@ namespace PlayerTags.Features
|
||||
}
|
||||
|
||||
// Add randomly generated name tag payload
|
||||
if (m_PluginConfiguration.IsPlayerNameRandomlyGenerated)
|
||||
if (pluginConfiguration.IsPlayerNameRandomlyGenerated)
|
||||
{
|
||||
var playerName = stringMatch.GetMatchText();
|
||||
if (playerName != null)
|
||||
@@ -378,10 +372,10 @@ namespace PlayerTags.Features
|
||||
// Add custom tags
|
||||
if (stringMatch.PlayerPayload != null)
|
||||
{
|
||||
Identity identity = m_PluginData.GetIdentity(stringMatch.PlayerPayload);
|
||||
Identity identity = pluginData.GetIdentity(stringMatch.PlayerPayload);
|
||||
foreach (var customTagId in identity.CustomTagIds)
|
||||
{
|
||||
var customTag = m_PluginData.CustomTags.FirstOrDefault(tag => tag.CustomId.Value == customTagId);
|
||||
var customTag = pluginData.CustomTags.FirstOrDefault(tag => tag.CustomId.Value == customTagId);
|
||||
if (customTag != null)
|
||||
{
|
||||
if (isTagEnabled(customTag))
|
||||
@@ -407,17 +401,17 @@ namespace PlayerTags.Features
|
||||
// An additional step to apply text color to additional locations
|
||||
if (stringMatch.PlayerPayload != null && stringMatch.DisplayTextPayloads.Any())
|
||||
{
|
||||
Identity identity = m_PluginData.GetIdentity(stringMatch.PlayerPayload);
|
||||
Identity identity = pluginData.GetIdentity(stringMatch.PlayerPayload);
|
||||
|
||||
if (stringMatch.GameObject is PlayerCharacter playerCharacter1)
|
||||
{
|
||||
if (playerCharacter1.ClassJob.GameData != null && m_PluginData.JobTags.TryGetValue(playerCharacter1.ClassJob.GameData.Abbreviation, out var jobTag) && isTagEnabled(jobTag))
|
||||
if (playerCharacter1.ClassJob.GameData != null && pluginData.JobTags.TryGetValue(playerCharacter1.ClassJob.GameData.Abbreviation, out var jobTag) && isTagEnabled(jobTag))
|
||||
applyTextFormatting(jobTag);
|
||||
}
|
||||
|
||||
foreach (var customTagId in identity.CustomTagIds)
|
||||
{
|
||||
var customTag = m_PluginData.CustomTags.FirstOrDefault(tag => tag.CustomId.Value == customTagId);
|
||||
var customTag = pluginData.CustomTags.FirstOrDefault(tag => tag.CustomId.Value == customTagId);
|
||||
if (customTag != null && isTagEnabled(customTag))
|
||||
applyTextFormatting(customTag);
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace PlayerTags.Features
|
||||
/// <summary>
|
||||
/// A feature that adds options for the management of custom tags to context menus.
|
||||
/// </summary>
|
||||
public class CustomTagsContextMenuFeature : IDisposable
|
||||
public class CustomTagsContextMenuFeature : FeatureBase, IDisposable
|
||||
{
|
||||
private string?[] SupportedAddonNames = new string?[]
|
||||
{
|
||||
@@ -31,15 +31,10 @@ namespace PlayerTags.Features
|
||||
"SocialList",
|
||||
};
|
||||
|
||||
private PluginConfiguration m_PluginConfiguration;
|
||||
private PluginData m_PluginData;
|
||||
private DalamudContextMenu? m_ContextMenu;
|
||||
|
||||
public CustomTagsContextMenuFeature(PluginConfiguration pluginConfiguration, PluginData pluginData)
|
||||
public CustomTagsContextMenuFeature(PluginConfiguration pluginConfiguration, PluginData pluginData) : base(pluginConfiguration, pluginData)
|
||||
{
|
||||
m_PluginConfiguration = pluginConfiguration;
|
||||
m_PluginData = pluginData;
|
||||
|
||||
m_ContextMenu = new DalamudContextMenu();
|
||||
m_ContextMenu.OnOpenGameObjectContextMenu += ContextMenuHooks_ContextMenuOpened;
|
||||
}
|
||||
@@ -56,17 +51,17 @@ namespace PlayerTags.Features
|
||||
|
||||
private void ContextMenuHooks_ContextMenuOpened(GameObjectContextMenuOpenArgs contextMenuOpenedArgs)
|
||||
{
|
||||
if (!m_PluginConfiguration.IsCustomTagsContextMenuEnabled
|
||||
if (!EnableGlobal || !pluginConfiguration.IsCustomTagsContextMenuEnabled
|
||||
|| !SupportedAddonNames.Contains(contextMenuOpenedArgs.ParentAddonName))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Identity? identity = m_PluginData.GetIdentity(contextMenuOpenedArgs);
|
||||
Identity? identity = pluginData.GetIdentity(contextMenuOpenedArgs);
|
||||
if (identity != null)
|
||||
{
|
||||
var allTags = new Dictionary<Tag, bool>();
|
||||
foreach (var customTag in m_PluginData.CustomTags)
|
||||
foreach (var customTag in pluginData.CustomTags)
|
||||
{
|
||||
var isAdded = identity.CustomTagIds.Contains(customTag.CustomId.Value);
|
||||
allTags.Add(customTag, isAdded);
|
||||
@@ -86,10 +81,10 @@ namespace PlayerTags.Features
|
||||
new GameObjectContextMenuItem(menuItemText, openedEventArgs =>
|
||||
{
|
||||
if (tag.Value)
|
||||
m_PluginData.RemoveCustomTagFromIdentity(tag.Key, identity);
|
||||
pluginData.RemoveCustomTagFromIdentity(tag.Key, identity);
|
||||
else
|
||||
m_PluginData.AddCustomTagToIdentity(tag.Key, identity);
|
||||
m_PluginConfiguration.Save(m_PluginData);
|
||||
pluginData.AddCustomTagToIdentity(tag.Key, identity);
|
||||
pluginConfiguration.Save(pluginData);
|
||||
})
|
||||
{
|
||||
IsSubMenu = false
|
||||
|
||||
24
PlayerTags/Features/FeatureBase.cs
Normal file
24
PlayerTags/Features/FeatureBase.cs
Normal file
@@ -0,0 +1,24 @@
|
||||
using PlayerTags.Configuration;
|
||||
using PlayerTags.Data;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace PlayerTags.Features
|
||||
{
|
||||
public class FeatureBase
|
||||
{
|
||||
protected readonly PluginConfiguration pluginConfiguration;
|
||||
protected readonly PluginData pluginData;
|
||||
|
||||
public virtual bool EnableGlobal => pluginConfiguration.EnabledGlobal;
|
||||
|
||||
protected FeatureBase(PluginConfiguration pluginConfiguration, PluginData pluginData)
|
||||
{
|
||||
this.pluginConfiguration = pluginConfiguration;
|
||||
this.pluginData = pluginData;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -24,16 +24,12 @@ namespace PlayerTags.Features
|
||||
/// </summary>
|
||||
public class NameplateTagTargetFeature : TagTargetFeature
|
||||
{
|
||||
private readonly PluginConfiguration m_PluginConfiguration;
|
||||
private readonly PluginData m_PluginData;
|
||||
private readonly StatusIconPriorizer statusiconPriorizer;
|
||||
private readonly JobIconSets jobIconSets = new();
|
||||
private Nameplate? m_Nameplate;
|
||||
|
||||
public NameplateTagTargetFeature(PluginConfiguration pluginConfiguration, PluginData pluginData)
|
||||
public NameplateTagTargetFeature(PluginConfiguration pluginConfiguration, PluginData pluginData) : base(pluginConfiguration, pluginData)
|
||||
{
|
||||
m_PluginConfiguration = pluginConfiguration;
|
||||
m_PluginData = pluginData;
|
||||
statusiconPriorizer = new(pluginConfiguration.StatusIconPriorizerSettings);
|
||||
|
||||
PluginServices.ClientState.Login += ClientState_Login;
|
||||
@@ -111,9 +107,11 @@ namespace PlayerTags.Features
|
||||
|
||||
private unsafe void Nameplate_PlayerNameplateUpdated(PlayerNameplateUpdatedArgs args)
|
||||
{
|
||||
if (!EnableGlobal) return;
|
||||
|
||||
var beforeTitleBytes = args.Title.Encode();
|
||||
var iconID = args.IconId;
|
||||
var generalOptions = m_PluginConfiguration.GeneralOptions[ActivityContextManager.CurrentActivityContext.ActivityType];
|
||||
var generalOptions = pluginConfiguration.GeneralOptions[ActivityContextManager.CurrentActivityContext.ActivityType];
|
||||
|
||||
AddTagsToNameplate(args.PlayerCharacter, args.Name, args.Title, args.FreeCompany, ref iconID, generalOptions);
|
||||
|
||||
@@ -184,14 +182,14 @@ namespace PlayerTags.Features
|
||||
var classJobGameData = classJob?.GameData;
|
||||
|
||||
// Add the job tags
|
||||
if (classJobGameData != null && m_PluginData.JobTags.TryGetValue(classJobGameData.Abbreviation, out var jobTag))
|
||||
if (classJobGameData != null && pluginData.JobTags.TryGetValue(classJobGameData.Abbreviation, out var jobTag))
|
||||
{
|
||||
if (jobTag.TagTargetInNameplates.InheritedValue != null && jobTag.TagPositionInNameplates.InheritedValue != null)
|
||||
checkTag(jobTag);
|
||||
}
|
||||
|
||||
// Add the randomly generated name tag payload
|
||||
if (m_PluginConfiguration.IsPlayerNameRandomlyGenerated)
|
||||
if (pluginConfiguration.IsPlayerNameRandomlyGenerated)
|
||||
{
|
||||
var characterName = playerCharacter.Name.TextValue;
|
||||
if (characterName != null)
|
||||
@@ -203,10 +201,10 @@ namespace PlayerTags.Features
|
||||
}
|
||||
|
||||
// Add custom tags
|
||||
Identity identity = m_PluginData.GetIdentity(playerCharacter);
|
||||
Identity identity = pluginData.GetIdentity(playerCharacter);
|
||||
foreach (var customTagId in identity.CustomTagIds)
|
||||
{
|
||||
var customTag = m_PluginData.CustomTags.FirstOrDefault(tag => tag.CustomId.Value == customTagId);
|
||||
var customTag = pluginData.CustomTags.FirstOrDefault(tag => tag.CustomId.Value == customTagId);
|
||||
if (customTag != null)
|
||||
checkTag(customTag);
|
||||
}
|
||||
@@ -228,7 +226,7 @@ namespace PlayerTags.Features
|
||||
if (newStatusIcon != null)
|
||||
{
|
||||
var change = nameplateChanges.GetChange(NameplateElements.Name, StringPosition.Before);
|
||||
NameplateUpdateFactory.ApplyStatusIconWithPrio(ref statusIcon, (int)newStatusIcon, change, ActivityContextManager.CurrentActivityContext, statusiconPriorizer, m_PluginConfiguration.MoveStatusIconToNameplateTextIfPossible);
|
||||
NameplateUpdateFactory.ApplyStatusIconWithPrio(ref statusIcon, (int)newStatusIcon, change, ActivityContextManager.CurrentActivityContext, statusiconPriorizer, pluginConfiguration.MoveStatusIconToNameplateTextIfPossible);
|
||||
}
|
||||
|
||||
// Gray out the nameplate
|
||||
@@ -241,15 +239,15 @@ namespace PlayerTags.Features
|
||||
if (playerCharacter != null && (!playerCharacter.IsDead || generalOptions.NameplateDeadPlayerHandling == DeadPlayerHandling.Include))
|
||||
{
|
||||
// An additional step to apply text color to additional locations
|
||||
Identity identity = m_PluginData.GetIdentity(playerCharacter);
|
||||
Identity identity = pluginData.GetIdentity(playerCharacter);
|
||||
foreach (var customTagId in identity.CustomTagIds)
|
||||
{
|
||||
var customTag = m_PluginData.CustomTags.FirstOrDefault(tag => tag.CustomId.Value == customTagId);
|
||||
var customTag = pluginData.CustomTags.FirstOrDefault(tag => tag.CustomId.Value == customTagId);
|
||||
if (customTag != null)
|
||||
applyTextFormatting(customTag);
|
||||
}
|
||||
|
||||
if (playerCharacter.ClassJob.GameData != null && m_PluginData.JobTags.TryGetValue(playerCharacter.ClassJob.GameData.Abbreviation, out var jobTag))
|
||||
if (playerCharacter.ClassJob.GameData != null && pluginData.JobTags.TryGetValue(playerCharacter.ClassJob.GameData.Abbreviation, out var jobTag))
|
||||
applyTextFormatting(jobTag);
|
||||
|
||||
void applyTextFormatting(Tag tag)
|
||||
|
||||
@@ -6,6 +6,7 @@ using FFXIVClientStructs.FFXIV.Client.Game.Object;
|
||||
using Lumina.Excel.GeneratedSheets;
|
||||
using Pilz.Dalamud.ActivityContexts;
|
||||
using Pilz.Dalamud.Tools.Strings;
|
||||
using PlayerTags.Configuration;
|
||||
using PlayerTags.Configuration.GameConfig;
|
||||
using PlayerTags.Data;
|
||||
using PlayerTags.Inheritables;
|
||||
@@ -20,11 +21,11 @@ namespace PlayerTags.Features
|
||||
/// <summary>
|
||||
/// The base of a feature that adds tags to UI elements.
|
||||
/// </summary>
|
||||
public abstract class TagTargetFeature : IDisposable
|
||||
public abstract class TagTargetFeature : FeatureBase, IDisposable
|
||||
{
|
||||
public ActivityContextManager ActivityContextManager { get; init; }
|
||||
|
||||
public TagTargetFeature()
|
||||
protected TagTargetFeature(PluginConfiguration pluginConfiguration, PluginData pluginData) : base(pluginConfiguration, pluginData)
|
||||
{
|
||||
ActivityContextManager = new();
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Security.Cryptography;
|
||||
|
||||
namespace PlayerTags
|
||||
{
|
||||
@@ -17,6 +18,10 @@ namespace PlayerTags
|
||||
{
|
||||
public string Name => "Player Tags";
|
||||
private const string c_CommandName = "/playertags";
|
||||
private const string c_SubCommandName_EnableGlobal = "enableglobal";
|
||||
private const string c_CommandArg_On = "on";
|
||||
private const string c_CommandArg_Off = "off";
|
||||
private const string c_CommandArg_toggle = "toggle";
|
||||
|
||||
private PluginConfiguration m_PluginConfiguration;
|
||||
private PluginData m_PluginData;
|
||||
@@ -40,9 +45,9 @@ namespace PlayerTags
|
||||
|
||||
PluginServices.DalamudPluginInterface.UiBuilder.Draw += UiBuilder_Draw;
|
||||
PluginServices.DalamudPluginInterface.UiBuilder.OpenConfigUi += UiBuilder_OpenConfigUi;
|
||||
PluginServices.CommandManager.AddHandler(c_CommandName, new CommandInfo((string command, string arguments) => UiBuilder_OpenConfigUi())
|
||||
PluginServices.CommandManager.AddHandler(c_CommandName, new CommandInfo(CommandManager_Handler)
|
||||
{
|
||||
HelpMessage = Resources.Strings.Loc_Command_playertags
|
||||
HelpMessage = Resources.Strings.Loc_Command_playertags_v2
|
||||
});
|
||||
m_CustomTagsContextMenuFeature = new CustomTagsContextMenuFeature(m_PluginConfiguration, m_PluginData);
|
||||
m_NameplatesTagTargetFeature = new NameplateTagTargetFeature(m_PluginConfiguration, m_PluginData);
|
||||
@@ -65,6 +70,44 @@ namespace PlayerTags
|
||||
Localizer.SetLanguage(langCode);
|
||||
}
|
||||
|
||||
private void CommandManager_Handler(string command, string arguments)
|
||||
{
|
||||
switch (command)
|
||||
{
|
||||
case c_CommandName:
|
||||
if (string.IsNullOrWhiteSpace(command))
|
||||
UiBuilder_OpenConfigUi();
|
||||
else
|
||||
{
|
||||
var lowerArgs = arguments.ToLower().Split(' ');
|
||||
if (lowerArgs.Length >= 1)
|
||||
{
|
||||
switch (lowerArgs[0])
|
||||
{
|
||||
case c_SubCommandName_EnableGlobal:
|
||||
if (lowerArgs.Length >= 2)
|
||||
{
|
||||
switch (lowerArgs[0])
|
||||
{
|
||||
case c_CommandArg_On:
|
||||
m_PluginConfiguration.EnabledGlobal = true;
|
||||
break;
|
||||
case c_CommandArg_Off:
|
||||
m_PluginConfiguration.EnabledGlobal = false;
|
||||
break;
|
||||
case c_CommandArg_toggle:
|
||||
m_PluginConfiguration.EnabledGlobal = !m_PluginConfiguration.EnabledGlobal;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void UiBuilder_Draw()
|
||||
{
|
||||
if (m_PluginConfiguration.IsVisible)
|
||||
|
||||
@@ -829,7 +829,9 @@ Use this if you want to to have every option under your control or just want to
|
||||
<value>When enabled the Tag will apply to all Chat messages that has not a defined type.
|
||||
This case can happen either if the Game updates and the Enumeration of all Chat Types gets invalid due to shifted values, or plugins creates a custom chat type for whatever reason.</value>
|
||||
</data>
|
||||
<data name="Loc_Command_playertags" xml:space="preserve">
|
||||
<value>Shows the config window for Player Tags</value>
|
||||
<data name="Loc_Command_playertags_v2" xml:space="preserve">
|
||||
<value>Shows the config window for Player Tags
|
||||
Subcommands:
|
||||
enableglobal on|of|toggle -> Set a global master switch that enables or disables all plugin features without changing the current configuration.</value>
|
||||
</data>
|
||||
</root>
|
||||
Reference in New Issue
Block a user