using System; using System.Numerics; using Dalamud.Game.Text.SeStringHandling.Payloads; using Dalamud.Interface.Colors; using Dalamud.Interface.Utility.Raii; using Dalamud.Interface.Windowing; using Dalamud.Utility; using ImGuiNET; using QuestShare.Common; using QuestShare.Services; namespace QuestShare.Windows.MainWindow; public class MainWindow : Window, IDisposable { public MainWindow() : base(Plugin.Name + "###Main", ImGuiWindowFlags.NoScrollbar | ImGuiWindowFlags.NoScrollWithMouse) { SizeConstraints = new WindowSizeConstraints { MinimumSize = new Vector2(600, 650), MaximumSize = new Vector2(float.MaxValue, float.MaxValue) }; } public override void OnOpen() { } public void Dispose() { } private string enteredShareCode = Plugin.Configuration.Instance.LastShareCode; private bool unsavedChanges = false; private GameQuest? selectedQuest = GameQuestManager.GetActiveQuest(); private ShareMode shareMode = Plugin.Configuration.Instance.LastShareMode; private bool isConnecting = false; public override void Draw() { var connected = SocketClientService.IsConnected; var token = ShareService.Token; ImGui.TextUnformatted("Server Status: "); ImGui.SameLine(); if (isConnecting) { ImGui.TextColored(ImGuiColors.DalamudYellow, "Connecting..."); } else { ImGui.TextColored(connected ? ImGuiColors.HealerGreen : ImGuiColors.DPSRed, connected ? "Connected" : "Disconnected"); } ImGui.SameLine(); ImGui.TextUnformatted($"Share Mode: {shareMode.ToString()}"); ImGui.Separator(); if (ImGui.Button("Connect")) { Plugin.SocketClient.Connect().ConfigureAwait(false); isConnecting = true; } ImGui.SameLine(); if (ImGui.Button("Disconnect")) { SocketClientService.Disconnect().ConfigureAwait(false); } // ImGui.SameLine(); ImGui.Separator(); if (!SocketClientService.IsConnected) { ImGui.TextColored(ImGuiColors.DPSRed, "Not connected to server."); return; } isConnecting = false; ImGui.TextUnformatted("Share Mode:"); // ImGui.BeginDisabled(ShareService.IsHost || ShareService.IsGrouped || ShareService.IsRegistered); /*if (ShareService.IsHost && SocketClientService.IsConnected) { shareMode = ShareMode.Host; } else if (ShareService.IsGrouped && SocketClientService.IsConnected) { shareMode = ShareMode.Member; } else if (SocketClientService.IsConnected) { shareMode = ShareMode.None; } */ // TODO: Fix this if (ImGui.RadioButton("Host", shareMode == ShareMode.Host)) { shareMode = ShareMode.Host; Plugin.Configuration.Instance.LastShareMode = ShareMode.Host; Plugin.Configuration.Save(); } ImGui.SameLine(); if (ImGui.RadioButton("Receive", shareMode == ShareMode.Member)) { shareMode = ShareMode.Member; Plugin.Configuration.Instance.LastShareMode = ShareMode.Member; Plugin.Configuration.Save(); } // ImGui.EndDisabled(); ImGui.Separator(); if (shareMode == ShareMode.Host) { ImGui.TextUnformatted("Registered: "); ImGui.SameLine(); ImGui.TextColored(ShareService.IsHost ? ImGuiColors.HealerGreen : ImGuiColors.DPSRed, ShareService.IsHost.ToString()); ImGui.SameLine(); if (!ShareService.IsHost) { ImGui.BeginDisabled(!connected); if (ImGui.Button("Register")) { SocketClientService.DispatchRegister(); } ImGui.EndDisabled(); } else { ImGui.BeginDisabled(!connected); if (ImGui.Button("Cancel")) { SocketClientService.DispatchCancel(); } ImGui.EndDisabled(); } ImGui.SameLine(); ImGui.TextUnformatted(" "); ImGui.SameLine(); ImGui.TextUnformatted($"Share Code:"); ImGui.SameLine(); ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.HealerGreen); ImGui.TextUnformatted(ShareService.HostedShareCode); if (ImGui.IsItemClicked()) { ImGui.SetClipboardText(ShareService.HostedShareCode); } if (ImGui.IsItemHovered()) { ImGui.SetTooltip("Click to copy to clipboard"); } ImGui.PopStyleColor(); ImGui.Separator(); ImGui.BeginDisabled(ShareService.IsMsqTracking); using (var combo = ImRaii.Combo("##Quests", GameQuestManager.GetActiveQuest()?.QuestName ?? "---SELECT---", ImGuiComboFlags.HeightRegular)) { if (combo) { foreach (var quest in GameQuestManager.GameQuests.OrderBy(q => q.QuestName)) { if (ImGui.Selectable(quest.QuestName)) { selectedQuest = quest; GameQuestManager.SetActiveFlag(quest.QuestId); SocketClientService.DispatchUpdate(false); } } } } ImGui.SameLine(); if (ImGui.Button("Refresh")) { GameQuestManager.LoadQuests(); } ImGui.EndDisabled(); ImGui.SameLine(); var track = Plugin.Configuration.Instance.TrackMSQ; if (ImGui.Checkbox("Track MSQ", ref track)) { Plugin.Configuration.Instance.TrackMSQ = track; ShareService.IsMsqTracking = track; Plugin.Configuration.Save(); } if (selectedQuest == null && GameQuestManager.GetActiveQuest() == null) { ImGui.TextUnformatted("No quest selected."); return; } else if (GameQuestManager.GetActiveQuest() != null) { selectedQuest = GameQuestManager.GetActiveQuest(); } ImGui.TextUnformatted("Active Quest:"); ImGui.SameLine(); ImGui.TextUnformatted(selectedQuest!.QuestName); ImGui.TextUnformatted("Current Step:"); ImGui.SameLine(); ImGui.TextUnformatted(selectedQuest.CurrentStep.ToString()); ImGui.Separator(); ImGui.TextUnformatted("Quest Steps:"); ImGui.Separator(); var steps = selectedQuest.QuestSteps; for (var i = 0; i < steps!.Count; i++) { if (i + 1 == selectedQuest.CurrentStep || (selectedQuest.CurrentStep == 0 && i == 0) || (selectedQuest.CurrentStep == 0xFF && i + 1 == steps.Count)) { ImGui.TextColored(ImGuiColors.HealerGreen, steps[i]); } else if (i+1 < selectedQuest.CurrentStep) { ImGui.TextColored(ImGuiColors.DalamudYellow, steps[i]); } else { ImGui.TextUnformatted("???"); } } } else if (shareMode == ShareMode.Member) { ImGui.SetNextItemWidth(100); ImGui.InputTextWithHint("##ShareCode", "Share Code", ref enteredShareCode, 10); ImGui.SameLine(); if (!ShareService.IsGrouped) { ImGui.BeginDisabled(enteredShareCode.Length < 1); if (ImGui.Button("Join Group")) { Plugin.Configuration.Instance.LastShareCode = enteredShareCode; SocketClientService.DispatchGroup(enteredShareCode); } ImGui.EndDisabled(); } else { if (ImGui.Button("Leave Group")) { SocketClientService.DispatchUngroup(); } ImGui.Separator(); ImGui.TextUnformatted("Host Active Quest:"); ImGui.SameLine(); var activeQuest = ShareService.ActiveQuestId; var activeStep = ShareService.ActiveQuestStep; if (activeQuest != 0) { var questInfo = GameQuestManager.GetQuestById(activeQuest); ImGui.TextUnformatted(questInfo.QuestData.Name.ExtractText()); ImGui.TextUnformatted("Current Step:"); ImGui.SameLine(); ImGui.TextUnformatted(activeStep.ToString()); ImGui.Separator(); ImGui.TextUnformatted("Quest Steps:"); ImGui.Separator(); var steps = questInfo.QuestSteps; for (var i = 0; i < steps.Count; i++) { if (i+1 == activeStep || (i+1 == steps.Count && activeStep == 0xFF)) { ImGui.TextColored(ImGuiColors.HealerGreen, steps[i]); } else { ImGui.TextUnformatted(steps[i]); } } if (ImGui.Button("Get Marker")) { var marker = questInfo.GetMapLink((byte)(activeStep - 1)); if (marker != null) GameGui.OpenMapWithMapLink(marker); else Log.Error("No map link available for this quest."); } if (ImGui.IsItemHovered()) { ImGui.SetTooltip("Generates a map marker for the current step's destination."); } ImGui.SameLine(); /*if (ImGui.Button("Teleport")) { // attempt to generate a path to the next step } if (ImGui.IsItemHovered()) { ImGui.SetTooltip("Teleports to nearest aetheryte of quest destination."); }*/ } else { ImGui.TextUnformatted("No active quest."); } } } } }