add dead player handling (backend)

This commit is contained in:
2022-11-15 19:56:58 +01:00
parent 972f9e8819
commit 3849644e04
3 changed files with 73 additions and 7 deletions

View File

@@ -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;
}
}

View File

@@ -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
}
}

View File

@@ -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;
}
/// <summary>
/// Adds tags to the nameplate of a game object.
/// </summary>
@@ -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<NameplateElements>())
{
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