diff --git a/BetterPartyFinder/BetterPartyFinder.csproj b/BetterPartyFinder/BetterPartyFinder.csproj index 33d954a..60b8f8e 100755 --- a/BetterPartyFinder/BetterPartyFinder.csproj +++ b/BetterPartyFinder/BetterPartyFinder.csproj @@ -1,10 +1,13 @@ - net48 + net5-windows 1.2.0 latest enable + false + true + true @@ -12,6 +15,10 @@ $(AppData)\XIVLauncher\addon\Hooks\dev\Dalamud.dll False + + $(AppData)\XIVLauncher\addon\Hooks\dev\FFXIVClientStructs.dll + False + $(AppData)\XIVLauncher\addon\Hooks\dev\ImGui.NET.dll False @@ -28,17 +35,15 @@ $(AppData)\XIVLauncher\addon\Hooks\dev\Lumina.Excel.dll False - - $(AppData)\XIVLauncher\addon\Hooks\dev\System.Memory.dll - False - - - - - + + + + + + diff --git a/BetterPartyFinder/BetterPartyFinder.yaml b/BetterPartyFinder/BetterPartyFinder.yaml index 8418f93..55b5519 100755 --- a/BetterPartyFinder/BetterPartyFinder.yaml +++ b/BetterPartyFinder/BetterPartyFinder.yaml @@ -1,5 +1,6 @@ author: ascclemens name: Better Party Finder +punchline: Use advanced Party Finder filter presets. description: |- Filter the party finder better. diff --git a/BetterPartyFinder/Commands.cs b/BetterPartyFinder/Commands.cs index e162ba4..4e854a4 100755 --- a/BetterPartyFinder/Commands.cs +++ b/BetterPartyFinder/Commands.cs @@ -14,16 +14,16 @@ namespace BetterPartyFinder { internal Commands(Plugin plugin) { this.Plugin = plugin; - foreach (var name in CommandNames) { - this.Plugin.Interface.CommandManager.AddHandler(name.Key, new CommandInfo(this.OnCommand) { - HelpMessage = name.Value, + foreach (var (name, help) in CommandNames) { + this.Plugin.CommandManager.AddHandler(name, new CommandInfo(this.OnCommand) { + HelpMessage = help, }); } } public void Dispose() { foreach (var name in CommandNames.Keys) { - this.Plugin.Interface.CommandManager.RemoveHandler(name); + this.Plugin.CommandManager.RemoveHandler(name); } } diff --git a/BetterPartyFinder/Configuration.cs b/BetterPartyFinder/Configuration.cs index 969c4e8..aa2db2e 100755 --- a/BetterPartyFinder/Configuration.cs +++ b/BetterPartyFinder/Configuration.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using Dalamud.Configuration; -using Dalamud.Game.Internal.Gui.Structs; +using Dalamud.Game.Gui.PartyFinder.Types; namespace BetterPartyFinder { public class Configuration : IPluginConfiguration { @@ -120,7 +120,7 @@ namespace BetterPartyFinder { Conditions = this.Conditions, Duties = duties, Jobs = jobs, - Name = string.Copy(this.Name), + Name = new string(this.Name), Objectives = this.Objectives, DutiesMode = this.DutiesMode, LootRule = this.LootRule, diff --git a/BetterPartyFinder/Filter.cs b/BetterPartyFinder/Filter.cs index 610e341..3c09e40 100755 --- a/BetterPartyFinder/Filter.cs +++ b/BetterPartyFinder/Filter.cs @@ -1,8 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; -using Dalamud.Game.Internal.Gui; -using Dalamud.Game.Internal.Gui.Structs; +using Dalamud.Game.Gui.PartyFinder.Types; namespace BetterPartyFinder { public class Filter : IDisposable { @@ -11,11 +10,11 @@ namespace BetterPartyFinder { internal Filter(Plugin plugin) { this.Plugin = plugin; - this.Plugin.Interface.Framework.Gui.PartyFinder.ReceiveListing += this.ReceiveListing; + this.Plugin.PartyFinderGui.ReceiveListing += this.ReceiveListing; } public void Dispose() { - this.Plugin.Interface.Framework.Gui.PartyFinder.ReceiveListing -= this.ReceiveListing; + this.Plugin.PartyFinderGui.ReceiveListing -= this.ReceiveListing; } private void ReceiveListing(PartyFinderListing listing, PartyFinderListingEventArgs args) { @@ -77,7 +76,7 @@ namespace BetterPartyFinder { } // filter based on category (slow) - if (!filter.Categories.Any(category => category.ListingMatches(this.Plugin.Interface.Data, listing))) { + if (!filter.Categories.Any(category => category.ListingMatches(this.Plugin.DataManager, listing))) { return false; } @@ -109,7 +108,7 @@ namespace BetterPartyFinder { continue; } - var job = possibleJob.ClassJob(this.Plugin.Interface.Data); + var job = possibleJob.ClassJob(this.Plugin.DataManager); if (present.Contains((byte) job.RowId)) { continue; } diff --git a/BetterPartyFinder/FodyWeavers.xml b/BetterPartyFinder/FodyWeavers.xml deleted file mode 100755 index 2dfb1f4..0000000 --- a/BetterPartyFinder/FodyWeavers.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/BetterPartyFinder/JoinHandler.cs b/BetterPartyFinder/JoinHandler.cs index f2135a8..58ad9d9 100755 --- a/BetterPartyFinder/JoinHandler.cs +++ b/BetterPartyFinder/JoinHandler.cs @@ -1,5 +1,5 @@ using System; -using Dalamud.Game.Internal.Gui.Structs; +using Dalamud.Game.Gui.PartyFinder.Types; using Dalamud.Game.Text; using Dalamud.Game.Text.SeStringHandling; @@ -25,10 +25,10 @@ namespace BetterPartyFinder { SeString msg = "Party description: "; msg.Payloads.AddRange(listing.Description.Payloads); - this.Plugin.Interface.Framework.Gui.Chat.PrintChat(new XivChatEntry { + this.Plugin.ChatGui.PrintChat(new XivChatEntry { Name = "Better Party Finder", Type = XivChatType.SystemMessage, - MessageBytes = msg.Encode(), + Message = msg, }); } } diff --git a/BetterPartyFinder/Plugin.cs b/BetterPartyFinder/Plugin.cs index 9911025..4d83326 100755 --- a/BetterPartyFinder/Plugin.cs +++ b/BetterPartyFinder/Plugin.cs @@ -1,4 +1,11 @@ -using Dalamud.Plugin; +using Dalamud.Data; +using Dalamud.Game.ClientState; +using Dalamud.Game.Command; +using Dalamud.Game.Gui; +using Dalamud.Game.Gui.PartyFinder; +using Dalamud.Game.Text.SeStringHandling; +using Dalamud.IoC; +using Dalamud.Plugin; using XivCommon; namespace BetterPartyFinder { @@ -6,28 +13,49 @@ namespace BetterPartyFinder { public class Plugin : IDalamudPlugin { public string Name => "Better Party Finder"; - internal DalamudPluginInterface Interface { get; private set; } = null!; - internal Configuration Config { get; private set; } = null!; - private Filter Filter { get; set; } = null!; - internal PluginUi Ui { get; private set; } = null!; - private Commands Commands { get; set; } = null!; - internal XivCommonBase Common { get; private set; } = null!; - private JoinHandler JoinHandler { get; set; } = null!; + [PluginService] + internal DalamudPluginInterface Interface { get; init; } = null!; - public void Initialize(DalamudPluginInterface pluginInterface) { - this.Interface = pluginInterface; + [PluginService] + internal ChatGui ChatGui { get; init; } = null!; + [PluginService] + internal ClientState ClientState { get; init; } = null!; + + [PluginService] + internal CommandManager CommandManager { get; init; } = null!; + + [PluginService] + internal DataManager DataManager { get; init; } = null!; + + [PluginService] + internal GameGui GameGui { get; init; } = null!; + + [PluginService] + internal PartyFinderGui PartyFinderGui { get; init; } = null!; + + [PluginService] + internal SeStringManager SeStringManager { get; init; } = null!; + + internal Configuration Config { get; } + private Filter Filter { get; } + internal PluginUi Ui { get; } + private Commands Commands { get; } + internal XivCommonBase Common { get; } + private JoinHandler JoinHandler { get; } + + public Plugin() { this.Config = Configuration.Load(this) ?? new Configuration(); this.Config.Initialise(this); - this.Common = new XivCommonBase(this.Interface, Hooks.PartyFinder); + this.Common = new XivCommonBase(Hooks.PartyFinder); this.Filter = new Filter(this); this.JoinHandler = new JoinHandler(this); this.Ui = new PluginUi(this); this.Commands = new Commands(this); // start task to determine maximum item level (based on max chestpiece) - Util.CalculateMaxItemLevel(this.Interface.Data); + Util.CalculateMaxItemLevel(this.DataManager); } public void Dispose() { diff --git a/BetterPartyFinder/PluginUi.cs b/BetterPartyFinder/PluginUi.cs index 8e1910c..63e1f9e 100755 --- a/BetterPartyFinder/PluginUi.cs +++ b/BetterPartyFinder/PluginUi.cs @@ -3,12 +3,12 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; using Dalamud.Data; -using Dalamud.Game.Internal.Gui.Structs; +using Dalamud.Game.Gui.PartyFinder.Types; using Dalamud.Interface; +using FFXIVClientStructs.FFXIV.Component.GUI; using ImGuiNET; using Lumina.Excel.GeneratedSheets; using Addon = Lumina.Excel.GeneratedSheets.Addon; -using GameAddon = Dalamud.Game.Internal.Gui.Addon.Addon; namespace BetterPartyFinder { public class PluginUi : IDisposable { @@ -47,16 +47,16 @@ namespace BetterPartyFinder { internal PluginUi(Plugin plugin) { this.Plugin = plugin; - this.Plugin.Interface.UiBuilder.OnBuildUi += this.Draw; - this.Plugin.Interface.UiBuilder.OnOpenConfigUi += this.OnOpenConfig; + this.Plugin.Interface.UiBuilder.Draw += this.Draw; + this.Plugin.Interface.UiBuilder.OpenConfigUi += this.OnOpenConfig; } public void Dispose() { - this.Plugin.Interface.UiBuilder.OnBuildUi -= this.Draw; - this.Plugin.Interface.UiBuilder.OnOpenConfigUi -= this.OnOpenConfig; + this.Plugin.Interface.UiBuilder.Draw -= this.Draw; + this.Plugin.Interface.UiBuilder.OpenConfigUi -= this.OnOpenConfig; } - private void OnOpenConfig(object sender, EventArgs e) { + private void OnOpenConfig() { this.Visible = !this.Visible; } @@ -75,8 +75,8 @@ namespace BetterPartyFinder { return result; } - private GameAddon? PartyFinderAddon() { - return this.Plugin.Interface.Framework.Gui.GetAddonByName("LookingForGroup", 1); + private IntPtr PartyFinderAddon() { + return this.Plugin.GameGui.GetAddonByName("LookingForGroup", 1); } private void Draw() { @@ -125,27 +125,30 @@ namespace BetterPartyFinder { ImGui.End(); } - private void DrawFiltersWindow() { + private unsafe void DrawFiltersWindow() { ImGui.SetNextWindowSize(new Vector2(550f, 510f), ImGuiCond.FirstUseEver); - var addon = this.Plugin.Config.ShowWhenPfOpen ? this.PartyFinderAddon() : null; + AtkUnitBase* addon = null; + var addonPtr = this.PartyFinderAddon(); + if (this.Plugin.Config.ShowWhenPfOpen && addonPtr != IntPtr.Zero) { + addon = (AtkUnitBase*) addonPtr; + } - var showWindow = this.Visible || addon?.Visible == true; + var showWindow = this.Visible || addon != null && addon->IsVisible; if (!showWindow) { return; } if (!ImGui.Begin(this.Plugin.Name, ref this._visible, ImGuiWindowFlags.NoDocking)) { - if (ImGui.IsWindowCollapsed() && addon is {Visible: true}) { + if (ImGui.IsWindowCollapsed() && addon != null && addon->IsVisible) { // wait until addon is initialised to show - try { - _ = addon.Width; - } catch (NullReferenceException) { + var rootNode = addon->RootNode; + if (rootNode == null) { return; } - ImGui.SetWindowPos(ImGuiHelpers.MainViewport.Pos + new Vector2(addon.X, addon.Y - ImGui.GetFrameHeight())); + ImGui.SetWindowPos(ImGuiHelpers.MainViewport.Pos + new Vector2(addon->X, addon->Y - ImGui.GetFrameHeight())); } ImGui.End(); @@ -153,10 +156,9 @@ namespace BetterPartyFinder { } if (addon != null && this.Plugin.Config.WindowSide == WindowSide.Right) { - try { - ImGui.SetWindowPos(ImGuiHelpers.MainViewport.Pos + new Vector2(addon.X + addon.Width, addon.Y)); - } catch (NullReferenceException) { - // ignore + var rootNode = addon->RootNode; + if (rootNode != null) { + ImGui.SetWindowPos(ImGuiHelpers.MainViewport.Pos + new Vector2(addon->X + rootNode->Width, addon->Y)); } } @@ -272,13 +274,10 @@ namespace BetterPartyFinder { } if (addon != null && this.Plugin.Config.WindowSide == WindowSide.Left) { - try { - _ = addon.Width; - // only continue if width is set, meaning addon is initialised + var rootNode = addon->RootNode; + if (rootNode != null) { var currentWidth = ImGui.GetWindowWidth(); - ImGui.SetWindowPos(ImGuiHelpers.MainViewport.Pos + new Vector2(addon.X - currentWidth, addon.Y)); - } catch (NullReferenceException) { - // ignore + ImGui.SetWindowPos(ImGuiHelpers.MainViewport.Pos + new Vector2(addon->X - currentWidth, addon->Y)); } } @@ -312,7 +311,7 @@ namespace BetterPartyFinder { foreach (var category in (UiCategory[]) Enum.GetValues(typeof(UiCategory))) { var selected = filter.Categories.Contains(category); - if (!ImGui.Selectable(category.Name(this.Plugin.Interface.Data), ref selected)) { + if (!ImGui.Selectable(category.Name(this.Plugin.DataManager), ref selected)) { continue; } @@ -361,23 +360,23 @@ namespace BetterPartyFinder { } if (ImGui.BeginChild("duty-selection", new Vector2(-1f, -1f))) { - var duties = this.Plugin.Interface.Data.GetExcelSheet() + var duties = this.Plugin.DataManager.GetExcelSheet()! .Where(cf => cf.Unknown29) .Where(cf => AllowedContentTypes.Contains(cf.ContentType.Row)); var searchQuery = this.DutySearchQuery.Trim(); if (searchQuery.Trim() != "") { duties = duties.Where(duty => { - var sestring = this.Plugin.Interface.SeStringManager.Parse(duty.Name.RawData.ToArray()); + var sestring = this.Plugin.SeStringManager.Parse(duty.Name.RawData.ToArray()); return sestring.TextValue.ContainsIgnoreCase(searchQuery); }); } foreach (var cf in duties) { - var sestring = this.Plugin.Interface.SeStringManager.Parse(cf.Name.RawData.ToArray()); + var sestring = this.Plugin.SeStringManager.Parse(cf.Name.RawData.ToArray()); var selected = filter.Duties.Contains(cf.RowId); var name = sestring.TextValue; - name = char.ToUpperInvariant(name[0]) + name.Substring(1); + name = char.ToUpperInvariant(name[0]) + name[1..]; if (!ImGui.Selectable(name, ref selected)) { continue; } @@ -472,7 +471,7 @@ namespace BetterPartyFinder { foreach (var job in (JobFlags[]) Enum.GetValues(typeof(JobFlags))) { var selected = (slot & job) > 0; - if (!ImGui.Selectable(job.ClassJob(this.Plugin.Interface.Data)?.Name ?? "???", ref selected)) { + if (!ImGui.Selectable(job.ClassJob(this.Plugin.DataManager)?.Name ?? "???", ref selected)) { continue; } @@ -603,7 +602,7 @@ namespace BetterPartyFinder { private string _playerName = string.Empty; private void DrawPlayersTab(ConfigurationFilter filter) { - var player = this.Plugin.Interface.ClientState.LocalPlayer; + var player = this.Plugin.ClientState.LocalPlayer; if (player == null || !ImGui.BeginTabItem("Players")) { return; @@ -615,7 +614,7 @@ namespace BetterPartyFinder { ImGui.SameLine(); - var worlds = Util.WorldsOnDataCentre(this.Plugin.Interface.Data, player) + var worlds = Util.WorldsOnDataCentre(this.Plugin.DataManager, player) .OrderBy(world => world.Name.RawString) .ToList(); @@ -642,7 +641,7 @@ namespace BetterPartyFinder { PlayerInfo? deleting = null; foreach (var info in filter.Players) { - var world = this.Plugin.Interface.Data.GetExcelSheet().GetRow(info.World); + var world = this.Plugin.DataManager.GetExcelSheet()!.GetRow(info.World); ImGui.TextUnformatted($"{info.Name}@{world?.Name}"); ImGui.SameLine(); if (IconButton(FontAwesomeIcon.Trash, $"delete-player-{info.GetHashCode()}")) { @@ -679,54 +678,54 @@ namespace BetterPartyFinder { internal static class UiCategoryExt { internal static string? Name(this UiCategory category, DataManager data) { - var ct = data.GetExcelSheet(); - var addon = data.GetExcelSheet(); + var ct = data.GetExcelSheet()!; + var addon = data.GetExcelSheet()!; return category switch { - UiCategory.None => addon.GetRow(1_562).Text.ToString(), // best guess - UiCategory.DutyRoulette => ct.GetRow((uint) ContentType2.DutyRoulette).Name.ToString(), - UiCategory.Dungeons => ct.GetRow((uint) ContentType2.Dungeons).Name.ToString(), - UiCategory.Guildhests => ct.GetRow((uint) ContentType2.Guildhests).Name.ToString(), - UiCategory.Trials => ct.GetRow((uint) ContentType2.Trials).Name.ToString(), - UiCategory.Raids => ct.GetRow((uint) ContentType2.Raids).Name.ToString(), - UiCategory.HighEndDuty => addon.GetRow(10_822).Text.ToString(), // best guess - UiCategory.Pvp => ct.GetRow((uint) ContentType2.Pvp).Name.ToString(), - UiCategory.QuestBattles => ct.GetRow((uint) ContentType2.QuestBattles).Name.ToString(), - UiCategory.Fates => ct.GetRow((uint) ContentType2.Fates).Name.ToString(), - UiCategory.TreasureHunt => ct.GetRow((uint) ContentType2.TreasureHunt).Name.ToString(), - UiCategory.TheHunt => addon.GetRow(8_613).Text.ToString(), - UiCategory.GatheringForays => addon.GetRow(2_306).Text.ToString(), - UiCategory.DeepDungeons => ct.GetRow((uint) ContentType2.DeepDungeons).Name.ToString(), - UiCategory.AdventuringForays => addon.GetRow(2_307).Text.ToString(), + UiCategory.None => addon.GetRow(1_562)?.Text.ToString(), // best guess + UiCategory.DutyRoulette => ct.GetRow((uint) ContentType2.DutyRoulette)?.Name.ToString(), + UiCategory.Dungeons => ct.GetRow((uint) ContentType2.Dungeons)?.Name.ToString(), + UiCategory.Guildhests => ct.GetRow((uint) ContentType2.Guildhests)?.Name.ToString(), + UiCategory.Trials => ct.GetRow((uint) ContentType2.Trials)?.Name.ToString(), + UiCategory.Raids => ct.GetRow((uint) ContentType2.Raids)?.Name.ToString(), + UiCategory.HighEndDuty => addon.GetRow(10_822)?.Text.ToString(), // best guess + UiCategory.Pvp => ct.GetRow((uint) ContentType2.Pvp)?.Name.ToString(), + UiCategory.QuestBattles => ct.GetRow((uint) ContentType2.QuestBattles)?.Name.ToString(), + UiCategory.Fates => ct.GetRow((uint) ContentType2.Fates)?.Name.ToString(), + UiCategory.TreasureHunt => ct.GetRow((uint) ContentType2.TreasureHunt)?.Name.ToString(), + UiCategory.TheHunt => addon.GetRow(8_613)?.Text.ToString(), + UiCategory.GatheringForays => addon.GetRow(2_306)?.Text.ToString(), + UiCategory.DeepDungeons => ct.GetRow((uint) ContentType2.DeepDungeons)?.Name.ToString(), + UiCategory.AdventuringForays => addon.GetRow(2_307)?.Text.ToString(), _ => null, }; } internal static bool ListingMatches(this UiCategory category, DataManager data, PartyFinderListing listing) { - var cr = data.GetExcelSheet(); + var cr = data.GetExcelSheet()!; - var isDuty = listing.Category == Category.Duty; + var isDuty = listing.Category == DutyCategory.Duty; var isNormal = listing.DutyType == DutyType.Normal; var isOther = listing.DutyType == DutyType.Other; var isNormalDuty = isNormal && isDuty; return category switch { UiCategory.None => isOther && isDuty && listing.RawDuty == 0, - UiCategory.DutyRoulette => listing.DutyType == DutyType.Roulette && isDuty && !cr.GetRow(listing.RawDuty).Unknown10, + UiCategory.DutyRoulette => listing.DutyType == DutyType.Roulette && isDuty && (!cr.GetRow(listing.RawDuty)?.Unknown10 ?? false), UiCategory.Dungeons => isNormalDuty && listing.Duty.Value.ContentType.Row == (uint) ContentType2.Dungeons, UiCategory.Guildhests => isNormalDuty && listing.Duty.Value.ContentType.Row == (uint) ContentType2.Guildhests, UiCategory.Trials => isNormalDuty && !listing.Duty.Value.HighEndDuty && listing.Duty.Value.ContentType.Row == (uint) ContentType2.Trials, UiCategory.Raids => isNormalDuty && !listing.Duty.Value.HighEndDuty && listing.Duty.Value.ContentType.Row == (uint) ContentType2.Raids, UiCategory.HighEndDuty => isNormalDuty && listing.Duty.Value.HighEndDuty, - UiCategory.Pvp => listing.DutyType == DutyType.Roulette && isDuty && cr.GetRow(listing.RawDuty).Unknown10 + UiCategory.Pvp => listing.DutyType == DutyType.Roulette && isDuty && (cr.GetRow(listing.RawDuty)?.Unknown10 ?? false) || isNormalDuty && listing.Duty.Value.ContentType.Row == (uint) ContentType2.Pvp, - UiCategory.QuestBattles => isOther && listing.Category == Category.QuestBattles, - UiCategory.Fates => isOther && listing.Category == Category.Fates, - UiCategory.TreasureHunt => isOther && listing.Category == Category.TreasureHunt, - UiCategory.TheHunt => isOther && listing.Category == Category.TheHunt, - UiCategory.GatheringForays => isNormal && listing.Category == Category.GatheringForays, - UiCategory.DeepDungeons => isOther && listing.Category == Category.DeepDungeons, - UiCategory.AdventuringForays => isNormal && listing.Category == Category.AdventuringForays, + UiCategory.QuestBattles => isOther && listing.Category == DutyCategory.QuestBattles, + UiCategory.Fates => isOther && listing.Category == DutyCategory.Fates, + UiCategory.TreasureHunt => isOther && listing.Category == DutyCategory.TreasureHunt, + UiCategory.TheHunt => isOther && listing.Category == DutyCategory.TheHunt, + UiCategory.GatheringForays => isNormal && listing.Category == DutyCategory.GatheringForays, + UiCategory.DeepDungeons => isOther && listing.Category == DutyCategory.DeepDungeons, + UiCategory.AdventuringForays => isNormal && listing.Category == DutyCategory.AdventuringForays, _ => false, }; } diff --git a/BetterPartyFinder/Util.cs b/BetterPartyFinder/Util.cs index 71948de..031c30e 100755 --- a/BetterPartyFinder/Util.cs +++ b/BetterPartyFinder/Util.cs @@ -2,7 +2,7 @@ using System.Globalization; using System.Linq; using Dalamud.Data; -using Dalamud.Game.ClientState.Actors.Types; +using Dalamud.Game.ClientState.Objects.SubKinds; using Lumina.Excel.GeneratedSheets; namespace BetterPartyFinder { @@ -14,8 +14,8 @@ namespace BetterPartyFinder { return; } - var max = data.GetExcelSheet() - .Where(item => item.EquipSlotCategory.Value.Body != 0) + var max = data.GetExcelSheet()! + .Where(item => item.EquipSlotCategory.Value!.Body != 0) .Select(item => item.LevelItem.Value?.RowId) .Where(level => level != null) .Cast() @@ -30,7 +30,7 @@ namespace BetterPartyFinder { internal static IEnumerable WorldsOnDataCentre(DataManager data, PlayerCharacter character) { var dcRow = character.HomeWorld.GameData.DataCenter.Row; - return data.GetExcelSheet() + return data.GetExcelSheet()! .Where(world => world.IsPublic && world.DataCenter.Row == dcRow); } } diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..afe44a5 Binary files /dev/null and b/icon.png differ diff --git a/icon.svg b/icon.svg new file mode 100755 index 0000000..30a859a --- /dev/null +++ b/icon.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + Better + Party + Finder + + +