diff --git a/PlayerTags/Features/ChatTagTargetFeature.cs b/PlayerTags/Features/ChatTagTargetFeature.cs index aab575e..83e2517 100644 --- a/PlayerTags/Features/ChatTagTargetFeature.cs +++ b/PlayerTags/Features/ChatTagTargetFeature.cs @@ -221,7 +221,7 @@ namespace PlayerTags.Features var stringMatches = GetStringMatches(message); foreach (var stringMatch in stringMatches) { - Dictionary> stringChanges = new Dictionary>(); + Dictionary stringChanges = new Dictionary(); if (stringMatch.GameObject is PlayerCharacter playerCharacter) { @@ -233,7 +233,7 @@ namespace PlayerTags.Features var payloads = GetPayloads(jobTag, stringMatch.GameObject); if (payloads.Any()) { - AddPayloadChanges(jobTag.TagPositionInChat.InheritedValue.Value, payloads, stringChanges); + AddPayloadChanges(jobTag.TagPositionInChat.InheritedValue.Value, payloads, stringChanges, true); } } } @@ -247,7 +247,7 @@ namespace PlayerTags.Features var generatedName = RandomNameGenerator.Generate(playerName); if (generatedName != null) { - AddPayloadChanges(TagPosition.Replace, Enumerable.Empty().Append(new TextPayload(generatedName)), stringChanges); + AddPayloadChanges(TagPosition.Replace, Enumerable.Empty().Append(new TextPayload(generatedName)), stringChanges, false); } } } @@ -267,7 +267,7 @@ namespace PlayerTags.Features var customTagPayloads = GetPayloads(customTag, stringMatch.GameObject); if (customTagPayloads.Any()) { - AddPayloadChanges(customTag.TagPositionInChat.InheritedValue.Value, customTagPayloads, stringChanges); + AddPayloadChanges(customTag.TagPositionInChat.InheritedValue.Value, customTagPayloads, stringChanges, false); } } } diff --git a/PlayerTags/Features/NameplateTagTargetFeature.cs b/PlayerTags/Features/NameplateTagTargetFeature.cs index ff3a3b3..4146f05 100644 --- a/PlayerTags/Features/NameplateTagTargetFeature.cs +++ b/PlayerTags/Features/NameplateTagTargetFeature.cs @@ -128,7 +128,7 @@ namespace PlayerTags.Features /// The position of the changes. /// The payload changes to add. /// The dictionary to add changes to. - private void AddPayloadChanges(NameplateElement nameplateElement, TagPosition tagPosition, IEnumerable payloadChanges, Dictionary>> nameplateChanges) + private void AddPayloadChanges(NameplateElement nameplateElement, TagPosition tagPosition, IEnumerable payloadChanges, Dictionary> nameplateChanges, bool forceUsingSingleAnchorPayload) { if (!payloadChanges.Any()) { @@ -137,10 +137,10 @@ namespace PlayerTags.Features if (!nameplateChanges.Keys.Contains(nameplateElement)) { - nameplateChanges[nameplateElement] = new Dictionary>(); + nameplateChanges[nameplateElement] = new(); } - AddPayloadChanges(tagPosition, payloadChanges, nameplateChanges[nameplateElement]); + AddPayloadChanges(tagPosition, payloadChanges, nameplateChanges[nameplateElement], forceUsingSingleAnchorPayload); } /// @@ -152,7 +152,7 @@ namespace PlayerTags.Features /// The free company text to change. private void AddTagsToNameplate(GameObject gameObject, SeString name, SeString title, SeString freeCompany) { - Dictionary>> nameplateChanges = new Dictionary>>(); + Dictionary> nameplateChanges = new(); if (gameObject is PlayerCharacter playerCharacter) { @@ -171,7 +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); + AddPayloadChanges(NameplateElement.Name, TagPosition.Replace, Enumerable.Empty().Append(new TextPayload(generatedName)), nameplateChanges, false); } } @@ -190,7 +190,7 @@ namespace PlayerTags.Features { var payloads = GetPayloads(tag, gameObject); if (payloads.Any()) - AddPayloadChanges(tag.TagTargetInNameplates.InheritedValue.Value, tag.TagPositionInNameplates.InheritedValue.Value, payloads, nameplateChanges); + AddPayloadChanges(tag.TagTargetInNameplates.InheritedValue.Value, tag.TagPositionInNameplates.InheritedValue.Value, payloads, nameplateChanges, false); } } } diff --git a/PlayerTags/Features/TagTargetFeature.cs b/PlayerTags/Features/TagTargetFeature.cs index 911c697..aace99e 100644 --- a/PlayerTags/Features/TagTargetFeature.cs +++ b/PlayerTags/Features/TagTargetFeature.cs @@ -19,6 +19,12 @@ namespace PlayerTags.Features /// public abstract class TagTargetFeature : IDisposable { + protected class StringChanges + { + public List Payloads { get; init; } = new(); + public bool ForceUsingSingleAnchorPayload { get; set; } = false; + } + public ActivityContextManager ActivityContextManager { get; init; } public TagTargetFeature() @@ -214,24 +220,17 @@ namespace PlayerTags.Features /// The position to add changes to. /// The payloads to add. /// The dictionary to add the changes to. - protected void AddPayloadChanges(TagPosition tagPosition, IEnumerable payloads, Dictionary> stringChanges) + protected void AddPayloadChanges(TagPosition tagPosition, IEnumerable payloads, Dictionary stringChanges, bool forceUsingSingleAnchorPayload) { - if (payloads == null || !payloads.Any()) + if (payloads != null && payloads.Any() && stringChanges != null) { - return; - } + if (!stringChanges.Keys.Contains(tagPosition)) + stringChanges[tagPosition] = new(); - if (stringChanges == null) - { - return; + var changes = stringChanges[tagPosition]; + changes.Payloads.AddRange(payloads); + changes.ForceUsingSingleAnchorPayload = forceUsingSingleAnchorPayload; } - - if (!stringChanges.Keys.Contains(tagPosition)) - { - stringChanges[tagPosition] = new List(); - } - - stringChanges[tagPosition].AddRange(payloads); } /// @@ -240,7 +239,7 @@ namespace PlayerTags.Features /// The string to apply changes to. /// The changes to apply. /// The payload in the string that changes should be anchored to. If there is no anchor, the changes will be applied to the entire string. - protected void ApplyStringChanges(SeString seString, Dictionary> stringChanges, List anchorPayloads = null, Payload anchorReplacePayload = null) + protected void ApplyStringChanges(SeString seString, Dictionary stringChanges, List anchorPayloads = null, Payload anchorReplacePayload = null) { if (stringChanges.Count == 0) { @@ -265,47 +264,51 @@ namespace PlayerTags.Features foreach (var tagPosition in tagPositionsOrdered) { - if (stringChanges.TryGetValue(tagPosition, out var payloads) && payloads.Any()) + if (stringChanges.TryGetValue(tagPosition, out var payloads) && payloads.Payloads.Any()) { - AddSpacesBetweenTextPayloads(stringChanges[tagPosition], tagPosition); + AddSpacesBetweenTextPayloads(stringChanges[tagPosition].Payloads, tagPosition); if (tagPosition == TagPosition.Before) { - if (anchorPayloads != null && anchorPayloads.Any()) + Payload anchorFirst = payloads.ForceUsingSingleAnchorPayload ? anchorReplacePayload : anchorPayloads?.FirstOrDefault(); + + if (anchorFirst != null) { - var anchorPayload = anchorPayloads.First(); - var anchorPayloadIndex = seString.Payloads.IndexOf(anchorPayload); - seString.Payloads.InsertRange(anchorPayloadIndex, payloads); + var anchorPayloadIndex = seString.Payloads.IndexOf(anchorFirst); + seString.Payloads.InsertRange(anchorPayloadIndex, payloads.Payloads); } else { - seString.Payloads.InsertRange(0, payloads); + seString.Payloads.InsertRange(0, payloads.Payloads); } } else if (tagPosition == TagPosition.After) { - if (anchorPayloads != null && anchorPayloads.Any()) + Payload anchorLast = payloads.ForceUsingSingleAnchorPayload? anchorReplacePayload : anchorPayloads?.LastOrDefault(); + + if (anchorLast != null) { - var anchorPayload = anchorPayloads.Last(); - var anchorPayloadIndex = seString.Payloads.IndexOf(anchorPayload); - seString.Payloads.InsertRange(anchorPayloadIndex + 1, payloads); + var anchorPayloadIndex = seString.Payloads.IndexOf(anchorLast); + seString.Payloads.InsertRange(anchorPayloadIndex + 1, payloads.Payloads); } else { - seString.Payloads.AddRange(payloads); + seString.Payloads.AddRange(payloads.Payloads); } } else if (tagPosition == TagPosition.Replace) { - if (anchorReplacePayload != null) + Payload anchorReplace = anchorReplacePayload; + + if (anchorReplace != null) { - var anchorPayloadIndex = seString.Payloads.IndexOf(anchorReplacePayload); - seString.Payloads.InsertRange(anchorPayloadIndex, payloads); - seString.Payloads.Remove(anchorReplacePayload); + var anchorPayloadIndex = seString.Payloads.IndexOf(anchorReplace); + seString.Payloads.InsertRange(anchorPayloadIndex, payloads.Payloads); + seString.Payloads.Remove(anchorReplace); } else { seString.Payloads.Clear(); - seString.Payloads.AddRange(payloads); + seString.Payloads.AddRange(payloads.Payloads); } } }