diff --git a/PlayerTags/Configuration/PluginConfiguration.cs b/PlayerTags/Configuration/PluginConfiguration.cs index 5340178..a0aabeb 100644 --- a/PlayerTags/Configuration/PluginConfiguration.cs +++ b/PlayerTags/Configuration/PluginConfiguration.cs @@ -284,7 +284,7 @@ namespace PlayerTags.Configuration public NameplateFreeCompanyVisibility NameplateFreeCompanyVisibility = NameplateFreeCompanyVisibility.Default; public NameplateTitleVisibility NameplateTitleVisibility = NameplateTitleVisibility.WhenHasTags; public NameplateTitlePosition NameplateTitlePosition = NameplateTitlePosition.AlwaysAboveName; - + public DeadPlayerHandling NameplateDeadPlayerHandling = DeadPlayerHandling.Include; public bool IsApplyTagsToAllChatMessagesEnabled = true; } } diff --git a/PlayerTags/Data/DeadPlayerHandling.cs b/PlayerTags/Data/DeadPlayerHandling.cs new file mode 100644 index 0000000..9fd6883 --- /dev/null +++ b/PlayerTags/Data/DeadPlayerHandling.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PlayerTags.Data +{ + public enum DeadPlayerHandling + { + Ignore, + Include, + GrayOut + } +} diff --git a/PlayerTags/Features/NameplateTagTargetFeature.cs b/PlayerTags/Features/NameplateTagTargetFeature.cs index c73205f..32f10dc 100644 --- a/PlayerTags/Features/NameplateTagTargetFeature.cs +++ b/PlayerTags/Features/NameplateTagTargetFeature.cs @@ -2,6 +2,9 @@ using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling.Payloads; +using FFXIVClientStructs.FFXIV.Client.Game.Character; +using FFXIVClientStructs.FFXIV.Client.System.Memory; +using FFXIVClientStructs.FFXIV.Component.GUI; using Lumina.Excel.GeneratedSheets; using Pilz.Dalamud.Icons; using Pilz.Dalamud.Nameplates.Tools; @@ -106,13 +109,37 @@ namespace PlayerTags.Features return false; } - private void Nameplate_PlayerNameplateUpdated(PlayerNameplateUpdatedArgs args) + private unsafe void Nameplate_PlayerNameplateUpdated(PlayerNameplateUpdatedArgs args) { var beforeTitleBytes = args.Title.Encode(); var iconID = args.IconId; var generalOptions = m_PluginConfiguration.GeneralOptions[ActivityContextManager.CurrentActivityContext.ActivityType]; + var applyTags = false; + var grayOut = false; + + if (args.PlayerCharacter != null) + { + if (args.PlayerCharacter.IsDead) + { + switch (generalOptions.NameplateDeadPlayerHandling) + { + case DeadPlayerHandling.Include: + applyTags = true; + break; + case DeadPlayerHandling.GrayOut: + grayOut = true; + break; + } + } + else + applyTags = true; + } + + if (applyTags) + AddTagsToNameplate(args.PlayerCharacter, args.Name, args.Title, args.FreeCompany, ref iconID); + else if(grayOut) + GrayOutNameplate(args.PlayerCharacter, args.Name, args.Title, args.FreeCompany, ref iconID); - AddTagsToNameplate(args.PlayerCharacter, args.Name, args.Title, args.FreeCompany, ref iconID); args.IconId = iconID; if (generalOptions.NameplateTitlePosition == NameplateTitlePosition.AlwaysAboveName) @@ -150,6 +177,17 @@ namespace PlayerTags.Features } } + private NameplateChanges GenerateEmptyNameplateChanges(SeString name, SeString title, SeString freeCompany) + { + NameplateChanges nameplateChanges = new(); + + nameplateChanges.GetProps(NameplateElements.Name).Destination = name; + nameplateChanges.GetProps(NameplateElements.Title).Destination = title; + nameplateChanges.GetProps(NameplateElements.FreeCompany).Destination = freeCompany; + + return nameplateChanges; + } + /// /// Adds tags to the nameplate of a game object. /// @@ -160,10 +198,7 @@ namespace PlayerTags.Features private void AddTagsToNameplate(GameObject gameObject, SeString name, SeString title, SeString freeCompany, ref int statusIcon) { int? newStatusIcon = null; - NameplateChanges nameplateChanges = new(); - nameplateChanges.GetProps(NameplateElements.Name).Destination = name; - nameplateChanges.GetProps(NameplateElements.Title).Destination = title; - nameplateChanges.GetProps(NameplateElements.FreeCompany).Destination = freeCompany; + NameplateChanges nameplateChanges = GenerateEmptyNameplateChanges(name, title, freeCompany); if (gameObject is PlayerCharacter playerCharacter) { @@ -244,6 +279,22 @@ namespace PlayerTags.Features } } + protected void GrayOutNameplate(GameObject gameObject, SeString name, SeString title, SeString freeCompany, ref int statusIcon) + { + if (gameObject is PlayerCharacter playerCharacter) + { + NameplateChanges nameplateChanges = GenerateEmptyNameplateChanges(name, title, freeCompany); + + foreach (NameplateElements element in Enum.GetValues()) + { + nameplateChanges.GetChange(element, StringPosition.Before).Payloads.Add(new UIForegroundPayload(3)); + nameplateChanges.GetChange(element, StringPosition.After).Payloads.Add(new UIForegroundPayload(0)); + } + + ApplyNameplateChanges(nameplateChanges); + } + } + protected void ApplyNameplateChanges(NameplateChanges nameplateChanges) { var props = new NameplateChangesProps