diff --git a/LightlessSync/Plugin.cs b/LightlessSync/Plugin.cs index 09f218e..3529735 100644 --- a/LightlessSync/Plugin.cs +++ b/LightlessSync/Plugin.cs @@ -1,4 +1,4 @@ -using Dalamud.Game; +using Dalamud.Game; using Dalamud.Game.ClientState.Objects; using Dalamud.Interface.ImGuiFileDialog; using Dalamud.Interface.Windowing; @@ -230,7 +230,7 @@ public sealed class Plugin : IDalamudPlugin s.GetRequiredService(), s.GetRequiredService())); collection.AddScoped(); collection.AddScoped((s) => new BroadcastUI(s.GetRequiredService>(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService())); - collection.AddScoped((s) => new SyncshellFinderUI(s.GetRequiredService>(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService())); + collection.AddScoped((s) => new SyncshellFinderUI(s.GetRequiredService>(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService())); collection.AddScoped(); collection.AddScoped(); collection.AddScoped(); diff --git a/LightlessSync/Services/DalamudUtilService.cs b/LightlessSync/Services/DalamudUtilService.cs index ed66506..e5fd735 100644 --- a/LightlessSync/Services/DalamudUtilService.cs +++ b/LightlessSync/Services/DalamudUtilService.cs @@ -1,4 +1,4 @@ -using Dalamud.Game.ClientState.Conditions; +using Dalamud.Game.ClientState.Conditions; using Dalamud.Game.ClientState.Objects; using Dalamud.Game.ClientState.Objects.SubKinds; using Dalamud.Game.ClientState.Objects.Types; @@ -541,7 +541,6 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber curWaitTime += tick; Thread.Sleep(tick); } - Thread.Sleep(tick * 2); } @@ -557,6 +556,18 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber return result; } + public string? GetWorldNameFromPlayerAddress(nint address) + { + if (address == nint.Zero) return null; + + EnsureIsOnFramework(); + var playerCharacter = _objectTable.OfType().FirstOrDefault(p => p.Address == address); + if (playerCharacter == null) return null; + + var worldId = (ushort)playerCharacter.HomeWorld.RowId; + return WorldData.Value.TryGetValue(worldId, out var worldName) ? worldName : null; + } + private unsafe void CheckCharacterForDrawing(nint address, string characterName) { var gameObj = (GameObject*)address; diff --git a/LightlessSync/UI/CompactUI.cs b/LightlessSync/UI/CompactUI.cs index fea81d9..d56f035 100644 --- a/LightlessSync/UI/CompactUI.cs +++ b/LightlessSync/UI/CompactUI.cs @@ -1,4 +1,4 @@ -using Dalamud.Bindings.ImGui; +using Dalamud.Bindings.ImGui; using Dalamud.Interface; using Dalamud.Interface.Utility; using Dalamud.Interface.Utility.Raii; diff --git a/LightlessSync/UI/SyncshellFinderUI.cs b/LightlessSync/UI/SyncshellFinderUI.cs index 81f0b0e..4af72d5 100644 --- a/LightlessSync/UI/SyncshellFinderUI.cs +++ b/LightlessSync/UI/SyncshellFinderUI.cs @@ -1,4 +1,4 @@ -using Dalamud.Bindings.ImGui; +using Dalamud.Bindings.ImGui; using Dalamud.Interface; using Dalamud.Interface.Colors; using Dalamud.Interface.Utility; @@ -24,6 +24,7 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase private readonly UiSharedService _uiSharedService; private readonly BroadcastScannerService _broadcastScannerService; private readonly PairManager _pairManager; + private readonly DalamudUtilService _dalamudUtilService; private readonly List _nearbySyncshells = []; private List _currentSyncshells = []; @@ -41,13 +42,15 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase UiSharedService uiShared, ApiController apiController, BroadcastScannerService broadcastScannerService, - PairManager pairManager) : base(logger, mediator, "Shellfinder###LightlessSyncshellFinderUI", performanceCollectorService) + PairManager pairManager, + DalamudUtilService dalamudUtilService) : base(logger, mediator, "Shellfinder###LightlessSyncshellFinderUI", performanceCollectorService) { _broadcastService = broadcastService; _uiSharedService = uiShared; _apiController = apiController; _broadcastScannerService = broadcastScannerService; _pairManager = pairManager; + _dalamudUtilService = dalamudUtilService; IsOpen = false; SizeConstraints = new() @@ -102,8 +105,8 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase if (ImGui.BeginTable("##NearbySyncshellsTable", 3, ImGuiTableFlags.Borders | ImGuiTableFlags.RowBg)) { - ImGui.TableSetupColumn("Alias", ImGuiTableColumnFlags.WidthStretch); - ImGui.TableSetupColumn("GID", ImGuiTableColumnFlags.WidthStretch); + ImGui.TableSetupColumn("Syncshell", ImGuiTableColumnFlags.WidthStretch); + ImGui.TableSetupColumn("Broadcaster", ImGuiTableColumnFlags.WidthStretch); ImGui.TableSetupColumn("Join", ImGuiTableColumnFlags.WidthFixed, 80f * ImGuiHelpers.GlobalScale); ImGui.TableHeadersRow(); @@ -111,9 +114,26 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase { ImGui.TableNextRow(); ImGui.TableNextColumn(); - ImGui.TextUnformatted(shell.Group.Alias ?? "(No Alias)"); + + var displayName = !string.IsNullOrEmpty(shell.Group.Alias) ? shell.Group.Alias : shell.Group.GID; + ImGui.TextUnformatted(displayName); + ImGui.TableNextColumn(); - ImGui.TextUnformatted(shell.Group.GID); + var broadcasterName = "Unknown"; + var broadcast = _broadcastScannerService.GetActiveSyncshellBroadcasts() + .FirstOrDefault(b => string.Equals(b.GID, shell.Group.GID, StringComparison.Ordinal)); + + if (broadcast != null) + { + var playerInfo = _dalamudUtilService.FindPlayerByNameHash(broadcast.HashedCID); + if (!string.IsNullOrEmpty(playerInfo.Name)) + { + var worldName = _dalamudUtilService.GetWorldNameFromPlayerAddress(playerInfo.Address); + broadcasterName = !string.IsNullOrEmpty(worldName) ? $"{playerInfo.Name} ({worldName})" : playerInfo.Name; + } + } + ImGui.TextUnformatted(broadcasterName); + ImGui.TableNextColumn(); var label = $"Join##{shell.Group.GID}"; @@ -123,8 +143,6 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase if (!_currentSyncshells.Exists(g => string.Equals(g.GID, shell.GID, StringComparison.Ordinal))) { - - if (ImGui.Button(label)) { _logger.LogInformation($"Join requested for Syncshell {shell.Group.GID} ({shell.Group.Alias})"); @@ -304,4 +322,5 @@ public class SyncshellFinderUI : WindowMediatorSubscriberBase return _nearbySyncshells[_selectedNearbyIndex].Group.GID; } + } diff --git a/LightlessSync/UI/TopTabMenu.cs b/LightlessSync/UI/TopTabMenu.cs index c7f5035..339b22c 100644 --- a/LightlessSync/UI/TopTabMenu.cs +++ b/LightlessSync/UI/TopTabMenu.cs @@ -1,4 +1,4 @@ -using Dalamud.Bindings.ImGui; +using Dalamud.Bindings.ImGui; using Dalamud.Interface; using Dalamud.Interface.Utility; using Dalamud.Interface.Utility.Raii; @@ -40,7 +40,8 @@ public class TopTabMenu Individual, Syncshell, Lightfinder, - UserConfig + UserConfig, + Settings } public string Filter @@ -67,7 +68,7 @@ public class TopTabMenu { var availableWidth = ImGui.GetWindowContentRegionMax().X - ImGui.GetWindowContentRegionMin().X; var spacing = ImGui.GetStyle().ItemSpacing; - var buttonX = (availableWidth - (spacing.X * 3)) / 4f; + var buttonX = (availableWidth - (spacing.X * 4)) / 5f; var buttonY = _uiSharedService.GetIconButtonSize(FontAwesomeIcon.Pause).Y; var buttonSize = new Vector2(buttonX, buttonY); var drawList = ImGui.GetWindowDrawList(); @@ -144,6 +145,17 @@ public class TopTabMenu } UiSharedService.AttachToolTip("Your User Menu"); + ImGui.SameLine(); + using (ImRaii.PushFont(UiBuilder.IconFont)) + { + if (ImGui.Button(FontAwesomeIcon.Cog.ToIconString(), buttonSize)) + { + _lightlessMediator.Publish(new UiToggleMessage(typeof(SettingsUi))); + } + + } + UiSharedService.AttachToolTip("Open Lightless Settings"); + ImGui.NewLine(); btncolor.Dispose();