286 lines
11 KiB
C#
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.");
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|