2025-02-18 00:07:12 -05:00

286 lines
11 KiB
C#

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.");
}
}
}
}
}