diff options
Diffstat (limited to 'Malmstone/Plugin.cs')
| -rw-r--r-- | Malmstone/Plugin.cs | 94 |
1 files changed, 91 insertions, 3 deletions
diff --git a/Malmstone/Plugin.cs b/Malmstone/Plugin.cs index 0455792..b78cccd 100644 --- a/Malmstone/Plugin.cs +++ b/Malmstone/Plugin.cs @@ -4,7 +4,12 @@ using Dalamud.Plugin; using Dalamud.Interface.Windowing; using Dalamud.Plugin.Services; using Malmstone.Windows; - +using Malmstone.Services; +using System; +using Dalamud.Game.Text.SeStringHandling; +using Dalamud.Game.Text.SeStringHandling.Payloads; +using System.Collections.Generic; +using System.Linq; namespace Malmstone; public sealed class Plugin : IDalamudPlugin @@ -13,6 +18,8 @@ public sealed class Plugin : IDalamudPlugin [PluginService] internal static ITextureProvider TextureProvider { get; private set; } = null!; [PluginService] internal static ICommandManager CommandManager { get; private set; } = null!; + [PluginService] internal static IChatGui Chat { get; private set; } = null!; + private const string CommandName = "/pmalm"; public Configuration Configuration { get; init; } @@ -20,6 +27,7 @@ public sealed class Plugin : IDalamudPlugin public readonly WindowSystem WindowSystem = new("Malmstone"); private ConfigWindow ConfigWindow { get; init; } private MainWindow MainWindow { get; init; } + private PvPService PvPService; public Plugin() { @@ -27,13 +35,14 @@ public sealed class Plugin : IDalamudPlugin ConfigWindow = new ConfigWindow(this); MainWindow = new MainWindow(this); + PvPService = new PvPService(); WindowSystem.AddWindow(ConfigWindow); WindowSystem.AddWindow(MainWindow); CommandManager.AddHandler(CommandName, new CommandInfo(OnCommand) { - HelpMessage = "Open the Malmstone calculator main window" + HelpMessage = "/pmalm <rank> <all/cc/fl/rw> -- Displays PVP games left until a target rank. cc = Crystalline Conflict, fl = Frontlines, rw = Rivalwings" }); PluginInterface.UiBuilder.Draw += DrawUI; @@ -53,9 +62,88 @@ public sealed class Plugin : IDalamudPlugin private void OnCommand(string command, string args) { - ToggleMainUI(); + if (string.IsNullOrWhiteSpace(args)) + { + ToggleMainUI(); + return; + } + + var splitArgs = args.Split(' ', StringSplitOptions.RemoveEmptyEntries); + if (!int.TryParse(splitArgs[0], out int targetRank)) return; + var specs = new HashSet<string>(splitArgs.Skip(1).Select(spec => spec.ToLower())); + + var pvpInfo = PvPService.GetPvPSeriesInfo(); + if (pvpInfo == null) return; + + if (targetRank < 1) + { + Chat.PrintError("Can't have a target rank less than 1"); + return; + } + + if (targetRank > 107397) + { + Chat.PrintError("Can't have a target rank greater than 107397 (are you really gonna be able to reach that anyways?)"); + return; + } + + if (targetRank < pvpInfo.CurrentSeriesRank) + { + Chat.PrintError("You've already surpassed Rank " + targetRank); + return; + } + + var xpResult = Malmstone.Utils.MalmstoneXPCalculator.CalculateXp( + pvpInfo.CurrentSeriesRank, + targetRank, + pvpInfo.SeriesExperience); + + bool includeAll = specs.Contains("all"); + if (!specs.Any()) + { + includeAll = true; + } + var seString = new SeString(new List<Payload>()); + + if (includeAll || specs.Contains("cc")) + { + seString.Append(new TextPayload("Crystalline Conflict:\n")); + seString.Append(new UIForegroundPayload(35)); + seString.Append(new TextPayload(xpResult.ActivityCounts.ContainsKey("Crystalline Conflict Win") ? $"Win: {xpResult.ActivityCounts["Crystalline Conflict Win"]} times\n" : "")); + seString.Append(new TextPayload(xpResult.ActivityCounts.ContainsKey("Crystalline Conflict Lose") ? $"Lose: {xpResult.ActivityCounts["Crystalline Conflict Lose"]} times\n" : "")); + seString.Append(UIForegroundPayload.UIForegroundOff); + } + + if (includeAll || specs.Contains("fl")) + { + seString.Append(new TextPayload("\nFrontlines:\n")); + seString.Append(new UIForegroundPayload(518)); + seString.Append(new TextPayload(xpResult.ActivityCounts.ContainsKey("Frontline Win") ? $"Take 1st Place: {xpResult.ActivityCounts["Frontline Win"]} times\n" : "")); + seString.Append(new TextPayload(xpResult.ActivityCounts.ContainsKey("Frontline Lose 2nd") ? $"Take 2nd Place: {xpResult.ActivityCounts["Frontline Lose 2nd"]} times\n" : "")); + seString.Append(new TextPayload(xpResult.ActivityCounts.ContainsKey("Frontline Lose 3rd") ? $"Take 3rd Place: {xpResult.ActivityCounts["Frontline Lose 3rd"]} times\n" : "")); + seString.Append(UIForegroundPayload.UIForegroundOff); + + seString.Append(new TextPayload("\nFrontlines (Roulette):\n")); + seString.Append(new UIForegroundPayload(518)); + seString.Append(new TextPayload(xpResult.ActivityCounts.ContainsKey("Frontline Daily Win") ? $"Take 1st Place: {xpResult.ActivityCounts["Frontline Daily Win"]} times\n" : "")); + seString.Append(new TextPayload(xpResult.ActivityCounts.ContainsKey("Frontline Daily Lose 2nd") ? $"Take 2nd Place: {xpResult.ActivityCounts["Frontline Daily Lose 2nd"]} times\n" : "")); + seString.Append(new TextPayload(xpResult.ActivityCounts.ContainsKey("Frontline Daily Lose 3rd") ? $"Take 3rd Place: {xpResult.ActivityCounts["Frontline Daily Lose 3rd"]} times\n" : "")); + seString.Append(UIForegroundPayload.UIForegroundOff); + } + + if (includeAll || specs.Contains("rw")) + { + seString.Append(new TextPayload("\nRival Wings:\n")); + seString.Append(new UIForegroundPayload(43)); + seString.Append(new TextPayload(xpResult.ActivityCounts.ContainsKey("Rival Wings Win") ? $"Win: {xpResult.ActivityCounts["Rival Wings Win"]} times\n" : "")); + seString.Append(new TextPayload(xpResult.ActivityCounts.ContainsKey("Rival Wings Lose") ? $"Lose: {xpResult.ActivityCounts["Rival Wings Lose"]} times\n" : "")); + seString.Append(UIForegroundPayload.UIForegroundOff); + } + + Chat.Print(seString); } + private void DrawUI() => WindowSystem.Draw(); public void ToggleConfigUI() => ConfigWindow.Toggle(); |
