using System; using System.Numerics; using Dalamud.Interface.Colors; using Dalamud.Interface.Utility.Raii; using Dalamud.Interface.Windowing; 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() { var questId = 69286; // find the quest by id } public void Dispose() { } private string enteredShareCode = Plugin.Configuration.LastShareCode; private bool unsavedChanges = false; private uint activeQuestId = 0; private byte activeQuestStep = 0; public override void Draw() { ImGui.TextUnformatted($"Token: {ShareService.Token}"); ImGui.TextUnformatted($"Share Code: {ShareService.ShareCode}"); ImGui.TextUnformatted($"Socket Status: {SocketClientService.IsConnected}"); ImGui.TextUnformatted($"Is Hosting: {ShareService.IsHost} - Is Grouped: {ShareService.IsGrouped}"); ImGui.Separator(); if (ImGui.Button("Connect")) { Plugin.SocketClient.Connect().ConfigureAwait(false); } ImGui.SameLine(); if (ImGui.Button("Disconnect")) { SocketClientService.connection.StopAsync().ConfigureAwait(false); } if (ImGui.Button("Register")) { SocketClientService.DispatchRegister(); } ImGui.SameLine(); ImGui.BeginDisabled(!ShareService.IsGrouped && !ShareService.IsHost); if (ImGui.Button("Cancel")) { SocketClientService.DispatchCancel(); } ImGui.EndDisabled(); ImGui.SetNextItemWidth(100); ImGui.InputTextWithHint("##ShareCode", "Share Code", ref enteredShareCode, 10); ImGui.SameLine(); ImGui.BeginDisabled(enteredShareCode.Length < 1); if (ImGui.Button("Pair")) { SocketClientService.DispatchGroup(enteredShareCode); } ImGui.EndDisabled(); ImGui.Separator(); if (ShareService.IsHost) { ImGui.TextUnformatted("Host Controls:"); ImGui.TextUnformatted("Share Code: "); ImGui.SameLine(); ImGui.TextColored(ImGuiColors.HealerGreen, ShareService.ShareCode); ImGui.TextUnformatted("Quests:"); ImGui.BeginChild("##Quests", new Vector2(0, ImGui.GetTextLineHeightWithSpacing() * 10), true); ImGui.BeginTable("##QuestTable", 3, ImGuiTableFlags.Borders | ImGuiTableFlags.Resizable | ImGuiTableFlags.SizingFixedFit, new Vector2(0, -ImGui.GetTextLineHeightWithSpacing())); ImGui.TableSetupColumn("Sync", ImGuiTableColumnFlags.WidthFixed, 50); ImGui.TableSetupColumn("Active", ImGuiTableColumnFlags.WidthFixed, 50); ImGui.TableSetupColumn("Quest", ImGuiTableColumnFlags.WidthStretch); ImGui.TableSetupScrollFreeze(0, 1); ImGui.TableHeadersRow(); foreach (var quest in GameQuestManager.GameQuests) { ImGui.TableNextRow(); ImGui.TableNextColumn(); var isSynced = quest.IsSynced; ImGui.BeginDisabled(quest.IsActive); if (ImGui.Checkbox($"##{quest.QuestId}_Sync", ref isSynced)) { GameQuestManager.SetSyncFlag(quest.QuestId, isSynced); unsavedChanges = true; } ImGui.EndDisabled(); ImGui.TableNextColumn(); var isActive = quest.IsActive; ImGui.BeginDisabled(!isSynced); if (ImGui.Checkbox($"##{quest.QuestId}_Active", ref isActive)) { GameQuestManager.SetActiveFlag(quest.QuestId, isActive); unsavedChanges = true; } ImGui.EndDisabled(); ImGui.TableNextColumn(); ImGui.TextColored(isActive ? ImGuiColors.HealerGreen : ImGuiColors.DalamudGrey, quest.QuestData.Name.ExtractText()); if (isActive) { activeQuestId = quest.QuestId; activeQuestStep = quest.CurrentStep; } } ImGui.EndTable(); ImGui.EndDisabled(); ImGui.EndChild(); ImGui.BeginDisabled(!unsavedChanges); if (ImGui.Button("Save")) { SocketClientService.DispatchUpdate(false); unsavedChanges = false; } ImGui.EndDisabled(); } else { ImGui.TextUnformatted("Click Register to host a share session, or enter a share code to join."); } if (ShareService.IsGrouped || ShareService.IsHost) { ImGui.Separator(); ImGui.TextUnformatted("Members:"); ImGui.BeginChild("##Members", new Vector2(0, ImGui.GetTextLineHeightWithSpacing() * 5), true); foreach (var member in ShareService.SharedMembers) { ImGui.TextUnformatted(member.CharacterName); } ImGui.EndChild(); } ImGui.TextUnformatted("Current Active Quest Steps:"); if (activeQuestId != 0) { ImGui.TextUnformatted($"Quest: {GameQuestManager.GameQuests.FirstOrDefault(q => q.QuestId == activeQuestId)?.QuestData.Name.ExtractText()}"); ImGui.TextUnformatted($"Step: {activeQuestStep}"); ImGui.TextUnformatted("Steps:"); ImGui.BeginChild("##QuestSteps", new Vector2(0, ImGui.GetTextLineHeightWithSpacing()*5), true); var steps = GameQuestManager.GameQuests.FirstOrDefault(q => q.QuestId == activeQuestId)?.QuestSteps; var counter = 0; if (steps != null) { foreach (var step in steps) { if (counter+1 == activeQuestStep || (activeQuestStep == 0xFF && steps.Count == counter+1)) { ImGui.TextColored(ImGuiColors.HealerGreen, step); } else { ImGui.TextUnformatted(step); } counter++; } } else { ImGui.TextUnformatted("No steps found."); } ImGui.EndChild(); } else { ImGui.TextUnformatted("No active quest."); } } }