From 6e9036a6ce6120add34b7df7d1a9b3109b283aef Mon Sep 17 00:00:00 2001 From: Anna Date: Sat, 27 Jul 2024 16:54:23 -0400 Subject: [PATCH] feat: begin prototyping npc rating --- Configuration.cs | 1 + Plugin.cs | 264 +++++++++++++++++++---------------------------- PluginUi.cs | 2 + RawCombatData.cs | 3 + 4 files changed, 113 insertions(+), 157 deletions(-) diff --git a/Configuration.cs b/Configuration.cs index 06844eb..7b8aa0d 100644 --- a/Configuration.cs +++ b/Configuration.cs @@ -26,6 +26,7 @@ public class Configuration : IPluginConfiguration { public int TextMulBlue = 100; public bool ClearResultsOnInactive = true; public float ClearDelaySeconds = 10; + public bool UseEvaluatorNpc; } public enum MeterMode { diff --git a/Plugin.cs b/Plugin.cs index 43bac6d..760f139 100644 --- a/Plugin.cs +++ b/Plugin.cs @@ -160,6 +160,18 @@ public class Plugin : IDalamudPlugin { if (this.Config.ClearResultsOnInactive) { this.DelayWatch.Restart(); } + + if (this.Config.UseEvaluatorNpc && this.Client.Data != null) { + var combatants = this.Client.Data.Combatants.Values.ToList(); + combatants.Sort((a, b) => b.EncDps.CompareTo(a.EncDps)); + var rank = combatants.FindIndex(combatant => combatant.Name == "YOU"); + var msg = rank switch { + < 0 => null, + 1 => "Well done! I never doubted for a second that you'd do so well.", + _ => "Keep trying, friend! You'll get there in the end.", + }; + UIModule.Instance()->ShowBattleTalkImage("G'raha Tia", msg, 5f, 10, 0); + } } if (this.Config.ClearResultsOnInactive && this.DelayWatch.IsRunning && this.DelayWatch.Elapsed >= TimeSpan.FromSeconds(this.Config.ClearDelaySeconds)) { @@ -248,111 +260,116 @@ public class Plugin : IDalamudPlugin { continue; } - this.UpdateMember(list->PartyMembers[i], member.Object, data.Encounter, combatant); + this.UpdateMember(list, i, member.Object, data.Encounter, combatant); } return false; } + private unsafe void ResetMember( + AddonPartyList* list, + BattleChara* chara, + int listIndex, + bool includeTargeted + ) { + var unit = list->PartyMembers[listIndex]; + if (unit.TargetGlow != null && (includeTargeted || list->TargetedIndex != listIndex)) { + unit.TargetGlow->SetAlpha(255); + unit.TargetGlow->SetScaleX(0); + unit.TargetGlow->AddRed = 0; + unit.TargetGlow->AddGreen = 0; + unit.TargetGlow->AddBlue = 0; + unit.TargetGlow->MultiplyRed = 100; + unit.TargetGlow->MultiplyGreen = 100; + unit.TargetGlow->MultiplyBlue = 100; + unit.TargetGlow->ToggleVisibility(true); + } + + var left = (AtkTextNode*) unit.MPGaugeBar->GetTextNodeById(2); + var right = (AtkTextNode*) unit.MPGaugeBar->GetTextNodeById(3); + + var hasLeft = left != null && left->IsVisible(); + var hasRight = right != null && right->IsVisible(); + var hasChara = chara != null; + + if (!hasLeft) { + return; + } + + left->TextColor = new ByteColor { + RGBA = 0xFFFFFFFF, + }; + + var manaString = hasChara + ? chara->Mana.ToString(CultureInfo.InvariantCulture) + : "???"; + if (hasRight) { + if (manaString.Length <= 1) { + left->SetText(""); + right->SetText(manaString); + } else { + left->SetText(manaString[..^2]); + right->SetText(manaString[^2..]); + } + } else { + left->SetText(manaString); + } + + left->AddRed = 0; + left->AddGreen = 0; + left->AddBlue = 0; + left->MultiplyRed = 100; + left->MultiplyGreen = 100; + left->MultiplyBlue = 100; + + if (hasRight) { + right->TextColor = left->TextColor; + right->AddRed = left->AddRed; + right->AddGreen = left->AddGreen; + right->AddBlue = left->AddBlue; + right->MultiplyRed = left->MultiplyRed; + right->MultiplyGreen = left->MultiplyGreen; + right->MultiplyBlue = left->MultiplyBlue; + } + + // fixme: need to figure out a way to get the game to repop + // var defaultName = new StringBuilder("\ue06a"); + // foreach (var digit in member.Object->Level.ToString(CultureInfo.InvariantCulture)) { + // var offset = digit - '0'; + // defaultName.Append((char) ('\ue060' + offset)); + // } + + // defaultName.Append(' '); + // defaultName.Append(member.Object->NameString); + + // unit.Name->SetText(defaultName.ToString()); + // unit.Name->TextColor = new ByteColor { + // RGBA = 0xFFFFFFFF, + // }; + + // unit.Name->AddRed = 0; + // unit.Name->AddGreen = 0; + // unit.Name->AddBlue = 0; + // unit.Name->MultiplyRed = 100; + // unit.Name->MultiplyGreen = 100; + // unit.Name->MultiplyBlue = 100; + } + private unsafe void ResetMembers(AddonPartyList* list) { var members = AgentHUD.Instance()->PartyMembers; for (var i = 0; i < members.Length && i < list->PartyMembers.Length; i++) { - var member = members[i]; - if (member.Name == null) { - continue; - } - - var unit = list->PartyMembers[i]; - if (list->TargetedIndex != i && unit.TargetGlow != null) { - unit.TargetGlow->SetAlpha(255); - unit.TargetGlow->SetScaleX(0); - unit.TargetGlow->AddRed = 0; - unit.TargetGlow->AddGreen = 0; - unit.TargetGlow->AddBlue = 0; - unit.TargetGlow->MultiplyRed = 100; - unit.TargetGlow->MultiplyGreen = 100; - unit.TargetGlow->MultiplyBlue = 100; - unit.TargetGlow->ToggleVisibility(true); - } - - var left = (AtkTextNode*) unit.MPGaugeBar->GetTextNodeById(2); - var right = (AtkTextNode*) unit.MPGaugeBar->GetTextNodeById(3); - var chara = member.Object; - - var hasLeft = left != null && left->IsVisible(); - var hasRight = right != null && right->IsVisible(); - var hasChara = chara != null; - - if (!hasLeft) { - return; - } - - left->TextColor = new ByteColor { - RGBA = 0xFFFFFFFF, - }; - - var manaString = hasChara - ? chara->Mana.ToString(CultureInfo.InvariantCulture) - : "???"; - if (hasRight) { - if (manaString.Length <= 1) { - left->SetText(""); - right->SetText(manaString); - } else { - left->SetText(manaString[..^2]); - right->SetText(manaString[^2..]); - } - } else { - left->SetText(manaString); - } - - left->AddRed = 0; - left->AddGreen = 0; - left->AddBlue = 0; - left->MultiplyRed = 100; - left->MultiplyGreen = 100; - left->MultiplyBlue = 100; - - if (hasRight) { - right->TextColor = left->TextColor; - right->AddRed = left->AddRed; - right->AddGreen = left->AddGreen; - right->AddBlue = left->AddBlue; - right->MultiplyRed = left->MultiplyRed; - right->MultiplyGreen = left->MultiplyGreen; - right->MultiplyBlue = left->MultiplyBlue; - } - - // fixme: need to figure out a way to get the game to repop - // var defaultName = new StringBuilder("\ue06a"); - // foreach (var digit in member.Object->Level.ToString(CultureInfo.InvariantCulture)) { - // var offset = digit - '0'; - // defaultName.Append((char) ('\ue060' + offset)); - // } - - // defaultName.Append(' '); - // defaultName.Append(member.Object->NameString); - - // unit.Name->SetText(defaultName.ToString()); - // unit.Name->TextColor = new ByteColor { - // RGBA = 0xFFFFFFFF, - // }; - - // unit.Name->AddRed = 0; - // unit.Name->AddGreen = 0; - // unit.Name->AddBlue = 0; - // unit.Name->MultiplyRed = 100; - // unit.Name->MultiplyGreen = 100; - // unit.Name->MultiplyBlue = 100; + this.ResetMember(list, members[i].Object, i, false); } } private unsafe void UpdateMember( - AddonPartyList.PartyListMemberStruct member, + AddonPartyList* list, + int listIndex, BattleChara* chara, Encounter encounter, Combatant combatant ) { + var member = list->PartyMembers[listIndex]; if (this.Config.UseDpsBar && member.TargetGlow != null) { member.TargetGlow->ToggleVisibility(true); member.TargetGlow->SetAlpha((byte) Math.Round(this.Config.BarAlpha * 255)); @@ -383,42 +400,7 @@ public class Plugin : IDalamudPlugin { if (this.Config.Alternate && !this._showDps) { var isCaster = hasChara && Array.IndexOf(this._manaUsers, chara->ClassJob) != -1; if (!this.Config.ManaModeAlternateOnlyManaUsers || isCaster) { - left->TextColor = new ByteColor { - RGBA = 0xFFFFFFFF, - }; - - left->AddRed = 0; - left->AddGreen = 0; - left->AddBlue = 0; - left->MultiplyRed = 100; - left->MultiplyGreen = 100; - left->MultiplyBlue = 100; - - if (hasRight) { - right->TextColor = left->TextColor; - right->AddRed = left->AddRed; - right->AddGreen = left->AddGreen; - right->AddBlue = left->AddBlue; - right->MultiplyRed = left->MultiplyRed; - right->MultiplyGreen = left->MultiplyGreen; - right->MultiplyBlue = left->MultiplyBlue; - } - - var manaString = hasChara - ? chara->Mana.ToString(CultureInfo.InvariantCulture) - : "???"; - if (hasRight) { - if (manaString.Length <= 1) { - left->SetText(""); - right->SetText(manaString); - } else { - left->SetText(manaString[..^2]); - right->SetText(manaString[^2..]); - } - } else { - left->SetText(manaString); - } - + this.ResetMember(list, chara, listIndex, true); return; } } @@ -473,37 +455,5 @@ public class Plugin : IDalamudPlugin { left->SetText($"{leftText}{rightText}"); } } - // else if (this.Config.Mode == MeterMode.Name) { - // var dpsText = combatant.EncDps switch { - // float.NaN => "0", - // float.PositiveInfinity => "0", - // float.NegativeInfinity => "0", - // < 1_000 => $"{combatant.EncDps:N2}", - // < 1_000_000 => $"{combatant.EncDps / 1_000:N2}K", - // < 1_000_000_000 => $"{combatant.EncDps / 1_000_000:N2}M", - // _ => $"{combatant.EncDps / 1_000_000_000:N2}B", - // }; - - // if (this.Config.Alternate && !this._showDps) { - // member.Name->TextColor = new ByteColor { - // RGBA = 0xFFFFFFFF, - // }; - // member.Name->SetText(chara->Name); - - // return; - // } - - // member.Name->SetText(dpsText); - // member.Name->TextColor = new ByteColor { - // RGBA = this.Config.TextColour, - // }; - - // member.Name->AddRed = (byte) Math.Clamp(this.Config.TextAddRed, 0, 255); - // member.Name->AddGreen = (byte) Math.Clamp(this.Config.TextAddGreen, 0, 255); - // member.Name->AddBlue = (byte) Math.Clamp(this.Config.TextAddBlue, 0, 255); - // member.Name->MultiplyRed = (byte) Math.Clamp(this.Config.TextMulRed, 0, 100); - // member.Name->MultiplyGreen = (byte) Math.Clamp(this.Config.TextMulGreen, 0, 100); - // member.Name->MultiplyBlue = (byte) Math.Clamp(this.Config.TextMulBlue, 0, 100); - // } } } diff --git a/PluginUi.cs b/PluginUi.cs index 0956f39..28d278f 100644 --- a/PluginUi.cs +++ b/PluginUi.cs @@ -91,6 +91,8 @@ public class PluginUi : IDisposable { anyChanged |= ImGui.SliderFloat("Seconds to delay before clearing", ref this.Plugin.Config.ClearDelaySeconds, 0, 300); } + anyChanged |= ImGui.Checkbox("Show an NPC text bubble rating your performance after an encounter", ref this.Plugin.Config.UseEvaluatorNpc); + if (anyChanged) { this.Plugin.SaveConfig(); } diff --git a/RawCombatData.cs b/RawCombatData.cs index b0fb905..07babb3 100644 --- a/RawCombatData.cs +++ b/RawCombatData.cs @@ -54,6 +54,9 @@ public class RawEncounter { [JsonProperty("enchps")] public string EncHps; + [JsonProperty("ENCHPS")] + public string EncHps2; + [JsonProperty("CurrentZoneName")] public string CurrentZoneName; }