From ab1b604aece29ca269f50bb39ec4cd5648f2d9b7 Mon Sep 17 00:00:00 2001 From: Macocian Alexandru Victor Date: Sun, 29 Jun 2025 16:44:06 +0200 Subject: [PATCH] Code cleanup (#1026) * Resolve warnings and move shared props to Directory.Build.props and Directory.Packages.props * Cleanup more messages * Fix more messages * Fix build issues --- .../Daybreak.7ZipExtractor.csproj | 4 +- Daybreak.7ZipExtractor/Program.cs | 5 + .../WebApplicationBuilderExtensions.cs | 14 +- Daybreak.API/Daybreak.API.csproj | 44 +- Daybreak.API/EntryPoint.cs | 16 +- Daybreak.API/Interop/GuildWars/Agent.cs | 1 - .../Interop/GuildWars/GuildWarsArray.cs | 2 +- .../Serialization/ApiJsonSerializerContext.cs | 2 - .../Services/Interop/MemoryScanningService.cs | 28 +- .../Services/Interop/UIContextService.cs | 1 - Daybreak.API/Services/MainPlayerService.cs | 1 - Daybreak.API/Services/PartyService.cs | 1 - Daybreak.API/Services/UIService.cs | 1 - Daybreak.Installer/Daybreak.Installer.csproj | 1 - .../Converters/AttributeJsonConverter.cs | 1 - .../Converters/BooleanToEffectConverter.cs | 3 +- .../BooleanToGridLengthConverter.cs | 5 +- .../BooleanToVisibilityConverter.cs | 7 +- .../Converters/CampaignJsonConverter.cs | 1 - .../Converters/ContinentJsonConverter.cs | 1 - .../Converters/DateTimeConverter.cs | 3 +- .../Converters/DoubleMultiplierConverter.cs | 3 +- .../EqualityToVisibilityConverter.cs | 3 +- .../EventCalendarDayToBrushConverter.cs | 2 - .../Converters/EventToBrushConverter.cs | 2 - Daybreak.Shared/Converters/HiddenWhenNull.cs | 7 +- .../Converters/IntToStringConverter.cs | 3 +- .../Converters/InverseBooleanConverter.cs | 3 +- .../Converters/ItemBaseJsonConverter.cs | 3 +- .../Converters/ItemBaseToIntConverter.cs | 1 - .../Converters/ItemBaseToStringConverter.cs | 1 - .../Converters/MapJsonConverter.cs | 1 - .../MenuButtonHighlightConverter.cs | 3 +- .../Converters/NpcJsonConverter.cs | 2 - .../Converters/NullToUnsetValueConverter.cs | 3 +- .../Converters/PriceToStringConverter.cs | 3 +- .../Converters/ProfessionJsonConverter.cs | 1 - .../Converters/QuestJsonConverter.cs | 1 - .../Converters/RegionJsonConverter.cs | 1 - .../Converters/SkillJsonConverter.cs | 1 - .../TileButtonHighlightConverter.cs | 3 +- .../Converters/TimeSinceDateTimeConverter.cs | 9 +- .../Converters/TimespanToETAConverter.cs | 3 +- .../Converters/TitleJsonConverter.cs | 1 - .../Converters/TradeAlertConverter.cs | 18 +- .../TraderQuoteTypeToStringConverter.cs | 1 - Daybreak.Shared/Daybreak.Shared.csproj | 30 +- .../CredentialsNotFoundException.cs | 4 +- .../Exceptions/ExecutableNotFoundException.cs | 4 +- Daybreak.Shared/Exceptions/FatalException.cs | 4 +- Daybreak.Shared/Global.cs | 3 +- Daybreak.Shared/Models/Api/BuildEntry.cs | 4 +- .../Models/Api/CharacterSelectInformation.cs | 4 +- Daybreak.Shared/Models/Api/PartyLoadout.cs | 4 +- .../Models/Api/QuestLogInformation.cs | 4 +- .../Models/BatchedObservableCollection.cs | 3 +- .../Models/Browser/BrowserHistory.cs | 4 +- .../Models/Builds/AttributeEntry.cs | 11 +- Daybreak.Shared/Models/Builds/IBuildEntry.cs | 5 +- .../Models/Builds/SingleBuildEntry.cs | 7 +- .../Models/Builds/TeamBuildEntry.cs | 3 - Daybreak.Shared/Models/ColorPalette.cs | 3 +- Daybreak.Shared/Models/DaybreakApiContext.cs | 4 +- .../Models/DnsRegistrationToken.cs | 1 - Daybreak.Shared/Models/ElevationRequest.cs | 4 +- Daybreak.Shared/Models/ExecutablePath.cs | 8 +- .../FocusView/CharacterComponentContext.cs | 4 +- .../CharacterSelectComponentEntry.cs | 4 +- .../FocusView/QuestLogComponentContext.cs | 1 - .../Models/GuildWarsUpdateRequest.cs | 1 - Daybreak.Shared/Models/Guildwars/Attribute.cs | 3 - Daybreak.Shared/Models/Guildwars/Build.cs | 3 +- .../Models/Guildwars/BuildEntryBase.cs | 2 - .../Models/Guildwars/BuildMetadata.cs | 4 +- Daybreak.Shared/Models/Guildwars/Campaign.cs | 45 +- Daybreak.Shared/Models/Guildwars/Continent.cs | 45 +- Daybreak.Shared/Models/Guildwars/Event.cs | 5 +- Daybreak.Shared/Models/Guildwars/Hero.cs | 6 +- .../Models/Guildwars/Inscription.cs | 4 +- Daybreak.Shared/Models/Guildwars/ItemBase.cs | 3 - Daybreak.Shared/Models/Guildwars/Map.cs | 9 +- Daybreak.Shared/Models/Guildwars/Material.cs | 22 +- Daybreak.Shared/Models/Guildwars/Npc.cs | 2991 ++++++++--------- .../Models/Guildwars/Profession.cs | 9 +- Daybreak.Shared/Models/Guildwars/Quest.cs | 9 +- Daybreak.Shared/Models/Guildwars/Region.cs | 165 +- Daybreak.Shared/Models/Guildwars/Rune.cs | 4 +- Daybreak.Shared/Models/Guildwars/Skill.cs | 7 +- Daybreak.Shared/Models/Guildwars/Title.cs | 9 +- Daybreak.Shared/Models/Guildwars/VialOfDye.cs | 4 +- Daybreak.Shared/Models/Interop/AreaContext.cs | 58 - .../Models/Interop/AreaInfoContext.cs | 47 - .../Models/Interop/AttributeContext.cs | 14 - Daybreak.Shared/Models/Interop/BagInfo.cs | 25 - .../Models/Interop/EntityAllegiance.cs | 11 - .../Models/Interop/EntityContext.cs | 67 - Daybreak.Shared/Models/Interop/EntityState.cs | 10 - Daybreak.Shared/Models/Interop/EntityType.cs | 8 - Daybreak.Shared/Models/Interop/GameContext.cs | 105 - .../Models/Interop/GamePosition.cs | 8 - .../Models/Interop/GenericGuildwarsArray.cs | 12 - .../Models/Interop/GlobalContext.cs | 25 - .../Models/Interop/GuildwarsArray.cs | 42 - .../Models/Interop/GuildwarsPointer.cs | 16 - .../Models/Interop/GuildwarsPointerArray.cs | 15 - .../Models/Interop/HenchmanPartyMember.cs | 14 - .../Models/Interop/HeroPartyMember.cs | 11 - .../Models/Interop/IPAddressContext.cs | 12 - .../Models/Interop/InstanceContext.cs | 11 - .../Models/Interop/InstanceInfoContext.cs | 9 - .../Models/Interop/InstanceType.cs | 8 - .../Models/Interop/InventoryContext.cs | 35 - Daybreak.Shared/Models/Interop/ItemContext.cs | 16 - Daybreak.Shared/Models/Interop/ItemInfo.cs | 46 - .../Models/Interop/ItemModifier.cs | 9 - .../Models/Interop/LoginCharacterContext.cs | 15 - Daybreak.Shared/Models/Interop/MapContext.cs | 17 - .../Models/Interop/MapEntityContext.cs | 53 - .../Models/Interop/MapIconContext.cs | 20 - Daybreak.Shared/Models/Interop/NpcContext.cs | 31 - .../Models/Interop/PartyAttributesContext.cs | 11 - .../Models/Interop/PartyContext.cs | 16 - .../Models/Interop/PartyInfoContext.cs | 25 - Daybreak.Shared/Models/Interop/PathingMap.cs | 20 - .../Models/Interop/PathingMapContext.cs | 10 - .../Models/Interop/PathingTrapezoid.cs | 29 - .../Models/Interop/PlayerContext.cs | 40 - .../Interop/PlayerControlledCharContext.cs | 8 - .../Models/Interop/PlayerPartyMember.cs | 11 - .../Models/Interop/PreGameContext.cs | 22 - .../Models/Interop/ProfessionsContext.cs | 23 - Daybreak.Shared/Models/Interop/PvpTeam.cs | 9 - .../Models/Interop/QuestContext.cs | 24 - Daybreak.Shared/Models/Interop/RegionType.cs | 27 - .../Models/Interop/SkillContext.cs | 17 - .../Models/Interop/SkillbarContext.cs | 31 - Daybreak.Shared/Models/Interop/TeamColor.cs | 12 - .../Models/Interop/TitleContext.cs | 28 - Daybreak.Shared/Models/Interop/TitleIds.cs | 54 - Daybreak.Shared/Models/Interop/TitleInfo.cs | 7 - .../Models/Interop/TitleTierContext.cs | 12 - Daybreak.Shared/Models/Interop/UserContext.cs | 33 - .../GuildWarsApplicationLaunchContext.cs | 3 +- .../LaunchConfigurationWithCredentials.cs | 5 +- Daybreak.Shared/Models/LauncherViewContext.cs | 1 - Daybreak.Shared/Models/Log.cs | 1 - Daybreak.Shared/Models/LoginCredentials.cs | 4 +- Daybreak.Shared/Models/Menu/MenuButton.cs | 4 +- Daybreak.Shared/Models/Menu/MenuCategory.cs | 5 +- Daybreak.Shared/Models/Metrics/Metric.cs | 3 +- Daybreak.Shared/Models/Metrics/MetricSet.cs | 3 +- .../Models/Mods/GuildWarsRunningContext.cs | 4 +- .../Models/Mods/GuildWarsStartingContext.cs | 4 +- .../Models/Notifications/INotification.cs | 1 - .../Models/Notifications/Notification.cs | 1 - .../NotificationCancellationToken.cs | 3 +- .../Models/Options/OptionProperty.cs | 28 +- .../Models/Options/OptionSection.cs | 4 +- .../Models/Options/OptionSetter.cs | 4 +- .../Models/Plugins/PluginConfigurationBase.cs | 6 +- .../Models/PostUpdateActionBase.cs | 4 +- .../Models/Progress/ActionStatus.cs | 8 +- .../Models/Progress/DownloadStatus.cs | 4 +- .../Progress/GuildwarsInstallationStatus.cs | 10 +- .../Models/Progress/IconDownloadStatus.cs | 23 +- Daybreak.Shared/Models/Progress/LoadStatus.cs | 8 +- .../Models/Progress/StartupStatus.cs | 13 +- .../Models/Progress/UpdateStatus.cs | 5 +- .../Models/ReShade/ShaderPackage.cs | 4 +- Daybreak.Shared/Models/ScopeMetadata.cs | 9 +- Daybreak.Shared/Models/SecureString.cs | 16 +- .../Models/SortedObservableCollection.cs | 11 +- Daybreak.Shared/Models/StartupActionBase.cs | 5 +- .../Models/StaticOptionsMonitor.cs | 1 - Daybreak.Shared/Models/Trade/QuoteAlert.cs | 4 +- Daybreak.Shared/Models/Trade/TradeAlert.cs | 4 +- Daybreak.Shared/Models/Trade/TraderMessage.cs | 4 +- .../Models/Trade/TraderMessageViewWrapper.cs | 24 +- Daybreak.Shared/Models/Trade/TraderQuote.cs | 1 - Daybreak.Shared/Models/Versioning/Version.cs | 13 +- .../Models/Versioning/VersionToken.cs | 9 +- .../Services/Api/IDaybreakApiService.cs | 2 - .../Services/Api/ScopedApiContext.cs | 3 - .../IApplicationLauncher.cs | 3 - .../Services/Browser/IBrowserExtension.cs | 4 +- .../Browser/IBrowserExtensionsManager.cs | 1 - .../BuildTemplates/BuildTemplateManager.cs | 6 - .../BuildTemplates/IBuildTemplateManager.cs | 3 - .../BuildTemplates/Models/DecodeCharStream.cs | 4 +- .../Credentials/ICredentialManager.cs | 1 - .../Services/DSOAL/IDSOALService.cs | 1 - Daybreak.Shared/Services/DXVK/IDXVKService.cs | 2 - .../Services/DirectSong/IDirectSongService.cs | 2 - .../Services/Downloads/IDownloadService.cs | 2 - .../Services/Events/IEventService.cs | 2 - .../IGuildWarsExecutableManager.cs | 4 +- .../Guildwars/IGuildwarsCopyService.cs | 2 - .../Services/Guildwars/IGuildwarsInstaller.cs | 3 - .../Services/IconRetrieve/IIconCache.cs | 1 - .../Services/Images/IImageCache.cs | 3 +- .../Services/Injection/IProcessInjector.cs | 2 - .../IInternetCheckingService.cs | 2 - .../ILaunchConfigurationService.cs | 1 - .../Services/Logging/ILogsManager.cs | 4 +- .../Services/MDns/IMDomainRegistrar.cs | 5 +- .../Services/Menu/IMenuServiceInitializer.cs | 4 +- .../Services/Menu/IMenuServiceProducer.cs | 1 - .../Services/Metrics/IMetricsService.cs | 2 - Daybreak.Shared/Services/Mods/IModService.cs | 3 - Daybreak.Shared/Services/Mods/IModsManager.cs | 4 +- .../Services/Mutex/IMutexHandler.cs | 8 - .../Services/Navigation/IViewManager.cs | 3 +- .../Notifications/INotificationProducer.cs | 9 +- .../Notifications/INotificationService.cs | 1 - .../Services/Options/IOptionsProvider.cs | 2 - .../Options/IOptionsSynchronizationService.cs | 3 - .../Services/Options/IOptionsUpdateHook.cs | 4 +- .../Services/Plugins/IPluginsService.cs | 2 - .../Services/ReShade/IReShadeService.cs | 3 - .../Services/Screens/IScreenManager.cs | 1 - .../Screenshots/IBackgroundProvider.cs | 1 - .../Screenshots/IOnlinePictureClient.cs | 3 +- .../Screenshots/IScreenshotProvider.cs | 3 +- .../Services/SevenZip/ISevenZipExtractor.cs | 6 +- .../Services/Toolbox/IToolboxService.cs | 3 - .../TradeChat/IPriceHistoryService.cs | 4 - .../TradeChat/ITradeAlertingService.cs | 1 - .../Services/TradeChat/ITradeChatService.cs | 4 - .../Services/TradeChat/ITraderQuoteService.cs | 3 - .../TradeChat/IWordHighlightingService.cs | 1 - Daybreak.Shared/Services/UMod/IUModService.cs | 3 - .../Services/Updater/IApplicationUpdater.cs | 2 - .../PostUpdate/IPostUpdateActionProvider.cs | 1 - .../Services/Window/IWindowEventsHook.cs | 4 +- Daybreak.Shared/Utils/ColorExtensions.cs | 8 +- Daybreak.Shared/Utils/DateTimeExtensions.cs | 4 +- Daybreak.Shared/Utils/EncryptionHelper.cs | 5 +- .../Utils/MetricsHttpMessageHandler.cs | 2 - Daybreak.Shared/Utils/NativeMethods.cs | 11 +- Daybreak.Shared/Utils/PathUtils.cs | 4 +- Daybreak.Shared/Utils/StringUtils.cs | 11 +- .../Validators/ClampedValidator.cs | 13 +- Daybreak.Shared/Validators/EnumValidator.cs | 4 +- Daybreak.Tests/Daybreak.Tests.csproj | 18 +- Daybreak.Tests/Models/InscriptionTests.cs | 5 - Daybreak.Tests/Models/ItemBaseTests.cs | 3 - Daybreak.Tests/Models/ItemTestsBase.cs | 5 +- Daybreak.Tests/Models/MaterialTests.cs | 1 - Daybreak.Tests/Models/NpcTests.cs | 6 +- Daybreak.Tests/Models/QuestTests.cs | 6 +- Daybreak.Tests/Models/RuneTests.cs | 1 - Daybreak.Tests/Models/VersionTests.cs | 4 +- Daybreak.Tests/Models/VialOfDyeTests.cs | 1 - .../Services/BuildTemplateManagerTests.cs | 6 +- Daybreak.sln | 2 + .../OptionCustomValidatorAttribute.cs | 1 - Daybreak/Attributes/OptionIgnoreAttribute.cs | 4 +- Daybreak/Attributes/OptionNameAttribute.cs | 4 +- Daybreak/Attributes/OptionRangeAttribute.cs | 4 +- Daybreak/Attributes/OptionSetterView.cs | 3 +- .../OptionSynchronizationIgnoreAttribute.cs | 4 +- Daybreak/Attributes/OptionsIgnoreAttribute.cs | 4 +- Daybreak/Attributes/OptionsNameAttribute.cs | 4 +- .../OptionsSynchronizationIgnoreAttribute.cs | 4 +- Daybreak/Behaviors/RowAutoMargin.cs | 1 - Daybreak/Behaviors/ScaleFontWithSize.cs | 1 - Daybreak/Behaviors/ScrollIntoView.cs | 1 - .../Options/CredentialManagerOptions.cs | 1 - .../Options/GuildwarsExecutableOptions.cs | 1 - .../LaunchConfigurationServiceOptions.cs | 1 - .../Configuration/Options/LauncherOptions.cs | 1 - .../Options/PluginsServiceOptions.cs | 1 - .../Options/PriceHistoryOptions.cs | 2 - .../Configuration/Options/ThemeOptions.cs | 2 +- .../Options/TradeAlertingOptions.cs | 2 - .../Options/TraderQuotesOptions.cs | 1 - Daybreak/Configuration/Options/UModOptions.cs | 1 - .../Configuration/ProjectConfiguration.cs | 74 +- Daybreak/Configuration/SecretManager.cs | 2 - Daybreak/Controls/AsyncImage.xaml.cs | 2 - Daybreak/Controls/Buttons/AddButton.xaml.cs | 3 +- Daybreak/Controls/Buttons/BackButton.xaml.cs | 3 +- Daybreak/Controls/Buttons/BinButton.xaml.cs | 3 +- .../Controls/Buttons/BrowserButton.xaml.cs | 3 +- .../Controls/Buttons/CancelButton.xaml.cs | 3 +- .../Controls/Buttons/CircularButton.xaml.cs | 3 +- Daybreak/Controls/Buttons/CopyButton.xaml.cs | 3 +- .../Controls/Buttons/FilePickerButton.xaml.cs | 3 +- .../Controls/Buttons/GWToolboxButton.xaml.cs | 3 +- Daybreak/Controls/Buttons/HelpButton.xaml.cs | 3 +- .../Controls/Buttons/HighlightButton.xaml.cs | 5 +- Daybreak/Controls/Buttons/HomeButton.xaml.cs | 3 +- .../Controls/Buttons/MaximizeButton.xaml.cs | 3 +- Daybreak/Controls/Buttons/MenuButton.xaml.cs | 3 +- Daybreak/Controls/Buttons/MinusButton.xaml.cs | 3 +- .../Buttons/NavigateFileButton.xaml.cs | 3 +- .../Controls/Buttons/RefreshButton.xaml.cs | 3 +- Daybreak/Controls/Buttons/SaveButton.xaml.cs | 3 +- Daybreak/Controls/Buttons/StarButton.xaml.cs | 3 +- .../Buttons/SynchronizeButton.xaml.cs | 3 +- .../Controls/ChromiumBrowserWrapper.xaml.cs | 4 - Daybreak/Controls/DropDownButton.cs | 9 +- .../DropDownButtonContextMenu.xaml.cs | 1 - .../Controls/ExpandableMenuSection.xaml.cs | 3 +- .../BuildComponent.xaml.cs | 5 - .../CharacterComponent.xaml.cs | 3 - .../CurrentMapComponent.xaml.cs | 1 - .../QuestLogComponent.xaml.cs | 1 - .../TitleInformationComponent.xaml.cs | 1 - .../Controls/HorizontalResourceBar.xaml.cs | 2 - Daybreak/Controls/ImageViewer.xaml.cs | 3 +- Daybreak/Controls/MenuList.xaml.cs | 4 - .../Notifications/NotificationStackpanel.xaml | 2 +- .../NotificationStackpanel.xaml.cs | 4 +- .../NotificationTemplate.xaml.cs | 1 - .../Notifications/NotificationView.xaml.cs | 1 - .../Options/EnumOptionTemplate.xaml.cs | 2 - .../Controls/Options/OptionsSection.xaml.cs | 19 +- Daybreak/Controls/SearchTextBox.xaml.cs | 3 +- Daybreak/Controls/SnowfallOverlay.xaml.cs | 22 +- .../Templates/AccountTemplate.xaml.cs | 1 - .../Templates/AttributeTemplate.xaml.cs | 1 - .../Templates/BuildEntryTemplate.xaml.cs | 1 - .../Controls/Templates/BuildTemplate.xaml.cs | 13 +- .../Templates/GuildwarsPathTemplate.xaml.cs | 3 - .../Templates/LaunchButtonTemplate.xaml.cs | 3 - .../Templates/PartyMemberTemplate.xaml.cs | 1 - .../Templates/QuestLogTemplate.xaml.cs | 3 - .../Controls/Templates/ScreenTemplate.xaml.cs | 1 - .../Templates/SkillListEntryTemplate.xaml.cs | 2 - .../Controls/Templates/SkillTemplate.xaml.cs | 4 +- .../TradeChatMessageTemplate.xaml.cs | 1 - .../Templates/TradeChatTemplate.xaml.cs | 7 +- .../Templates/TradeMessageTemplate.xaml.cs | 1 - .../Templates/TradeQuoteTemplate.xaml.cs | 1 - .../Controls/Templates/TraderQuoteModel.cs | 1 - Daybreak/Daybreak.csproj | 65 +- Daybreak/Launch/ExceptionDialog.xaml.cs | 5 +- Daybreak/Launch/Launcher.cs | 2 - Daybreak/Launch/MainWindow.xaml.cs | 2 - Daybreak/Services/Api/DaybreakApiService.cs | 5 - .../ApplicationArgumentService.cs | 2 - .../AutoLaunchArgumentHandler.cs | 24 +- .../ApplicationLauncher.cs | 5 - .../Browser/BrowserExtensionsManager.cs | 13 +- .../Services/Browser/BrowserHistoryManager.cs | 15 +- .../AttributePointCalculator.cs | 2 - .../Services/Charts/LiveChartInitializer.cs | 1 - .../Services/Credentials/CredentialManager.cs | 24 +- .../FixSymbolicLinkNotificationHandler.cs | 11 +- .../Actions/FixSymbolicLinkStartupAction.cs | 32 +- Daybreak/Services/DSOAL/DSOALService.cs | 4 - Daybreak/Services/DXVK/DXVKService.cs | 4 - .../Services/DirectSong/DirectSongService.cs | 3 - .../Utils/ProgressMonitoringStream.cs | 9 +- .../Services/Downloads/DownloadService.cs | 30 +- .../Services/Events/EventNotifierService.cs | 28 +- Daybreak/Services/Events/EventService.cs | 7 +- .../ExceptionHandling/ExceptionHandler.cs | 19 +- .../ExceptionHandling/IExceptionHandler.cs | 4 +- .../GuildWarsExecutableManager.cs | 21 +- .../Experience/ExperienceCalculator.cs | 1 - Daybreak/Services/Graph/GraphClient.cs | 7 +- Daybreak/Services/Graph/IGraphClient.cs | 4 - Daybreak/Services/Graph/Models/AccessToken.cs | 4 +- Daybreak/Services/Graph/Models/FileItem.cs | 1 - Daybreak/Services/Graph/Models/FolderItem.cs | 1 - .../Graph/Models/ViewRedirectContext.cs | 4 +- ...GuildWarsBatchUpdateNotificationHandler.cs | 33 +- .../GuildWarsUpdateNotificationHandler.cs | 27 +- .../Guildwars/GuildWarsVersionChecker.cs | 30 +- .../Guildwars/GuildwarsCopyService.cs | 23 +- .../Guildwars/IntegratedGuildwarsInstaller.cs | 30 +- .../Models/GuildWarsDownloadContext.cs | 1 - .../Models/GuildwarsClientContext.cs | 3 +- .../Services/Guildwars/Utils/BitStream.cs | 3 +- .../Utils/GuildWarsExecutableParser.cs | 4 - .../Guildwars/Utils/GuildwarsClient.cs | 23 +- .../Guildwars/Utils/GuildwarsFileStream.cs | 60 +- .../Services/Guildwars/Utils/HuffmanTable.cs | 4 +- Daybreak/Services/IconRetrieve/IconCache.cs | 5 +- Daybreak/Services/Images/ImageCache.cs | 4 - .../Services/Injection/ProcessInjector.cs | 14 +- Daybreak/Services/Injection/StubInjector.cs | 1 - .../InternetChecker/ConnectivityStatus.cs | 37 +- .../InternetCheckingService.cs | 2 - .../LaunchConfigurationService.cs | 32 +- .../Services/Logging/CompositeLogsWritter.cs | 12 +- .../Services/Logging/ConsoleLogsWriter.cs | 1 - Daybreak/Services/Logging/JsonLogsManager.cs | 3 - Daybreak/Services/MDns/MDomainRegistrar.cs | 5 - Daybreak/Services/MDns/ServiceRegistration.cs | 5 +- Daybreak/Services/Menu/MenuService.cs | 2 - Daybreak/Services/Metrics/MetricsService.cs | 14 +- Daybreak/Services/Mods/ModsManager.cs | 17 +- .../Services/Monitoring/DiskUsageMonitor.cs | 16 +- .../Services/Monitoring/MemoryUsageMonitor.cs | 16 +- .../Monitoring/ProcessorUsageMonitor.cs | 20 +- Daybreak/Services/Mutex/MutexHandler.cs | 146 - Daybreak/Services/Navigation/ViewManager.cs | 2 - .../Handlers/NavigateToCalendarViewHandler.cs | 12 +- .../Notifications/Handlers/NoActionHandler.cs | 2 +- .../Notifications/INotificationStorage.cs | 3 - .../Notifications/NotificationService.cs | 34 +- .../Notifications/NotificationStorage.cs | 16 +- .../Services/Onboarding/OnboardingService.cs | 31 +- Daybreak/Services/Options/OptionsManager.cs | 3 - .../Options/OptionsSynchronizationService.cs | 31 +- Daybreak/Services/Plugins/PluginsService.cs | 5 - .../Validators/DaybreakPluginValidator.cs | 3 - .../Services/Privilege/PrivilegeManager.cs | 19 +- .../ReShadeConfigChangedHandler.cs | 12 +- Daybreak/Services/ReShade/ReShadeService.cs | 5 - .../Services/ReShade/Utils/OffsetStream.cs | 3 +- Daybreak/Services/Registry/RegistryService.cs | 3 - .../Services/Screens/GuildwarsScreenPlacer.cs | 26 +- Daybreak/Services/Screens/ScreenManager.cs | 6 +- .../Services/Screens/SplashScreenService.cs | 2 - .../Screenshots/BackgroundProvider.cs | 28 +- Daybreak/Services/Screenshots/Models/Event.cs | 1 - .../Services/Screenshots/Models/Location.cs | 1 - .../Screenshots/OnlinePictureClient.cs | 41 +- .../Screenshots/ScreenshotProvider.cs | 14 +- .../Services/SevenZip/SevenZipExtractor.cs | 15 +- .../Actions/BrowserHistorySizeEnforcer.cs | 11 +- .../Startup/Actions/CleanupDatabases.cs | 34 +- .../Actions/CredentialsOptionsMigrator.cs | 19 +- .../Actions/EnsureDatabaseTablesExist.cs | 2 - .../Startup/Actions/RenameInstallerAction.cs | 11 +- .../RestoreWindowPositionStartupAction.cs | 2 - .../Startup/Actions/UpdateToolboxAction.cs | 18 +- .../Startup/Actions/UpdateUModAction.cs | 13 +- .../Services/Startup/StartupActionManager.cs | 22 +- .../Telemetry/SwappableLoggerProvider.cs | 2 - Daybreak/Services/Telemetry/TelemetryHost.cs | 1 - Daybreak/Services/Themes/ThemeManager.cs | 2 - .../Toolbox/Models/DownloadLatestOperation.cs | 30 +- .../Notifications/ToolboxUpdateHandler.cs | 16 +- Daybreak/Services/Toolbox/ToolboxService.cs | 5 - .../Toolbox/Utilities/IToolboxClient.cs | 4 +- .../Toolbox/Utilities/ToolboxClient.cs | 28 +- .../TradeChat/IPriceHistoryDatabase.cs | 4 - .../TradeChat/ITradeHistoryDatabase.cs | 4 - .../Services/TradeChat/ItemHashService.cs | 1 - .../TradeChat/Models/TraderMessageDTO.cs | 1 - .../Models/TraderMessageQueryResponse.cs | 1 - .../TradeChat/Models/TraderQuoteDTO.cs | 3 +- .../TradeChat/Models/TraderQuotePayload.cs | 1 - .../TradeChat/Models/TraderQuotesResponse.cs | 1 - .../TradeMessageNotificationHandler.cs | 9 +- .../TradeChat/PriceHistoryDatabase.cs | 26 +- .../Services/TradeChat/PriceHistoryService.cs | 5 - .../TradeChat/TradeAlertingService.cs | 7 +- .../Services/TradeChat/TradeChatService.cs | 5 - .../TradeChat/TradeHistoryDatabase.cs | 16 +- .../Services/TradeChat/TradeQuoteDbContext.cs | 2 - .../Services/TradeChat/TraderQuoteService.cs | 7 +- .../TradeChat/WordHighlightingService.cs | 1 - .../UBlockOrigin/UBlockOriginService.cs | 91 +- Daybreak/Services/UMod/UModService.cs | 5 - .../Services/Updater/ApplicationUpdater.cs | 14 +- .../PostUpdate/PostUpdateActionManager.cs | 17 +- .../Updater/UpdateNotificationHandler.cs | 11 +- Daybreak/Services/Window/WindowEventsHook.cs | 2 - Daybreak/Views/BuildsListView.xaml.cs | 4 - .../Views/BuildsSynchronizationView.xaml.cs | 8 - .../Copy/GuildwarsCopySelectionView.xaml.cs | 2 - Daybreak/Views/Copy/GuildwarsCopyView.xaml.cs | 2 - Daybreak/Views/EventCalendarView.xaml.cs | 2 - Daybreak/Views/FocusView.xaml | 1 - Daybreak/Views/FocusView.xaml.cs | 8 +- Daybreak/Views/GraphAuthorizationView.xaml.cs | 1 - .../GuildWarsDownloadSelectionView.xaml.cs | 1 - .../GuildwarsDownloadView.xaml.cs | 5 +- Daybreak/Views/Launch/AccountsView.xaml.cs | 4 +- Daybreak/Views/Launch/ExecutablesView.xaml.cs | 2 - .../Launch/LaunchConfigurationView.xaml.cs | 2 - .../Launch/LaunchConfigurationsView.xaml.cs | 2 - Daybreak/Views/LauncherView.xaml.cs | 7 +- Daybreak/Views/LogsView.xaml.cs | 6 +- Daybreak/Views/MetricsView.xaml.cs | 4 - Daybreak/Views/NotificationsView.xaml.cs | 14 +- .../DXVK/DXVKInstallationChoiceView.xaml.cs | 3 +- .../DXVK/DXVKInstallingView.xaml.cs | 1 - .../DirectSongInstallationView.xaml.cs | 2 - .../Onboarding/LauncherOnboardingView.xaml.cs | 1 - .../ReShade/ReShadeBrowserView.xaml.cs | 5 +- .../ReShade/ReShadeConfigView.xaml.cs | 1 - .../ReShadeInstallationChoiceView.xaml.cs | 1 - .../ReShade/ReShadeInstallingView.xaml.cs | 1 - .../ReShade/ReShadeMainView.xaml.cs | 1 - .../ReShade/ReShadePresetView.xaml.cs | 1 - .../ReShadeStockEffectsSelectorView.xaml.cs | 1 - .../Toolbox/ToolboxSwitchView.xaml.cs | 1 - .../Onboarding/UMod/UModBrowserView.xaml.cs | 5 +- .../Onboarding/UMod/UModMainView.xaml.cs | 7 +- Daybreak/Views/OptionSectionView.xaml.cs | 8 +- Daybreak/Views/PluginsView.xaml.cs | 2 - Daybreak/Views/ScreenChoiceView.xaml.cs | 5 +- .../Views/SettingsSynchronizationView.xaml.cs | 10 +- .../Views/SingleBuildTemplateView.xaml.cs | 2 - Daybreak/Views/TeamBuildTemplateView.xaml.cs | 8 +- Daybreak/Views/Trade/PriceHistoryView.xaml.cs | 4 - Daybreak/Views/Trade/PriceQuotesView.xaml.cs | 5 - .../Views/Trade/QuoteAlertSetupView.xaml.cs | 5 +- .../Views/Trade/TradeAlertSetupView.xaml.cs | 1 - .../Views/Trade/TradeAlertsChoiceView.xaml.cs | 1 - Daybreak/Views/Trade/TradeAlertsView.xaml.cs | 1 - .../Views/Trade/TradeNotificationView.xaml.cs | 1 - Daybreak/Views/UpdateConfirmationView.xaml.cs | 4 +- Daybreak/Views/UpdateView.xaml.cs | 1 - Daybreak/Views/VersionManagementView.xaml.cs | 2 - Directory.Build.props | 16 + Directory.Packages.props | 78 + 514 files changed, 2569 insertions(+), 5207 deletions(-) delete mode 100644 Daybreak.Shared/Models/Interop/AreaContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/AreaInfoContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/AttributeContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/BagInfo.cs delete mode 100644 Daybreak.Shared/Models/Interop/EntityAllegiance.cs delete mode 100644 Daybreak.Shared/Models/Interop/EntityContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/EntityState.cs delete mode 100644 Daybreak.Shared/Models/Interop/EntityType.cs delete mode 100644 Daybreak.Shared/Models/Interop/GameContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/GamePosition.cs delete mode 100644 Daybreak.Shared/Models/Interop/GenericGuildwarsArray.cs delete mode 100644 Daybreak.Shared/Models/Interop/GlobalContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/GuildwarsArray.cs delete mode 100644 Daybreak.Shared/Models/Interop/GuildwarsPointer.cs delete mode 100644 Daybreak.Shared/Models/Interop/GuildwarsPointerArray.cs delete mode 100644 Daybreak.Shared/Models/Interop/HenchmanPartyMember.cs delete mode 100644 Daybreak.Shared/Models/Interop/HeroPartyMember.cs delete mode 100644 Daybreak.Shared/Models/Interop/IPAddressContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/InstanceContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/InstanceInfoContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/InstanceType.cs delete mode 100644 Daybreak.Shared/Models/Interop/InventoryContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/ItemContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/ItemInfo.cs delete mode 100644 Daybreak.Shared/Models/Interop/ItemModifier.cs delete mode 100644 Daybreak.Shared/Models/Interop/LoginCharacterContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/MapContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/MapEntityContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/MapIconContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/NpcContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/PartyAttributesContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/PartyContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/PartyInfoContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/PathingMap.cs delete mode 100644 Daybreak.Shared/Models/Interop/PathingMapContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/PathingTrapezoid.cs delete mode 100644 Daybreak.Shared/Models/Interop/PlayerContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/PlayerControlledCharContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/PlayerPartyMember.cs delete mode 100644 Daybreak.Shared/Models/Interop/PreGameContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/ProfessionsContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/PvpTeam.cs delete mode 100644 Daybreak.Shared/Models/Interop/QuestContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/RegionType.cs delete mode 100644 Daybreak.Shared/Models/Interop/SkillContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/SkillbarContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/TeamColor.cs delete mode 100644 Daybreak.Shared/Models/Interop/TitleContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/TitleIds.cs delete mode 100644 Daybreak.Shared/Models/Interop/TitleInfo.cs delete mode 100644 Daybreak.Shared/Models/Interop/TitleTierContext.cs delete mode 100644 Daybreak.Shared/Models/Interop/UserContext.cs delete mode 100644 Daybreak.Shared/Services/Mutex/IMutexHandler.cs delete mode 100644 Daybreak/Services/Mutex/MutexHandler.cs create mode 100644 Directory.Build.props create mode 100644 Directory.Packages.props diff --git a/Daybreak.7ZipExtractor/Daybreak.7ZipExtractor.csproj b/Daybreak.7ZipExtractor/Daybreak.7ZipExtractor.csproj index d8561502..acdfd8e4 100644 --- a/Daybreak.7ZipExtractor/Daybreak.7ZipExtractor.csproj +++ b/Daybreak.7ZipExtractor/Daybreak.7ZipExtractor.csproj @@ -5,13 +5,11 @@ net9.0 Daybreak._7ZipExtractor enable - enable x64 - 0.9.9.76 - + diff --git a/Daybreak.7ZipExtractor/Program.cs b/Daybreak.7ZipExtractor/Program.cs index 06b46028..0397464a 100644 --- a/Daybreak.7ZipExtractor/Program.cs +++ b/Daybreak.7ZipExtractor/Program.cs @@ -21,6 +21,11 @@ var reader = archive.ExtractAllEntries(); while (reader.MoveToNextEntry()) { var entry = reader.Entry; + if (entry.Key is null) + { + continue; + } + if (entry.IsDirectory) { var directoryName = Path.Combine(Path.GetFullPath(destinationDirectory), entry.Key); diff --git a/Daybreak.API/Configuration/WebApplicationBuilderExtensions.cs b/Daybreak.API/Configuration/WebApplicationBuilderExtensions.cs index eab55d74..39bfed73 100644 --- a/Daybreak.API/Configuration/WebApplicationBuilderExtensions.cs +++ b/Daybreak.API/Configuration/WebApplicationBuilderExtensions.cs @@ -5,18 +5,8 @@ public static class WebApplicationBuilderExtensions public static WebApplicationBuilder WithConfiguration(this WebApplicationBuilder builder) { var config = BuildInfo.Configuration; - var appSettingsStream = GetManifestResourceStream($"Daybreak.API.Configuration.appsettings.json"); - if (appSettingsStream is null) - { - throw new InvalidOperationException("Failed to load appsettings.json"); - } - - var appSettingsConfigStream = GetManifestResourceStream($"Daybreak.API.Configuration.appsettings.{config}.json"); - if (appSettingsConfigStream is null) - { - throw new InvalidOperationException($"Failed to load appsettings.{config}.json"); - } - + var appSettingsStream = GetManifestResourceStream($"Daybreak.API.Configuration.appsettings.json") ?? throw new InvalidOperationException("Failed to load appsettings.json"); + var appSettingsConfigStream = GetManifestResourceStream($"Daybreak.API.Configuration.appsettings.{config}.json") ?? throw new InvalidOperationException($"Failed to load appsettings.{config}.json"); builder.Configuration .AddJsonStream(appSettingsStream) .AddJsonStream(appSettingsConfigStream) diff --git a/Daybreak.API/Daybreak.API.csproj b/Daybreak.API/Daybreak.API.csproj index ef898219..c4845334 100644 --- a/Daybreak.API/Daybreak.API.csproj +++ b/Daybreak.API/Daybreak.API.csproj @@ -8,9 +8,7 @@ win-x86 true true - true true - 0.9.9.76 true true @@ -22,6 +20,14 @@ x86 + + + IL2104 + IL3053 + + NU1701 + + @@ -33,23 +39,23 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/Daybreak.API/EntryPoint.cs b/Daybreak.API/EntryPoint.cs index 0482ef8b..a34d33f5 100644 --- a/Daybreak.API/EntryPoint.cs +++ b/Daybreak.API/EntryPoint.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Extensions.Core; using System.Net.NetworkInformation; using System.Runtime.InteropServices; @@ -23,6 +24,8 @@ public class EntryPoint private static readonly CancellationTokenSource CancellationTokenSource = new(); [UnmanagedCallersOnly(EntryPoint = "ThreadInit"), STAThread] + [RequiresUnreferencedCode("The handler uses a static method that gets referenced, so there's no unreferenced code to worry about")] + [RequiresDynamicCode("The handler uses a static method, so there's no dynamic code to worry about")] public static int ThreadInit(IntPtr _, int __) { Environment.SetEnvironmentVariable("ASPNETCORE_HOSTINGSTARTUPASSEMBLIES", null, EnvironmentVariableTarget.Process); @@ -37,7 +40,7 @@ public class EntryPoint var healthCheck = app.Services.GetRequiredService(); var sw = Stopwatch.StartNew(); var healthy = false; - while(sw.Elapsed < InitializationTimeout) + while (sw.Elapsed < InitializationTimeout) { var status = Task.Run(() => healthCheck.CheckHealthAsync()).Result; scopedLogger.LogWarning("HealthCheck status: {status} in {duration}. Report: {report}", status.Status, status.TotalDuration, string.Join("\n", status.Entries.Select(e => $"{e.Key}: {e.Value.Status}"))); @@ -65,9 +68,11 @@ public class EntryPoint } } + [RequiresUnreferencedCode("The handler uses a static method that gets referenced, so there's no unreferenced code to worry about")] + [RequiresDynamicCode("The handler uses a static method, so there's no dynamic code to worry about")] private static WebApplication CreateApplication(int port) { - var app = WebApplication.CreateBuilder() + var builder = WebApplication.CreateBuilder() .WithConfiguration() .WithHosting(port) .WithSwagger() @@ -76,8 +81,11 @@ public class EntryPoint .WithDaybreakServices() .WithWebSocketRoutes() .WithRoutes() - .WithHealthChecks() - .Build(); + .WithHealthChecks(); + + builder.Services.AddOpenApi(); + + var app = builder.Build(); app.UseWebSockets(new WebSocketOptions { KeepAliveInterval = TimeSpan.FromSeconds(30) }); diff --git a/Daybreak.API/Interop/GuildWars/Agent.cs b/Daybreak.API/Interop/GuildWars/Agent.cs index e47368ab..3db99904 100644 --- a/Daybreak.API/Interop/GuildWars/Agent.cs +++ b/Daybreak.API/Interop/GuildWars/Agent.cs @@ -51,7 +51,6 @@ public enum LivingAgentEffects : uint Bleeding = 0x0001, Conditioned = 0x0002, Crippled1 = 0x0008, // Part of the Crippled check - Crippled2 = 0x0002, // Part of the Crippled check Crippled = 0x000A, // Combined flag for crippled (0x0008 | 0x0002) Dead = 0x0010, DeepWound = 0x0020, diff --git a/Daybreak.API/Interop/GuildWars/GuildWarsArray.cs b/Daybreak.API/Interop/GuildWars/GuildWarsArray.cs index 2079f746..2f42bf80 100644 --- a/Daybreak.API/Interop/GuildWars/GuildWarsArray.cs +++ b/Daybreak.API/Interop/GuildWars/GuildWarsArray.cs @@ -47,6 +47,6 @@ public readonly unsafe struct GuildWarsArray : IEnumerable object IEnumerator.Current => this.Current; public void Reset() => this.index = -1; - public void Dispose() { } + public readonly void Dispose() { } } } diff --git a/Daybreak.API/Serialization/ApiJsonSerializerContext.cs b/Daybreak.API/Serialization/ApiJsonSerializerContext.cs index 9f71393e..c8044f1e 100644 --- a/Daybreak.API/Serialization/ApiJsonSerializerContext.cs +++ b/Daybreak.API/Serialization/ApiJsonSerializerContext.cs @@ -11,8 +11,6 @@ namespace Daybreak.API.Serialization; [JsonSerializable(typeof(uint))] [JsonSerializable(typeof(nuint))] [JsonSerializable(typeof(bool))] -[JsonSerializable(typeof(Task))] -[JsonSerializable(typeof(Task))] [JsonSerializable(typeof(Dictionary))] [JsonSerializable(typeof(List))] [JsonSerializable(typeof(JsonElement))] diff --git a/Daybreak.API/Services/Interop/MemoryScanningService.cs b/Daybreak.API/Services/Interop/MemoryScanningService.cs index 15a37bd7..15b8a056 100644 --- a/Daybreak.API/Services/Interop/MemoryScanningService.cs +++ b/Daybreak.API/Services/Interop/MemoryScanningService.cs @@ -1,9 +1,7 @@ -using Daybreak.Shared.Models.Interop; -using PeNet; +using PeNet; using PeNet.Header.Pe; using System.Core.Extensions; using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; using System.Extensions.Core; using System.Globalization; using System.Runtime.InteropServices; @@ -11,31 +9,13 @@ using System.Text; namespace Daybreak.API.Services.Interop; -public sealed unsafe class MemoryScanningService +public sealed unsafe class MemoryScanningService( + ILogger logger) { - private readonly ILogger logger; + private readonly ILogger logger = logger.ThrowIfNull(); private readonly (nuint BaseAddress, ImageSectionHeader Section) textSection = GetSectionHeader(".text"); private readonly (nuint BaseAddress, ImageSectionHeader Section) dataSection = GetSectionHeader(".rdata"); - public MemoryScanningService( - ILogger logger) - { - this.logger = logger.ThrowIfNull(); - } - - public T? ReadPointer<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] T>(GuildwarsPointer ptr) - where T : struct - { - var scopedLogger = this.logger.CreateScopedLogger(); - scopedLogger.LogInformation("Reading pointer: 0x{ptr:X8}", ptr.Address); - if (ptr.Address is 0) - { - return default; - } - - return Marshal.PtrToStructure((nint)ptr.Address); - } - public nuint FunctionFromNearCall(nuint callInstructionAddress, bool checkValidPtr = true) { var scopedLogger = this.logger.CreateScopedLogger(); diff --git a/Daybreak.API/Services/Interop/UIContextService.cs b/Daybreak.API/Services/Interop/UIContextService.cs index ab6713b2..4436191f 100644 --- a/Daybreak.API/Services/Interop/UIContextService.cs +++ b/Daybreak.API/Services/Interop/UIContextService.cs @@ -366,7 +366,6 @@ public sealed class UIContextService { *pState |= 0x200u; // set “hidden” } - } private static unsafe void SetFrameDisabledInternal(WrappedPointer frame, bool disabled) diff --git a/Daybreak.API/Services/MainPlayerService.cs b/Daybreak.API/Services/MainPlayerService.cs index 119916be..16a8dca1 100644 --- a/Daybreak.API/Services/MainPlayerService.cs +++ b/Daybreak.API/Services/MainPlayerService.cs @@ -12,7 +12,6 @@ using System.Collections.Concurrent; using System.Core.Extensions; using System.Extensions; using System.Extensions.Core; -using System.Logging; using System.Runtime.CompilerServices; using ZLinq; using InstanceType = Daybreak.API.Interop.GuildWars.InstanceType; diff --git a/Daybreak.API/Services/PartyService.cs b/Daybreak.API/Services/PartyService.cs index d504f331..2968599a 100644 --- a/Daybreak.API/Services/PartyService.cs +++ b/Daybreak.API/Services/PartyService.cs @@ -9,7 +9,6 @@ using Daybreak.Shared.Services.BuildTemplates; using System.Core.Extensions; using System.Extensions; using System.Extensions.Core; -using System.Windows.Navigation; using ZLinq; using InstanceType = Daybreak.API.Interop.GuildWars.InstanceType; diff --git a/Daybreak.API/Services/UIService.cs b/Daybreak.API/Services/UIService.cs index 951212f3..b9849a06 100644 --- a/Daybreak.API/Services/UIService.cs +++ b/Daybreak.API/Services/UIService.cs @@ -81,7 +81,6 @@ public sealed class UIService( { await this.Keypress(uiAction, null, CancellationToken.None); } - }, CancellationToken.None); }); } diff --git a/Daybreak.Installer/Daybreak.Installer.csproj b/Daybreak.Installer/Daybreak.Installer.csproj index d5251a94..76f2b29b 100644 --- a/Daybreak.Installer/Daybreak.Installer.csproj +++ b/Daybreak.Installer/Daybreak.Installer.csproj @@ -10,7 +10,6 @@ win-x86 true true - 0.9.9.76 diff --git a/Daybreak.Shared/Converters/AttributeJsonConverter.cs b/Daybreak.Shared/Converters/AttributeJsonConverter.cs index 9c359360..942e2abc 100644 --- a/Daybreak.Shared/Converters/AttributeJsonConverter.cs +++ b/Daybreak.Shared/Converters/AttributeJsonConverter.cs @@ -1,5 +1,4 @@ using Newtonsoft.Json; -using System; namespace Daybreak.Shared.Converters; public sealed class AttributeJsonConverter : JsonConverter diff --git a/Daybreak.Shared/Converters/BooleanToEffectConverter.cs b/Daybreak.Shared/Converters/BooleanToEffectConverter.cs index 62b75192..90fff9c7 100644 --- a/Daybreak.Shared/Converters/BooleanToEffectConverter.cs +++ b/Daybreak.Shared/Converters/BooleanToEffectConverter.cs @@ -1,5 +1,4 @@ -using System; -using System.Globalization; +using System.Globalization; using System.Windows.Data; using System.Windows.Media.Effects; diff --git a/Daybreak.Shared/Converters/BooleanToGridLengthConverter.cs b/Daybreak.Shared/Converters/BooleanToGridLengthConverter.cs index 004aa2ca..8849b873 100644 --- a/Daybreak.Shared/Converters/BooleanToGridLengthConverter.cs +++ b/Daybreak.Shared/Converters/BooleanToGridLengthConverter.cs @@ -1,5 +1,4 @@ -using System; -using System.Extensions; +using System.Extensions; using System.Globalization; using System.Windows; using System.Windows.Data; @@ -22,7 +21,7 @@ public sealed class BooleanToGridLengthConverter : IValueConverter throw new NotImplementedException(); } - private object GetVisibility(object value) + private GridLength GetVisibility(object value) { if (value is not bool) { diff --git a/Daybreak.Shared/Converters/BooleanToVisibilityConverter.cs b/Daybreak.Shared/Converters/BooleanToVisibilityConverter.cs index 8a3e4458..0454d281 100644 --- a/Daybreak.Shared/Converters/BooleanToVisibilityConverter.cs +++ b/Daybreak.Shared/Converters/BooleanToVisibilityConverter.cs @@ -1,5 +1,4 @@ -using System; -using System.Extensions; +using System.Extensions; using System.Globalization; using System.Windows; using System.Windows.Data; @@ -38,12 +37,12 @@ public class BooleanToVisibilityConverter : IValueConverter } var objValue = value.Cast(); - if (objValue && this.TriggerValue && this.IsHidden || !objValue && !this.TriggerValue && this.IsHidden) + if ((objValue && this.TriggerValue && this.IsHidden) || (!objValue && !this.TriggerValue && this.IsHidden)) { return Visibility.Hidden; } - if (objValue && this.TriggerValue && !this.IsHidden || !objValue && !this.TriggerValue && !this.IsHidden) + if ((objValue && this.TriggerValue && !this.IsHidden) || (!objValue && !this.TriggerValue && !this.IsHidden)) { return Visibility.Collapsed; } diff --git a/Daybreak.Shared/Converters/CampaignJsonConverter.cs b/Daybreak.Shared/Converters/CampaignJsonConverter.cs index b776912a..da730a8b 100644 --- a/Daybreak.Shared/Converters/CampaignJsonConverter.cs +++ b/Daybreak.Shared/Converters/CampaignJsonConverter.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.Guildwars; using Newtonsoft.Json; -using System; namespace Daybreak.Shared.Converters; public sealed class CampaignJsonConverter : JsonConverter diff --git a/Daybreak.Shared/Converters/ContinentJsonConverter.cs b/Daybreak.Shared/Converters/ContinentJsonConverter.cs index 5c9d78e3..cdb9f35d 100644 --- a/Daybreak.Shared/Converters/ContinentJsonConverter.cs +++ b/Daybreak.Shared/Converters/ContinentJsonConverter.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.Guildwars; using Newtonsoft.Json; -using System; namespace Daybreak.Shared.Converters; public sealed class ContinentJsonConverter : JsonConverter diff --git a/Daybreak.Shared/Converters/DateTimeConverter.cs b/Daybreak.Shared/Converters/DateTimeConverter.cs index 03337f41..926b17f4 100644 --- a/Daybreak.Shared/Converters/DateTimeConverter.cs +++ b/Daybreak.Shared/Converters/DateTimeConverter.cs @@ -1,5 +1,4 @@ -using System; -using System.Globalization; +using System.Globalization; using System.Windows.Data; namespace Daybreak.Shared.Converters; diff --git a/Daybreak.Shared/Converters/DoubleMultiplierConverter.cs b/Daybreak.Shared/Converters/DoubleMultiplierConverter.cs index 0cc365ec..bf625ecd 100644 --- a/Daybreak.Shared/Converters/DoubleMultiplierConverter.cs +++ b/Daybreak.Shared/Converters/DoubleMultiplierConverter.cs @@ -1,5 +1,4 @@ -using System; -using System.Globalization; +using System.Globalization; using System.Windows.Data; namespace Daybreak.Shared.Converters; diff --git a/Daybreak.Shared/Converters/EqualityToVisibilityConverter.cs b/Daybreak.Shared/Converters/EqualityToVisibilityConverter.cs index 35f98695..82302681 100644 --- a/Daybreak.Shared/Converters/EqualityToVisibilityConverter.cs +++ b/Daybreak.Shared/Converters/EqualityToVisibilityConverter.cs @@ -1,5 +1,4 @@ -using System; -using System.Globalization; +using System.Globalization; using System.Windows; using System.Windows.Data; diff --git a/Daybreak.Shared/Converters/EventCalendarDayToBrushConverter.cs b/Daybreak.Shared/Converters/EventCalendarDayToBrushConverter.cs index 19887c5d..1b982c74 100644 --- a/Daybreak.Shared/Converters/EventCalendarDayToBrushConverter.cs +++ b/Daybreak.Shared/Converters/EventCalendarDayToBrushConverter.cs @@ -1,9 +1,7 @@ using Daybreak.Shared.Models.Guildwars; using Daybreak.Shared.Services.Events; using Microsoft.Extensions.DependencyInjection; -using System; using System.Globalization; -using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Data; diff --git a/Daybreak.Shared/Converters/EventToBrushConverter.cs b/Daybreak.Shared/Converters/EventToBrushConverter.cs index 74dc9dba..2d85d51d 100644 --- a/Daybreak.Shared/Converters/EventToBrushConverter.cs +++ b/Daybreak.Shared/Converters/EventToBrushConverter.cs @@ -1,7 +1,5 @@ using Daybreak.Shared.Models; using Daybreak.Shared.Models.Guildwars; -using System; -using System.Collections.Generic; using System.Globalization; using System.Windows.Data; using System.Windows.Media; diff --git a/Daybreak.Shared/Converters/HiddenWhenNull.cs b/Daybreak.Shared/Converters/HiddenWhenNull.cs index 14fdc760..8c1d1202 100644 --- a/Daybreak.Shared/Converters/HiddenWhenNull.cs +++ b/Daybreak.Shared/Converters/HiddenWhenNull.cs @@ -1,5 +1,4 @@ -using System; -using System.Globalization; +using System.Globalization; using System.Windows; using System.Windows.Data; @@ -9,7 +8,7 @@ public class HiddenWhenNull : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - return this.GetVerticalAlignment(value); + return GetVerticalAlignment(value); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) @@ -17,7 +16,7 @@ public class HiddenWhenNull : IValueConverter throw new NotImplementedException(); } - private object GetVerticalAlignment(object value) + private static object GetVerticalAlignment(object value) { if (value is null) { diff --git a/Daybreak.Shared/Converters/IntToStringConverter.cs b/Daybreak.Shared/Converters/IntToStringConverter.cs index a54cbc9f..c0581be8 100644 --- a/Daybreak.Shared/Converters/IntToStringConverter.cs +++ b/Daybreak.Shared/Converters/IntToStringConverter.cs @@ -1,5 +1,4 @@ -using System; -using System.Globalization; +using System.Globalization; using System.Windows.Data; namespace Daybreak.Shared.Converters; diff --git a/Daybreak.Shared/Converters/InverseBooleanConverter.cs b/Daybreak.Shared/Converters/InverseBooleanConverter.cs index a437ced5..47b1f2bb 100644 --- a/Daybreak.Shared/Converters/InverseBooleanConverter.cs +++ b/Daybreak.Shared/Converters/InverseBooleanConverter.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Data; +using System.Windows.Data; namespace Daybreak.Shared.Converters; diff --git a/Daybreak.Shared/Converters/ItemBaseJsonConverter.cs b/Daybreak.Shared/Converters/ItemBaseJsonConverter.cs index 62a533fe..2b33e455 100644 --- a/Daybreak.Shared/Converters/ItemBaseJsonConverter.cs +++ b/Daybreak.Shared/Converters/ItemBaseJsonConverter.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.Guildwars; using Newtonsoft.Json; -using System; namespace Daybreak.Shared.Converters; public sealed class ItemBaseJsonConverter : JsonConverter @@ -18,7 +17,7 @@ public sealed class ItemBaseJsonConverter : JsonConverter { case JsonToken.String: var name = reader.ReadAsString(); - if (name is not string || + if (name is null || !ItemBase.TryParse(name, out var namedItem)) { return default; diff --git a/Daybreak.Shared/Converters/ItemBaseToIntConverter.cs b/Daybreak.Shared/Converters/ItemBaseToIntConverter.cs index f73d9103..ca1c1801 100644 --- a/Daybreak.Shared/Converters/ItemBaseToIntConverter.cs +++ b/Daybreak.Shared/Converters/ItemBaseToIntConverter.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Guildwars; -using System; using System.Globalization; using System.Windows.Data; diff --git a/Daybreak.Shared/Converters/ItemBaseToStringConverter.cs b/Daybreak.Shared/Converters/ItemBaseToStringConverter.cs index 593b1064..caaeeb7a 100644 --- a/Daybreak.Shared/Converters/ItemBaseToStringConverter.cs +++ b/Daybreak.Shared/Converters/ItemBaseToStringConverter.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Guildwars; -using System; using System.Globalization; using System.Windows.Data; diff --git a/Daybreak.Shared/Converters/MapJsonConverter.cs b/Daybreak.Shared/Converters/MapJsonConverter.cs index f90bd3dd..a797e434 100644 --- a/Daybreak.Shared/Converters/MapJsonConverter.cs +++ b/Daybreak.Shared/Converters/MapJsonConverter.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.Guildwars; using Newtonsoft.Json; -using System; namespace Daybreak.Shared.Converters; public sealed class MapJsonConverter : JsonConverter diff --git a/Daybreak.Shared/Converters/MenuButtonHighlightConverter.cs b/Daybreak.Shared/Converters/MenuButtonHighlightConverter.cs index e090ffc5..39870989 100644 --- a/Daybreak.Shared/Converters/MenuButtonHighlightConverter.cs +++ b/Daybreak.Shared/Converters/MenuButtonHighlightConverter.cs @@ -1,5 +1,4 @@ -using System; -using System.Globalization; +using System.Globalization; using System.Windows.Data; namespace Daybreak.Shared.Converters; diff --git a/Daybreak.Shared/Converters/NpcJsonConverter.cs b/Daybreak.Shared/Converters/NpcJsonConverter.cs index 651ea351..03a268c8 100644 --- a/Daybreak.Shared/Converters/NpcJsonConverter.cs +++ b/Daybreak.Shared/Converters/NpcJsonConverter.cs @@ -1,7 +1,5 @@ using Daybreak.Shared.Models.Guildwars; using Newtonsoft.Json; -using System; -using System.Linq; namespace Daybreak.Shared.Converters; public sealed class NpcJsonConverter : JsonConverter diff --git a/Daybreak.Shared/Converters/NullToUnsetValueConverter.cs b/Daybreak.Shared/Converters/NullToUnsetValueConverter.cs index 33361542..2c59bc7f 100644 --- a/Daybreak.Shared/Converters/NullToUnsetValueConverter.cs +++ b/Daybreak.Shared/Converters/NullToUnsetValueConverter.cs @@ -1,5 +1,4 @@ -using System; -using System.Globalization; +using System.Globalization; using System.Windows.Data; using System.Windows; diff --git a/Daybreak.Shared/Converters/PriceToStringConverter.cs b/Daybreak.Shared/Converters/PriceToStringConverter.cs index 1b33dd6f..96b4838e 100644 --- a/Daybreak.Shared/Converters/PriceToStringConverter.cs +++ b/Daybreak.Shared/Converters/PriceToStringConverter.cs @@ -1,5 +1,4 @@ -using System; -using System.Globalization; +using System.Globalization; using System.Windows.Data; namespace Daybreak.Shared.Converters; diff --git a/Daybreak.Shared/Converters/ProfessionJsonConverter.cs b/Daybreak.Shared/Converters/ProfessionJsonConverter.cs index 6f6a5418..08232e2e 100644 --- a/Daybreak.Shared/Converters/ProfessionJsonConverter.cs +++ b/Daybreak.Shared/Converters/ProfessionJsonConverter.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.Guildwars; using Newtonsoft.Json; -using System; namespace Daybreak.Shared.Converters; public sealed class ProfessionJsonConverter : JsonConverter diff --git a/Daybreak.Shared/Converters/QuestJsonConverter.cs b/Daybreak.Shared/Converters/QuestJsonConverter.cs index e046ef77..640bcc2f 100644 --- a/Daybreak.Shared/Converters/QuestJsonConverter.cs +++ b/Daybreak.Shared/Converters/QuestJsonConverter.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.Guildwars; using Newtonsoft.Json; -using System; namespace Daybreak.Shared.Converters; public sealed class QuestJsonConverter : JsonConverter diff --git a/Daybreak.Shared/Converters/RegionJsonConverter.cs b/Daybreak.Shared/Converters/RegionJsonConverter.cs index a5d171fd..29d711d2 100644 --- a/Daybreak.Shared/Converters/RegionJsonConverter.cs +++ b/Daybreak.Shared/Converters/RegionJsonConverter.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.Guildwars; using Newtonsoft.Json; -using System; namespace Daybreak.Shared.Converters; public sealed class RegionJsonConverter : JsonConverter diff --git a/Daybreak.Shared/Converters/SkillJsonConverter.cs b/Daybreak.Shared/Converters/SkillJsonConverter.cs index c6c79049..185a4e56 100644 --- a/Daybreak.Shared/Converters/SkillJsonConverter.cs +++ b/Daybreak.Shared/Converters/SkillJsonConverter.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.Guildwars; using Newtonsoft.Json; -using System; namespace Daybreak.Shared.Converters; public sealed class SkillJsonConverter : JsonConverter diff --git a/Daybreak.Shared/Converters/TileButtonHighlightConverter.cs b/Daybreak.Shared/Converters/TileButtonHighlightConverter.cs index 98fa3fb7..81b24acd 100644 --- a/Daybreak.Shared/Converters/TileButtonHighlightConverter.cs +++ b/Daybreak.Shared/Converters/TileButtonHighlightConverter.cs @@ -1,5 +1,4 @@ -using System; -using System.Globalization; +using System.Globalization; using System.Windows.Data; namespace Daybreak.Shared.Converters; diff --git a/Daybreak.Shared/Converters/TimeSinceDateTimeConverter.cs b/Daybreak.Shared/Converters/TimeSinceDateTimeConverter.cs index a887b134..0c83330e 100644 --- a/Daybreak.Shared/Converters/TimeSinceDateTimeConverter.cs +++ b/Daybreak.Shared/Converters/TimeSinceDateTimeConverter.cs @@ -1,5 +1,4 @@ -using System; -using System.Globalization; +using System.Globalization; using System.Windows.Data; namespace Daybreak.Shared.Converters; @@ -10,7 +9,7 @@ public sealed class TimeSinceDateTimeConverter : IValueConverter public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - return this.GetTimeString(value); + return GetTimeString(value) ?? string.Empty; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) @@ -18,11 +17,11 @@ public sealed class TimeSinceDateTimeConverter : IValueConverter throw new NotImplementedException(); } - private object GetTimeString(object value) + private static string? GetTimeString(object value) { if (value is not DateTime dateTime) { - return default!; + return default; } var difference = DateTime.Now - dateTime; diff --git a/Daybreak.Shared/Converters/TimespanToETAConverter.cs b/Daybreak.Shared/Converters/TimespanToETAConverter.cs index f6df93bb..033bafa7 100644 --- a/Daybreak.Shared/Converters/TimespanToETAConverter.cs +++ b/Daybreak.Shared/Converters/TimespanToETAConverter.cs @@ -1,5 +1,4 @@ -using System; -using System.Globalization; +using System.Globalization; using System.Windows.Data; namespace Daybreak.Shared.Converters; diff --git a/Daybreak.Shared/Converters/TitleJsonConverter.cs b/Daybreak.Shared/Converters/TitleJsonConverter.cs index 67c9ee7f..2f2a74a5 100644 --- a/Daybreak.Shared/Converters/TitleJsonConverter.cs +++ b/Daybreak.Shared/Converters/TitleJsonConverter.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.Guildwars; using Newtonsoft.Json; -using System; namespace Daybreak.Shared.Converters; public sealed class TitleJsonConverter : JsonConverter diff --git a/Daybreak.Shared/Converters/TradeAlertConverter.cs b/Daybreak.Shared/Converters/TradeAlertConverter.cs index c7b4fdc1..65ba7e91 100644 --- a/Daybreak.Shared/Converters/TradeAlertConverter.cs +++ b/Daybreak.Shared/Converters/TradeAlertConverter.cs @@ -1,19 +1,13 @@ using Daybreak.Shared.Models.Trade; using Newtonsoft.Json; using Newtonsoft.Json.Linq; -using System; namespace Daybreak.Shared.Converters; public sealed class TradeAlertConverter : JsonConverter { public override ITradeAlert? ReadJson(JsonReader reader, Type objectType, ITradeAlert? existingValue, bool hasExistingValue, JsonSerializer serializer) { - var jObject = JObject.Load(reader).ToObject(); - if (jObject is null) - { - throw new InvalidOperationException($"Unable to deserialize {nameof(ITradeAlert)}"); - } - + var jObject = JObject.Load(reader).ToObject() ?? throw new InvalidOperationException($"Unable to deserialize {nameof(ITradeAlert)}"); if (jObject[nameof(TradeAlert.MessageCheck)] is null) { return new QuoteAlert @@ -51,10 +45,12 @@ public sealed class TradeAlertConverter : JsonConverter return; } - var jObject = new JObject(); - jObject[nameof(ITradeAlert.Name)] = value.Name; - jObject[nameof(ITradeAlert.Enabled)] = value.Enabled; - jObject[nameof(ITradeAlert.Id)] = value.Id; + var jObject = new JObject + { + [nameof(ITradeAlert.Name)] = value.Name, + [nameof(ITradeAlert.Enabled)] = value.Enabled, + [nameof(ITradeAlert.Id)] = value.Id + }; if (value is TradeAlert tradeAlert) { jObject[nameof(TradeAlert.MessageCheck)] = tradeAlert.MessageCheck; diff --git a/Daybreak.Shared/Converters/TraderQuoteTypeToStringConverter.cs b/Daybreak.Shared/Converters/TraderQuoteTypeToStringConverter.cs index 77da712e..90128059 100644 --- a/Daybreak.Shared/Converters/TraderQuoteTypeToStringConverter.cs +++ b/Daybreak.Shared/Converters/TraderQuoteTypeToStringConverter.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Trade; -using System; using System.Globalization; using System.Windows.Data; diff --git a/Daybreak.Shared/Daybreak.Shared.csproj b/Daybreak.Shared/Daybreak.Shared.csproj index 1f33d89c..93a03ec7 100644 --- a/Daybreak.Shared/Daybreak.Shared.csproj +++ b/Daybreak.Shared/Daybreak.Shared.csproj @@ -9,23 +9,23 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/Daybreak.Shared/Exceptions/CredentialsNotFoundException.cs b/Daybreak.Shared/Exceptions/CredentialsNotFoundException.cs index c3f186f7..18f365b0 100644 --- a/Daybreak.Shared/Exceptions/CredentialsNotFoundException.cs +++ b/Daybreak.Shared/Exceptions/CredentialsNotFoundException.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Exceptions; +namespace Daybreak.Shared.Exceptions; public sealed class CredentialsNotFoundException : Exception { diff --git a/Daybreak.Shared/Exceptions/ExecutableNotFoundException.cs b/Daybreak.Shared/Exceptions/ExecutableNotFoundException.cs index b71758e3..e50ce566 100644 --- a/Daybreak.Shared/Exceptions/ExecutableNotFoundException.cs +++ b/Daybreak.Shared/Exceptions/ExecutableNotFoundException.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Exceptions; +namespace Daybreak.Shared.Exceptions; public sealed class ExecutableNotFoundException : Exception { diff --git a/Daybreak.Shared/Exceptions/FatalException.cs b/Daybreak.Shared/Exceptions/FatalException.cs index 959be632..817f215e 100644 --- a/Daybreak.Shared/Exceptions/FatalException.cs +++ b/Daybreak.Shared/Exceptions/FatalException.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Exceptions; +namespace Daybreak.Shared.Exceptions; public sealed class FatalException : Exception { diff --git a/Daybreak.Shared/Global.cs b/Daybreak.Shared/Global.cs index 9785dd20..0c2d4ec9 100644 --- a/Daybreak.Shared/Global.cs +++ b/Daybreak.Shared/Global.cs @@ -1,5 +1,4 @@ -using System; -using System.Runtime.CompilerServices; +using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Daybreak")] diff --git a/Daybreak.Shared/Models/Api/BuildEntry.cs b/Daybreak.Shared/Models/Api/BuildEntry.cs index 64b11e1d..110bfaf5 100644 --- a/Daybreak.Shared/Models/Api/BuildEntry.cs +++ b/Daybreak.Shared/Models/Api/BuildEntry.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace Daybreak.Shared.Models.Api; +namespace Daybreak.Shared.Models.Api; public sealed record BuildEntry(int Primary, int Secondary, List Attributes, List Skills) { } diff --git a/Daybreak.Shared/Models/Api/CharacterSelectInformation.cs b/Daybreak.Shared/Models/Api/CharacterSelectInformation.cs index 7f71a282..10f3e950 100644 --- a/Daybreak.Shared/Models/Api/CharacterSelectInformation.cs +++ b/Daybreak.Shared/Models/Api/CharacterSelectInformation.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace Daybreak.Shared.Models.Api; +namespace Daybreak.Shared.Models.Api; public sealed record CharacterSelectInformation(CharacterSelectEntry? CurrentCharacter, List CharacterNames) { diff --git a/Daybreak.Shared/Models/Api/PartyLoadout.cs b/Daybreak.Shared/Models/Api/PartyLoadout.cs index 0783526d..4077f351 100644 --- a/Daybreak.Shared/Models/Api/PartyLoadout.cs +++ b/Daybreak.Shared/Models/Api/PartyLoadout.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace Daybreak.Shared.Models.Api; +namespace Daybreak.Shared.Models.Api; public sealed record PartyLoadout(List Entries) { } diff --git a/Daybreak.Shared/Models/Api/QuestLogInformation.cs b/Daybreak.Shared/Models/Api/QuestLogInformation.cs index 63337370..48dc6bb0 100644 --- a/Daybreak.Shared/Models/Api/QuestLogInformation.cs +++ b/Daybreak.Shared/Models/Api/QuestLogInformation.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace Daybreak.Shared.Models.Api; +namespace Daybreak.Shared.Models.Api; public sealed record QuestLogInformation(uint CurrentQuestId, IReadOnlyList Quests) { } diff --git a/Daybreak.Shared/Models/BatchedObservableCollection.cs b/Daybreak.Shared/Models/BatchedObservableCollection.cs index d4007261..a0903ab0 100644 --- a/Daybreak.Shared/Models/BatchedObservableCollection.cs +++ b/Daybreak.Shared/Models/BatchedObservableCollection.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using System.Collections.ObjectModel; +using System.Collections.ObjectModel; using System.Collections.Specialized; namespace Daybreak.Shared.Models; diff --git a/Daybreak.Shared/Models/Browser/BrowserHistory.cs b/Daybreak.Shared/Models/Browser/BrowserHistory.cs index 4a9b2eb9..9b1487a9 100644 --- a/Daybreak.Shared/Models/Browser/BrowserHistory.cs +++ b/Daybreak.Shared/Models/Browser/BrowserHistory.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace Daybreak.Shared.Models.Browser; +namespace Daybreak.Shared.Models.Browser; public sealed class BrowserHistory { public List History { get; set; } = []; diff --git a/Daybreak.Shared/Models/Builds/AttributeEntry.cs b/Daybreak.Shared/Models/Builds/AttributeEntry.cs index c2b5ffb6..30eaac00 100644 --- a/Daybreak.Shared/Models/Builds/AttributeEntry.cs +++ b/Daybreak.Shared/Models/Builds/AttributeEntry.cs @@ -5,26 +5,23 @@ namespace Daybreak.Shared.Models.Builds; public sealed class AttributeEntry : INotifyPropertyChanged { - private Attribute? attribute; - private int points; - public event PropertyChangedEventHandler? PropertyChanged; public Attribute? Attribute { - get => this.attribute; + get; set { - this.attribute = value; + field = value; this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.Attribute))); } } public int Points { - get => this.points; + get; set { - this.points = value; + field = value; this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.Points))); } } diff --git a/Daybreak.Shared/Models/Builds/IBuildEntry.cs b/Daybreak.Shared/Models/Builds/IBuildEntry.cs index 325cf946..03282a31 100644 --- a/Daybreak.Shared/Models/Builds/IBuildEntry.cs +++ b/Daybreak.Shared/Models/Builds/IBuildEntry.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; - -namespace Daybreak.Shared.Models.Builds; +namespace Daybreak.Shared.Models.Builds; public interface IBuildEntry { public DateTimeOffset CreationTime { get; set; } diff --git a/Daybreak.Shared/Models/Builds/SingleBuildEntry.cs b/Daybreak.Shared/Models/Builds/SingleBuildEntry.cs index 4a904f9b..a28373fa 100644 --- a/Daybreak.Shared/Models/Builds/SingleBuildEntry.cs +++ b/Daybreak.Shared/Models/Builds/SingleBuildEntry.cs @@ -1,8 +1,5 @@ using Daybreak.Shared.Models.Guildwars; -using System; -using System.Collections.Generic; using System.ComponentModel; -using System.Linq; using Attribute = Daybreak.Shared.Models.Guildwars.Attribute; namespace Daybreak.Shared.Models.Builds; @@ -190,7 +187,7 @@ public sealed class SingleBuildEntry : BuildEntryBase, IBuildEntry, INotifyPrope attributesToAdd.AddRange(this.Primary.Attributes); attributesToAdd.AddRange(this.Secondary.Attributes); - this.Attributes = attributesToAdd.Distinct().Select(attribute => + this.Attributes = [.. attributesToAdd.Distinct().Select(attribute => { if (this.Attributes.FirstOrDefault(attributeEntry => attributeEntry.Attribute == attribute) is AttributeEntry attributeEntry) { @@ -198,7 +195,7 @@ public sealed class SingleBuildEntry : BuildEntryBase, IBuildEntry, INotifyPrope } return new AttributeEntry { Attribute = attribute }; - }).ToList(); + })]; } private void UpdateSkills() diff --git a/Daybreak.Shared/Models/Builds/TeamBuildEntry.cs b/Daybreak.Shared/Models/Builds/TeamBuildEntry.cs index 7b5fe520..6aa50ff3 100644 --- a/Daybreak.Shared/Models/Builds/TeamBuildEntry.cs +++ b/Daybreak.Shared/Models/Builds/TeamBuildEntry.cs @@ -1,7 +1,4 @@ using Daybreak.Shared.Models.Guildwars; -using System; -using System.Collections.Generic; -using System.Linq; namespace Daybreak.Shared.Models.Builds; public sealed class TeamBuildEntry : BuildEntryBase, IEquatable diff --git a/Daybreak.Shared/Models/ColorPalette.cs b/Daybreak.Shared/Models/ColorPalette.cs index dd8b3601..7ed3c950 100644 --- a/Daybreak.Shared/Models/ColorPalette.cs +++ b/Daybreak.Shared/Models/ColorPalette.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using System.Windows.Media; +using System.Windows.Media; namespace Daybreak.Shared.Models; public static class ColorPalette diff --git a/Daybreak.Shared/Models/DaybreakApiContext.cs b/Daybreak.Shared/Models/DaybreakApiContext.cs index e01feef3..0869711b 100644 --- a/Daybreak.Shared/Models/DaybreakApiContext.cs +++ b/Daybreak.Shared/Models/DaybreakApiContext.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Models; +namespace Daybreak.Shared.Models; public readonly struct DaybreakAPIContext(Uri apiUri) { public readonly Uri ApiUri = apiUri; diff --git a/Daybreak.Shared/Models/DnsRegistrationToken.cs b/Daybreak.Shared/Models/DnsRegistrationToken.cs index fcb6f533..19a58973 100644 --- a/Daybreak.Shared/Models/DnsRegistrationToken.cs +++ b/Daybreak.Shared/Models/DnsRegistrationToken.cs @@ -1,5 +1,4 @@ using MeaMod.DNS.Multicast; -using System; namespace Daybreak.Shared.Models; public readonly struct DnsRegistrationToken : IDisposable diff --git a/Daybreak.Shared/Models/ElevationRequest.cs b/Daybreak.Shared/Models/ElevationRequest.cs index 7ce903a4..adfa4720 100644 --- a/Daybreak.Shared/Models/ElevationRequest.cs +++ b/Daybreak.Shared/Models/ElevationRequest.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Models; +namespace Daybreak.Shared.Models; public sealed class ElevationRequest { diff --git a/Daybreak.Shared/Models/ExecutablePath.cs b/Daybreak.Shared/Models/ExecutablePath.cs index aebc3339..44d183f2 100644 --- a/Daybreak.Shared/Models/ExecutablePath.cs +++ b/Daybreak.Shared/Models/ExecutablePath.cs @@ -4,17 +4,15 @@ namespace Daybreak.Shared.Models; public sealed class ExecutablePath : INotifyPropertyChanged { - private string path = string.Empty; - public event PropertyChangedEventHandler? PropertyChanged; public string Path { - get => this.path; + get; set { - this.path = value; + field = value; this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.Path))); } - } + } = string.Empty; } diff --git a/Daybreak.Shared/Models/FocusView/CharacterComponentContext.cs b/Daybreak.Shared/Models/FocusView/CharacterComponentContext.cs index d5729a23..201cba0c 100644 --- a/Daybreak.Shared/Models/FocusView/CharacterComponentContext.cs +++ b/Daybreak.Shared/Models/FocusView/CharacterComponentContext.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace Daybreak.Shared.Models.FocusView; +namespace Daybreak.Shared.Models.FocusView; public sealed class CharacterComponentContext { public required uint CurrentExperience { get; init; } diff --git a/Daybreak.Shared/Models/FocusView/CharacterSelectComponentEntry.cs b/Daybreak.Shared/Models/FocusView/CharacterSelectComponentEntry.cs index 70e2aac0..7ea0c934 100644 --- a/Daybreak.Shared/Models/FocusView/CharacterSelectComponentEntry.cs +++ b/Daybreak.Shared/Models/FocusView/CharacterSelectComponentEntry.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Models.FocusView; +namespace Daybreak.Shared.Models.FocusView; public sealed class CharacterSelectComponentEntry : IEquatable { public required string DisplayName { get; init; } diff --git a/Daybreak.Shared/Models/FocusView/QuestLogComponentContext.cs b/Daybreak.Shared/Models/FocusView/QuestLogComponentContext.cs index 3d098223..71197c28 100644 --- a/Daybreak.Shared/Models/FocusView/QuestLogComponentContext.cs +++ b/Daybreak.Shared/Models/FocusView/QuestLogComponentContext.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Guildwars; -using System.Collections.Generic; namespace Daybreak.Shared.Models.FocusView; public sealed class QuestLogComponentContext diff --git a/Daybreak.Shared/Models/GuildWarsUpdateRequest.cs b/Daybreak.Shared/Models/GuildWarsUpdateRequest.cs index 3f723d57..175876f5 100644 --- a/Daybreak.Shared/Models/GuildWarsUpdateRequest.cs +++ b/Daybreak.Shared/Models/GuildWarsUpdateRequest.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Progress; -using System.Threading; namespace Daybreak.Shared.Models; public sealed class GuildWarsUpdateRequest diff --git a/Daybreak.Shared/Models/Guildwars/Attribute.cs b/Daybreak.Shared/Models/Guildwars/Attribute.cs index 6694301c..7eb523a2 100644 --- a/Daybreak.Shared/Models/Guildwars/Attribute.cs +++ b/Daybreak.Shared/Models/Guildwars/Attribute.cs @@ -1,8 +1,5 @@ using Daybreak.Shared.Converters; using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; namespace Daybreak.Shared.Models.Guildwars; diff --git a/Daybreak.Shared/Models/Guildwars/Build.cs b/Daybreak.Shared/Models/Guildwars/Build.cs index 822ce2fa..7355625c 100644 --- a/Daybreak.Shared/Models/Guildwars/Build.cs +++ b/Daybreak.Shared/Models/Guildwars/Build.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using Daybreak.Shared.Models.Builds; +using Daybreak.Shared.Models.Builds; namespace Daybreak.Shared.Models.Guildwars; diff --git a/Daybreak.Shared/Models/Guildwars/BuildEntryBase.cs b/Daybreak.Shared/Models/Guildwars/BuildEntryBase.cs index 7d2eaa8b..d22d7078 100644 --- a/Daybreak.Shared/Models/Guildwars/BuildEntryBase.cs +++ b/Daybreak.Shared/Models/Guildwars/BuildEntryBase.cs @@ -1,7 +1,5 @@ using Daybreak.Shared.Models.Builds; using Newtonsoft.Json; -using System; -using System.Collections.Generic; using System.ComponentModel; namespace Daybreak.Shared.Models.Guildwars; diff --git a/Daybreak.Shared/Models/Guildwars/BuildMetadata.cs b/Daybreak.Shared/Models/Guildwars/BuildMetadata.cs index a661f2cb..0a18eeee 100644 --- a/Daybreak.Shared/Models/Guildwars/BuildMetadata.cs +++ b/Daybreak.Shared/Models/Guildwars/BuildMetadata.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace Daybreak.Shared.Models.Guildwars; +namespace Daybreak.Shared.Models.Guildwars; public sealed class BuildMetadata { diff --git a/Daybreak.Shared/Models/Guildwars/Campaign.cs b/Daybreak.Shared/Models/Guildwars/Campaign.cs index afdc2cba..a5ccbcef 100644 --- a/Daybreak.Shared/Models/Guildwars/Campaign.cs +++ b/Daybreak.Shared/Models/Guildwars/Campaign.cs @@ -1,8 +1,5 @@ using Daybreak.Shared.Converters; using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; namespace Daybreak.Shared.Models.Guildwars; @@ -14,11 +11,11 @@ public sealed class Campaign Id = 0, Name = "Core", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Core", - Continents = new List - { + Continents = + [ Continent.TheBattleIsles, Continent.TheMists - } + ] }; public static Campaign Prophecies { get; } = new() @@ -26,10 +23,10 @@ public sealed class Campaign Id = 1, Name = "Prophecies", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Prophecies", - Continents = new List - { + Continents = + [ Continent.Tyria - } + ] }; public static Campaign Factions { get; } = new() @@ -37,10 +34,10 @@ public sealed class Campaign Id = 2, Name = "Factions", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Factions", - Continents = new List - { + Continents = + [ Continent.Cantha - } + ] }; public static Campaign Nightfall { get; } = new() @@ -48,11 +45,11 @@ public sealed class Campaign Id = 3, Name = "Nightfall", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Nightfall", - Continents = new List - { + Continents = + [ Continent.Elona, Continent.RealmOfTorment - } + ] }; public static Campaign EyeOfTheNorth { get; } = new() @@ -60,10 +57,10 @@ public sealed class Campaign Id = 4, Name = "Eye of the North", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Eye_of_the_North", - Continents = new List - { + Continents = + [ Continent.Tyria - } + ] }; public static Campaign BonusMissionPack { get; } = new() @@ -71,23 +68,23 @@ public sealed class Campaign Id = 5, Name = "Bonus Mission Pack", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Bonus_Mission_Pack", - Continents = new List - { + Continents = + [ Continent.Tyria, Continent.Elona, Continent.Cantha - } + ] }; - public static IReadOnlyList Campaigns { get; } = new List - { + public static IReadOnlyList Campaigns { get; } = + [ Core, Prophecies, Factions, Nightfall, EyeOfTheNorth, BonusMissionPack - }; + ]; public static bool TryParse(int id, out Campaign campaign) { diff --git a/Daybreak.Shared/Models/Guildwars/Continent.cs b/Daybreak.Shared/Models/Guildwars/Continent.cs index e788e1e5..275ee2b8 100644 --- a/Daybreak.Shared/Models/Guildwars/Continent.cs +++ b/Daybreak.Shared/Models/Guildwars/Continent.cs @@ -1,8 +1,5 @@ using Daybreak.Shared.Converters; using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; namespace Daybreak.Shared.Models.Guildwars; @@ -14,8 +11,8 @@ public sealed class Continent Id = 0, Name = "Tyria", WikiUrl = "https://wiki.guildwars.com/wiki/Tyria", - Regions = new List - { + Regions = + [ Region.Ascalon, Region.PresearingAscalon, Region.CrystalDesert, @@ -29,7 +26,7 @@ public sealed class Continent Region.TarnishedCoast, Region.TheFlightNorth, Region.TheRiseOfTheWhiteMantle - } + ] }; public static Continent TheMists { get; } = new Continent @@ -37,10 +34,10 @@ public sealed class Continent Id = 1, Name = "The Mists", WikiUrl = "https://wiki.guildwars.com/wiki/The_Mists", - Regions = new List - { + Regions = + [ Region.HeroesAscent - } + ] }; public static Continent Cantha { get; } = new Continent @@ -48,14 +45,14 @@ public sealed class Continent Id = 2, Name = "Cantha", WikiUrl = "https://wiki.guildwars.com/wiki/Cantha", - Regions = new List - { + Regions = + [ Region.ShingJeaIsland, Region.KainengCity, Region.EchovaldForest, Region.TheJadeSea, Region.TheTenguAccords - } + ] }; public static Continent TheBattleIsles { get; } = new Continent @@ -63,10 +60,10 @@ public sealed class Continent Id = 3, Name = "The Battle Isles", WikiUrl = "https://wiki.guildwars.com/wiki/The_Battle_Isles", - Regions = new List - { + Regions = + [ Region.TheBattleIsles, - } + ] }; public static Continent Elona { get; } = new Continent @@ -74,14 +71,14 @@ public sealed class Continent Id = 4, Name = "Elona", WikiUrl = "https://wiki.guildwars.com/wiki/Elona", - Regions = new List - { + Regions = + [ Region.Istan, Region.Kourna, Region.Vabbi, Region.TheDesolation, Region.TheBattleOfJahai - } + ] }; public static Continent RealmOfTorment { get; } = new Continent @@ -89,21 +86,21 @@ public sealed class Continent Id = 5, Name = "Realm of Torment", WikiUrl = "https://wiki.guildwars.com/wiki/Realm_of_Torment", - Regions = new List - { + Regions = + [ Region.RealmOfTorment - } + ] }; - public static IReadOnlyList Continents { get; } = new List - { + public static IReadOnlyList Continents { get; } = + [ Tyria, TheMists, Cantha, TheBattleIsles, Elona, RealmOfTorment - }; + ]; public static bool TryParse(int id, out Continent continent) { diff --git a/Daybreak.Shared/Models/Guildwars/Event.cs b/Daybreak.Shared/Models/Guildwars/Event.cs index 4a426054..69ef5bfc 100644 --- a/Daybreak.Shared/Models/Guildwars/Event.cs +++ b/Daybreak.Shared/Models/Guildwars/Event.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; - -namespace Daybreak.Shared.Models.Guildwars; +namespace Daybreak.Shared.Models.Guildwars; /// /// Seasonal holidays and in-game events, as retrieved from https://www.guildwars.com/en/events. diff --git a/Daybreak.Shared/Models/Guildwars/Hero.cs b/Daybreak.Shared/Models/Guildwars/Hero.cs index 269de8d2..736592f2 100644 --- a/Daybreak.Shared/Models/Guildwars/Hero.cs +++ b/Daybreak.Shared/Models/Guildwars/Hero.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Daybreak.Shared.Models.Guildwars; +namespace Daybreak.Shared.Models.Guildwars; public sealed class Hero : IWikiEntity { public static readonly Hero None = new() { Id = 0, Profession = Profession.None, Name = string.Empty, WikiUrl = string.Empty }; diff --git a/Daybreak.Shared/Models/Guildwars/Inscription.cs b/Daybreak.Shared/Models/Guildwars/Inscription.cs index 0172977d..b7d7366a 100644 --- a/Daybreak.Shared/Models/Guildwars/Inscription.cs +++ b/Daybreak.Shared/Models/Guildwars/Inscription.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace Daybreak.Shared.Models.Guildwars; +namespace Daybreak.Shared.Models.Guildwars; public sealed class Inscription : ItemBase, IWikiEntity, IIconUrlEntity { diff --git a/Daybreak.Shared/Models/Guildwars/ItemBase.cs b/Daybreak.Shared/Models/Guildwars/ItemBase.cs index e1c5f65e..cff19b38 100644 --- a/Daybreak.Shared/Models/Guildwars/ItemBase.cs +++ b/Daybreak.Shared/Models/Guildwars/ItemBase.cs @@ -1,8 +1,5 @@ using Daybreak.Shared.Converters; using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; namespace Daybreak.Shared.Models.Guildwars; diff --git a/Daybreak.Shared/Models/Guildwars/Map.cs b/Daybreak.Shared/Models/Guildwars/Map.cs index 9a2b17f9..37c80447 100644 --- a/Daybreak.Shared/Models/Guildwars/Map.cs +++ b/Daybreak.Shared/Models/Guildwars/Map.cs @@ -1,8 +1,5 @@ using Daybreak.Shared.Converters; using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; namespace Daybreak.Shared.Models.Guildwars; @@ -716,8 +713,8 @@ public sealed class Map : IWikiEntity public static readonly Map AshfordCatacombs1070AE = new() { Id = 876, Name = "Ashford Catacombs 1070AE", WikiUrl = "https://wiki.guildwars.com/wiki/Ashford_Catacombs:_1070_AE" }; public static readonly Map Count = new() { Id = 877, Name = "Count", WikiUrl = "" }; - public static IEnumerable Maps { get; } = new List - { + public static IEnumerable Maps { get; } = + [ None, GladiatorsArena, DEVTestArena1v1, @@ -1419,7 +1416,7 @@ public sealed class Map : IWikiEntity LakesideCounty1070AE, AshfordCatacombs1070AE, Count, - }; + ]; public static bool TryParse(int id, out Map map) { diff --git a/Daybreak.Shared/Models/Guildwars/Material.cs b/Daybreak.Shared/Models/Guildwars/Material.cs index aa155e0d..809a792c 100644 --- a/Daybreak.Shared/Models/Guildwars/Material.cs +++ b/Daybreak.Shared/Models/Guildwars/Material.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace Daybreak.Shared.Models.Guildwars; +namespace Daybreak.Shared.Models.Guildwars; public sealed class Material : ItemBase, IWikiEntity { @@ -42,8 +40,8 @@ public sealed class Material : ItemBase, IWikiEntity public static readonly Material TemperedGlassVial = new() { Id = 939, Name = "Tempered Glass Vial", Multiple = "Tempered Glass Vials", WikiUrl = "https://wiki.guildwars.com/wiki/Tempered_Glass_Vial" }; public static readonly Material VialOfInk = new() { Id = 944, Name = "Vial of Ink", Multiple = "Vials of Ink", WikiUrl = "https://wiki.guildwars.com/wiki/Vial_of_Ink" }; - public static IReadOnlyList Common { get; } = new List - { + public static IReadOnlyList Common { get; } = + [ Bone, BoltOfCloth, PileOfGlitteringDust, @@ -55,9 +53,9 @@ public sealed class Material : ItemBase, IWikiEntity Scale, ChitinFragment, GraniteSlab - }; - public static IReadOnlyList Rare { get; } = new List - { + ]; + public static IReadOnlyList Rare { get; } = + [ AmberChunk, BoltOfDamask, BoltOfLinen, @@ -83,9 +81,9 @@ public sealed class Material : ItemBase, IWikiEntity SteelIngot, TemperedGlassVial, VialOfInk - }; - public static IReadOnlyList All { get; } = new List - { + ]; + public static IReadOnlyList All { get; } = + [ Bone, BoltOfCloth, PileOfGlitteringDust, @@ -122,7 +120,7 @@ public sealed class Material : ItemBase, IWikiEntity SteelIngot, TemperedGlassVial, VialOfInk - }; + ]; public string? Multiple { get; init; } public string? WikiUrl { get; init; } diff --git a/Daybreak.Shared/Models/Guildwars/Npc.cs b/Daybreak.Shared/Models/Guildwars/Npc.cs index f398e1d3..62d943f4 100644 --- a/Daybreak.Shared/Models/Guildwars/Npc.cs +++ b/Daybreak.Shared/Models/Guildwars/Npc.cs @@ -1,8 +1,5 @@ using Daybreak.Shared.Converters; using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; namespace Daybreak.Shared.Models.Guildwars; @@ -10,1499 +7,1499 @@ namespace Daybreak.Shared.Models.Guildwars; [JsonConverter(typeof(NpcJsonConverter))] public sealed class Npc { - public static readonly Npc Unknown = new() { Ids = new int[] { 0 }, Name = "Unknown" }; - public static readonly Npc RitualPriest = new() { Ids = new int[] { 94, 2831 }, Name = "Ritual Priest" }; - public static readonly Npc CanthanGuard = new() { Ids = new int[] { 107, 188, 3064, 3096, 3228, 3234, 3235, 3237 }, Name = "Canthan Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Guard" }; - public static readonly Npc ZaishenRepresentative = new() { Ids = new int[] { 111 }, Name = "Zaishen Representative", WikiUrl = "https://wiki.guildwars.com/wiki/Zaishen_Representative" }; - public static readonly Npc CanthanAmbassador = new() { Ids = new int[] { 216 }, Name = "Canthan Ambassador", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Ambassador" }; - public static readonly Npc PriestOfBalthazar = new() { Ids = new int[] { 218 }, Name = "Priest Of Balthazar", WikiUrl = "https://wiki.guildwars.com/wiki/Priest_of_Balthazar" }; - public static readonly Npc Tolkano = new() { Ids = new int[] { 219 }, Name = "Tolkano", WikiUrl = "https://wiki.guildwars.com/wiki/Tolkano" }; - public static readonly Npc XunlaiAgent = new() { Ids = new int[] { 220, 221, 3287 }, Name = "Xunlai Agent", WikiUrl = "https://wiki.guildwars.com/wiki/Xunlai_Agent" }; - public static readonly Npc VabbianCommoner = new() { Ids = new int[] { 224, 5659, 5662, 5661, 5653, 5656, 5657 }, Name = "Vabbian Commoner", WikiUrl = "https://wiki.guildwars.com/wiki/Vabbian_Commoner" }; - public static readonly Npc VabbianArtisan = new() { Ids = new int[] { 1202 }, Name = "Vabbian Artisan", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Vabbians" }; - public static readonly Npc AbaddonsCursed = new() { Ids = new int[] { 1338 }, Name = "Abaddon's Cursed", WikiUrl = "https://wiki.guildwars.com/wiki/Abaddon%27s_Cursed" }; - public static readonly Npc Lynx = new() { Ids = new int[] { 1342, 8029 }, Name = "Lynx", WikiUrl = "https://wiki.guildwars.com/wiki/Lynx" }; - public static readonly Npc Strider = new() { Ids = new int[] { 1343 }, Name = "Strider", WikiUrl = "https://wiki.guildwars.com/wiki/Strider" }; - public static readonly Npc MelandrusStalker = new() { Ids = new int[] { 1345 }, Name = "Melandru's Stalker", WikiUrl = "https://wiki.guildwars.com/wiki/Melandru%27s_Stalker" }; - public static readonly Npc Wolf = new() { Ids = new int[] { 1346 }, Name = "Wolf", WikiUrl = "https://wiki.guildwars.com/wiki/Wolf" }; - public static readonly Npc Warthog = new() { Ids = new int[] { 1347, 1348 }, Name = "Warthog", WikiUrl = "https://wiki.guildwars.com/wiki/Warthog" }; - public static readonly Npc BlackBear = new() { Ids = new int[] { 1349, 1352 }, Name = "Black Bear", WikiUrl = "https://wiki.guildwars.com/wiki/Black_Bear" }; - public static readonly Npc DuneLizard = new() { Ids = new int[] { 1351 }, Name = "Dune Lizard", WikiUrl = "https://wiki.guildwars.com/wiki/Dune_Lizard" }; - public static readonly Npc MossSpider = new() { Ids = new int[] { 1354, 2316 }, Name = "Moss Spider", WikiUrl = "https://wiki.guildwars.com/wiki/Moss_Spider" }; - public static readonly Npc MoaBird = new() { Ids = new int[] { 1393, 1344 }, Name = "Moa Bird", WikiUrl = "https://wiki.guildwars.com/wiki/Moa_Bird" }; - public static readonly Npc PrizeWinningHog = new() { Ids = new int[] { 1399 }, Name = "Prize-Winning Hog", WikiUrl = "https://wiki.guildwars.com/wiki/Prize-Winning_Hog" }; - public static readonly Npc GiantNeedleSpider = new() { Ids = new int[] { 1401 }, Name = "Giant Needle Spider", WikiUrl = "https://wiki.guildwars.com/wiki/Giant_Needle_Spider" }; - public static readonly Npc DeadlyCryptSpider = new() { Ids = new int[] { 1402 }, Name = "Deadly Crypt Spider", WikiUrl = "https://wiki.guildwars.com/wiki/Deadly_Crypt_Spider" }; - public static readonly Npc GiantTreeSpider = new() { Ids = new int[] { 1403 }, Name = "Giant Tree Spider", WikiUrl = "https://wiki.guildwars.com/wiki/Giant_Tree_Spider" }; - public static readonly Npc CarrionDevourer = new() { Ids = new int[] { 1405 }, Name = "Carrion Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Carrion_Devourer" }; - public static readonly Npc SnappingDevourer = new() { Ids = new int[] { 1406 }, Name = "Snapping Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Snapping_Devourer" }; - public static readonly Npc DiseasedDevourer = new() { Ids = new int[] { 1408 }, Name = "Diseased Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Diseased_Devourer" }; - public static readonly Npc LashDevourer = new() { Ids = new int[] { 1409 }, Name = "Lash Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Lash_Devourer" }; - public static readonly Npc IceElemental = new() { Ids = new int[] { 1412 }, Name = "Ice Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Ice_Elemental" }; - public static readonly Npc StoneElemental = new() { Ids = new int[] { 1414 }, Name = "Stone Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Elemental" }; - public static readonly Npc HulkingStoneElemental = new() { Ids = new int[] { 1415 }, Name = "Hulking Stone Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Hulking_Stone_Elemental" }; - public static readonly Npc Gargoyle = new() { Ids = new int[] { 1417 }, Name = "Gargoyle", WikiUrl = "https://wiki.guildwars.com/wiki/Gargoyle" }; - public static readonly Npc ShatterGargoyle = new() { Ids = new int[] { 1418, 2445 }, Name = "Shatter Gargoyle", WikiUrl = "https://wiki.guildwars.com/wiki/Shatter_Gargoyle" }; - public static readonly Npc BanditFirestarter = new() { Ids = new int[] { 1420 }, Name = "Bandit Firestarter", WikiUrl = "https://wiki.guildwars.com/wiki/Bandit_Firestarter" }; - public static readonly Npc BanditRaider = new() { Ids = new int[] { 1421 }, Name = "Bandit Raider", WikiUrl = "https://wiki.guildwars.com/wiki/Bandit_Raider" }; - public static readonly Npc BanditBloodSworn = new() { Ids = new int[] { 1422 }, Name = "Bandit Blood Sworn", WikiUrl = "https://wiki.guildwars.com/wiki/Bandit_Blood_Sworn" }; - public static readonly Npc NightmareNecromancer = new() { Ids = new int[] { 1424 }, Name = "Nightmare Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Nightmare" }; - public static readonly Npc AloeHusk = new() { Ids = new int[] { 1426 }, Name = "Aloe Husk", WikiUrl = "https://wiki.guildwars.com/wiki/Aloe_Husk" }; - public static readonly Npc LargeAloeSeed = new() { Ids = new int[] { 1427 }, Name = "Large Aloe Seed", WikiUrl = "https://wiki.guildwars.com/wiki/Large_Aloe_Seed" }; - public static readonly Npc AloeSeed = new() { Ids = new int[] { 1428 }, Name = "Aloe Seed", WikiUrl = "https://wiki.guildwars.com/wiki/Aloe_Seed" }; - public static readonly Npc Oakheart = new() { Ids = new int[] { 1429, 1733 }, Name = "Oakheart", WikiUrl = "https://wiki.guildwars.com/wiki/Oakheart" }; - public static readonly Npc RiverSkale = new() { Ids = new int[] { 1430 }, Name = "River Skale", WikiUrl = "https://wiki.guildwars.com/wiki/River_Skale" }; - public static readonly Npc SkaleBroodcaller = new() { Ids = new int[] { 1431 }, Name = "Skale Broodcaller", WikiUrl = "https://wiki.guildwars.com/wiki/Skale_Broodcaller" }; - public static readonly Npc RiverSkaleTad = new() { Ids = new int[] { 1432 }, Name = "River Skale Tad", WikiUrl = "https://wiki.guildwars.com/wiki/River_Skale_Tad" }; - public static readonly Npc GrawlInvader = new() { Ids = new int[] { 1436 }, Name = "Grawl Invader", WikiUrl = "https://wiki.guildwars.com/wiki/Grawl_Invader" }; - public static readonly Npc GrawlLongspear = new() { Ids = new int[] { 1437 }, Name = "Grawl Longspear", WikiUrl = "https://wiki.guildwars.com/wiki/Grawl_Longspear" }; - public static readonly Npc GrawlShaman = new() { Ids = new int[] { 1438 }, Name = "Grawl Shaman", WikiUrl = "https://wiki.guildwars.com/wiki/Grawl_Shaman" }; - public static readonly Npc RedEyeTheUnholy = new() { Ids = new int[] { 1448 }, Name = "Red Eye The Unholy", WikiUrl = "https://wiki.guildwars.com/wiki/Red_Eye_the_Unholy" }; - public static readonly Npc JawSmokeskin = new() { Ids = new int[] { 1449 }, Name = "Jaw Smokeskin", WikiUrl = "https://wiki.guildwars.com/wiki/Jaw_Smokeskin" }; - public static readonly Npc BlazeBloodbane = new() { Ids = new int[] { 1450 }, Name = "Blaze Bloodbane", WikiUrl = "https://wiki.guildwars.com/wiki/Blaze_Bloodbane" }; - public static readonly Npc Haversdan = new() { Ids = new int[] { 1455 }, Name = "Haversdan", WikiUrl = "https://wiki.guildwars.com/wiki/Haversdan" }; - public static readonly Npc WarmasterTydus = new() { Ids = new int[] { 1456, 2856, 2097 }, Name = "Warmaster Tydus", WikiUrl = "https://wiki.guildwars.com/wiki/Warmaster_Tydus" }; - public static readonly Npc AscalonNoble = new() { Ids = new int[] { 1461, 2083 }, Name = "Ascalon Noble", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; - public static readonly Npc AscalonianGuard = new() { Ids = new int[] { 1464, 2091 }, Name = "Ascalonian Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalonian_Guard" }; - public static readonly Npc AscalonMesmer = new() { Ids = new int[] { 1466, 1644 }, Name = "Ascalon Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; - public static readonly Npc AscalonMerchant = new() { Ids = new int[] { 1467, 1480, 2090 }, Name = "Ascalon Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; - public static readonly Npc AscalonCrafter = new() { Ids = new int[] { 1468 }, Name = "Ascalon Crafter", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; - public static readonly Npc AscalonNecromancer = new() { Ids = new int[] { 1469, 1470 }, Name = "Ascalon Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; - public static readonly Npc RalenaStormbringer = new() { Ids = new int[] { 1471 }, Name = "Ralena Stormbringer", WikiUrl = "https://wiki.guildwars.com/wiki/Ralena_Stormbringer" }; - public static readonly Npc AscalonMonk = new() { Ids = new int[] { 1474 }, Name = "Ascalon Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; - public static readonly Npc AscalonBrawler = new() { Ids = new int[] { 1475 }, Name = "Ascalon Brawler", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; - public static readonly Npc AscalonGuard = new() { Ids = new int[] { 1477, 7758 }, Name = "Ascalon Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalon_Guard" }; - public static readonly Npc AscalonianFarmer = new() { Ids = new int[] { 1479, 2070 }, Name = "Ascalonian Farmer", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalonian_Farmer" }; - public static readonly Npc AscalonTamer = new() { Ids = new int[] { 1482 }, Name = "Ascalon Tamer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; - public static readonly Npc AcademyMonk = new() { Ids = new int[] { 1483, 1484, 6028 }, Name = "Academy Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Academy_Monk" }; - public static readonly Npc AscalonianTownsfolk = new() { Ids = new int[] { 1485, 1487 }, Name = "Ascalonian Townsfolk", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalonian_Townsfolk" }; - public static readonly Npc AscalonianPeasant = new() { Ids = new int[] { 1488, 1490 }, Name = "Ascalonian Peasant", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalonian_Peasant" }; - public static readonly Npc Krytan = new() { Ids = new int[] { 1492, 1960, 1964, 1966, 1967, 1991, 2008, 2009, 2020, 2032, 2049, 2120, 2858, 2867, 2869, 2095 }, Name = "Krytan", WikiUrl = "https://wiki.guildwars.com/wiki/Krytan" }; - public static readonly Npc Gwen = new() { Ids = new int[] { 1493, 1494, 5966, 5970 }, Name = "Gwen", WikiUrl = "https://wiki.guildwars.com/wiki/Gwen" }; - public static readonly Npc FarrahCappo = new() { Ids = new int[] { 1497, 2863, 2138 }, Name = "Farrah Cappo", WikiUrl = "https://wiki.guildwars.com/wiki/Farrah_Cappo" }; - public static readonly Npc Cynn = new() { Ids = new int[] { 1501, 1924, 2128, 2853, 3489, 4565, 4575, 5988, 4585 }, Name = "Cynn", WikiUrl = "https://wiki.guildwars.com/wiki/Cynn" }; - public static readonly Npc Devona = new() { Ids = new int[] { 1502, 1932, 2132, 2854, 3492, 3509, 4569, 4579, 5993, 4589 }, Name = "Devona", WikiUrl = "https://wiki.guildwars.com/wiki/Devona" }; - public static readonly Npc AscalonDuke = new() { Ids = new int[] { 1504, 1511 }, Name = "Ascalon Duke", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; - public static readonly Npc PrinceRurik = new() { Ids = new int[] { 1505 }, Name = "Prince Rurik", WikiUrl = "https://wiki.guildwars.com/wiki/Prince_Rurik" }; - public static readonly Npc LadyAlthea = new() { Ids = new int[] { 1507 }, Name = "Lady Althea", WikiUrl = "https://wiki.guildwars.com/wiki/Lady_Althea" }; - public static readonly Npc NecromancerMunne = new() { Ids = new int[] { 1508 }, Name = "Necromancer Munne", WikiUrl = "https://wiki.guildwars.com/wiki/Necromancer_Munne" }; - public static readonly Npc ElementalistAziure = new() { Ids = new int[] { 1509 }, Name = "Elementalist Aziure", WikiUrl = "https://wiki.guildwars.com/wiki/Elementalist_Aziure" }; - public static readonly Npc AscalonRanger = new() { Ids = new int[] { 1512, 1513, 1481 }, Name = "Ascalon Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalon_Ranger" }; - public static readonly Npc Skullreaver = new() { Ids = new int[] { 1514 }, Name = "Skullreaver", WikiUrl = "https://wiki.guildwars.com/wiki/Skullreaver" }; - public static readonly Npc RestlessCorpse = new() { Ids = new int[] { 1515 }, Name = "Restless Corpse", WikiUrl = "https://wiki.guildwars.com/wiki/Restless_Corpse" }; - public static readonly Npc RagingCadaver = new() { Ids = new int[] { 1517 }, Name = "Raging Cadaver", WikiUrl = "https://wiki.guildwars.com/wiki/Raging_Cadaver" }; - public static readonly Npc Ventari = new() { Ids = new int[] { 1519 }, Name = "Ventari", WikiUrl = "https://wiki.guildwars.com/wiki/Ventari" }; - public static readonly Npc ShiningBladeScout = new() { Ids = new int[] { 1520 }, Name = "Shining Blade Scout", WikiUrl = "https://wiki.guildwars.com/wiki/Shining_Blade_Scout" }; - public static readonly Npc Evennia = new() { Ids = new int[] { 1521, 1530, 2841 }, Name = "Evennia", WikiUrl = "https://wiki.guildwars.com/wiki/Evennia" }; - public static readonly Npc Saidra = new() { Ids = new int[] { 1528 }, Name = "Saidra", WikiUrl = "https://wiki.guildwars.com/wiki/Saidra" }; - public static readonly Npc ShiningBladeMesmer = new() { Ids = new int[] { 1532 }, Name = "Shining Blade Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Shining_Blade_Mesmer" }; - public static readonly Npc ShiningBladeNecromancer = new() { Ids = new int[] { 1533 }, Name = "Shining Blade Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Shining_Blade_Necromancer" }; - public static readonly Npc ShiningBladeElementalist = new() { Ids = new int[] { 1534 }, Name = "Shining Blade Elementalist", WikiUrl = "https://wiki.guildwars.com/wiki/Shining_Blade_Elementalist" }; - public static readonly Npc GarethQuickblade = new() { Ids = new int[] { 1536 }, Name = "Gareth Quickblade", WikiUrl = "https://wiki.guildwars.com/wiki/Gareth_Quickblade" }; - public static readonly Npc ShiningBladeWarrior = new() { Ids = new int[] { 1538, 1996, 2039 }, Name = "Shining Blade Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Shining_Blade_Warrior" }; - public static readonly Npc AlariDoubleblade = new() { Ids = new int[] { 1539 }, Name = "Alari Doubleblade", WikiUrl = "https://wiki.guildwars.com/wiki/Alari_Doubleblade" }; - public static readonly Npc ShiningBladeRanger = new() { Ids = new int[] { 1541, 2045 }, Name = "Shining Blade Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Shining_Blade_Ranger" }; - public static readonly Npc DwarvenSmith = new() { Ids = new int[] { 1548 }, Name = "Dwarven Smith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Dwarves" }; - public static readonly Npc DeldrimorCaster = new() { Ids = new int[] { 1550, 1552, 6214, 2109 }, Name = "Deldrimor Caster" }; - public static readonly Npc DeldrimorWarrior = new() { Ids = new int[] { 1553, 1555, 1556, 2840, 6180, 6215, 6216 }, Name = "Deldrimor Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Dwarves" }; - public static readonly Npc DwarvenSoldier = new() { Ids = new int[] { 1554, 1569 }, Name = "Dwarven Soldier", WikiUrl = "https://wiki.guildwars.com/wiki/Dwarven_Soldier" }; - public static readonly Npc DeldrimorRanger = new() { Ids = new int[] { 1557, 1558, 6271 }, Name = "Deldrimor Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Dwarves" }; - public static readonly Npc KingJalisIronhammer = new() { Ids = new int[] { 1562, 2839 }, Name = "King Jalis Ironhammer", WikiUrl = "https://wiki.guildwars.com/wiki/King_Jalis_Ironhammer" }; - public static readonly Npc BrechnarIronhammer = new() { Ids = new int[] { 1564 }, Name = "Brechnar Ironhammer", WikiUrl = "https://wiki.guildwars.com/wiki/Brechnar_Ironhammer" }; - public static readonly Npc DwarvenSage = new() { Ids = new int[] { 1565 }, Name = "Dwarven Sage", WikiUrl = "https://wiki.guildwars.com/wiki/Dwarven_Sage" }; - public static readonly Npc DwarvenScout = new() { Ids = new int[] { 1567 }, Name = "Dwarven Scout", WikiUrl = "https://wiki.guildwars.com/wiki/Dwarven_Scout" }; - public static readonly Npc CharrChaot = new() { Ids = new int[] { 1635 }, Name = "Charr Chaot", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Chaot" }; - public static readonly Npc CharrAshenClaw = new() { Ids = new int[] { 1638 }, Name = "Charr Ashen Claw", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Ashen_Claw" }; - public static readonly Npc CharrShaman = new() { Ids = new int[] { 1646, 5711, 4972 }, Name = "Charr Shaman", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Shaman" }; - public static readonly Npc CharrAxeFiend = new() { Ids = new int[] { 1651, 7802 }, Name = "Charr Axe Fiend", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Axe_Fiend" }; - public static readonly Npc CharrBladeStorm = new() { Ids = new int[] { 1653 }, Name = "Charr Blade Storm", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Blade_Storm" }; - public static readonly Npc CharrHunter = new() { Ids = new int[] { 1656 }, Name = "Charr Hunter", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Hunter" }; - public static readonly Npc SquawNimblecrest = new() { Ids = new int[] { 1685 }, Name = "Squaw Nimblecrest", WikiUrl = "https://wiki.guildwars.com/wiki/Squaw_Nimblecrest" }; - public static readonly Npc GypsieEttin = new() { Ids = new int[] { 1715 }, Name = "Gypsie Ettin", WikiUrl = "https://wiki.guildwars.com/wiki/Gypsie_Ettin" }; - public static readonly Npc HillGiant = new() { Ids = new int[] { 1724 }, Name = "Hill Giant", WikiUrl = "https://wiki.guildwars.com/wiki/Hill_Giant" }; - public static readonly Npc InfernoImp = new() { Ids = new int[] { 1725 }, Name = "Inferno Imp", WikiUrl = "https://wiki.guildwars.com/wiki/Inferno_Imp" }; - public static readonly Npc FireImp = new() { Ids = new int[] { 1726 }, Name = "Fire Imp", WikiUrl = "https://wiki.guildwars.com/wiki/Fire_Imp" }; - public static readonly Npc BogSkale = new() { Ids = new int[] { 1737 }, Name = "Bog Skale", WikiUrl = "https://wiki.guildwars.com/wiki/Bog_Skale" }; - public static readonly Npc CaromiTenguWild = new() { Ids = new int[] { 1739 }, Name = "Caromi Tengu Wild", WikiUrl = "https://wiki.guildwars.com/wiki/Caromi_Tengu_Wild" }; - public static readonly Npc CaromiTenguBrave = new() { Ids = new int[] { 1741, 1744 }, Name = "Caromi Tengu Brave", WikiUrl = "https://wiki.guildwars.com/wiki/Caromi_Tengu_Brave" }; - public static readonly Npc CaromiTenguScout = new() { Ids = new int[] { 1746 }, Name = "Caromi Tengu Scout", WikiUrl = "https://wiki.guildwars.com/wiki/Caromi_Tengu_Scout" }; - public static readonly Npc TrechSchmoogle = new() { Ids = new int[] { 1754 }, Name = "Trech Schmoogle", WikiUrl = "https://wiki.guildwars.com/wiki/Trech_Schmoogle" }; - public static readonly Npc CootleSizzlehorn = new() { Ids = new int[] { 1756 }, Name = "Cootle Sizzlehorn", WikiUrl = "https://wiki.guildwars.com/wiki/Cootle_Sizzlehorn" }; - public static readonly Npc MinaBrillianthaunch = new() { Ids = new int[] { 1770 }, Name = "Mina Brillianthaunch", WikiUrl = "https://wiki.guildwars.com/wiki/Mina_Brillianthaunch" }; - public static readonly Npc AguoGruffmane = new() { Ids = new int[] { 1771 }, Name = "Aguo Gruffmane", WikiUrl = "https://wiki.guildwars.com/wiki/Aguo_Gruffmane" }; - public static readonly Npc ShegZamnMada = new() { Ids = new int[] { 1775 }, Name = "Sheg Zamn Mada", WikiUrl = "https://wiki.guildwars.com/wiki/Sheg_Zamn_Mada" }; - public static readonly Npc VisionOfGlint = new() { Ids = new int[] { 1779 }, Name = "Vision Of Glint", WikiUrl = "https://wiki.guildwars.com/wiki/Vision_of_Glint" }; - public static readonly Npc GhostlyHero = new() { Ids = new int[] { 1781, 1782 }, Name = "Ghostly Hero", WikiUrl = "https://wiki.guildwars.com/wiki/Ghostly_Hero" }; - public static readonly Npc StormKin = new() { Ids = new int[] { 1785 }, Name = "Storm Kin", WikiUrl = "https://wiki.guildwars.com/wiki/Storm_Kin" }; - public static readonly Npc DuneBurrower = new() { Ids = new int[] { 1786 }, Name = "Dune Burrower", WikiUrl = "https://wiki.guildwars.com/wiki/Dune_Burrower" }; - public static readonly Npc LosaruWindcaster = new() { Ids = new int[] { 1787 }, Name = "Losaru Windcaster", WikiUrl = "https://wiki.guildwars.com/wiki/Losaru_Windcaster" }; - public static readonly Npc LosaruLifeband = new() { Ids = new int[] { 1788 }, Name = "Losaru Lifeband", WikiUrl = "https://wiki.guildwars.com/wiki/Losaru_Lifeband" }; - public static readonly Npc LosaruBladehand = new() { Ids = new int[] { 1789 }, Name = "Losaru Bladehand", WikiUrl = "https://wiki.guildwars.com/wiki/Losaru_Bladehand" }; - public static readonly Npc LosaruBowmaster = new() { Ids = new int[] { 1790 }, Name = "Losaru Bowmaster", WikiUrl = "https://wiki.guildwars.com/wiki/Losaru_Bowmaster" }; - public static readonly Npc SandElemental = new() { Ids = new int[] { 1791 }, Name = "Sand Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Sand_Elemental" }; - public static readonly Npc RockshotDevourer = new() { Ids = new int[] { 1792 }, Name = "Rockshot Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Rockshot_Devourer" }; - public static readonly Npc SandDrake = new() { Ids = new int[] { 1793 }, Name = "Sand Drake", WikiUrl = "https://wiki.guildwars.com/wiki/Sand_Drake" }; - public static readonly Npc DesertGriffon = new() { Ids = new int[] { 1794 }, Name = "Desert Griffon", WikiUrl = "https://wiki.guildwars.com/wiki/Desert_Griffon" }; - public static readonly Npc Hydra = new() { Ids = new int[] { 1796, 2438 }, Name = "Hydra", WikiUrl = "https://wiki.guildwars.com/wiki/Hydra" }; - public static readonly Npc Minotaur = new() { Ids = new int[] { 1797, 2493, 2486 }, Name = "Minotaur", WikiUrl = "https://wiki.guildwars.com/wiki/Minotaur" }; - public static readonly Npc JadeScarab = new() { Ids = new int[] { 1799 }, Name = "Jade Scarab", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Scarab" }; - public static readonly Npc RockEaterScarab = new() { Ids = new int[] { 1800 }, Name = "Rock-Eater Scarab", WikiUrl = "https://wiki.guildwars.com/wiki/Rock-Eater_Scarab" }; - public static readonly Npc SiegeWurm = new() { Ids = new int[] { 1802 }, Name = "Siege Wurm", WikiUrl = "https://wiki.guildwars.com/wiki/Siege_Wurm" }; - public static readonly Npc SandGiant = new() { Ids = new int[] { 1803 }, Name = "Sand Giant", WikiUrl = "https://wiki.guildwars.com/wiki/Sand_Giant" }; - public static readonly Npc MarrowScarab = new() { Ids = new int[] { 1810 }, Name = "Marrow Scarab", WikiUrl = "https://wiki.guildwars.com/wiki/Marrow_Scarab" }; - public static readonly Npc ScarabNestBuilder = new() { Ids = new int[] { 1811 }, Name = "Scarab Nest Builder", WikiUrl = "https://wiki.guildwars.com/wiki/Scarab_Nest_Builder" }; - public static readonly Npc AyassahHess = new() { Ids = new int[] { 1835 }, Name = "Ayassah Hess", WikiUrl = "https://wiki.guildwars.com/wiki/Ayassah_Hess" }; - public static readonly Npc BysshaHisst = new() { Ids = new int[] { 1836 }, Name = "Byssha Hisst", WikiUrl = "https://wiki.guildwars.com/wiki/Byssha_Hisst" }; - public static readonly Npc CyssGresshla = new() { Ids = new int[] { 1837 }, Name = "Cyss Gresshla", WikiUrl = "https://wiki.guildwars.com/wiki/Cyss_Gresshla" }; - public static readonly Npc CustodianKora = new() { Ids = new int[] { 1840 }, Name = "Custodian Kora", WikiUrl = "https://wiki.guildwars.com/wiki/Custodian_Kora" }; - public static readonly Npc GossAleessh = new() { Ids = new int[] { 1841 }, Name = "Goss Aleessh", WikiUrl = "https://wiki.guildwars.com/wiki/Goss_Aleessh" }; - public static readonly Npc HessperSasso = new() { Ids = new int[] { 1842 }, Name = "Hessper Sasso", WikiUrl = "https://wiki.guildwars.com/wiki/Hessper_Sasso" }; - public static readonly Npc IssahSshay = new() { Ids = new int[] { 1843 }, Name = "Issah Sshay", WikiUrl = "https://wiki.guildwars.com/wiki/Issah_Sshay" }; - public static readonly Npc JossoEssher = new() { Ids = new int[] { 1844 }, Name = "Josso Essher", WikiUrl = "https://wiki.guildwars.com/wiki/Josso_Essher" }; - public static readonly Npc CustodianHulgar = new() { Ids = new int[] { 1845 }, Name = "Custodian Hulgar", WikiUrl = "https://wiki.guildwars.com/wiki/Custodian_Hulgar" }; - public static readonly Npc CustodianPhebus = new() { Ids = new int[] { 1846 }, Name = "Custodian Phebus", WikiUrl = "https://wiki.guildwars.com/wiki/Custodian_Phebus" }; - public static readonly Npc FacetOfDarkness = new() { Ids = new int[] { 1848 }, Name = "Facet Of Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/Facet_of_Darkness" }; - public static readonly Npc TissDanssir = new() { Ids = new int[] { 1853 }, Name = "Tiss Danssir", WikiUrl = "https://wiki.guildwars.com/wiki/Tiss_Danssir" }; - public static readonly Npc UusshVisshta = new() { Ids = new int[] { 1854 }, Name = "Uussh Visshta", WikiUrl = "https://wiki.guildwars.com/wiki/Uussh_Visshta" }; - public static readonly Npc VassaSsiss = new() { Ids = new int[] { 1855 }, Name = "Vassa Ssiss", WikiUrl = "https://wiki.guildwars.com/wiki/Vassa_Ssiss" }; - public static readonly Npc WissperInssani = new() { Ids = new int[] { 1856 }, Name = "Wissper Inssani", WikiUrl = "https://wiki.guildwars.com/wiki/Wissper_Inssani" }; - public static readonly Npc CustodianDellus = new() { Ids = new int[] { 1857 }, Name = "Custodian Dellus", WikiUrl = "https://wiki.guildwars.com/wiki/Custodian_Dellus" }; - public static readonly Npc CustodianJenus = new() { Ids = new int[] { 1858 }, Name = "Custodian Jenus", WikiUrl = "https://wiki.guildwars.com/wiki/Custodian_Jenus" }; - public static readonly Npc ForgottenCursebearer = new() { Ids = new int[] { 1862 }, Name = "Forgotten Cursebearer", WikiUrl = "https://wiki.guildwars.com/wiki/Forgotten_Cursebearer" }; - public static readonly Npc ForgottenArcanist = new() { Ids = new int[] { 1863 }, Name = "Forgotten Arcanist", WikiUrl = "https://wiki.guildwars.com/wiki/Forgotten_Arcanist" }; - public static readonly Npc ForgottenSage = new() { Ids = new int[] { 1864 }, Name = "Forgotten Sage", WikiUrl = "https://wiki.guildwars.com/wiki/Forgotten_Sage" }; - public static readonly Npc EnchantedHammer = new() { Ids = new int[] { 1865 }, Name = "Enchanted Hammer", WikiUrl = "https://wiki.guildwars.com/wiki/Enchanted_Hammer" }; - public static readonly Npc EnchantedSword = new() { Ids = new int[] { 1866, 6869 }, Name = "Enchanted Sword", WikiUrl = "https://wiki.guildwars.com/wiki/Enchanted_Sword" }; - public static readonly Npc EnchantedBow = new() { Ids = new int[] { 1867 }, Name = "Enchanted Bow", WikiUrl = "https://wiki.guildwars.com/wiki/Enchanted_Bow" }; - public static readonly Npc EnemyPriest = new() { Ids = new int[] { 1871 }, Name = "Enemy Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Enemy_Priest" }; - public static readonly Npc ForgottenChampion = new() { Ids = new int[] { 1872 }, Name = "Forgotten Champion", WikiUrl = "https://wiki.guildwars.com/wiki/Forgotten_Champion" }; - public static readonly Npc ForgottenAvenger = new() { Ids = new int[] { 1873 }, Name = "Forgotten Avenger", WikiUrl = "https://wiki.guildwars.com/wiki/Forgotten_Avenger" }; - public static readonly Npc Forgotten = new() { Ids = new int[] { 1874, 5002 }, Name = "Forgotten", WikiUrl = "https://wiki.guildwars.com/wiki/Forgotten" }; - public static readonly Npc Dunham = new() { Ids = new int[] { 1890, 1897, 1904, 1911, 1919, 1920, 2847 }, Name = "Dunham", WikiUrl = "https://wiki.guildwars.com/wiki/Dunham" }; - public static readonly Npc Claude = new() { Ids = new int[] { 1891, 1898, 1905, 1912, 1921, 2848 }, Name = "Claude", WikiUrl = "https://wiki.guildwars.com/wiki/Claude" }; - public static readonly Npc Orion = new() { Ids = new int[] { 1892, 1899, 1906, 1913, 1923, 2849, 1885, 1879, 1875 }, Name = "Orion", WikiUrl = "https://wiki.guildwars.com/wiki/Orion" }; - public static readonly Npc Alesia = new() { Ids = new int[] { 1893, 1900, 1907, 1914, 1925, 2850, 1886, 1880, 1876 }, Name = "Alesia", WikiUrl = "https://wiki.guildwars.com/wiki/Alesia" }; - public static readonly Npc LittleThom = new() { Ids = new int[] { 1894, 1901, 1908, 1916, 1929, 1930, 2844 }, Name = "Little Thom", WikiUrl = "https://wiki.guildwars.com/wiki/Little_Thom" }; - public static readonly Npc Stefan = new() { Ids = new int[] { 1895, 1902, 1909, 1917, 1931, 2845, 1888, 1881, 1877 }, Name = "Stefan", WikiUrl = "https://wiki.guildwars.com/wiki/Stefan" }; - public static readonly Npc Reyna = new() { Ids = new int[] { 1896, 1903, 1910, 1918, 1933, 2846, 1889, 1882, 1878 }, Name = "Reyna", WikiUrl = "https://wiki.guildwars.com/wiki/Reyna" }; - public static readonly Npc Lina = new() { Ids = new int[] { 1915, 1927, 1928, 2851, 5991 }, Name = "Lina", WikiUrl = "https://wiki.guildwars.com/wiki/Lina" }; - public static readonly Npc Eve = new() { Ids = new int[] { 1922, 2873, 3488, 4564, 4574, 5987, 4584 }, Name = "Eve", WikiUrl = "https://wiki.guildwars.com/wiki/Eve" }; - public static readonly Npc Mhenlo = new() { Ids = new int[] { 1926, 2136, 2855, 3121, 4577, 5990, 4587, 1503 }, Name = "Mhenlo", WikiUrl = "https://wiki.guildwars.com/wiki/Mhenlo" }; - public static readonly Npc Aidan = new() { Ids = new int[] { 1934, 2124, 2852, 3493, 4570, 4580, 5994, 4590, 2123 }, Name = "Aidan", WikiUrl = "https://wiki.guildwars.com/wiki/Aidan" }; - public static readonly Npc Olias = new() { Ids = new int[] { 1935, 1938 }, Name = "Olias", WikiUrl = "https://wiki.guildwars.com/wiki/Olias" }; - public static readonly Npc LyssasMuse = new() { Ids = new int[] { 1944 }, Name = "Lyssa's Muse", WikiUrl = "https://wiki.guildwars.com/wiki/Lyssa%27s_Muse" }; - public static readonly Npc VoiceOfGrenth = new() { Ids = new int[] { 1945 }, Name = "Voice Of Grenth", WikiUrl = "https://wiki.guildwars.com/wiki/Voice_of_Grenth" }; - public static readonly Npc AvatarOfDwayna = new() { Ids = new int[] { 1946 }, Name = "Avatar Of Dwayna", WikiUrl = "https://wiki.guildwars.com/wiki/Avatar_of_Dwayna" }; - public static readonly Npc KrytanMerchant = new() { Ids = new int[] { 1950, 1993, 1997, 2007, 2021, 2037, 2040, 2048 }, Name = "Krytan Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; - public static readonly Npc KrytanHerald = new() { Ids = new int[] { 1958 }, Name = "Krytan Herald", WikiUrl = "https://wiki.guildwars.com/wiki/Krytan_Herald" }; - public static readonly Npc Lionguard = new() { Ids = new int[] { 1961, 1969, 2868 }, Name = "Lionguard", WikiUrl = "https://wiki.guildwars.com/wiki/Lionguard" }; - public static readonly Npc WintunTheBlack = new() { Ids = new int[] { 1964 }, Name = "Wintun The Black", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; - public static readonly Npc RestlessSpirit = new() { Ids = new int[] { 1965 }, Name = "Restless Spirit", WikiUrl = "https://wiki.guildwars.com/wiki/Restless_Spirit" }; - public static readonly Npc AscalonianSettler = new() { Ids = new int[] { 1986, 1987 }, Name = "Ascalonian Settler", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalonian_Settler" }; - public static readonly Npc AscalonSettler = new() { Ids = new int[] { 1986, 1987 }, Name = "Ascalon Settler", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalon_Settler" }; - public static readonly Npc SettlementGuard = new() { Ids = new int[] { 1989 }, Name = "Settlement Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Settlement_Guard" }; - public static readonly Npc CaptainGreywind = new() { Ids = new int[] { 1990 }, Name = "Captain Greywind", WikiUrl = "https://wiki.guildwars.com/wiki/Captain_Greywind" }; - public static readonly Npc AscalonianGhost = new() { Ids = new int[] { 1998, 2141, 2353, 2354, 2355, 2534, 5617, 4975 }, Name = "Ascalonian Ghost", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Ghosts" }; - public static readonly Npc KrytanSmith = new() { Ids = new int[] { 2000 }, Name = "Krytan Smith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; - public static readonly Npc WhiteMantleZealot = new() { Ids = new int[] { 2006, 2206, 2207 }, Name = "White Mantle Zealot", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Zealot" }; - public static readonly Npc CaptainGrumby = new() { Ids = new int[] { 2016 }, Name = "Captain Grumby", WikiUrl = "https://wiki.guildwars.com/wiki/Captain_Grumby" }; - public static readonly Npc CapturedChosen = new() { Ids = new int[] { 2034 }, Name = "Captured Chosen", WikiUrl = "https://wiki.guildwars.com/wiki/Captured_Chosen" }; - public static readonly Npc Ascalonian = new() { Ids = new int[] { 2066, 2071, 2872 }, Name = "Ascalonian", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalonian" }; - public static readonly Npc AscalonianEngineer = new() { Ids = new int[] { 2077 }, Name = "Ascalonian Engineer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; - public static readonly Npc DeldrimorMerchant = new() { Ids = new int[] { 2111, 2140 }, Name = "Deldrimor Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Dwarves" }; - public static readonly Npc DwarvenWeaponsmith = new() { Ids = new int[] { 2112 }, Name = "Dwarven Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Dwarves" }; - public static readonly Npc CanthanMerchant = new() { Ids = new int[] { 2117, 2118, 2119, 2121, 3276, 3277, 3291 }, Name = "Canthan Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; - public static readonly Npc IrwynTheSevere = new() { Ids = new int[] { 2168 }, Name = "Irwyn The Severe", WikiUrl = "https://wiki.guildwars.com/wiki/Irwyn_the_Severe" }; - public static readonly Npc SelwinTheFervent = new() { Ids = new int[] { 2169 }, Name = "Selwin The Fervent", WikiUrl = "https://wiki.guildwars.com/wiki/Selwin_the_Fervent" }; - public static readonly Npc EdgarTheIronFist = new() { Ids = new int[] { 2170 }, Name = "Edgar The Iron Fist", WikiUrl = "https://wiki.guildwars.com/wiki/Edgar_the_Iron_Fist" }; - public static readonly Npc InnerCouncilMemberArgyle = new() { Ids = new int[] { 2171 }, Name = "Inner Council Member Argyle", WikiUrl = "https://wiki.guildwars.com/wiki/Inner_Council_Member_Argyle" }; - public static readonly Npc BraimaTheCallous = new() { Ids = new int[] { 2173 }, Name = "Braima The Callous", WikiUrl = "https://wiki.guildwars.com/wiki/Braima_the_Callous" }; - public static readonly Npc CyrusTheUnflattering = new() { Ids = new int[] { 2175 }, Name = "Cyrus The Unflattering", WikiUrl = "https://wiki.guildwars.com/wiki/Cyrus_the_Unflattering" }; - public static readonly Npc InnerCouncilMemberCuthbert = new() { Ids = new int[] { 2177 }, Name = "Inner Council Member Cuthbert", WikiUrl = "https://wiki.guildwars.com/wiki/Inner_Council_Member_Cuthbert" }; - public static readonly Npc MantonTheIndulgent = new() { Ids = new int[] { 2179 }, Name = "Manton The Indulgent", WikiUrl = "https://wiki.guildwars.com/wiki/Manton_the_Indulgent" }; - public static readonly Npc WhiteMantleWarriorBoss = new() { Ids = new int[] { 2181 }, Name = "White Mantle Warrior Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; - public static readonly Npc CuthbertTheChaste = new() { Ids = new int[] { 2182 }, Name = "Cuthbert The Chaste", WikiUrl = "https://wiki.guildwars.com/wiki/Cuthbert_the_Chaste" }; - public static readonly Npc PleohTheUgly = new() { Ids = new int[] { 2185 }, Name = "Pleoh The Ugly", WikiUrl = "https://wiki.guildwars.com/wiki/Pleoh_the_Ugly" }; - public static readonly Npc JusticiarHablion = new() { Ids = new int[] { 2187 }, Name = "Justiciar Hablion", WikiUrl = "https://wiki.guildwars.com/wiki/Justiciar_Hablion" }; - public static readonly Npc Markis = new() { Ids = new int[] { 2189 }, Name = "Markis", WikiUrl = "https://wiki.guildwars.com/wiki/Markis" }; - public static readonly Npc ConfessorDorian = new() { Ids = new int[] { 2190 }, Name = "Confessor Dorian", WikiUrl = "https://wiki.guildwars.com/wiki/Confessor_Dorian" }; - public static readonly Npc WhiteMantleSycophant = new() { Ids = new int[] { 2197 }, Name = "White Mantle Sycophant", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Sycophant" }; - public static readonly Npc WhiteMantleRitualist = new() { Ids = new int[] { 2198 }, Name = "White Mantle Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Ritualist" }; - public static readonly Npc WhiteMantleSavant = new() { Ids = new int[] { 2199 }, Name = "White Mantle Savant", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Savant" }; - public static readonly Npc WhiteMantleAbbot = new() { Ids = new int[] { 2200 }, Name = "White Mantle Abbot", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Abbot" }; - public static readonly Npc WhiteMantlePriest = new() { Ids = new int[] { 2201 }, Name = "White Mantle Priest", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Priest" }; - public static readonly Npc WhiteMantleKnight = new() { Ids = new int[] { 2202 }, Name = "White Mantle Knight", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Knight" }; - public static readonly Npc WhiteMantleJusticiar = new() { Ids = new int[] { 2204, 2205 }, Name = "White Mantle Justiciar", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Justiciar" }; - public static readonly Npc WhiteMantleSeeker = new() { Ids = new int[] { 2208, 2227 }, Name = "White Mantle Seeker", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Seeker" }; - public static readonly Npc WhiteMantleRanger = new() { Ids = new int[] { 2209 }, Name = "White Mantle Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; - public static readonly Npc WhiteMantleElementalist = new() { Ids = new int[] { 2219 }, Name = "White Mantle Elementalist", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; - public static readonly Npc JusticiarThommis = new() { Ids = new int[] { 2223 }, Name = "Justiciar Thommis", WikiUrl = "https://wiki.guildwars.com/wiki/Justiciar_Thommis" }; - public static readonly Npc BoneHorror = new() { Ids = new int[] { 2230 }, Name = "Bone Horror", WikiUrl = "https://wiki.guildwars.com/wiki/Bone_Horror" }; - public static readonly Npc BoneFiend = new() { Ids = new int[] { 2231 }, Name = "Bone Fiend", WikiUrl = "https://wiki.guildwars.com/wiki/Bone_Fiend" }; - public static readonly Npc MursaatMesmerBoss = new() { Ids = new int[] { 2235 }, Name = "Mursaat Mesmer Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Mursaat_Mesmer_(boss)" }; - public static readonly Npc MursaatNecromancerBoss = new() { Ids = new int[] { 2236 }, Name = "Mursaat Necromancer Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Mursaat_Necromancer_(boss)" }; - public static readonly Npc MursaatElementalistBoss = new() { Ids = new int[] { 2237 }, Name = "Mursaat Elementalist Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Mursaat_Elementalist_(boss)" }; - public static readonly Npc MursaatMonkBoss = new() { Ids = new int[] { 2238 }, Name = "Mursaat Monk Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Mursaat_Monk_(boss)" }; - public static readonly Npc MursaatWarriorBoss = new() { Ids = new int[] { 2239 }, Name = "Mursaat Warrior Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Armor_(boss)" }; - public static readonly Npc MursaatRangerBoss = new() { Ids = new int[] { 2240 }, Name = "Mursaat Ranger Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Bow_(boss)" }; - public static readonly Npc MursaatMesmer = new() { Ids = new int[] { 2241 }, Name = "Mursaat Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Mursaat_Mesmer" }; - public static readonly Npc MursaatNecromancer = new() { Ids = new int[] { 2242 }, Name = "Mursaat Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Mursaat_Necromancer" }; - public static readonly Npc MursaatElementalist = new() { Ids = new int[] { 2243 }, Name = "Mursaat Elementalist", WikiUrl = "https://wiki.guildwars.com/wiki/Mursaat_Elementalist" }; - public static readonly Npc MursaatMonk = new() { Ids = new int[] { 2245 }, Name = "Mursaat Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Mursaat_Monk" }; - public static readonly Npc JadeArmor = new() { Ids = new int[] { 2249 }, Name = "Jade Armor", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Armor" }; - public static readonly Npc JadeBow = new() { Ids = new int[] { 2250 }, Name = "Jade Bow", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Bow" }; - public static readonly Npc EtherSeal = new() { Ids = new int[] { 2251 }, Name = "Ether Seal", WikiUrl = "https://wiki.guildwars.com/wiki/Ether_Seal" }; - public static readonly Npc HeppBilespitter = new() { Ids = new int[] { 2255 }, Name = "Hepp Bilespitter", WikiUrl = "https://wiki.guildwars.com/wiki/Hepp_Bilespitter" }; - public static readonly Npc MosskRottail = new() { Ids = new int[] { 2256 }, Name = "Mossk Rottail", WikiUrl = "https://wiki.guildwars.com/wiki/Mossk_Rottail" }; - public static readonly Npc Thornwrath = new() { Ids = new int[] { 2257 }, Name = "Thornwrath", WikiUrl = "https://wiki.guildwars.com/wiki/Thornwrath" }; - public static readonly Npc WindRiderBoss = new() { Ids = new int[] { 2261 }, Name = "Wind Rider Boss", WikiUrl = "https://wiki.guildwars.com/wiki/List_of_rider_bosses" }; - public static readonly Npc GrechTrundle = new() { Ids = new int[] { 2262 }, Name = "Grech Trundle", WikiUrl = "https://wiki.guildwars.com/wiki/Grech_Trundle" }; - public static readonly Npc WyddKindlerun = new() { Ids = new int[] { 2263 }, Name = "Wydd Kindlerun", WikiUrl = "https://wiki.guildwars.com/wiki/Wydd_Kindlerun" }; - public static readonly Npc TreeOfVitality = new() { Ids = new int[] { 2264 }, Name = "Tree Of Vitality", WikiUrl = "https://wiki.guildwars.com/wiki/Tree_of_Vitality" }; - public static readonly Npc KaraBloodtail = new() { Ids = new int[] { 2268 }, Name = "Kara Bloodtail", WikiUrl = "https://wiki.guildwars.com/wiki/Kara_Bloodtail" }; - public static readonly Npc MaguumaElementalistBoss = new() { Ids = new int[] { 2269 }, Name = "Maguuma Elementalist Boss", WikiUrl = "https://wiki.guildwars.com/wiki/List_of_centaur_bosses" }; - public static readonly Npc ThornStalkerMonkBoss = new() { Ids = new int[] { 2273 }, Name = "Thorn Stalker Monk Boss", WikiUrl = "https://wiki.guildwars.com/wiki/List_of_centaur_bosses" }; - public static readonly Npc DrogoGreatmane = new() { Ids = new int[] { 2285 }, Name = "Drogo Greatmane", WikiUrl = "https://wiki.guildwars.com/wiki/Drogo_Greatmane" }; - public static readonly Npc GaleStormsend = new() { Ids = new int[] { 2287 }, Name = "Gale Stormsend", WikiUrl = "https://wiki.guildwars.com/wiki/Gale_Stormsend" }; - public static readonly Npc WindRider = new() { Ids = new int[] { 2289, 2290, 6302 }, Name = "Wind Rider", WikiUrl = "https://wiki.guildwars.com/wiki/Wind_Rider" }; - public static readonly Npc RootBehemoth = new() { Ids = new int[] { 2292 }, Name = "Root Behemoth", WikiUrl = "https://wiki.guildwars.com/wiki/Root_Behemoth" }; - public static readonly Npc MaguumaEnchanter = new() { Ids = new int[] { 2294 }, Name = "Maguuma Enchanter", WikiUrl = "https://wiki.guildwars.com/wiki/Maguuma_Enchanter" }; - public static readonly Npc MaguumaWarlock = new() { Ids = new int[] { 2295 }, Name = "Maguuma Warlock", WikiUrl = "https://wiki.guildwars.com/wiki/Maguuma_Warlock" }; - public static readonly Npc MaguumaAvenger = new() { Ids = new int[] { 2296 }, Name = "Maguuma Avenger", WikiUrl = "https://wiki.guildwars.com/wiki/Maguuma_Avenger" }; - public static readonly Npc MaguumaProtector = new() { Ids = new int[] { 2297 }, Name = "Maguuma Protector", WikiUrl = "https://wiki.guildwars.com/wiki/Maguuma_Protector" }; - public static readonly Npc MaguumaWarrior = new() { Ids = new int[] { 2298, 2299 }, Name = "Maguuma Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Maguuma_Warrior" }; - public static readonly Npc MaguumaHunter = new() { Ids = new int[] { 2300 }, Name = "Maguuma Hunter", WikiUrl = "https://wiki.guildwars.com/wiki/Maguuma_Hunter" }; - public static readonly Npc FeveredDevourer = new() { Ids = new int[] { 2301 }, Name = "Fevered Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Fevered_Devourer" }; - public static readonly Npc ThornDevourer = new() { Ids = new int[] { 2302 }, Name = "Thorn Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Thorn_Devourer" }; - public static readonly Npc ThornDevourerDrone = new() { Ids = new int[] { 2303 }, Name = "Thorn Devourer Drone", WikiUrl = "https://wiki.guildwars.com/wiki/Thorn_Devourer_Drone" }; - public static readonly Npc ThornStalker = new() { Ids = new int[] { 2304 }, Name = "Thorn Stalker", WikiUrl = "https://wiki.guildwars.com/wiki/Thorn_Stalker" }; - public static readonly Npc ThornStalkerSprout = new() { Ids = new int[] { 2305 }, Name = "Thorn Stalker Sprout", WikiUrl = "https://wiki.guildwars.com/wiki/Thorn_Stalker_Sprout" }; - public static readonly Npc LifePod = new() { Ids = new int[] { 2306 }, Name = "Life Pod", WikiUrl = "https://wiki.guildwars.com/wiki/Life_Pod" }; - public static readonly Npc EntanglingRoots = new() { Ids = new int[] { 2307 }, Name = "Entangling Roots", WikiUrl = "https://wiki.guildwars.com/wiki/Entangling_Roots" }; - public static readonly Npc RedwoodShepherd = new() { Ids = new int[] { 2308 }, Name = "Redwood Shepherd", WikiUrl = "https://wiki.guildwars.com/wiki/Redwood_Shepherd" }; - public static readonly Npc MossScarab = new() { Ids = new int[] { 2309, 2310 }, Name = "Moss Scarab", WikiUrl = "https://wiki.guildwars.com/wiki/Moss_Scarab" }; - public static readonly Npc MaguumaSpider = new() { Ids = new int[] { 2312 }, Name = "Maguuma Spider", WikiUrl = "https://wiki.guildwars.com/wiki/Maguuma_Spider" }; - public static readonly Npc JungleTroll = new() { Ids = new int[] { 2313, 2314 }, Name = "Jungle Troll", WikiUrl = "https://wiki.guildwars.com/wiki/Jungle_Troll" }; - public static readonly Npc HormFrostrider = new() { Ids = new int[] { 2472 }, Name = "Horm Frostrider", WikiUrl = "https://wiki.guildwars.com/wiki/Horm_Frostrider" }; - public static readonly Npc DigoMurkstalker = new() { Ids = new int[] { 2501 }, Name = "Digo Murkstalker", WikiUrl = "https://wiki.guildwars.com/wiki/Digo_Murkstalker" }; - public static readonly Npc CeruGloomrunner = new() { Ids = new int[] { 2502 }, Name = "Ceru Gloomrunner", WikiUrl = "https://wiki.guildwars.com/wiki/Ceru_Gloomrunner" }; - public static readonly Npc EnslavedFrostGiant = new() { Ids = new int[] { 2530 }, Name = "Enslaved Frost Giant", WikiUrl = "https://wiki.guildwars.com/wiki/Enslaved_Frost_Giant" }; - public static readonly Npc BlessedGriffon = new() { Ids = new int[] { 2532 }, Name = "Blessed Griffon", WikiUrl = "https://wiki.guildwars.com/wiki/Blessed_Griffon" }; - public static readonly Npc IceImp = new() { Ids = new int[] { 2533, 6947 }, Name = "Ice Imp", WikiUrl = "https://wiki.guildwars.com/wiki/Ice_Imp" }; - public static readonly Npc AzureShadow = new() { Ids = new int[] { 2535 }, Name = "Azure Shadow", WikiUrl = "https://wiki.guildwars.com/wiki/Azure_Shadow" }; - public static readonly Npc Pinesoul = new() { Ids = new int[] { 2536 }, Name = "Pinesoul", WikiUrl = "https://wiki.guildwars.com/wiki/Pinesoul" }; - public static readonly Npc AvicaraBrave = new() { Ids = new int[] { 2540 }, Name = "Avicara Brave", WikiUrl = "https://wiki.guildwars.com/wiki/Avicara_Brave" }; - public static readonly Npc AvicaraFierce = new() { Ids = new int[] { 2541 }, Name = "Avicara Fierce", WikiUrl = "https://wiki.guildwars.com/wiki/Avicara_Fierce" }; - public static readonly Npc MountainTroll = new() { Ids = new int[] { 2546 }, Name = "Mountain Troll", WikiUrl = "https://wiki.guildwars.com/wiki/Mountain_Troll" }; - public static readonly Npc Seer = new() { Ids = new int[] { 2549 }, Name = "Seer", WikiUrl = "https://wiki.guildwars.com/wiki/Seer" }; - public static readonly Npc Eidolon = new() { Ids = new int[] { 2552 }, Name = "Eidolon", WikiUrl = "https://wiki.guildwars.com/wiki/Eidolon" }; - public static readonly Npc EnslavedEttin = new() { Ids = new int[] { 2599 }, Name = "Enslaved Ettin", WikiUrl = "https://wiki.guildwars.com/wiki/Enslaved_Ettin" }; - public static readonly Npc StoneSummitMesmerBoss = new() { Ids = new int[] { 2629 }, Name = "Stone Summit Mesmer Boss", WikiUrl = "https://wiki.guildwars.com/wiki/List_of_dolyak_bosses" }; - public static readonly Npc HormakIroncurse = new() { Ids = new int[] { 2630 }, Name = "Hormak Ironcurse", WikiUrl = "https://wiki.guildwars.com/wiki/Hormak_Ironcurse" }; - public static readonly Npc IceElementalElementalistBoss = new() { Ids = new int[] { 2631 }, Name = "Ice Elemental Elementalist Boss", WikiUrl = "https://wiki.guildwars.com/wiki/List_of_elemental_bosses" }; - public static readonly Npc StoneSummitMonkBoss = new() { Ids = new int[] { 2632 }, Name = "Stone Summit Monk Boss", WikiUrl = "https://wiki.guildwars.com/wiki/List_of_dolyak_bosses" }; - public static readonly Npc StoneSummitWarriorBoss = new() { Ids = new int[] { 2634 }, Name = "Stone Summit Warrior Boss", WikiUrl = "https://wiki.guildwars.com/wiki/List_of_dolyak_bosses" }; - public static readonly Npc DagnarStonepate = new() { Ids = new int[] { 2637 }, Name = "Dagnar Stonepate", WikiUrl = "https://wiki.guildwars.com/wiki/Dagnar_Stonepate" }; - public static readonly Npc SummitBeastmaster = new() { Ids = new int[] { 2648 }, Name = "Summit Beastmaster", WikiUrl = "https://wiki.guildwars.com/wiki/Summit_Beastmaster" }; - public static readonly Npc StoneSummitHeretic = new() { Ids = new int[] { 2650 }, Name = "Stone Summit Heretic", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Heretic" }; - public static readonly Npc DolyakMaster = new() { Ids = new int[] { 2651 }, Name = "Dolyak Master", WikiUrl = "https://wiki.guildwars.com/wiki/Dolyak_Master" }; - public static readonly Npc StoneSummitGnasher = new() { Ids = new int[] { 2653, 6698 }, Name = "Stone Summit Gnasher", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Gnasher" }; - public static readonly Npc StoneSummitCarver = new() { Ids = new int[] { 2654, 6692, 6701 }, Name = "Stone Summit Carver", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Carver" }; - public static readonly Npc SiegeIceGolem = new() { Ids = new int[] { 2656 }, Name = "Siege Ice Golem", WikiUrl = "https://wiki.guildwars.com/wiki/Siege_Ice_Golem" }; - public static readonly Npc SummitGiantHerder = new() { Ids = new int[] { 2657 }, Name = "Summit Giant Herder", WikiUrl = "https://wiki.guildwars.com/wiki/Summit_Giant_Herder" }; - public static readonly Npc MolesQuibus = new() { Ids = new int[] { 2658 }, Name = "Moles Quibus", WikiUrl = "https://wiki.guildwars.com/wiki/Moles_Quibus" }; - public static readonly Npc MaligoLibens = new() { Ids = new int[] { 2659 }, Name = "Maligo Libens", WikiUrl = "https://wiki.guildwars.com/wiki/Maligo_Libens" }; - public static readonly Npc ScelusProsum = new() { Ids = new int[] { 2660 }, Name = "Scelus Prosum", WikiUrl = "https://wiki.guildwars.com/wiki/Scelus_Prosum" }; - public static readonly Npc TortitudoProbo = new() { Ids = new int[] { 2661 }, Name = "Tortitudo Probo", WikiUrl = "https://wiki.guildwars.com/wiki/Tortitudo_Probo" }; - public static readonly Npc ValetudoRubor = new() { Ids = new int[] { 2662 }, Name = "Valetudo Rubor", WikiUrl = "https://wiki.guildwars.com/wiki/Valetudo_Rubor" }; - public static readonly Npc SparkOfTheTitans = new() { Ids = new int[] { 2668 }, Name = "Spark Of The Titans", WikiUrl = "https://wiki.guildwars.com/wiki/Spark_of_the_Titans" }; - public static readonly Npc RisenAshenHulk = new() { Ids = new int[] { 2669 }, Name = "Risen Ashen Hulk", WikiUrl = "https://wiki.guildwars.com/wiki/Risen_Ashen_Hulk" }; - public static readonly Npc BurningTitan = new() { Ids = new int[] { 2670 }, Name = "Burning Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Burning_Titan" }; - public static readonly Npc HandOfTheTitans = new() { Ids = new int[] { 2671 }, Name = "Hand Of The Titans", WikiUrl = "https://wiki.guildwars.com/wiki/Hand_of_the_Titans" }; - public static readonly Npc FistOfTheTitans = new() { Ids = new int[] { 2672 }, Name = "Fist Of The Titans", WikiUrl = "https://wiki.guildwars.com/wiki/Fist_of_the_Titans" }; - public static readonly Npc UndeadLich = new() { Ids = new int[] { 2695, 4953 }, Name = "Undead Lich", WikiUrl = "https://wiki.guildwars.com/wiki/Undead_Lich" }; - public static readonly Npc UndeadPrinceRurik = new() { Ids = new int[] { 2698 }, Name = "Undead Prince Rurik", WikiUrl = "https://wiki.guildwars.com/wiki/Undead_Prince_Rurik" }; - public static readonly Npc ZaimGrimeclaw = new() { Ids = new int[] { 2700 }, Name = "Zaim Grimeclaw", WikiUrl = "https://wiki.guildwars.com/wiki/Zaim_Grimeclaw" }; - public static readonly Npc Ruinwing = new() { Ids = new int[] { 2729 }, Name = "Ruinwing", WikiUrl = "https://wiki.guildwars.com/wiki/Ruinwing" }; - public static readonly Npc Hellhound = new() { Ids = new int[] { 2730 }, Name = "Hellhound", WikiUrl = "https://wiki.guildwars.com/wiki/Hellhound" }; - public static readonly Npc GraspingGhoul = new() { Ids = new int[] { 2732, 2731 }, Name = "Grasping Ghoul", WikiUrl = "https://wiki.guildwars.com/wiki/Grasping_Ghoul" }; - public static readonly Npc SkeletonRanger = new() { Ids = new int[] { 2739 }, Name = "Skeleton Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Ranger" }; - public static readonly Npc BoneDragon = new() { Ids = new int[] { 2741 }, Name = "Bone Dragon", WikiUrl = "https://wiki.guildwars.com/wiki/Bone_Dragon" }; - public static readonly Npc VizierKhilbron = new() { Ids = new int[] { 2748, 2749 }, Name = "Vizier Khilbron", WikiUrl = "https://wiki.guildwars.com/wiki/Vizier_Khilbron" }; - public static readonly Npc JythSprayburst = new() { Ids = new int[] { 2763 }, Name = "Jyth Sprayburst", WikiUrl = "https://wiki.guildwars.com/wiki/Jyth_Sprayburst" }; - public static readonly Npc DosakaruFevertouch = new() { Ids = new int[] { 2766 }, Name = "Dosakaru Fevertouch", WikiUrl = "https://wiki.guildwars.com/wiki/Dosakaru_Fevertouch" }; - public static readonly Npc SkintekaruManshredder = new() { Ids = new int[] { 2768 }, Name = "Skintekaru Manshredder", WikiUrl = "https://wiki.guildwars.com/wiki/Skintekaru_Manshredder" }; - public static readonly Npc GossDarkweb = new() { Ids = new int[] { 2770 }, Name = "Goss Darkweb", WikiUrl = "https://wiki.guildwars.com/wiki/Goss_Darkweb" }; - public static readonly Npc FerkMallet = new() { Ids = new int[] { 2773 }, Name = "Ferk Mallet", WikiUrl = "https://wiki.guildwars.com/wiki/Ferk_Mallet" }; - public static readonly Npc VulgPainbrain = new() { Ids = new int[] { 2774 }, Name = "Vulg Painbrain", WikiUrl = "https://wiki.guildwars.com/wiki/Vulg_Painbrain" }; - public static readonly Npc GrenthsCursed = new() { Ids = new int[] { 2780 }, Name = "Grenth's Cursed", WikiUrl = "https://wiki.guildwars.com/wiki/Grenth%27s_Cursed" }; - public static readonly Npc MaxineColdstone = new() { Ids = new int[] { 2784 }, Name = "Maxine Coldstone", WikiUrl = "https://wiki.guildwars.com/wiki/Maxine_Coldstone" }; - public static readonly Npc RwekKhawlMawl = new() { Ids = new int[] { 2785 }, Name = "Rwek Khawl Mawl", WikiUrl = "https://wiki.guildwars.com/wiki/Rwek_Khawl_Mawl" }; - public static readonly Npc BreezeKeeper = new() { Ids = new int[] { 2789 }, Name = "Breeze Keeper", WikiUrl = "https://wiki.guildwars.com/wiki/Breeze_Keeper" }; - public static readonly Npc CragBehemoth = new() { Ids = new int[] { 2790 }, Name = "Crag Behemoth", WikiUrl = "https://wiki.guildwars.com/wiki/Crag_Behemoth" }; - public static readonly Npc Drake = new() { Ids = new int[] { 2791, 8147 }, Name = "Drake", WikiUrl = "https://wiki.guildwars.com/wiki/Drake" }; - public static readonly Npc DarkFlameDryder = new() { Ids = new int[] { 2792 }, Name = "Dark Flame Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Dark_Flame_Dryder" }; - public static readonly Npc IgneousEttin = new() { Ids = new int[] { 2793 }, Name = "Igneous Ettin", WikiUrl = "https://wiki.guildwars.com/wiki/Igneous_Ettin" }; - public static readonly Npc Phantom = new() { Ids = new int[] { 2794 }, Name = "Phantom", WikiUrl = "https://wiki.guildwars.com/wiki/Phantom" }; - public static readonly Npc FleshGolem = new() { Ids = new int[] { 2795 }, Name = "Flesh Golem", WikiUrl = "https://wiki.guildwars.com/wiki/Flesh_Golem" }; - public static readonly Npc MahgoHydra = new() { Ids = new int[] { 2796 }, Name = "Mahgo Hydra", WikiUrl = "https://wiki.guildwars.com/wiki/Mahgo_Hydra" }; - public static readonly Npc Wurm = new() { Ids = new int[] { 2798 }, Name = "Wurm", WikiUrl = "https://wiki.guildwars.com/wiki/Wurm" }; - public static readonly Npc GhostMesmer = new() { Ids = new int[] { 2828 }, Name = "Ghost Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Ghosts" }; - public static readonly Npc GhostWarrior = new() { Ids = new int[] { 2833 }, Name = "Ghost Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Ghosts" }; - public static readonly Npc ShiningBlade = new() { Ids = new int[] { 2842, 2843 }, Name = "Shining Blade", WikiUrl = "https://wiki.guildwars.com/wiki/Shining_Blade" }; - public static readonly Npc FirstwatchSergio = new() { Ids = new int[] { 2857 }, Name = "Firstwatch Sergio", WikiUrl = "https://wiki.guildwars.com/wiki/Firstwatch_Sergio" }; - public static readonly Npc KrytanChild = new() { Ids = new int[] { 2859 }, Name = "Krytan Child", WikiUrl = "https://wiki.guildwars.com/wiki/Krytan_Child" }; - public static readonly Npc Oink = new() { Ids = new int[] { 2860 }, Name = "Oink", WikiUrl = "https://wiki.guildwars.com/wiki/Oink" }; - public static readonly Npc Carlotta = new() { Ids = new int[] { 2861 }, Name = "Carlotta", WikiUrl = "https://wiki.guildwars.com/wiki/Carlotta" }; - public static readonly Npc KingAdelbern = new() { Ids = new int[] { 2862, 2055 }, Name = "King Adelbern", WikiUrl = "https://wiki.guildwars.com/wiki/King_Adelbern" }; - public static readonly Npc DukeBarradin = new() { Ids = new int[] { 2864 }, Name = "Duke Barradin", WikiUrl = "https://wiki.guildwars.com/wiki/Duke_Barradin" }; - public static readonly Npc Joe = new() { Ids = new int[] { 2865 }, Name = "Joe", WikiUrl = "https://wiki.guildwars.com/wiki/Joe" }; - public static readonly Npc Shadow = new() { Ids = new int[] { 2870 }, Name = "Shadow", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow" }; - public static readonly Npc Vanguard = new() { Ids = new int[] { 2871, 6026, 6027, 6029, 6042, 2099, 2100 }, Name = "Vanguard", WikiUrl = "https://wiki.guildwars.com/wiki/Vanguard" }; - public static readonly Npc SpiritOfWinter = new() { Ids = new int[] { 2874 }, Name = "Spirit Of Winter", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Winter" }; - public static readonly Npc SpiritOfSymbiosis = new() { Ids = new int[] { 2879 }, Name = "Spirit Of Symbiosis", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Symbiosis" }; - public static readonly Npc SpiritOfPrimalEchoes = new() { Ids = new int[] { 2880 }, Name = "Spirit Of Primal Echoes", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Primal_Echoes" }; - public static readonly Npc SpiritOfFrozenSoil = new() { Ids = new int[] { 2882 }, Name = "Spirit Of Frozen Soil", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Frozen_Soil" }; - public static readonly Npc Crane = new() { Ids = new int[] { 2953 }, Name = "Crane", WikiUrl = "https://wiki.guildwars.com/wiki/Crane" }; - public static readonly Npc Tiger = new() { Ids = new int[] { 2954 }, Name = "Tiger", WikiUrl = "https://wiki.guildwars.com/wiki/Tiger" }; - public static readonly Npc Lurker = new() { Ids = new int[] { 2955 }, Name = "Lurker", WikiUrl = "https://wiki.guildwars.com/wiki/Lurker" }; - public static readonly Npc ReefLurker = new() { Ids = new int[] { 2956 }, Name = "Reef Lurker", WikiUrl = "https://wiki.guildwars.com/wiki/Reef_Lurker" }; - public static readonly Npc WhiteTiger = new() { Ids = new int[] { 2957 }, Name = "White Tiger", WikiUrl = "https://wiki.guildwars.com/wiki/White_Tiger" }; - public static readonly Npc ElderReefLurker = new() { Ids = new int[] { 2959 }, Name = "Elder Reef Lurker", WikiUrl = "https://wiki.guildwars.com/wiki/Reef_Lurker" }; - public static readonly Npc ElderCrane = new() { Ids = new int[] { 2969 }, Name = "Elder Crane", WikiUrl = "https://wiki.guildwars.com/wiki/Elder_Crane" }; - public static readonly Npc ElderTiger = new() { Ids = new int[] { 2974 }, Name = "Elder Tiger", WikiUrl = "https://wiki.guildwars.com/wiki/Tiger" }; - public static readonly Npc KurzickNoble = new() { Ids = new int[] { 3030, 3337, 3396, 3397, 3398, 3399 }, Name = "Kurzick Noble", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Noble" }; - public static readonly Npc CrimsonSkullMonk = new() { Ids = new int[] { 3055 }, Name = "Crimson Skull Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Healer" }; - public static readonly Npc GullHookbeak = new() { Ids = new int[] { 3058 }, Name = "Gull Hookbeak", WikiUrl = "https://wiki.guildwars.com/wiki/Gull_Hookbeak" }; - public static readonly Npc YrrgSnagtooth = new() { Ids = new int[] { 3059 }, Name = "Yrrg Snagtooth", WikiUrl = "https://wiki.guildwars.com/wiki/Yrrg_Snagtooth" }; - public static readonly Npc YorrtStrongjaw = new() { Ids = new int[] { 3060 }, Name = "Yorrt Strongjaw", WikiUrl = "https://wiki.guildwars.com/wiki/Yorrt_Strongjaw" }; - public static readonly Npc CanthanGuardRecruit = new() { Ids = new int[] { 3069, 3229 }, Name = "Canthan Guard Recruit", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Guard" }; - public static readonly Npc HeadmasterVhang = new() { Ids = new int[] { 3077, 3336, 3490 }, Name = "Headmaster Vhang", WikiUrl = "https://wiki.guildwars.com/wiki/Headmaster_Vhang" }; - public static readonly Npc MasterTogo = new() { Ids = new int[] { 3078, 3081, 3120, 3215 }, Name = "Master Togo", WikiUrl = "https://wiki.guildwars.com/wiki/Master_Togo" }; - public static readonly Npc ZaishenScout = new() { Ids = new int[] { 3079 }, Name = "Zaishen Scout", WikiUrl = "https://wiki.guildwars.com/wiki/Zaishen_Scout" }; - public static readonly Npc YijoTahn = new() { Ids = new int[] { 3082 }, Name = "Yijo Tahn", WikiUrl = "https://wiki.guildwars.com/wiki/Yijo_Tahn" }; - public static readonly Npc ShadyLuxon = new() { Ids = new int[] { 3094 }, Name = "Shady Luxon", WikiUrl = "https://wiki.guildwars.com/wiki/Shady_Luxon" }; - public static readonly Npc SuspiciousKurzick = new() { Ids = new int[] { 3095 }, Name = "Suspicious Kurzick", WikiUrl = "https://wiki.guildwars.com/wiki/Suspicious_Kurzick" }; - public static readonly Npc ZhuHanuku = new() { Ids = new int[] { 3097 }, Name = "Zhu Hanuku", WikiUrl = "https://wiki.guildwars.com/wiki/Zhu_Hanuku" }; - public static readonly Npc ShadowBladeAssassin = new() { Ids = new int[] { 3122 }, Name = "Shadow Blade Assassin", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_Blade_Assassin" }; - public static readonly Npc AmFahAssassin = new() { Ids = new int[] { 3157, 4191 }, Name = "Am Fah Assassin", WikiUrl = "https://wiki.guildwars.com/wiki/Am_Fah_Assassin" }; - public static readonly Npc LuxonAssassin = new() { Ids = new int[] { 3159, 3569, 3603 }, Name = "Luxon Assassin", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Assassin" }; - public static readonly Npc LuxonMesmer = new() { Ids = new int[] { 3160, 3570, 3614 }, Name = "Luxon Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Mesmer" }; - public static readonly Npc LuxonElementalist = new() { Ids = new int[] { 3161, 3572, 3615 }, Name = "Luxon Elementalist", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Elementalist" }; - public static readonly Npc LuxonMonk = new() { Ids = new int[] { 3162, 3339, 3616, 3643 }, Name = "Luxon Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Monk" }; - public static readonly Npc LuxonWarrior = new() { Ids = new int[] { 3163, 3574 }, Name = "Luxon Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Warrior" }; - public static readonly Npc LuxonRanger = new() { Ids = new int[] { 3164, 3575, 3595, 3607 }, Name = "Luxon Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Ranger" }; - public static readonly Npc EmperorKisu = new() { Ids = new int[] { 3196 }, Name = "Emperor Kisu", WikiUrl = "https://wiki.guildwars.com/wiki/Emperor_Kisu" }; - public static readonly Npc Jamei = new() { Ids = new int[] { 3219, 3941 }, Name = "Jamei", WikiUrl = "https://wiki.guildwars.com/wiki/Jamei" }; - public static readonly Npc TalonSilverwing = new() { Ids = new int[] { 3226, 3471, 3501, 5992 }, Name = "Talon Silverwing", WikiUrl = "https://wiki.guildwars.com/wiki/Talon_Silverwing" }; - public static readonly Npc CanthanGuardCaptain = new() { Ids = new int[] { 3231, 3338 }, Name = "Canthan Guard Captain", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Guard_Captain" }; - public static readonly Npc PalaceGuard = new() { Ids = new int[] { 3232, 5636 }, Name = "Palace Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Palace_Guard" }; - public static readonly Npc CanthanChild = new() { Ids = new int[] { 3238 }, Name = "Canthan Child", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Child" }; - public static readonly Npc CanthanNoble = new() { Ids = new int[] { 3241, 3242, 3243, 3244, 3304, 3317, 3333, 3334 }, Name = "Canthan Noble", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Noble" }; - public static readonly Npc CanthanBarkeep = new() { Ids = new int[] { 3247, 3252 }, Name = "Canthan Barkeep", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Peasant" }; - public static readonly Npc CanthanPeasant = new() { Ids = new int[] { 3248, 3256, 3258, 3266, 3289, 3303 }, Name = "Canthan Peasant", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Peasant" }; - public static readonly Npc KurzickGuard = new() { Ids = new int[] { 3249, 3388, 3430, 3431, 3429 }, Name = "Kurzick Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Guard" }; - public static readonly Npc ShingJeaCollector = new() { Ids = new int[] { 3255, 3310 }, Name = "Shing Jea Collector", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; - public static readonly Npc CanthanAdept = new() { Ids = new int[] { 3267 }, Name = "Canthan Adept", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; - public static readonly Npc CanthanTrader = new() { Ids = new int[] { 3269, 3270, 3275, 3279, 3288, 3295, 3311 }, Name = "Canthan Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Trader" }; - public static readonly Npc CanthanArmorer = new() { Ids = new int[] { 3272, 3273, 3281 }, Name = "Canthan Armorer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; - public static readonly Npc FireworksMaster = new() { Ids = new int[] { 3274 }, Name = "Fireworks Master", WikiUrl = "https://wiki.guildwars.com/wiki/Fireworks_Master" }; - public static readonly Npc CanthanWeaponsmith = new() { Ids = new int[] { 3280 }, Name = "Canthan Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; - public static readonly Npc ShingJeaTrader = new() { Ids = new int[] { 3290, 3292 }, Name = "Shing Jea Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; - public static readonly Npc Su = new() { Ids = new int[] { 3309, 3468, 3498 }, Name = "Su", WikiUrl = "https://wiki.guildwars.com/wiki/Su" }; - public static readonly Npc SisterTai = new() { Ids = new int[] { 3315, 3470, 3500, 3512 }, Name = "Sister Tai", WikiUrl = "https://wiki.guildwars.com/wiki/Sister_Tai" }; - public static readonly Npc WengGha = new() { Ids = new int[] { 3320 }, Name = "Weng Gha", WikiUrl = "https://wiki.guildwars.com/wiki/Weng_Gha" }; - public static readonly Npc CanthanRangerTrainer = new() { Ids = new int[] { 3326 }, Name = "Canthan Ranger Trainer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; - public static readonly Npc ProfessorGai = new() { Ids = new int[] { 3330, 3473, 3503 }, Name = "Professor Gai", WikiUrl = "https://wiki.guildwars.com/wiki/Professor_Gai" }; - public static readonly Npc AscalonGuardGhost = new() { Ids = new int[] { 3332 }, Name = "Ascalon Guard Ghost", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Ghosts" }; - public static readonly Npc FortuneTeller = new() { Ids = new int[] { 3335 }, Name = "Fortune Teller", WikiUrl = "https://wiki.guildwars.com/wiki/Fortune_Teller" }; - public static readonly Npc CanthanRitualist = new() { Ids = new int[] { 3340 }, Name = "Canthan Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; - public static readonly Npc GeneralKaimerVasburg = new() { Ids = new int[] { 3348 }, Name = "General Kaimer Vasburg", WikiUrl = "https://wiki.guildwars.com/wiki/General_Kaimer_Vasburg" }; - public static readonly Npc KurzickJuggernaut = new() { Ids = new int[] { 3349 }, Name = "Kurzick Juggernaut", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Juggernaut" }; - public static readonly Npc KurzickAssassin = new() { Ids = new int[] { 3350, 3405 }, Name = "Kurzick Assassin", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Assassin" }; - public static readonly Npc KurzickMesmer = new() { Ids = new int[] { 3351, 3393 }, Name = "Kurzick Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Mesmer" }; - public static readonly Npc KurzickNecromancer = new() { Ids = new int[] { 3352 }, Name = "Kurzick Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Necromancer" }; - public static readonly Npc KurzickElementalist = new() { Ids = new int[] { 3353 }, Name = "Kurzick Elementalist", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Elementalist" }; - public static readonly Npc KurzickMonk = new() { Ids = new int[] { 3354 }, Name = "Kurzick Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Monk" }; - public static readonly Npc KurzickWarrior = new() { Ids = new int[] { 3355 }, Name = "Kurzick Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Warrior" }; - public static readonly Npc KurzickRanger = new() { Ids = new int[] { 3356, 3382 }, Name = "Kurzick Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Ranger" }; - public static readonly Npc KurzickRitualist = new() { Ids = new int[] { 3357 }, Name = "Kurzick Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Ritualist" }; - public static readonly Npc Juggernaut = new() { Ids = new int[] { 3367 }, Name = "Juggernaut", WikiUrl = "https://wiki.guildwars.com/wiki/Juggernaut" }; - public static readonly Npc KurzickQuartermaster = new() { Ids = new int[] { 3384 }, Name = "Kurzick Quartermaster", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Quartermaster" }; - public static readonly Npc WarCaptainWomack = new() { Ids = new int[] { 3385 }, Name = "War Captain Womack", WikiUrl = "https://wiki.guildwars.com/wiki/War_Captain_Womack" }; - public static readonly Npc KurzickPeasant = new() { Ids = new int[] { 3392 }, Name = "Kurzick Peasant", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Peasant" }; - public static readonly Npc KurzickTraveler = new() { Ids = new int[] { 3394, 3395 }, Name = "Kurzick Traveler", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Traveler" }; - public static readonly Npc KurzickPriest = new() { Ids = new int[] { 3400, 3426 }, Name = "Kurzick Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Priest" }; - public static readonly Npc KurzickBlacksmith = new() { Ids = new int[] { 3403 }, Name = "Kurzick Blacksmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kurzicks" }; - public static readonly Npc KurzickMerchant = new() { Ids = new int[] { 3408, 3427 }, Name = "Kurzick Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Merchant" }; - public static readonly Npc KurzickWeaponsmith = new() { Ids = new int[] { 3409, 3410 }, Name = "Kurzick Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kurzicks" }; - public static readonly Npc KurzickTrader = new() { Ids = new int[] { 3411, 3419, 3420, 3422, 3425 }, Name = "Kurzick Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kurzicks" }; - public static readonly Npc KurzickBureaucrat = new() { Ids = new int[] { 3414 }, Name = "Kurzick Bureaucrat", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Bureaucrat" }; - public static readonly Npc BaronMirekVasburg = new() { Ids = new int[] { 3416 }, Name = "Baron Mirek Vasburg", WikiUrl = "https://wiki.guildwars.com/wiki/Baron_Mirek_Vasburg" }; - public static readonly Npc CountZuHeltzer = new() { Ids = new int[] { 3417 }, Name = "Count Zu Heltzer", WikiUrl = "https://wiki.guildwars.com/wiki/Count_zu_Heltzer" }; - public static readonly Npc Mai = new() { Ids = new int[] { 3434, 3440, 3446, 3452 }, Name = "Mai", WikiUrl = "https://wiki.guildwars.com/wiki/Mai" }; - public static readonly Npc Kisai = new() { Ids = new int[] { 3435, 3441, 3447, 3453 }, Name = "Kisai", WikiUrl = "https://wiki.guildwars.com/wiki/Kisai" }; - public static readonly Npc Taya = new() { Ids = new int[] { 3436, 3442, 3448, 3454 }, Name = "Taya", WikiUrl = "https://wiki.guildwars.com/wiki/Taya" }; - public static readonly Npc Lukas = new() { Ids = new int[] { 3437, 3443, 3449, 3455, 3479, 3508 }, Name = "Lukas", WikiUrl = "https://wiki.guildwars.com/wiki/Lukas" }; - public static readonly Npc Yuun = new() { Ids = new int[] { 3438, 3444, 3450, 3456 }, Name = "Yuun", WikiUrl = "https://wiki.guildwars.com/wiki/Yuun" }; - public static readonly Npc Aeson = new() { Ids = new int[] { 3439, 3445, 3451, 3457, 3515, 3486 }, Name = "Aeson", WikiUrl = "https://wiki.guildwars.com/wiki/Aeson" }; - public static readonly Npc Panaku = new() { Ids = new int[] { 3466, 3495 }, Name = "Panaku", WikiUrl = "https://wiki.guildwars.com/wiki/Panaku" }; - public static readonly Npc LoSha = new() { Ids = new int[] { 3467, 3497, 5986 }, Name = "Lo Sha", WikiUrl = "https://wiki.guildwars.com/wiki/Lo_Sha" }; - public static readonly Npc KaiYing = new() { Ids = new int[] { 3469, 3499, 3511 }, Name = "Kai Ying", WikiUrl = "https://wiki.guildwars.com/wiki/Kai_Ying" }; - public static readonly Npc Zho = new() { Ids = new int[] { 3472, 3502, 3514, 5995 }, Name = "Zho", WikiUrl = "https://wiki.guildwars.com/wiki/Zho" }; - public static readonly Npc ErysVasburg = new() { Ids = new int[] { 3474, 3504 }, Name = "Erys Vasburg", WikiUrl = "https://wiki.guildwars.com/wiki/Erys_Vasburg" }; - public static readonly Npc Brutus = new() { Ids = new int[] { 3475, 3505 }, Name = "Brutus", WikiUrl = "https://wiki.guildwars.com/wiki/Brutus" }; - public static readonly Npc Sheena = new() { Ids = new int[] { 3476, 3506 }, Name = "Sheena", WikiUrl = "https://wiki.guildwars.com/wiki/Sheena" }; - public static readonly Npc Danika = new() { Ids = new int[] { 3477 }, Name = "Danika", WikiUrl = "https://wiki.guildwars.com/wiki/Danika" }; - public static readonly Npc RedemptorKarl = new() { Ids = new int[] { 3478, 3507 }, Name = "Redemptor Karl", WikiUrl = "https://wiki.guildwars.com/wiki/Redemptor_Karl" }; - public static readonly Npc Emi = new() { Ids = new int[] { 3487 }, Name = "Emi", WikiUrl = "https://wiki.guildwars.com/wiki/Emi" }; - public static readonly Npc Chiyo = new() { Ids = new int[] { 3494 }, Name = "Chiyo", WikiUrl = "https://wiki.guildwars.com/wiki/Chiyo" }; - public static readonly Npc Nika = new() { Ids = new int[] { 3496 }, Name = "Nika", WikiUrl = "https://wiki.guildwars.com/wiki/Nika" }; - public static readonly Npc SeaguardHala = new() { Ids = new int[] { 3510, 3561, 3649, 3480 }, Name = "Seaguard Hala", WikiUrl = "https://wiki.guildwars.com/wiki/Seaguard_Hala" }; - public static readonly Npc Daeman = new() { Ids = new int[] { 3513, 3567, 3645, 3484 }, Name = "Daeman", WikiUrl = "https://wiki.guildwars.com/wiki/Daeman" }; - public static readonly Npc CanthanFarmer = new() { Ids = new int[] { 3524, 3254 }, Name = "Canthan Farmer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; - public static readonly Npc Argo = new() { Ids = new int[] { 3563, 3646, 3481 }, Name = "Argo", WikiUrl = "https://wiki.guildwars.com/wiki/Argo" }; - public static readonly Npc SeaguardGita = new() { Ids = new int[] { 3564, 3647, 3482 }, Name = "Seaguard Gita", WikiUrl = "https://wiki.guildwars.com/wiki/Seaguard_Gita" }; - public static readonly Npc SeaguardEli = new() { Ids = new int[] { 3565,3483 }, Name = "Seaguard Eli", WikiUrl = "https://wiki.guildwars.com/wiki/Seaguard_Eli" }; - public static readonly Npc Aurora = new() { Ids = new int[] { 3566, 3644, 3485 }, Name = "Aurora", WikiUrl = "https://wiki.guildwars.com/wiki/Aurora" }; - public static readonly Npc SiegeTurtle = new() { Ids = new int[] { 3568, 3586 }, Name = "Siege Turtle", WikiUrl = "https://wiki.guildwars.com/wiki/Siege_Turtle" }; - public static readonly Npc LuxonNecromancer = new() { Ids = new int[] { 3571, 3621 }, Name = "Luxon Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Necromancer" }; - public static readonly Npc GiantTurtle = new() { Ids = new int[] { 3585 }, Name = "Giant Turtle", WikiUrl = "https://wiki.guildwars.com/wiki/Giant_Turtle" }; - public static readonly Npc YoungTurtle = new() { Ids = new int[] { 3587 }, Name = "Young Turtle", WikiUrl = "https://wiki.guildwars.com/wiki/Young_Turtle" }; - public static readonly Npc LuxonRitualist = new() { Ids = new int[] { 3598 }, Name = "Luxon Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Ritualist" }; - public static readonly Npc LuxonCommander = new() { Ids = new int[] { 3600, 3642 }, Name = "Luxon Commander", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Commander" }; - public static readonly Npc LuxonAmbassador = new() { Ids = new int[] { 3608 }, Name = "Luxon Ambassador", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Ambassador" }; - public static readonly Npc Luxon = new() { Ids = new int[] { 3609, 3611 }, Name = "Luxon", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon" }; - public static readonly Npc LuxonElder = new() { Ids = new int[] { 3610 }, Name = "Luxon Elder", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Luxons" }; - public static readonly Npc LuxonTraveler = new() { Ids = new int[] { 3612 }, Name = "Luxon Traveler", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Traveler" }; - public static readonly Npc LuxonMagistrate = new() { Ids = new int[] { 3613 }, Name = "Luxon Magistrate", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Luxons" }; - public static readonly Npc LuxonBlacksmith = new() { Ids = new int[] { 3619 }, Name = "Luxon Blacksmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Luxons" }; - public static readonly Npc LuxonMerchant = new() { Ids = new int[] { 3622, 3623, 3627, 3636 }, Name = "Luxon Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Merchant" }; - public static readonly Npc LuxonWeaponsmith = new() { Ids = new int[] { 3624, 3648 }, Name = "Luxon Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Luxons" }; - public static readonly Npc LuxonTrader = new() { Ids = new int[] { 3628, 3631, 3633, 3634 }, Name = "Luxon Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Luxons" }; - public static readonly Npc LuxonGuard = new() { Ids = new int[] { 3638, 3639, 3640 }, Name = "Luxon Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Guard" }; - public static readonly Npc LuxonPriest = new() { Ids = new int[] { 3641 }, Name = "Luxon Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Priest" }; - public static readonly Npc ElderRhea = new() { Ids = new int[] { 3651 }, Name = "Elder Rhea", WikiUrl = "https://wiki.guildwars.com/wiki/Elder_Rhea" }; - public static readonly Npc ChkkrLocustLord = new() { Ids = new int[] { 3662 }, Name = "Chkkr Locust Lord", WikiUrl = "https://wiki.guildwars.com/wiki/Chkkr_Locust_Lord" }; - public static readonly Npc BezzrWingstorm = new() { Ids = new int[] { 3663 }, Name = "Bezzr Wingstorm", WikiUrl = "https://wiki.guildwars.com/wiki/Bezzr_Wingstorm" }; - public static readonly Npc ChkkrBrightclaw = new() { Ids = new int[] { 3669 }, Name = "Chkkr Brightclaw", WikiUrl = "https://wiki.guildwars.com/wiki/Chkkr_Brightclaw" }; - public static readonly Npc KonrruTaintedStone = new() { Ids = new int[] { 3670 }, Name = "Konrru Tainted Stone", WikiUrl = "https://wiki.guildwars.com/wiki/Konrru,_Tainted_Stone" }; - public static readonly Npc NandetGlassWeaver = new() { Ids = new int[] { 3671 }, Name = "Nandet Glass Weaver", WikiUrl = "https://wiki.guildwars.com/wiki/Nandet,_Glass_Weaver" }; - public static readonly Npc HarggPlaguebinder = new() { Ids = new int[] { 3674 }, Name = "Hargg Plaguebinder", WikiUrl = "https://wiki.guildwars.com/wiki/Hargg_Plaguebinder" }; - public static readonly Npc TarlokEvermind = new() { Ids = new int[] { 3675 }, Name = "Tarlok Evermind", WikiUrl = "https://wiki.guildwars.com/wiki/Tarlok_Evermind" }; - public static readonly Npc MungriMagicbox = new() { Ids = new int[] { 3676 }, Name = "Mungri Magicbox", WikiUrl = "https://wiki.guildwars.com/wiki/Mungri_Magicbox" }; - public static readonly Npc TarnenTheBully = new() { Ids = new int[] { 3677 }, Name = "Tarnen The Bully", WikiUrl = "https://wiki.guildwars.com/wiki/Tarnen_the_Bully" }; - public static readonly Npc WaggSpiritspeak = new() { Ids = new int[] { 3679 }, Name = "Wagg Spiritspeak", WikiUrl = "https://wiki.guildwars.com/wiki/Wagg_Spiritspeak" }; - public static readonly Npc StrongrootTanglebranch = new() { Ids = new int[] { 3682 }, Name = "Strongroot Tanglebranch", WikiUrl = "https://wiki.guildwars.com/wiki/Strongroot_Tanglebranch" }; - public static readonly Npc InallaySplintercall = new() { Ids = new int[] { 3696 }, Name = "Inallay Splintercall", WikiUrl = "https://wiki.guildwars.com/wiki/Inallay_Splintercall" }; - public static readonly Npc ArborEarthcall = new() { Ids = new int[] { 3700 }, Name = "Arbor Earthcall", WikiUrl = "https://wiki.guildwars.com/wiki/Arbor_Earthcall" }; - public static readonly Npc SalkeFurFriend = new() { Ids = new int[] { 3704 }, Name = "Salke Fur Friend", WikiUrl = "https://wiki.guildwars.com/wiki/Salke_Fur_Friend" }; - public static readonly Npc BloodDrinker = new() { Ids = new int[] { 3708 }, Name = "Blood Drinker", WikiUrl = "https://wiki.guildwars.com/wiki/Blood_Drinker" }; - public static readonly Npc FungalWallow = new() { Ids = new int[] { 3709 }, Name = "Fungal Wallow", WikiUrl = "https://wiki.guildwars.com/wiki/Fungal_Wallow" }; - public static readonly Npc MantisHunter = new() { Ids = new int[] { 3711 }, Name = "Mantis Hunter", WikiUrl = "https://wiki.guildwars.com/wiki/Mantis_Hunter" }; - public static readonly Npc MantisDreamweaver = new() { Ids = new int[] { 3712 }, Name = "Mantis Dreamweaver", WikiUrl = "https://wiki.guildwars.com/wiki/Mantis_Dreamweaver" }; - public static readonly Npc MantisStormcaller = new() { Ids = new int[] { 3713 }, Name = "Mantis Stormcaller", WikiUrl = "https://wiki.guildwars.com/wiki/Mantis_Stormcaller" }; - public static readonly Npc MantisMender = new() { Ids = new int[] { 3714 }, Name = "Mantis Mender", WikiUrl = "https://wiki.guildwars.com/wiki/Mantis_Mender" }; - public static readonly Npc PainHungryGaki = new() { Ids = new int[] { 3715 }, Name = "Pain Hungry Gaki", WikiUrl = "https://wiki.guildwars.com/wiki/Pain_Hungry_Gaki" }; - public static readonly Npc SkillHungryGaki = new() { Ids = new int[] { 3716 }, Name = "Skill Hungry Gaki", WikiUrl = "https://wiki.guildwars.com/wiki/Skill_Hungry_Gaki" }; - public static readonly Npc StoneScaleKirin = new() { Ids = new int[] { 3717 }, Name = "Stone Scale Kirin", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Scale_Kirin" }; - public static readonly Npc DredgeGutter = new() { Ids = new int[] { 3718 }, Name = "Dredge Gutter", WikiUrl = "https://wiki.guildwars.com/wiki/Dredge_Gutter" }; - public static readonly Npc DredgeGardener = new() { Ids = new int[] { 3719 }, Name = "Dredge Gardener", WikiUrl = "https://wiki.guildwars.com/wiki/Dredge_Gardener" }; - public static readonly Npc DredgeGuardian = new() { Ids = new int[] { 3720 }, Name = "Dredge Guardian", WikiUrl = "https://wiki.guildwars.com/wiki/Dredge_Guardian" }; - public static readonly Npc Undergrowth = new() { Ids = new int[] { 3723 }, Name = "Undergrowth", WikiUrl = "https://wiki.guildwars.com/wiki/Undergrowth" }; - public static readonly Npc StoneRain = new() { Ids = new int[] { 3724 }, Name = "Stone Rain", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Rain" }; - public static readonly Npc StoneSoul = new() { Ids = new int[] { 3726 }, Name = "Stone Soul", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Soul" }; - public static readonly Npc WardenOfTheMind = new() { Ids = new int[] { 3729 }, Name = "Warden Of The Mind", WikiUrl = "https://wiki.guildwars.com/wiki/Warden_of_the_Mind" }; - public static readonly Npc WardenOfEarth = new() { Ids = new int[] { 3730 }, Name = "Warden Of Earth", WikiUrl = "https://wiki.guildwars.com/wiki/Warden_of_Earth" }; - public static readonly Npc WardenOfTheTrunk = new() { Ids = new int[] { 3733 }, Name = "Warden Of The Trunk", WikiUrl = "https://wiki.guildwars.com/wiki/Warden_of_the_Trunk" }; - public static readonly Npc WardenOfTheLeaf = new() { Ids = new int[] { 3736 }, Name = "Warden Of The Leaf", WikiUrl = "https://wiki.guildwars.com/wiki/Warden_of_the_Leaf" }; - public static readonly Npc WardenOfTheSummer = new() { Ids = new int[] { 3737 }, Name = "Warden Of The Summer", WikiUrl = "https://wiki.guildwars.com/wiki/Warden_of_the_Summer" }; - public static readonly Npc DredgeMelee = new() { Ids = new int[] { 3741 }, Name = "Dredge Melee", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Dredge" }; - public static readonly Npc SickenedLynx = new() { Ids = new int[] { 3765 }, Name = "Sickened Lynx", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Lynx" }; - public static readonly Npc SickenedMoa = new() { Ids = new int[] { 3766 }, Name = "Sickened Moa", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Moa" }; - public static readonly Npc SickenedStalker = new() { Ids = new int[] { 3767 }, Name = "Sickened Stalker", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Stalker" }; - public static readonly Npc SickenedWolf = new() { Ids = new int[] { 3768 }, Name = "Sickened Wolf", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Wolf" }; - public static readonly Npc SickenedWarthog = new() { Ids = new int[] { 3769 }, Name = "Sickened Warthog", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Warthog" }; - public static readonly Npc SickenedBear = new() { Ids = new int[] { 3770 }, Name = "Sickened Bear", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Bear" }; - public static readonly Npc SickenedGuard = new() { Ids = new int[] { 3771, 3774 }, Name = "Sickened Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Guard" }; - public static readonly Npc SickenedServant = new() { Ids = new int[] { 3772 }, Name = "Sickened Servant", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Servant" }; - public static readonly Npc SickenedScribe = new() { Ids = new int[] { 3773 }, Name = "Sickened Scribe", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Scribe" }; - public static readonly Npc AfflictedYijo = new() { Ids = new int[] { 3780 }, Name = "Afflicted Yijo", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Yijo" }; - public static readonly Npc TheAfflictedKana = new() { Ids = new int[] { 3781 }, Name = "The Afflicted Kana", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Kana" }; - public static readonly Npc AfflictedRangerBoss = new() { Ids = new int[] { 3783 }, Name = "Afflicted Ranger Boss", WikiUrl = "https://wiki.guildwars.com/wiki/List_of_afflicted_bosses" }; - public static readonly Npc DiseasedMinister = new() { Ids = new int[] { 3784 }, Name = "Diseased Minister", WikiUrl = "https://wiki.guildwars.com/wiki/Diseased_Minister" }; - public static readonly Npc AfflictedHorror = new() { Ids = new int[] { 3785 }, Name = "Afflicted Horror", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Horror" }; - public static readonly Npc TheAfflictedLiYun = new() { Ids = new int[] { 3795 }, Name = "The Afflicted Li Yun", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Li_Yun" }; - public static readonly Npc TheAfflictedKam = new() { Ids = new int[] { 3797 }, Name = "The Afflicted Kam", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Kam" }; - public static readonly Npc TheAfflictedMiju = new() { Ids = new int[] { 3798 }, Name = "The Afflicted Miju", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Miju" }; - public static readonly Npc TheAfflictedHakaru = new() { Ids = new int[] { 3801 }, Name = "The Afflicted Hakaru", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Hakaru" }; - public static readonly Npc TheAfflictedSenku = new() { Ids = new int[] { 3802 }, Name = "The Afflicted Senku", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Senku" }; - public static readonly Npc TheAfflictedHsinJun = new() { Ids = new int[] { 3803 }, Name = "The Afflicted Hsin Jun", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Hsin_Jun" }; - public static readonly Npc TheAfflictedJingme = new() { Ids = new int[] { 3806 }, Name = "The Afflicted Jingme", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Jingme" }; - public static readonly Npc TheAfflictedMaaka = new() { Ids = new int[] { 3807 }, Name = "The Afflicted Maaka", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Maaka" }; - public static readonly Npc TheAfflictedXenxo = new() { Ids = new int[] { 3809 }, Name = "The Afflicted Xenxo", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Xenxo" }; - public static readonly Npc AfflictedAssassin = new() { Ids = new int[] { 3818, 3819, 3823 }, Name = "Afflicted Assassin", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Assassin" }; - public static readonly Npc AfflictedBull = new() { Ids = new int[] { 3825 }, Name = "Afflicted Bull", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Bull" }; - public static readonly Npc AfflictedMesmer = new() { Ids = new int[] { 3826, 3831 }, Name = "Afflicted Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Mesmer" }; - public static readonly Npc AfflictedNecromancer = new() { Ids = new int[] { 3833, 3838 }, Name = "Afflicted Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Necromancer" }; - public static readonly Npc AfflictedElementalist = new() { Ids = new int[] { 3840, 3841, 3845 }, Name = "Afflicted Elementalist", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Elementalist" }; - public static readonly Npc AfflictedMonk = new() { Ids = new int[] { 3847, 3848 }, Name = "Afflicted Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Monk" }; - public static readonly Npc AfflictedWarrior = new() { Ids = new int[] { 3854, 3859 }, Name = "Afflicted Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Warrior" }; - public static readonly Npc AfflictedRanger = new() { Ids = new int[] { 3861, 3862, 3866 }, Name = "Afflicted Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Ranger" }; - public static readonly Npc AfflictedRavager = new() { Ids = new int[] { 3868 }, Name = "Afflicted Ravager", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Ravager" }; - public static readonly Npc AfflictedRitualist = new() { Ids = new int[] { 3869 }, Name = "Afflicted Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Ritualist" }; - public static readonly Npc AhvaSankii = new() { Ids = new int[] { 3878 }, Name = "Ahva Sankii", WikiUrl = "https://wiki.guildwars.com/wiki/Ahva_Sankii" }; - public static readonly Npc PeiTheSkullBlade = new() { Ids = new int[] { 3879 }, Name = "Pei The Skull Blade", WikiUrl = "https://wiki.guildwars.com/wiki/Pei_the_Skull_Blade" }; - public static readonly Npc YingkoTheSkullClaw = new() { Ids = new int[] { 3881 }, Name = "Yingko The Skull Claw", WikiUrl = "https://wiki.guildwars.com/wiki/Yingko_the_Skull_Claw" }; - public static readonly Npc FengTheSkullSymbol = new() { Ids = new int[] { 3883 }, Name = "Feng The Skull Symbol", WikiUrl = "https://wiki.guildwars.com/wiki/Feng_The_Skull_Symbol" }; - public static readonly Npc CaptainQuimang = new() { Ids = new int[] { 3884 }, Name = "Captain Quimang", WikiUrl = "https://wiki.guildwars.com/wiki/Captain_Quimang" }; - public static readonly Npc JinTheSkullBow = new() { Ids = new int[] { 3885 }, Name = "Jin The Skull Bow", WikiUrl = "https://wiki.guildwars.com/wiki/Jin_the_Skull_Bow" }; - public static readonly Npc MikiTheSkullSpirit = new() { Ids = new int[] { 3886 }, Name = "Miki The Skull Spirit", WikiUrl = "https://wiki.guildwars.com/wiki/Miki_the_Skull_Spirit" }; - public static readonly Npc TahkayunTsi = new() { Ids = new int[] { 3887 }, Name = "Tahkayun Tsi", WikiUrl = "https://wiki.guildwars.com/wiki/Tahkayun_Tsi" }; - public static readonly Npc YunlaiDeathkeeper = new() { Ids = new int[] { 3888 }, Name = "Yunlai Deathkeeper", WikiUrl = "https://wiki.guildwars.com/wiki/Yunlai_Deathkeeper" }; - public static readonly Npc ZiinjuuLifeCrawler = new() { Ids = new int[] { 3889 }, Name = "Ziinjuu Life Crawler", WikiUrl = "https://wiki.guildwars.com/wiki/Ziinjuu_Life_Crawler" }; - public static readonly Npc Cow = new() { Ids = new int[] { 3892 }, Name = "Cow", WikiUrl = "https://wiki.guildwars.com/wiki/Cow" }; - public static readonly Npc BonesnapTurtle = new() { Ids = new int[] { 3895 }, Name = "Bonesnap Turtle", WikiUrl = "https://wiki.guildwars.com/wiki/Bonesnap_Turtle" }; - public static readonly Npc CrimsonSkullEtherFiend = new() { Ids = new int[] { 3896 }, Name = "Crimson Skull Ether Fiend", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Ether_Fiend" }; - public static readonly Npc CrimsonSkullMentalist = new() { Ids = new int[] { 3898 }, Name = "Crimson Skull Mentalist", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Mentalist" }; - public static readonly Npc CrimsonSkullMesmer = new() { Ids = new int[] { 3899 }, Name = "Crimson Skull Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Mesmer" }; - public static readonly Npc CrimsonSkullHealer = new() { Ids = new int[] { 3900 }, Name = "Crimson Skull Healer", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Healer" }; - public static readonly Npc CrimsonSkullMender = new() { Ids = new int[] { 3903 }, Name = "Crimson Skull Mender", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Mender" }; - public static readonly Npc CrimsonSkullHunter = new() { Ids = new int[] { 3904 }, Name = "Crimson Skull Hunter", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Hunter" }; - public static readonly Npc CrimsonSkullLongbow = new() { Ids = new int[] { 3906 }, Name = "Crimson Skull Longbow", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Longbow" }; - public static readonly Npc CrimsonSkullRaider = new() { Ids = new int[] { 3907 }, Name = "Crimson Skull Raider", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Raider" }; - public static readonly Npc CrimsonSkullSeer = new() { Ids = new int[] { 3908 }, Name = "Crimson Skull Seer", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Seer" }; - public static readonly Npc CrimsonSkullSpiritLord = new() { Ids = new int[] { 3910 }, Name = "Crimson Skull Spirit Lord", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Spirit_Lord" }; - public static readonly Npc CrimsonSkullRitualist = new() { Ids = new int[] { 3911 }, Name = "Crimson Skull Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Ritualist" }; - public static readonly Npc MantidDrone = new() { Ids = new int[] { 3914, 4168 }, Name = "Mantid Drone", WikiUrl = "https://wiki.guildwars.com/wiki/Mantid_Drone" }; - public static readonly Npc MantidDroneHatchling = new() { Ids = new int[] { 3921 }, Name = "Mantid Drone Hatchling ", WikiUrl = "https://wiki.guildwars.com/wiki/Mantid_Drone_Hatchling" }; - public static readonly Npc MantidMonitor = new() { Ids = new int[] { 3924, 4169 }, Name = "Mantid Monitor", WikiUrl = "https://wiki.guildwars.com/wiki/Mantid_Monitor" }; - public static readonly Npc MantidGlitterfang = new() { Ids = new int[] { 3929 }, Name = "Mantid Glitterfang", WikiUrl = "https://wiki.guildwars.com/wiki/Mantid_Glitterfang" }; - public static readonly Npc MantidMonitorHatchling = new() { Ids = new int[] { 3933 }, Name = "Mantid Monitor Hatchling", WikiUrl = "https://wiki.guildwars.com/wiki/Mantid_Monitor_Hatchling" }; - public static readonly Npc NagaWelp = new() { Ids = new int[] { 3936 }, Name = "Naga Welp", WikiUrl = "https://wiki.guildwars.com/wiki/Naga_Welp" }; - public static readonly Npc NagaSpellblade = new() { Ids = new int[] { 3939 }, Name = "Naga Spellblade", WikiUrl = "https://wiki.guildwars.com/wiki/Naga_Spellblade" }; - public static readonly Npc NagaWitch = new() { Ids = new int[] { 3940 }, Name = "Naga Witch", WikiUrl = "https://wiki.guildwars.com/wiki/Naga_Witch" }; - public static readonly Npc NagaSibyl = new() { Ids = new int[] { 3942 }, Name = "Naga Sibyl", WikiUrl = "https://wiki.guildwars.com/wiki/Naga_Sibyl" }; - public static readonly Npc SensaliAssassin = new() { Ids = new int[] { 3943 }, Name = "Sensali Assassin", WikiUrl = "https://wiki.guildwars.com/wiki/Sensali_Assassin" }; - public static readonly Npc SensaliBlood = new() { Ids = new int[] { 3945 }, Name = "Sensali Blood", WikiUrl = "https://wiki.guildwars.com/wiki/Sensali_Blood" }; - public static readonly Npc SensaliFighter = new() { Ids = new int[] { 3947 }, Name = "Sensali Fighter", WikiUrl = "https://wiki.guildwars.com/wiki/Sensali_Fighter" }; - public static readonly Npc Kappa = new() { Ids = new int[] { 3950, 3951, 4040 }, Name = "Kappa", WikiUrl = "https://wiki.guildwars.com/wiki/Kappa" }; - public static readonly Npc MountainYeti = new() { Ids = new int[] { 3954 }, Name = "Mountain Yeti", WikiUrl = "https://wiki.guildwars.com/wiki/Mountain_Yeti" }; - public static readonly Npc LonghairYeti = new() { Ids = new int[] { 3955 }, Name = "Longhair Yeti", WikiUrl = "https://wiki.guildwars.com/wiki/Longhair_Yeti" }; - public static readonly Npc RedYeti = new() { Ids = new int[] { 3956 }, Name = "Red Yeti", WikiUrl = "https://wiki.guildwars.com/wiki/Red_Yeti" }; - public static readonly Npc Zunraa = new() { Ids = new int[] { 3958 }, Name = "Zunraa", WikiUrl = "https://wiki.guildwars.com/wiki/Zunraa" }; - public static readonly Npc Kuunavang = new() { Ids = new int[] { 3965 }, Name = "Kuunavang", WikiUrl = "https://wiki.guildwars.com/wiki/Kuunavang" }; - public static readonly Npc RazortongueFrothspit = new() { Ids = new int[] { 3970 }, Name = "Razortongue Frothspit", WikiUrl = "https://wiki.guildwars.com/wiki/Razortongue_Frothspit" }; - public static readonly Npc KaySeyStormray = new() { Ids = new int[] { 3971 }, Name = "KaySey Stormray", WikiUrl = "https://wiki.guildwars.com/wiki/KaySey_Stormray" }; - public static readonly Npc MiellaLightwing = new() { Ids = new int[] { 3981 }, Name = "Miella Lightwing", WikiUrl = "https://wiki.guildwars.com/wiki/Miella_Lightwing" }; - public static readonly Npc SnapjawWindshell = new() { Ids = new int[] { 3982 }, Name = "Snapjaw Windshell", WikiUrl = "https://wiki.guildwars.com/wiki/Snapjaw_Windshell" }; - public static readonly Npc ArrahhshMountainclub = new() { Ids = new int[] { 3987 }, Name = "Arrahhsh Mountainclub", WikiUrl = "https://wiki.guildwars.com/wiki/Arrahhsh_Mountainclub" }; - public static readonly Npc AmadisWindOfTheSea = new() { Ids = new int[] { 3993 }, Name = "Amadis Wind Of The Sea", WikiUrl = "https://wiki.guildwars.com/wiki/Amadis,_Wind_of_the_Sea" }; - public static readonly Npc GeofferPainBringer = new() { Ids = new int[] { 3998 }, Name = "Geoffer Pain Bringer", WikiUrl = "https://wiki.guildwars.com/wiki/Geoffer_Pain_Bringer" }; - public static readonly Npc KenriiSeaSorrow = new() { Ids = new int[] { 4005 }, Name = "Kenrii Sea Sorrow", WikiUrl = "https://wiki.guildwars.com/wiki/Kenrii_Sea_Sorrow" }; - public static readonly Npc SiskaScalewand = new() { Ids = new int[] { 4007 }, Name = "Siska Scalewand", WikiUrl = "https://wiki.guildwars.com/wiki/Siska_Scalewand" }; - public static readonly Npc SarssStormscale = new() { Ids = new int[] { 4009 }, Name = "Sarss Stormscale", WikiUrl = "https://wiki.guildwars.com/wiki/Sarss,_Stormscale" }; - public static readonly Npc SskaiDragonsBirth = new() { Ids = new int[] { 4011 }, Name = "Sskai Dragon's Birth", WikiUrl = "https://wiki.guildwars.com/wiki/Sskai,_Dragon%27s_Birth" }; - public static readonly Npc SsynCoiledGrasp = new() { Ids = new int[] { 4013 }, Name = "Ssyn Coiled Grasp", WikiUrl = "https://wiki.guildwars.com/wiki/Ssyn_Coiled_Grasp" }; - public static readonly Npc ScuttleFish = new() { Ids = new int[] { 4018 }, Name = "Scuttle Fish", WikiUrl = "https://wiki.guildwars.com/wiki/Scuttle_Fish" }; - public static readonly Npc CreepingCarp = new() { Ids = new int[] { 4020 }, Name = "Creeping Carp", WikiUrl = "https://wiki.guildwars.com/wiki/Creeping_Carp" }; - public static readonly Npc Irukandji = new() { Ids = new int[] { 4021 }, Name = "Irukandji", WikiUrl = "https://wiki.guildwars.com/wiki/Irukandji" }; - public static readonly Npc Yeti = new() { Ids = new int[] { 4023, 4024 }, Name = "Yeti", WikiUrl = "https://wiki.guildwars.com/wiki/Yeti" }; - public static readonly Npc RotWallow = new() { Ids = new int[] { 4025 }, Name = "Rot Wallow", WikiUrl = "https://wiki.guildwars.com/wiki/Rot_Wallow" }; - public static readonly Npc LeviathanClaw = new() { Ids = new int[] { 4027 }, Name = "Leviathan Claw", WikiUrl = "https://wiki.guildwars.com/wiki/Leviathan_Claw" }; - public static readonly Npc LeviathanMouth = new() { Ids = new int[] { 4028 }, Name = "Leviathan Mouth", WikiUrl = "https://wiki.guildwars.com/wiki/Leviathan_Mouth" }; - public static readonly Npc KrakenSpawn = new() { Ids = new int[] { 4029 }, Name = "Kraken Spawn", WikiUrl = "https://wiki.guildwars.com/wiki/Kraken_Spawn" }; - public static readonly Npc SaltsprayDragon = new() { Ids = new int[] { 4032 }, Name = "Saltspray Dragon", WikiUrl = "https://wiki.guildwars.com/wiki/Saltspray_Dragon" }; - public static readonly Npc Albax = new() { Ids = new int[] { 4033 }, Name = "Albax", WikiUrl = "https://wiki.guildwars.com/wiki/Albax" }; - public static readonly Npc RockhideDragon = new() { Ids = new int[] { 4034 }, Name = "Rockhide Dragon", WikiUrl = "https://wiki.guildwars.com/wiki/Rockhide_Dragon" }; - public static readonly Npc OutcastAssassin = new() { Ids = new int[] { 4035 }, Name = "Outcast Assassin", WikiUrl = "https://wiki.guildwars.com/wiki/Outcast_Assassin" }; - public static readonly Npc OutcastDeathhand = new() { Ids = new int[] { 4036 }, Name = "Outcast Deathhand", WikiUrl = "https://wiki.guildwars.com/wiki/Outcast_Deathhand" }; - public static readonly Npc OutcastWarrior = new() { Ids = new int[] { 4037 }, Name = "Outcast Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Outcast_Warrior" }; - public static readonly Npc OutcastRitualist = new() { Ids = new int[] { 4039 }, Name = "Outcast Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Outcast_Ritualist" }; - public static readonly Npc NagaWarrior = new() { Ids = new int[] { 4042 }, Name = "Naga Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Naga_Warrior" }; - public static readonly Npc NagaArcher = new() { Ids = new int[] { 4043 }, Name = "Naga Archer", WikiUrl = "https://wiki.guildwars.com/wiki/Naga_Archer" }; - public static readonly Npc NagaRitualist = new() { Ids = new int[] { 4044 }, Name = "Naga Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Naga_Ritualist" }; - public static readonly Npc IslandGuardian = new() { Ids = new int[] { 4045 }, Name = "Island Guardian", WikiUrl = "https://wiki.guildwars.com/wiki/Island_Guardian" }; - public static readonly Npc SenkaiLordOfThe1000DaggersGuild = new() { Ids = new int[] { 4056 }, Name = "Senkai Lord Of The 1000 Daggers Guild", WikiUrl = "https://wiki.guildwars.com/wiki/Senkai,_Lord_of_the_1,000_Daggers_Guild" }; - public static readonly Npc RitualistsConstruct = new() { Ids = new int[] { 4080, 4097 }, Name = "Ritualist's Construct", WikiUrl = "https://wiki.guildwars.com/wiki/Ritualist%27s_Construct" }; - public static readonly Npc AssassinsConstruct = new() { Ids = new int[] { 4081, 4090 }, Name = "Assassin's Construct", WikiUrl = "https://wiki.guildwars.com/wiki/Assassin%27s_Construct" }; - public static readonly Npc ElementalsConstruct = new() { Ids = new int[] { 4093 }, Name = "Elemental's Construct", WikiUrl = "https://wiki.guildwars.com/wiki/Elemental%27s_Construct" }; - public static readonly Npc RangersConstruct = new() { Ids = new int[] { 4096 }, Name = "Ranger's Construct", WikiUrl = "https://wiki.guildwars.com/wiki/Ranger%27s_Construct" }; - public static readonly Npc ShiroTagachi = new() { Ids = new int[] { 4120, 4952 }, Name = "Shiro Tagachi", WikiUrl = "https://wiki.guildwars.com/wiki/Shiro_Tagachi" }; - public static readonly Npc ShirokenAssassin = new() { Ids = new int[] { 4125 }, Name = "Shiro'ken Assassin", WikiUrl = "https://wiki.guildwars.com/wiki/Shiro%27ken_Assassin" }; - public static readonly Npc ShirokenNecromancer = new() { Ids = new int[] { 4127 }, Name = "Shiro'ken Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Shiro%27ken_Necromancer" }; - public static readonly Npc ShirokenWarrior = new() { Ids = new int[] { 4130 }, Name = "Shiro'ken Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Shiro%27ken_Warrior" }; - public static readonly Npc ShirokenRanger = new() { Ids = new int[] { 4131 }, Name = "Shiro'ken Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Shiro%27ken_Ranger" }; - public static readonly Npc SpiritOfPortals = new() { Ids = new int[] { 4133 }, Name = "Spirit Of Portals", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Portals" }; - public static readonly Npc XuekaoTheDeceptive = new() { Ids = new int[] { 4174 }, Name = "Xuekao The Deceptive", WikiUrl = "https://wiki.guildwars.com/wiki/Xuekao,_the_Deceptive" }; - public static readonly Npc MinaShatterStorm = new() { Ids = new int[] { 4176 }, Name = "Mina Shatter Storm", WikiUrl = "https://wiki.guildwars.com/wiki/Mina_Shatter_Storm" }; - public static readonly Npc AmFahLeader = new() { Ids = new int[] { 4179 }, Name = "Am Fah Leader", WikiUrl = "https://wiki.guildwars.com/wiki/Am_Fah_Leader" }; - public static readonly Npc MeynsangTheSadistic = new() { Ids = new int[] { 4181 }, Name = "Meynsang The Sadistic", WikiUrl = "https://wiki.guildwars.com/wiki/Meynsang_the_Sadistic" }; - public static readonly Npc JinThePurifier = new() { Ids = new int[] { 4184 }, Name = "Jin The Purifier", WikiUrl = "https://wiki.guildwars.com/wiki/Jin,_the_Purifier" }; - public static readonly Npc LianDragonsPetal = new() { Ids = new int[] { 4186 }, Name = "Lian Dragon's Petal", WikiUrl = "https://wiki.guildwars.com/wiki/Lian,_Dragon%27s_Petal" }; - public static readonly Npc ShenTheMagistrate = new() { Ids = new int[] { 4187 }, Name = "Shen The Magistrate", WikiUrl = "https://wiki.guildwars.com/wiki/Shen,_the_Magistrate" }; - public static readonly Npc WingThreeBlade = new() { Ids = new int[] { 4188 }, Name = "Wing Three Blade", WikiUrl = "https://wiki.guildwars.com/wiki/Wing,_Three_Blade" }; - public static readonly Npc AmFahNecromancer = new() { Ids = new int[] { 4192 }, Name = "Am Fah Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Am_Fah_Necromancer" }; - public static readonly Npc AmFahHealer = new() { Ids = new int[] { 4193 }, Name = "Am Fah Healer", WikiUrl = "https://wiki.guildwars.com/wiki/Am_Fah_Healer" }; - public static readonly Npc AmFahMarksman = new() { Ids = new int[] { 4194 }, Name = "Am Fah Marksman", WikiUrl = "https://wiki.guildwars.com/wiki/Am_Fah_Marksman" }; - public static readonly Npc JadeBrotherhoodMesmer = new() { Ids = new int[] { 4195 }, Name = "Jade Brotherhood Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Brotherhood_Mesmer" }; - public static readonly Npc JadeBrotherhoodMage = new() { Ids = new int[] { 4196 }, Name = "Jade Brotherhood Mage", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Brotherhood_Mage" }; - public static readonly Npc JadeBrotherhoodKnight = new() { Ids = new int[] { 4197 }, Name = "Jade Brotherhood Knight", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Brotherhood_Knight" }; - public static readonly Npc JadeBrotherhoodRitualist = new() { Ids = new int[] { 4198 }, Name = "Jade Brotherhood Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Brotherhood_Ritualist" }; - public static readonly Npc SpiritOfPain = new() { Ids = new int[] { 4214 }, Name = "Spirit Of Pain", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Pain" }; - public static readonly Npc SpiritOfDestruction = new() { Ids = new int[] { 4215 }, Name = "Spirit Of Destruction", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Destruction" }; - public static readonly Npc SpiritOfUnion = new() { Ids = new int[] { 4217, 4224 }, Name = "Spirit Of Union", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Union" }; - public static readonly Npc SpiritOfLife = new() { Ids = new int[] { 4218 }, Name = "Spirit Of Life", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Life" }; - public static readonly Npc SpiritOfBloodSong = new() { Ids = new int[] { 4227 }, Name = "Spirit Of Blood Song", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Blood_Song" }; - public static readonly Npc SpiritOfWanderlust = new() { Ids = new int[] { 4228 }, Name = "Spirit Of Wanderlust", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Wanderlust" }; - public static readonly Npc SpiritOfLaceration = new() { Ids = new int[] { 4232 }, Name = "Spirit Of Laceration", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Laceration" }; - public static readonly Npc SpiritOfEquinox = new() { Ids = new int[] { 4236 }, Name = "Spirit Of Equinox", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Equinox" }; - public static readonly Npc SpiritOfFamine = new() { Ids = new int[] { 4238 }, Name = "Spirit Of Famine", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Famine" }; - public static readonly Npc SpiritOfBrambles = new() { Ids = new int[] { 4239 }, Name = "Spirit Of Brambles", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Brambles" }; - public static readonly Npc Flamingo = new() { Ids = new int[] { 4242 }, Name = "Flamingo", WikiUrl = "https://wiki.guildwars.com/wiki/Flamingo" }; - public static readonly Npc ElderCrocodile = new() { Ids = new int[] { 4268 }, Name = "Elder Crocodile", WikiUrl = "https://wiki.guildwars.com/wiki/Elder_Crocodile" }; - public static readonly Npc TaromRockbreaker = new() { Ids = new int[] { 4330 }, Name = "Tarom Rockbreaker", WikiUrl = "https://wiki.guildwars.com/wiki/Tarom_Rockbreaker" }; - public static readonly Npc HaiossBlessedWind = new() { Ids = new int[] { 4332 }, Name = "Haioss Blessed Wind", WikiUrl = "https://wiki.guildwars.com/wiki/Haioss,_Blessed_Wind" }; - public static readonly Npc ChinehSoaringLight = new() { Ids = new int[] { 4333 }, Name = "Chineh Soaring Light", WikiUrl = "https://wiki.guildwars.com/wiki/Chineh_Soaring_Light" }; - public static readonly Npc Apocrypha = new() { Ids = new int[] { 4335 }, Name = "Apocrypha", WikiUrl = "https://wiki.guildwars.com/wiki/Apocrypha" }; - public static readonly Npc HassinSoftskin = new() { Ids = new int[] { 4336 }, Name = "Hassin Softskin", WikiUrl = "https://wiki.guildwars.com/wiki/Hassin_Softskin" }; - public static readonly Npc SunehStormbringer = new() { Ids = new int[] { 4338 }, Name = "Suneh Stormbringer", WikiUrl = "https://wiki.guildwars.com/wiki/Suneh_Stormbringer" }; - public static readonly Npc StalkingNephila = new() { Ids = new int[] { 4346 }, Name = "Stalking Nephila", WikiUrl = "https://wiki.guildwars.com/wiki/Stalking_Nephila" }; - public static readonly Npc WaterDjinn = new() { Ids = new int[] { 4349, 4907 }, Name = "Water Djinn", WikiUrl = "https://wiki.guildwars.com/wiki/Water_Djinn" }; - public static readonly Npc RinkhalMonitor = new() { Ids = new int[] { 4354 }, Name = "Rinkhal Monitor", WikiUrl = "https://wiki.guildwars.com/wiki/Rinkhal_Monitor" }; - public static readonly Npc IrontoothDrake = new() { Ids = new int[] { 4356 }, Name = "Irontooth Drake", WikiUrl = "https://wiki.guildwars.com/wiki/Irontooth_Drake" }; - public static readonly Npc SkreeHatchling = new() { Ids = new int[] { 4360 }, Name = "Skree Hatchling", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Hatchling" }; - public static readonly Npc SkreeFledgeling = new() { Ids = new int[] { 4361 }, Name = "Skree Fledgeling", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Fledgeling" }; - public static readonly Npc SkreeGriffon = new() { Ids = new int[] { 4362 }, Name = "Skree Griffon", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Griffon" }; - public static readonly Npc SkreeTalon = new() { Ids = new int[] { 4363 }, Name = "Skree Talon", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Talon" }; - public static readonly Npc SkreeHunter = new() { Ids = new int[] { 4364 }, Name = "Skree Hunter", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Hunter" }; - public static readonly Npc SkreeWarbler = new() { Ids = new int[] { 4365 }, Name = "Skree Warbler", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Warbler" }; - public static readonly Npc RidgebackSkale = new() { Ids = new int[] { 4366, 4369, 4377, 4378 }, Name = "Ridgeback Skale", WikiUrl = "https://wiki.guildwars.com/wiki/Ridgeback_Skale" }; - public static readonly Npc SkaleLasher = new() { Ids = new int[] { 4367, 4370 }, Name = "Skale Lasher", WikiUrl = "https://wiki.guildwars.com/wiki/Skale_Lasher" }; - public static readonly Npc SkaleBlighter = new() { Ids = new int[] { 4368, 4376 }, Name = "Skale Blighter", WikiUrl = "https://wiki.guildwars.com/wiki/Skale_Blighter" }; - public static readonly Npc FrigidSkale = new() { Ids = new int[] { 4371, 4379 }, Name = "Frigid Skale", WikiUrl = "https://wiki.guildwars.com/wiki/Frigid_Skale" }; - public static readonly Npc JuvenileBladedTermite = new() { Ids = new int[] { 4380 }, Name = "Juvenile Bladed Termite", WikiUrl = "https://wiki.guildwars.com/wiki/Juvenile_Bladed_Termite" }; - public static readonly Npc GrubLance = new() { Ids = new int[] { 4381 }, Name = "Grub Lance", WikiUrl = "https://wiki.guildwars.com/wiki/Grub_Lance" }; - public static readonly Npc BladedTermite = new() { Ids = new int[] { 4382 }, Name = "Bladed Termite", WikiUrl = "https://wiki.guildwars.com/wiki/Bladed_Termite" }; - public static readonly Npc PreyingLance = new() { Ids = new int[] { 4383 }, Name = "Preying Lance", WikiUrl = "https://wiki.guildwars.com/wiki/Preying_Lance" }; - public static readonly Npc StormseedJacaranda = new() { Ids = new int[] { 4387, 4389, 4391 }, Name = "Stormseed Jacaranda", WikiUrl = "https://wiki.guildwars.com/wiki/Stormseed_Jacaranda" }; - public static readonly Npc FangedIboga = new() { Ids = new int[] { 4388, 4392 }, Name = "Fanged Iboga", WikiUrl = "https://wiki.guildwars.com/wiki/Fanged_Iboga" }; - public static readonly Npc MandragorImp = new() { Ids = new int[] { 4395, 4400, 4930 }, Name = "Mandragor Imp", WikiUrl = "https://wiki.guildwars.com/wiki/Mandragor_Imp" }; - public static readonly Npc MandragorSlither = new() { Ids = new int[] { 4396, 4402, 4932 }, Name = "Mandragor Slither", WikiUrl = "https://wiki.guildwars.com/wiki/Mandragor_Slither" }; - public static readonly Npc StonefleshMandragor = new() { Ids = new int[] { 4401, 4931 }, Name = "Stoneflesh Mandragor", WikiUrl = "https://wiki.guildwars.com/wiki/Stoneflesh_Mandragor" }; - public static readonly Npc GraspOfChaos = new() { Ids = new int[] { 4404 }, Name = "Grasp Of Chaos", WikiUrl = "https://wiki.guildwars.com/wiki/Grasp_of_Chaos" }; - public static readonly Npc Dehjah = new() { Ids = new int[] { 4406 }, Name = "Dehjah", WikiUrl = "https://wiki.guildwars.com/wiki/Dehjah" }; - public static readonly Npc BoklonBlackwater = new() { Ids = new int[] { 4414 }, Name = "Boklon Blackwater", WikiUrl = "https://wiki.guildwars.com/wiki/Boklon_Blackwater" }; - public static readonly Npc GlugKlugg = new() { Ids = new int[] { 4420 }, Name = "Glug Klugg", WikiUrl = "https://wiki.guildwars.com/wiki/Glug_Klugg" }; - public static readonly Npc ZhedShadowhoof = new() { Ids = new int[] { 4437, 4940, 4440 }, Name = "Zhed Shadowhoof", WikiUrl = "https://wiki.guildwars.com/wiki/Zhed_Shadowhoof" }; - public static readonly Npc Tahlkora = new() { Ids = new int[] { 4456, 4459 }, Name = "Tahlkora", WikiUrl = "https://wiki.guildwars.com/wiki/Tahlkora" }; - public static readonly Npc MasterOfWhispers = new() { Ids = new int[] { 4464 }, Name = "Master Of Whispers", WikiUrl = "https://wiki.guildwars.com/wiki/Master_of_Whispers" }; - public static readonly Npc AcolyteJin = new() { Ids = new int[] { 4469 }, Name = "Acolyte Jin", WikiUrl = "https://wiki.guildwars.com/wiki/Acolyte_Jin" }; - public static readonly Npc AcolyteSousuke = new() { Ids = new int[] { 4487, 4490 }, Name = "Acolyte Sousuke", WikiUrl = "https://wiki.guildwars.com/wiki/Acolyte_Sousuke" }; - public static readonly Npc Melonni = new() { Ids = new int[] { 4493, 4496 }, Name = "Melonni ", WikiUrl = "https://wiki.guildwars.com/wiki/Melonni" }; - public static readonly Npc Khim = new() { Ids = new int[] { 4531, 4549, 4578 }, Name = "Khim", WikiUrl = "https://wiki.guildwars.com/wiki/Khim" }; - public static readonly Npc Herta = new() { Ids = new int[] { 4532, 4537, 4544, 4551, 4566, 4576, 5989, 4586 }, Name = "Herta", WikiUrl = "https://wiki.guildwars.com/wiki/Herta" }; - public static readonly Npc Gehraz = new() { Ids = new int[] { 4533, 4540, 4547, 4554, 4571, 4581, 4591 }, Name = "Gehraz", WikiUrl = "https://wiki.guildwars.com/wiki/Gehraz" }; - public static readonly Npc Sogolon = new() { Ids = new int[] { 4534, 4541, 4548, 4555, 4572, 4582, 4592 }, Name = "Sogolon", WikiUrl = "https://wiki.guildwars.com/wiki/Sogolon" }; - public static readonly Npc Kihm = new() { Ids = new int[] { 4535, 4542, 4568 }, Name = "Kihm", WikiUrl = "https://wiki.guildwars.com/wiki/Kihm" }; - public static readonly Npc Odurra = new() { Ids = new int[] { 4536, 4543, 4550, 4563, 4573, 4583 }, Name = "Odurra", WikiUrl = "https://wiki.guildwars.com/wiki/Odurra" }; - public static readonly Npc Timera = new() { Ids = new int[] { 4538, 4545, 4552 }, Name = "Timera", WikiUrl = "https://wiki.guildwars.com/wiki/Timera" }; - public static readonly Npc Abasi = new() { Ids = new int[] { 4539, 4553, 4546 }, Name = "Abasi", WikiUrl = "https://wiki.guildwars.com/wiki/Abasi" }; - public static readonly Npc Sunspear = new() { Ids = new int[] { 4698, 4726, 4727, 4774, 4778, 4779, 4781, 4782, 4784, 4786, 4811, 4739, 4738 }, Name = "Sunspear", WikiUrl = "https://wiki.guildwars.com/wiki/Sunspear" }; - public static readonly Npc SunspearOfficer = new() { Ids = new int[] { 4700, 4701, 4705, 4723 }, Name = "Sunspear Officer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Istani" }; - public static readonly Npc Dzajo = new() { Ids = new int[] { 4702 }, Name = "Dzajo", WikiUrl = "https://wiki.guildwars.com/wiki/Dzajo" }; - public static readonly Npc ShoreWatcher = new() { Ids = new int[] { 4704 }, Name = "Shorewatcher", WikiUrl = "https://wiki.guildwars.com/wiki/Shorewatcher" }; - public static readonly Npc YoungChild = new() { Ids = new int[] { 4707, 4708 }, Name = "Young Child", WikiUrl = "https://wiki.guildwars.com/wiki/Young_Child" }; - public static readonly Npc IstaniNoble = new() { Ids = new int[] { 4709, 4710, 4711, 4733, 4737 }, Name = "Istani Noble", WikiUrl = "https://wiki.guildwars.com/wiki/Istani_Noble" }; - public static readonly Npc IstaniCommoner = new() { Ids = new int[] { 4712, 4713, 4715, 4722, 4724, 4725, 4729, 4730 }, Name = "Istani Commoner", WikiUrl = "https://wiki.guildwars.com/wiki/Istani_Commoner" }; - public static readonly Npc MonkSutoni = new() { Ids = new int[] { 4719 }, Name = "Monk Sutoni", WikiUrl = "https://wiki.guildwars.com/wiki/Monk_Sutoni" }; - public static readonly Npc Hagon = new() { Ids = new int[] { 4771 }, Name = "Hagon", WikiUrl = "https://wiki.guildwars.com/wiki/Hagon" }; - public static readonly Npc SunspearQuartermaster = new() { Ids = new int[] { 4772 }, Name = "Sunspear Quartermaster", WikiUrl = "https://wiki.guildwars.com/wiki/Sunspear_Quartermaster" }; - public static readonly Npc SunspearCaster = new() { Ids = new int[] { 4773 }, Name = "Sunspear Caster", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Istani" }; - public static readonly Npc Kina = new() { Ids = new int[] { 4776 }, Name = "Kina", WikiUrl = "https://wiki.guildwars.com/wiki/Kina" }; - public static readonly Npc ElderSuhl = new() { Ids = new int[] { 4813 }, Name = "Elder Suhl", WikiUrl = "https://wiki.guildwars.com/wiki/Elder_Suhl" }; - public static readonly Npc Kormir = new() { Ids = new int[] { 4865, 4864 }, Name = "Kormir", WikiUrl = "https://wiki.guildwars.com/wiki/Kormir" }; - public static readonly Npc DzabelLandGuardian = new() { Ids = new int[] { 4895 }, Name = "Dzabel Land Guardian", WikiUrl = "https://wiki.guildwars.com/wiki/Dzabel_Land_Guardian" }; - public static readonly Npc TheDrought = new() { Ids = new int[] { 4896 }, Name = "The Drought", WikiUrl = "https://wiki.guildwars.com/wiki/The_Drought" }; - public static readonly Npc CrackedMesa = new() { Ids = new int[] { 4904 }, Name = "Cracked Mesa", WikiUrl = "https://wiki.guildwars.com/wiki/Cracked_Mesa" }; - public static readonly Npc StoneShardCrag = new() { Ids = new int[] { 4905 }, Name = "Stone Shard Crag", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Shard_Crag" }; - public static readonly Npc BloodCowlHeket = new() { Ids = new int[] { 4909, 4694 }, Name = "Blood Cowl Heket", WikiUrl = "https://wiki.guildwars.com/wiki/Blood_Cowl_Heket" }; - public static readonly Npc BlueTongueHeket = new() { Ids = new int[] { 4910, 4695 }, Name = "Blue Tongue Heket", WikiUrl = "https://wiki.guildwars.com/wiki/Blue_Tongue_Heket" }; - public static readonly Npc StoneaxeHeket = new() { Ids = new int[] { 4911, 4696 }, Name = "Stoneaxe Heket", WikiUrl = "https://wiki.guildwars.com/wiki/Stoneaxe_Heket" }; - public static readonly Npc BeastSwornHeket = new() { Ids = new int[] { 4912, 4697 }, Name = "Beast Sworn Heket", WikiUrl = "https://wiki.guildwars.com/wiki/Beast_Sworn_Heket" }; - public static readonly Npc SteelfangDrake = new() { Ids = new int[] { 4918 }, Name = "Steelfang Drake", WikiUrl = "https://wiki.guildwars.com/wiki/Steelfang_Drake" }; - public static readonly Npc KuskaleBlighter = new() { Ids = new int[] { 4919 }, Name = "Kuskale Blighter", WikiUrl = "https://wiki.guildwars.com/wiki/Kuskale_Blighter" }; - public static readonly Npc RidgebackKuskale = new() { Ids = new int[] { 4920 }, Name = "Ridgeback Kuskale", WikiUrl = "https://wiki.guildwars.com/wiki/Ridgeback_Kuskale" }; - public static readonly Npc KuskaleLasher = new() { Ids = new int[] { 4921 }, Name = "Kuskale Lasher", WikiUrl = "https://wiki.guildwars.com/wiki/Kuskale_Lasher" }; - public static readonly Npc FrigidKuskale = new() { Ids = new int[] { 4922 }, Name = "Frigid Kuskale", WikiUrl = "https://wiki.guildwars.com/wiki/Frigid_Kuskale" }; - public static readonly Npc Droughtling = new() { Ids = new int[] { 4934 }, Name = "Droughtling", WikiUrl = "https://wiki.guildwars.com/wiki/Droughtling" }; - public static readonly Npc XunlaiChest = new() { Ids = new int[] { 5001 }, Name = "Xunlai Chest", WikiUrl = "https://wiki.guildwars.com/wiki/Xunlai_Chest" }; - public static readonly Npc CommanderWerishakul = new() { Ids = new int[] { 5020 }, Name = "Commander Werishakul", WikiUrl = "https://wiki.guildwars.com/wiki/Commander_Werishakul" }; - public static readonly Npc MidshipmanBennis = new() { Ids = new int[] { 5023 }, Name = "Midshipman Bennis", WikiUrl = "https://wiki.guildwars.com/wiki/Midshipman_Bennis" }; - public static readonly Npc AdmiralKaya = new() { Ids = new int[] { 5033 }, Name = "Admiral Kaya", WikiUrl = "https://wiki.guildwars.com/wiki/Admiral_Kaya" }; - public static readonly Npc CorsairWizard = new() { Ids = new int[] { 5034 }, Name = "Corsair Wizard", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Wizard" }; - public static readonly Npc CorsairBlackhand = new() { Ids = new int[] { 5035 }, Name = "Corsair Blackhand", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Blackhand" }; - public static readonly Npc CorsairCook = new() { Ids = new int[] { 5036 }, Name = "Corsair Cook", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Cook" }; - public static readonly Npc CorsairBosun = new() { Ids = new int[] { 5037, 5063 }, Name = "Corsair Bosun", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Bosun" }; - public static readonly Npc CorsairRaider = new() { Ids = new int[] { 5041, 5065 }, Name = "Corsair Raider", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Raider" }; - public static readonly Npc CorsairParagon = new() { Ids = new int[] { 5043 }, Name = "Corsair Paragon", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Istani" }; - public static readonly Npc CorsairMindReader = new() { Ids = new int[] { 5044 }, Name = "Corsair Mind Reader", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Mind_Reader" }; - public static readonly Npc CorsairDoctor = new() { Ids = new int[] { 5047 }, Name = "Corsair Doctor", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Doctor" }; - public static readonly Npc CorsairWeaponsMaster = new() { Ids = new int[] { 5048 }, Name = "Corsair Weapons Master", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Weapons_Master" }; - public static readonly Npc CorsairGrappler = new() { Ids = new int[] { 5050 }, Name = "Corsair Grappler", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Grappler" }; - public static readonly Npc CorsairAdmiral = new() { Ids = new int[] { 5051 }, Name = "Corsair Admiral", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Admiral" }; - public static readonly Npc CorsairSeer = new() { Ids = new int[] { 5052 }, Name = "Corsair Seer", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Seer" }; - public static readonly Npc CorsairFlogger = new() { Ids = new int[] { 5053 }, Name = "Corsair Flogger", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Flogger" }; - public static readonly Npc CorsairReefFinder = new() { Ids = new int[] { 5054 }, Name = "Corsair Reef Finder", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Reef_Finder" }; - public static readonly Npc CorsairMedic = new() { Ids = new int[] { 5055 }, Name = "Corsair Medic", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Medic" }; - public static readonly Npc CorsairThug = new() { Ids = new int[] { 5056 }, Name = "Corsair Thug", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Thug" }; - public static readonly Npc CorsairLookout = new() { Ids = new int[] { 5057 }, Name = "Corsair Lookout", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Lookout" }; - public static readonly Npc CorsairMarauder = new() { Ids = new int[] { 5058 }, Name = "Corsair Marauder", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Marauder" }; - public static readonly Npc CorsairCaptain = new() { Ids = new int[] { 5059 }, Name = "Corsair Captain", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Captain" }; - public static readonly Npc CorsairCutthroat = new() { Ids = new int[] { 5064 }, Name = "Corsair Cutthroat", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Cutthroat" }; - public static readonly Npc CorsairBerserker = new() { Ids = new int[] { 5066 }, Name = "Corsair Berserker", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Berserker" }; - public static readonly Npc CorsairCommandant = new() { Ids = new int[] { 5067 }, Name = "Corsair Commandant", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Commandant" }; - public static readonly Npc Corsair = new() { Ids = new int[] { 5072, 5079 }, Name = "Corsair", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair" }; - public static readonly Npc GatekeeperKahno = new() { Ids = new int[] { 5073 }, Name = "Gatekeeper Kahno", WikiUrl = "https://wiki.guildwars.com/wiki/Gatekeeper_Kahno" }; - public static readonly Npc UnluckySimon = new() { Ids = new int[] { 5074 }, Name = "Unlucky Simon", WikiUrl = "https://wiki.guildwars.com/wiki/Unlucky_Simon" }; - public static readonly Npc CorsairWarrior = new() { Ids = new int[] { 5076 }, Name = "Corsair Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Istani" }; - public static readonly Npc IronhookHube = new() { Ids = new int[] { 5077 }, Name = "Ironhook Hube", WikiUrl = "https://wiki.guildwars.com/wiki/Ironhook_Hube" }; - public static readonly Npc OneEyedRugger = new() { Ids = new int[] { 5078 }, Name = "One-Eyed Rugger", WikiUrl = "https://wiki.guildwars.com/wiki/One-Eyed_Rugger" }; - public static readonly Npc OrderOfWhispers = new() { Ids = new int[] { 5218, 5683 }, Name = "Order Of Whispers", WikiUrl = "https://wiki.guildwars.com/wiki/Order_of_Whispers" }; - public static readonly Npc ColonelChaklin = new() { Ids = new int[] { 5229 }, Name = "Colonel Chaklin", WikiUrl = "https://wiki.guildwars.com/wiki/Colonel_Chaklin" }; - public static readonly Npc ColonelCusto = new() { Ids = new int[] { 5230 }, Name = "Colonel Custo", WikiUrl = "https://wiki.guildwars.com/wiki/Colonel_Custo" }; - public static readonly Npc CorporalLuluh = new() { Ids = new int[] { 5231 }, Name = "Corporal Luluh", WikiUrl = "https://wiki.guildwars.com/wiki/Corporal_Luluh" }; - public static readonly Npc AcolyteofDwayna = new() { Ids = new int[] { 5237 }, Name = "Acolyte of Dwayna", WikiUrl = "https://wiki.guildwars.com/wiki/Acolyte_of_Dwayna" }; - public static readonly Npc GeneralKahyet = new() { Ids = new int[] { 5241 }, Name = "General Kahyet", WikiUrl = "https://wiki.guildwars.com/wiki/General_Kahyet" }; - public static readonly Npc CaptainBesuz = new() { Ids = new int[] { 5271 }, Name = "Captain Besuz", WikiUrl = "https://wiki.guildwars.com/wiki/Captain_Besuz" }; - public static readonly Npc DreamerHahla = new() { Ids = new int[] { 5278 }, Name = "Dreamer Hahla", WikiUrl = "https://wiki.guildwars.com/wiki/Dreamer_Hahla" }; - public static readonly Npc KournanSpotter = new() { Ids = new int[] { 5282 }, Name = "Kournan Spotter", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Spotter" }; - public static readonly Npc KournanEngineer = new() { Ids = new int[] { 5305 }, Name = "Kournan Engineer", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Engineer" }; - public static readonly Npc KournanSeer = new() { Ids = new int[] { 5321, 5319 }, Name = "Kournan Seer", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Seer" }; - public static readonly Npc KournanOppressor = new() { Ids = new int[] { 5325, 5323 }, Name = "Kournan Oppressor", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Oppressor" }; - public static readonly Npc KournanScribe = new() { Ids = new int[] { 5329, 5327 }, Name = "Kournan Scribe", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Scribe" }; - public static readonly Npc KournanPriest = new() { Ids = new int[] { 5333, 5331 }, Name = "Kournan Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Priest" }; - public static readonly Npc KournanGuard = new() { Ids = new int[] { 5336, 5340, 5364, 5365, 5370, 5337, 5368 }, Name = "Kournan Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Guard" }; - public static readonly Npc KournanBowman = new() { Ids = new int[] { 5345, 5343 }, Name = "Kournan Bowman", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Bowman" }; - public static readonly Npc KournanZealot = new() { Ids = new int[] { 5349, 5347 }, Name = "Kournan Zealot", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Zealot" }; - public static readonly Npc KournanPhalanx = new() { Ids = new int[] { 5351, 5354 }, Name = "Kournan Phalanx", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Phalanx" }; - public static readonly Npc KournanFieldCommander = new() { Ids = new int[] { 5353 }, Name = "Kournan Field Commander", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Field_Commander" }; - public static readonly Npc KournanChild = new() { Ids = new int[] { 5362, 5363 }, Name = "Kournan Child", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Child" }; - public static readonly Npc KournanNoble = new() { Ids = new int[] { 5373, 5374 }, Name = "Kournan Noble", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Noble" }; - public static readonly Npc KournanPeasant = new() { Ids = new int[] { 5375, 5376, 5377, 5378, 5379, 5380 }, Name = "Kournan Peasant", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Peasant" }; - public static readonly Npc WanderingPriest = new() { Ids = new int[] { 5383, 5384 }, Name = "Wandering Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Wandering_Priest" }; - public static readonly Npc Ashnod = new() { Ids = new int[] { 5389 }, Name = "Ashnod", WikiUrl = "https://wiki.guildwars.com/wiki/Ashnod" }; - public static readonly Npc Raleva = new() { Ids = new int[] { 5390 }, Name = "Raleva", WikiUrl = "https://wiki.guildwars.com/wiki/Raleva" }; - public static readonly Npc KournanTrader = new() { Ids = new int[] { 5402, 5396, 5397, 5400 }, Name = "Kournan Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kournans" }; - public static readonly Npc HarbingerOfTwilight = new() { Ids = new int[] { 5405, 5409 }, Name = "Harbinger Of Twilight", WikiUrl = "https://wiki.guildwars.com/wiki/Harbinger_of_Twilight" }; - public static readonly Npc RestlessDead = new() { Ids = new int[] { 5541 }, Name = "Restless Dead", WikiUrl = "https://wiki.guildwars.com/wiki/Restless_Dead" }; - public static readonly Npc RelentlessCorpse = new() { Ids = new int[] { 5542 }, Name = "Relentless Corpse", WikiUrl = "https://wiki.guildwars.com/wiki/Relentless_Corpse" }; - public static readonly Npc GhostlySunspearCommander = new() { Ids = new int[] { 5545 }, Name = "Ghostly Sunspear Commander", WikiUrl = "https://wiki.guildwars.com/wiki/Ghostly_Sunspear_Commander" }; - public static readonly Npc Kahdash = new() { Ids = new int[] { 5546 }, Name = "Kahdash", WikiUrl = "https://wiki.guildwars.com/wiki/Kahdash" }; - public static readonly Npc VabbianGuard = new() { Ids = new int[] { 5632, 5639, 5645, 5634, 5647, 5637 }, Name = "Vabbian Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Vabbian_Guard" }; - public static readonly Npc VabbianChild = new() { Ids = new int[] { 5649, 5648 }, Name = "Vabbian Child", WikiUrl = "https://wiki.guildwars.com/wiki/Vabbian_Child" }; - public static readonly Npc VabbianNoble = new() { Ids = new int[] { 5650, 5652 }, Name = "Vabbian Noble", WikiUrl = "https://wiki.guildwars.com/wiki/Vabbian_Noble" }; - public static readonly Npc RoyalChefHatundo = new() { Ids = new int[] { 5654 }, Name = "Royal Chef Hatundo", WikiUrl = "https://wiki.guildwars.com/wiki/Royal_Chef_Hatundo" }; - public static readonly Npc VabbianMerchant = new() { Ids = new int[] { 5670, 5673, 5669, 5681, 5675, 5676, 5677 }, Name = "Vabbian Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Vabbians" }; - public static readonly Npc SpiritOfInfuriatingHeat = new() { Ids = new int[] { 5715 }, Name = "Spirit Of Infuriating Heat", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Infuriating_Heat" }; - public static readonly Npc SpiritOfToxicity = new() { Ids = new int[] { 5716 }, Name = "Spirit Of Toxicity", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Toxicity" }; - public static readonly Npc SpiritOfFury = new() { Ids = new int[] { 5722 }, Name = "Spirit Of Fury", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Fury" }; - public static readonly Npc AlbinoRat = new() { Ids = new int[] { 5777 }, Name = "Albino Rat", WikiUrl = "https://wiki.guildwars.com/wiki/Albino_Rat" }; - public static readonly Npc WhiteCrab = new() { Ids = new int[] { 5778 }, Name = "White Crab", WikiUrl = "https://wiki.guildwars.com/wiki/White_Crab" }; - public static readonly Npc BlackWolf = new() { Ids = new int[] { 5780 }, Name = "Black Wolf", WikiUrl = "https://wiki.guildwars.com/wiki/Black_Wolf" }; - public static readonly Npc WhiteWolf = new() { Ids = new int[] { 5781 }, Name = "White Wolf", WikiUrl = "https://wiki.guildwars.com/wiki/White_Wolf" }; - public static readonly Npc MountainEagle = new() { Ids = new int[] { 5782 }, Name = "Mountain Eagle", WikiUrl = "https://wiki.guildwars.com/wiki/Mountain_Eagle" }; - public static readonly Npc PolarBear = new() { Ids = new int[] { 5783 }, Name = "Polar Bear", WikiUrl = "https://wiki.guildwars.com/wiki/Polar_Bear" }; - public static readonly Npc WhiteMoa = new() { Ids = new int[] { 5784 }, Name = "White Moa", WikiUrl = "https://wiki.guildwars.com/wiki/White_Moa" }; - public static readonly Npc Rabbit = new() { Ids = new int[] { 5842 }, Name = "Rabbit", WikiUrl = "https://wiki.guildwars.com/wiki/Rabbit" }; - public static readonly Npc ArcticWolf = new() { Ids = new int[] { 5843 }, Name = "Arctic Wolf", WikiUrl = "https://wiki.guildwars.com/wiki/Arctic_Wolf" }; - public static readonly Npc Stonewolf = new() { Ids = new int[] { 5844 }, Name = "Stonewolf", WikiUrl = "https://wiki.guildwars.com/wiki/Stonewolf" }; - public static readonly Npc Vekk = new() { Ids = new int[] { 5913 }, Name = "Vekk", WikiUrl = "https://wiki.guildwars.com/wiki/Vekk" }; - public static readonly Npc OgdenStonehealer = new() { Ids = new int[] { 5932 }, Name = "Ogden Stonehealer", WikiUrl = "https://wiki.guildwars.com/wiki/Ogden_Stonehealer" }; - public static readonly Npc Livia = new() { Ids = new int[] { 5948 }, Name = "Livia", WikiUrl = "https://wiki.guildwars.com/wiki/Livia" }; - public static readonly Npc Xandra = new() { Ids = new int[] { 5974 }, Name = "Xandra", WikiUrl = "https://wiki.guildwars.com/wiki/Xandra" }; - public static readonly Npc Jora = new() { Ids = new int[] { 5983 }, Name = "Jora", WikiUrl = "https://wiki.guildwars.com/wiki/Jora" }; - public static readonly Npc Bartholos = new() { Ids = new int[] { 6058 }, Name = "Bartholos", WikiUrl = "https://wiki.guildwars.com/wiki/Bartholos" }; - public static readonly Npc ShiningBladeCaster = new() { Ids = new int[] { 6064 }, Name = "Shining Blade Caster", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; - public static readonly Npc KilroyStonekin = new() { Ids = new int[] { 6174 }, Name = "Kilroy Stonekin", WikiUrl = "https://wiki.guildwars.com/wiki/Kilroy_Stonekin" }; - public static readonly Npc DwarvenMiner = new() { Ids = new int[] { 6181 }, Name = "Dwarven Miner", WikiUrl = "https://wiki.guildwars.com/wiki/Dwarven_Miner" }; - public static readonly Npc WildermWrathspew = new() { Ids = new int[] { 6256 }, Name = "Wilderm Wrathspew", WikiUrl = "https://wiki.guildwars.com/wiki/Wilderm_Wrathspew" }; - public static readonly Npc FlanussBroadwing = new() { Ids = new int[] { 6258 }, Name = "Flanuss Broadwing", WikiUrl = "https://wiki.guildwars.com/wiki/Flanuss_Broadwing" }; - public static readonly Npc MobrinLordOfTheMarsh = new() { Ids = new int[] { 6261 }, Name = "Mobrin Lord Of The Marsh", WikiUrl = "https://wiki.guildwars.com/wiki/Mobrin,_Lord_of_the_Marsh" }; - public static readonly Npc PywattTheSwift = new() { Ids = new int[] { 6262 }, Name = "Pywatt The Swift", WikiUrl = "https://wiki.guildwars.com/wiki/Pywatt_the_Swift" }; - public static readonly Npc BrynnEarthporter = new() { Ids = new int[] { 6268 }, Name = "Brynn Earthporter", WikiUrl = "https://wiki.guildwars.com/wiki/Brynn_Earthporter" }; - public static readonly Npc KraitHypnoss = new() { Ids = new int[] { 6287 }, Name = "Krait Hypnoss", WikiUrl = "https://wiki.guildwars.com/wiki/Krait_Hypnoss" }; - public static readonly Npc KraitArcanoss = new() { Ids = new int[] { 6288 }, Name = "Krait Arcanoss", WikiUrl = "https://wiki.guildwars.com/wiki/Krait_Arcanoss" }; - public static readonly Npc KraitDevouss = new() { Ids = new int[] { 6289 }, Name = "Krait Devouss", WikiUrl = "https://wiki.guildwars.com/wiki/Krait_Devouss" }; - public static readonly Npc KraitNecross = new() { Ids = new int[] { 6290 }, Name = "Krait Necross", WikiUrl = "https://wiki.guildwars.com/wiki/Krait_Necross" }; - public static readonly Npc KraitNeoss = new() { Ids = new int[] { 6293 }, Name = "Krait Neoss", WikiUrl = "https://wiki.guildwars.com/wiki/Krait_Neoss" }; - public static readonly Npc SavageOakheart = new() { Ids = new int[] { 6301 }, Name = "Savage Oakheart", WikiUrl = "https://wiki.guildwars.com/wiki/Savage_Oakheart" }; - public static readonly Npc SkelkAfflictor = new() { Ids = new int[] { 6303 }, Name = "Skelk Afflictor", WikiUrl = "https://wiki.guildwars.com/wiki/Skelk_Afflictor" }; - public static readonly Npc SkelkScourger = new() { Ids = new int[] { 6304 }, Name = "Skelk Scourger", WikiUrl = "https://wiki.guildwars.com/wiki/Skelk_Scourger" }; - public static readonly Npc SkelkReaper = new() { Ids = new int[] { 6305 }, Name = "Skelk Reaper", WikiUrl = "https://wiki.guildwars.com/wiki/Skelk_Reaper" }; - public static readonly Npc Angorodon = new() { Ids = new int[] { 6306 }, Name = "Angorodon", WikiUrl = "https://wiki.guildwars.com/wiki/Angorodon" }; - public static readonly Npc Ferothrax = new() { Ids = new int[] { 6307 }, Name = "Ferothrax", WikiUrl = "https://wiki.guildwars.com/wiki/Ferothrax" }; - public static readonly Npc Ceratadon = new() { Ids = new int[] { 6308 }, Name = "Ceratadon", WikiUrl = "https://wiki.guildwars.com/wiki/Ceratadon" }; - public static readonly Npc Tyrannus = new() { Ids = new int[] { 6309 }, Name = "Tyrannus", WikiUrl = "https://wiki.guildwars.com/wiki/Tyrannus" }; - public static readonly Npc Raptor = new() { Ids = new int[] { 6310 }, Name = "Raptor", WikiUrl = "https://wiki.guildwars.com/wiki/Raptor" }; - public static readonly Npc AgariTlamatini = new() { Ids = new int[] { 6316 }, Name = "Agari Tlamatini", WikiUrl = "https://wiki.guildwars.com/wiki/Agari_Tlamatini" }; - public static readonly Npc AgariAmini = new() { Ids = new int[] { 6317 }, Name = "Agari Amini", WikiUrl = "https://wiki.guildwars.com/wiki/Agari_Amini" }; - public static readonly Npc AgariNahualli = new() { Ids = new int[] { 6318 }, Name = "Agari Nahualli", WikiUrl = "https://wiki.guildwars.com/wiki/Agari_Nahualli" }; - public static readonly Npc AgariCuicani = new() { Ids = new int[] { 6319 }, Name = "Agari Cuicani", WikiUrl = "https://wiki.guildwars.com/wiki/Agari_Cuicani" }; - public static readonly Npc Bloodweaver = new() { Ids = new int[] { 6328, 6329 }, Name = "Bloodweaver", WikiUrl = "https://wiki.guildwars.com/wiki/Bloodweaver" }; - public static readonly Npc Lifeweaver = new() { Ids = new int[] { 6330, 6331 }, Name = "Lifeweaver", WikiUrl = "https://wiki.guildwars.com/wiki/Lifeweaver" }; - public static readonly Npc Venomweaver = new() { Ids = new int[] { 6333 }, Name = "Venomweaver", WikiUrl = "https://wiki.guildwars.com/wiki/Venomweaver" }; - public static readonly Npc CloudtouchedSimian = new() { Ids = new int[] { 6334 }, Name = "Cloudtouched Simian", WikiUrl = "https://wiki.guildwars.com/wiki/Cloudtouched_Simian" }; - public static readonly Npc RedhandSimian = new() { Ids = new int[] { 6335 }, Name = "Redhand Simian", WikiUrl = "https://wiki.guildwars.com/wiki/Redhand_Simian" }; - public static readonly Npc QuetzalSly = new() { Ids = new int[] { 6337 }, Name = "Quetzal Sly", WikiUrl = "https://wiki.guildwars.com/wiki/Quetzal_Sly" }; - public static readonly Npc QuetzalDark = new() { Ids = new int[] { 6338 }, Name = "Quetzal Dark", WikiUrl = "https://wiki.guildwars.com/wiki/Quetzal_Dark" }; - public static readonly Npc QuetzalStark = new() { Ids = new int[] { 6339 }, Name = "Quetzal Stark", WikiUrl = "https://wiki.guildwars.com/wiki/Quetzal_Stark" }; - public static readonly Npc QuetzalKeen = new() { Ids = new int[] { 6340 }, Name = "Quetzal Keen", WikiUrl = "https://wiki.guildwars.com/wiki/Quetzal_Keen" }; - public static readonly Npc SifShadowhunter = new() { Ids = new int[] { 6347, 6348 }, Name = "Sif Shadowhunter", WikiUrl = "https://wiki.guildwars.com/wiki/Sif_Shadowhunter" }; - public static readonly Npc NornCommoner = new() { Ids = new int[] { 6349, 6385, 6390, 6398, 6404 }, Name = "Norn Commoner", WikiUrl = "https://wiki.guildwars.com/wiki/Norn_Commoner" }; - public static readonly Npc OlafOlafson = new() { Ids = new int[] { 6352 }, Name = "Olaf Olafson", WikiUrl = "https://wiki.guildwars.com/wiki/Olaf_Olafson" }; - public static readonly Npc GunnarPoundfist = new() { Ids = new int[] { 6353 }, Name = "Gunnar Poundfist", WikiUrl = "https://wiki.guildwars.com/wiki/Gunnar_Poundfist" }; - public static readonly Npc NornGuard = new() { Ids = new int[] { 6357, 6380 }, Name = "Norn Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Norn_Guard" }; - public static readonly Npc NornWarrior = new() { Ids = new int[] { 6374 }, Name = "Norn Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Norn_Warrior" }; - public static readonly Npc Eyja = new() { Ids = new int[] { 6384 }, Name = "Eyja", WikiUrl = "https://wiki.guildwars.com/wiki/Eyja" }; - public static readonly Npc NornTrader = new() { Ids = new int[] { 6387, 6392, 6393, 6394, 6395, 6396, 6399, 6400 }, Name = "Norn Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Norn" }; - public static readonly Npc NornWeaponsmith = new() { Ids = new int[] { 6389 }, Name = "Norn Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Norn" }; - public static readonly Npc NornElder = new() { Ids = new int[] { 6397 }, Name = "Norn Elder", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Norn" }; - public static readonly Npc GlacialGriffon = new() { Ids = new int[] { 6411 }, Name = "Glacial Griffon", WikiUrl = "https://wiki.guildwars.com/wiki/Glacial_Griffon" }; - public static readonly Npc SavageNornbear = new() { Ids = new int[] { 6418 }, Name = "Savage Nornbear", WikiUrl = "https://wiki.guildwars.com/wiki/Savage_Nornbear" }; - public static readonly Npc InscribedEttin = new() { Ids = new int[] { 6432 }, Name = "Inscribed Ettin", WikiUrl = "https://wiki.guildwars.com/wiki/Inscribed_Ettin" }; - public static readonly Npc NulfastuEarthbound = new() { Ids = new int[] { 6445 }, Name = "Nulfastu Earthbound", WikiUrl = "https://wiki.guildwars.com/wiki/Nulfastu_Earthbound" }; - public static readonly Npc MyishLadyOfTheLake = new() { Ids = new int[] { 6447 }, Name = "Myish Lady Of The Lake", WikiUrl = "https://wiki.guildwars.com/wiki/Myish,_Lady_of_the_Lake" }; - public static readonly Npc Whiteout = new() { Ids = new int[] { 6448 }, Name = "Whiteout", WikiUrl = "https://wiki.guildwars.com/wiki/Whiteout" }; - public static readonly Npc AvarrTheFallen = new() { Ids = new int[] { 6454 }, Name = "Avarr The Fallen", WikiUrl = "https://wiki.guildwars.com/wiki/Avarr_The_Fallen" }; - public static readonly Npc ModniirPriest = new() { Ids = new int[] { 6473 }, Name = "Modniir Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Modniir_Priest" }; - public static readonly Npc ModniirBerserker = new() { Ids = new int[] { 6475 }, Name = "Modniir Berserker", WikiUrl = "https://wiki.guildwars.com/wiki/Modniir_Berserker" }; - public static readonly Npc ModniirHunter = new() { Ids = new int[] { 6476 }, Name = "Modniir Hunter", WikiUrl = "https://wiki.guildwars.com/wiki/Modniir_Hunter" }; - public static readonly Npc Avalanche = new() { Ids = new int[] { 6477 }, Name = "Avalanche", WikiUrl = "https://wiki.guildwars.com/wiki/Avalanche" }; - public static readonly Npc FrozenElemental = new() { Ids = new int[] { 6478 }, Name = "Frozen Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Frozen_Elemental" }; - public static readonly Npc ChillingWisp = new() { Ids = new int[] { 6479 }, Name = "Chilling Wisp", WikiUrl = "https://wiki.guildwars.com/wiki/Chilling_Wisp" }; - public static readonly Npc JotunSkullsmasher = new() { Ids = new int[] { 6480 }, Name = "Jotun Skullsmasher", WikiUrl = "https://wiki.guildwars.com/wiki/Jotun_Skullsmasher" }; - public static readonly Npc JotunMindbreaker = new() { Ids = new int[] { 6481 }, Name = "Jotun Mindbreaker", WikiUrl = "https://wiki.guildwars.com/wiki/Jotun_Mindbreaker" }; - public static readonly Npc JotunBladeturner = new() { Ids = new int[] { 6482 }, Name = "Jotun Bladeturner", WikiUrl = "https://wiki.guildwars.com/wiki/Jotun_Bladeturner" }; - public static readonly Npc JotunBloodcurdler = new() { Ids = new int[] { 6483 }, Name = "Jotun Bloodcurdler", WikiUrl = "https://wiki.guildwars.com/wiki/Jotun_Bloodcurdler" }; - public static readonly Npc BerserkingWendigo = new() { Ids = new int[] { 6484 }, Name = "Berserking Wendigo", WikiUrl = "https://wiki.guildwars.com/wiki/Berserking_Wendigo" }; - public static readonly Npc BerserkingAuroch = new() { Ids = new int[] { 6485 }, Name = "Berserking Auroch", WikiUrl = "https://wiki.guildwars.com/wiki/Berserking_Aurochs" }; - public static readonly Npc BerserkingMinotaur = new() { Ids = new int[] { 6486 }, Name = "Berserking Minotaur", WikiUrl = "https://wiki.guildwars.com/wiki/Berserking_Minotaur" }; - public static readonly Npc BerserkingBison = new() { Ids = new int[] { 6487 }, Name = "Berserking Bison", WikiUrl = "https://wiki.guildwars.com/wiki/Berserking_Bison" }; - public static readonly Npc MountainPinesoul = new() { Ids = new int[] { 6488 }, Name = "Mountain Pinesoul", WikiUrl = "https://wiki.guildwars.com/wiki/Mountain_Pinesoul" }; - public static readonly Npc MountainAloe = new() { Ids = new int[] { 6489 }, Name = "Mountain Aloe", WikiUrl = "https://wiki.guildwars.com/wiki/Mountain_Aloe" }; - public static readonly Npc SpectralVaettir = new() { Ids = new int[] { 6490 }, Name = "Spectral Vaettir", WikiUrl = "https://wiki.guildwars.com/wiki/Spectral_Vaettir" }; - public static readonly Npc FrostWurm = new() { Ids = new int[] { 6491 }, Name = "Frost Wurm", WikiUrl = "https://wiki.guildwars.com/wiki/Frost_Wurm" }; - public static readonly Npc CharrProphet = new() { Ids = new int[] { 6624 }, Name = "Charr Prophet", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Prophet" }; - public static readonly Npc FronisIrontoe = new() { Ids = new int[] { 6690 }, Name = "Fronis Irontoe", WikiUrl = "https://wiki.guildwars.com/wiki/Fronis_Irontoe" }; - public static readonly Npc StoneSummitRanger = new() { Ids = new int[] { 6695 }, Name = "Stone Summit Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Ranger" }; - public static readonly Npc StoneSummitHealer = new() { Ids = new int[] { 6699 }, Name = "Stone Summit Healer", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Healer" }; - public static readonly Npc StoneSummitCrusher = new() { Ids = new int[] { 6702, 6993, 2645 }, Name = "Stone Summit Crusher", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Crusher" }; - public static readonly Npc AsuranMaterialTrader = new() { Ids = new int[] { 6712 }, Name = "Asuran Material Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Asura" }; - public static readonly Npc Lork = new() { Ids = new int[] { 6718 }, Name = "Lork", WikiUrl = "https://wiki.guildwars.com/wiki/Lork" }; - public static readonly Npc Gadd = new() { Ids = new int[] { 6721 }, Name = "Gadd", WikiUrl = "https://wiki.guildwars.com/wiki/Gadd" }; - public static readonly Npc PurifierKreweMember = new() { Ids = new int[] { 6756 }, Name = "Purifier Krewe Member", WikiUrl = "https://wiki.guildwars.com/wiki/Purifier_Krewe_Member" }; - public static readonly Npc Blorf = new() { Ids = new int[] { 6757 }, Name = "Blorf", WikiUrl = "https://wiki.guildwars.com/wiki/Blorf" }; - public static readonly Npc AsuranElder = new() { Ids = new int[] { 6771 }, Name = "Asuran Elder", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Asura" }; - public static readonly Npc AsuranRuneTrader = new() { Ids = new int[] { 6774 }, Name = "Asuran Rune Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Asura" }; - public static readonly Npc Asuran = new() { Ids = new int[] { 6775 }, Name = "Asuran", WikiUrl = "https://wiki.guildwars.com/wiki/Asuran" }; - public static readonly Npc AsuranChild = new() { Ids = new int[] { 6777 }, Name = "Asuran Child", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Asura" }; - public static readonly Npc Fonk = new() { Ids = new int[] { 6782 }, Name = "Fonk", WikiUrl = "https://wiki.guildwars.com/wiki/Fonk" }; - public static readonly Npc EnchantedScythe = new() { Ids = new int[] { 6815 }, Name = "Enchanted Scythe", WikiUrl = "https://wiki.guildwars.com/wiki/Enchanted_Scythe" }; - public static readonly Npc EnchantedShield = new() { Ids = new int[] { 6816 }, Name = "Enchanted Shield", WikiUrl = "https://wiki.guildwars.com/wiki/Enchanted_Shield" }; - public static readonly Npc DredgeCaster = new() { Ids = new int[] { 6837 }, Name = "Dredge Caster", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Dredge" }; - public static readonly Npc BloodthirstIncubus = new() { Ids = new int[] { 6845 }, Name = "Bloodthirst Incubus", WikiUrl = "https://wiki.guildwars.com/wiki/Bloodthirst_Incubus" }; - public static readonly Npc CryptwingIncubus = new() { Ids = new int[] { 6849 }, Name = "Cryptwing Incubus", WikiUrl = "https://wiki.guildwars.com/wiki/Cryptwing_Incubus" }; - public static readonly Npc StormcloudIncubus = new() { Ids = new int[] { 6851 }, Name = "Stormcloud Incubus", WikiUrl = "https://wiki.guildwars.com/wiki/Stormcloud_Incubus" }; - public static readonly Npc SkelkSlasher = new() { Ids = new int[] { 6853 }, Name = "Skelk Slasher", WikiUrl = "https://wiki.guildwars.com/wiki/Skelk_Slasher" }; - public static readonly Npc SkelkCorrupter = new() { Ids = new int[] { 6854 }, Name = "Skelk Corrupter", WikiUrl = "https://wiki.guildwars.com/wiki/Skelk_Corrupter" }; - public static readonly Npc SkelkRampager = new() { Ids = new int[] { 6855 }, Name = "Skelk Rampager", WikiUrl = "https://wiki.guildwars.com/wiki/Skelk_Rampager" }; - public static readonly Npc EnchantedAxe = new() { Ids = new int[] { 6862 }, Name = "Enchanted Axe", WikiUrl = "https://wiki.guildwars.com/wiki/Enchanted_Axe" }; - public static readonly Npc ShimmeringOoze = new() { Ids = new int[] { 6888, 6889, 6890 }, Name = "Shimmering Ooze", WikiUrl = "https://wiki.guildwars.com/wiki/Shimmering_Ooze" }; - public static readonly Npc OminousOoze = new() { Ids = new int[] { 6891 }, Name = "Ominous Ooze", WikiUrl = "https://wiki.guildwars.com/wiki/Ominous_Ooze" }; - public static readonly Npc EarthboundOoze = new() { Ids = new int[] { 6894, 6896 }, Name = "Earthbound Ooze", WikiUrl = "https://wiki.guildwars.com/wiki/Earthbound_Ooze" }; - public static readonly Npc CorruptedAloe = new() { Ids = new int[] { 6905 }, Name = "Corrupted Aloe", WikiUrl = "https://wiki.guildwars.com/wiki/Corrupted_Aloe" }; - public static readonly Npc FungalBloom = new() { Ids = new int[] { 6906 }, Name = "Fungal Bloom", WikiUrl = "https://wiki.guildwars.com/wiki/Fungal_Bloom" }; - public static readonly Npc InscribedGuardian = new() { Ids = new int[] { 6909 }, Name = "Inscribed Guardian", WikiUrl = "https://wiki.guildwars.com/wiki/Inscribed_Guardian" }; - public static readonly Npc FragmentOfAntiquities = new() { Ids = new int[] { 6933 }, Name = "Fragment Of Antiquities", WikiUrl = "https://wiki.guildwars.com/wiki/Fragment_of_Antiquities" }; - public static readonly Npc RemnantOfAntiquities = new() { Ids = new int[] { 6934 }, Name = "Remnant Of Antiquities", WikiUrl = "https://wiki.guildwars.com/wiki/Remnant_of_Antiquities" }; - public static readonly Npc RegentOfIce = new() { Ids = new int[] { 6935 }, Name = "Regent Of Ice", WikiUrl = "https://wiki.guildwars.com/wiki/Regent_of_Ice" }; - public static readonly Npc ChromaticDrake = new() { Ids = new int[] { 6938 }, Name = "Chromatic Drake", WikiUrl = "https://wiki.guildwars.com/wiki/Chromatic_Drake" }; - public static readonly Npc TerrorbondDryder = new() { Ids = new int[] { 6942 }, Name = "Terrorbond Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Terrorbond_Dryder" }; - public static readonly Npc DreadgazeDryder = new() { Ids = new int[] { 6943 }, Name = "Dreadgaze Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Dreadgaze_Dryder" }; - public static readonly Npc BloodtaintDryder = new() { Ids = new int[] { 6944 }, Name = "Bloodtaint Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Bloodtaint_Dryder" }; - public static readonly Npc SoulfireDryder = new() { Ids = new int[] { 6945 }, Name = "Soulfire Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Soulfire_Dryder" }; - public static readonly Npc ShatteredElemental = new() { Ids = new int[] { 6948 }, Name = "Shattered Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Shattered_Elemental" }; - public static readonly Npc WhirlingWisp = new() { Ids = new int[] { 6949 }, Name = "Whirling Wisp", WikiUrl = "https://wiki.guildwars.com/wiki/Whirling_Wisp" }; - public static readonly Npc IcyStalagmite = new() { Ids = new int[] { 6950 }, Name = "Icy Stalagmite", WikiUrl = "https://wiki.guildwars.com/wiki/Icy_Stalagmite" }; - public static readonly Npc ShadowVaettir = new() { Ids = new int[] { 6953 }, Name = "Shadow Vaettir", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_Vaettir" }; - public static readonly Npc ScourgeVaettir = new() { Ids = new int[] { 6956 }, Name = "Scourge Vaettir", WikiUrl = "https://wiki.guildwars.com/wiki/Scourge_Vaettir" }; - public static readonly Npc MistVaettir = new() { Ids = new int[] { 6959 }, Name = "Mist Vaettir", WikiUrl = "https://wiki.guildwars.com/wiki/Mist_Vaettir" }; - public static readonly Npc CursedBrigand = new() { Ids = new int[] { 7009 }, Name = "Cursed Brigand", WikiUrl = "https://wiki.guildwars.com/wiki/Cursed_Brigand" }; - public static readonly Npc DamnedCrewman = new() { Ids = new int[] { 7012 }, Name = "Damned Crewman", WikiUrl = "https://wiki.guildwars.com/wiki/Damned_Crewman" }; - public static readonly Npc FendiNin = new() { Ids = new int[] { 7013 }, Name = "Fendi Nin", WikiUrl = "https://wiki.guildwars.com/wiki/Fendi_Nin" }; - public static readonly Npc SoulOfFendiNin = new() { Ids = new int[] { 7014 }, Name = "Soul Of Fendi Nin", WikiUrl = "https://wiki.guildwars.com/wiki/Soul_of_Fendi_Nin" }; - public static readonly Npc PirateGhost = new() { Ids = new int[] { 7020 }, Name = "Pirate Ghost", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Ghosts" }; - public static readonly Npc CryptWraith = new() { Ids = new int[] { 7028 }, Name = "Crypt Wraith", WikiUrl = "https://wiki.guildwars.com/wiki/Crypt_Wraith" }; - public static readonly Npc ShockPhantom = new() { Ids = new int[] { 7032 }, Name = "Shock Phantom", WikiUrl = "https://wiki.guildwars.com/wiki/Shock_Phantom" }; - public static readonly Npc SkeletonIllusionist = new() { Ids = new int[] { 7036 }, Name = "Skeleton Illusionist", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Illusionist" }; - public static readonly Npc SkeletonWizard = new() { Ids = new int[] { 7037 }, Name = "Skeleton Wizard", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Wizard" }; - public static readonly Npc SkeletalHound = new() { Ids = new int[] { 7038 }, Name = "Skeletal Hound", WikiUrl = "https://wiki.guildwars.com/wiki/Skeletal_Hound" }; - public static readonly Npc SkeletonPriest = new() { Ids = new int[] { 7040 }, Name = "Skeleton Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Priest" }; - public static readonly Npc SkeletonArcher = new() { Ids = new int[] { 7041 }, Name = "Skeleton Archer", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Archer" }; - public static readonly Npc DecayedDragon = new() { Ids = new int[] { 7042 }, Name = "Decayed Dragon", WikiUrl = "https://wiki.guildwars.com/wiki/Decayed_Dragon" }; - public static readonly Npc ZombieBrute = new() { Ids = new int[] { 7043 }, Name = "Zombie Brute", WikiUrl = "https://wiki.guildwars.com/wiki/Zombie_Brute" }; - public static readonly Npc ZombieNecromancer = new() { Ids = new int[] { 7044 }, Name = "Zombie Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Zombie_Necromancer" }; - public static readonly Npc ChainedCleric = new() { Ids = new int[] { 7046 }, Name = "Chained Cleric", WikiUrl = "https://wiki.guildwars.com/wiki/Chained_Cleric" }; - public static readonly Npc WintersdayMoa = new() { Ids = new int[] { 7374 }, Name = "Wintersday Moa", WikiUrl = "https://wiki.guildwars.com/wiki/Wintersday_Moa" }; - public static readonly Npc BlessedSnowman = new() { Ids = new int[] { 7376 }, Name = "Blessed Snowman", WikiUrl = "https://wiki.guildwars.com/wiki/Blessed_Snowman" }; - public static readonly Npc CordialSnowman = new() { Ids = new int[] { 7379 }, Name = "Cordial Snowman", WikiUrl = "https://wiki.guildwars.com/wiki/Cordial_Snowman" }; - public static readonly Npc PiousSnowman = new() { Ids = new int[] { 7386 }, Name = "Pious Snowman", WikiUrl = "https://wiki.guildwars.com/wiki/Pious_Snowman" }; - public static readonly Npc AngrySnowman = new() { Ids = new int[] { 7411 }, Name = "Angry Snowman", WikiUrl = "https://wiki.guildwars.com/wiki/Angry_Snowman" }; - public static readonly Npc JackFrost = new() { Ids = new int[] { 7435 }, Name = "Jack Frost", WikiUrl = "https://wiki.guildwars.com/wiki/Jack_Frost" }; - public static readonly Npc ValgarTempestcrafter = new() { Ids = new int[] { 7604 }, Name = "Valgar Tempestcrafter", WikiUrl = "https://wiki.guildwars.com/wiki/Valgar_Tempestcrafter" }; - public static readonly Npc NicholasSandford = new() { Ids = new int[] { 7659 }, Name = "Nicholas Sandford", WikiUrl = "https://wiki.guildwars.com/wiki/Nicholas_Sandford" }; - public static readonly Npc ProfessorYakkington = new() { Ids = new int[] { 7660 }, Name = "Professor Yakkington", WikiUrl = "https://wiki.guildwars.com/wiki/Professor_Yakkington" }; - public static readonly Npc PinkDyeVendor = new() { Ids = new int[] { 7670 }, Name = "Pink Dye Vendor", WikiUrl = "https://wiki.guildwars.com/wiki/Sadie_Salvitas" }; - public static readonly Npc Zenjal = new() { Ids = new int[] { 7748 }, Name = "Zenjal", WikiUrl = "https://wiki.guildwars.com/wiki/Zenjal" }; - public static readonly Npc LieutenantLangmar = new() { Ids = new int[] { 7757 }, Name = "Lieutenant Langmar", WikiUrl = "https://wiki.guildwars.com/wiki/Lieutenant_Langmar" }; - public static readonly Npc BlazefiendGriefblade = new() { Ids = new int[] { 7795 }, Name = "Blazefiend Griefblade", WikiUrl = "https://wiki.guildwars.com/wiki/Blazefiend_Griefblade" }; - public static readonly Npc CharrStalker = new() { Ids = new int[] { 7801 }, Name = "Charr Stalker", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Stalker" }; - public static readonly Npc CharrFireCaller = new() { Ids = new int[] { 7803, 1643 }, Name = "Charr Fire Caller", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Fire_Caller" }; - public static readonly Npc ForemanTheCrier = new() { Ids = new int[] { 7974, 7974 }, Name = "Foreman The Crier", WikiUrl = "https://wiki.guildwars.com/wiki/Foreman_the_Crier" }; - public static readonly Npc Salma = new() { Ids = new int[] { 7987 }, Name = "Salma", WikiUrl = "https://wiki.guildwars.com/wiki/Salma" }; - public static readonly Npc ScoutMelthoran = new() { Ids = new int[] { 8054 }, Name = "Scout Melthoran", WikiUrl = "https://wiki.guildwars.com/wiki/Scout_Melthoran" }; - public static readonly Npc ShiningBladeRecruit = new() { Ids = new int[] { 8058, 8059 }, Name = "Shining Blade Recruit", WikiUrl = "https://wiki.guildwars.com/wiki/Shining_Blade_Recruit" }; - public static readonly Npc CharmingPeacekeeper = new() { Ids = new int[] { 8103, 8105 }, Name = "Charming Peacekeeper", WikiUrl = "https://wiki.guildwars.com/wiki/Charming_Peacekeeper" }; - public static readonly Npc PeacekeeperFirebrand = new() { Ids = new int[] { 8110, 8111, 8113 }, Name = "Peacekeeper Firebrand", WikiUrl = "https://wiki.guildwars.com/wiki/Peacekeeper_Firebrand" }; - public static readonly Npc DivinePeacekeeper = new() { Ids = new int[] { 8117, 8115 }, Name = "Divine Peacekeeper", WikiUrl = "https://wiki.guildwars.com/wiki/Divine_Peacekeeper" }; - public static readonly Npc PeacekeeperGoon = new() { Ids = new int[] { 8135, 8133 }, Name = "Peacekeeper Goon", WikiUrl = "https://wiki.guildwars.com/wiki/Peacekeeper_Goon" }; - public static readonly Npc PeacekeeperMarksman = new() { Ids = new int[] { 8137, 8138 }, Name = "Peacekeeper Marksman", WikiUrl = "https://wiki.guildwars.com/wiki/Peacekeeper_Marksman" }; - public static readonly Npc PeacekeeperClairvoyant = new() { Ids = new int[] { 8151, 8154, 8152 }, Name = "Peacekeeper Clairvoyant", WikiUrl = "https://wiki.guildwars.com/wiki/Peacekeeper_Clairvoyant" }; - public static readonly Npc PeacekeeperMentor = new() { Ids = new int[] { 8155, 8156 }, Name = "Peacekeeper Mentor", WikiUrl = "https://wiki.guildwars.com/wiki/Peacekeeper_Mentor" }; - public static readonly Npc InsatiableVakar = new() { Ids = new int[] { 8172 }, Name = "Insatiable Vakar", WikiUrl = "https://wiki.guildwars.com/wiki/Insatiable_Vakar" }; - public static readonly Npc WhiteMantleNecromancer = new() { Ids = new int[] { 8249 }, Name = "White Mantle Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Ritualist" }; - public static readonly Npc MinistryOfPurity = new() { Ids = new int[] { 8582 }, Name = "Ministry Of Purity", WikiUrl = "https://wiki.guildwars.com/wiki/Ministry_of_Purity" }; - public static readonly Npc Julyia = new() { Ids = new int[] { 41 }, Name = "Julyia", WikiUrl = "https://wiki.guildwars.com/wiki/Julyia" }; - public static readonly Npc Narcissia = new() { Ids = new int[] { 49 }, Name = "Narcissia", WikiUrl = "https://wiki.guildwars.com/wiki/Narcissia" }; - public static readonly Npc ZenSiert = new() { Ids = new int[] { 50 }, Name = "Zen Siert", WikiUrl = "https://wiki.guildwars.com/wiki/Zen_Siert" }; - public static readonly Npc VincentEvan = new() { Ids = new int[] { 44 }, Name = "Vincent Evan", WikiUrl = "https://wiki.guildwars.com/wiki/Vincent_Evan" }; - public static readonly Npc CassieSanti = new() { Ids = new int[] { 39 }, Name = "Cassie Santi", WikiUrl = "https://wiki.guildwars.com/wiki/Cassie_Santi" }; - public static readonly Npc DirkShadowrise = new() { Ids = new int[] { 43 }, Name = "Dirk Shadowrise", WikiUrl = "https://wiki.guildwars.com/wiki/Dirk_Shadowrise" }; - public static readonly Npc LuzyFiera = new() { Ids = new int[] { 45 }, Name = "Luzy Fiera", WikiUrl = "https://wiki.guildwars.com/wiki/Luzy_Fiera" }; - public static readonly Npc RuneTrader = new() { Ids = new int[] { 190 }, Name = "Rune Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Rune_Trader" }; - public static readonly Npc CraftingMaterialTrader = new() { Ids = new int[] { 191 }, Name = "Crafting Material Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Crafting_Material_Trader" }; - public static readonly Npc RareMaterialTrader = new() { Ids = new int[] { 192 }, Name = "Rare Material Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Rare_Material_Trader" }; - public static readonly Npc DyeTrader = new() { Ids = new int[] { 193 }, Name = "Dye Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Dye_Trader" }; - public static readonly Npc ScrollTrader = new() { Ids = new int[] { 194 }, Name = "Scroll Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Scroll_Trader" }; - public static readonly Npc Pudash = new() { Ids = new int[] { 31 }, Name = "Pudash", WikiUrl = "https://wiki.guildwars.com/wiki/Pudash" }; - public static readonly Npc Blenkeh = new() { Ids = new int[] { 53 }, Name = "Blenkeh", WikiUrl = "https://wiki.guildwars.com/wiki/Blenkeh" }; - public static readonly Npc MotokoKai = new() { Ids = new int[] { 46 }, Name = "Motoko Kai", WikiUrl = "https://wiki.guildwars.com/wiki/Motoko_Kai" }; - public static readonly Npc ErrolHyl = new() { Ids = new int[] { 34 }, Name = "Errol Hyl", WikiUrl = "https://wiki.guildwars.com/wiki/Errol_Hyl" }; - public static readonly Npc Merchant = new() { Ids = new int[] { 196 }, Name = "Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Merchant" }; - public static readonly Npc Weaponsmith = new() { Ids = new int[] { 197 }, Name = "Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Weaponsmith" }; - public static readonly Npc SkillTrainer = new() { Ids = new int[] { 195 }, Name = "Skill Trainer", WikiUrl = "https://wiki.guildwars.com/wiki/Skill_Trainer" }; - public static readonly Npc Dahlia = new() { Ids = new int[] { 32 }, Name = "Dahlia", WikiUrl = "https://wiki.guildwars.com/wiki/Dahlia" }; - public static readonly Npc RedemptorFrohs = new() { Ids = new int[] { 40 }, Name = "Redemptor Frohs", WikiUrl = "https://wiki.guildwars.com/wiki/Redemptor_Frohs" }; - public static readonly Npc AuroraAllesandra = new() { Ids = new int[] { 54 }, Name = "Aurora Allesandra", WikiUrl = "https://wiki.guildwars.com/wiki/Aurora_Allesandra" }; - public static readonly Npc Hinata = new() { Ids = new int[] { 47 }, Name = "Hinata", WikiUrl = "https://wiki.guildwars.com/wiki/Hinata" }; - public static readonly Npc LuluXan = new() { Ids = new int[] { 36 }, Name = "Lulu Xan", WikiUrl = "https://wiki.guildwars.com/wiki/Lulu_Xan" }; - public static readonly Npc Bellicus = new() { Ids = new int[] { 42 }, Name = "Bellicus", WikiUrl = "https://wiki.guildwars.com/wiki/Bellicus" }; - public static readonly Npc FestivalHatKeeper = new() { Ids = new int[] { 198 }, Name = "Festival Hat Keeper", WikiUrl = "https://wiki.guildwars.com/wiki/Festival_Hat_Keeper" }; - public static readonly Npc GuildEmblemer = new() { Ids = new int[] { 199 }, Name = "Guild Emblemer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Emblemer" }; - public static readonly Npc Tannaros = new() { Ids = new int[] { 38 }, Name = "Tannaros", WikiUrl = "https://wiki.guildwars.com/wiki/Tannaros" }; - public static readonly Npc Disenmaedel = new() { Ids = new int[] { 33 }, Name = "Disenmaedel", WikiUrl = "https://wiki.guildwars.com/wiki/Disenmaedel" }; - public static readonly Npc KahXan = new() { Ids = new int[] { 48 }, Name = "Kah Xan", WikiUrl = "https://wiki.guildwars.com/wiki/Kah_Xan" }; - public static readonly Npc Lonai = new() { Ids = new int[] { 4821 }, Name = "Lonai", WikiUrl = "https://wiki.guildwars.com/wiki/Lonai" }; - public static readonly Npc Koss = new() { Ids = new int[] { 4475 }, Name = "Koss", WikiUrl = "https://wiki.guildwars.com/wiki/Koss" }; - public static readonly Npc Dunkoro = new() { Ids = new int[] { 4483 }, Name = "Dunkoro", WikiUrl = "https://wiki.guildwars.com/wiki/Dunkoro" }; - public static readonly Npc Smuggler = new() { Ids = new int[] { 5075 }, Name = "Smuggler", WikiUrl = "https://wiki.guildwars.com/wiki/Smuggler" }; - public static readonly Npc Dalzid = new() { Ids = new int[] { 4742 }, Name = "Dalzid", WikiUrl = "https://wiki.guildwars.com/wiki/Dalzid" }; - public static readonly Npc Burreh = new() { Ids = new int[] { 5386 }, Name = "Burreh", WikiUrl = "https://wiki.guildwars.com/wiki/Burreh" }; - public static readonly Npc Benera = new() { Ids = new int[] { 5393 }, Name = "Benera", WikiUrl = "https://wiki.guildwars.com/wiki/Benera" }; - public static readonly Npc Megundeh = new() { Ids = new int[] { 5399 }, Name = "Megundeh", WikiUrl = "https://wiki.guildwars.com/wiki/Megundeh" }; - public static readonly Npc Shausha = new() { Ids = new int[] { 4740 }, Name = "Shausha", WikiUrl = "https://wiki.guildwars.com/wiki/Shausha" }; - public static readonly Npc Ahamid = new() { Ids = new int[] { 4741 }, Name = "Ahamid", WikiUrl = "https://wiki.guildwars.com/wiki/Ahamid" }; - public static readonly Npc Stasheh = new() { Ids = new int[] { 5398 }, Name = "Stasheh", WikiUrl = "https://wiki.guildwars.com/wiki/Stasheh" }; - public static readonly Npc Marlani = new() { Ids = new int[] { 4743 }, Name = "Marlani", WikiUrl = "https://wiki.guildwars.com/wiki/Marlani" }; - public static readonly Npc Sinbi = new() { Ids = new int[] { 5382 }, Name = "Sinbi", WikiUrl = "https://wiki.guildwars.com/wiki/Sinbi" }; - public static readonly Npc Kerendu = new() { Ids = new int[] { 5401 }, Name = "Kerendu", WikiUrl = "https://wiki.guildwars.com/wiki/Kerendu" }; - public static readonly Npc Nerashi = new() { Ids = new int[] { 4814 }, Name = "Nerashi", WikiUrl = "https://wiki.guildwars.com/wiki/Nerashi" }; - public static readonly Npc VeldtBeetleLance = new() { Ids = new int[] { 4926 }, Name = "Veldt Beetle Lance", WikiUrl = "https://wiki.guildwars.com/wiki/Veldt_Beetle_Lance" }; - public static readonly Npc VeldtNephila = new() { Ids = new int[] { 4902 }, Name = "Veldt Nephila", WikiUrl = "https://wiki.guildwars.com/wiki/Veldt_Nephila" }; - public static readonly Npc VeldtBeetleQueen = new() { Ids = new int[] { 4923 }, Name = "Veldt Beetle Queen", WikiUrl = "https://wiki.guildwars.com/wiki/Veldt_Beetle_Queen" }; - public static readonly Npc BladedVeldtTermite = new() { Ids = new int[] { 4924 }, Name = "Bladed Veldt Termite", WikiUrl = "https://wiki.guildwars.com/wiki/Bladed_Veldt_Termite" }; - public static readonly Npc RampagingNtouka = new() { Ids = new int[] { 4915 }, Name = "Rampaging Ntouka", WikiUrl = "https://wiki.guildwars.com/wiki/Rampaging_Ntouka" }; - public static readonly Npc CrestedNtoukaBird = new() { Ids = new int[] { 4913 }, Name = "Crested Ntouka Bird", WikiUrl = "https://wiki.guildwars.com/wiki/Crested_Ntouka_Bird" }; - public static readonly Npc KournanEliteZealot = new() { Ids = new int[] { 5269 }, Name = "Kournan Elite Zealot", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Elite_Zealot" }; - public static readonly Npc KournanEliteSpear = new() { Ids = new int[] { 5270 }, Name = "Kournan Elite Spear", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Elite_Spear" }; - public static readonly Npc KournanEliteGuard = new() { Ids = new int[] { 5268 }, Name = "Kournan Elite Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Elite_Guard" }; - public static readonly Npc KournanEliteScribe = new() { Ids = new int[] { 5267 }, Name = "Kournan Elite Scribe", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Elite_Scribe" }; - public static readonly Npc SpiritofShelter = new() { Ids = new int[] { 4223 }, Name = "Spirit of Shelter", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Shelter" }; - public static readonly Npc AdmiralKantoh = new() { Ids = new int[] { 5226 }, Name = "Admiral Kantoh", WikiUrl = "https://wiki.guildwars.com/wiki/Admiral_Kantoh" }; - public static readonly Npc MirzaVeldrunner = new() { Ids = new int[] { 4950 }, Name = "Mirza Veldrunner", WikiUrl = "https://wiki.guildwars.com/wiki/Mirza_Veldrunner" }; - public static readonly Npc CorsairTorturer = new() { Ids = new int[] { 5045 }, Name = "Corsair Torturer", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Torturer" }; - public static readonly Npc CorsairLieutenant = new() { Ids = new int[] { 5049 }, Name = "Corsair Lieutenant", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Lieutenant" }; - public static readonly Npc CorsairWindMaster = new() { Ids = new int[] { 5046 }, Name = "Corsair Wind Master", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Wind_Master" }; - public static readonly Npc SpiritOfVampirism = new() { Ids = new int[] { 5723 }, Name = "Spirit of Vampirism", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Vampirism" }; - public static readonly Npc SpiritOfSuffering = new() { Ids = new int[] { 4231 }, Name = "Spirit of Suffering", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Suffering" }; - public static readonly Npc SpiritOfHate = new() { Ids = new int[] { 4230 }, Name = "Spirit of Hate", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Hate" }; - public static readonly Npc SpiritOfAnger = new() { Ids = new int[] { 4229 }, Name = "Spirit of Anger", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Anger" }; - public static readonly Npc TuskedHunter = new() { Ids = new int[] { 4917 }, Name = "Tusked Hunter", WikiUrl = "https://wiki.guildwars.com/wiki/Tusked_Hunter" }; - public static readonly Npc TuskedHowler = new() { Ids = new int[] { 4916 }, Name = "Tusked Howler", WikiUrl = "https://wiki.guildwars.com/wiki/Tusked_Howler" }; - public static readonly Npc KournanWeaponsmith = new() { Ids = new int[] { 5391 }, Name = "Kournan Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kournans" }; - public static readonly Npc VeldrunnerCentaur = new() { Ids = new int[] { 4949, 4951, 4948 }, Name = "Veldrunner Centaur", WikiUrl = "https://wiki.guildwars.com/wiki/Veldrunner_Centaur" }; - public static readonly Npc KournanTaskmaster = new() { Ids = new int[] { 5276 }, Name = "Kournan Taskmaster", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Taskmaster" }; - public static readonly Npc TaskmasterSadiBelai = new() { Ids = new int[] { 5243 }, Name = "Taskmaster Sadi-Belai", WikiUrl = "https://wiki.guildwars.com/wiki/Taskmaster_Sadi-Belai" }; - public static readonly Npc TaskmasterVanahk = new() { Ids = new int[] { 5242 }, Name = "Taskmaster Vanahk", WikiUrl = "https://wiki.guildwars.com/wiki/Taskmaster_Vanahk" }; - public static readonly Npc OverseerHaubeh = new() { Ids = new int[] { 5246 }, Name = "Overseer Haubeh", WikiUrl = "https://wiki.guildwars.com/wiki/Overseer_Haubeh" }; - public static readonly Npc OverseerBoktek = new() { Ids = new int[] { 5245 }, Name = "Overseer Boktek", WikiUrl = "https://wiki.guildwars.com/wiki/Overseer_Boktek" }; - public static readonly Npc TaskmasterSuli = new() { Ids = new int[] { 5244 }, Name = "Taskmaster Suli", WikiUrl = "https://wiki.guildwars.com/wiki/Taskmaster_Suli" }; - public static readonly Npc KehmaktheTranquil = new() { Ids = new int[] { 4898 }, Name = "Kehmak the Tranquil", WikiUrl = "https://wiki.guildwars.com/wiki/Kehmak_the_Tranquil" }; - public static readonly Npc GeneralBayel = new() { Ids = new int[] { 5406 }, Name = "General Bayel", WikiUrl = "https://wiki.guildwars.com/wiki/General_Bayel" }; - public static readonly Npc FocusofHanaku = new() { Ids = new int[] { 3978 }, Name = "Focus of Hanaku", WikiUrl = "https://wiki.guildwars.com/wiki/Focus_of_Hanaku" }; - public static readonly Npc SpiritofDisenchantment = new() { Ids = new int[] { 4225 }, Name = "Spirit of Disenchantment", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Disenchantment" }; - public static readonly Npc VampiricHorror = new() { Ids = new int[] { 4210 }, Name = "Vampiric Horror", WikiUrl = "https://wiki.guildwars.com/wiki/Vampiric_Horror" }; - public static readonly Npc DragonMoss = new() { Ids = new int[] { 3722 }, Name = "Dragon Moss", WikiUrl = "https://wiki.guildwars.com/wiki/Dragon_Moss" }; - public static readonly Npc SpiritofDissonance = new() { Ids = new int[] { 4221 }, Name = "Spirit of Dissonance", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Dissonance" }; - public static readonly Npc SkreeGriffin = new() { Ids = new int[] { 4677 }, Name = "Skree Griffin", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Griffin" }; - public static readonly Npc SkreeTracker = new() { Ids = new int[] { 4679 }, Name = "Skree Tracker", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Tracker" }; - public static readonly Npc SkreeSinger = new() { Ids = new int[] { 4680 }, Name = "Skree Singer", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Singer" }; - public static readonly Npc Lioness = new() { Ids = new int[] { 4243 }, Name = "Lioness", WikiUrl = "https://wiki.guildwars.com/wiki/Lioness" }; - public static readonly Npc Kehanni = new() { Ids = new int[] { 5689 }, Name = "Kehanni", WikiUrl = "https://wiki.guildwars.com/wiki/Kehanni" }; - public static readonly Npc ScytheclawBehemoth = new() { Ids = new int[] { 4669 }, Name = "Scytheclaw Behemoth", WikiUrl = "https://wiki.guildwars.com/wiki/Scytheclaw_Behemoth" }; - public static readonly Npc BehemothGravebane = new() { Ids = new int[] { 4667 }, Name = "Behemoth Gravebane", WikiUrl = "https://wiki.guildwars.com/wiki/Behemoth_Gravebane" }; - public static readonly Npc RockBeetle = new() { Ids = new int[] { 4687 }, Name = "Rock Beetle", WikiUrl = "https://wiki.guildwars.com/wiki/Rock_Beetle" }; - public static readonly Npc RainBeetle = new() { Ids = new int[] { 4685 }, Name = "Rain Beetle", WikiUrl = "https://wiki.guildwars.com/wiki/Rain_Beetle" }; - public static readonly Npc MargoniteSorcerer = new() { Ids = new int[] { 5535 }, Name = "Margonite Sorcerer", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Sorcerer" }; - public static readonly Npc MargoniteSeer = new() { Ids = new int[] { 5533 }, Name = "Margonite Seer", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Seer" }; - public static readonly Npc HajokEarthguardian = new() { Ids = new int[] { 4646 }, Name = "Hajok Earthguardian", WikiUrl = "https://wiki.guildwars.com/wiki/Hajok_Earthguardian" }; - public static readonly Npc MargoniteCleric = new() { Ids = new int[] { 5536 }, Name = "Margonite Cleric", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Cleric" }; - public static readonly Npc TaintheCorrupter = new() { Ids = new int[] { 5516 }, Name = "Tain the Corrupter", WikiUrl = "https://wiki.guildwars.com/wiki/Tain_the_Corrupter" }; - public static readonly Npc SkreeRaider = new() { Ids = new int[] { 4678 }, Name = "Skree Raider", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Raider" }; - public static readonly Npc MakdehtheAggravating = new() { Ids = new int[] { 4638 }, Name = "Makdeh the Aggravating", WikiUrl = "https://wiki.guildwars.com/wiki/Makdeh_the_Aggravating" }; - public static readonly Npc MargoniteWarlock = new() { Ids = new int[] { 5534 }, Name = "Margonite Warlock", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Warlock" }; - public static readonly Npc MargoniteExecutioner = new() { Ids = new int[] { 5537 }, Name = "Margonite Executioner", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Executioner" }; - public static readonly Npc MargoniteAscendant = new() { Ids = new int[] { 5540 }, Name = "Margonite Ascendant", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Ascendant" }; - public static readonly Npc LushivahrtheInvoker = new() { Ids = new int[] { 5517 }, Name = "Lushivahr the Invoker", WikiUrl = "https://wiki.guildwars.com/wiki/Lushivahr_the_Invoker" }; - public static readonly Npc MargoniteReaper = new() { Ids = new int[] { 5539 }, Name = "Margonite Reaper", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Reaper" }; - public static readonly Npc CorporalSuli = new() { Ids = new int[] { 5224 }, Name = "Corporal Suli", WikiUrl = "https://wiki.guildwars.com/wiki/Corporal_Suli" }; - public static readonly Npc LieutenantVanahk = new() { Ids = new int[] { 5223 }, Name = "Lieutenant Vanahk", WikiUrl = "https://wiki.guildwars.com/wiki/Lieutenant_Vanahk" }; - public static readonly Npc Lion = new() { Ids = new int[] { 4244 }, Name = "Lion", WikiUrl = "https://wiki.guildwars.com/wiki/Lion" }; - public static readonly Npc SpiritofFavorableWinds = new() { Ids = new int[] { 2883 }, Name = "Spirit of Favorable Winds", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Favorable_Winds" }; - public static readonly Npc MirageIboga = new() { Ids = new int[] { 4690 }, Name = "Mirage Iboga", WikiUrl = "https://wiki.guildwars.com/wiki/Mirage_Iboga" }; - public static readonly Npc StormJacaranda = new() { Ids = new int[] { 4691 }, Name = "Storm Jacaranda", WikiUrl = "https://wiki.guildwars.com/wiki/Storm_Jacaranda" }; - public static readonly Npc EnchantedBrambles = new() { Ids = new int[] { 4692 }, Name = "Enchanted Brambles", WikiUrl = "https://wiki.guildwars.com/wiki/Enchanted_Brambles" }; - public static readonly Npc WhistlingThornbrush = new() { Ids = new int[] { 4693 }, Name = "Whistling Thornbrush", WikiUrl = "https://wiki.guildwars.com/wiki/Whistling_Thornbrush" }; - public static readonly Npc MargoniteBowmaster = new() { Ids = new int[] { 5538 }, Name = "Margonite Bowmaster", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Bowmaster" }; - public static readonly Npc VabbianDyeTrader = new() { Ids = new int[] { 5674 }, Name = "Vabbian Dye Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Vabbians" }; - public static readonly Npc VabbianWeaponsmith = new() { Ids = new int[] { 5671, 5672 }, Name = "Vabbian Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Vabbians" }; - public static readonly Npc ChumabthePrideful = new() { Ids = new int[] { 4658 }, Name = "Chumab the Prideful", WikiUrl = "https://wiki.guildwars.com/wiki/Chumab_the_Prideful" }; - public static readonly Npc YameshMindclouder = new() { Ids = new int[] { 4653 }, Name = "Yamesh Mindclouder", WikiUrl = "https://wiki.guildwars.com/wiki/Yamesh_Mindclouder" }; - public static readonly Npc JahaiRat = new() { Ids = new int[] { 4245 }, Name = "Jahai Rat", WikiUrl = "https://wiki.guildwars.com/wiki/Jahai_Rat" }; - public static readonly Npc BoltenLargebelly = new() { Ids = new int[] { 4656 }, Name = "Bolten Largebelly", WikiUrl = "https://wiki.guildwars.com/wiki/Bolten_Largebelly" }; - public static readonly Npc VabbianPriest = new() { Ids = new int[] { 5664, 5702 }, Name = "Vabbian Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Vabbian_Priest" }; - public static readonly Npc GeneralMorgahn = new() { Ids = new int[] { 4446 }, Name = "General Morgahn", WikiUrl = "https://wiki.guildwars.com/wiki/General_Morgahn" }; - public static readonly Npc VabbianScholar = new() { Ids = new int[] { 5699, 5679, 5678, 5682 }, Name = "Vabbian Scholar", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Vabbians" }; - public static readonly Npc TheGreatZehtuka = new() { Ids = new int[] { 5697 }, Name = "The Great Zehtuka", WikiUrl = "https://wiki.guildwars.com/wiki/The_Great_Zehtuka" }; - public static readonly Npc VabbiGuardCaptain = new() { Ids = new int[] { 5640 }, Name = "Vabbi Guard Captain", WikiUrl = "https://wiki.guildwars.com/wiki/Vabbi_Guard_Captain" }; - public static readonly Npc PrinceAhmturtheMighty = new() { Ids = new int[] { 5692 }, Name = "Prince Ahmtur the Mighty", WikiUrl = "https://wiki.guildwars.com/wiki/Prince_Ahmtur_the_Mighty" }; - public static readonly Npc LieutenantMurunda = new() { Ids = new int[] { 5641 }, Name = "Lieutenant Murunda", WikiUrl = "https://wiki.guildwars.com/wiki/Lieutenant_Murunda" }; - public static readonly Npc PrinceBokkatheMagnificent = new() { Ids = new int[] { 5691 }, Name = "Prince Bokka the Magnificent", WikiUrl = "https://wiki.guildwars.com/wiki/Prince_Bokka_the_Magnificent" }; - public static readonly Npc Goren = new() { Ids = new int[] { 4434 }, Name = "Goren", WikiUrl = "https://wiki.guildwars.com/wiki/Goren" }; - public static readonly Npc PrinceMehtutheWise = new() { Ids = new int[] { 5693 }, Name = "Prince Mehtu the Wise", WikiUrl = "https://wiki.guildwars.com/wiki/Prince_Mehtu_the_Wise" }; - public static readonly Npc VabbianBlacksmith = new() { Ids = new int[] { 5667 }, Name = "Vabbian Blacksmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Vabbians" }; - public static readonly Npc YammironEtherLord = new () { Ids = new int[] { 4636 }, Name = "Yammiron, Ether Lord", WikiUrl = "https://wiki.guildwars.com/wiki/Yammiron,_Ether_Lord" }; - public static readonly Npc RoaringEther = new() { Ids = new int[] { 4675, 4676 }, Name = "Roaring Ether", WikiUrl = "https://wiki.guildwars.com/wiki/Roaring_Ether" }; - public static readonly Npc SapphireDjinn = new() { Ids = new int[] { 4673, 4312 }, Name = "Sapphire Djinn", WikiUrl = "https://wiki.guildwars.com/wiki/Sapphire_Djinn" }; - public static readonly Npc RubyDjinn = new() { Ids = new int[] { 4670, 4311 }, Name = "Ruby Djinn", WikiUrl = "https://wiki.guildwars.com/wiki/Ruby_Djinn" }; - public static readonly Npc CobaltMokele = new() { Ids = new int[] { 4664 }, Name = "Cobalt Mokele", WikiUrl = "https://wiki.guildwars.com/wiki/Cobalt_Mokele" }; - public static readonly Npc JisholDarksong = new() { Ids = new int[] { 4626 }, Name = "Jishol Darksong", WikiUrl = "https://wiki.guildwars.com/wiki/Jishol_Darksong" }; - public static readonly Npc CobaltShrieker = new() { Ids = new int[] { 4665 }, Name = "Cobalt Shrieker", WikiUrl = "https://wiki.guildwars.com/wiki/Cobalt_Shrieker" }; - public static readonly Npc Norgu = new() { Ids = new int[] { 4429 }, Name = "Norgu", WikiUrl = "https://wiki.guildwars.com/wiki/Norgu" }; - public static readonly Npc StoneSummitDark = new() { Ids = new int[] { 5712 }, Name = "Stone Summit Dark", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Dwarves#Stone_Summit" }; - public static readonly Npc MargoniteParagonBoss = new() { Ids = new int[] { 5475 }, Name = "Margonite Paragon Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Category:Margonite_bosses" }; - public static readonly Npc LyssanPriest = new() { Ids = new int[] { 5709 }, Name = "Lyssan Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Lyssan_Priest" }; - public static readonly Npc DiscipleOfSecrets = new() { Ids = new int[] { 5694 }, Name = "Disciple of Secrets", WikiUrl = "https://wiki.guildwars.com/wiki/Disciple_of_Secrets" }; - public static readonly Npc Varesh = new() { Ids = new int[] { 5294, 5290 }, Name = "Varesh", WikiUrl = "https://wiki.guildwars.com/wiki/Varesh" }; - public static readonly Npc MargoniteMonkBoss = new() { Ids = new int[] { 5473 }, Name = "Margonite Monk Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Category:Margonite_bosses" }; - public static readonly Npc GeneralDoriah = new() { Ids = new int[] { 5474 }, Name = "General Doriah", WikiUrl = "https://wiki.guildwars.com/wiki/General_Doriah" }; - public static readonly Npc GeneralTirraj = new() { Ids = new int[] { 5472 }, Name = "General Tirraj", WikiUrl = "https://wiki.guildwars.com/wiki/General_Tirraj" }; - public static readonly Npc JarimiyaTheUnmerciful = new() { Ids = new int[] { 4657 }, Name = "Jarimiya the Unmerciful", WikiUrl = "https://wiki.guildwars.com/wiki/Jarimiya_the_Unmerciful" }; - public static readonly Npc RiktundTheVicious = new() { Ids = new int[] { 4624 }, Name = "Riktund the Vicious", WikiUrl = "https://wiki.guildwars.com/wiki/Riktund_the_Vicious" }; - public static readonly Npc SetikorFireflower = new() { Ids = new int[] { 4651 }, Name = "Setikor Fireflower", WikiUrl = "https://wiki.guildwars.com/wiki/Setikor_Fireflower" }; - public static readonly Npc MessengerOfLyssa = new() { Ids = new int[] { 5708 }, Name = "Messenger of Lyssa", WikiUrl = "https://wiki.guildwars.com/wiki/Messenger_of_Lyssa" }; - public static readonly Npc VabbianGuardCaptain = new() { Ids = new int[] { 5635 }, Name = "Vabbian Guard Captain", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Vabbians" }; - public static readonly Npc ElderJonah = new() { Ids = new int[] { 5286 }, Name = "Elder Jonah", WikiUrl = "https://wiki.guildwars.com/wiki/Elder_Jonah" }; - public static readonly Npc Lormeh = new() { Ids = new int[] { 5387 }, Name = "Lormeh", WikiUrl = "https://wiki.guildwars.com/wiki/Lormeh" }; - public static readonly Npc MadnessTitan = new() { Ids = new int[] { 4970 }, Name = "Madness Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Madness_Titan" }; - public static readonly Npc ShadowRanger = new() { Ids = new int[] { 4966, 2808 }, Name = "Shadow Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_Ranger" }; - public static readonly Npc ShadowMonk = new() { Ids = new int[] { 4964, 2806 }, Name = "Shadow Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_Monk" }; - public static readonly Npc ShadowMesmer = new() { Ids = new int[] { 4962, 2804 }, Name = "Shadow Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_Mesmer" }; - public static readonly Npc GravenMonolith = new() { Ids = new int[] { 4316, 4315, 4317 }, Name = "Graven Monolith", WikiUrl = "https://wiki.guildwars.com/wiki/Graven_Monolith" }; - public static readonly Npc Harbinger = new() { Ids = new int[] { 5404 }, Name = "Harbinger", WikiUrl = "https://wiki.guildwars.com/wiki/Harbinger" }; - public static readonly Npc SpiritOfSeborhin = new() { Ids = new int[] { 5584 }, Name = "Spirit of Seborhin", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Seborhin" }; - public static readonly Npc HorticulturistHinon = new() { Ids = new int[] { 5710 }, Name = "Horticulturist Hinon", WikiUrl = "https://wiki.guildwars.com/wiki/Horticulturist_Hinon" }; - public static readonly Npc IstaniPeasant = new() { Ids = new int[] { 4851, 4850, 4852 }, Name = "Istani Peasant", WikiUrl = "https://wiki.guildwars.com/wiki/Istani_Peasant" }; - public static readonly Npc PriestZeinZuu = new() { Ids = new int[] { 5467 }, Name = "Priest Zein Zuu", WikiUrl = "https://wiki.guildwars.com/wiki/Priest_Zein_Zuu" }; - public static readonly Npc ScribeWensal = new() { Ids = new int[] { 5466 }, Name = "Scribe Wensal", WikiUrl = "https://wiki.guildwars.com/wiki/Scribe_Wensal" }; - public static readonly Npc CommanderChutal = new() { Ids = new int[] { 5471 }, Name = "Commander Chutal", WikiUrl = "https://wiki.guildwars.com/wiki/Commander_Chutal" }; - public static readonly Npc ZealotSheoli = new() { Ids = new int[] { 5470 }, Name = "Zealot Sheoli", WikiUrl = "https://wiki.guildwars.com/wiki/Zealot_Sheoli" }; - public static readonly Npc NtoukaBird = new() { Ids = new int[] { 4914 }, Name = "Ntouka Bird", WikiUrl = "https://wiki.guildwars.com/wiki/Ntouka_Bird" }; - public static readonly Npc TormentedLand = new() { Ids = new int[] { 4943 }, Name = "Tormented Land", WikiUrl = "https://wiki.guildwars.com/wiki/Tormented_Land" }; - public static readonly Npc SergeantBehnwa = new() { Ids = new int[] { 5235 }, Name = "Sergeant Behnwa", WikiUrl = "https://wiki.guildwars.com/wiki/Sergeant_Behnwa" }; - public static readonly Npc ElderHyena = new() { Ids = new int[] { 4258 }, Name = "Elder Hyena", WikiUrl = "https://wiki.guildwars.com/wiki/Elder_Hyena" }; - public static readonly Npc KorrLivingFlame = new () { Ids = new int[] { 4877 }, Name = "Korr Living Flame", WikiUrl = "https://wiki.guildwars.com/wiki/Korr,_Living_Flame" }; - public static readonly Npc ImmolatedDjinn = new() { Ids = new int[] { 4906 }, Name = "Immolated Djinn", WikiUrl = "https://wiki.guildwars.com/wiki/Immolated_Djinn" }; - public static readonly Npc AscensionPilgrim = new() { Ids = new int[] { 5007 }, Name = "Ascension Pilgrim", WikiUrl = "https://wiki.guildwars.com/wiki/Ascension_Pilgrim" }; - public static readonly Npc DynasticSpirit = new() { Ids = new int[] { 5006, 5611, 5005, 5613 }, Name = "Dynastic Spirit", WikiUrl = "https://wiki.guildwars.com/wiki/Dynastic_Spirit" }; - public static readonly Npc DiamondDjinn = new() { Ids = new int[] { 4671 }, Name = "Diamond Djinn", WikiUrl = "https://wiki.guildwars.com/wiki/Diamond_Djinn" }; - public static readonly Npc VahlenTheSilent = new() { Ids = new int[] { 5566 }, Name = "Vahlen the Silent", WikiUrl = "https://wiki.guildwars.com/wiki/Vahlen_the_Silent" }; - public static readonly Npc AwakenedAcolyte = new() { Ids = new int[] { 5577 }, Name = "Awakened Acolyte", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened_Acolyte" }; - public static readonly Npc AwakenedDefiler = new() { Ids = new int[] { 5575 }, Name = "Awakened Defiler", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened_Defiler" }; - public static readonly Npc AwakenedDuneCarver = new() { Ids = new int[] { 5582 }, Name = "Awakened Dune Carver", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened_Dune_Carver" }; - public static readonly Npc AwakenedThoughtLeech = new() { Ids = new int[] { 5574 }, Name = "Awakened Thought Leech", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened_Thought_Leech" }; - public static readonly Npc CarvenEffigy = new() { Ids = new int[] { 5576, 5587, 5623 }, Name = "Carven Effigy", WikiUrl = "https://wiki.guildwars.com/wiki/Carven_Effigy" }; - public static readonly Npc AwakenedGrayGiant = new() { Ids = new int[] { 5579, 5628 }, Name = "Awakened Gray Giant", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened_Gray_Giant" }; - public static readonly Npc SpiritOfQuicksand = new() { Ids = new int[] { 5718 }, Name = "Spirit of Quicksand", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Quicksand" }; - public static readonly Npc ShamblingMesa = new() { Ids = new int[] { 4321 }, Name = "Shambling Mesa", WikiUrl = "https://wiki.guildwars.com/wiki/Shambling_Mesa" }; - public static readonly Npc SandstormCrag = new() { Ids = new int[] { 4322 }, Name = "Sandstorm Crag", WikiUrl = "https://wiki.guildwars.com/wiki/Sandstorm_Crag" }; - public static readonly Npc ShahaitheCunning = new() { Ids = new int[] { 5090 }, Name = "Shahai the Cunning", WikiUrl = "https://wiki.guildwars.com/wiki/Shahai_the_Cunning" }; - public static readonly Npc PalawaJoko = new() { Ids = new int[] { 5607 }, Name = "Palawa Joko", WikiUrl = "https://wiki.guildwars.com/wiki/Palawa_Joko" }; - public static readonly Npc QueenAijundu = new() { Ids = new int[] { 5568 }, Name = "Queen Aijundu", WikiUrl = "https://wiki.guildwars.com/wiki/Queen_Aijundu" }; - public static readonly Npc AwakenedBlademaster = new() { Ids = new int[] { 5578 }, Name = "Awakened Blademaster", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened_Blademaster" }; - public static readonly Npc AwakenedCavalier = new() { Ids = new int[] { 5583 }, Name = "Awakened Cavalier", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened_Cavalier" }; - public static readonly Npc ChakehTheLonely = new() { Ids = new int[] { 5573 }, Name = "Chakeh the Lonely", WikiUrl = "https://wiki.guildwars.com/wiki/Chakeh_the_Lonely" }; - public static readonly Npc AvahTheCrafty = new() { Ids = new int[] { 5571 }, Name = "Avah the Crafty", WikiUrl = "https://wiki.guildwars.com/wiki/Avah_the_Crafty" }; - public static readonly Npc ChunduTheMeek = new() { Ids = new int[] { 5572 }, Name = "Chundu the Meek", WikiUrl = "https://wiki.guildwars.com/wiki/Chundu_the_Meek" }; - public static readonly Npc AmindTheBitter = new() { Ids = new int[] { 5569 }, Name = "Amind the Bitter", WikiUrl = "https://wiki.guildwars.com/wiki/Amind_the_Bitter" }; - public static readonly Npc NehmakTheUnpleasant = new() { Ids = new int[] { 5570 }, Name = "Nehmak the Unpleasant", WikiUrl = "https://wiki.guildwars.com/wiki/Nehmak_the_Unpleasant" }; - public static readonly Npc JununduYoung = new() { Ids = new int[] { 5599 }, Name = "Junundu Young", WikiUrl = "https://wiki.guildwars.com/wiki/Junundu_Young" }; - public static readonly Npc SahlahjarTheDead = new() { Ids = new int[] { 4828 }, Name = "Sahlahjar the Dead", WikiUrl = "https://wiki.guildwars.com/wiki/Sahlahjar_the_Dead" }; - public static readonly Npc MinionOfJoko = new() { Ids = new int[] { 5592 }, Name = "Minion of Joko", WikiUrl = "https://wiki.guildwars.com/wiki/Minion_of_Joko" }; - public static readonly Npc RavenousMandragor = new() { Ids = new int[] { 4305 }, Name = "Ravenous Mandragor", WikiUrl = "https://wiki.guildwars.com/wiki/Ravenous_Mandragor" }; - public static readonly Npc MandragorTerror = new() { Ids = new int[] { 4307 }, Name = "Mandragor Terror", WikiUrl = "https://wiki.guildwars.com/wiki/Mandragor_Terror" }; - public static readonly Npc MandragorSandDevil = new() { Ids = new int[] { 4306 }, Name = "Mandragor Sand Devil", WikiUrl = "https://wiki.guildwars.com/wiki/Mandragor_Sand_Devil" }; - public static readonly Npc GhostlyScout = new() { Ids = new int[] { 5547, 5548 }, Name = "Ghostly Scout", WikiUrl = "https://wiki.guildwars.com/wiki/Ghostly_Scout" }; - public static readonly Npc BladedDuneTermite = new() { Ids = new int[] { 4319 }, Name = "Bladed Dune Termite", WikiUrl = "https://wiki.guildwars.com/wiki/Bladed_Dune_Termite" }; - public static readonly Npc DuneBeetleLance = new() { Ids = new int[] { 4320 }, Name = "Dune Beetle Lance", WikiUrl = "https://wiki.guildwars.com/wiki/Dune_Beetle_Lance" }; - public static readonly Npc DuneSpider = new() { Ids = new int[] { 4303 }, Name = "Dune Spider", WikiUrl = "https://wiki.guildwars.com/wiki/Dune_Spider" }; - public static readonly Npc AwakenedHead = new() { Ids = new int[] { 5580 }, Name = "Awakened Head", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened_Head" }; - public static readonly Npc UndeadGeneral = new() { Ids = new int[] { 5606 }, Name = "Undead General", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Skeletons" }; - public static readonly Npc Chirah = new() { Ids = new int[] { 5272 }, Name = "Chirah", WikiUrl = "https://wiki.guildwars.com/wiki/Chirah" }; - public static readonly Npc AwakenedMonk = new() { Ids = new int[] { 5626 }, Name = "Awakened Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened" }; - public static readonly Npc AwakenedMesmer = new() { Ids = new int[] { 5625 }, Name = "Awakened Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened" }; - public static readonly Npc AwakenedDervish = new() { Ids = new int[] { 5630 }, Name = "Awakened Dervish", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened" }; - public static readonly Npc Awata = new() { Ids = new int[] { 5624 }, Name = "Awata", WikiUrl = "https://wiki.guildwars.com/wiki/Awata" }; - public static readonly Npc Thrall = new() { Ids = new int[] { 5588, 5589, 5585, 5590 }, Name = "Thrall", WikiUrl = "https://wiki.guildwars.com/wiki/Thrall" }; - public static readonly Npc GhostlyPriest = new() { Ids = new int[] { 5615 }, Name = "Ghostly Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Ghostly_Priest" }; - public static readonly Npc PrimevalKingJahnus = new() { Ids = new int[] { 5596 }, Name = "Primeval King Jahnus", WikiUrl = "https://wiki.guildwars.com/wiki/Primeval_King_Jahnus" }; - public static readonly Npc NomadGiant = new() { Ids = new int[] { 4314 }, Name = "Nomad Giant", WikiUrl = "https://wiki.guildwars.com/wiki/Nomad_Giant" }; - public static readonly Npc KoahmTheWeary = new() { Ids = new int[] { 5559 }, Name = "Koahm the Weary", WikiUrl = "https://wiki.guildwars.com/wiki/Koahm_the_Weary" }; - public static readonly Npc SadisticGiant = new() { Ids = new int[] { 4313 }, Name = "Sadistic Giant", WikiUrl = "https://wiki.guildwars.com/wiki/Sadistic_Giant" }; - public static readonly Npc UhiwiTheSmoky = new() { Ids = new int[] { 4300 }, Name = "Uhiwi the Smoky", WikiUrl = "https://wiki.guildwars.com/wiki/Uhiwi_the_Smoky" }; - public static readonly Npc ElderSiegeWurm = new() { Ids = new int[] { 5610 }, Name = "Elder Siege Wurm", WikiUrl = "https://wiki.guildwars.com/wiki/Elder_Siege_Wurm" }; - public static readonly Npc AmireshThePious = new() { Ids = new int[] { 5563 }, Name = "Amiresh the Pious", WikiUrl = "https://wiki.guildwars.com/wiki/Amiresh_the_Pious" }; - public static readonly Npc HordeofDarkness = new() { Ids = new int[] { 5486 }, Name = "Horde of Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/Horde_of_Darkness" }; - public static readonly Npc DesertWurm = new() { Ids = new int[] { 4323 }, Name = "Desert Wurm", WikiUrl = "https://wiki.guildwars.com/wiki/Desert_Wurm" }; - public static readonly Npc BladeOfCorruption = new() { Ids = new int[] { 5447 }, Name = "Blade of Corruption", WikiUrl = "https://wiki.guildwars.com/wiki/Blade_of_Corruption" }; - public static readonly Npc CaptainMehhan = new() { Ids = new int[] { 5366 }, Name = "Captain Mehhan", WikiUrl = "https://wiki.guildwars.com/wiki/Captain_Mehhan" }; - public static readonly Npc AwakenedParagon = new() { Ids = new int[] { 5631 }, Name = "Awakened Paragon", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Zombies#Mummies_(Awakened)" }; - public static readonly Npc TormentedSoul = new() { Ids = new int[] { 4983, 4984, 4988, 4989 }, Name = "Tormented Soul", WikiUrl = "https://wiki.guildwars.com/wiki/Tormented_Soul" }; - public static readonly Npc SecretKeeper = new() { Ids = new int[] { 4985 }, Name = "Secret Keeper", WikiUrl = "https://wiki.guildwars.com/wiki/Secret_Keeper" }; - public static readonly Npc WordOfMadness = new() { Ids = new int[] { 5446 }, Name = "Word of Madness", WikiUrl = "https://wiki.guildwars.com/wiki/Word_of_Madness" }; - public static readonly Npc RainOfTerror = new() { Ids = new int[] { 5445 }, Name = "Rain of Terror", WikiUrl = "https://wiki.guildwars.com/wiki/Rain_of_Terror" }; - public static readonly Npc ShadowOfFear = new() { Ids = new int[] { 5444 }, Name = "Shadow of Fear", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_of_Fear" }; - public static readonly Npc ScytheOfChaos = new() { Ids = new int[] { 5449, 4959, 7316 }, Name = "Scythe of Chaos", WikiUrl = "https://wiki.guildwars.com/wiki/Scythe_of_Chaos" }; - public static readonly Npc SpearOfTorment = new() { Ids = new int[] { 5450 }, Name = "Spear of Torment", WikiUrl = "https://wiki.guildwars.com/wiki/Spear_of_Torment" }; - public static readonly Npc HeraldOfNightmares = new() { Ids = new int[] { 5443 }, Name = "Herald of Nightmares", WikiUrl = "https://wiki.guildwars.com/wiki/Herald_of_Nightmares" }; - public static readonly Npc ArmOfInsanity = new() { Ids = new int[] { 5448 }, Name = "Arm of Insanity", WikiUrl = "https://wiki.guildwars.com/wiki/Arm_of_Insanity" }; - public static readonly Npc OnslaughtOfTerror = new() { Ids = new int[] { 5430 }, Name = "Onslaught of Terror", WikiUrl = "https://wiki.guildwars.com/wiki/Onslaught_of_Terror" }; - public static readonly Npc ZombieMonk = new() { Ids = new int[] { 5003 }, Name = "Zombie Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Zombies#Zombies" }; - public static readonly Npc ChimorTheLightblooded = new() { Ids = new int[] { 5520 }, Name = "Chimor the Lightblooded", WikiUrl = "https://wiki.guildwars.com/wiki/Chimor_the_Lightblooded" }; - public static readonly Npc ScoutAhktum = new() { Ids = new int[] { 5017 }, Name = "Scout Ahktum", WikiUrl = "https://wiki.guildwars.com/wiki/Scout_Ahktum" }; - public static readonly Npc Thenemi = new() { Ids = new int[] { 5018 }, Name = "Thenemi", WikiUrl = "https://wiki.guildwars.com/wiki/Thenemi" }; - public static readonly Npc GarfazSteelfur = new() { Ids = new int[] { 5014 }, Name = "Garfaz Steelfur", WikiUrl = "https://wiki.guildwars.com/wiki/Garfaz_Steelfur" }; - public static readonly Npc CaptainYithlis = new() { Ids = new int[] { 5013 }, Name = "Captain Yithlis", WikiUrl = "https://wiki.guildwars.com/wiki/Captain_Yithlis" }; - public static readonly Npc Igraine = new() { Ids = new int[] { 5015 }, Name = "Igraine", WikiUrl = "https://wiki.guildwars.com/wiki/Igraine" }; - public static readonly Npc TheLost = new() { Ids = new int[] { 5016 }, Name = "The Lost", WikiUrl = "https://wiki.guildwars.com/wiki/The_Lost" }; - public static readonly Npc AbaddonsAdjutant = new() { Ids = new int[] { 5483 }, Name = "Abaddon's Adjutant", WikiUrl = "https://wiki.guildwars.com/wiki/Abaddon%27s_Adjutant" }; - public static readonly Npc EmissaryOfDhuum = new() { Ids = new int[] { 5412, 5425 }, Name = "Emissary of Dhuum", WikiUrl = "https://wiki.guildwars.com/wiki/Emissary_of_Dhuum" }; - public static readonly Npc TerrorwebDryder = new() { Ids = new int[] { 2321 }, Name = "Terrorweb Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Terrorweb_Dryder" }; - public static readonly Npc Rukkassa = new() { Ids = new int[] { 4973 }, Name = "Rukkassa", WikiUrl = "https://wiki.guildwars.com/wiki/Rukkassa" }; - public static readonly Npc TorturewebDryder = new() { Ids = new int[] { 5427, 5215 }, Name = "Tortureweb Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Tortureweb_Dryder" }; - public static readonly Npc LostSoul = new() { Ids = new int[] { 2358 }, Name = "Lost Soul", WikiUrl = "https://wiki.guildwars.com/wiki/Lost_Soul" }; - public static readonly Npc Apostate = new() { Ids = new int[] { 5491 }, Name = "Apostate", WikiUrl = "https://wiki.guildwars.com/wiki/Apostate" }; - public static readonly Npc StormOfAnguish = new() { Ids = new int[] { 5436 }, Name = "Storm of Anguish", WikiUrl = "https://wiki.guildwars.com/wiki/Storm_of_Anguish" }; - public static readonly Npc ShriekerOfDread = new() { Ids = new int[] { 5439 }, Name = "Shrieker of Dread", WikiUrl = "https://wiki.guildwars.com/wiki/Shrieker_of_Dread" }; - public static readonly Npc ShirokenElementalist = new() { Ids = new int[] { 4128 }, Name = "Shiro'ken Elementalist", WikiUrl = "https://wiki.guildwars.com/wiki/Shiro%27ken_Elementalist" }; - public static readonly Npc PainTitan = new() { Ids = new int[] { 4969 }, Name = "Pain Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Pain_Titan" }; - public static readonly Npc ShirokenMonk = new() { Ids = new int[] { 4129 }, Name = "Shiro'ken Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Shiro%27ken_Monk" }; - public static readonly Npc ShirokenMesmer = new() { Ids = new int[] { 4126 }, Name = "Shiro'ken Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Shiro%27ken_Mesmer" }; - public static readonly Npc TitanAbomination = new() { Ids = new int[] { 4968 }, Name = "Titan Abomination", WikiUrl = "https://wiki.guildwars.com/wiki/Titan_Abomination" }; - public static readonly Npc BoundTiendi = new() { Ids = new int[] { 4087 }, Name = "Bound Tiendi", WikiUrl = "https://wiki.guildwars.com/wiki/Bound_Tiendi" }; - public static readonly Npc BoundKaichen = new() { Ids = new int[] { 4085 }, Name = "Bound Kaichen", WikiUrl = "https://wiki.guildwars.com/wiki/Bound_Kaichen" }; - public static readonly Npc WrathfulStorm = new() { Ids = new int[] { 4961, 7320 }, Name = "Wrathful Storm", WikiUrl = "https://wiki.guildwars.com/wiki/Wrathful_Storm" }; - public static readonly Npc GraspOfInsanity = new() { Ids = new int[] { 4960, 7317 }, Name = "Grasp of Insanity", WikiUrl = "https://wiki.guildwars.com/wiki/Grasp_of_Insanity" }; - public static readonly Npc TormentClaw = new() { Ids = new int[] { 5461, 7319 }, Name = "Torment Claw", WikiUrl = "https://wiki.guildwars.com/wiki/Torment_Claw" }; - public static readonly Npc BoundHaoLi = new() { Ids = new int[] { 4082 }, Name = "Bound Hao Li", WikiUrl = "https://wiki.guildwars.com/wiki/Bound_Hao_Li" }; - public static readonly Npc IgnisCruor = new() { Ids = new int[] { 4978 }, Name = "Ignis Cruor", WikiUrl = "https://wiki.guildwars.com/wiki/Ignis_Cruor" }; - public static readonly Npc ShadowBeast = new() { Ids = new int[] { 4967, 2809 }, Name = "Shadow Beast", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_Beast" }; - public static readonly Npc CreoVulnero = new() { Ids = new int[] { 4957 }, Name = "Creo Vulnero", WikiUrl = "https://wiki.guildwars.com/wiki/Creo_Vulnero" }; - public static readonly Npc PortalWraith = new() { Ids = new int[] { 2764 }, Name = "Portal Wraith", WikiUrl = "https://wiki.guildwars.com/wiki/Portal_Wraith" }; - public static readonly Npc ArmageddonLord = new() { Ids = new int[] { 2674 }, Name = "Armageddon Lord", WikiUrl = "https://wiki.guildwars.com/wiki/Armageddon_Lord" }; - public static readonly Npc JoyousSoul = new() { Ids = new int[] { 5011, 5009, 5010, 5012, 5008 }, Name = "Joyous Soul", WikiUrl = "https://wiki.guildwars.com/wiki/Joyous_Soul" }; - public static readonly Npc MagridTheSly = new() { Ids = new int[] { 4451 }, Name = "Magrid the Sly", WikiUrl = "https://wiki.guildwars.com/wiki/Magrid_the_Sly" }; - public static readonly Npc Zenmai = new() { Ids = new int[] { 3552 }, Name = "Zenmai", WikiUrl = "https://wiki.guildwars.com/wiki/Zenmai" }; - public static readonly Npc Abaddon = new() { Ids = new int[] { 5142 }, Name = "Abaddon", WikiUrl = "https://wiki.guildwars.com/wiki/Abaddon" }; - public static readonly Npc CorsairRunner = new() { Ids = new int[] { 5091 }, Name = "Corsair Runner", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Runner" }; - public static readonly Npc Abyssal = new() { Ids = new int[] { 2810, 5194 }, Name = "Abyssal", WikiUrl = "https://wiki.guildwars.com/wiki/Abyssal" }; - public static readonly Npc GhostChampion = new() { Ids = new int[] { 2826 }, Name = "Ghost Champion", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Ghosts" }; - public static readonly Npc ShadowWarrior = new() { Ids = new int[] { 2807, 4965 }, Name = "Shadow Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_Warrior" }; - public static readonly Npc ShadowElemental = new() { Ids = new int[] { 2805, 4963 }, Name = "Shadow Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_Elemental" }; - public static readonly Npc SkeletalEtherBreaker = new() { Ids = new int[] { 2816 }, Name = "Skeletal Ether Breaker", WikiUrl = "https://wiki.guildwars.com/wiki/Skeletal_Ether_Breaker" }; - public static readonly Npc SkeletalIcehand = new() { Ids = new int[] { 2817 }, Name = "Skeletal Icehand", WikiUrl = "https://wiki.guildwars.com/wiki/Skeletal_Icehand" }; - public static readonly Npc SkeletalBond = new() { Ids = new int[] { 2818 }, Name = "Skeletal Bond", WikiUrl = "https://wiki.guildwars.com/wiki/Skeletal_Bond" }; - public static readonly Npc SkeletalBerserker = new() { Ids = new int[] { 2819 }, Name = "Skeletal Berserker", WikiUrl = "https://wiki.guildwars.com/wiki/Skeletal_Berserker" }; - public static readonly Npc SpiritShepherd = new() { Ids = new int[] { 2813 }, Name = "Spirit Shepherd", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_Shepherd" }; - public static readonly Npc SpiritWood = new() { Ids = new int[] { 2812 }, Name = "Spirit Wood", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_Wood" }; - public static readonly Npc SpiritofNaturesRenewal = new() { Ids = new int[] { 2887 }, Name = "Spirit of Nature's Renewal", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Nature%27s_Renewal" }; - public static readonly Npc RockBorerWorm = new() { Ids = new int[] { 2821 }, Name = "Rock Borer Worm", WikiUrl = "https://wiki.guildwars.com/wiki/Rock_Borer_Worm" }; - public static readonly Npc SpiritofExtinction = new() { Ids = new int[] { 2876 }, Name = "Spirit of Extinction", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Extinction" }; - public static readonly Npc ArmoredCaveSpider = new() { Ids = new int[] { 2800 }, Name = "Armored Cave Spider", WikiUrl = "https://wiki.guildwars.com/wiki/Armored_Cave_Spider" }; - public static readonly Npc Banshee = new() { Ids = new int[] { 2326 }, Name = "Banshee", WikiUrl = "https://wiki.guildwars.com/wiki/Banshee" }; - public static readonly Npc ForestGriffon = new() { Ids = new int[] { 2827 }, Name = "Forest Griffon", WikiUrl = "https://wiki.guildwars.com/wiki/Forest_Griffon" }; - public static readonly Npc SkeletalImpaler = new() { Ids = new int[] { 2820 }, Name = "Skeletal Impaler", WikiUrl = "https://wiki.guildwars.com/wiki/Skeletal_Impaler" }; - public static readonly Npc FlamingScepterMage = new() { Ids = new int[] { 2832 }, Name = "Flaming Scepter Mage", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Ghosts" }; - public static readonly Npc EternalForgemaster = new() { Ids = new int[] { 2829 }, Name = "Eternal Forgemaster", WikiUrl = "https://wiki.guildwars.com/wiki/Eternal_Forgemaster" }; - public static readonly Npc EternalRanger = new() { Ids = new int[] { 2834 }, Name = "Eternal Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Eternal_Ranger" }; - public static readonly Npc SeedofCorruption = new() { Ids = new int[] { 2811 }, Name = "Seed of Corruption", WikiUrl = "https://wiki.guildwars.com/wiki/Seed_of_Corruption" }; - public static readonly Npc DoubtersDryder = new() { Ids = new int[] { 2803 }, Name = "Doubter's Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Doubter%27s_Dryder" }; - public static readonly Npc ObsidianFurnaceDrake = new() { Ids = new int[] { 2802 }, Name = "Obsidian Furnace Drake", WikiUrl = "https://wiki.guildwars.com/wiki/Obsidian_Furnace_Drake" }; - public static readonly Npc SmokeWalker = new() { Ids = new int[] { 2801 }, Name = "Smoke Walker", WikiUrl = "https://wiki.guildwars.com/wiki/Smoke_Walker" }; - public static readonly Npc InfernalWurm = new() { Ids = new int[] { 2822 }, Name = "Infernal Wurm", WikiUrl = "https://wiki.guildwars.com/wiki/Infernal_Wurm" }; - public static readonly Npc AncientSkale = new() { Ids = new int[] { 2814 }, Name = "Ancient Skale", WikiUrl = "https://wiki.guildwars.com/wiki/Ancient_Skale" }; - public static readonly Npc DragonLich = new() { Ids = new int[] { 2823 }, Name = "Dragon Lich", WikiUrl = "https://wiki.guildwars.com/wiki/Dragon_Lich" }; - public static readonly Npc VisionOfDespair = new() { Ids = new int[] { 5440 }, Name = "Vision of Despair", WikiUrl = "https://wiki.guildwars.com/wiki/Vision_of_Despair" }; - public static readonly Npc SaevioProelium = new() { Ids = new int[] { 4956 }, Name = "Saevio Proelium", WikiUrl = "https://wiki.guildwars.com/wiki/Saevio_Proelium" }; - public static readonly Npc BringerOfDeceit = new() { Ids = new int[] { 5441 }, Name = "Bringer of Deceit", WikiUrl = "https://wiki.guildwars.com/wiki/Bringer_of_Deceit" }; - public static readonly Npc SpiritOfQuickeningZephyr = new() { Ids = new int[] { 2886 }, Name = "Spirit of Quickening Zephyr", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Quickening_Zephyr" }; - public static readonly Npc FlameOfFervor = new() { Ids = new int[] { 5437 }, Name = "Flame of Fervor", WikiUrl = "https://wiki.guildwars.com/wiki/Flame_of_Fervor" }; - public static readonly Npc WaterBornTitan = new() { Ids = new int[] { 2677 }, Name = "Water Born Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Water_Born_Titan" }; - public static readonly Npc WildGrowth = new() { Ids = new int[] { 2678 }, Name = "Wild Growth", WikiUrl = "https://wiki.guildwars.com/wiki/Wild_Growth" }; - public static readonly Npc SeedOfSuffering = new() { Ids = new int[] { 5438 }, Name = "Seed of Suffering", WikiUrl = "https://wiki.guildwars.com/wiki/Seed_of_Suffering" }; - public static readonly Npc FortuneTellerGhost = new() { Ids = new int[] { 4977 }, Name = "Fortune Teller Ghost", WikiUrl = "https://wiki.guildwars.com/wiki/Fortune_Teller" }; - public static readonly Npc EarthBornTitan = new() { Ids = new int[] { 2676 }, Name = "Earth Born Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Earth_Born_Titan" }; - public static readonly Npc WindBornTitan = new() { Ids = new int[] { 2675 }, Name = "Wind Born Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Wind_Born_Titan" }; - public static readonly Npc RottingTitan = new() { Ids = new int[] { 2679 }, Name = "Rotting Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Rotting_Titan" }; - public static readonly Npc ForgottenIllusionist = new() { Ids = new int[] { 4974, 1861 }, Name = "Forgotten Illusionist", WikiUrl = "https://wiki.guildwars.com/wiki/Forgotten_Illusionist" }; - public static readonly Npc WieshurTheInspiring = new() { Ids = new int[] { 5523 }, Name = "Wieshur the Inspiring", WikiUrl = "https://wiki.guildwars.com/wiki/Wieshur_the_Inspiring" }; - public static readonly Npc HautohThePilferer = new() { Ids = new int[] { 5524 }, Name = "Hautoh the Pilferer", WikiUrl = "https://wiki.guildwars.com/wiki/Hautoh_the_Pilferer" }; - public static readonly Npc LetumContineo = new() { Ids = new int[] { 4980 }, Name = "Letum Contineo", WikiUrl = "https://wiki.guildwars.com/wiki/Letum_Contineo" }; - public static readonly Npc SecurisPhasmatis = new() { Ids = new int[] { 4979 }, Name = "Securis Phasmatis", WikiUrl = "https://wiki.guildwars.com/wiki/Securis_Phasmatis" }; - public static readonly Npc Razakel = new() { Ids = new int[] { 5426 }, Name = "Razakel", WikiUrl = "https://wiki.guildwars.com/wiki/Razakel" }; - public static readonly Npc BindingGuardian = new() { Ids = new int[] { 5222 }, Name = "Binding Guardian", WikiUrl = "https://wiki.guildwars.com/wiki/Binding_Guardian" }; - public static readonly Npc Razah = new() { Ids = new int[] { 4502 }, Name = "Razah", WikiUrl = "https://wiki.guildwars.com/wiki/Razah" }; - public static readonly Npc MargoniteAnurTuk = new() { Ids = new int[] { 5171 }, Name = "Margonite Anur Tuk", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Tuk" }; - public static readonly Npc MargoniteAnurSu = new() { Ids = new int[] { 5168 }, Name = "Margonite Anur Su", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Su" }; - public static readonly Npc MargoniteAnurDabi = new() { Ids = new int[] { 5167 }, Name = "Margonite Anur Dabi", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Dabi" }; - public static readonly Npc MargoniteAnurVu = new() { Ids = new int[] { 5170 }, Name = "Margonite Anur Vu", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Vu" }; - public static readonly Npc MargoniteAnurKi = new() { Ids = new int[] { 5169 }, Name = "Margonite Anur Ki", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Ki" }; - public static readonly Npc MargoniteAnurRund = new() { Ids = new int[] { 5173 }, Name = "Margonite Anur Rund", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Rund" }; - public static readonly Npc WindOfDarkness = new() { Ids = new int[] { 5192 }, Name = "Wind of Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/Wind_of_Darkness" }; - public static readonly Npc ChillOfDarkness = new() { Ids = new int[] { 5189 }, Name = "Chill of Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/Chill_of_Darkness" }; - public static readonly Npc ClawOfDarkness = new() { Ids = new int[] { 5191 }, Name = "Claw of Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/Claw_of_Darkness" }; - public static readonly Npc ThoughtOfDarkness = new() { Ids = new int[] { 5188 }, Name = "Thought of Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/Thought_of_Darkness" }; - public static readonly Npc CurseOfDarkness = new() { Ids = new int[] { 5193 }, Name = "Curse of Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/Curse_of_Darkness" }; - public static readonly Npc ScourgeOfDarkness = new() { Ids = new int[] { 5190 }, Name = "Scourge of Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/Scourge_of_Darkness" }; - public static readonly Npc MargoniteAnurRuk = new() { Ids = new int[] { 5172 }, Name = "Margonite Anur Ruk", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Ruk" }; - public static readonly Npc MargoniteAnurMank = new() { Ids = new int[] { 5174 }, Name = "Margonite Anur Mank", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Mank" }; - public static readonly Npc HeartTormentor = new() { Ids = new int[] { 5207 }, Name = "Heart Tormentor", WikiUrl = "https://wiki.guildwars.com/wiki/Heart_Tormentor" }; - public static readonly Npc WaterTormentor = new() { Ids = new int[] { 5206 }, Name = "Water Tormentor", WikiUrl = "https://wiki.guildwars.com/wiki/Water_Tormentor" }; - public static readonly Npc SpiritTormentor = new() { Ids = new int[] { 5209 }, Name = "Spirit Tormentor", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_Tormentor" }; - public static readonly Npc SanityTormentor = new() { Ids = new int[] { 5212 }, Name = "Sanity Tormentor", WikiUrl = "https://wiki.guildwars.com/wiki/Sanity_Tormentor" }; - public static readonly Npc MindTormentor = new() { Ids = new int[] { 5204 }, Name = "Mind Tormentor", WikiUrl = "https://wiki.guildwars.com/wiki/Mind_Tormentor" }; - public static readonly Npc SoulTormentor = new() { Ids = new int[] { 5205 }, Name = "Soul Tormentor", WikiUrl = "https://wiki.guildwars.com/wiki/Soul_Tormentor" }; - public static readonly Npc FleshTormentor = new() { Ids = new int[] { 5208 }, Name = "Flesh Tormentor", WikiUrl = "https://wiki.guildwars.com/wiki/Flesh_Tormentor" }; - public static readonly Npc MargoniteAnurKaya = new() { Ids = new int[] { 5166 }, Name = "Margonite Anur Kaya", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Kaya" }; - public static readonly Npc StygianBrute = new() { Ids = new int[] { 5176 }, Name = "Stygian Brute", WikiUrl = "https://wiki.guildwars.com/wiki/Stygian_Brute" }; - public static readonly Npc StygianGolem = new() { Ids = new int[] { 5177 }, Name = "Stygian Golem", WikiUrl = "https://wiki.guildwars.com/wiki/Stygian_Golem" }; - public static readonly Npc ShaunurTheDivine = new() { Ids = new int[] { 5159 }, Name = "Shaunur the Divine", WikiUrl = "https://wiki.guildwars.com/wiki/Shaunur_the_Divine" }; - public static readonly Npc LordJadoth = new() { Ids = new int[] { 5144 }, Name = "Lord Jadoth", WikiUrl = "https://wiki.guildwars.com/wiki/Lord_Jadoth" }; - public static readonly Npc TurepMakerOfOrphans = new () { Ids = new int[] { 5160 }, Name = "Turep, Maker of Orphans", WikiUrl = "https://wiki.guildwars.com/wiki/Turep,_Maker_of_Orphans" }; - public static readonly Npc StygianHunger = new() { Ids = new int[] { 5175 }, Name = "Stygian Hunger", WikiUrl = "https://wiki.guildwars.com/wiki/Stygian_Hunger" }; - public static readonly Npc SpiritOfTruth = new() { Ids = new int[] { 4986 }, Name = "Spirit of Truth", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Truth" }; - public static readonly Npc TheDarkness = new() { Ids = new int[] { 5152 }, Name = "The Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/The_Darkness" }; - public static readonly Npc RageTitan = new() { Ids = new int[] { 5201 }, Name = "Rage Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Rage_Titan" }; - public static readonly Npc DespairTitan = new() { Ids = new int[] { 5203 }, Name = "Despair Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Despair_Titan" }; - public static readonly Npc GreaterDreamRider = new() { Ids = new int[] { 5216 }, Name = "Greater Dream Rider", WikiUrl = "https://wiki.guildwars.com/wiki/Greater_Dream_Rider" }; - public static readonly Npc AnguishTitan = new() { Ids = new int[] { 5198 }, Name = "Anguish Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Anguish_Titan" }; - public static readonly Npc MiseryTitan = new() { Ids = new int[] { 5195 }, Name = "Misery Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Misery_Titan" }; - public static readonly Npc FuryTitan = new() { Ids = new int[] { 5200 }, Name = "Fury Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Fury_Titan" }; - public static readonly Npc DementiaTitan = new() { Ids = new int[] { 5197 }, Name = "Dementia Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Dementia_Titan" }; - public static readonly Npc BanishedDreamRider = new() { Ids = new int[] { 7321 }, Name = "Banished Dream Rider", WikiUrl = "https://wiki.guildwars.com/wiki/Banished_Dream_Rider" }; - public static readonly Npc ChaosWurm = new() { Ids = new int[] { 7326 }, Name = "Chaos Wurm", WikiUrl = "https://wiki.guildwars.com/wiki/Chaos_Wurm" }; - public static readonly Npc GuardianOfKomalie = new() { Ids = new int[] { 5162, 5161 }, Name = "Guardian of Komalie", WikiUrl = "https://wiki.guildwars.com/wiki/Guardian_of_Komalie" }; - public static readonly Npc TheFury = new() { Ids = new int[] { 5149 }, Name = "The Fury", WikiUrl = "https://wiki.guildwars.com/wiki/The_Fury" }; - public static readonly Npc StygianHorror = new() { Ids = new int[] { 5178 }, Name = "Stygian Horror", WikiUrl = "https://wiki.guildwars.com/wiki/Stygian_Horror" }; - public static readonly Npc StygianFiend = new() { Ids = new int[] { 5179 }, Name = "Stygian Fiend", WikiUrl = "https://wiki.guildwars.com/wiki/Stygian_Fiend" }; - public static readonly Npc StygianUnderlord = new() { Ids = new int[] { 5163, 5164 }, Name = "Stygian Underlord", WikiUrl = "https://wiki.guildwars.com/wiki/Stygian_Underlord" }; - public static readonly Npc StygianLord = new() { Ids = new int[] { 5148, 5147, 5146, 5145 }, Name = "Stygian Lord", WikiUrl = "https://wiki.guildwars.com/wiki/Stygian_Lord" }; - public static readonly Npc CharrRitualist = new() { Ids = new int[] { 6601, 6600 }, Name = "Charr Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Charr" }; - public static readonly Npc SiegeDevourer = new() { Ids = new int[] { 6531, 6614 }, Name = "Siege Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Siege_Devourer" }; - public static readonly Npc MantidDigger = new() { Ids = new int[] { 6673 }, Name = "Mantid Digger", WikiUrl = "https://wiki.guildwars.com/wiki/Mantid_Digger" }; - public static readonly Npc MantidNymph = new() { Ids = new int[] { 6672 }, Name = "Mantid Nymph", WikiUrl = "https://wiki.guildwars.com/wiki/Mantid_Nymph" }; - public static readonly Npc HoraiWingshielder = new() { Ids = new int[] { 6646 }, Name = "Horai Wingshielder", WikiUrl = "https://wiki.guildwars.com/wiki/Horai_Wingshielder" }; - public static readonly Npc MantidQueen = new() { Ids = new int[] { 6674 }, Name = "Mantid Queen", WikiUrl = "https://wiki.guildwars.com/wiki/Mantid_Queen" }; - public static readonly Npc CharrHexreaper = new() { Ids = new int[] { 6618 }, Name = "Charr Hexreaper", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Hexreaper" }; - public static readonly Npc CharrSeeker = new() { Ids = new int[] { 6634 }, Name = "Charr Seeker", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Seeker" }; - public static readonly Npc CharrAxemaster = new() { Ids = new int[] { 6627 }, Name = "Charr Axemaster", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Axemaster" }; - public static readonly Npc CharrFlameshielder = new() { Ids = new int[] { 6621 }, Name = "Charr Flameshielder", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Flameshielder" }; - public static readonly Npc CharrDominator = new() { Ids = new int[] { 6616 }, Name = "Charr Dominator", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Dominator" }; - public static readonly Npc CharrBlademaster = new() { Ids = new int[] { 6631 }, Name = "Charr Blademaster", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Blademaster" }; - public static readonly Npc MolotovRocktail = new() { Ids = new int[] { 6649 }, Name = "Molotov Rocktail", WikiUrl = "https://wiki.guildwars.com/wiki/Molotov_Rocktail" }; - public static readonly Npc ArmoredSaurus = new() { Ids = new int[] { 6653, 6652 }, Name = "Armored Saurus", WikiUrl = "https://wiki.guildwars.com/wiki/Armored_Saurus" }; - public static readonly Npc GronFierceclaw = new() { Ids = new int[] { 6593 }, Name = "Gron Fierceclaw", WikiUrl = "https://wiki.guildwars.com/wiki/Gron_Fierceclaw" }; - public static readonly Npc BonworFierceblade = new() { Ids = new int[] { 6590 }, Name = "Bonwor Fierceblade", WikiUrl = "https://wiki.guildwars.com/wiki/Bonwor_Fierceblade" }; - public static readonly Npc SeerFiercereign = new() { Ids = new int[] { 6584 }, Name = "Seer Fiercereign", WikiUrl = "https://wiki.guildwars.com/wiki/Seer_Fiercereign" }; - public static readonly Npc CowlFiercetongue = new() { Ids = new int[] { 6586 }, Name = "Cowl Fiercetongue", WikiUrl = "https://wiki.guildwars.com/wiki/Cowl_Fiercetongue" }; - public static readonly Npc RoanFierceheart = new() { Ids = new int[] { 6588 }, Name = "Roan Fierceheart", WikiUrl = "https://wiki.guildwars.com/wiki/Roan_Fierceheart" }; - public static readonly Npc CharrWardkeeper = new() { Ids = new int[] { 6637 }, Name = "Charr Wardkeeper", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Wardkeeper" }; - public static readonly Npc EliteCharrGuard = new() { Ids = new int[] { 6574 }, Name = "Elite Charr Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Elite_Charr_Guard" }; - public static readonly Npc CapturedVanguardSoldier = new() { Ids = new int[] { 6043, 6044, 6045 }, Name = "Captured Vanguard Soldier", WikiUrl = "https://wiki.guildwars.com/wiki/Captured_Vanguard_Soldier" }; - public static readonly Npc HierophantBurntsoul = new() { Ids = new int[] { 6554 }, Name = "Hierophant Burntsoul", WikiUrl = "https://wiki.guildwars.com/wiki/Hierophant_Burntsoul" }; - public static readonly Npc CharrAvenger = new() { Ids = new int[] { 6639 }, Name = "Charr Avenger", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Avenger" }; - public static readonly Npc DestroyerofThoughts = new() { Ids = new int[] { 6145 }, Name = "Destroyer of Thoughts", WikiUrl = "https://wiki.guildwars.com/wiki/Destroyer_of_Thoughts" }; - public static readonly Npc DestroyerofDeeds = new() { Ids = new int[] { 6168 }, Name = "Destroyer of Deeds", WikiUrl = "https://wiki.guildwars.com/wiki/Destroyer_of_Deeds" }; - public static readonly Npc DestroyerofHordes = new() { Ids = new int[] { 6169 }, Name = "Destroyer of Hordes", WikiUrl = "https://wiki.guildwars.com/wiki/Destroyer_of_Hordes" }; - public static readonly Npc DestroyerofBones = new() { Ids = new int[] { 6157 }, Name = "Destroyer of Bones", WikiUrl = "https://wiki.guildwars.com/wiki/Destroyer_of_Bones" }; - public static readonly Npc DestroyerofSinew = new() { Ids = new int[] { 6156 }, Name = "Destroyer of Sinew", WikiUrl = "https://wiki.guildwars.com/wiki/Destroyer_of_Sinew" }; - public static readonly Npc CaptainLangmar = new() { Ids = new int[] { 6032 }, Name = "Captain Langmar", WikiUrl = "https://wiki.guildwars.com/wiki/Captain_Langmar" }; - public static readonly Npc VileMandragor = new() { Ids = new int[] { 6656 }, Name = "Vile Mandragor", WikiUrl = "https://wiki.guildwars.com/wiki/Vile_Mandragor" }; - public static readonly Npc MandragorSmokeDevil = new() { Ids = new int[] { 6658 }, Name = "Mandragor Smoke Devil", WikiUrl = "https://wiki.guildwars.com/wiki/Mandragor_Smoke_Devil" }; - public static readonly Npc MandragorDustDevil = new() { Ids = new int[] { 6657 }, Name = "Mandragor Dust Devil", WikiUrl = "https://wiki.guildwars.com/wiki/Mandragor_Dust_Devil" }; - public static readonly Npc DeadlySkale = new() { Ids = new int[] { 6675 }, Name = "Deadly Skale", WikiUrl = "https://wiki.guildwars.com/wiki/Deadly_Skale" }; - public static readonly Npc CharrMender = new() { Ids = new int[] { 6626 }, Name = "Charr Mender", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Mender" }; - public static readonly Npc ThraexisThundermaw = new() { Ids = new int[] { 6644 }, Name = "Thraexis Thundermaw", WikiUrl = "https://wiki.guildwars.com/wiki/Thraexis_Thundermaw" }; - public static readonly Npc KatyeBloodburner = new() { Ids = new int[] { 6551 }, Name = "Katye Bloodburner", WikiUrl = "https://wiki.guildwars.com/wiki/Katye_Bloodburner" }; - public static readonly Npc AnmattheTrickster = new() { Ids = new int[] { 6550 }, Name = "Anmat the Trickster", WikiUrl = "https://wiki.guildwars.com/wiki/Anmat_the_Trickster" }; - public static readonly Npc GrawlChampion = new() { Ids = new int[] { 6670 }, Name = "Grawl Champion", WikiUrl = "https://wiki.guildwars.com/wiki/Grawl_Champion" }; - public static readonly Npc GrawlDarkPriest = new() { Ids = new int[] { 6669 }, Name = "Grawl Dark Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Grawl_Dark_Priest" }; - public static readonly Npc SpiritofPreservation = new() { Ids = new int[] { 4219 }, Name = "Spirit of Preservation", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Preservation" }; - public static readonly Npc TumbledElemental = new() { Ids = new int[] { 6678 }, Name = "Tumbled Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Tumbled_Elemental" }; - public static readonly Npc FlowstoneElemental = new() { Ids = new int[] { 6915 }, Name = "Flowstone Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Flowstone_Elemental" }; - public static readonly Npc MagmaBlister = new() { Ids = new int[] { 6916 }, Name = "Magma Blister", WikiUrl = "https://wiki.guildwars.com/wiki/Magma_Blister" }; - public static readonly Npc GrawlDemagogue = new() { Ids = new int[] { 6671 }, Name = "Grawl Demagogue", WikiUrl = "https://wiki.guildwars.com/wiki/Grawl_Demagogue" }; - public static readonly Npc BurningSpirit = new() { Ids = new int[] { 6918 }, Name = "Burning Spirit", WikiUrl = "https://wiki.guildwars.com/wiki/Burning_Spirit" }; - public static readonly Npc IgnustheEternal = new() { Ids = new int[] { 6654 }, Name = "Ignus the Eternal", WikiUrl = "https://wiki.guildwars.com/wiki/Ignus_the_Eternal" }; - public static readonly Npc SwarmofBees = new() { Ids = new int[] { 6640 }, Name = "Swarm of Bees", WikiUrl = "https://wiki.guildwars.com/wiki/Swarm_of_Bees" }; - public static readonly Npc MergoyleWavebreaker = new() { Ids = new int[] { 1723 }, Name = "Mergoyle Wavebreaker", WikiUrl = "https://wiki.guildwars.com/wiki/Mergoyle_Wavebreaker" }; - public static readonly Npc SnowEttin = new() { Ids = new int[] { 2491 }, Name = "Snow Ettin", WikiUrl = "https://wiki.guildwars.com/wiki/Snow_Ettin" }; - public static readonly Npc IceGolem = new() { Ids = new int[] { 2647 }, Name = "Ice Golem", WikiUrl = "https://wiki.guildwars.com/wiki/Ice_Golem" }; - public static readonly Npc WhiskarFeatherstorm = new() { Ids = new int[] { 2479 }, Name = "Whiskar Featherstorm", WikiUrl = "https://wiki.guildwars.com/wiki/Whiskar_Featherstorm" }; - public static readonly Npc Snow = new() { Ids = new int[] { 2548 }, Name = "Snow", WikiUrl = "https://wiki.guildwars.com/wiki/Snow" }; - public static readonly Npc MasterSeekerNathaniel = new() { Ids = new int[] { 2229 }, Name = "Master Seeker Nathaniel", WikiUrl = "https://wiki.guildwars.com/wiki/Master_Seeker_Nathaniel" }; - public static readonly Npc SnowEttinBoss = new() { Ids = new int[] { 2481 }, Name = "Snow Ettin Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Snow_Ettin" }; - public static readonly Npc ShiverpeakProtector = new() { Ids = new int[] { 2487 }, Name = "Shiverpeak Protector", WikiUrl = "https://wiki.guildwars.com/wiki/Shiverpeak_Protector" }; - public static readonly Npc ShiverpeakWarrior = new() { Ids = new int[] { 2488 }, Name = "Shiverpeak Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Shiverpeak_Warrior" }; - public static readonly Npc ShiverpeakLongbow = new() { Ids = new int[] { 2489 }, Name = "Shiverpeak Longbow", WikiUrl = "https://wiki.guildwars.com/wiki/Shiverpeak_Longbow" }; - public static readonly Npc MoroStormcalf = new() { Ids = new int[] { 2475 }, Name = "Moro Stormcalf", WikiUrl = "https://wiki.guildwars.com/wiki/Moro_Stormcalf" }; - public static readonly Npc JoloLighthaunch = new() { Ids = new int[] { 2476 }, Name = "Jolo Lighthaunch", WikiUrl = "https://wiki.guildwars.com/wiki/Jolo_Lighthaunch" }; - public static readonly Npc SnowWolf = new() { Ids = new int[] { 1350 }, Name = "Snow Wolf", WikiUrl = "https://wiki.guildwars.com/wiki/Snow_Wolf" }; - public static readonly Npc FrostfireDryder = new() { Ids = new int[] { 2490, 2483, 2485, 2484 }, Name = "Frostfire Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Frostfire_Dryder" }; - public static readonly Npc StoneSummitSage = new() { Ids = new int[] { 2641 }, Name = "Stone Summit Sage", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Sage" }; - public static readonly Npc DolyakRider = new() { Ids = new int[] { 2640 }, Name = "Dolyak Rider", WikiUrl = "https://wiki.guildwars.com/wiki/Dolyak_Rider" }; - public static readonly Npc StoneSummitHowler = new() { Ids = new int[] { 2642 }, Name = "Stone Summit Howler", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Howler" }; - public static readonly Npc StoneSummitScout = new() { Ids = new int[] { 2646 }, Name = "Stone Summit Scout", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Scout" }; - public static readonly Npc ShalisIronmantle = new() { Ids = new int[] { 2622 }, Name = "Shalis Ironmantle", WikiUrl = "https://wiki.guildwars.com/wiki/Shalis_Ironmantle" }; - public static readonly Npc SummitAxeWielder = new() { Ids = new int[] { 2643 }, Name = "Summit Axe Wielder", WikiUrl = "https://wiki.guildwars.com/wiki/Summit_Axe_Wielder" }; - public static readonly Npc SarisHeadstaver = new() { Ids = new int[] { 2612 }, Name = "Saris Headstaver", WikiUrl = "https://wiki.guildwars.com/wiki/Saris_Headstaver" }; - public static readonly Npc TorisStonehammer = new() { Ids = new int[] { 2616 }, Name = "Toris Stonehammer", WikiUrl = "https://wiki.guildwars.com/wiki/Toris_Stonehammer" }; - public static readonly Npc TheJudge = new() { Ids = new int[] { 2614 }, Name = "The Judge", WikiUrl = "https://wiki.guildwars.com/wiki/The_Judge" }; - public static readonly Npc BoulderElemental = new() { Ids = new int[] { 2439 }, Name = "Boulder Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Boulder_Elemental" }; - public static readonly Npc StoneFury = new() { Ids = new int[] { 2442 }, Name = "Stone Fury", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Fury" }; - public static readonly Npc CharrMartyr = new() { Ids = new int[] { 1648 }, Name = "Charr Martyr", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Martyr" }; - public static readonly Npc CharrFlameWielder = new() { Ids = new int[] { 1641 }, Name = "Charr Flame Wielder", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Flame_Wielder" }; - public static readonly Npc CharrMindSpark = new() { Ids = new int[] { 1636 }, Name = "Charr Mind Spark", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Mind_Spark" }; - public static readonly Npc CharrAshWalker = new() { Ids = new int[] { 1639 }, Name = "Charr Ash Walker", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Ash_Walker" }; - public static readonly Npc StormRider = new() { Ids = new int[] { 2425 }, Name = "Storm Rider", WikiUrl = "https://wiki.guildwars.com/wiki/Storm_Rider" }; - public static readonly Npc FlashGargoyle = new() { Ids = new int[] { 2447 }, Name = "Flash Gargoyle", WikiUrl = "https://wiki.guildwars.com/wiki/Flash_Gargoyle" }; - public static readonly Npc AscalonWarrior = new() { Ids = new int[] { 2060 }, Name = "Ascalon Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalon_Warrior" }; - public static readonly Npc ResurrectGargoyle = new() { Ids = new int[] { 2451 }, Name = "Resurrect Gargoyle", WikiUrl = "https://wiki.guildwars.com/wiki/Resurrect_Gargoyle" }; - public static readonly Npc WhiptailDevourer = new() { Ids = new int[] { 2432 }, Name = "Whiptail Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Whiptail_Devourer" }; - public static readonly Npc MalletRunecolumn = new() { Ids = new int[] { 2394 }, Name = "Mallet Runecolumn", WikiUrl = "https://wiki.guildwars.com/wiki/Mallet_Runecolumn" }; - public static readonly Npc CrownofThorns = new() { Ids = new int[] { 2455 }, Name = "Crown of Thorns", WikiUrl = "https://wiki.guildwars.com/wiki/Crown_of_Thorns" }; - public static readonly Npc DrimCindershot = new() { Ids = new int[] { 1601 }, Name = "Drim Cindershot", WikiUrl = "https://wiki.guildwars.com/wiki/Drim_Cindershot" }; - public static readonly Npc AscalonianHunter = new() { Ids = new int[] { 2052 }, Name = "Ascalonian Hunter", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalonian_Hunter" }; - public static readonly Npc MirashDreambreaker = new() { Ids = new int[] { 1596 }, Name = "Mirash Dreambreaker", WikiUrl = "https://wiki.guildwars.com/wiki/Mirash_Dreambreaker" }; - public static readonly Npc AscalonianCrafter = new() { Ids = new int[] { 2068 }, Name = "Ascalonian Crafter", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; - public static readonly Npc AscalonianWeaponsmith = new() { Ids = new int[] { 2087 }, Name = "Ascalonian Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; - public static readonly Npc AscalonianMerchant = new() { Ids = new int[] { 2101, 2015 }, Name = "Ascalonian Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; - public static readonly Npc Viggo = new() { Ids = new int[] { 2139 }, Name = "Viggo", WikiUrl = "https://wiki.guildwars.com/wiki/Viggo" }; - public static readonly Npc GorgaanHatemonger = new() { Ids = new int[] { 1600 }, Name = "Gorgaan Hatemonger", WikiUrl = "https://wiki.guildwars.com/wiki/Gorgaan_Hatemonger" }; - public static readonly Npc PlagueDevourer = new() { Ids = new int[] { 2431 }, Name = "Plague Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Plague_Devourer" }; - public static readonly Npc FlintTouchstone = new() { Ids = new int[] { 2404 }, Name = "Flint Touchstone", WikiUrl = "https://wiki.guildwars.com/wiki/Flint_Touchstone" }; - public static readonly Npc Grawl = new() { Ids = new int[] { 2458 }, Name = "Grawl", WikiUrl = "https://wiki.guildwars.com/wiki/Grawl" }; - public static readonly Npc GrawlUlodyte = new() { Ids = new int[] { 2457 }, Name = "Grawl Ulodyte", WikiUrl = "https://wiki.guildwars.com/wiki/Grawl_Ulodyte" }; - public static readonly Npc Renegade = new() { Ids = new int[] { 2437 }, Name = "Renegade", WikiUrl = "https://wiki.guildwars.com/wiki/Renegade" }; - public static readonly Npc RenegadeElementalist = new() { Ids = new int[] { 2436 }, Name = "Renegade Elementalist", WikiUrl = "https://wiki.guildwars.com/wiki/Renegade_Elementalist" }; - public static readonly Npc CrimsonDevourer = new() { Ids = new int[] { 2434 }, Name = "Crimson Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Devourer" }; - public static readonly Npc LarrkEtherburn = new() { Ids = new int[] { 2375 }, Name = "Larrk Etherburn", WikiUrl = "https://wiki.guildwars.com/wiki/Larrk_Etherburn" }; - public static readonly Npc AscalonianMage = new() { Ids = new int[] { 1942 }, Name = "Ascalonian Mage", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; - public static readonly Npc PriestessRashena = new() { Ids = new int[] { 2067 }, Name = "Priestess Rashena", WikiUrl = "https://wiki.guildwars.com/wiki/Priestess_Rashenna" }; - public static readonly Npc IgnisPhanaura = new() { Ids = new int[] { 2406 }, Name = "Ignis Phanaura", WikiUrl = "https://wiki.guildwars.com/wiki/Ignis_Phanaura" }; - public static readonly Npc AscalonStriker = new() { Ids = new int[] { 2051 }, Name = "Ascalon Striker", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalon_Striker" }; - public static readonly Npc RynCursewing = new() { Ids = new int[] { 1681 }, Name = "Ryn Cursewing", WikiUrl = "https://wiki.guildwars.com/wiki/Ryn_Cursewing" }; - public static readonly Npc BouladthePerverse = new() { Ids = new int[] { 2721 }, Name = "Boulad the Perverse", WikiUrl = "https://wiki.guildwars.com/wiki/Boulad_the_Perverse" }; - public static readonly Npc SkeletonSorcerer = new() { Ids = new int[] { 2737 }, Name = "Skeleton Sorcerer", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Sorcerer" }; - public static readonly Npc ZombieWarlock = new() { Ids = new int[] { 2743 }, Name = "Zombie Warlock", WikiUrl = "https://wiki.guildwars.com/wiki/Zombie_Warlock" }; - public static readonly Npc SkeletonMonk = new() { Ids = new int[] { 2738 }, Name = "Skeleton Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Monk" }; - public static readonly Npc SkeletonMesmer = new() { Ids = new int[] { 2736 }, Name = "Skeleton Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Mesmer" }; - public static readonly Npc Snakebite = new() { Ids = new int[] { 8055 }, Name = "Snakebite", WikiUrl = "https://wiki.guildwars.com/wiki/Snakebite" }; - public static readonly Npc GrimPeacekeeper = new() { Ids = new int[] { 8107 }, Name = "Grim Peacekeeper", WikiUrl = "https://wiki.guildwars.com/wiki/Grim_Peacekeeper" }; - public static readonly Npc PeacekeeperSibyl = new() { Ids = new int[] { 8148 }, Name = "Peacekeeper Sibyl", WikiUrl = "https://wiki.guildwars.com/wiki/Peacekeeper_Sibyl" }; - public static readonly Npc AncientOakheart = new() { Ids = new int[] { 1734 }, Name = "Ancient Oakheart", WikiUrl = "https://wiki.guildwars.com/wiki/Ancient_Oakheart" }; - public static readonly Npc ReedStalker = new() { Ids = new int[] { 1730 }, Name = "Reed Stalker", WikiUrl = "https://wiki.guildwars.com/wiki/Reed_Stalker" }; - public static readonly Npc SpinedAloe = new() { Ids = new int[] { 1731 }, Name = "Spined Aloe", WikiUrl = "https://wiki.guildwars.com/wiki/Spined_Aloe" }; - public static readonly Npc SilentPeacekeeper = new() { Ids = new int[] { 8098 }, Name = "Silent Peacekeeper", WikiUrl = "https://wiki.guildwars.com/wiki/Silent_Peacekeeper" }; - public static readonly Npc SkeletonBowmaster = new() { Ids = new int[] { 2740 }, Name = "Skeleton Bowmaster", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Bowmaster" }; - public static readonly Npc BogSkaleBlighter = new() { Ids = new int[] { 1736 }, Name = "Bog Skale Blighter", WikiUrl = "https://wiki.guildwars.com/wiki/Bog_Skale_Blighter" }; - public static readonly Npc AbbotRamoth = new() { Ids = new int[] { 2212 }, Name = "Abbot Ramoth", WikiUrl = "https://wiki.guildwars.com/wiki/Abbot_Ramoth" }; - public static readonly Npc WinglordCaromi = new() { Ids = new int[] { 1703 }, Name = "Winglord Caromi", WikiUrl = "https://wiki.guildwars.com/wiki/Winglord_Caromi" }; - public static readonly Npc CaromiTenguElite = new() { Ids = new int[] { 1745 }, Name = "Caromi Tengu Elite", WikiUrl = "https://wiki.guildwars.com/wiki/Caromi_Tengu_Elite" }; - public static readonly Npc PeacekeeperEnforcer = new() { Ids = new int[] { 8119, 8127 }, Name = "Peacekeeper Enforcer", WikiUrl = "https://wiki.guildwars.com/wiki/Peacekeeper_Enforcer" }; - public static readonly Npc ForestMinotaur = new() { Ids = new int[] { 1728 }, Name = "Forest Minotaur", WikiUrl = "https://wiki.guildwars.com/wiki/Forest_Minotaur" }; - public static readonly Npc KrytanCollector = new() { Ids = new int[] { 1486 }, Name = "Krytan Collector", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; - public static readonly Npc FogNightmare = new() { Ids = new int[] { 1729 }, Name = "Fog Nightmare", WikiUrl = "https://wiki.guildwars.com/wiki/Fog_Nightmare" }; - public static readonly Npc PeacekeeperHuntsman = new() { Ids = new int[] { 8146 }, Name = "Peacekeeper Huntsman", WikiUrl = "https://wiki.guildwars.com/wiki/Peacekeeper_Huntsman" }; - public static readonly Npc FenTroll = new() { Ids = new int[] { 1748 }, Name = "Fen Troll", WikiUrl = "https://wiki.guildwars.com/wiki/Fen_Troll" }; - public static readonly Npc Bandit = new() { Ids = new int[] { 1720 }, Name = "Bandit", WikiUrl = "https://wiki.guildwars.com/wiki/Bandit" }; - public static readonly Npc Galrath = new() { Ids = new int[] { 2191 }, Name = "Galrath", WikiUrl = "https://wiki.guildwars.com/wiki/Galrath" }; - public static readonly Npc ApprenticeofVerata = new() { Ids = new int[] { 1717 }, Name = "Apprentice of Verata", WikiUrl = "https://wiki.guildwars.com/wiki/Apprentice_of_Verata" }; - public static readonly Npc ShepherdofVerata = new() { Ids = new int[] { 1718 }, Name = "Shepherd of Verata", WikiUrl = "https://wiki.guildwars.com/wiki/Shepherd_of_Verata" }; - public static readonly Npc EyesofVerata = new() { Ids = new int[] { 1719 }, Name = "Eyes of Verata", WikiUrl = "https://wiki.guildwars.com/wiki/Eyes_of_Verata" }; - public static readonly Npc SageofVerata = new() { Ids = new int[] { 1716 }, Name = "Sage of Verata", WikiUrl = "https://wiki.guildwars.com/wiki/Sage_of_Verata" }; - public static readonly Npc DamnedCleric = new() { Ids = new int[] { 2745 }, Name = "Damned Cleric", WikiUrl = "https://wiki.guildwars.com/wiki/Damned_Cleric" }; - public static readonly Npc Wraith = new() { Ids = new int[] { 2734 }, Name = "Wraith", WikiUrl = "https://wiki.guildwars.com/wiki/Wraith" }; - public static readonly Npc RottingDragon = new() { Ids = new int[] { 2838 }, Name = "Rotting Dragon", WikiUrl = "https://wiki.guildwars.com/wiki/Rotting_Dragon" }; - public static readonly Npc Rotscale = new() { Ids = new int[] { 2837 }, Name = "Rotscale", WikiUrl = "https://wiki.guildwars.com/wiki/Rotscale" }; - public static readonly Npc NecridHorseman = new() { Ids = new int[] { 2744 }, Name = "Necrid Horseman", WikiUrl = "https://wiki.guildwars.com/wiki/Necrid_Horseman" }; - public static readonly Npc FrynRageflame = new() { Ids = new int[] { 2277 }, Name = "Fryn Rageflame", WikiUrl = "https://wiki.guildwars.com/wiki/Fryn_Rageflame" }; - public static readonly Npc ArkhelHavenwood = new() { Ids = new int[] { 2510 }, Name = "Arkhel Havenwood", WikiUrl = "https://wiki.guildwars.com/wiki/Arkhel_Havenwood" }; - public static readonly Npc EdibboKepkep = new() { Ids = new int[] { 2521 }, Name = "Edibbo Kepkep", WikiUrl = "https://wiki.guildwars.com/wiki/Edibbo_Kepkep" }; - public static readonly Npc HailBlackice = new() { Ids = new int[] { 2506 }, Name = "Hail Blackice", WikiUrl = "https://wiki.guildwars.com/wiki/Hail_Blackice" }; - public static readonly Npc RuneEthercrash = new() { Ids = new int[] { 2505 }, Name = "Rune Ethercrash", WikiUrl = "https://wiki.guildwars.com/wiki/Rune_Ethercrash" }; - public static readonly Npc DarkTitan = new() { Ids = new int[] { 2683 }, Name = " Dark Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Dark_Titan" }; - public static readonly Npc TitansHeart = new() { Ids = new int[] { 2681 }, Name = "Titan's Heart", WikiUrl = "https://wiki.guildwars.com/wiki/Titan%27s_Heart" }; - public static readonly Npc TitansMalice = new() { Ids = new int[] { 2680 }, Name = "Titan's Malice", WikiUrl = "https://wiki.guildwars.com/wiki/Titan%27s_Malice" }; - public static readonly Npc IcyBrute = new() { Ids = new int[] { 2682 }, Name = "Icy Brute", WikiUrl = "https://wiki.guildwars.com/wiki/Icy_Brute" }; - public static readonly Npc RykArrowwing = new() { Ids = new int[] { 2519 }, Name = "Ryk Arrowwing", WikiUrl = "https://wiki.guildwars.com/wiki/Ryk_Arrowwing" }; - public static readonly Npc SyrHonorcrest = new() { Ids = new int[] { 2518 }, Name = "Syr Honorcrest", WikiUrl = "https://wiki.guildwars.com/wiki/Syr_Honorcrest" }; - public static readonly Npc FrostTitan = new() { Ids = new int[] { 2684 }, Name = "Frost Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Frost_Titan" }; - public static readonly Npc EvirsoSectus = new() { Ids = new int[] { 2664 }, Name = "Evirso Sectus", WikiUrl = "https://wiki.guildwars.com/wiki/Evirso_Sectus" }; + public static readonly Npc Unknown = new() { Ids = [0], Name = "Unknown" }; + public static readonly Npc RitualPriest = new() { Ids = [94, 2831], Name = "Ritual Priest" }; + public static readonly Npc CanthanGuard = new() { Ids = [107, 188, 3064, 3096, 3228, 3234, 3235, 3237], Name = "Canthan Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Guard" }; + public static readonly Npc ZaishenRepresentative = new() { Ids = [111], Name = "Zaishen Representative", WikiUrl = "https://wiki.guildwars.com/wiki/Zaishen_Representative" }; + public static readonly Npc CanthanAmbassador = new() { Ids = [216], Name = "Canthan Ambassador", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Ambassador" }; + public static readonly Npc PriestOfBalthazar = new() { Ids = [218], Name = "Priest Of Balthazar", WikiUrl = "https://wiki.guildwars.com/wiki/Priest_of_Balthazar" }; + public static readonly Npc Tolkano = new() { Ids = [219], Name = "Tolkano", WikiUrl = "https://wiki.guildwars.com/wiki/Tolkano" }; + public static readonly Npc XunlaiAgent = new() { Ids = [220, 221, 3287], Name = "Xunlai Agent", WikiUrl = "https://wiki.guildwars.com/wiki/Xunlai_Agent" }; + public static readonly Npc VabbianCommoner = new() { Ids = [224, 5659, 5662, 5661, 5653, 5656, 5657], Name = "Vabbian Commoner", WikiUrl = "https://wiki.guildwars.com/wiki/Vabbian_Commoner" }; + public static readonly Npc VabbianArtisan = new() { Ids = [1202], Name = "Vabbian Artisan", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Vabbians" }; + public static readonly Npc AbaddonsCursed = new() { Ids = [1338], Name = "Abaddon's Cursed", WikiUrl = "https://wiki.guildwars.com/wiki/Abaddon%27s_Cursed" }; + public static readonly Npc Lynx = new() { Ids = [1342, 8029], Name = "Lynx", WikiUrl = "https://wiki.guildwars.com/wiki/Lynx" }; + public static readonly Npc Strider = new() { Ids = [1343], Name = "Strider", WikiUrl = "https://wiki.guildwars.com/wiki/Strider" }; + public static readonly Npc MelandrusStalker = new() { Ids = [1345], Name = "Melandru's Stalker", WikiUrl = "https://wiki.guildwars.com/wiki/Melandru%27s_Stalker" }; + public static readonly Npc Wolf = new() { Ids = [1346], Name = "Wolf", WikiUrl = "https://wiki.guildwars.com/wiki/Wolf" }; + public static readonly Npc Warthog = new() { Ids = [1347, 1348], Name = "Warthog", WikiUrl = "https://wiki.guildwars.com/wiki/Warthog" }; + public static readonly Npc BlackBear = new() { Ids = [1349, 1352], Name = "Black Bear", WikiUrl = "https://wiki.guildwars.com/wiki/Black_Bear" }; + public static readonly Npc DuneLizard = new() { Ids = [1351], Name = "Dune Lizard", WikiUrl = "https://wiki.guildwars.com/wiki/Dune_Lizard" }; + public static readonly Npc MossSpider = new() { Ids = [1354, 2316], Name = "Moss Spider", WikiUrl = "https://wiki.guildwars.com/wiki/Moss_Spider" }; + public static readonly Npc MoaBird = new() { Ids = [1393, 1344], Name = "Moa Bird", WikiUrl = "https://wiki.guildwars.com/wiki/Moa_Bird" }; + public static readonly Npc PrizeWinningHog = new() { Ids = [1399], Name = "Prize-Winning Hog", WikiUrl = "https://wiki.guildwars.com/wiki/Prize-Winning_Hog" }; + public static readonly Npc GiantNeedleSpider = new() { Ids = [1401], Name = "Giant Needle Spider", WikiUrl = "https://wiki.guildwars.com/wiki/Giant_Needle_Spider" }; + public static readonly Npc DeadlyCryptSpider = new() { Ids = [1402], Name = "Deadly Crypt Spider", WikiUrl = "https://wiki.guildwars.com/wiki/Deadly_Crypt_Spider" }; + public static readonly Npc GiantTreeSpider = new() { Ids = [1403], Name = "Giant Tree Spider", WikiUrl = "https://wiki.guildwars.com/wiki/Giant_Tree_Spider" }; + public static readonly Npc CarrionDevourer = new() { Ids = [1405], Name = "Carrion Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Carrion_Devourer" }; + public static readonly Npc SnappingDevourer = new() { Ids = [1406], Name = "Snapping Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Snapping_Devourer" }; + public static readonly Npc DiseasedDevourer = new() { Ids = [1408], Name = "Diseased Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Diseased_Devourer" }; + public static readonly Npc LashDevourer = new() { Ids = [1409], Name = "Lash Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Lash_Devourer" }; + public static readonly Npc IceElemental = new() { Ids = [1412], Name = "Ice Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Ice_Elemental" }; + public static readonly Npc StoneElemental = new() { Ids = [1414], Name = "Stone Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Elemental" }; + public static readonly Npc HulkingStoneElemental = new() { Ids = [1415], Name = "Hulking Stone Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Hulking_Stone_Elemental" }; + public static readonly Npc Gargoyle = new() { Ids = [1417], Name = "Gargoyle", WikiUrl = "https://wiki.guildwars.com/wiki/Gargoyle" }; + public static readonly Npc ShatterGargoyle = new() { Ids = [1418, 2445], Name = "Shatter Gargoyle", WikiUrl = "https://wiki.guildwars.com/wiki/Shatter_Gargoyle" }; + public static readonly Npc BanditFirestarter = new() { Ids = [1420], Name = "Bandit Firestarter", WikiUrl = "https://wiki.guildwars.com/wiki/Bandit_Firestarter" }; + public static readonly Npc BanditRaider = new() { Ids = [1421], Name = "Bandit Raider", WikiUrl = "https://wiki.guildwars.com/wiki/Bandit_Raider" }; + public static readonly Npc BanditBloodSworn = new() { Ids = [1422], Name = "Bandit Blood Sworn", WikiUrl = "https://wiki.guildwars.com/wiki/Bandit_Blood_Sworn" }; + public static readonly Npc NightmareNecromancer = new() { Ids = [1424], Name = "Nightmare Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Nightmare" }; + public static readonly Npc AloeHusk = new() { Ids = [1426], Name = "Aloe Husk", WikiUrl = "https://wiki.guildwars.com/wiki/Aloe_Husk" }; + public static readonly Npc LargeAloeSeed = new() { Ids = [1427], Name = "Large Aloe Seed", WikiUrl = "https://wiki.guildwars.com/wiki/Large_Aloe_Seed" }; + public static readonly Npc AloeSeed = new() { Ids = [1428], Name = "Aloe Seed", WikiUrl = "https://wiki.guildwars.com/wiki/Aloe_Seed" }; + public static readonly Npc Oakheart = new() { Ids = [1429, 1733], Name = "Oakheart", WikiUrl = "https://wiki.guildwars.com/wiki/Oakheart" }; + public static readonly Npc RiverSkale = new() { Ids = [1430], Name = "River Skale", WikiUrl = "https://wiki.guildwars.com/wiki/River_Skale" }; + public static readonly Npc SkaleBroodcaller = new() { Ids = [1431], Name = "Skale Broodcaller", WikiUrl = "https://wiki.guildwars.com/wiki/Skale_Broodcaller" }; + public static readonly Npc RiverSkaleTad = new() { Ids = [1432], Name = "River Skale Tad", WikiUrl = "https://wiki.guildwars.com/wiki/River_Skale_Tad" }; + public static readonly Npc GrawlInvader = new() { Ids = [1436], Name = "Grawl Invader", WikiUrl = "https://wiki.guildwars.com/wiki/Grawl_Invader" }; + public static readonly Npc GrawlLongspear = new() { Ids = [1437], Name = "Grawl Longspear", WikiUrl = "https://wiki.guildwars.com/wiki/Grawl_Longspear" }; + public static readonly Npc GrawlShaman = new() { Ids = [1438], Name = "Grawl Shaman", WikiUrl = "https://wiki.guildwars.com/wiki/Grawl_Shaman" }; + public static readonly Npc RedEyeTheUnholy = new() { Ids = [1448], Name = "Red Eye The Unholy", WikiUrl = "https://wiki.guildwars.com/wiki/Red_Eye_the_Unholy" }; + public static readonly Npc JawSmokeskin = new() { Ids = [1449], Name = "Jaw Smokeskin", WikiUrl = "https://wiki.guildwars.com/wiki/Jaw_Smokeskin" }; + public static readonly Npc BlazeBloodbane = new() { Ids = [1450], Name = "Blaze Bloodbane", WikiUrl = "https://wiki.guildwars.com/wiki/Blaze_Bloodbane" }; + public static readonly Npc Haversdan = new() { Ids = [1455], Name = "Haversdan", WikiUrl = "https://wiki.guildwars.com/wiki/Haversdan" }; + public static readonly Npc WarmasterTydus = new() { Ids = [1456, 2856, 2097], Name = "Warmaster Tydus", WikiUrl = "https://wiki.guildwars.com/wiki/Warmaster_Tydus" }; + public static readonly Npc AscalonNoble = new() { Ids = [1461, 2083], Name = "Ascalon Noble", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; + public static readonly Npc AscalonianGuard = new() { Ids = [1464, 2091], Name = "Ascalonian Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalonian_Guard" }; + public static readonly Npc AscalonMesmer = new() { Ids = [1466, 1644], Name = "Ascalon Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; + public static readonly Npc AscalonMerchant = new() { Ids = [1467, 1480, 2090], Name = "Ascalon Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; + public static readonly Npc AscalonCrafter = new() { Ids = [1468], Name = "Ascalon Crafter", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; + public static readonly Npc AscalonNecromancer = new() { Ids = [1469, 1470], Name = "Ascalon Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; + public static readonly Npc RalenaStormbringer = new() { Ids = [1471], Name = "Ralena Stormbringer", WikiUrl = "https://wiki.guildwars.com/wiki/Ralena_Stormbringer" }; + public static readonly Npc AscalonMonk = new() { Ids = [1474], Name = "Ascalon Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; + public static readonly Npc AscalonBrawler = new() { Ids = [1475], Name = "Ascalon Brawler", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; + public static readonly Npc AscalonGuard = new() { Ids = [1477, 7758], Name = "Ascalon Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalon_Guard" }; + public static readonly Npc AscalonianFarmer = new() { Ids = [1479, 2070], Name = "Ascalonian Farmer", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalonian_Farmer" }; + public static readonly Npc AscalonTamer = new() { Ids = [1482], Name = "Ascalon Tamer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; + public static readonly Npc AcademyMonk = new() { Ids = [1483, 1484, 6028], Name = "Academy Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Academy_Monk" }; + public static readonly Npc AscalonianTownsfolk = new() { Ids = [1485, 1487], Name = "Ascalonian Townsfolk", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalonian_Townsfolk" }; + public static readonly Npc AscalonianPeasant = new() { Ids = [1488, 1490], Name = "Ascalonian Peasant", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalonian_Peasant" }; + public static readonly Npc Krytan = new() { Ids = [1492, 1960, 1964, 1966, 1967, 1991, 2008, 2009, 2020, 2032, 2049, 2120, 2858, 2867, 2869, 2095], Name = "Krytan", WikiUrl = "https://wiki.guildwars.com/wiki/Krytan" }; + public static readonly Npc Gwen = new() { Ids = [1493, 1494, 5966, 5970], Name = "Gwen", WikiUrl = "https://wiki.guildwars.com/wiki/Gwen" }; + public static readonly Npc FarrahCappo = new() { Ids = [1497, 2863, 2138], Name = "Farrah Cappo", WikiUrl = "https://wiki.guildwars.com/wiki/Farrah_Cappo" }; + public static readonly Npc Cynn = new() { Ids = [1501, 1924, 2128, 2853, 3489, 4565, 4575, 5988, 4585], Name = "Cynn", WikiUrl = "https://wiki.guildwars.com/wiki/Cynn" }; + public static readonly Npc Devona = new() { Ids = [1502, 1932, 2132, 2854, 3492, 3509, 4569, 4579, 5993, 4589], Name = "Devona", WikiUrl = "https://wiki.guildwars.com/wiki/Devona" }; + public static readonly Npc AscalonDuke = new() { Ids = [1504, 1511], Name = "Ascalon Duke", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; + public static readonly Npc PrinceRurik = new() { Ids = [1505], Name = "Prince Rurik", WikiUrl = "https://wiki.guildwars.com/wiki/Prince_Rurik" }; + public static readonly Npc LadyAlthea = new() { Ids = [1507], Name = "Lady Althea", WikiUrl = "https://wiki.guildwars.com/wiki/Lady_Althea" }; + public static readonly Npc NecromancerMunne = new() { Ids = [1508], Name = "Necromancer Munne", WikiUrl = "https://wiki.guildwars.com/wiki/Necromancer_Munne" }; + public static readonly Npc ElementalistAziure = new() { Ids = [1509], Name = "Elementalist Aziure", WikiUrl = "https://wiki.guildwars.com/wiki/Elementalist_Aziure" }; + public static readonly Npc AscalonRanger = new() { Ids = [1512, 1513, 1481], Name = "Ascalon Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalon_Ranger" }; + public static readonly Npc Skullreaver = new() { Ids = [1514], Name = "Skullreaver", WikiUrl = "https://wiki.guildwars.com/wiki/Skullreaver" }; + public static readonly Npc RestlessCorpse = new() { Ids = [1515], Name = "Restless Corpse", WikiUrl = "https://wiki.guildwars.com/wiki/Restless_Corpse" }; + public static readonly Npc RagingCadaver = new() { Ids = [1517], Name = "Raging Cadaver", WikiUrl = "https://wiki.guildwars.com/wiki/Raging_Cadaver" }; + public static readonly Npc Ventari = new() { Ids = [1519], Name = "Ventari", WikiUrl = "https://wiki.guildwars.com/wiki/Ventari" }; + public static readonly Npc ShiningBladeScout = new() { Ids = [1520], Name = "Shining Blade Scout", WikiUrl = "https://wiki.guildwars.com/wiki/Shining_Blade_Scout" }; + public static readonly Npc Evennia = new() { Ids = [1521, 1530, 2841], Name = "Evennia", WikiUrl = "https://wiki.guildwars.com/wiki/Evennia" }; + public static readonly Npc Saidra = new() { Ids = [1528], Name = "Saidra", WikiUrl = "https://wiki.guildwars.com/wiki/Saidra" }; + public static readonly Npc ShiningBladeMesmer = new() { Ids = [1532], Name = "Shining Blade Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Shining_Blade_Mesmer" }; + public static readonly Npc ShiningBladeNecromancer = new() { Ids = [1533], Name = "Shining Blade Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Shining_Blade_Necromancer" }; + public static readonly Npc ShiningBladeElementalist = new() { Ids = [1534], Name = "Shining Blade Elementalist", WikiUrl = "https://wiki.guildwars.com/wiki/Shining_Blade_Elementalist" }; + public static readonly Npc GarethQuickblade = new() { Ids = [1536], Name = "Gareth Quickblade", WikiUrl = "https://wiki.guildwars.com/wiki/Gareth_Quickblade" }; + public static readonly Npc ShiningBladeWarrior = new() { Ids = [1538, 1996, 2039], Name = "Shining Blade Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Shining_Blade_Warrior" }; + public static readonly Npc AlariDoubleblade = new() { Ids = [1539], Name = "Alari Doubleblade", WikiUrl = "https://wiki.guildwars.com/wiki/Alari_Doubleblade" }; + public static readonly Npc ShiningBladeRanger = new() { Ids = [1541, 2045], Name = "Shining Blade Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Shining_Blade_Ranger" }; + public static readonly Npc DwarvenSmith = new() { Ids = [1548], Name = "Dwarven Smith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Dwarves" }; + public static readonly Npc DeldrimorCaster = new() { Ids = [1550, 1552, 6214, 2109], Name = "Deldrimor Caster" }; + public static readonly Npc DeldrimorWarrior = new() { Ids = [1553, 1555, 1556, 2840, 6180, 6215, 6216], Name = "Deldrimor Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Dwarves" }; + public static readonly Npc DwarvenSoldier = new() { Ids = [1554, 1569], Name = "Dwarven Soldier", WikiUrl = "https://wiki.guildwars.com/wiki/Dwarven_Soldier" }; + public static readonly Npc DeldrimorRanger = new() { Ids = [1557, 1558, 6271], Name = "Deldrimor Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Dwarves" }; + public static readonly Npc KingJalisIronhammer = new() { Ids = [1562, 2839], Name = "King Jalis Ironhammer", WikiUrl = "https://wiki.guildwars.com/wiki/King_Jalis_Ironhammer" }; + public static readonly Npc BrechnarIronhammer = new() { Ids = [1564], Name = "Brechnar Ironhammer", WikiUrl = "https://wiki.guildwars.com/wiki/Brechnar_Ironhammer" }; + public static readonly Npc DwarvenSage = new() { Ids = [1565], Name = "Dwarven Sage", WikiUrl = "https://wiki.guildwars.com/wiki/Dwarven_Sage" }; + public static readonly Npc DwarvenScout = new() { Ids = [1567], Name = "Dwarven Scout", WikiUrl = "https://wiki.guildwars.com/wiki/Dwarven_Scout" }; + public static readonly Npc CharrChaot = new() { Ids = [1635], Name = "Charr Chaot", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Chaot" }; + public static readonly Npc CharrAshenClaw = new() { Ids = [1638], Name = "Charr Ashen Claw", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Ashen_Claw" }; + public static readonly Npc CharrShaman = new() { Ids = [1646, 5711, 4972], Name = "Charr Shaman", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Shaman" }; + public static readonly Npc CharrAxeFiend = new() { Ids = [1651, 7802], Name = "Charr Axe Fiend", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Axe_Fiend" }; + public static readonly Npc CharrBladeStorm = new() { Ids = [1653], Name = "Charr Blade Storm", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Blade_Storm" }; + public static readonly Npc CharrHunter = new() { Ids = [1656], Name = "Charr Hunter", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Hunter" }; + public static readonly Npc SquawNimblecrest = new() { Ids = [1685], Name = "Squaw Nimblecrest", WikiUrl = "https://wiki.guildwars.com/wiki/Squaw_Nimblecrest" }; + public static readonly Npc GypsieEttin = new() { Ids = [1715], Name = "Gypsie Ettin", WikiUrl = "https://wiki.guildwars.com/wiki/Gypsie_Ettin" }; + public static readonly Npc HillGiant = new() { Ids = [1724], Name = "Hill Giant", WikiUrl = "https://wiki.guildwars.com/wiki/Hill_Giant" }; + public static readonly Npc InfernoImp = new() { Ids = [1725], Name = "Inferno Imp", WikiUrl = "https://wiki.guildwars.com/wiki/Inferno_Imp" }; + public static readonly Npc FireImp = new() { Ids = [1726], Name = "Fire Imp", WikiUrl = "https://wiki.guildwars.com/wiki/Fire_Imp" }; + public static readonly Npc BogSkale = new() { Ids = [1737], Name = "Bog Skale", WikiUrl = "https://wiki.guildwars.com/wiki/Bog_Skale" }; + public static readonly Npc CaromiTenguWild = new() { Ids = [1739], Name = "Caromi Tengu Wild", WikiUrl = "https://wiki.guildwars.com/wiki/Caromi_Tengu_Wild" }; + public static readonly Npc CaromiTenguBrave = new() { Ids = [1741, 1744], Name = "Caromi Tengu Brave", WikiUrl = "https://wiki.guildwars.com/wiki/Caromi_Tengu_Brave" }; + public static readonly Npc CaromiTenguScout = new() { Ids = [1746], Name = "Caromi Tengu Scout", WikiUrl = "https://wiki.guildwars.com/wiki/Caromi_Tengu_Scout" }; + public static readonly Npc TrechSchmoogle = new() { Ids = [1754], Name = "Trech Schmoogle", WikiUrl = "https://wiki.guildwars.com/wiki/Trech_Schmoogle" }; + public static readonly Npc CootleSizzlehorn = new() { Ids = [1756], Name = "Cootle Sizzlehorn", WikiUrl = "https://wiki.guildwars.com/wiki/Cootle_Sizzlehorn" }; + public static readonly Npc MinaBrillianthaunch = new() { Ids = [1770], Name = "Mina Brillianthaunch", WikiUrl = "https://wiki.guildwars.com/wiki/Mina_Brillianthaunch" }; + public static readonly Npc AguoGruffmane = new() { Ids = [1771], Name = "Aguo Gruffmane", WikiUrl = "https://wiki.guildwars.com/wiki/Aguo_Gruffmane" }; + public static readonly Npc ShegZamnMada = new() { Ids = [1775], Name = "Sheg Zamn Mada", WikiUrl = "https://wiki.guildwars.com/wiki/Sheg_Zamn_Mada" }; + public static readonly Npc VisionOfGlint = new() { Ids = [1779], Name = "Vision Of Glint", WikiUrl = "https://wiki.guildwars.com/wiki/Vision_of_Glint" }; + public static readonly Npc GhostlyHero = new() { Ids = [1781, 1782], Name = "Ghostly Hero", WikiUrl = "https://wiki.guildwars.com/wiki/Ghostly_Hero" }; + public static readonly Npc StormKin = new() { Ids = [1785], Name = "Storm Kin", WikiUrl = "https://wiki.guildwars.com/wiki/Storm_Kin" }; + public static readonly Npc DuneBurrower = new() { Ids = [1786], Name = "Dune Burrower", WikiUrl = "https://wiki.guildwars.com/wiki/Dune_Burrower" }; + public static readonly Npc LosaruWindcaster = new() { Ids = [1787], Name = "Losaru Windcaster", WikiUrl = "https://wiki.guildwars.com/wiki/Losaru_Windcaster" }; + public static readonly Npc LosaruLifeband = new() { Ids = [1788], Name = "Losaru Lifeband", WikiUrl = "https://wiki.guildwars.com/wiki/Losaru_Lifeband" }; + public static readonly Npc LosaruBladehand = new() { Ids = [1789], Name = "Losaru Bladehand", WikiUrl = "https://wiki.guildwars.com/wiki/Losaru_Bladehand" }; + public static readonly Npc LosaruBowmaster = new() { Ids = [1790], Name = "Losaru Bowmaster", WikiUrl = "https://wiki.guildwars.com/wiki/Losaru_Bowmaster" }; + public static readonly Npc SandElemental = new() { Ids = [1791], Name = "Sand Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Sand_Elemental" }; + public static readonly Npc RockshotDevourer = new() { Ids = [1792], Name = "Rockshot Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Rockshot_Devourer" }; + public static readonly Npc SandDrake = new() { Ids = [1793], Name = "Sand Drake", WikiUrl = "https://wiki.guildwars.com/wiki/Sand_Drake" }; + public static readonly Npc DesertGriffon = new() { Ids = [1794], Name = "Desert Griffon", WikiUrl = "https://wiki.guildwars.com/wiki/Desert_Griffon" }; + public static readonly Npc Hydra = new() { Ids = [1796, 2438], Name = "Hydra", WikiUrl = "https://wiki.guildwars.com/wiki/Hydra" }; + public static readonly Npc Minotaur = new() { Ids = [1797, 2493, 2486], Name = "Minotaur", WikiUrl = "https://wiki.guildwars.com/wiki/Minotaur" }; + public static readonly Npc JadeScarab = new() { Ids = [1799], Name = "Jade Scarab", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Scarab" }; + public static readonly Npc RockEaterScarab = new() { Ids = [1800], Name = "Rock-Eater Scarab", WikiUrl = "https://wiki.guildwars.com/wiki/Rock-Eater_Scarab" }; + public static readonly Npc SiegeWurm = new() { Ids = [1802], Name = "Siege Wurm", WikiUrl = "https://wiki.guildwars.com/wiki/Siege_Wurm" }; + public static readonly Npc SandGiant = new() { Ids = [1803], Name = "Sand Giant", WikiUrl = "https://wiki.guildwars.com/wiki/Sand_Giant" }; + public static readonly Npc MarrowScarab = new() { Ids = [1810], Name = "Marrow Scarab", WikiUrl = "https://wiki.guildwars.com/wiki/Marrow_Scarab" }; + public static readonly Npc ScarabNestBuilder = new() { Ids = [1811], Name = "Scarab Nest Builder", WikiUrl = "https://wiki.guildwars.com/wiki/Scarab_Nest_Builder" }; + public static readonly Npc AyassahHess = new() { Ids = [1835], Name = "Ayassah Hess", WikiUrl = "https://wiki.guildwars.com/wiki/Ayassah_Hess" }; + public static readonly Npc BysshaHisst = new() { Ids = [1836], Name = "Byssha Hisst", WikiUrl = "https://wiki.guildwars.com/wiki/Byssha_Hisst" }; + public static readonly Npc CyssGresshla = new() { Ids = [1837], Name = "Cyss Gresshla", WikiUrl = "https://wiki.guildwars.com/wiki/Cyss_Gresshla" }; + public static readonly Npc CustodianKora = new() { Ids = [1840], Name = "Custodian Kora", WikiUrl = "https://wiki.guildwars.com/wiki/Custodian_Kora" }; + public static readonly Npc GossAleessh = new() { Ids = [1841], Name = "Goss Aleessh", WikiUrl = "https://wiki.guildwars.com/wiki/Goss_Aleessh" }; + public static readonly Npc HessperSasso = new() { Ids = [1842], Name = "Hessper Sasso", WikiUrl = "https://wiki.guildwars.com/wiki/Hessper_Sasso" }; + public static readonly Npc IssahSshay = new() { Ids = [1843], Name = "Issah Sshay", WikiUrl = "https://wiki.guildwars.com/wiki/Issah_Sshay" }; + public static readonly Npc JossoEssher = new() { Ids = [1844], Name = "Josso Essher", WikiUrl = "https://wiki.guildwars.com/wiki/Josso_Essher" }; + public static readonly Npc CustodianHulgar = new() { Ids = [1845], Name = "Custodian Hulgar", WikiUrl = "https://wiki.guildwars.com/wiki/Custodian_Hulgar" }; + public static readonly Npc CustodianPhebus = new() { Ids = [1846], Name = "Custodian Phebus", WikiUrl = "https://wiki.guildwars.com/wiki/Custodian_Phebus" }; + public static readonly Npc FacetOfDarkness = new() { Ids = [1848], Name = "Facet Of Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/Facet_of_Darkness" }; + public static readonly Npc TissDanssir = new() { Ids = [1853], Name = "Tiss Danssir", WikiUrl = "https://wiki.guildwars.com/wiki/Tiss_Danssir" }; + public static readonly Npc UusshVisshta = new() { Ids = [1854], Name = "Uussh Visshta", WikiUrl = "https://wiki.guildwars.com/wiki/Uussh_Visshta" }; + public static readonly Npc VassaSsiss = new() { Ids = [1855], Name = "Vassa Ssiss", WikiUrl = "https://wiki.guildwars.com/wiki/Vassa_Ssiss" }; + public static readonly Npc WissperInssani = new() { Ids = [1856], Name = "Wissper Inssani", WikiUrl = "https://wiki.guildwars.com/wiki/Wissper_Inssani" }; + public static readonly Npc CustodianDellus = new() { Ids = [1857], Name = "Custodian Dellus", WikiUrl = "https://wiki.guildwars.com/wiki/Custodian_Dellus" }; + public static readonly Npc CustodianJenus = new() { Ids = [1858], Name = "Custodian Jenus", WikiUrl = "https://wiki.guildwars.com/wiki/Custodian_Jenus" }; + public static readonly Npc ForgottenCursebearer = new() { Ids = [1862], Name = "Forgotten Cursebearer", WikiUrl = "https://wiki.guildwars.com/wiki/Forgotten_Cursebearer" }; + public static readonly Npc ForgottenArcanist = new() { Ids = [1863], Name = "Forgotten Arcanist", WikiUrl = "https://wiki.guildwars.com/wiki/Forgotten_Arcanist" }; + public static readonly Npc ForgottenSage = new() { Ids = [1864], Name = "Forgotten Sage", WikiUrl = "https://wiki.guildwars.com/wiki/Forgotten_Sage" }; + public static readonly Npc EnchantedHammer = new() { Ids = [1865], Name = "Enchanted Hammer", WikiUrl = "https://wiki.guildwars.com/wiki/Enchanted_Hammer" }; + public static readonly Npc EnchantedSword = new() { Ids = [1866, 6869], Name = "Enchanted Sword", WikiUrl = "https://wiki.guildwars.com/wiki/Enchanted_Sword" }; + public static readonly Npc EnchantedBow = new() { Ids = [1867], Name = "Enchanted Bow", WikiUrl = "https://wiki.guildwars.com/wiki/Enchanted_Bow" }; + public static readonly Npc EnemyPriest = new() { Ids = [1871], Name = "Enemy Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Enemy_Priest" }; + public static readonly Npc ForgottenChampion = new() { Ids = [1872], Name = "Forgotten Champion", WikiUrl = "https://wiki.guildwars.com/wiki/Forgotten_Champion" }; + public static readonly Npc ForgottenAvenger = new() { Ids = [1873], Name = "Forgotten Avenger", WikiUrl = "https://wiki.guildwars.com/wiki/Forgotten_Avenger" }; + public static readonly Npc Forgotten = new() { Ids = [1874, 5002], Name = "Forgotten", WikiUrl = "https://wiki.guildwars.com/wiki/Forgotten" }; + public static readonly Npc Dunham = new() { Ids = [1890, 1897, 1904, 1911, 1919, 1920, 2847], Name = "Dunham", WikiUrl = "https://wiki.guildwars.com/wiki/Dunham" }; + public static readonly Npc Claude = new() { Ids = [1891, 1898, 1905, 1912, 1921, 2848], Name = "Claude", WikiUrl = "https://wiki.guildwars.com/wiki/Claude" }; + public static readonly Npc Orion = new() { Ids = [1892, 1899, 1906, 1913, 1923, 2849, 1885, 1879, 1875], Name = "Orion", WikiUrl = "https://wiki.guildwars.com/wiki/Orion" }; + public static readonly Npc Alesia = new() { Ids = [1893, 1900, 1907, 1914, 1925, 2850, 1886, 1880, 1876], Name = "Alesia", WikiUrl = "https://wiki.guildwars.com/wiki/Alesia" }; + public static readonly Npc LittleThom = new() { Ids = [1894, 1901, 1908, 1916, 1929, 1930, 2844], Name = "Little Thom", WikiUrl = "https://wiki.guildwars.com/wiki/Little_Thom" }; + public static readonly Npc Stefan = new() { Ids = [1895, 1902, 1909, 1917, 1931, 2845, 1888, 1881, 1877], Name = "Stefan", WikiUrl = "https://wiki.guildwars.com/wiki/Stefan" }; + public static readonly Npc Reyna = new() { Ids = [1896, 1903, 1910, 1918, 1933, 2846, 1889, 1882, 1878], Name = "Reyna", WikiUrl = "https://wiki.guildwars.com/wiki/Reyna" }; + public static readonly Npc Lina = new() { Ids = [1915, 1927, 1928, 2851, 5991], Name = "Lina", WikiUrl = "https://wiki.guildwars.com/wiki/Lina" }; + public static readonly Npc Eve = new() { Ids = [1922, 2873, 3488, 4564, 4574, 5987, 4584], Name = "Eve", WikiUrl = "https://wiki.guildwars.com/wiki/Eve" }; + public static readonly Npc Mhenlo = new() { Ids = [1926, 2136, 2855, 3121, 4577, 5990, 4587, 1503], Name = "Mhenlo", WikiUrl = "https://wiki.guildwars.com/wiki/Mhenlo" }; + public static readonly Npc Aidan = new() { Ids = [1934, 2124, 2852, 3493, 4570, 4580, 5994, 4590, 2123], Name = "Aidan", WikiUrl = "https://wiki.guildwars.com/wiki/Aidan" }; + public static readonly Npc Olias = new() { Ids = [1935, 1938], Name = "Olias", WikiUrl = "https://wiki.guildwars.com/wiki/Olias" }; + public static readonly Npc LyssasMuse = new() { Ids = [1944], Name = "Lyssa's Muse", WikiUrl = "https://wiki.guildwars.com/wiki/Lyssa%27s_Muse" }; + public static readonly Npc VoiceOfGrenth = new() { Ids = [1945], Name = "Voice Of Grenth", WikiUrl = "https://wiki.guildwars.com/wiki/Voice_of_Grenth" }; + public static readonly Npc AvatarOfDwayna = new() { Ids = [1946], Name = "Avatar Of Dwayna", WikiUrl = "https://wiki.guildwars.com/wiki/Avatar_of_Dwayna" }; + public static readonly Npc KrytanMerchant = new() { Ids = [1950, 1993, 1997, 2007, 2021, 2037, 2040, 2048], Name = "Krytan Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; + public static readonly Npc KrytanHerald = new() { Ids = [1958], Name = "Krytan Herald", WikiUrl = "https://wiki.guildwars.com/wiki/Krytan_Herald" }; + public static readonly Npc Lionguard = new() { Ids = [1961, 1969, 2868], Name = "Lionguard", WikiUrl = "https://wiki.guildwars.com/wiki/Lionguard" }; + public static readonly Npc WintunTheBlack = new() { Ids = [1964], Name = "Wintun The Black", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; + public static readonly Npc RestlessSpirit = new() { Ids = [1965], Name = "Restless Spirit", WikiUrl = "https://wiki.guildwars.com/wiki/Restless_Spirit" }; + public static readonly Npc AscalonianSettler = new() { Ids = [1986, 1987], Name = "Ascalonian Settler", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalonian_Settler" }; + public static readonly Npc AscalonSettler = new() { Ids = [1986, 1987], Name = "Ascalon Settler", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalon_Settler" }; + public static readonly Npc SettlementGuard = new() { Ids = [1989], Name = "Settlement Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Settlement_Guard" }; + public static readonly Npc CaptainGreywind = new() { Ids = [1990], Name = "Captain Greywind", WikiUrl = "https://wiki.guildwars.com/wiki/Captain_Greywind" }; + public static readonly Npc AscalonianGhost = new() { Ids = [1998, 2141, 2353, 2354, 2355, 2534, 5617, 4975], Name = "Ascalonian Ghost", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Ghosts" }; + public static readonly Npc KrytanSmith = new() { Ids = [2000], Name = "Krytan Smith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; + public static readonly Npc WhiteMantleZealot = new() { Ids = [2006, 2206, 2207], Name = "White Mantle Zealot", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Zealot" }; + public static readonly Npc CaptainGrumby = new() { Ids = [2016], Name = "Captain Grumby", WikiUrl = "https://wiki.guildwars.com/wiki/Captain_Grumby" }; + public static readonly Npc CapturedChosen = new() { Ids = [2034], Name = "Captured Chosen", WikiUrl = "https://wiki.guildwars.com/wiki/Captured_Chosen" }; + public static readonly Npc Ascalonian = new() { Ids = [2066, 2071, 2872], Name = "Ascalonian", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalonian" }; + public static readonly Npc AscalonianEngineer = new() { Ids = [2077], Name = "Ascalonian Engineer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; + public static readonly Npc DeldrimorMerchant = new() { Ids = [2111, 2140], Name = "Deldrimor Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Dwarves" }; + public static readonly Npc DwarvenWeaponsmith = new() { Ids = [2112], Name = "Dwarven Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Dwarves" }; + public static readonly Npc CanthanMerchant = new() { Ids = [2117, 2118, 2119, 2121, 3276, 3277, 3291], Name = "Canthan Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; + public static readonly Npc IrwynTheSevere = new() { Ids = [2168], Name = "Irwyn The Severe", WikiUrl = "https://wiki.guildwars.com/wiki/Irwyn_the_Severe" }; + public static readonly Npc SelwinTheFervent = new() { Ids = [2169], Name = "Selwin The Fervent", WikiUrl = "https://wiki.guildwars.com/wiki/Selwin_the_Fervent" }; + public static readonly Npc EdgarTheIronFist = new() { Ids = [2170], Name = "Edgar The Iron Fist", WikiUrl = "https://wiki.guildwars.com/wiki/Edgar_the_Iron_Fist" }; + public static readonly Npc InnerCouncilMemberArgyle = new() { Ids = [2171], Name = "Inner Council Member Argyle", WikiUrl = "https://wiki.guildwars.com/wiki/Inner_Council_Member_Argyle" }; + public static readonly Npc BraimaTheCallous = new() { Ids = [2173], Name = "Braima The Callous", WikiUrl = "https://wiki.guildwars.com/wiki/Braima_the_Callous" }; + public static readonly Npc CyrusTheUnflattering = new() { Ids = [2175], Name = "Cyrus The Unflattering", WikiUrl = "https://wiki.guildwars.com/wiki/Cyrus_the_Unflattering" }; + public static readonly Npc InnerCouncilMemberCuthbert = new() { Ids = [2177], Name = "Inner Council Member Cuthbert", WikiUrl = "https://wiki.guildwars.com/wiki/Inner_Council_Member_Cuthbert" }; + public static readonly Npc MantonTheIndulgent = new() { Ids = [2179], Name = "Manton The Indulgent", WikiUrl = "https://wiki.guildwars.com/wiki/Manton_the_Indulgent" }; + public static readonly Npc WhiteMantleWarriorBoss = new() { Ids = [2181], Name = "White Mantle Warrior Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; + public static readonly Npc CuthbertTheChaste = new() { Ids = [2182], Name = "Cuthbert The Chaste", WikiUrl = "https://wiki.guildwars.com/wiki/Cuthbert_the_Chaste" }; + public static readonly Npc PleohTheUgly = new() { Ids = [2185], Name = "Pleoh The Ugly", WikiUrl = "https://wiki.guildwars.com/wiki/Pleoh_the_Ugly" }; + public static readonly Npc JusticiarHablion = new() { Ids = [2187], Name = "Justiciar Hablion", WikiUrl = "https://wiki.guildwars.com/wiki/Justiciar_Hablion" }; + public static readonly Npc Markis = new() { Ids = [2189], Name = "Markis", WikiUrl = "https://wiki.guildwars.com/wiki/Markis" }; + public static readonly Npc ConfessorDorian = new() { Ids = [2190], Name = "Confessor Dorian", WikiUrl = "https://wiki.guildwars.com/wiki/Confessor_Dorian" }; + public static readonly Npc WhiteMantleSycophant = new() { Ids = [2197], Name = "White Mantle Sycophant", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Sycophant" }; + public static readonly Npc WhiteMantleRitualist = new() { Ids = [2198], Name = "White Mantle Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Ritualist" }; + public static readonly Npc WhiteMantleSavant = new() { Ids = [2199], Name = "White Mantle Savant", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Savant" }; + public static readonly Npc WhiteMantleAbbot = new() { Ids = [2200], Name = "White Mantle Abbot", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Abbot" }; + public static readonly Npc WhiteMantlePriest = new() { Ids = [2201], Name = "White Mantle Priest", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Priest" }; + public static readonly Npc WhiteMantleKnight = new() { Ids = [2202], Name = "White Mantle Knight", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Knight" }; + public static readonly Npc WhiteMantleJusticiar = new() { Ids = [2204, 2205], Name = "White Mantle Justiciar", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Justiciar" }; + public static readonly Npc WhiteMantleSeeker = new() { Ids = [2208, 2227], Name = "White Mantle Seeker", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Seeker" }; + public static readonly Npc WhiteMantleRanger = new() { Ids = [2209], Name = "White Mantle Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; + public static readonly Npc WhiteMantleElementalist = new() { Ids = [2219], Name = "White Mantle Elementalist", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; + public static readonly Npc JusticiarThommis = new() { Ids = [2223], Name = "Justiciar Thommis", WikiUrl = "https://wiki.guildwars.com/wiki/Justiciar_Thommis" }; + public static readonly Npc BoneHorror = new() { Ids = [2230], Name = "Bone Horror", WikiUrl = "https://wiki.guildwars.com/wiki/Bone_Horror" }; + public static readonly Npc BoneFiend = new() { Ids = [2231], Name = "Bone Fiend", WikiUrl = "https://wiki.guildwars.com/wiki/Bone_Fiend" }; + public static readonly Npc MursaatMesmerBoss = new() { Ids = [2235], Name = "Mursaat Mesmer Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Mursaat_Mesmer_(boss)" }; + public static readonly Npc MursaatNecromancerBoss = new() { Ids = [2236], Name = "Mursaat Necromancer Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Mursaat_Necromancer_(boss)" }; + public static readonly Npc MursaatElementalistBoss = new() { Ids = [2237], Name = "Mursaat Elementalist Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Mursaat_Elementalist_(boss)" }; + public static readonly Npc MursaatMonkBoss = new() { Ids = [2238], Name = "Mursaat Monk Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Mursaat_Monk_(boss)" }; + public static readonly Npc MursaatWarriorBoss = new() { Ids = [2239], Name = "Mursaat Warrior Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Armor_(boss)" }; + public static readonly Npc MursaatRangerBoss = new() { Ids = [2240], Name = "Mursaat Ranger Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Bow_(boss)" }; + public static readonly Npc MursaatMesmer = new() { Ids = [2241], Name = "Mursaat Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Mursaat_Mesmer" }; + public static readonly Npc MursaatNecromancer = new() { Ids = [2242], Name = "Mursaat Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Mursaat_Necromancer" }; + public static readonly Npc MursaatElementalist = new() { Ids = [2243], Name = "Mursaat Elementalist", WikiUrl = "https://wiki.guildwars.com/wiki/Mursaat_Elementalist" }; + public static readonly Npc MursaatMonk = new() { Ids = [2245], Name = "Mursaat Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Mursaat_Monk" }; + public static readonly Npc JadeArmor = new() { Ids = [2249], Name = "Jade Armor", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Armor" }; + public static readonly Npc JadeBow = new() { Ids = [2250], Name = "Jade Bow", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Bow" }; + public static readonly Npc EtherSeal = new() { Ids = [2251], Name = "Ether Seal", WikiUrl = "https://wiki.guildwars.com/wiki/Ether_Seal" }; + public static readonly Npc HeppBilespitter = new() { Ids = [2255], Name = "Hepp Bilespitter", WikiUrl = "https://wiki.guildwars.com/wiki/Hepp_Bilespitter" }; + public static readonly Npc MosskRottail = new() { Ids = [2256], Name = "Mossk Rottail", WikiUrl = "https://wiki.guildwars.com/wiki/Mossk_Rottail" }; + public static readonly Npc Thornwrath = new() { Ids = [2257], Name = "Thornwrath", WikiUrl = "https://wiki.guildwars.com/wiki/Thornwrath" }; + public static readonly Npc WindRiderBoss = new() { Ids = [2261], Name = "Wind Rider Boss", WikiUrl = "https://wiki.guildwars.com/wiki/List_of_rider_bosses" }; + public static readonly Npc GrechTrundle = new() { Ids = [2262], Name = "Grech Trundle", WikiUrl = "https://wiki.guildwars.com/wiki/Grech_Trundle" }; + public static readonly Npc WyddKindlerun = new() { Ids = [2263], Name = "Wydd Kindlerun", WikiUrl = "https://wiki.guildwars.com/wiki/Wydd_Kindlerun" }; + public static readonly Npc TreeOfVitality = new() { Ids = [2264], Name = "Tree Of Vitality", WikiUrl = "https://wiki.guildwars.com/wiki/Tree_of_Vitality" }; + public static readonly Npc KaraBloodtail = new() { Ids = [2268], Name = "Kara Bloodtail", WikiUrl = "https://wiki.guildwars.com/wiki/Kara_Bloodtail" }; + public static readonly Npc MaguumaElementalistBoss = new() { Ids = [2269], Name = "Maguuma Elementalist Boss", WikiUrl = "https://wiki.guildwars.com/wiki/List_of_centaur_bosses" }; + public static readonly Npc ThornStalkerMonkBoss = new() { Ids = [2273], Name = "Thorn Stalker Monk Boss", WikiUrl = "https://wiki.guildwars.com/wiki/List_of_centaur_bosses" }; + public static readonly Npc DrogoGreatmane = new() { Ids = [2285], Name = "Drogo Greatmane", WikiUrl = "https://wiki.guildwars.com/wiki/Drogo_Greatmane" }; + public static readonly Npc GaleStormsend = new() { Ids = [2287], Name = "Gale Stormsend", WikiUrl = "https://wiki.guildwars.com/wiki/Gale_Stormsend" }; + public static readonly Npc WindRider = new() { Ids = [2289, 2290, 6302], Name = "Wind Rider", WikiUrl = "https://wiki.guildwars.com/wiki/Wind_Rider" }; + public static readonly Npc RootBehemoth = new() { Ids = [2292], Name = "Root Behemoth", WikiUrl = "https://wiki.guildwars.com/wiki/Root_Behemoth" }; + public static readonly Npc MaguumaEnchanter = new() { Ids = [2294], Name = "Maguuma Enchanter", WikiUrl = "https://wiki.guildwars.com/wiki/Maguuma_Enchanter" }; + public static readonly Npc MaguumaWarlock = new() { Ids = [2295], Name = "Maguuma Warlock", WikiUrl = "https://wiki.guildwars.com/wiki/Maguuma_Warlock" }; + public static readonly Npc MaguumaAvenger = new() { Ids = [2296], Name = "Maguuma Avenger", WikiUrl = "https://wiki.guildwars.com/wiki/Maguuma_Avenger" }; + public static readonly Npc MaguumaProtector = new() { Ids = [2297], Name = "Maguuma Protector", WikiUrl = "https://wiki.guildwars.com/wiki/Maguuma_Protector" }; + public static readonly Npc MaguumaWarrior = new() { Ids = [2298, 2299], Name = "Maguuma Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Maguuma_Warrior" }; + public static readonly Npc MaguumaHunter = new() { Ids = [2300], Name = "Maguuma Hunter", WikiUrl = "https://wiki.guildwars.com/wiki/Maguuma_Hunter" }; + public static readonly Npc FeveredDevourer = new() { Ids = [2301], Name = "Fevered Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Fevered_Devourer" }; + public static readonly Npc ThornDevourer = new() { Ids = [2302], Name = "Thorn Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Thorn_Devourer" }; + public static readonly Npc ThornDevourerDrone = new() { Ids = [2303], Name = "Thorn Devourer Drone", WikiUrl = "https://wiki.guildwars.com/wiki/Thorn_Devourer_Drone" }; + public static readonly Npc ThornStalker = new() { Ids = [2304], Name = "Thorn Stalker", WikiUrl = "https://wiki.guildwars.com/wiki/Thorn_Stalker" }; + public static readonly Npc ThornStalkerSprout = new() { Ids = [2305], Name = "Thorn Stalker Sprout", WikiUrl = "https://wiki.guildwars.com/wiki/Thorn_Stalker_Sprout" }; + public static readonly Npc LifePod = new() { Ids = [2306], Name = "Life Pod", WikiUrl = "https://wiki.guildwars.com/wiki/Life_Pod" }; + public static readonly Npc EntanglingRoots = new() { Ids = [2307], Name = "Entangling Roots", WikiUrl = "https://wiki.guildwars.com/wiki/Entangling_Roots" }; + public static readonly Npc RedwoodShepherd = new() { Ids = [2308], Name = "Redwood Shepherd", WikiUrl = "https://wiki.guildwars.com/wiki/Redwood_Shepherd" }; + public static readonly Npc MossScarab = new() { Ids = [2309, 2310], Name = "Moss Scarab", WikiUrl = "https://wiki.guildwars.com/wiki/Moss_Scarab" }; + public static readonly Npc MaguumaSpider = new() { Ids = [2312], Name = "Maguuma Spider", WikiUrl = "https://wiki.guildwars.com/wiki/Maguuma_Spider" }; + public static readonly Npc JungleTroll = new() { Ids = [2313, 2314], Name = "Jungle Troll", WikiUrl = "https://wiki.guildwars.com/wiki/Jungle_Troll" }; + public static readonly Npc HormFrostrider = new() { Ids = [2472], Name = "Horm Frostrider", WikiUrl = "https://wiki.guildwars.com/wiki/Horm_Frostrider" }; + public static readonly Npc DigoMurkstalker = new() { Ids = [2501], Name = "Digo Murkstalker", WikiUrl = "https://wiki.guildwars.com/wiki/Digo_Murkstalker" }; + public static readonly Npc CeruGloomrunner = new() { Ids = [2502], Name = "Ceru Gloomrunner", WikiUrl = "https://wiki.guildwars.com/wiki/Ceru_Gloomrunner" }; + public static readonly Npc EnslavedFrostGiant = new() { Ids = [2530], Name = "Enslaved Frost Giant", WikiUrl = "https://wiki.guildwars.com/wiki/Enslaved_Frost_Giant" }; + public static readonly Npc BlessedGriffon = new() { Ids = [2532], Name = "Blessed Griffon", WikiUrl = "https://wiki.guildwars.com/wiki/Blessed_Griffon" }; + public static readonly Npc IceImp = new() { Ids = [2533, 6947], Name = "Ice Imp", WikiUrl = "https://wiki.guildwars.com/wiki/Ice_Imp" }; + public static readonly Npc AzureShadow = new() { Ids = [2535], Name = "Azure Shadow", WikiUrl = "https://wiki.guildwars.com/wiki/Azure_Shadow" }; + public static readonly Npc Pinesoul = new() { Ids = [2536], Name = "Pinesoul", WikiUrl = "https://wiki.guildwars.com/wiki/Pinesoul" }; + public static readonly Npc AvicaraBrave = new() { Ids = [2540], Name = "Avicara Brave", WikiUrl = "https://wiki.guildwars.com/wiki/Avicara_Brave" }; + public static readonly Npc AvicaraFierce = new() { Ids = [2541], Name = "Avicara Fierce", WikiUrl = "https://wiki.guildwars.com/wiki/Avicara_Fierce" }; + public static readonly Npc MountainTroll = new() { Ids = [2546], Name = "Mountain Troll", WikiUrl = "https://wiki.guildwars.com/wiki/Mountain_Troll" }; + public static readonly Npc Seer = new() { Ids = [2549], Name = "Seer", WikiUrl = "https://wiki.guildwars.com/wiki/Seer" }; + public static readonly Npc Eidolon = new() { Ids = [2552], Name = "Eidolon", WikiUrl = "https://wiki.guildwars.com/wiki/Eidolon" }; + public static readonly Npc EnslavedEttin = new() { Ids = [2599], Name = "Enslaved Ettin", WikiUrl = "https://wiki.guildwars.com/wiki/Enslaved_Ettin" }; + public static readonly Npc StoneSummitMesmerBoss = new() { Ids = [2629], Name = "Stone Summit Mesmer Boss", WikiUrl = "https://wiki.guildwars.com/wiki/List_of_dolyak_bosses" }; + public static readonly Npc HormakIroncurse = new() { Ids = [2630], Name = "Hormak Ironcurse", WikiUrl = "https://wiki.guildwars.com/wiki/Hormak_Ironcurse" }; + public static readonly Npc IceElementalElementalistBoss = new() { Ids = [2631], Name = "Ice Elemental Elementalist Boss", WikiUrl = "https://wiki.guildwars.com/wiki/List_of_elemental_bosses" }; + public static readonly Npc StoneSummitMonkBoss = new() { Ids = [2632], Name = "Stone Summit Monk Boss", WikiUrl = "https://wiki.guildwars.com/wiki/List_of_dolyak_bosses" }; + public static readonly Npc StoneSummitWarriorBoss = new() { Ids = [2634], Name = "Stone Summit Warrior Boss", WikiUrl = "https://wiki.guildwars.com/wiki/List_of_dolyak_bosses" }; + public static readonly Npc DagnarStonepate = new() { Ids = [2637], Name = "Dagnar Stonepate", WikiUrl = "https://wiki.guildwars.com/wiki/Dagnar_Stonepate" }; + public static readonly Npc SummitBeastmaster = new() { Ids = [2648], Name = "Summit Beastmaster", WikiUrl = "https://wiki.guildwars.com/wiki/Summit_Beastmaster" }; + public static readonly Npc StoneSummitHeretic = new() { Ids = [2650], Name = "Stone Summit Heretic", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Heretic" }; + public static readonly Npc DolyakMaster = new() { Ids = [2651], Name = "Dolyak Master", WikiUrl = "https://wiki.guildwars.com/wiki/Dolyak_Master" }; + public static readonly Npc StoneSummitGnasher = new() { Ids = [2653, 6698], Name = "Stone Summit Gnasher", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Gnasher" }; + public static readonly Npc StoneSummitCarver = new() { Ids = [2654, 6692, 6701], Name = "Stone Summit Carver", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Carver" }; + public static readonly Npc SiegeIceGolem = new() { Ids = [2656], Name = "Siege Ice Golem", WikiUrl = "https://wiki.guildwars.com/wiki/Siege_Ice_Golem" }; + public static readonly Npc SummitGiantHerder = new() { Ids = [2657], Name = "Summit Giant Herder", WikiUrl = "https://wiki.guildwars.com/wiki/Summit_Giant_Herder" }; + public static readonly Npc MolesQuibus = new() { Ids = [2658], Name = "Moles Quibus", WikiUrl = "https://wiki.guildwars.com/wiki/Moles_Quibus" }; + public static readonly Npc MaligoLibens = new() { Ids = [2659], Name = "Maligo Libens", WikiUrl = "https://wiki.guildwars.com/wiki/Maligo_Libens" }; + public static readonly Npc ScelusProsum = new() { Ids = [2660], Name = "Scelus Prosum", WikiUrl = "https://wiki.guildwars.com/wiki/Scelus_Prosum" }; + public static readonly Npc TortitudoProbo = new() { Ids = [2661], Name = "Tortitudo Probo", WikiUrl = "https://wiki.guildwars.com/wiki/Tortitudo_Probo" }; + public static readonly Npc ValetudoRubor = new() { Ids = [2662], Name = "Valetudo Rubor", WikiUrl = "https://wiki.guildwars.com/wiki/Valetudo_Rubor" }; + public static readonly Npc SparkOfTheTitans = new() { Ids = [2668], Name = "Spark Of The Titans", WikiUrl = "https://wiki.guildwars.com/wiki/Spark_of_the_Titans" }; + public static readonly Npc RisenAshenHulk = new() { Ids = [2669], Name = "Risen Ashen Hulk", WikiUrl = "https://wiki.guildwars.com/wiki/Risen_Ashen_Hulk" }; + public static readonly Npc BurningTitan = new() { Ids = [2670], Name = "Burning Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Burning_Titan" }; + public static readonly Npc HandOfTheTitans = new() { Ids = [2671], Name = "Hand Of The Titans", WikiUrl = "https://wiki.guildwars.com/wiki/Hand_of_the_Titans" }; + public static readonly Npc FistOfTheTitans = new() { Ids = [2672], Name = "Fist Of The Titans", WikiUrl = "https://wiki.guildwars.com/wiki/Fist_of_the_Titans" }; + public static readonly Npc UndeadLich = new() { Ids = [2695, 4953], Name = "Undead Lich", WikiUrl = "https://wiki.guildwars.com/wiki/Undead_Lich" }; + public static readonly Npc UndeadPrinceRurik = new() { Ids = [2698], Name = "Undead Prince Rurik", WikiUrl = "https://wiki.guildwars.com/wiki/Undead_Prince_Rurik" }; + public static readonly Npc ZaimGrimeclaw = new() { Ids = [2700], Name = "Zaim Grimeclaw", WikiUrl = "https://wiki.guildwars.com/wiki/Zaim_Grimeclaw" }; + public static readonly Npc Ruinwing = new() { Ids = [2729], Name = "Ruinwing", WikiUrl = "https://wiki.guildwars.com/wiki/Ruinwing" }; + public static readonly Npc Hellhound = new() { Ids = [2730], Name = "Hellhound", WikiUrl = "https://wiki.guildwars.com/wiki/Hellhound" }; + public static readonly Npc GraspingGhoul = new() { Ids = [2732, 2731], Name = "Grasping Ghoul", WikiUrl = "https://wiki.guildwars.com/wiki/Grasping_Ghoul" }; + public static readonly Npc SkeletonRanger = new() { Ids = [2739], Name = "Skeleton Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Ranger" }; + public static readonly Npc BoneDragon = new() { Ids = [2741], Name = "Bone Dragon", WikiUrl = "https://wiki.guildwars.com/wiki/Bone_Dragon" }; + public static readonly Npc VizierKhilbron = new() { Ids = [2748, 2749], Name = "Vizier Khilbron", WikiUrl = "https://wiki.guildwars.com/wiki/Vizier_Khilbron" }; + public static readonly Npc JythSprayburst = new() { Ids = [2763], Name = "Jyth Sprayburst", WikiUrl = "https://wiki.guildwars.com/wiki/Jyth_Sprayburst" }; + public static readonly Npc DosakaruFevertouch = new() { Ids = [2766], Name = "Dosakaru Fevertouch", WikiUrl = "https://wiki.guildwars.com/wiki/Dosakaru_Fevertouch" }; + public static readonly Npc SkintekaruManshredder = new() { Ids = [2768], Name = "Skintekaru Manshredder", WikiUrl = "https://wiki.guildwars.com/wiki/Skintekaru_Manshredder" }; + public static readonly Npc GossDarkweb = new() { Ids = [2770], Name = "Goss Darkweb", WikiUrl = "https://wiki.guildwars.com/wiki/Goss_Darkweb" }; + public static readonly Npc FerkMallet = new() { Ids = [2773], Name = "Ferk Mallet", WikiUrl = "https://wiki.guildwars.com/wiki/Ferk_Mallet" }; + public static readonly Npc VulgPainbrain = new() { Ids = [2774], Name = "Vulg Painbrain", WikiUrl = "https://wiki.guildwars.com/wiki/Vulg_Painbrain" }; + public static readonly Npc GrenthsCursed = new() { Ids = [2780], Name = "Grenth's Cursed", WikiUrl = "https://wiki.guildwars.com/wiki/Grenth%27s_Cursed" }; + public static readonly Npc MaxineColdstone = new() { Ids = [2784], Name = "Maxine Coldstone", WikiUrl = "https://wiki.guildwars.com/wiki/Maxine_Coldstone" }; + public static readonly Npc RwekKhawlMawl = new() { Ids = [2785], Name = "Rwek Khawl Mawl", WikiUrl = "https://wiki.guildwars.com/wiki/Rwek_Khawl_Mawl" }; + public static readonly Npc BreezeKeeper = new() { Ids = [2789], Name = "Breeze Keeper", WikiUrl = "https://wiki.guildwars.com/wiki/Breeze_Keeper" }; + public static readonly Npc CragBehemoth = new() { Ids = [2790], Name = "Crag Behemoth", WikiUrl = "https://wiki.guildwars.com/wiki/Crag_Behemoth" }; + public static readonly Npc Drake = new() { Ids = [2791, 8147], Name = "Drake", WikiUrl = "https://wiki.guildwars.com/wiki/Drake" }; + public static readonly Npc DarkFlameDryder = new() { Ids = [2792], Name = "Dark Flame Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Dark_Flame_Dryder" }; + public static readonly Npc IgneousEttin = new() { Ids = [2793], Name = "Igneous Ettin", WikiUrl = "https://wiki.guildwars.com/wiki/Igneous_Ettin" }; + public static readonly Npc Phantom = new() { Ids = [2794], Name = "Phantom", WikiUrl = "https://wiki.guildwars.com/wiki/Phantom" }; + public static readonly Npc FleshGolem = new() { Ids = [2795], Name = "Flesh Golem", WikiUrl = "https://wiki.guildwars.com/wiki/Flesh_Golem" }; + public static readonly Npc MahgoHydra = new() { Ids = [2796], Name = "Mahgo Hydra", WikiUrl = "https://wiki.guildwars.com/wiki/Mahgo_Hydra" }; + public static readonly Npc Wurm = new() { Ids = [2798], Name = "Wurm", WikiUrl = "https://wiki.guildwars.com/wiki/Wurm" }; + public static readonly Npc GhostMesmer = new() { Ids = [2828], Name = "Ghost Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Ghosts" }; + public static readonly Npc GhostWarrior = new() { Ids = [2833], Name = "Ghost Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Ghosts" }; + public static readonly Npc ShiningBlade = new() { Ids = [2842, 2843], Name = "Shining Blade", WikiUrl = "https://wiki.guildwars.com/wiki/Shining_Blade" }; + public static readonly Npc FirstwatchSergio = new() { Ids = [2857], Name = "Firstwatch Sergio", WikiUrl = "https://wiki.guildwars.com/wiki/Firstwatch_Sergio" }; + public static readonly Npc KrytanChild = new() { Ids = [2859], Name = "Krytan Child", WikiUrl = "https://wiki.guildwars.com/wiki/Krytan_Child" }; + public static readonly Npc Oink = new() { Ids = [2860], Name = "Oink", WikiUrl = "https://wiki.guildwars.com/wiki/Oink" }; + public static readonly Npc Carlotta = new() { Ids = [2861], Name = "Carlotta", WikiUrl = "https://wiki.guildwars.com/wiki/Carlotta" }; + public static readonly Npc KingAdelbern = new() { Ids = [2862, 2055], Name = "King Adelbern", WikiUrl = "https://wiki.guildwars.com/wiki/King_Adelbern" }; + public static readonly Npc DukeBarradin = new() { Ids = [2864], Name = "Duke Barradin", WikiUrl = "https://wiki.guildwars.com/wiki/Duke_Barradin" }; + public static readonly Npc Joe = new() { Ids = [2865], Name = "Joe", WikiUrl = "https://wiki.guildwars.com/wiki/Joe" }; + public static readonly Npc Shadow = new() { Ids = [2870], Name = "Shadow", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow" }; + public static readonly Npc Vanguard = new() { Ids = [2871, 6026, 6027, 6029, 6042, 2099, 2100], Name = "Vanguard", WikiUrl = "https://wiki.guildwars.com/wiki/Vanguard" }; + public static readonly Npc SpiritOfWinter = new() { Ids = [2874], Name = "Spirit Of Winter", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Winter" }; + public static readonly Npc SpiritOfSymbiosis = new() { Ids = [2879], Name = "Spirit Of Symbiosis", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Symbiosis" }; + public static readonly Npc SpiritOfPrimalEchoes = new() { Ids = [2880], Name = "Spirit Of Primal Echoes", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Primal_Echoes" }; + public static readonly Npc SpiritOfFrozenSoil = new() { Ids = [2882], Name = "Spirit Of Frozen Soil", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Frozen_Soil" }; + public static readonly Npc Crane = new() { Ids = [2953], Name = "Crane", WikiUrl = "https://wiki.guildwars.com/wiki/Crane" }; + public static readonly Npc Tiger = new() { Ids = [2954], Name = "Tiger", WikiUrl = "https://wiki.guildwars.com/wiki/Tiger" }; + public static readonly Npc Lurker = new() { Ids = [2955], Name = "Lurker", WikiUrl = "https://wiki.guildwars.com/wiki/Lurker" }; + public static readonly Npc ReefLurker = new() { Ids = [2956], Name = "Reef Lurker", WikiUrl = "https://wiki.guildwars.com/wiki/Reef_Lurker" }; + public static readonly Npc WhiteTiger = new() { Ids = [2957], Name = "White Tiger", WikiUrl = "https://wiki.guildwars.com/wiki/White_Tiger" }; + public static readonly Npc ElderReefLurker = new() { Ids = [2959], Name = "Elder Reef Lurker", WikiUrl = "https://wiki.guildwars.com/wiki/Reef_Lurker" }; + public static readonly Npc ElderCrane = new() { Ids = [2969], Name = "Elder Crane", WikiUrl = "https://wiki.guildwars.com/wiki/Elder_Crane" }; + public static readonly Npc ElderTiger = new() { Ids = [2974], Name = "Elder Tiger", WikiUrl = "https://wiki.guildwars.com/wiki/Tiger" }; + public static readonly Npc KurzickNoble = new() { Ids = [3030, 3337, 3396, 3397, 3398, 3399], Name = "Kurzick Noble", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Noble" }; + public static readonly Npc CrimsonSkullMonk = new() { Ids = [3055], Name = "Crimson Skull Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Healer" }; + public static readonly Npc GullHookbeak = new() { Ids = [3058], Name = "Gull Hookbeak", WikiUrl = "https://wiki.guildwars.com/wiki/Gull_Hookbeak" }; + public static readonly Npc YrrgSnagtooth = new() { Ids = [3059], Name = "Yrrg Snagtooth", WikiUrl = "https://wiki.guildwars.com/wiki/Yrrg_Snagtooth" }; + public static readonly Npc YorrtStrongjaw = new() { Ids = [3060], Name = "Yorrt Strongjaw", WikiUrl = "https://wiki.guildwars.com/wiki/Yorrt_Strongjaw" }; + public static readonly Npc CanthanGuardRecruit = new() { Ids = [3069, 3229], Name = "Canthan Guard Recruit", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Guard" }; + public static readonly Npc HeadmasterVhang = new() { Ids = [3077, 3336, 3490], Name = "Headmaster Vhang", WikiUrl = "https://wiki.guildwars.com/wiki/Headmaster_Vhang" }; + public static readonly Npc MasterTogo = new() { Ids = [3078, 3081, 3120, 3215], Name = "Master Togo", WikiUrl = "https://wiki.guildwars.com/wiki/Master_Togo" }; + public static readonly Npc ZaishenScout = new() { Ids = [3079], Name = "Zaishen Scout", WikiUrl = "https://wiki.guildwars.com/wiki/Zaishen_Scout" }; + public static readonly Npc YijoTahn = new() { Ids = [3082], Name = "Yijo Tahn", WikiUrl = "https://wiki.guildwars.com/wiki/Yijo_Tahn" }; + public static readonly Npc ShadyLuxon = new() { Ids = [3094], Name = "Shady Luxon", WikiUrl = "https://wiki.guildwars.com/wiki/Shady_Luxon" }; + public static readonly Npc SuspiciousKurzick = new() { Ids = [3095], Name = "Suspicious Kurzick", WikiUrl = "https://wiki.guildwars.com/wiki/Suspicious_Kurzick" }; + public static readonly Npc ZhuHanuku = new() { Ids = [3097], Name = "Zhu Hanuku", WikiUrl = "https://wiki.guildwars.com/wiki/Zhu_Hanuku" }; + public static readonly Npc ShadowBladeAssassin = new() { Ids = [3122], Name = "Shadow Blade Assassin", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_Blade_Assassin" }; + public static readonly Npc AmFahAssassin = new() { Ids = [3157, 4191], Name = "Am Fah Assassin", WikiUrl = "https://wiki.guildwars.com/wiki/Am_Fah_Assassin" }; + public static readonly Npc LuxonAssassin = new() { Ids = [3159, 3569, 3603], Name = "Luxon Assassin", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Assassin" }; + public static readonly Npc LuxonMesmer = new() { Ids = [3160, 3570, 3614], Name = "Luxon Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Mesmer" }; + public static readonly Npc LuxonElementalist = new() { Ids = [3161, 3572, 3615], Name = "Luxon Elementalist", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Elementalist" }; + public static readonly Npc LuxonMonk = new() { Ids = [3162, 3339, 3616, 3643], Name = "Luxon Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Monk" }; + public static readonly Npc LuxonWarrior = new() { Ids = [3163, 3574], Name = "Luxon Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Warrior" }; + public static readonly Npc LuxonRanger = new() { Ids = [3164, 3575, 3595, 3607], Name = "Luxon Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Ranger" }; + public static readonly Npc EmperorKisu = new() { Ids = [3196], Name = "Emperor Kisu", WikiUrl = "https://wiki.guildwars.com/wiki/Emperor_Kisu" }; + public static readonly Npc Jamei = new() { Ids = [3219, 3941], Name = "Jamei", WikiUrl = "https://wiki.guildwars.com/wiki/Jamei" }; + public static readonly Npc TalonSilverwing = new() { Ids = [3226, 3471, 3501, 5992], Name = "Talon Silverwing", WikiUrl = "https://wiki.guildwars.com/wiki/Talon_Silverwing" }; + public static readonly Npc CanthanGuardCaptain = new() { Ids = [3231, 3338], Name = "Canthan Guard Captain", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Guard_Captain" }; + public static readonly Npc PalaceGuard = new() { Ids = [3232, 5636], Name = "Palace Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Palace_Guard" }; + public static readonly Npc CanthanChild = new() { Ids = [3238], Name = "Canthan Child", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Child" }; + public static readonly Npc CanthanNoble = new() { Ids = [3241, 3242, 3243, 3244, 3304, 3317, 3333, 3334], Name = "Canthan Noble", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Noble" }; + public static readonly Npc CanthanBarkeep = new() { Ids = [3247, 3252], Name = "Canthan Barkeep", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Peasant" }; + public static readonly Npc CanthanPeasant = new() { Ids = [3248, 3256, 3258, 3266, 3289, 3303], Name = "Canthan Peasant", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Peasant" }; + public static readonly Npc KurzickGuard = new() { Ids = [3249, 3388, 3430, 3431, 3429], Name = "Kurzick Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Guard" }; + public static readonly Npc ShingJeaCollector = new() { Ids = [3255, 3310], Name = "Shing Jea Collector", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; + public static readonly Npc CanthanAdept = new() { Ids = [3267], Name = "Canthan Adept", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; + public static readonly Npc CanthanTrader = new() { Ids = [3269, 3270, 3275, 3279, 3288, 3295, 3311], Name = "Canthan Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Canthan_Trader" }; + public static readonly Npc CanthanArmorer = new() { Ids = [3272, 3273, 3281], Name = "Canthan Armorer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; + public static readonly Npc FireworksMaster = new() { Ids = [3274], Name = "Fireworks Master", WikiUrl = "https://wiki.guildwars.com/wiki/Fireworks_Master" }; + public static readonly Npc CanthanWeaponsmith = new() { Ids = [3280], Name = "Canthan Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; + public static readonly Npc ShingJeaTrader = new() { Ids = [3290, 3292], Name = "Shing Jea Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; + public static readonly Npc Su = new() { Ids = [3309, 3468, 3498], Name = "Su", WikiUrl = "https://wiki.guildwars.com/wiki/Su" }; + public static readonly Npc SisterTai = new() { Ids = [3315, 3470, 3500, 3512], Name = "Sister Tai", WikiUrl = "https://wiki.guildwars.com/wiki/Sister_Tai" }; + public static readonly Npc WengGha = new() { Ids = [3320], Name = "Weng Gha", WikiUrl = "https://wiki.guildwars.com/wiki/Weng_Gha" }; + public static readonly Npc CanthanRangerTrainer = new() { Ids = [3326], Name = "Canthan Ranger Trainer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; + public static readonly Npc ProfessorGai = new() { Ids = [3330, 3473, 3503], Name = "Professor Gai", WikiUrl = "https://wiki.guildwars.com/wiki/Professor_Gai" }; + public static readonly Npc AscalonGuardGhost = new() { Ids = [3332], Name = "Ascalon Guard Ghost", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Ghosts" }; + public static readonly Npc FortuneTeller = new() { Ids = [3335], Name = "Fortune Teller", WikiUrl = "https://wiki.guildwars.com/wiki/Fortune_Teller" }; + public static readonly Npc CanthanRitualist = new() { Ids = [3340], Name = "Canthan Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; + public static readonly Npc GeneralKaimerVasburg = new() { Ids = [3348], Name = "General Kaimer Vasburg", WikiUrl = "https://wiki.guildwars.com/wiki/General_Kaimer_Vasburg" }; + public static readonly Npc KurzickJuggernaut = new() { Ids = [3349], Name = "Kurzick Juggernaut", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Juggernaut" }; + public static readonly Npc KurzickAssassin = new() { Ids = [3350, 3405], Name = "Kurzick Assassin", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Assassin" }; + public static readonly Npc KurzickMesmer = new() { Ids = [3351, 3393], Name = "Kurzick Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Mesmer" }; + public static readonly Npc KurzickNecromancer = new() { Ids = [3352], Name = "Kurzick Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Necromancer" }; + public static readonly Npc KurzickElementalist = new() { Ids = [3353], Name = "Kurzick Elementalist", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Elementalist" }; + public static readonly Npc KurzickMonk = new() { Ids = [3354], Name = "Kurzick Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Monk" }; + public static readonly Npc KurzickWarrior = new() { Ids = [3355], Name = "Kurzick Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Warrior" }; + public static readonly Npc KurzickRanger = new() { Ids = [3356, 3382], Name = "Kurzick Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Ranger" }; + public static readonly Npc KurzickRitualist = new() { Ids = [3357], Name = "Kurzick Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Ritualist" }; + public static readonly Npc Juggernaut = new() { Ids = [3367], Name = "Juggernaut", WikiUrl = "https://wiki.guildwars.com/wiki/Juggernaut" }; + public static readonly Npc KurzickQuartermaster = new() { Ids = [3384], Name = "Kurzick Quartermaster", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Quartermaster" }; + public static readonly Npc WarCaptainWomack = new() { Ids = [3385], Name = "War Captain Womack", WikiUrl = "https://wiki.guildwars.com/wiki/War_Captain_Womack" }; + public static readonly Npc KurzickPeasant = new() { Ids = [3392], Name = "Kurzick Peasant", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Peasant" }; + public static readonly Npc KurzickTraveler = new() { Ids = [3394, 3395], Name = "Kurzick Traveler", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Traveler" }; + public static readonly Npc KurzickPriest = new() { Ids = [3400, 3426], Name = "Kurzick Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Priest" }; + public static readonly Npc KurzickBlacksmith = new() { Ids = [3403], Name = "Kurzick Blacksmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kurzicks" }; + public static readonly Npc KurzickMerchant = new() { Ids = [3408, 3427], Name = "Kurzick Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Merchant" }; + public static readonly Npc KurzickWeaponsmith = new() { Ids = [3409, 3410], Name = "Kurzick Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kurzicks" }; + public static readonly Npc KurzickTrader = new() { Ids = [3411, 3419, 3420, 3422, 3425], Name = "Kurzick Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kurzicks" }; + public static readonly Npc KurzickBureaucrat = new() { Ids = [3414], Name = "Kurzick Bureaucrat", WikiUrl = "https://wiki.guildwars.com/wiki/Kurzick_Bureaucrat" }; + public static readonly Npc BaronMirekVasburg = new() { Ids = [3416], Name = "Baron Mirek Vasburg", WikiUrl = "https://wiki.guildwars.com/wiki/Baron_Mirek_Vasburg" }; + public static readonly Npc CountZuHeltzer = new() { Ids = [3417], Name = "Count Zu Heltzer", WikiUrl = "https://wiki.guildwars.com/wiki/Count_zu_Heltzer" }; + public static readonly Npc Mai = new() { Ids = [3434, 3440, 3446, 3452], Name = "Mai", WikiUrl = "https://wiki.guildwars.com/wiki/Mai" }; + public static readonly Npc Kisai = new() { Ids = [3435, 3441, 3447, 3453], Name = "Kisai", WikiUrl = "https://wiki.guildwars.com/wiki/Kisai" }; + public static readonly Npc Taya = new() { Ids = [3436, 3442, 3448, 3454], Name = "Taya", WikiUrl = "https://wiki.guildwars.com/wiki/Taya" }; + public static readonly Npc Lukas = new() { Ids = [3437, 3443, 3449, 3455, 3479, 3508], Name = "Lukas", WikiUrl = "https://wiki.guildwars.com/wiki/Lukas" }; + public static readonly Npc Yuun = new() { Ids = [3438, 3444, 3450, 3456], Name = "Yuun", WikiUrl = "https://wiki.guildwars.com/wiki/Yuun" }; + public static readonly Npc Aeson = new() { Ids = [3439, 3445, 3451, 3457, 3515, 3486], Name = "Aeson", WikiUrl = "https://wiki.guildwars.com/wiki/Aeson" }; + public static readonly Npc Panaku = new() { Ids = [3466, 3495], Name = "Panaku", WikiUrl = "https://wiki.guildwars.com/wiki/Panaku" }; + public static readonly Npc LoSha = new() { Ids = [3467, 3497, 5986], Name = "Lo Sha", WikiUrl = "https://wiki.guildwars.com/wiki/Lo_Sha" }; + public static readonly Npc KaiYing = new() { Ids = [3469, 3499, 3511], Name = "Kai Ying", WikiUrl = "https://wiki.guildwars.com/wiki/Kai_Ying" }; + public static readonly Npc Zho = new() { Ids = [3472, 3502, 3514, 5995], Name = "Zho", WikiUrl = "https://wiki.guildwars.com/wiki/Zho" }; + public static readonly Npc ErysVasburg = new() { Ids = [3474, 3504], Name = "Erys Vasburg", WikiUrl = "https://wiki.guildwars.com/wiki/Erys_Vasburg" }; + public static readonly Npc Brutus = new() { Ids = [3475, 3505], Name = "Brutus", WikiUrl = "https://wiki.guildwars.com/wiki/Brutus" }; + public static readonly Npc Sheena = new() { Ids = [3476, 3506], Name = "Sheena", WikiUrl = "https://wiki.guildwars.com/wiki/Sheena" }; + public static readonly Npc Danika = new() { Ids = [3477], Name = "Danika", WikiUrl = "https://wiki.guildwars.com/wiki/Danika" }; + public static readonly Npc RedemptorKarl = new() { Ids = [3478, 3507], Name = "Redemptor Karl", WikiUrl = "https://wiki.guildwars.com/wiki/Redemptor_Karl" }; + public static readonly Npc Emi = new() { Ids = [3487], Name = "Emi", WikiUrl = "https://wiki.guildwars.com/wiki/Emi" }; + public static readonly Npc Chiyo = new() { Ids = [3494], Name = "Chiyo", WikiUrl = "https://wiki.guildwars.com/wiki/Chiyo" }; + public static readonly Npc Nika = new() { Ids = [3496], Name = "Nika", WikiUrl = "https://wiki.guildwars.com/wiki/Nika" }; + public static readonly Npc SeaguardHala = new() { Ids = [3510, 3561, 3649, 3480], Name = "Seaguard Hala", WikiUrl = "https://wiki.guildwars.com/wiki/Seaguard_Hala" }; + public static readonly Npc Daeman = new() { Ids = [3513, 3567, 3645, 3484], Name = "Daeman", WikiUrl = "https://wiki.guildwars.com/wiki/Daeman" }; + public static readonly Npc CanthanFarmer = new() { Ids = [3524, 3254], Name = "Canthan Farmer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Canthans" }; + public static readonly Npc Argo = new() { Ids = [3563, 3646, 3481], Name = "Argo", WikiUrl = "https://wiki.guildwars.com/wiki/Argo" }; + public static readonly Npc SeaguardGita = new() { Ids = [3564, 3647, 3482], Name = "Seaguard Gita", WikiUrl = "https://wiki.guildwars.com/wiki/Seaguard_Gita" }; + public static readonly Npc SeaguardEli = new() { Ids = [3565,3483], Name = "Seaguard Eli", WikiUrl = "https://wiki.guildwars.com/wiki/Seaguard_Eli" }; + public static readonly Npc Aurora = new() { Ids = [3566, 3644, 3485], Name = "Aurora", WikiUrl = "https://wiki.guildwars.com/wiki/Aurora" }; + public static readonly Npc SiegeTurtle = new() { Ids = [3568, 3586], Name = "Siege Turtle", WikiUrl = "https://wiki.guildwars.com/wiki/Siege_Turtle" }; + public static readonly Npc LuxonNecromancer = new() { Ids = [3571, 3621], Name = "Luxon Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Necromancer" }; + public static readonly Npc GiantTurtle = new() { Ids = [3585], Name = "Giant Turtle", WikiUrl = "https://wiki.guildwars.com/wiki/Giant_Turtle" }; + public static readonly Npc YoungTurtle = new() { Ids = [3587], Name = "Young Turtle", WikiUrl = "https://wiki.guildwars.com/wiki/Young_Turtle" }; + public static readonly Npc LuxonRitualist = new() { Ids = [3598], Name = "Luxon Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Ritualist" }; + public static readonly Npc LuxonCommander = new() { Ids = [3600, 3642], Name = "Luxon Commander", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Commander" }; + public static readonly Npc LuxonAmbassador = new() { Ids = [3608], Name = "Luxon Ambassador", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Ambassador" }; + public static readonly Npc Luxon = new() { Ids = [3609, 3611], Name = "Luxon", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon" }; + public static readonly Npc LuxonElder = new() { Ids = [3610], Name = "Luxon Elder", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Luxons" }; + public static readonly Npc LuxonTraveler = new() { Ids = [3612], Name = "Luxon Traveler", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Traveler" }; + public static readonly Npc LuxonMagistrate = new() { Ids = [3613], Name = "Luxon Magistrate", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Luxons" }; + public static readonly Npc LuxonBlacksmith = new() { Ids = [3619], Name = "Luxon Blacksmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Luxons" }; + public static readonly Npc LuxonMerchant = new() { Ids = [3622, 3623, 3627, 3636], Name = "Luxon Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Merchant" }; + public static readonly Npc LuxonWeaponsmith = new() { Ids = [3624, 3648], Name = "Luxon Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Luxons" }; + public static readonly Npc LuxonTrader = new() { Ids = [3628, 3631, 3633, 3634], Name = "Luxon Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Luxons" }; + public static readonly Npc LuxonGuard = new() { Ids = [3638, 3639, 3640], Name = "Luxon Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Guard" }; + public static readonly Npc LuxonPriest = new() { Ids = [3641], Name = "Luxon Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Luxon_Priest" }; + public static readonly Npc ElderRhea = new() { Ids = [3651], Name = "Elder Rhea", WikiUrl = "https://wiki.guildwars.com/wiki/Elder_Rhea" }; + public static readonly Npc ChkkrLocustLord = new() { Ids = [3662], Name = "Chkkr Locust Lord", WikiUrl = "https://wiki.guildwars.com/wiki/Chkkr_Locust_Lord" }; + public static readonly Npc BezzrWingstorm = new() { Ids = [3663], Name = "Bezzr Wingstorm", WikiUrl = "https://wiki.guildwars.com/wiki/Bezzr_Wingstorm" }; + public static readonly Npc ChkkrBrightclaw = new() { Ids = [3669], Name = "Chkkr Brightclaw", WikiUrl = "https://wiki.guildwars.com/wiki/Chkkr_Brightclaw" }; + public static readonly Npc KonrruTaintedStone = new() { Ids = [3670], Name = "Konrru Tainted Stone", WikiUrl = "https://wiki.guildwars.com/wiki/Konrru,_Tainted_Stone" }; + public static readonly Npc NandetGlassWeaver = new() { Ids = [3671], Name = "Nandet Glass Weaver", WikiUrl = "https://wiki.guildwars.com/wiki/Nandet,_Glass_Weaver" }; + public static readonly Npc HarggPlaguebinder = new() { Ids = [3674], Name = "Hargg Plaguebinder", WikiUrl = "https://wiki.guildwars.com/wiki/Hargg_Plaguebinder" }; + public static readonly Npc TarlokEvermind = new() { Ids = [3675], Name = "Tarlok Evermind", WikiUrl = "https://wiki.guildwars.com/wiki/Tarlok_Evermind" }; + public static readonly Npc MungriMagicbox = new() { Ids = [3676], Name = "Mungri Magicbox", WikiUrl = "https://wiki.guildwars.com/wiki/Mungri_Magicbox" }; + public static readonly Npc TarnenTheBully = new() { Ids = [3677], Name = "Tarnen The Bully", WikiUrl = "https://wiki.guildwars.com/wiki/Tarnen_the_Bully" }; + public static readonly Npc WaggSpiritspeak = new() { Ids = [3679], Name = "Wagg Spiritspeak", WikiUrl = "https://wiki.guildwars.com/wiki/Wagg_Spiritspeak" }; + public static readonly Npc StrongrootTanglebranch = new() { Ids = [3682], Name = "Strongroot Tanglebranch", WikiUrl = "https://wiki.guildwars.com/wiki/Strongroot_Tanglebranch" }; + public static readonly Npc InallaySplintercall = new() { Ids = [3696], Name = "Inallay Splintercall", WikiUrl = "https://wiki.guildwars.com/wiki/Inallay_Splintercall" }; + public static readonly Npc ArborEarthcall = new() { Ids = [3700], Name = "Arbor Earthcall", WikiUrl = "https://wiki.guildwars.com/wiki/Arbor_Earthcall" }; + public static readonly Npc SalkeFurFriend = new() { Ids = [3704], Name = "Salke Fur Friend", WikiUrl = "https://wiki.guildwars.com/wiki/Salke_Fur_Friend" }; + public static readonly Npc BloodDrinker = new() { Ids = [3708], Name = "Blood Drinker", WikiUrl = "https://wiki.guildwars.com/wiki/Blood_Drinker" }; + public static readonly Npc FungalWallow = new() { Ids = [3709], Name = "Fungal Wallow", WikiUrl = "https://wiki.guildwars.com/wiki/Fungal_Wallow" }; + public static readonly Npc MantisHunter = new() { Ids = [3711], Name = "Mantis Hunter", WikiUrl = "https://wiki.guildwars.com/wiki/Mantis_Hunter" }; + public static readonly Npc MantisDreamweaver = new() { Ids = [3712], Name = "Mantis Dreamweaver", WikiUrl = "https://wiki.guildwars.com/wiki/Mantis_Dreamweaver" }; + public static readonly Npc MantisStormcaller = new() { Ids = [3713], Name = "Mantis Stormcaller", WikiUrl = "https://wiki.guildwars.com/wiki/Mantis_Stormcaller" }; + public static readonly Npc MantisMender = new() { Ids = [3714], Name = "Mantis Mender", WikiUrl = "https://wiki.guildwars.com/wiki/Mantis_Mender" }; + public static readonly Npc PainHungryGaki = new() { Ids = [3715], Name = "Pain Hungry Gaki", WikiUrl = "https://wiki.guildwars.com/wiki/Pain_Hungry_Gaki" }; + public static readonly Npc SkillHungryGaki = new() { Ids = [3716], Name = "Skill Hungry Gaki", WikiUrl = "https://wiki.guildwars.com/wiki/Skill_Hungry_Gaki" }; + public static readonly Npc StoneScaleKirin = new() { Ids = [3717], Name = "Stone Scale Kirin", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Scale_Kirin" }; + public static readonly Npc DredgeGutter = new() { Ids = [3718], Name = "Dredge Gutter", WikiUrl = "https://wiki.guildwars.com/wiki/Dredge_Gutter" }; + public static readonly Npc DredgeGardener = new() { Ids = [3719], Name = "Dredge Gardener", WikiUrl = "https://wiki.guildwars.com/wiki/Dredge_Gardener" }; + public static readonly Npc DredgeGuardian = new() { Ids = [3720], Name = "Dredge Guardian", WikiUrl = "https://wiki.guildwars.com/wiki/Dredge_Guardian" }; + public static readonly Npc Undergrowth = new() { Ids = [3723], Name = "Undergrowth", WikiUrl = "https://wiki.guildwars.com/wiki/Undergrowth" }; + public static readonly Npc StoneRain = new() { Ids = [3724], Name = "Stone Rain", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Rain" }; + public static readonly Npc StoneSoul = new() { Ids = [3726], Name = "Stone Soul", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Soul" }; + public static readonly Npc WardenOfTheMind = new() { Ids = [3729], Name = "Warden Of The Mind", WikiUrl = "https://wiki.guildwars.com/wiki/Warden_of_the_Mind" }; + public static readonly Npc WardenOfEarth = new() { Ids = [3730], Name = "Warden Of Earth", WikiUrl = "https://wiki.guildwars.com/wiki/Warden_of_Earth" }; + public static readonly Npc WardenOfTheTrunk = new() { Ids = [3733], Name = "Warden Of The Trunk", WikiUrl = "https://wiki.guildwars.com/wiki/Warden_of_the_Trunk" }; + public static readonly Npc WardenOfTheLeaf = new() { Ids = [3736], Name = "Warden Of The Leaf", WikiUrl = "https://wiki.guildwars.com/wiki/Warden_of_the_Leaf" }; + public static readonly Npc WardenOfTheSummer = new() { Ids = [3737], Name = "Warden Of The Summer", WikiUrl = "https://wiki.guildwars.com/wiki/Warden_of_the_Summer" }; + public static readonly Npc DredgeMelee = new() { Ids = [3741], Name = "Dredge Melee", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Dredge" }; + public static readonly Npc SickenedLynx = new() { Ids = [3765], Name = "Sickened Lynx", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Lynx" }; + public static readonly Npc SickenedMoa = new() { Ids = [3766], Name = "Sickened Moa", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Moa" }; + public static readonly Npc SickenedStalker = new() { Ids = [3767], Name = "Sickened Stalker", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Stalker" }; + public static readonly Npc SickenedWolf = new() { Ids = [3768], Name = "Sickened Wolf", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Wolf" }; + public static readonly Npc SickenedWarthog = new() { Ids = [3769], Name = "Sickened Warthog", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Warthog" }; + public static readonly Npc SickenedBear = new() { Ids = [3770], Name = "Sickened Bear", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Bear" }; + public static readonly Npc SickenedGuard = new() { Ids = [3771, 3774], Name = "Sickened Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Guard" }; + public static readonly Npc SickenedServant = new() { Ids = [3772], Name = "Sickened Servant", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Servant" }; + public static readonly Npc SickenedScribe = new() { Ids = [3773], Name = "Sickened Scribe", WikiUrl = "https://wiki.guildwars.com/wiki/Sickened_Scribe" }; + public static readonly Npc AfflictedYijo = new() { Ids = [3780], Name = "Afflicted Yijo", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Yijo" }; + public static readonly Npc TheAfflictedKana = new() { Ids = [3781], Name = "The Afflicted Kana", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Kana" }; + public static readonly Npc AfflictedRangerBoss = new() { Ids = [3783], Name = "Afflicted Ranger Boss", WikiUrl = "https://wiki.guildwars.com/wiki/List_of_afflicted_bosses" }; + public static readonly Npc DiseasedMinister = new() { Ids = [3784], Name = "Diseased Minister", WikiUrl = "https://wiki.guildwars.com/wiki/Diseased_Minister" }; + public static readonly Npc AfflictedHorror = new() { Ids = [3785], Name = "Afflicted Horror", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Horror" }; + public static readonly Npc TheAfflictedLiYun = new() { Ids = [3795], Name = "The Afflicted Li Yun", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Li_Yun" }; + public static readonly Npc TheAfflictedKam = new() { Ids = [3797], Name = "The Afflicted Kam", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Kam" }; + public static readonly Npc TheAfflictedMiju = new() { Ids = [3798], Name = "The Afflicted Miju", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Miju" }; + public static readonly Npc TheAfflictedHakaru = new() { Ids = [3801], Name = "The Afflicted Hakaru", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Hakaru" }; + public static readonly Npc TheAfflictedSenku = new() { Ids = [3802], Name = "The Afflicted Senku", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Senku" }; + public static readonly Npc TheAfflictedHsinJun = new() { Ids = [3803], Name = "The Afflicted Hsin Jun", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Hsin_Jun" }; + public static readonly Npc TheAfflictedJingme = new() { Ids = [3806], Name = "The Afflicted Jingme", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Jingme" }; + public static readonly Npc TheAfflictedMaaka = new() { Ids = [3807], Name = "The Afflicted Maaka", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Maaka" }; + public static readonly Npc TheAfflictedXenxo = new() { Ids = [3809], Name = "The Afflicted Xenxo", WikiUrl = "https://wiki.guildwars.com/wiki/The_Afflicted_Xenxo" }; + public static readonly Npc AfflictedAssassin = new() { Ids = [3818, 3819, 3823], Name = "Afflicted Assassin", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Assassin" }; + public static readonly Npc AfflictedBull = new() { Ids = [3825], Name = "Afflicted Bull", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Bull" }; + public static readonly Npc AfflictedMesmer = new() { Ids = [3826, 3831], Name = "Afflicted Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Mesmer" }; + public static readonly Npc AfflictedNecromancer = new() { Ids = [3833, 3838], Name = "Afflicted Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Necromancer" }; + public static readonly Npc AfflictedElementalist = new() { Ids = [3840, 3841, 3845], Name = "Afflicted Elementalist", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Elementalist" }; + public static readonly Npc AfflictedMonk = new() { Ids = [3847, 3848], Name = "Afflicted Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Monk" }; + public static readonly Npc AfflictedWarrior = new() { Ids = [3854, 3859], Name = "Afflicted Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Warrior" }; + public static readonly Npc AfflictedRanger = new() { Ids = [3861, 3862, 3866], Name = "Afflicted Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Ranger" }; + public static readonly Npc AfflictedRavager = new() { Ids = [3868], Name = "Afflicted Ravager", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Ravager" }; + public static readonly Npc AfflictedRitualist = new() { Ids = [3869], Name = "Afflicted Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Afflicted_Ritualist" }; + public static readonly Npc AhvaSankii = new() { Ids = [3878], Name = "Ahva Sankii", WikiUrl = "https://wiki.guildwars.com/wiki/Ahva_Sankii" }; + public static readonly Npc PeiTheSkullBlade = new() { Ids = [3879], Name = "Pei The Skull Blade", WikiUrl = "https://wiki.guildwars.com/wiki/Pei_the_Skull_Blade" }; + public static readonly Npc YingkoTheSkullClaw = new() { Ids = [3881], Name = "Yingko The Skull Claw", WikiUrl = "https://wiki.guildwars.com/wiki/Yingko_the_Skull_Claw" }; + public static readonly Npc FengTheSkullSymbol = new() { Ids = [3883], Name = "Feng The Skull Symbol", WikiUrl = "https://wiki.guildwars.com/wiki/Feng_The_Skull_Symbol" }; + public static readonly Npc CaptainQuimang = new() { Ids = [3884], Name = "Captain Quimang", WikiUrl = "https://wiki.guildwars.com/wiki/Captain_Quimang" }; + public static readonly Npc JinTheSkullBow = new() { Ids = [3885], Name = "Jin The Skull Bow", WikiUrl = "https://wiki.guildwars.com/wiki/Jin_the_Skull_Bow" }; + public static readonly Npc MikiTheSkullSpirit = new() { Ids = [3886], Name = "Miki The Skull Spirit", WikiUrl = "https://wiki.guildwars.com/wiki/Miki_the_Skull_Spirit" }; + public static readonly Npc TahkayunTsi = new() { Ids = [3887], Name = "Tahkayun Tsi", WikiUrl = "https://wiki.guildwars.com/wiki/Tahkayun_Tsi" }; + public static readonly Npc YunlaiDeathkeeper = new() { Ids = [3888], Name = "Yunlai Deathkeeper", WikiUrl = "https://wiki.guildwars.com/wiki/Yunlai_Deathkeeper" }; + public static readonly Npc ZiinjuuLifeCrawler = new() { Ids = [3889], Name = "Ziinjuu Life Crawler", WikiUrl = "https://wiki.guildwars.com/wiki/Ziinjuu_Life_Crawler" }; + public static readonly Npc Cow = new() { Ids = [3892], Name = "Cow", WikiUrl = "https://wiki.guildwars.com/wiki/Cow" }; + public static readonly Npc BonesnapTurtle = new() { Ids = [3895], Name = "Bonesnap Turtle", WikiUrl = "https://wiki.guildwars.com/wiki/Bonesnap_Turtle" }; + public static readonly Npc CrimsonSkullEtherFiend = new() { Ids = [3896], Name = "Crimson Skull Ether Fiend", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Ether_Fiend" }; + public static readonly Npc CrimsonSkullMentalist = new() { Ids = [3898], Name = "Crimson Skull Mentalist", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Mentalist" }; + public static readonly Npc CrimsonSkullMesmer = new() { Ids = [3899], Name = "Crimson Skull Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Mesmer" }; + public static readonly Npc CrimsonSkullHealer = new() { Ids = [3900], Name = "Crimson Skull Healer", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Healer" }; + public static readonly Npc CrimsonSkullMender = new() { Ids = [3903], Name = "Crimson Skull Mender", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Mender" }; + public static readonly Npc CrimsonSkullHunter = new() { Ids = [3904], Name = "Crimson Skull Hunter", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Hunter" }; + public static readonly Npc CrimsonSkullLongbow = new() { Ids = [3906], Name = "Crimson Skull Longbow", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Longbow" }; + public static readonly Npc CrimsonSkullRaider = new() { Ids = [3907], Name = "Crimson Skull Raider", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Raider" }; + public static readonly Npc CrimsonSkullSeer = new() { Ids = [3908], Name = "Crimson Skull Seer", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Seer" }; + public static readonly Npc CrimsonSkullSpiritLord = new() { Ids = [3910], Name = "Crimson Skull Spirit Lord", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Spirit_Lord" }; + public static readonly Npc CrimsonSkullRitualist = new() { Ids = [3911], Name = "Crimson Skull Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Skull_Ritualist" }; + public static readonly Npc MantidDrone = new() { Ids = [3914, 4168], Name = "Mantid Drone", WikiUrl = "https://wiki.guildwars.com/wiki/Mantid_Drone" }; + public static readonly Npc MantidDroneHatchling = new() { Ids = [3921], Name = "Mantid Drone Hatchling ", WikiUrl = "https://wiki.guildwars.com/wiki/Mantid_Drone_Hatchling" }; + public static readonly Npc MantidMonitor = new() { Ids = [3924, 4169], Name = "Mantid Monitor", WikiUrl = "https://wiki.guildwars.com/wiki/Mantid_Monitor" }; + public static readonly Npc MantidGlitterfang = new() { Ids = [3929], Name = "Mantid Glitterfang", WikiUrl = "https://wiki.guildwars.com/wiki/Mantid_Glitterfang" }; + public static readonly Npc MantidMonitorHatchling = new() { Ids = [3933], Name = "Mantid Monitor Hatchling", WikiUrl = "https://wiki.guildwars.com/wiki/Mantid_Monitor_Hatchling" }; + public static readonly Npc NagaWelp = new() { Ids = [3936], Name = "Naga Welp", WikiUrl = "https://wiki.guildwars.com/wiki/Naga_Welp" }; + public static readonly Npc NagaSpellblade = new() { Ids = [3939], Name = "Naga Spellblade", WikiUrl = "https://wiki.guildwars.com/wiki/Naga_Spellblade" }; + public static readonly Npc NagaWitch = new() { Ids = [3940], Name = "Naga Witch", WikiUrl = "https://wiki.guildwars.com/wiki/Naga_Witch" }; + public static readonly Npc NagaSibyl = new() { Ids = [3942], Name = "Naga Sibyl", WikiUrl = "https://wiki.guildwars.com/wiki/Naga_Sibyl" }; + public static readonly Npc SensaliAssassin = new() { Ids = [3943], Name = "Sensali Assassin", WikiUrl = "https://wiki.guildwars.com/wiki/Sensali_Assassin" }; + public static readonly Npc SensaliBlood = new() { Ids = [3945], Name = "Sensali Blood", WikiUrl = "https://wiki.guildwars.com/wiki/Sensali_Blood" }; + public static readonly Npc SensaliFighter = new() { Ids = [3947], Name = "Sensali Fighter", WikiUrl = "https://wiki.guildwars.com/wiki/Sensali_Fighter" }; + public static readonly Npc Kappa = new() { Ids = [3950, 3951, 4040], Name = "Kappa", WikiUrl = "https://wiki.guildwars.com/wiki/Kappa" }; + public static readonly Npc MountainYeti = new() { Ids = [3954], Name = "Mountain Yeti", WikiUrl = "https://wiki.guildwars.com/wiki/Mountain_Yeti" }; + public static readonly Npc LonghairYeti = new() { Ids = [3955], Name = "Longhair Yeti", WikiUrl = "https://wiki.guildwars.com/wiki/Longhair_Yeti" }; + public static readonly Npc RedYeti = new() { Ids = [3956], Name = "Red Yeti", WikiUrl = "https://wiki.guildwars.com/wiki/Red_Yeti" }; + public static readonly Npc Zunraa = new() { Ids = [3958], Name = "Zunraa", WikiUrl = "https://wiki.guildwars.com/wiki/Zunraa" }; + public static readonly Npc Kuunavang = new() { Ids = [3965], Name = "Kuunavang", WikiUrl = "https://wiki.guildwars.com/wiki/Kuunavang" }; + public static readonly Npc RazortongueFrothspit = new() { Ids = [3970], Name = "Razortongue Frothspit", WikiUrl = "https://wiki.guildwars.com/wiki/Razortongue_Frothspit" }; + public static readonly Npc KaySeyStormray = new() { Ids = [3971], Name = "KaySey Stormray", WikiUrl = "https://wiki.guildwars.com/wiki/KaySey_Stormray" }; + public static readonly Npc MiellaLightwing = new() { Ids = [3981], Name = "Miella Lightwing", WikiUrl = "https://wiki.guildwars.com/wiki/Miella_Lightwing" }; + public static readonly Npc SnapjawWindshell = new() { Ids = [3982], Name = "Snapjaw Windshell", WikiUrl = "https://wiki.guildwars.com/wiki/Snapjaw_Windshell" }; + public static readonly Npc ArrahhshMountainclub = new() { Ids = [3987], Name = "Arrahhsh Mountainclub", WikiUrl = "https://wiki.guildwars.com/wiki/Arrahhsh_Mountainclub" }; + public static readonly Npc AmadisWindOfTheSea = new() { Ids = [3993], Name = "Amadis Wind Of The Sea", WikiUrl = "https://wiki.guildwars.com/wiki/Amadis,_Wind_of_the_Sea" }; + public static readonly Npc GeofferPainBringer = new() { Ids = [3998], Name = "Geoffer Pain Bringer", WikiUrl = "https://wiki.guildwars.com/wiki/Geoffer_Pain_Bringer" }; + public static readonly Npc KenriiSeaSorrow = new() { Ids = [4005], Name = "Kenrii Sea Sorrow", WikiUrl = "https://wiki.guildwars.com/wiki/Kenrii_Sea_Sorrow" }; + public static readonly Npc SiskaScalewand = new() { Ids = [4007], Name = "Siska Scalewand", WikiUrl = "https://wiki.guildwars.com/wiki/Siska_Scalewand" }; + public static readonly Npc SarssStormscale = new() { Ids = [4009], Name = "Sarss Stormscale", WikiUrl = "https://wiki.guildwars.com/wiki/Sarss,_Stormscale" }; + public static readonly Npc SskaiDragonsBirth = new() { Ids = [4011], Name = "Sskai Dragon's Birth", WikiUrl = "https://wiki.guildwars.com/wiki/Sskai,_Dragon%27s_Birth" }; + public static readonly Npc SsynCoiledGrasp = new() { Ids = [4013], Name = "Ssyn Coiled Grasp", WikiUrl = "https://wiki.guildwars.com/wiki/Ssyn_Coiled_Grasp" }; + public static readonly Npc ScuttleFish = new() { Ids = [4018], Name = "Scuttle Fish", WikiUrl = "https://wiki.guildwars.com/wiki/Scuttle_Fish" }; + public static readonly Npc CreepingCarp = new() { Ids = [4020], Name = "Creeping Carp", WikiUrl = "https://wiki.guildwars.com/wiki/Creeping_Carp" }; + public static readonly Npc Irukandji = new() { Ids = [4021], Name = "Irukandji", WikiUrl = "https://wiki.guildwars.com/wiki/Irukandji" }; + public static readonly Npc Yeti = new() { Ids = [4023, 4024], Name = "Yeti", WikiUrl = "https://wiki.guildwars.com/wiki/Yeti" }; + public static readonly Npc RotWallow = new() { Ids = [4025], Name = "Rot Wallow", WikiUrl = "https://wiki.guildwars.com/wiki/Rot_Wallow" }; + public static readonly Npc LeviathanClaw = new() { Ids = [4027], Name = "Leviathan Claw", WikiUrl = "https://wiki.guildwars.com/wiki/Leviathan_Claw" }; + public static readonly Npc LeviathanMouth = new() { Ids = [4028], Name = "Leviathan Mouth", WikiUrl = "https://wiki.guildwars.com/wiki/Leviathan_Mouth" }; + public static readonly Npc KrakenSpawn = new() { Ids = [4029], Name = "Kraken Spawn", WikiUrl = "https://wiki.guildwars.com/wiki/Kraken_Spawn" }; + public static readonly Npc SaltsprayDragon = new() { Ids = [4032], Name = "Saltspray Dragon", WikiUrl = "https://wiki.guildwars.com/wiki/Saltspray_Dragon" }; + public static readonly Npc Albax = new() { Ids = [4033], Name = "Albax", WikiUrl = "https://wiki.guildwars.com/wiki/Albax" }; + public static readonly Npc RockhideDragon = new() { Ids = [4034], Name = "Rockhide Dragon", WikiUrl = "https://wiki.guildwars.com/wiki/Rockhide_Dragon" }; + public static readonly Npc OutcastAssassin = new() { Ids = [4035], Name = "Outcast Assassin", WikiUrl = "https://wiki.guildwars.com/wiki/Outcast_Assassin" }; + public static readonly Npc OutcastDeathhand = new() { Ids = [4036], Name = "Outcast Deathhand", WikiUrl = "https://wiki.guildwars.com/wiki/Outcast_Deathhand" }; + public static readonly Npc OutcastWarrior = new() { Ids = [4037], Name = "Outcast Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Outcast_Warrior" }; + public static readonly Npc OutcastRitualist = new() { Ids = [4039], Name = "Outcast Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Outcast_Ritualist" }; + public static readonly Npc NagaWarrior = new() { Ids = [4042], Name = "Naga Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Naga_Warrior" }; + public static readonly Npc NagaArcher = new() { Ids = [4043], Name = "Naga Archer", WikiUrl = "https://wiki.guildwars.com/wiki/Naga_Archer" }; + public static readonly Npc NagaRitualist = new() { Ids = [4044], Name = "Naga Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Naga_Ritualist" }; + public static readonly Npc IslandGuardian = new() { Ids = [4045], Name = "Island Guardian", WikiUrl = "https://wiki.guildwars.com/wiki/Island_Guardian" }; + public static readonly Npc SenkaiLordOfThe1000DaggersGuild = new() { Ids = [4056], Name = "Senkai Lord Of The 1000 Daggers Guild", WikiUrl = "https://wiki.guildwars.com/wiki/Senkai,_Lord_of_the_1,000_Daggers_Guild" }; + public static readonly Npc RitualistsConstruct = new() { Ids = [4080, 4097], Name = "Ritualist's Construct", WikiUrl = "https://wiki.guildwars.com/wiki/Ritualist%27s_Construct" }; + public static readonly Npc AssassinsConstruct = new() { Ids = [4081, 4090], Name = "Assassin's Construct", WikiUrl = "https://wiki.guildwars.com/wiki/Assassin%27s_Construct" }; + public static readonly Npc ElementalsConstruct = new() { Ids = [4093], Name = "Elemental's Construct", WikiUrl = "https://wiki.guildwars.com/wiki/Elemental%27s_Construct" }; + public static readonly Npc RangersConstruct = new() { Ids = [4096], Name = "Ranger's Construct", WikiUrl = "https://wiki.guildwars.com/wiki/Ranger%27s_Construct" }; + public static readonly Npc ShiroTagachi = new() { Ids = [4120, 4952], Name = "Shiro Tagachi", WikiUrl = "https://wiki.guildwars.com/wiki/Shiro_Tagachi" }; + public static readonly Npc ShirokenAssassin = new() { Ids = [4125], Name = "Shiro'ken Assassin", WikiUrl = "https://wiki.guildwars.com/wiki/Shiro%27ken_Assassin" }; + public static readonly Npc ShirokenNecromancer = new() { Ids = [4127], Name = "Shiro'ken Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Shiro%27ken_Necromancer" }; + public static readonly Npc ShirokenWarrior = new() { Ids = [4130], Name = "Shiro'ken Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Shiro%27ken_Warrior" }; + public static readonly Npc ShirokenRanger = new() { Ids = [4131], Name = "Shiro'ken Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Shiro%27ken_Ranger" }; + public static readonly Npc SpiritOfPortals = new() { Ids = [4133], Name = "Spirit Of Portals", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Portals" }; + public static readonly Npc XuekaoTheDeceptive = new() { Ids = [4174], Name = "Xuekao The Deceptive", WikiUrl = "https://wiki.guildwars.com/wiki/Xuekao,_the_Deceptive" }; + public static readonly Npc MinaShatterStorm = new() { Ids = [4176], Name = "Mina Shatter Storm", WikiUrl = "https://wiki.guildwars.com/wiki/Mina_Shatter_Storm" }; + public static readonly Npc AmFahLeader = new() { Ids = [4179], Name = "Am Fah Leader", WikiUrl = "https://wiki.guildwars.com/wiki/Am_Fah_Leader" }; + public static readonly Npc MeynsangTheSadistic = new() { Ids = [4181], Name = "Meynsang The Sadistic", WikiUrl = "https://wiki.guildwars.com/wiki/Meynsang_the_Sadistic" }; + public static readonly Npc JinThePurifier = new() { Ids = [4184], Name = "Jin The Purifier", WikiUrl = "https://wiki.guildwars.com/wiki/Jin,_the_Purifier" }; + public static readonly Npc LianDragonsPetal = new() { Ids = [4186], Name = "Lian Dragon's Petal", WikiUrl = "https://wiki.guildwars.com/wiki/Lian,_Dragon%27s_Petal" }; + public static readonly Npc ShenTheMagistrate = new() { Ids = [4187], Name = "Shen The Magistrate", WikiUrl = "https://wiki.guildwars.com/wiki/Shen,_the_Magistrate" }; + public static readonly Npc WingThreeBlade = new() { Ids = [4188], Name = "Wing Three Blade", WikiUrl = "https://wiki.guildwars.com/wiki/Wing,_Three_Blade" }; + public static readonly Npc AmFahNecromancer = new() { Ids = [4192], Name = "Am Fah Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Am_Fah_Necromancer" }; + public static readonly Npc AmFahHealer = new() { Ids = [4193], Name = "Am Fah Healer", WikiUrl = "https://wiki.guildwars.com/wiki/Am_Fah_Healer" }; + public static readonly Npc AmFahMarksman = new() { Ids = [4194], Name = "Am Fah Marksman", WikiUrl = "https://wiki.guildwars.com/wiki/Am_Fah_Marksman" }; + public static readonly Npc JadeBrotherhoodMesmer = new() { Ids = [4195], Name = "Jade Brotherhood Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Brotherhood_Mesmer" }; + public static readonly Npc JadeBrotherhoodMage = new() { Ids = [4196], Name = "Jade Brotherhood Mage", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Brotherhood_Mage" }; + public static readonly Npc JadeBrotherhoodKnight = new() { Ids = [4197], Name = "Jade Brotherhood Knight", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Brotherhood_Knight" }; + public static readonly Npc JadeBrotherhoodRitualist = new() { Ids = [4198], Name = "Jade Brotherhood Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Jade_Brotherhood_Ritualist" }; + public static readonly Npc SpiritOfPain = new() { Ids = [4214], Name = "Spirit Of Pain", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Pain" }; + public static readonly Npc SpiritOfDestruction = new() { Ids = [4215], Name = "Spirit Of Destruction", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Destruction" }; + public static readonly Npc SpiritOfUnion = new() { Ids = [4217, 4224], Name = "Spirit Of Union", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Union" }; + public static readonly Npc SpiritOfLife = new() { Ids = [4218], Name = "Spirit Of Life", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Life" }; + public static readonly Npc SpiritOfBloodSong = new() { Ids = [4227], Name = "Spirit Of Blood Song", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Blood_Song" }; + public static readonly Npc SpiritOfWanderlust = new() { Ids = [4228], Name = "Spirit Of Wanderlust", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Wanderlust" }; + public static readonly Npc SpiritOfLaceration = new() { Ids = [4232], Name = "Spirit Of Laceration", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Laceration" }; + public static readonly Npc SpiritOfEquinox = new() { Ids = [4236], Name = "Spirit Of Equinox", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Equinox" }; + public static readonly Npc SpiritOfFamine = new() { Ids = [4238], Name = "Spirit Of Famine", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Famine" }; + public static readonly Npc SpiritOfBrambles = new() { Ids = [4239], Name = "Spirit Of Brambles", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Brambles" }; + public static readonly Npc Flamingo = new() { Ids = [4242], Name = "Flamingo", WikiUrl = "https://wiki.guildwars.com/wiki/Flamingo" }; + public static readonly Npc ElderCrocodile = new() { Ids = [4268], Name = "Elder Crocodile", WikiUrl = "https://wiki.guildwars.com/wiki/Elder_Crocodile" }; + public static readonly Npc TaromRockbreaker = new() { Ids = [4330], Name = "Tarom Rockbreaker", WikiUrl = "https://wiki.guildwars.com/wiki/Tarom_Rockbreaker" }; + public static readonly Npc HaiossBlessedWind = new() { Ids = [4332], Name = "Haioss Blessed Wind", WikiUrl = "https://wiki.guildwars.com/wiki/Haioss,_Blessed_Wind" }; + public static readonly Npc ChinehSoaringLight = new() { Ids = [4333], Name = "Chineh Soaring Light", WikiUrl = "https://wiki.guildwars.com/wiki/Chineh_Soaring_Light" }; + public static readonly Npc Apocrypha = new() { Ids = [4335], Name = "Apocrypha", WikiUrl = "https://wiki.guildwars.com/wiki/Apocrypha" }; + public static readonly Npc HassinSoftskin = new() { Ids = [4336], Name = "Hassin Softskin", WikiUrl = "https://wiki.guildwars.com/wiki/Hassin_Softskin" }; + public static readonly Npc SunehStormbringer = new() { Ids = [4338], Name = "Suneh Stormbringer", WikiUrl = "https://wiki.guildwars.com/wiki/Suneh_Stormbringer" }; + public static readonly Npc StalkingNephila = new() { Ids = [4346], Name = "Stalking Nephila", WikiUrl = "https://wiki.guildwars.com/wiki/Stalking_Nephila" }; + public static readonly Npc WaterDjinn = new() { Ids = [4349, 4907], Name = "Water Djinn", WikiUrl = "https://wiki.guildwars.com/wiki/Water_Djinn" }; + public static readonly Npc RinkhalMonitor = new() { Ids = [4354], Name = "Rinkhal Monitor", WikiUrl = "https://wiki.guildwars.com/wiki/Rinkhal_Monitor" }; + public static readonly Npc IrontoothDrake = new() { Ids = [4356], Name = "Irontooth Drake", WikiUrl = "https://wiki.guildwars.com/wiki/Irontooth_Drake" }; + public static readonly Npc SkreeHatchling = new() { Ids = [4360], Name = "Skree Hatchling", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Hatchling" }; + public static readonly Npc SkreeFledgeling = new() { Ids = [4361], Name = "Skree Fledgeling", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Fledgeling" }; + public static readonly Npc SkreeGriffon = new() { Ids = [4362], Name = "Skree Griffon", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Griffon" }; + public static readonly Npc SkreeTalon = new() { Ids = [4363], Name = "Skree Talon", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Talon" }; + public static readonly Npc SkreeHunter = new() { Ids = [4364], Name = "Skree Hunter", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Hunter" }; + public static readonly Npc SkreeWarbler = new() { Ids = [4365], Name = "Skree Warbler", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Warbler" }; + public static readonly Npc RidgebackSkale = new() { Ids = [4366, 4369, 4377, 4378], Name = "Ridgeback Skale", WikiUrl = "https://wiki.guildwars.com/wiki/Ridgeback_Skale" }; + public static readonly Npc SkaleLasher = new() { Ids = [4367, 4370], Name = "Skale Lasher", WikiUrl = "https://wiki.guildwars.com/wiki/Skale_Lasher" }; + public static readonly Npc SkaleBlighter = new() { Ids = [4368, 4376], Name = "Skale Blighter", WikiUrl = "https://wiki.guildwars.com/wiki/Skale_Blighter" }; + public static readonly Npc FrigidSkale = new() { Ids = [4371, 4379], Name = "Frigid Skale", WikiUrl = "https://wiki.guildwars.com/wiki/Frigid_Skale" }; + public static readonly Npc JuvenileBladedTermite = new() { Ids = [4380], Name = "Juvenile Bladed Termite", WikiUrl = "https://wiki.guildwars.com/wiki/Juvenile_Bladed_Termite" }; + public static readonly Npc GrubLance = new() { Ids = [4381], Name = "Grub Lance", WikiUrl = "https://wiki.guildwars.com/wiki/Grub_Lance" }; + public static readonly Npc BladedTermite = new() { Ids = [4382], Name = "Bladed Termite", WikiUrl = "https://wiki.guildwars.com/wiki/Bladed_Termite" }; + public static readonly Npc PreyingLance = new() { Ids = [4383], Name = "Preying Lance", WikiUrl = "https://wiki.guildwars.com/wiki/Preying_Lance" }; + public static readonly Npc StormseedJacaranda = new() { Ids = [4387, 4389, 4391], Name = "Stormseed Jacaranda", WikiUrl = "https://wiki.guildwars.com/wiki/Stormseed_Jacaranda" }; + public static readonly Npc FangedIboga = new() { Ids = [4388, 4392], Name = "Fanged Iboga", WikiUrl = "https://wiki.guildwars.com/wiki/Fanged_Iboga" }; + public static readonly Npc MandragorImp = new() { Ids = [4395, 4400, 4930], Name = "Mandragor Imp", WikiUrl = "https://wiki.guildwars.com/wiki/Mandragor_Imp" }; + public static readonly Npc MandragorSlither = new() { Ids = [4396, 4402, 4932], Name = "Mandragor Slither", WikiUrl = "https://wiki.guildwars.com/wiki/Mandragor_Slither" }; + public static readonly Npc StonefleshMandragor = new() { Ids = [4401, 4931], Name = "Stoneflesh Mandragor", WikiUrl = "https://wiki.guildwars.com/wiki/Stoneflesh_Mandragor" }; + public static readonly Npc GraspOfChaos = new() { Ids = [4404], Name = "Grasp Of Chaos", WikiUrl = "https://wiki.guildwars.com/wiki/Grasp_of_Chaos" }; + public static readonly Npc Dehjah = new() { Ids = [4406], Name = "Dehjah", WikiUrl = "https://wiki.guildwars.com/wiki/Dehjah" }; + public static readonly Npc BoklonBlackwater = new() { Ids = [4414], Name = "Boklon Blackwater", WikiUrl = "https://wiki.guildwars.com/wiki/Boklon_Blackwater" }; + public static readonly Npc GlugKlugg = new() { Ids = [4420], Name = "Glug Klugg", WikiUrl = "https://wiki.guildwars.com/wiki/Glug_Klugg" }; + public static readonly Npc ZhedShadowhoof = new() { Ids = [4437, 4940, 4440], Name = "Zhed Shadowhoof", WikiUrl = "https://wiki.guildwars.com/wiki/Zhed_Shadowhoof" }; + public static readonly Npc Tahlkora = new() { Ids = [4456, 4459], Name = "Tahlkora", WikiUrl = "https://wiki.guildwars.com/wiki/Tahlkora" }; + public static readonly Npc MasterOfWhispers = new() { Ids = [4464], Name = "Master Of Whispers", WikiUrl = "https://wiki.guildwars.com/wiki/Master_of_Whispers" }; + public static readonly Npc AcolyteJin = new() { Ids = [4469], Name = "Acolyte Jin", WikiUrl = "https://wiki.guildwars.com/wiki/Acolyte_Jin" }; + public static readonly Npc AcolyteSousuke = new() { Ids = [4487, 4490], Name = "Acolyte Sousuke", WikiUrl = "https://wiki.guildwars.com/wiki/Acolyte_Sousuke" }; + public static readonly Npc Melonni = new() { Ids = [4493, 4496], Name = "Melonni ", WikiUrl = "https://wiki.guildwars.com/wiki/Melonni" }; + public static readonly Npc Khim = new() { Ids = [4531, 4549, 4578], Name = "Khim", WikiUrl = "https://wiki.guildwars.com/wiki/Khim" }; + public static readonly Npc Herta = new() { Ids = [4532, 4537, 4544, 4551, 4566, 4576, 5989, 4586], Name = "Herta", WikiUrl = "https://wiki.guildwars.com/wiki/Herta" }; + public static readonly Npc Gehraz = new() { Ids = [4533, 4540, 4547, 4554, 4571, 4581, 4591], Name = "Gehraz", WikiUrl = "https://wiki.guildwars.com/wiki/Gehraz" }; + public static readonly Npc Sogolon = new() { Ids = [4534, 4541, 4548, 4555, 4572, 4582, 4592], Name = "Sogolon", WikiUrl = "https://wiki.guildwars.com/wiki/Sogolon" }; + public static readonly Npc Kihm = new() { Ids = [4535, 4542, 4568], Name = "Kihm", WikiUrl = "https://wiki.guildwars.com/wiki/Kihm" }; + public static readonly Npc Odurra = new() { Ids = [4536, 4543, 4550, 4563, 4573, 4583], Name = "Odurra", WikiUrl = "https://wiki.guildwars.com/wiki/Odurra" }; + public static readonly Npc Timera = new() { Ids = [4538, 4545, 4552], Name = "Timera", WikiUrl = "https://wiki.guildwars.com/wiki/Timera" }; + public static readonly Npc Abasi = new() { Ids = [4539, 4553, 4546], Name = "Abasi", WikiUrl = "https://wiki.guildwars.com/wiki/Abasi" }; + public static readonly Npc Sunspear = new() { Ids = [4698, 4726, 4727, 4774, 4778, 4779, 4781, 4782, 4784, 4786, 4811, 4739, 4738], Name = "Sunspear", WikiUrl = "https://wiki.guildwars.com/wiki/Sunspear" }; + public static readonly Npc SunspearOfficer = new() { Ids = [4700, 4701, 4705, 4723], Name = "Sunspear Officer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Istani" }; + public static readonly Npc Dzajo = new() { Ids = [4702], Name = "Dzajo", WikiUrl = "https://wiki.guildwars.com/wiki/Dzajo" }; + public static readonly Npc ShoreWatcher = new() { Ids = [4704], Name = "Shorewatcher", WikiUrl = "https://wiki.guildwars.com/wiki/Shorewatcher" }; + public static readonly Npc YoungChild = new() { Ids = [4707, 4708], Name = "Young Child", WikiUrl = "https://wiki.guildwars.com/wiki/Young_Child" }; + public static readonly Npc IstaniNoble = new() { Ids = [4709, 4710, 4711, 4733, 4737], Name = "Istani Noble", WikiUrl = "https://wiki.guildwars.com/wiki/Istani_Noble" }; + public static readonly Npc IstaniCommoner = new() { Ids = [4712, 4713, 4715, 4722, 4724, 4725, 4729, 4730], Name = "Istani Commoner", WikiUrl = "https://wiki.guildwars.com/wiki/Istani_Commoner" }; + public static readonly Npc MonkSutoni = new() { Ids = [4719], Name = "Monk Sutoni", WikiUrl = "https://wiki.guildwars.com/wiki/Monk_Sutoni" }; + public static readonly Npc Hagon = new() { Ids = [4771], Name = "Hagon", WikiUrl = "https://wiki.guildwars.com/wiki/Hagon" }; + public static readonly Npc SunspearQuartermaster = new() { Ids = [4772], Name = "Sunspear Quartermaster", WikiUrl = "https://wiki.guildwars.com/wiki/Sunspear_Quartermaster" }; + public static readonly Npc SunspearCaster = new() { Ids = [4773], Name = "Sunspear Caster", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Istani" }; + public static readonly Npc Kina = new() { Ids = [4776], Name = "Kina", WikiUrl = "https://wiki.guildwars.com/wiki/Kina" }; + public static readonly Npc ElderSuhl = new() { Ids = [4813], Name = "Elder Suhl", WikiUrl = "https://wiki.guildwars.com/wiki/Elder_Suhl" }; + public static readonly Npc Kormir = new() { Ids = [4865, 4864], Name = "Kormir", WikiUrl = "https://wiki.guildwars.com/wiki/Kormir" }; + public static readonly Npc DzabelLandGuardian = new() { Ids = [4895], Name = "Dzabel Land Guardian", WikiUrl = "https://wiki.guildwars.com/wiki/Dzabel_Land_Guardian" }; + public static readonly Npc TheDrought = new() { Ids = [4896], Name = "The Drought", WikiUrl = "https://wiki.guildwars.com/wiki/The_Drought" }; + public static readonly Npc CrackedMesa = new() { Ids = [4904], Name = "Cracked Mesa", WikiUrl = "https://wiki.guildwars.com/wiki/Cracked_Mesa" }; + public static readonly Npc StoneShardCrag = new() { Ids = [4905], Name = "Stone Shard Crag", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Shard_Crag" }; + public static readonly Npc BloodCowlHeket = new() { Ids = [4909, 4694], Name = "Blood Cowl Heket", WikiUrl = "https://wiki.guildwars.com/wiki/Blood_Cowl_Heket" }; + public static readonly Npc BlueTongueHeket = new() { Ids = [4910, 4695], Name = "Blue Tongue Heket", WikiUrl = "https://wiki.guildwars.com/wiki/Blue_Tongue_Heket" }; + public static readonly Npc StoneaxeHeket = new() { Ids = [4911, 4696], Name = "Stoneaxe Heket", WikiUrl = "https://wiki.guildwars.com/wiki/Stoneaxe_Heket" }; + public static readonly Npc BeastSwornHeket = new() { Ids = [4912, 4697], Name = "Beast Sworn Heket", WikiUrl = "https://wiki.guildwars.com/wiki/Beast_Sworn_Heket" }; + public static readonly Npc SteelfangDrake = new() { Ids = [4918], Name = "Steelfang Drake", WikiUrl = "https://wiki.guildwars.com/wiki/Steelfang_Drake" }; + public static readonly Npc KuskaleBlighter = new() { Ids = [4919], Name = "Kuskale Blighter", WikiUrl = "https://wiki.guildwars.com/wiki/Kuskale_Blighter" }; + public static readonly Npc RidgebackKuskale = new() { Ids = [4920], Name = "Ridgeback Kuskale", WikiUrl = "https://wiki.guildwars.com/wiki/Ridgeback_Kuskale" }; + public static readonly Npc KuskaleLasher = new() { Ids = [4921], Name = "Kuskale Lasher", WikiUrl = "https://wiki.guildwars.com/wiki/Kuskale_Lasher" }; + public static readonly Npc FrigidKuskale = new() { Ids = [4922], Name = "Frigid Kuskale", WikiUrl = "https://wiki.guildwars.com/wiki/Frigid_Kuskale" }; + public static readonly Npc Droughtling = new() { Ids = [4934], Name = "Droughtling", WikiUrl = "https://wiki.guildwars.com/wiki/Droughtling" }; + public static readonly Npc XunlaiChest = new() { Ids = [5001], Name = "Xunlai Chest", WikiUrl = "https://wiki.guildwars.com/wiki/Xunlai_Chest" }; + public static readonly Npc CommanderWerishakul = new() { Ids = [5020], Name = "Commander Werishakul", WikiUrl = "https://wiki.guildwars.com/wiki/Commander_Werishakul" }; + public static readonly Npc MidshipmanBennis = new() { Ids = [5023], Name = "Midshipman Bennis", WikiUrl = "https://wiki.guildwars.com/wiki/Midshipman_Bennis" }; + public static readonly Npc AdmiralKaya = new() { Ids = [5033], Name = "Admiral Kaya", WikiUrl = "https://wiki.guildwars.com/wiki/Admiral_Kaya" }; + public static readonly Npc CorsairWizard = new() { Ids = [5034], Name = "Corsair Wizard", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Wizard" }; + public static readonly Npc CorsairBlackhand = new() { Ids = [5035], Name = "Corsair Blackhand", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Blackhand" }; + public static readonly Npc CorsairCook = new() { Ids = [5036], Name = "Corsair Cook", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Cook" }; + public static readonly Npc CorsairBosun = new() { Ids = [5037, 5063], Name = "Corsair Bosun", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Bosun" }; + public static readonly Npc CorsairRaider = new() { Ids = [5041, 5065], Name = "Corsair Raider", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Raider" }; + public static readonly Npc CorsairParagon = new() { Ids = [5043], Name = "Corsair Paragon", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Istani" }; + public static readonly Npc CorsairMindReader = new() { Ids = [5044], Name = "Corsair Mind Reader", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Mind_Reader" }; + public static readonly Npc CorsairDoctor = new() { Ids = [5047], Name = "Corsair Doctor", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Doctor" }; + public static readonly Npc CorsairWeaponsMaster = new() { Ids = [5048], Name = "Corsair Weapons Master", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Weapons_Master" }; + public static readonly Npc CorsairGrappler = new() { Ids = [5050], Name = "Corsair Grappler", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Grappler" }; + public static readonly Npc CorsairAdmiral = new() { Ids = [5051], Name = "Corsair Admiral", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Admiral" }; + public static readonly Npc CorsairSeer = new() { Ids = [5052], Name = "Corsair Seer", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Seer" }; + public static readonly Npc CorsairFlogger = new() { Ids = [5053], Name = "Corsair Flogger", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Flogger" }; + public static readonly Npc CorsairReefFinder = new() { Ids = [5054], Name = "Corsair Reef Finder", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Reef_Finder" }; + public static readonly Npc CorsairMedic = new() { Ids = [5055], Name = "Corsair Medic", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Medic" }; + public static readonly Npc CorsairThug = new() { Ids = [5056], Name = "Corsair Thug", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Thug" }; + public static readonly Npc CorsairLookout = new() { Ids = [5057], Name = "Corsair Lookout", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Lookout" }; + public static readonly Npc CorsairMarauder = new() { Ids = [5058], Name = "Corsair Marauder", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Marauder" }; + public static readonly Npc CorsairCaptain = new() { Ids = [5059], Name = "Corsair Captain", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Captain" }; + public static readonly Npc CorsairCutthroat = new() { Ids = [5064], Name = "Corsair Cutthroat", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Cutthroat" }; + public static readonly Npc CorsairBerserker = new() { Ids = [5066], Name = "Corsair Berserker", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Berserker" }; + public static readonly Npc CorsairCommandant = new() { Ids = [5067], Name = "Corsair Commandant", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Commandant" }; + public static readonly Npc Corsair = new() { Ids = [5072, 5079], Name = "Corsair", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair" }; + public static readonly Npc GatekeeperKahno = new() { Ids = [5073], Name = "Gatekeeper Kahno", WikiUrl = "https://wiki.guildwars.com/wiki/Gatekeeper_Kahno" }; + public static readonly Npc UnluckySimon = new() { Ids = [5074], Name = "Unlucky Simon", WikiUrl = "https://wiki.guildwars.com/wiki/Unlucky_Simon" }; + public static readonly Npc CorsairWarrior = new() { Ids = [5076], Name = "Corsair Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Istani" }; + public static readonly Npc IronhookHube = new() { Ids = [5077], Name = "Ironhook Hube", WikiUrl = "https://wiki.guildwars.com/wiki/Ironhook_Hube" }; + public static readonly Npc OneEyedRugger = new() { Ids = [5078], Name = "One-Eyed Rugger", WikiUrl = "https://wiki.guildwars.com/wiki/One-Eyed_Rugger" }; + public static readonly Npc OrderOfWhispers = new() { Ids = [5218, 5683], Name = "Order Of Whispers", WikiUrl = "https://wiki.guildwars.com/wiki/Order_of_Whispers" }; + public static readonly Npc ColonelChaklin = new() { Ids = [5229], Name = "Colonel Chaklin", WikiUrl = "https://wiki.guildwars.com/wiki/Colonel_Chaklin" }; + public static readonly Npc ColonelCusto = new() { Ids = [5230], Name = "Colonel Custo", WikiUrl = "https://wiki.guildwars.com/wiki/Colonel_Custo" }; + public static readonly Npc CorporalLuluh = new() { Ids = [5231], Name = "Corporal Luluh", WikiUrl = "https://wiki.guildwars.com/wiki/Corporal_Luluh" }; + public static readonly Npc AcolyteofDwayna = new() { Ids = [5237], Name = "Acolyte of Dwayna", WikiUrl = "https://wiki.guildwars.com/wiki/Acolyte_of_Dwayna" }; + public static readonly Npc GeneralKahyet = new() { Ids = [5241], Name = "General Kahyet", WikiUrl = "https://wiki.guildwars.com/wiki/General_Kahyet" }; + public static readonly Npc CaptainBesuz = new() { Ids = [5271], Name = "Captain Besuz", WikiUrl = "https://wiki.guildwars.com/wiki/Captain_Besuz" }; + public static readonly Npc DreamerHahla = new() { Ids = [5278], Name = "Dreamer Hahla", WikiUrl = "https://wiki.guildwars.com/wiki/Dreamer_Hahla" }; + public static readonly Npc KournanSpotter = new() { Ids = [5282], Name = "Kournan Spotter", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Spotter" }; + public static readonly Npc KournanEngineer = new() { Ids = [5305], Name = "Kournan Engineer", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Engineer" }; + public static readonly Npc KournanSeer = new() { Ids = [5321, 5319], Name = "Kournan Seer", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Seer" }; + public static readonly Npc KournanOppressor = new() { Ids = [5325, 5323], Name = "Kournan Oppressor", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Oppressor" }; + public static readonly Npc KournanScribe = new() { Ids = [5329, 5327], Name = "Kournan Scribe", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Scribe" }; + public static readonly Npc KournanPriest = new() { Ids = [5333, 5331], Name = "Kournan Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Priest" }; + public static readonly Npc KournanGuard = new() { Ids = [5336, 5340, 5364, 5365, 5370, 5337, 5368], Name = "Kournan Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Guard" }; + public static readonly Npc KournanBowman = new() { Ids = [5345, 5343], Name = "Kournan Bowman", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Bowman" }; + public static readonly Npc KournanZealot = new() { Ids = [5349, 5347], Name = "Kournan Zealot", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Zealot" }; + public static readonly Npc KournanPhalanx = new() { Ids = [5351, 5354], Name = "Kournan Phalanx", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Phalanx" }; + public static readonly Npc KournanFieldCommander = new() { Ids = [5353], Name = "Kournan Field Commander", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Field_Commander" }; + public static readonly Npc KournanChild = new() { Ids = [5362, 5363], Name = "Kournan Child", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Child" }; + public static readonly Npc KournanNoble = new() { Ids = [5373, 5374], Name = "Kournan Noble", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Noble" }; + public static readonly Npc KournanPeasant = new() { Ids = [5375, 5376, 5377, 5378, 5379, 5380], Name = "Kournan Peasant", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Peasant" }; + public static readonly Npc WanderingPriest = new() { Ids = [5383, 5384], Name = "Wandering Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Wandering_Priest" }; + public static readonly Npc Ashnod = new() { Ids = [5389], Name = "Ashnod", WikiUrl = "https://wiki.guildwars.com/wiki/Ashnod" }; + public static readonly Npc Raleva = new() { Ids = [5390], Name = "Raleva", WikiUrl = "https://wiki.guildwars.com/wiki/Raleva" }; + public static readonly Npc KournanTrader = new() { Ids = [5402, 5396, 5397, 5400], Name = "Kournan Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kournans" }; + public static readonly Npc HarbingerOfTwilight = new() { Ids = [5405, 5409], Name = "Harbinger Of Twilight", WikiUrl = "https://wiki.guildwars.com/wiki/Harbinger_of_Twilight" }; + public static readonly Npc RestlessDead = new() { Ids = [5541], Name = "Restless Dead", WikiUrl = "https://wiki.guildwars.com/wiki/Restless_Dead" }; + public static readonly Npc RelentlessCorpse = new() { Ids = [5542], Name = "Relentless Corpse", WikiUrl = "https://wiki.guildwars.com/wiki/Relentless_Corpse" }; + public static readonly Npc GhostlySunspearCommander = new() { Ids = [5545], Name = "Ghostly Sunspear Commander", WikiUrl = "https://wiki.guildwars.com/wiki/Ghostly_Sunspear_Commander" }; + public static readonly Npc Kahdash = new() { Ids = [5546], Name = "Kahdash", WikiUrl = "https://wiki.guildwars.com/wiki/Kahdash" }; + public static readonly Npc VabbianGuard = new() { Ids = [5632, 5639, 5645, 5634, 5647, 5637], Name = "Vabbian Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Vabbian_Guard" }; + public static readonly Npc VabbianChild = new() { Ids = [5649, 5648], Name = "Vabbian Child", WikiUrl = "https://wiki.guildwars.com/wiki/Vabbian_Child" }; + public static readonly Npc VabbianNoble = new() { Ids = [5650, 5652], Name = "Vabbian Noble", WikiUrl = "https://wiki.guildwars.com/wiki/Vabbian_Noble" }; + public static readonly Npc RoyalChefHatundo = new() { Ids = [5654], Name = "Royal Chef Hatundo", WikiUrl = "https://wiki.guildwars.com/wiki/Royal_Chef_Hatundo" }; + public static readonly Npc VabbianMerchant = new() { Ids = [5670, 5673, 5669, 5681, 5675, 5676, 5677], Name = "Vabbian Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Vabbians" }; + public static readonly Npc SpiritOfInfuriatingHeat = new() { Ids = [5715], Name = "Spirit Of Infuriating Heat", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Infuriating_Heat" }; + public static readonly Npc SpiritOfToxicity = new() { Ids = [5716], Name = "Spirit Of Toxicity", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Toxicity" }; + public static readonly Npc SpiritOfFury = new() { Ids = [5722], Name = "Spirit Of Fury", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Fury" }; + public static readonly Npc AlbinoRat = new() { Ids = [5777], Name = "Albino Rat", WikiUrl = "https://wiki.guildwars.com/wiki/Albino_Rat" }; + public static readonly Npc WhiteCrab = new() { Ids = [5778], Name = "White Crab", WikiUrl = "https://wiki.guildwars.com/wiki/White_Crab" }; + public static readonly Npc BlackWolf = new() { Ids = [5780], Name = "Black Wolf", WikiUrl = "https://wiki.guildwars.com/wiki/Black_Wolf" }; + public static readonly Npc WhiteWolf = new() { Ids = [5781], Name = "White Wolf", WikiUrl = "https://wiki.guildwars.com/wiki/White_Wolf" }; + public static readonly Npc MountainEagle = new() { Ids = [5782], Name = "Mountain Eagle", WikiUrl = "https://wiki.guildwars.com/wiki/Mountain_Eagle" }; + public static readonly Npc PolarBear = new() { Ids = [5783], Name = "Polar Bear", WikiUrl = "https://wiki.guildwars.com/wiki/Polar_Bear" }; + public static readonly Npc WhiteMoa = new() { Ids = [5784], Name = "White Moa", WikiUrl = "https://wiki.guildwars.com/wiki/White_Moa" }; + public static readonly Npc Rabbit = new() { Ids = [5842], Name = "Rabbit", WikiUrl = "https://wiki.guildwars.com/wiki/Rabbit" }; + public static readonly Npc ArcticWolf = new() { Ids = [5843], Name = "Arctic Wolf", WikiUrl = "https://wiki.guildwars.com/wiki/Arctic_Wolf" }; + public static readonly Npc Stonewolf = new() { Ids = [5844], Name = "Stonewolf", WikiUrl = "https://wiki.guildwars.com/wiki/Stonewolf" }; + public static readonly Npc Vekk = new() { Ids = [5913], Name = "Vekk", WikiUrl = "https://wiki.guildwars.com/wiki/Vekk" }; + public static readonly Npc OgdenStonehealer = new() { Ids = [5932], Name = "Ogden Stonehealer", WikiUrl = "https://wiki.guildwars.com/wiki/Ogden_Stonehealer" }; + public static readonly Npc Livia = new() { Ids = [5948], Name = "Livia", WikiUrl = "https://wiki.guildwars.com/wiki/Livia" }; + public static readonly Npc Xandra = new() { Ids = [5974], Name = "Xandra", WikiUrl = "https://wiki.guildwars.com/wiki/Xandra" }; + public static readonly Npc Jora = new() { Ids = [5983], Name = "Jora", WikiUrl = "https://wiki.guildwars.com/wiki/Jora" }; + public static readonly Npc Bartholos = new() { Ids = [6058], Name = "Bartholos", WikiUrl = "https://wiki.guildwars.com/wiki/Bartholos" }; + public static readonly Npc ShiningBladeCaster = new() { Ids = [6064], Name = "Shining Blade Caster", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; + public static readonly Npc KilroyStonekin = new() { Ids = [6174], Name = "Kilroy Stonekin", WikiUrl = "https://wiki.guildwars.com/wiki/Kilroy_Stonekin" }; + public static readonly Npc DwarvenMiner = new() { Ids = [6181], Name = "Dwarven Miner", WikiUrl = "https://wiki.guildwars.com/wiki/Dwarven_Miner" }; + public static readonly Npc WildermWrathspew = new() { Ids = [6256], Name = "Wilderm Wrathspew", WikiUrl = "https://wiki.guildwars.com/wiki/Wilderm_Wrathspew" }; + public static readonly Npc FlanussBroadwing = new() { Ids = [6258], Name = "Flanuss Broadwing", WikiUrl = "https://wiki.guildwars.com/wiki/Flanuss_Broadwing" }; + public static readonly Npc MobrinLordOfTheMarsh = new() { Ids = [6261], Name = "Mobrin Lord Of The Marsh", WikiUrl = "https://wiki.guildwars.com/wiki/Mobrin,_Lord_of_the_Marsh" }; + public static readonly Npc PywattTheSwift = new() { Ids = [6262], Name = "Pywatt The Swift", WikiUrl = "https://wiki.guildwars.com/wiki/Pywatt_the_Swift" }; + public static readonly Npc BrynnEarthporter = new() { Ids = [6268], Name = "Brynn Earthporter", WikiUrl = "https://wiki.guildwars.com/wiki/Brynn_Earthporter" }; + public static readonly Npc KraitHypnoss = new() { Ids = [6287], Name = "Krait Hypnoss", WikiUrl = "https://wiki.guildwars.com/wiki/Krait_Hypnoss" }; + public static readonly Npc KraitArcanoss = new() { Ids = [6288], Name = "Krait Arcanoss", WikiUrl = "https://wiki.guildwars.com/wiki/Krait_Arcanoss" }; + public static readonly Npc KraitDevouss = new() { Ids = [6289], Name = "Krait Devouss", WikiUrl = "https://wiki.guildwars.com/wiki/Krait_Devouss" }; + public static readonly Npc KraitNecross = new() { Ids = [6290], Name = "Krait Necross", WikiUrl = "https://wiki.guildwars.com/wiki/Krait_Necross" }; + public static readonly Npc KraitNeoss = new() { Ids = [6293], Name = "Krait Neoss", WikiUrl = "https://wiki.guildwars.com/wiki/Krait_Neoss" }; + public static readonly Npc SavageOakheart = new() { Ids = [6301], Name = "Savage Oakheart", WikiUrl = "https://wiki.guildwars.com/wiki/Savage_Oakheart" }; + public static readonly Npc SkelkAfflictor = new() { Ids = [6303], Name = "Skelk Afflictor", WikiUrl = "https://wiki.guildwars.com/wiki/Skelk_Afflictor" }; + public static readonly Npc SkelkScourger = new() { Ids = [6304], Name = "Skelk Scourger", WikiUrl = "https://wiki.guildwars.com/wiki/Skelk_Scourger" }; + public static readonly Npc SkelkReaper = new() { Ids = [6305], Name = "Skelk Reaper", WikiUrl = "https://wiki.guildwars.com/wiki/Skelk_Reaper" }; + public static readonly Npc Angorodon = new() { Ids = [6306], Name = "Angorodon", WikiUrl = "https://wiki.guildwars.com/wiki/Angorodon" }; + public static readonly Npc Ferothrax = new() { Ids = [6307], Name = "Ferothrax", WikiUrl = "https://wiki.guildwars.com/wiki/Ferothrax" }; + public static readonly Npc Ceratadon = new() { Ids = [6308], Name = "Ceratadon", WikiUrl = "https://wiki.guildwars.com/wiki/Ceratadon" }; + public static readonly Npc Tyrannus = new() { Ids = [6309], Name = "Tyrannus", WikiUrl = "https://wiki.guildwars.com/wiki/Tyrannus" }; + public static readonly Npc Raptor = new() { Ids = [6310], Name = "Raptor", WikiUrl = "https://wiki.guildwars.com/wiki/Raptor" }; + public static readonly Npc AgariTlamatini = new() { Ids = [6316], Name = "Agari Tlamatini", WikiUrl = "https://wiki.guildwars.com/wiki/Agari_Tlamatini" }; + public static readonly Npc AgariAmini = new() { Ids = [6317], Name = "Agari Amini", WikiUrl = "https://wiki.guildwars.com/wiki/Agari_Amini" }; + public static readonly Npc AgariNahualli = new() { Ids = [6318], Name = "Agari Nahualli", WikiUrl = "https://wiki.guildwars.com/wiki/Agari_Nahualli" }; + public static readonly Npc AgariCuicani = new() { Ids = [6319], Name = "Agari Cuicani", WikiUrl = "https://wiki.guildwars.com/wiki/Agari_Cuicani" }; + public static readonly Npc Bloodweaver = new() { Ids = [6328, 6329], Name = "Bloodweaver", WikiUrl = "https://wiki.guildwars.com/wiki/Bloodweaver" }; + public static readonly Npc Lifeweaver = new() { Ids = [6330, 6331], Name = "Lifeweaver", WikiUrl = "https://wiki.guildwars.com/wiki/Lifeweaver" }; + public static readonly Npc Venomweaver = new() { Ids = [6333], Name = "Venomweaver", WikiUrl = "https://wiki.guildwars.com/wiki/Venomweaver" }; + public static readonly Npc CloudtouchedSimian = new() { Ids = [6334], Name = "Cloudtouched Simian", WikiUrl = "https://wiki.guildwars.com/wiki/Cloudtouched_Simian" }; + public static readonly Npc RedhandSimian = new() { Ids = [6335], Name = "Redhand Simian", WikiUrl = "https://wiki.guildwars.com/wiki/Redhand_Simian" }; + public static readonly Npc QuetzalSly = new() { Ids = [6337], Name = "Quetzal Sly", WikiUrl = "https://wiki.guildwars.com/wiki/Quetzal_Sly" }; + public static readonly Npc QuetzalDark = new() { Ids = [6338], Name = "Quetzal Dark", WikiUrl = "https://wiki.guildwars.com/wiki/Quetzal_Dark" }; + public static readonly Npc QuetzalStark = new() { Ids = [6339], Name = "Quetzal Stark", WikiUrl = "https://wiki.guildwars.com/wiki/Quetzal_Stark" }; + public static readonly Npc QuetzalKeen = new() { Ids = [6340], Name = "Quetzal Keen", WikiUrl = "https://wiki.guildwars.com/wiki/Quetzal_Keen" }; + public static readonly Npc SifShadowhunter = new() { Ids = [6347, 6348], Name = "Sif Shadowhunter", WikiUrl = "https://wiki.guildwars.com/wiki/Sif_Shadowhunter" }; + public static readonly Npc NornCommoner = new() { Ids = [6349, 6385, 6390, 6398, 6404], Name = "Norn Commoner", WikiUrl = "https://wiki.guildwars.com/wiki/Norn_Commoner" }; + public static readonly Npc OlafOlafson = new() { Ids = [6352], Name = "Olaf Olafson", WikiUrl = "https://wiki.guildwars.com/wiki/Olaf_Olafson" }; + public static readonly Npc GunnarPoundfist = new() { Ids = [6353], Name = "Gunnar Poundfist", WikiUrl = "https://wiki.guildwars.com/wiki/Gunnar_Poundfist" }; + public static readonly Npc NornGuard = new() { Ids = [6357, 6380], Name = "Norn Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Norn_Guard" }; + public static readonly Npc NornWarrior = new() { Ids = [6374], Name = "Norn Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Norn_Warrior" }; + public static readonly Npc Eyja = new() { Ids = [6384], Name = "Eyja", WikiUrl = "https://wiki.guildwars.com/wiki/Eyja" }; + public static readonly Npc NornTrader = new() { Ids = [6387, 6392, 6393, 6394, 6395, 6396, 6399, 6400], Name = "Norn Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Norn" }; + public static readonly Npc NornWeaponsmith = new() { Ids = [6389], Name = "Norn Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Norn" }; + public static readonly Npc NornElder = new() { Ids = [6397], Name = "Norn Elder", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Norn" }; + public static readonly Npc GlacialGriffon = new() { Ids = [6411], Name = "Glacial Griffon", WikiUrl = "https://wiki.guildwars.com/wiki/Glacial_Griffon" }; + public static readonly Npc SavageNornbear = new() { Ids = [6418], Name = "Savage Nornbear", WikiUrl = "https://wiki.guildwars.com/wiki/Savage_Nornbear" }; + public static readonly Npc InscribedEttin = new() { Ids = [6432], Name = "Inscribed Ettin", WikiUrl = "https://wiki.guildwars.com/wiki/Inscribed_Ettin" }; + public static readonly Npc NulfastuEarthbound = new() { Ids = [6445], Name = "Nulfastu Earthbound", WikiUrl = "https://wiki.guildwars.com/wiki/Nulfastu_Earthbound" }; + public static readonly Npc MyishLadyOfTheLake = new() { Ids = [6447], Name = "Myish Lady Of The Lake", WikiUrl = "https://wiki.guildwars.com/wiki/Myish,_Lady_of_the_Lake" }; + public static readonly Npc Whiteout = new() { Ids = [6448], Name = "Whiteout", WikiUrl = "https://wiki.guildwars.com/wiki/Whiteout" }; + public static readonly Npc AvarrTheFallen = new() { Ids = [6454], Name = "Avarr The Fallen", WikiUrl = "https://wiki.guildwars.com/wiki/Avarr_The_Fallen" }; + public static readonly Npc ModniirPriest = new() { Ids = [6473], Name = "Modniir Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Modniir_Priest" }; + public static readonly Npc ModniirBerserker = new() { Ids = [6475], Name = "Modniir Berserker", WikiUrl = "https://wiki.guildwars.com/wiki/Modniir_Berserker" }; + public static readonly Npc ModniirHunter = new() { Ids = [6476], Name = "Modniir Hunter", WikiUrl = "https://wiki.guildwars.com/wiki/Modniir_Hunter" }; + public static readonly Npc Avalanche = new() { Ids = [6477], Name = "Avalanche", WikiUrl = "https://wiki.guildwars.com/wiki/Avalanche" }; + public static readonly Npc FrozenElemental = new() { Ids = [6478], Name = "Frozen Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Frozen_Elemental" }; + public static readonly Npc ChillingWisp = new() { Ids = [6479], Name = "Chilling Wisp", WikiUrl = "https://wiki.guildwars.com/wiki/Chilling_Wisp" }; + public static readonly Npc JotunSkullsmasher = new() { Ids = [6480], Name = "Jotun Skullsmasher", WikiUrl = "https://wiki.guildwars.com/wiki/Jotun_Skullsmasher" }; + public static readonly Npc JotunMindbreaker = new() { Ids = [6481], Name = "Jotun Mindbreaker", WikiUrl = "https://wiki.guildwars.com/wiki/Jotun_Mindbreaker" }; + public static readonly Npc JotunBladeturner = new() { Ids = [6482], Name = "Jotun Bladeturner", WikiUrl = "https://wiki.guildwars.com/wiki/Jotun_Bladeturner" }; + public static readonly Npc JotunBloodcurdler = new() { Ids = [6483], Name = "Jotun Bloodcurdler", WikiUrl = "https://wiki.guildwars.com/wiki/Jotun_Bloodcurdler" }; + public static readonly Npc BerserkingWendigo = new() { Ids = [6484], Name = "Berserking Wendigo", WikiUrl = "https://wiki.guildwars.com/wiki/Berserking_Wendigo" }; + public static readonly Npc BerserkingAuroch = new() { Ids = [6485], Name = "Berserking Auroch", WikiUrl = "https://wiki.guildwars.com/wiki/Berserking_Aurochs" }; + public static readonly Npc BerserkingMinotaur = new() { Ids = [6486], Name = "Berserking Minotaur", WikiUrl = "https://wiki.guildwars.com/wiki/Berserking_Minotaur" }; + public static readonly Npc BerserkingBison = new() { Ids = [6487], Name = "Berserking Bison", WikiUrl = "https://wiki.guildwars.com/wiki/Berserking_Bison" }; + public static readonly Npc MountainPinesoul = new() { Ids = [6488], Name = "Mountain Pinesoul", WikiUrl = "https://wiki.guildwars.com/wiki/Mountain_Pinesoul" }; + public static readonly Npc MountainAloe = new() { Ids = [6489], Name = "Mountain Aloe", WikiUrl = "https://wiki.guildwars.com/wiki/Mountain_Aloe" }; + public static readonly Npc SpectralVaettir = new() { Ids = [6490], Name = "Spectral Vaettir", WikiUrl = "https://wiki.guildwars.com/wiki/Spectral_Vaettir" }; + public static readonly Npc FrostWurm = new() { Ids = [6491], Name = "Frost Wurm", WikiUrl = "https://wiki.guildwars.com/wiki/Frost_Wurm" }; + public static readonly Npc CharrProphet = new() { Ids = [6624], Name = "Charr Prophet", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Prophet" }; + public static readonly Npc FronisIrontoe = new() { Ids = [6690], Name = "Fronis Irontoe", WikiUrl = "https://wiki.guildwars.com/wiki/Fronis_Irontoe" }; + public static readonly Npc StoneSummitRanger = new() { Ids = [6695], Name = "Stone Summit Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Ranger" }; + public static readonly Npc StoneSummitHealer = new() { Ids = [6699], Name = "Stone Summit Healer", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Healer" }; + public static readonly Npc StoneSummitCrusher = new() { Ids = [6702, 6993, 2645], Name = "Stone Summit Crusher", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Crusher" }; + public static readonly Npc AsuranMaterialTrader = new() { Ids = [6712], Name = "Asuran Material Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Asura" }; + public static readonly Npc Lork = new() { Ids = [6718], Name = "Lork", WikiUrl = "https://wiki.guildwars.com/wiki/Lork" }; + public static readonly Npc Gadd = new() { Ids = [6721], Name = "Gadd", WikiUrl = "https://wiki.guildwars.com/wiki/Gadd" }; + public static readonly Npc PurifierKreweMember = new() { Ids = [6756], Name = "Purifier Krewe Member", WikiUrl = "https://wiki.guildwars.com/wiki/Purifier_Krewe_Member" }; + public static readonly Npc Blorf = new() { Ids = [6757], Name = "Blorf", WikiUrl = "https://wiki.guildwars.com/wiki/Blorf" }; + public static readonly Npc AsuranElder = new() { Ids = [6771], Name = "Asuran Elder", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Asura" }; + public static readonly Npc AsuranRuneTrader = new() { Ids = [6774], Name = "Asuran Rune Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Asura" }; + public static readonly Npc Asuran = new() { Ids = [6775], Name = "Asuran", WikiUrl = "https://wiki.guildwars.com/wiki/Asuran" }; + public static readonly Npc AsuranChild = new() { Ids = [6777], Name = "Asuran Child", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Asura" }; + public static readonly Npc Fonk = new() { Ids = [6782], Name = "Fonk", WikiUrl = "https://wiki.guildwars.com/wiki/Fonk" }; + public static readonly Npc EnchantedScythe = new() { Ids = [6815], Name = "Enchanted Scythe", WikiUrl = "https://wiki.guildwars.com/wiki/Enchanted_Scythe" }; + public static readonly Npc EnchantedShield = new() { Ids = [6816], Name = "Enchanted Shield", WikiUrl = "https://wiki.guildwars.com/wiki/Enchanted_Shield" }; + public static readonly Npc DredgeCaster = new() { Ids = [6837], Name = "Dredge Caster", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Dredge" }; + public static readonly Npc BloodthirstIncubus = new() { Ids = [6845], Name = "Bloodthirst Incubus", WikiUrl = "https://wiki.guildwars.com/wiki/Bloodthirst_Incubus" }; + public static readonly Npc CryptwingIncubus = new() { Ids = [6849], Name = "Cryptwing Incubus", WikiUrl = "https://wiki.guildwars.com/wiki/Cryptwing_Incubus" }; + public static readonly Npc StormcloudIncubus = new() { Ids = [6851], Name = "Stormcloud Incubus", WikiUrl = "https://wiki.guildwars.com/wiki/Stormcloud_Incubus" }; + public static readonly Npc SkelkSlasher = new() { Ids = [6853], Name = "Skelk Slasher", WikiUrl = "https://wiki.guildwars.com/wiki/Skelk_Slasher" }; + public static readonly Npc SkelkCorrupter = new() { Ids = [6854], Name = "Skelk Corrupter", WikiUrl = "https://wiki.guildwars.com/wiki/Skelk_Corrupter" }; + public static readonly Npc SkelkRampager = new() { Ids = [6855], Name = "Skelk Rampager", WikiUrl = "https://wiki.guildwars.com/wiki/Skelk_Rampager" }; + public static readonly Npc EnchantedAxe = new() { Ids = [6862], Name = "Enchanted Axe", WikiUrl = "https://wiki.guildwars.com/wiki/Enchanted_Axe" }; + public static readonly Npc ShimmeringOoze = new() { Ids = [6888, 6889, 6890], Name = "Shimmering Ooze", WikiUrl = "https://wiki.guildwars.com/wiki/Shimmering_Ooze" }; + public static readonly Npc OminousOoze = new() { Ids = [6891], Name = "Ominous Ooze", WikiUrl = "https://wiki.guildwars.com/wiki/Ominous_Ooze" }; + public static readonly Npc EarthboundOoze = new() { Ids = [6894, 6896], Name = "Earthbound Ooze", WikiUrl = "https://wiki.guildwars.com/wiki/Earthbound_Ooze" }; + public static readonly Npc CorruptedAloe = new() { Ids = [6905], Name = "Corrupted Aloe", WikiUrl = "https://wiki.guildwars.com/wiki/Corrupted_Aloe" }; + public static readonly Npc FungalBloom = new() { Ids = [6906], Name = "Fungal Bloom", WikiUrl = "https://wiki.guildwars.com/wiki/Fungal_Bloom" }; + public static readonly Npc InscribedGuardian = new() { Ids = [6909], Name = "Inscribed Guardian", WikiUrl = "https://wiki.guildwars.com/wiki/Inscribed_Guardian" }; + public static readonly Npc FragmentOfAntiquities = new() { Ids = [6933], Name = "Fragment Of Antiquities", WikiUrl = "https://wiki.guildwars.com/wiki/Fragment_of_Antiquities" }; + public static readonly Npc RemnantOfAntiquities = new() { Ids = [6934], Name = "Remnant Of Antiquities", WikiUrl = "https://wiki.guildwars.com/wiki/Remnant_of_Antiquities" }; + public static readonly Npc RegentOfIce = new() { Ids = [6935], Name = "Regent Of Ice", WikiUrl = "https://wiki.guildwars.com/wiki/Regent_of_Ice" }; + public static readonly Npc ChromaticDrake = new() { Ids = [6938], Name = "Chromatic Drake", WikiUrl = "https://wiki.guildwars.com/wiki/Chromatic_Drake" }; + public static readonly Npc TerrorbondDryder = new() { Ids = [6942], Name = "Terrorbond Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Terrorbond_Dryder" }; + public static readonly Npc DreadgazeDryder = new() { Ids = [6943], Name = "Dreadgaze Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Dreadgaze_Dryder" }; + public static readonly Npc BloodtaintDryder = new() { Ids = [6944], Name = "Bloodtaint Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Bloodtaint_Dryder" }; + public static readonly Npc SoulfireDryder = new() { Ids = [6945], Name = "Soulfire Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Soulfire_Dryder" }; + public static readonly Npc ShatteredElemental = new() { Ids = [6948], Name = "Shattered Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Shattered_Elemental" }; + public static readonly Npc WhirlingWisp = new() { Ids = [6949], Name = "Whirling Wisp", WikiUrl = "https://wiki.guildwars.com/wiki/Whirling_Wisp" }; + public static readonly Npc IcyStalagmite = new() { Ids = [6950], Name = "Icy Stalagmite", WikiUrl = "https://wiki.guildwars.com/wiki/Icy_Stalagmite" }; + public static readonly Npc ShadowVaettir = new() { Ids = [6953], Name = "Shadow Vaettir", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_Vaettir" }; + public static readonly Npc ScourgeVaettir = new() { Ids = [6956], Name = "Scourge Vaettir", WikiUrl = "https://wiki.guildwars.com/wiki/Scourge_Vaettir" }; + public static readonly Npc MistVaettir = new() { Ids = [6959], Name = "Mist Vaettir", WikiUrl = "https://wiki.guildwars.com/wiki/Mist_Vaettir" }; + public static readonly Npc CursedBrigand = new() { Ids = [7009], Name = "Cursed Brigand", WikiUrl = "https://wiki.guildwars.com/wiki/Cursed_Brigand" }; + public static readonly Npc DamnedCrewman = new() { Ids = [7012], Name = "Damned Crewman", WikiUrl = "https://wiki.guildwars.com/wiki/Damned_Crewman" }; + public static readonly Npc FendiNin = new() { Ids = [7013], Name = "Fendi Nin", WikiUrl = "https://wiki.guildwars.com/wiki/Fendi_Nin" }; + public static readonly Npc SoulOfFendiNin = new() { Ids = [7014], Name = "Soul Of Fendi Nin", WikiUrl = "https://wiki.guildwars.com/wiki/Soul_of_Fendi_Nin" }; + public static readonly Npc PirateGhost = new() { Ids = [7020], Name = "Pirate Ghost", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Ghosts" }; + public static readonly Npc CryptWraith = new() { Ids = [7028], Name = "Crypt Wraith", WikiUrl = "https://wiki.guildwars.com/wiki/Crypt_Wraith" }; + public static readonly Npc ShockPhantom = new() { Ids = [7032], Name = "Shock Phantom", WikiUrl = "https://wiki.guildwars.com/wiki/Shock_Phantom" }; + public static readonly Npc SkeletonIllusionist = new() { Ids = [7036], Name = "Skeleton Illusionist", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Illusionist" }; + public static readonly Npc SkeletonWizard = new() { Ids = [7037], Name = "Skeleton Wizard", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Wizard" }; + public static readonly Npc SkeletalHound = new() { Ids = [7038], Name = "Skeletal Hound", WikiUrl = "https://wiki.guildwars.com/wiki/Skeletal_Hound" }; + public static readonly Npc SkeletonPriest = new() { Ids = [7040], Name = "Skeleton Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Priest" }; + public static readonly Npc SkeletonArcher = new() { Ids = [7041], Name = "Skeleton Archer", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Archer" }; + public static readonly Npc DecayedDragon = new() { Ids = [7042], Name = "Decayed Dragon", WikiUrl = "https://wiki.guildwars.com/wiki/Decayed_Dragon" }; + public static readonly Npc ZombieBrute = new() { Ids = [7043], Name = "Zombie Brute", WikiUrl = "https://wiki.guildwars.com/wiki/Zombie_Brute" }; + public static readonly Npc ZombieNecromancer = new() { Ids = [7044], Name = "Zombie Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/Zombie_Necromancer" }; + public static readonly Npc ChainedCleric = new() { Ids = [7046], Name = "Chained Cleric", WikiUrl = "https://wiki.guildwars.com/wiki/Chained_Cleric" }; + public static readonly Npc WintersdayMoa = new() { Ids = [7374], Name = "Wintersday Moa", WikiUrl = "https://wiki.guildwars.com/wiki/Wintersday_Moa" }; + public static readonly Npc BlessedSnowman = new() { Ids = [7376], Name = "Blessed Snowman", WikiUrl = "https://wiki.guildwars.com/wiki/Blessed_Snowman" }; + public static readonly Npc CordialSnowman = new() { Ids = [7379], Name = "Cordial Snowman", WikiUrl = "https://wiki.guildwars.com/wiki/Cordial_Snowman" }; + public static readonly Npc PiousSnowman = new() { Ids = [7386], Name = "Pious Snowman", WikiUrl = "https://wiki.guildwars.com/wiki/Pious_Snowman" }; + public static readonly Npc AngrySnowman = new() { Ids = [7411], Name = "Angry Snowman", WikiUrl = "https://wiki.guildwars.com/wiki/Angry_Snowman" }; + public static readonly Npc JackFrost = new() { Ids = [7435], Name = "Jack Frost", WikiUrl = "https://wiki.guildwars.com/wiki/Jack_Frost" }; + public static readonly Npc ValgarTempestcrafter = new() { Ids = [7604], Name = "Valgar Tempestcrafter", WikiUrl = "https://wiki.guildwars.com/wiki/Valgar_Tempestcrafter" }; + public static readonly Npc NicholasSandford = new() { Ids = [7659], Name = "Nicholas Sandford", WikiUrl = "https://wiki.guildwars.com/wiki/Nicholas_Sandford" }; + public static readonly Npc ProfessorYakkington = new() { Ids = [7660], Name = "Professor Yakkington", WikiUrl = "https://wiki.guildwars.com/wiki/Professor_Yakkington" }; + public static readonly Npc PinkDyeVendor = new() { Ids = [7670], Name = "Pink Dye Vendor", WikiUrl = "https://wiki.guildwars.com/wiki/Sadie_Salvitas" }; + public static readonly Npc Zenjal = new() { Ids = [7748], Name = "Zenjal", WikiUrl = "https://wiki.guildwars.com/wiki/Zenjal" }; + public static readonly Npc LieutenantLangmar = new() { Ids = [7757], Name = "Lieutenant Langmar", WikiUrl = "https://wiki.guildwars.com/wiki/Lieutenant_Langmar" }; + public static readonly Npc BlazefiendGriefblade = new() { Ids = [7795], Name = "Blazefiend Griefblade", WikiUrl = "https://wiki.guildwars.com/wiki/Blazefiend_Griefblade" }; + public static readonly Npc CharrStalker = new() { Ids = [7801], Name = "Charr Stalker", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Stalker" }; + public static readonly Npc CharrFireCaller = new() { Ids = [7803, 1643], Name = "Charr Fire Caller", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Fire_Caller" }; + public static readonly Npc ForemanTheCrier = new() { Ids = [7974, 7974], Name = "Foreman The Crier", WikiUrl = "https://wiki.guildwars.com/wiki/Foreman_the_Crier" }; + public static readonly Npc Salma = new() { Ids = [7987], Name = "Salma", WikiUrl = "https://wiki.guildwars.com/wiki/Salma" }; + public static readonly Npc ScoutMelthoran = new() { Ids = [8054], Name = "Scout Melthoran", WikiUrl = "https://wiki.guildwars.com/wiki/Scout_Melthoran" }; + public static readonly Npc ShiningBladeRecruit = new() { Ids = [8058, 8059], Name = "Shining Blade Recruit", WikiUrl = "https://wiki.guildwars.com/wiki/Shining_Blade_Recruit" }; + public static readonly Npc CharmingPeacekeeper = new() { Ids = [8103, 8105], Name = "Charming Peacekeeper", WikiUrl = "https://wiki.guildwars.com/wiki/Charming_Peacekeeper" }; + public static readonly Npc PeacekeeperFirebrand = new() { Ids = [8110, 8111, 8113], Name = "Peacekeeper Firebrand", WikiUrl = "https://wiki.guildwars.com/wiki/Peacekeeper_Firebrand" }; + public static readonly Npc DivinePeacekeeper = new() { Ids = [8117, 8115], Name = "Divine Peacekeeper", WikiUrl = "https://wiki.guildwars.com/wiki/Divine_Peacekeeper" }; + public static readonly Npc PeacekeeperGoon = new() { Ids = [8135, 8133], Name = "Peacekeeper Goon", WikiUrl = "https://wiki.guildwars.com/wiki/Peacekeeper_Goon" }; + public static readonly Npc PeacekeeperMarksman = new() { Ids = [8137, 8138], Name = "Peacekeeper Marksman", WikiUrl = "https://wiki.guildwars.com/wiki/Peacekeeper_Marksman" }; + public static readonly Npc PeacekeeperClairvoyant = new() { Ids = [8151, 8154, 8152], Name = "Peacekeeper Clairvoyant", WikiUrl = "https://wiki.guildwars.com/wiki/Peacekeeper_Clairvoyant" }; + public static readonly Npc PeacekeeperMentor = new() { Ids = [8155, 8156], Name = "Peacekeeper Mentor", WikiUrl = "https://wiki.guildwars.com/wiki/Peacekeeper_Mentor" }; + public static readonly Npc InsatiableVakar = new() { Ids = [8172], Name = "Insatiable Vakar", WikiUrl = "https://wiki.guildwars.com/wiki/Insatiable_Vakar" }; + public static readonly Npc WhiteMantleNecromancer = new() { Ids = [8249], Name = "White Mantle Necromancer", WikiUrl = "https://wiki.guildwars.com/wiki/White_Mantle_Ritualist" }; + public static readonly Npc MinistryOfPurity = new() { Ids = [8582], Name = "Ministry Of Purity", WikiUrl = "https://wiki.guildwars.com/wiki/Ministry_of_Purity" }; + public static readonly Npc Julyia = new() { Ids = [41], Name = "Julyia", WikiUrl = "https://wiki.guildwars.com/wiki/Julyia" }; + public static readonly Npc Narcissia = new() { Ids = [49], Name = "Narcissia", WikiUrl = "https://wiki.guildwars.com/wiki/Narcissia" }; + public static readonly Npc ZenSiert = new() { Ids = [50], Name = "Zen Siert", WikiUrl = "https://wiki.guildwars.com/wiki/Zen_Siert" }; + public static readonly Npc VincentEvan = new() { Ids = [44], Name = "Vincent Evan", WikiUrl = "https://wiki.guildwars.com/wiki/Vincent_Evan" }; + public static readonly Npc CassieSanti = new() { Ids = [39], Name = "Cassie Santi", WikiUrl = "https://wiki.guildwars.com/wiki/Cassie_Santi" }; + public static readonly Npc DirkShadowrise = new() { Ids = [43], Name = "Dirk Shadowrise", WikiUrl = "https://wiki.guildwars.com/wiki/Dirk_Shadowrise" }; + public static readonly Npc LuzyFiera = new() { Ids = [45], Name = "Luzy Fiera", WikiUrl = "https://wiki.guildwars.com/wiki/Luzy_Fiera" }; + public static readonly Npc RuneTrader = new() { Ids = [190], Name = "Rune Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Rune_Trader" }; + public static readonly Npc CraftingMaterialTrader = new() { Ids = [191], Name = "Crafting Material Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Crafting_Material_Trader" }; + public static readonly Npc RareMaterialTrader = new() { Ids = [192], Name = "Rare Material Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Rare_Material_Trader" }; + public static readonly Npc DyeTrader = new() { Ids = [193], Name = "Dye Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Dye_Trader" }; + public static readonly Npc ScrollTrader = new() { Ids = [194], Name = "Scroll Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Scroll_Trader" }; + public static readonly Npc Pudash = new() { Ids = [31], Name = "Pudash", WikiUrl = "https://wiki.guildwars.com/wiki/Pudash" }; + public static readonly Npc Blenkeh = new() { Ids = [53], Name = "Blenkeh", WikiUrl = "https://wiki.guildwars.com/wiki/Blenkeh" }; + public static readonly Npc MotokoKai = new() { Ids = [46], Name = "Motoko Kai", WikiUrl = "https://wiki.guildwars.com/wiki/Motoko_Kai" }; + public static readonly Npc ErrolHyl = new() { Ids = [34], Name = "Errol Hyl", WikiUrl = "https://wiki.guildwars.com/wiki/Errol_Hyl" }; + public static readonly Npc Merchant = new() { Ids = [196], Name = "Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Merchant" }; + public static readonly Npc Weaponsmith = new() { Ids = [197], Name = "Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Weaponsmith" }; + public static readonly Npc SkillTrainer = new() { Ids = [195], Name = "Skill Trainer", WikiUrl = "https://wiki.guildwars.com/wiki/Skill_Trainer" }; + public static readonly Npc Dahlia = new() { Ids = [32], Name = "Dahlia", WikiUrl = "https://wiki.guildwars.com/wiki/Dahlia" }; + public static readonly Npc RedemptorFrohs = new() { Ids = [40], Name = "Redemptor Frohs", WikiUrl = "https://wiki.guildwars.com/wiki/Redemptor_Frohs" }; + public static readonly Npc AuroraAllesandra = new() { Ids = [54], Name = "Aurora Allesandra", WikiUrl = "https://wiki.guildwars.com/wiki/Aurora_Allesandra" }; + public static readonly Npc Hinata = new() { Ids = [47], Name = "Hinata", WikiUrl = "https://wiki.guildwars.com/wiki/Hinata" }; + public static readonly Npc LuluXan = new() { Ids = [36], Name = "Lulu Xan", WikiUrl = "https://wiki.guildwars.com/wiki/Lulu_Xan" }; + public static readonly Npc Bellicus = new() { Ids = [42], Name = "Bellicus", WikiUrl = "https://wiki.guildwars.com/wiki/Bellicus" }; + public static readonly Npc FestivalHatKeeper = new() { Ids = [198], Name = "Festival Hat Keeper", WikiUrl = "https://wiki.guildwars.com/wiki/Festival_Hat_Keeper" }; + public static readonly Npc GuildEmblemer = new() { Ids = [199], Name = "Guild Emblemer", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Emblemer" }; + public static readonly Npc Tannaros = new() { Ids = [38], Name = "Tannaros", WikiUrl = "https://wiki.guildwars.com/wiki/Tannaros" }; + public static readonly Npc Disenmaedel = new() { Ids = [33], Name = "Disenmaedel", WikiUrl = "https://wiki.guildwars.com/wiki/Disenmaedel" }; + public static readonly Npc KahXan = new() { Ids = [48], Name = "Kah Xan", WikiUrl = "https://wiki.guildwars.com/wiki/Kah_Xan" }; + public static readonly Npc Lonai = new() { Ids = [4821], Name = "Lonai", WikiUrl = "https://wiki.guildwars.com/wiki/Lonai" }; + public static readonly Npc Koss = new() { Ids = [4475], Name = "Koss", WikiUrl = "https://wiki.guildwars.com/wiki/Koss" }; + public static readonly Npc Dunkoro = new() { Ids = [4483], Name = "Dunkoro", WikiUrl = "https://wiki.guildwars.com/wiki/Dunkoro" }; + public static readonly Npc Smuggler = new() { Ids = [5075], Name = "Smuggler", WikiUrl = "https://wiki.guildwars.com/wiki/Smuggler" }; + public static readonly Npc Dalzid = new() { Ids = [4742], Name = "Dalzid", WikiUrl = "https://wiki.guildwars.com/wiki/Dalzid" }; + public static readonly Npc Burreh = new() { Ids = [5386], Name = "Burreh", WikiUrl = "https://wiki.guildwars.com/wiki/Burreh" }; + public static readonly Npc Benera = new() { Ids = [5393], Name = "Benera", WikiUrl = "https://wiki.guildwars.com/wiki/Benera" }; + public static readonly Npc Megundeh = new() { Ids = [5399], Name = "Megundeh", WikiUrl = "https://wiki.guildwars.com/wiki/Megundeh" }; + public static readonly Npc Shausha = new() { Ids = [4740], Name = "Shausha", WikiUrl = "https://wiki.guildwars.com/wiki/Shausha" }; + public static readonly Npc Ahamid = new() { Ids = [4741], Name = "Ahamid", WikiUrl = "https://wiki.guildwars.com/wiki/Ahamid" }; + public static readonly Npc Stasheh = new() { Ids = [5398], Name = "Stasheh", WikiUrl = "https://wiki.guildwars.com/wiki/Stasheh" }; + public static readonly Npc Marlani = new() { Ids = [4743], Name = "Marlani", WikiUrl = "https://wiki.guildwars.com/wiki/Marlani" }; + public static readonly Npc Sinbi = new() { Ids = [5382], Name = "Sinbi", WikiUrl = "https://wiki.guildwars.com/wiki/Sinbi" }; + public static readonly Npc Kerendu = new() { Ids = [5401], Name = "Kerendu", WikiUrl = "https://wiki.guildwars.com/wiki/Kerendu" }; + public static readonly Npc Nerashi = new() { Ids = [4814], Name = "Nerashi", WikiUrl = "https://wiki.guildwars.com/wiki/Nerashi" }; + public static readonly Npc VeldtBeetleLance = new() { Ids = [4926], Name = "Veldt Beetle Lance", WikiUrl = "https://wiki.guildwars.com/wiki/Veldt_Beetle_Lance" }; + public static readonly Npc VeldtNephila = new() { Ids = [4902], Name = "Veldt Nephila", WikiUrl = "https://wiki.guildwars.com/wiki/Veldt_Nephila" }; + public static readonly Npc VeldtBeetleQueen = new() { Ids = [4923], Name = "Veldt Beetle Queen", WikiUrl = "https://wiki.guildwars.com/wiki/Veldt_Beetle_Queen" }; + public static readonly Npc BladedVeldtTermite = new() { Ids = [4924], Name = "Bladed Veldt Termite", WikiUrl = "https://wiki.guildwars.com/wiki/Bladed_Veldt_Termite" }; + public static readonly Npc RampagingNtouka = new() { Ids = [4915], Name = "Rampaging Ntouka", WikiUrl = "https://wiki.guildwars.com/wiki/Rampaging_Ntouka" }; + public static readonly Npc CrestedNtoukaBird = new() { Ids = [4913], Name = "Crested Ntouka Bird", WikiUrl = "https://wiki.guildwars.com/wiki/Crested_Ntouka_Bird" }; + public static readonly Npc KournanEliteZealot = new() { Ids = [5269], Name = "Kournan Elite Zealot", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Elite_Zealot" }; + public static readonly Npc KournanEliteSpear = new() { Ids = [5270], Name = "Kournan Elite Spear", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Elite_Spear" }; + public static readonly Npc KournanEliteGuard = new() { Ids = [5268], Name = "Kournan Elite Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Elite_Guard" }; + public static readonly Npc KournanEliteScribe = new() { Ids = [5267], Name = "Kournan Elite Scribe", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Elite_Scribe" }; + public static readonly Npc SpiritofShelter = new() { Ids = [4223], Name = "Spirit of Shelter", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Shelter" }; + public static readonly Npc AdmiralKantoh = new() { Ids = [5226], Name = "Admiral Kantoh", WikiUrl = "https://wiki.guildwars.com/wiki/Admiral_Kantoh" }; + public static readonly Npc MirzaVeldrunner = new() { Ids = [4950], Name = "Mirza Veldrunner", WikiUrl = "https://wiki.guildwars.com/wiki/Mirza_Veldrunner" }; + public static readonly Npc CorsairTorturer = new() { Ids = [5045], Name = "Corsair Torturer", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Torturer" }; + public static readonly Npc CorsairLieutenant = new() { Ids = [5049], Name = "Corsair Lieutenant", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Lieutenant" }; + public static readonly Npc CorsairWindMaster = new() { Ids = [5046], Name = "Corsair Wind Master", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Wind_Master" }; + public static readonly Npc SpiritOfVampirism = new() { Ids = [5723], Name = "Spirit of Vampirism", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Vampirism" }; + public static readonly Npc SpiritOfSuffering = new() { Ids = [4231], Name = "Spirit of Suffering", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Suffering" }; + public static readonly Npc SpiritOfHate = new() { Ids = [4230], Name = "Spirit of Hate", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Hate" }; + public static readonly Npc SpiritOfAnger = new() { Ids = [4229], Name = "Spirit of Anger", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Anger" }; + public static readonly Npc TuskedHunter = new() { Ids = [4917], Name = "Tusked Hunter", WikiUrl = "https://wiki.guildwars.com/wiki/Tusked_Hunter" }; + public static readonly Npc TuskedHowler = new() { Ids = [4916], Name = "Tusked Howler", WikiUrl = "https://wiki.guildwars.com/wiki/Tusked_Howler" }; + public static readonly Npc KournanWeaponsmith = new() { Ids = [5391], Name = "Kournan Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kournans" }; + public static readonly Npc VeldrunnerCentaur = new() { Ids = [4949, 4951, 4948], Name = "Veldrunner Centaur", WikiUrl = "https://wiki.guildwars.com/wiki/Veldrunner_Centaur" }; + public static readonly Npc KournanTaskmaster = new() { Ids = [5276], Name = "Kournan Taskmaster", WikiUrl = "https://wiki.guildwars.com/wiki/Kournan_Taskmaster" }; + public static readonly Npc TaskmasterSadiBelai = new() { Ids = [5243], Name = "Taskmaster Sadi-Belai", WikiUrl = "https://wiki.guildwars.com/wiki/Taskmaster_Sadi-Belai" }; + public static readonly Npc TaskmasterVanahk = new() { Ids = [5242], Name = "Taskmaster Vanahk", WikiUrl = "https://wiki.guildwars.com/wiki/Taskmaster_Vanahk" }; + public static readonly Npc OverseerHaubeh = new() { Ids = [5246], Name = "Overseer Haubeh", WikiUrl = "https://wiki.guildwars.com/wiki/Overseer_Haubeh" }; + public static readonly Npc OverseerBoktek = new() { Ids = [5245], Name = "Overseer Boktek", WikiUrl = "https://wiki.guildwars.com/wiki/Overseer_Boktek" }; + public static readonly Npc TaskmasterSuli = new() { Ids = [5244], Name = "Taskmaster Suli", WikiUrl = "https://wiki.guildwars.com/wiki/Taskmaster_Suli" }; + public static readonly Npc KehmaktheTranquil = new() { Ids = [4898], Name = "Kehmak the Tranquil", WikiUrl = "https://wiki.guildwars.com/wiki/Kehmak_the_Tranquil" }; + public static readonly Npc GeneralBayel = new() { Ids = [5406], Name = "General Bayel", WikiUrl = "https://wiki.guildwars.com/wiki/General_Bayel" }; + public static readonly Npc FocusofHanaku = new() { Ids = [3978], Name = "Focus of Hanaku", WikiUrl = "https://wiki.guildwars.com/wiki/Focus_of_Hanaku" }; + public static readonly Npc SpiritofDisenchantment = new() { Ids = [4225], Name = "Spirit of Disenchantment", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Disenchantment" }; + public static readonly Npc VampiricHorror = new() { Ids = [4210], Name = "Vampiric Horror", WikiUrl = "https://wiki.guildwars.com/wiki/Vampiric_Horror" }; + public static readonly Npc DragonMoss = new() { Ids = [3722], Name = "Dragon Moss", WikiUrl = "https://wiki.guildwars.com/wiki/Dragon_Moss" }; + public static readonly Npc SpiritofDissonance = new() { Ids = [4221], Name = "Spirit of Dissonance", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Dissonance" }; + public static readonly Npc SkreeGriffin = new() { Ids = [4677], Name = "Skree Griffin", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Griffin" }; + public static readonly Npc SkreeTracker = new() { Ids = [4679], Name = "Skree Tracker", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Tracker" }; + public static readonly Npc SkreeSinger = new() { Ids = [4680], Name = "Skree Singer", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Singer" }; + public static readonly Npc Lioness = new() { Ids = [4243], Name = "Lioness", WikiUrl = "https://wiki.guildwars.com/wiki/Lioness" }; + public static readonly Npc Kehanni = new() { Ids = [5689], Name = "Kehanni", WikiUrl = "https://wiki.guildwars.com/wiki/Kehanni" }; + public static readonly Npc ScytheclawBehemoth = new() { Ids = [4669], Name = "Scytheclaw Behemoth", WikiUrl = "https://wiki.guildwars.com/wiki/Scytheclaw_Behemoth" }; + public static readonly Npc BehemothGravebane = new() { Ids = [4667], Name = "Behemoth Gravebane", WikiUrl = "https://wiki.guildwars.com/wiki/Behemoth_Gravebane" }; + public static readonly Npc RockBeetle = new() { Ids = [4687], Name = "Rock Beetle", WikiUrl = "https://wiki.guildwars.com/wiki/Rock_Beetle" }; + public static readonly Npc RainBeetle = new() { Ids = [4685], Name = "Rain Beetle", WikiUrl = "https://wiki.guildwars.com/wiki/Rain_Beetle" }; + public static readonly Npc MargoniteSorcerer = new() { Ids = [5535], Name = "Margonite Sorcerer", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Sorcerer" }; + public static readonly Npc MargoniteSeer = new() { Ids = [5533], Name = "Margonite Seer", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Seer" }; + public static readonly Npc HajokEarthguardian = new() { Ids = [4646], Name = "Hajok Earthguardian", WikiUrl = "https://wiki.guildwars.com/wiki/Hajok_Earthguardian" }; + public static readonly Npc MargoniteCleric = new() { Ids = [5536], Name = "Margonite Cleric", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Cleric" }; + public static readonly Npc TaintheCorrupter = new() { Ids = [5516], Name = "Tain the Corrupter", WikiUrl = "https://wiki.guildwars.com/wiki/Tain_the_Corrupter" }; + public static readonly Npc SkreeRaider = new() { Ids = [4678], Name = "Skree Raider", WikiUrl = "https://wiki.guildwars.com/wiki/Skree_Raider" }; + public static readonly Npc MakdehtheAggravating = new() { Ids = [4638], Name = "Makdeh the Aggravating", WikiUrl = "https://wiki.guildwars.com/wiki/Makdeh_the_Aggravating" }; + public static readonly Npc MargoniteWarlock = new() { Ids = [5534], Name = "Margonite Warlock", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Warlock" }; + public static readonly Npc MargoniteExecutioner = new() { Ids = [5537], Name = "Margonite Executioner", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Executioner" }; + public static readonly Npc MargoniteAscendant = new() { Ids = [5540], Name = "Margonite Ascendant", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Ascendant" }; + public static readonly Npc LushivahrtheInvoker = new() { Ids = [5517], Name = "Lushivahr the Invoker", WikiUrl = "https://wiki.guildwars.com/wiki/Lushivahr_the_Invoker" }; + public static readonly Npc MargoniteReaper = new() { Ids = [5539], Name = "Margonite Reaper", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Reaper" }; + public static readonly Npc CorporalSuli = new() { Ids = [5224], Name = "Corporal Suli", WikiUrl = "https://wiki.guildwars.com/wiki/Corporal_Suli" }; + public static readonly Npc LieutenantVanahk = new() { Ids = [5223], Name = "Lieutenant Vanahk", WikiUrl = "https://wiki.guildwars.com/wiki/Lieutenant_Vanahk" }; + public static readonly Npc Lion = new() { Ids = [4244], Name = "Lion", WikiUrl = "https://wiki.guildwars.com/wiki/Lion" }; + public static readonly Npc SpiritofFavorableWinds = new() { Ids = [2883], Name = "Spirit of Favorable Winds", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Favorable_Winds" }; + public static readonly Npc MirageIboga = new() { Ids = [4690], Name = "Mirage Iboga", WikiUrl = "https://wiki.guildwars.com/wiki/Mirage_Iboga" }; + public static readonly Npc StormJacaranda = new() { Ids = [4691], Name = "Storm Jacaranda", WikiUrl = "https://wiki.guildwars.com/wiki/Storm_Jacaranda" }; + public static readonly Npc EnchantedBrambles = new() { Ids = [4692], Name = "Enchanted Brambles", WikiUrl = "https://wiki.guildwars.com/wiki/Enchanted_Brambles" }; + public static readonly Npc WhistlingThornbrush = new() { Ids = [4693], Name = "Whistling Thornbrush", WikiUrl = "https://wiki.guildwars.com/wiki/Whistling_Thornbrush" }; + public static readonly Npc MargoniteBowmaster = new() { Ids = [5538], Name = "Margonite Bowmaster", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Bowmaster" }; + public static readonly Npc VabbianDyeTrader = new() { Ids = [5674], Name = "Vabbian Dye Trader", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Vabbians" }; + public static readonly Npc VabbianWeaponsmith = new() { Ids = [5671, 5672], Name = "Vabbian Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Vabbians" }; + public static readonly Npc ChumabthePrideful = new() { Ids = [4658], Name = "Chumab the Prideful", WikiUrl = "https://wiki.guildwars.com/wiki/Chumab_the_Prideful" }; + public static readonly Npc YameshMindclouder = new() { Ids = [4653], Name = "Yamesh Mindclouder", WikiUrl = "https://wiki.guildwars.com/wiki/Yamesh_Mindclouder" }; + public static readonly Npc JahaiRat = new() { Ids = [4245], Name = "Jahai Rat", WikiUrl = "https://wiki.guildwars.com/wiki/Jahai_Rat" }; + public static readonly Npc BoltenLargebelly = new() { Ids = [4656], Name = "Bolten Largebelly", WikiUrl = "https://wiki.guildwars.com/wiki/Bolten_Largebelly" }; + public static readonly Npc VabbianPriest = new() { Ids = [5664, 5702], Name = "Vabbian Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Vabbian_Priest" }; + public static readonly Npc GeneralMorgahn = new() { Ids = [4446], Name = "General Morgahn", WikiUrl = "https://wiki.guildwars.com/wiki/General_Morgahn" }; + public static readonly Npc VabbianScholar = new() { Ids = [5699, 5679, 5678, 5682], Name = "Vabbian Scholar", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Vabbians" }; + public static readonly Npc TheGreatZehtuka = new() { Ids = [5697], Name = "The Great Zehtuka", WikiUrl = "https://wiki.guildwars.com/wiki/The_Great_Zehtuka" }; + public static readonly Npc VabbiGuardCaptain = new() { Ids = [5640], Name = "Vabbi Guard Captain", WikiUrl = "https://wiki.guildwars.com/wiki/Vabbi_Guard_Captain" }; + public static readonly Npc PrinceAhmturtheMighty = new() { Ids = [5692], Name = "Prince Ahmtur the Mighty", WikiUrl = "https://wiki.guildwars.com/wiki/Prince_Ahmtur_the_Mighty" }; + public static readonly Npc LieutenantMurunda = new() { Ids = [5641], Name = "Lieutenant Murunda", WikiUrl = "https://wiki.guildwars.com/wiki/Lieutenant_Murunda" }; + public static readonly Npc PrinceBokkatheMagnificent = new() { Ids = [5691], Name = "Prince Bokka the Magnificent", WikiUrl = "https://wiki.guildwars.com/wiki/Prince_Bokka_the_Magnificent" }; + public static readonly Npc Goren = new() { Ids = [4434], Name = "Goren", WikiUrl = "https://wiki.guildwars.com/wiki/Goren" }; + public static readonly Npc PrinceMehtutheWise = new() { Ids = [5693], Name = "Prince Mehtu the Wise", WikiUrl = "https://wiki.guildwars.com/wiki/Prince_Mehtu_the_Wise" }; + public static readonly Npc VabbianBlacksmith = new() { Ids = [5667], Name = "Vabbian Blacksmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Vabbians" }; + public static readonly Npc YammironEtherLord = new () { Ids = [4636], Name = "Yammiron, Ether Lord", WikiUrl = "https://wiki.guildwars.com/wiki/Yammiron,_Ether_Lord" }; + public static readonly Npc RoaringEther = new() { Ids = [4675, 4676], Name = "Roaring Ether", WikiUrl = "https://wiki.guildwars.com/wiki/Roaring_Ether" }; + public static readonly Npc SapphireDjinn = new() { Ids = [4673, 4312], Name = "Sapphire Djinn", WikiUrl = "https://wiki.guildwars.com/wiki/Sapphire_Djinn" }; + public static readonly Npc RubyDjinn = new() { Ids = [4670, 4311], Name = "Ruby Djinn", WikiUrl = "https://wiki.guildwars.com/wiki/Ruby_Djinn" }; + public static readonly Npc CobaltMokele = new() { Ids = [4664], Name = "Cobalt Mokele", WikiUrl = "https://wiki.guildwars.com/wiki/Cobalt_Mokele" }; + public static readonly Npc JisholDarksong = new() { Ids = [4626], Name = "Jishol Darksong", WikiUrl = "https://wiki.guildwars.com/wiki/Jishol_Darksong" }; + public static readonly Npc CobaltShrieker = new() { Ids = [4665], Name = "Cobalt Shrieker", WikiUrl = "https://wiki.guildwars.com/wiki/Cobalt_Shrieker" }; + public static readonly Npc Norgu = new() { Ids = [4429], Name = "Norgu", WikiUrl = "https://wiki.guildwars.com/wiki/Norgu" }; + public static readonly Npc StoneSummitDark = new() { Ids = [5712], Name = "Stone Summit Dark", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Dwarves#Stone_Summit" }; + public static readonly Npc MargoniteParagonBoss = new() { Ids = [5475], Name = "Margonite Paragon Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Category:Margonite_bosses" }; + public static readonly Npc LyssanPriest = new() { Ids = [5709], Name = "Lyssan Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Lyssan_Priest" }; + public static readonly Npc DiscipleOfSecrets = new() { Ids = [5694], Name = "Disciple of Secrets", WikiUrl = "https://wiki.guildwars.com/wiki/Disciple_of_Secrets" }; + public static readonly Npc Varesh = new() { Ids = [5294, 5290], Name = "Varesh", WikiUrl = "https://wiki.guildwars.com/wiki/Varesh" }; + public static readonly Npc MargoniteMonkBoss = new() { Ids = [5473], Name = "Margonite Monk Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Category:Margonite_bosses" }; + public static readonly Npc GeneralDoriah = new() { Ids = [5474], Name = "General Doriah", WikiUrl = "https://wiki.guildwars.com/wiki/General_Doriah" }; + public static readonly Npc GeneralTirraj = new() { Ids = [5472], Name = "General Tirraj", WikiUrl = "https://wiki.guildwars.com/wiki/General_Tirraj" }; + public static readonly Npc JarimiyaTheUnmerciful = new() { Ids = [4657], Name = "Jarimiya the Unmerciful", WikiUrl = "https://wiki.guildwars.com/wiki/Jarimiya_the_Unmerciful" }; + public static readonly Npc RiktundTheVicious = new() { Ids = [4624], Name = "Riktund the Vicious", WikiUrl = "https://wiki.guildwars.com/wiki/Riktund_the_Vicious" }; + public static readonly Npc SetikorFireflower = new() { Ids = [4651], Name = "Setikor Fireflower", WikiUrl = "https://wiki.guildwars.com/wiki/Setikor_Fireflower" }; + public static readonly Npc MessengerOfLyssa = new() { Ids = [5708], Name = "Messenger of Lyssa", WikiUrl = "https://wiki.guildwars.com/wiki/Messenger_of_Lyssa" }; + public static readonly Npc VabbianGuardCaptain = new() { Ids = [5635], Name = "Vabbian Guard Captain", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Vabbians" }; + public static readonly Npc ElderJonah = new() { Ids = [5286], Name = "Elder Jonah", WikiUrl = "https://wiki.guildwars.com/wiki/Elder_Jonah" }; + public static readonly Npc Lormeh = new() { Ids = [5387], Name = "Lormeh", WikiUrl = "https://wiki.guildwars.com/wiki/Lormeh" }; + public static readonly Npc MadnessTitan = new() { Ids = [4970], Name = "Madness Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Madness_Titan" }; + public static readonly Npc ShadowRanger = new() { Ids = [4966, 2808], Name = "Shadow Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_Ranger" }; + public static readonly Npc ShadowMonk = new() { Ids = [4964, 2806], Name = "Shadow Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_Monk" }; + public static readonly Npc ShadowMesmer = new() { Ids = [4962, 2804], Name = "Shadow Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_Mesmer" }; + public static readonly Npc GravenMonolith = new() { Ids = [4316, 4315, 4317], Name = "Graven Monolith", WikiUrl = "https://wiki.guildwars.com/wiki/Graven_Monolith" }; + public static readonly Npc Harbinger = new() { Ids = [5404], Name = "Harbinger", WikiUrl = "https://wiki.guildwars.com/wiki/Harbinger" }; + public static readonly Npc SpiritOfSeborhin = new() { Ids = [5584], Name = "Spirit of Seborhin", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Seborhin" }; + public static readonly Npc HorticulturistHinon = new() { Ids = [5710], Name = "Horticulturist Hinon", WikiUrl = "https://wiki.guildwars.com/wiki/Horticulturist_Hinon" }; + public static readonly Npc IstaniPeasant = new() { Ids = [4851, 4850, 4852], Name = "Istani Peasant", WikiUrl = "https://wiki.guildwars.com/wiki/Istani_Peasant" }; + public static readonly Npc PriestZeinZuu = new() { Ids = [5467], Name = "Priest Zein Zuu", WikiUrl = "https://wiki.guildwars.com/wiki/Priest_Zein_Zuu" }; + public static readonly Npc ScribeWensal = new() { Ids = [5466], Name = "Scribe Wensal", WikiUrl = "https://wiki.guildwars.com/wiki/Scribe_Wensal" }; + public static readonly Npc CommanderChutal = new() { Ids = [5471], Name = "Commander Chutal", WikiUrl = "https://wiki.guildwars.com/wiki/Commander_Chutal" }; + public static readonly Npc ZealotSheoli = new() { Ids = [5470], Name = "Zealot Sheoli", WikiUrl = "https://wiki.guildwars.com/wiki/Zealot_Sheoli" }; + public static readonly Npc NtoukaBird = new() { Ids = [4914], Name = "Ntouka Bird", WikiUrl = "https://wiki.guildwars.com/wiki/Ntouka_Bird" }; + public static readonly Npc TormentedLand = new() { Ids = [4943], Name = "Tormented Land", WikiUrl = "https://wiki.guildwars.com/wiki/Tormented_Land" }; + public static readonly Npc SergeantBehnwa = new() { Ids = [5235], Name = "Sergeant Behnwa", WikiUrl = "https://wiki.guildwars.com/wiki/Sergeant_Behnwa" }; + public static readonly Npc ElderHyena = new() { Ids = [4258], Name = "Elder Hyena", WikiUrl = "https://wiki.guildwars.com/wiki/Elder_Hyena" }; + public static readonly Npc KorrLivingFlame = new () { Ids = [4877], Name = "Korr Living Flame", WikiUrl = "https://wiki.guildwars.com/wiki/Korr,_Living_Flame" }; + public static readonly Npc ImmolatedDjinn = new() { Ids = [4906], Name = "Immolated Djinn", WikiUrl = "https://wiki.guildwars.com/wiki/Immolated_Djinn" }; + public static readonly Npc AscensionPilgrim = new() { Ids = [5007], Name = "Ascension Pilgrim", WikiUrl = "https://wiki.guildwars.com/wiki/Ascension_Pilgrim" }; + public static readonly Npc DynasticSpirit = new() { Ids = [5006, 5611, 5005, 5613], Name = "Dynastic Spirit", WikiUrl = "https://wiki.guildwars.com/wiki/Dynastic_Spirit" }; + public static readonly Npc DiamondDjinn = new() { Ids = [4671], Name = "Diamond Djinn", WikiUrl = "https://wiki.guildwars.com/wiki/Diamond_Djinn" }; + public static readonly Npc VahlenTheSilent = new() { Ids = [5566], Name = "Vahlen the Silent", WikiUrl = "https://wiki.guildwars.com/wiki/Vahlen_the_Silent" }; + public static readonly Npc AwakenedAcolyte = new() { Ids = [5577], Name = "Awakened Acolyte", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened_Acolyte" }; + public static readonly Npc AwakenedDefiler = new() { Ids = [5575], Name = "Awakened Defiler", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened_Defiler" }; + public static readonly Npc AwakenedDuneCarver = new() { Ids = [5582], Name = "Awakened Dune Carver", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened_Dune_Carver" }; + public static readonly Npc AwakenedThoughtLeech = new() { Ids = [5574], Name = "Awakened Thought Leech", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened_Thought_Leech" }; + public static readonly Npc CarvenEffigy = new() { Ids = [5576, 5587, 5623], Name = "Carven Effigy", WikiUrl = "https://wiki.guildwars.com/wiki/Carven_Effigy" }; + public static readonly Npc AwakenedGrayGiant = new() { Ids = [5579, 5628], Name = "Awakened Gray Giant", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened_Gray_Giant" }; + public static readonly Npc SpiritOfQuicksand = new() { Ids = [5718], Name = "Spirit of Quicksand", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Quicksand" }; + public static readonly Npc ShamblingMesa = new() { Ids = [4321], Name = "Shambling Mesa", WikiUrl = "https://wiki.guildwars.com/wiki/Shambling_Mesa" }; + public static readonly Npc SandstormCrag = new() { Ids = [4322], Name = "Sandstorm Crag", WikiUrl = "https://wiki.guildwars.com/wiki/Sandstorm_Crag" }; + public static readonly Npc ShahaitheCunning = new() { Ids = [5090], Name = "Shahai the Cunning", WikiUrl = "https://wiki.guildwars.com/wiki/Shahai_the_Cunning" }; + public static readonly Npc PalawaJoko = new() { Ids = [5607], Name = "Palawa Joko", WikiUrl = "https://wiki.guildwars.com/wiki/Palawa_Joko" }; + public static readonly Npc QueenAijundu = new() { Ids = [5568], Name = "Queen Aijundu", WikiUrl = "https://wiki.guildwars.com/wiki/Queen_Aijundu" }; + public static readonly Npc AwakenedBlademaster = new() { Ids = [5578], Name = "Awakened Blademaster", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened_Blademaster" }; + public static readonly Npc AwakenedCavalier = new() { Ids = [5583], Name = "Awakened Cavalier", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened_Cavalier" }; + public static readonly Npc ChakehTheLonely = new() { Ids = [5573], Name = "Chakeh the Lonely", WikiUrl = "https://wiki.guildwars.com/wiki/Chakeh_the_Lonely" }; + public static readonly Npc AvahTheCrafty = new() { Ids = [5571], Name = "Avah the Crafty", WikiUrl = "https://wiki.guildwars.com/wiki/Avah_the_Crafty" }; + public static readonly Npc ChunduTheMeek = new() { Ids = [5572], Name = "Chundu the Meek", WikiUrl = "https://wiki.guildwars.com/wiki/Chundu_the_Meek" }; + public static readonly Npc AmindTheBitter = new() { Ids = [5569], Name = "Amind the Bitter", WikiUrl = "https://wiki.guildwars.com/wiki/Amind_the_Bitter" }; + public static readonly Npc NehmakTheUnpleasant = new() { Ids = [5570], Name = "Nehmak the Unpleasant", WikiUrl = "https://wiki.guildwars.com/wiki/Nehmak_the_Unpleasant" }; + public static readonly Npc JununduYoung = new() { Ids = [5599], Name = "Junundu Young", WikiUrl = "https://wiki.guildwars.com/wiki/Junundu_Young" }; + public static readonly Npc SahlahjarTheDead = new() { Ids = [4828], Name = "Sahlahjar the Dead", WikiUrl = "https://wiki.guildwars.com/wiki/Sahlahjar_the_Dead" }; + public static readonly Npc MinionOfJoko = new() { Ids = [5592], Name = "Minion of Joko", WikiUrl = "https://wiki.guildwars.com/wiki/Minion_of_Joko" }; + public static readonly Npc RavenousMandragor = new() { Ids = [4305], Name = "Ravenous Mandragor", WikiUrl = "https://wiki.guildwars.com/wiki/Ravenous_Mandragor" }; + public static readonly Npc MandragorTerror = new() { Ids = [4307], Name = "Mandragor Terror", WikiUrl = "https://wiki.guildwars.com/wiki/Mandragor_Terror" }; + public static readonly Npc MandragorSandDevil = new() { Ids = [4306], Name = "Mandragor Sand Devil", WikiUrl = "https://wiki.guildwars.com/wiki/Mandragor_Sand_Devil" }; + public static readonly Npc GhostlyScout = new() { Ids = [5547, 5548], Name = "Ghostly Scout", WikiUrl = "https://wiki.guildwars.com/wiki/Ghostly_Scout" }; + public static readonly Npc BladedDuneTermite = new() { Ids = [4319], Name = "Bladed Dune Termite", WikiUrl = "https://wiki.guildwars.com/wiki/Bladed_Dune_Termite" }; + public static readonly Npc DuneBeetleLance = new() { Ids = [4320], Name = "Dune Beetle Lance", WikiUrl = "https://wiki.guildwars.com/wiki/Dune_Beetle_Lance" }; + public static readonly Npc DuneSpider = new() { Ids = [4303], Name = "Dune Spider", WikiUrl = "https://wiki.guildwars.com/wiki/Dune_Spider" }; + public static readonly Npc AwakenedHead = new() { Ids = [5580], Name = "Awakened Head", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened_Head" }; + public static readonly Npc UndeadGeneral = new() { Ids = [5606], Name = "Undead General", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Skeletons" }; + public static readonly Npc Chirah = new() { Ids = [5272], Name = "Chirah", WikiUrl = "https://wiki.guildwars.com/wiki/Chirah" }; + public static readonly Npc AwakenedMonk = new() { Ids = [5626], Name = "Awakened Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened" }; + public static readonly Npc AwakenedMesmer = new() { Ids = [5625], Name = "Awakened Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened" }; + public static readonly Npc AwakenedDervish = new() { Ids = [5630], Name = "Awakened Dervish", WikiUrl = "https://wiki.guildwars.com/wiki/Awakened" }; + public static readonly Npc Awata = new() { Ids = [5624], Name = "Awata", WikiUrl = "https://wiki.guildwars.com/wiki/Awata" }; + public static readonly Npc Thrall = new() { Ids = [5588, 5589, 5585, 5590], Name = "Thrall", WikiUrl = "https://wiki.guildwars.com/wiki/Thrall" }; + public static readonly Npc GhostlyPriest = new() { Ids = [5615], Name = "Ghostly Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Ghostly_Priest" }; + public static readonly Npc PrimevalKingJahnus = new() { Ids = [5596], Name = "Primeval King Jahnus", WikiUrl = "https://wiki.guildwars.com/wiki/Primeval_King_Jahnus" }; + public static readonly Npc NomadGiant = new() { Ids = [4314], Name = "Nomad Giant", WikiUrl = "https://wiki.guildwars.com/wiki/Nomad_Giant" }; + public static readonly Npc KoahmTheWeary = new() { Ids = [5559], Name = "Koahm the Weary", WikiUrl = "https://wiki.guildwars.com/wiki/Koahm_the_Weary" }; + public static readonly Npc SadisticGiant = new() { Ids = [4313], Name = "Sadistic Giant", WikiUrl = "https://wiki.guildwars.com/wiki/Sadistic_Giant" }; + public static readonly Npc UhiwiTheSmoky = new() { Ids = [4300], Name = "Uhiwi the Smoky", WikiUrl = "https://wiki.guildwars.com/wiki/Uhiwi_the_Smoky" }; + public static readonly Npc ElderSiegeWurm = new() { Ids = [5610], Name = "Elder Siege Wurm", WikiUrl = "https://wiki.guildwars.com/wiki/Elder_Siege_Wurm" }; + public static readonly Npc AmireshThePious = new() { Ids = [5563], Name = "Amiresh the Pious", WikiUrl = "https://wiki.guildwars.com/wiki/Amiresh_the_Pious" }; + public static readonly Npc HordeofDarkness = new() { Ids = [5486], Name = "Horde of Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/Horde_of_Darkness" }; + public static readonly Npc DesertWurm = new() { Ids = [4323], Name = "Desert Wurm", WikiUrl = "https://wiki.guildwars.com/wiki/Desert_Wurm" }; + public static readonly Npc BladeOfCorruption = new() { Ids = [5447], Name = "Blade of Corruption", WikiUrl = "https://wiki.guildwars.com/wiki/Blade_of_Corruption" }; + public static readonly Npc CaptainMehhan = new() { Ids = [5366], Name = "Captain Mehhan", WikiUrl = "https://wiki.guildwars.com/wiki/Captain_Mehhan" }; + public static readonly Npc AwakenedParagon = new() { Ids = [5631], Name = "Awakened Paragon", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Zombies#Mummies_(Awakened)" }; + public static readonly Npc TormentedSoul = new() { Ids = [4983, 4984, 4988, 4989], Name = "Tormented Soul", WikiUrl = "https://wiki.guildwars.com/wiki/Tormented_Soul" }; + public static readonly Npc SecretKeeper = new() { Ids = [4985], Name = "Secret Keeper", WikiUrl = "https://wiki.guildwars.com/wiki/Secret_Keeper" }; + public static readonly Npc WordOfMadness = new() { Ids = [5446], Name = "Word of Madness", WikiUrl = "https://wiki.guildwars.com/wiki/Word_of_Madness" }; + public static readonly Npc RainOfTerror = new() { Ids = [5445], Name = "Rain of Terror", WikiUrl = "https://wiki.guildwars.com/wiki/Rain_of_Terror" }; + public static readonly Npc ShadowOfFear = new() { Ids = [5444], Name = "Shadow of Fear", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_of_Fear" }; + public static readonly Npc ScytheOfChaos = new() { Ids = [5449, 4959, 7316], Name = "Scythe of Chaos", WikiUrl = "https://wiki.guildwars.com/wiki/Scythe_of_Chaos" }; + public static readonly Npc SpearOfTorment = new() { Ids = [5450], Name = "Spear of Torment", WikiUrl = "https://wiki.guildwars.com/wiki/Spear_of_Torment" }; + public static readonly Npc HeraldOfNightmares = new() { Ids = [5443], Name = "Herald of Nightmares", WikiUrl = "https://wiki.guildwars.com/wiki/Herald_of_Nightmares" }; + public static readonly Npc ArmOfInsanity = new() { Ids = [5448], Name = "Arm of Insanity", WikiUrl = "https://wiki.guildwars.com/wiki/Arm_of_Insanity" }; + public static readonly Npc OnslaughtOfTerror = new() { Ids = [5430], Name = "Onslaught of Terror", WikiUrl = "https://wiki.guildwars.com/wiki/Onslaught_of_Terror" }; + public static readonly Npc ZombieMonk = new() { Ids = [5003], Name = "Zombie Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Zombies#Zombies" }; + public static readonly Npc ChimorTheLightblooded = new() { Ids = [5520], Name = "Chimor the Lightblooded", WikiUrl = "https://wiki.guildwars.com/wiki/Chimor_the_Lightblooded" }; + public static readonly Npc ScoutAhktum = new() { Ids = [5017], Name = "Scout Ahktum", WikiUrl = "https://wiki.guildwars.com/wiki/Scout_Ahktum" }; + public static readonly Npc Thenemi = new() { Ids = [5018], Name = "Thenemi", WikiUrl = "https://wiki.guildwars.com/wiki/Thenemi" }; + public static readonly Npc GarfazSteelfur = new() { Ids = [5014], Name = "Garfaz Steelfur", WikiUrl = "https://wiki.guildwars.com/wiki/Garfaz_Steelfur" }; + public static readonly Npc CaptainYithlis = new() { Ids = [5013], Name = "Captain Yithlis", WikiUrl = "https://wiki.guildwars.com/wiki/Captain_Yithlis" }; + public static readonly Npc Igraine = new() { Ids = [5015], Name = "Igraine", WikiUrl = "https://wiki.guildwars.com/wiki/Igraine" }; + public static readonly Npc TheLost = new() { Ids = [5016], Name = "The Lost", WikiUrl = "https://wiki.guildwars.com/wiki/The_Lost" }; + public static readonly Npc AbaddonsAdjutant = new() { Ids = [5483], Name = "Abaddon's Adjutant", WikiUrl = "https://wiki.guildwars.com/wiki/Abaddon%27s_Adjutant" }; + public static readonly Npc EmissaryOfDhuum = new() { Ids = [5412, 5425], Name = "Emissary of Dhuum", WikiUrl = "https://wiki.guildwars.com/wiki/Emissary_of_Dhuum" }; + public static readonly Npc TerrorwebDryder = new() { Ids = [2321], Name = "Terrorweb Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Terrorweb_Dryder" }; + public static readonly Npc Rukkassa = new() { Ids = [4973], Name = "Rukkassa", WikiUrl = "https://wiki.guildwars.com/wiki/Rukkassa" }; + public static readonly Npc TorturewebDryder = new() { Ids = [5427, 5215], Name = "Tortureweb Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Tortureweb_Dryder" }; + public static readonly Npc LostSoul = new() { Ids = [2358], Name = "Lost Soul", WikiUrl = "https://wiki.guildwars.com/wiki/Lost_Soul" }; + public static readonly Npc Apostate = new() { Ids = [5491], Name = "Apostate", WikiUrl = "https://wiki.guildwars.com/wiki/Apostate" }; + public static readonly Npc StormOfAnguish = new() { Ids = [5436], Name = "Storm of Anguish", WikiUrl = "https://wiki.guildwars.com/wiki/Storm_of_Anguish" }; + public static readonly Npc ShriekerOfDread = new() { Ids = [5439], Name = "Shrieker of Dread", WikiUrl = "https://wiki.guildwars.com/wiki/Shrieker_of_Dread" }; + public static readonly Npc ShirokenElementalist = new() { Ids = [4128], Name = "Shiro'ken Elementalist", WikiUrl = "https://wiki.guildwars.com/wiki/Shiro%27ken_Elementalist" }; + public static readonly Npc PainTitan = new() { Ids = [4969], Name = "Pain Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Pain_Titan" }; + public static readonly Npc ShirokenMonk = new() { Ids = [4129], Name = "Shiro'ken Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Shiro%27ken_Monk" }; + public static readonly Npc ShirokenMesmer = new() { Ids = [4126], Name = "Shiro'ken Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Shiro%27ken_Mesmer" }; + public static readonly Npc TitanAbomination = new() { Ids = [4968], Name = "Titan Abomination", WikiUrl = "https://wiki.guildwars.com/wiki/Titan_Abomination" }; + public static readonly Npc BoundTiendi = new() { Ids = [4087], Name = "Bound Tiendi", WikiUrl = "https://wiki.guildwars.com/wiki/Bound_Tiendi" }; + public static readonly Npc BoundKaichen = new() { Ids = [4085], Name = "Bound Kaichen", WikiUrl = "https://wiki.guildwars.com/wiki/Bound_Kaichen" }; + public static readonly Npc WrathfulStorm = new() { Ids = [4961, 7320], Name = "Wrathful Storm", WikiUrl = "https://wiki.guildwars.com/wiki/Wrathful_Storm" }; + public static readonly Npc GraspOfInsanity = new() { Ids = [4960, 7317], Name = "Grasp of Insanity", WikiUrl = "https://wiki.guildwars.com/wiki/Grasp_of_Insanity" }; + public static readonly Npc TormentClaw = new() { Ids = [5461, 7319], Name = "Torment Claw", WikiUrl = "https://wiki.guildwars.com/wiki/Torment_Claw" }; + public static readonly Npc BoundHaoLi = new() { Ids = [4082], Name = "Bound Hao Li", WikiUrl = "https://wiki.guildwars.com/wiki/Bound_Hao_Li" }; + public static readonly Npc IgnisCruor = new() { Ids = [4978], Name = "Ignis Cruor", WikiUrl = "https://wiki.guildwars.com/wiki/Ignis_Cruor" }; + public static readonly Npc ShadowBeast = new() { Ids = [4967, 2809], Name = "Shadow Beast", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_Beast" }; + public static readonly Npc CreoVulnero = new() { Ids = [4957], Name = "Creo Vulnero", WikiUrl = "https://wiki.guildwars.com/wiki/Creo_Vulnero" }; + public static readonly Npc PortalWraith = new() { Ids = [2764], Name = "Portal Wraith", WikiUrl = "https://wiki.guildwars.com/wiki/Portal_Wraith" }; + public static readonly Npc ArmageddonLord = new() { Ids = [2674], Name = "Armageddon Lord", WikiUrl = "https://wiki.guildwars.com/wiki/Armageddon_Lord" }; + public static readonly Npc JoyousSoul = new() { Ids = [5011, 5009, 5010, 5012, 5008], Name = "Joyous Soul", WikiUrl = "https://wiki.guildwars.com/wiki/Joyous_Soul" }; + public static readonly Npc MagridTheSly = new() { Ids = [4451], Name = "Magrid the Sly", WikiUrl = "https://wiki.guildwars.com/wiki/Magrid_the_Sly" }; + public static readonly Npc Zenmai = new() { Ids = [3552], Name = "Zenmai", WikiUrl = "https://wiki.guildwars.com/wiki/Zenmai" }; + public static readonly Npc Abaddon = new() { Ids = [5142], Name = "Abaddon", WikiUrl = "https://wiki.guildwars.com/wiki/Abaddon" }; + public static readonly Npc CorsairRunner = new() { Ids = [5091], Name = "Corsair Runner", WikiUrl = "https://wiki.guildwars.com/wiki/Corsair_Runner" }; + public static readonly Npc Abyssal = new() { Ids = [2810, 5194], Name = "Abyssal", WikiUrl = "https://wiki.guildwars.com/wiki/Abyssal" }; + public static readonly Npc GhostChampion = new() { Ids = [2826], Name = "Ghost Champion", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Ghosts" }; + public static readonly Npc ShadowWarrior = new() { Ids = [2807, 4965], Name = "Shadow Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_Warrior" }; + public static readonly Npc ShadowElemental = new() { Ids = [2805, 4963], Name = "Shadow Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Shadow_Elemental" }; + public static readonly Npc SkeletalEtherBreaker = new() { Ids = [2816], Name = "Skeletal Ether Breaker", WikiUrl = "https://wiki.guildwars.com/wiki/Skeletal_Ether_Breaker" }; + public static readonly Npc SkeletalIcehand = new() { Ids = [2817], Name = "Skeletal Icehand", WikiUrl = "https://wiki.guildwars.com/wiki/Skeletal_Icehand" }; + public static readonly Npc SkeletalBond = new() { Ids = [2818], Name = "Skeletal Bond", WikiUrl = "https://wiki.guildwars.com/wiki/Skeletal_Bond" }; + public static readonly Npc SkeletalBerserker = new() { Ids = [2819], Name = "Skeletal Berserker", WikiUrl = "https://wiki.guildwars.com/wiki/Skeletal_Berserker" }; + public static readonly Npc SpiritShepherd = new() { Ids = [2813], Name = "Spirit Shepherd", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_Shepherd" }; + public static readonly Npc SpiritWood = new() { Ids = [2812], Name = "Spirit Wood", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_Wood" }; + public static readonly Npc SpiritofNaturesRenewal = new() { Ids = [2887], Name = "Spirit of Nature's Renewal", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Nature%27s_Renewal" }; + public static readonly Npc RockBorerWorm = new() { Ids = [2821], Name = "Rock Borer Worm", WikiUrl = "https://wiki.guildwars.com/wiki/Rock_Borer_Worm" }; + public static readonly Npc SpiritofExtinction = new() { Ids = [2876], Name = "Spirit of Extinction", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Extinction" }; + public static readonly Npc ArmoredCaveSpider = new() { Ids = [2800], Name = "Armored Cave Spider", WikiUrl = "https://wiki.guildwars.com/wiki/Armored_Cave_Spider" }; + public static readonly Npc Banshee = new() { Ids = [2326], Name = "Banshee", WikiUrl = "https://wiki.guildwars.com/wiki/Banshee" }; + public static readonly Npc ForestGriffon = new() { Ids = [2827], Name = "Forest Griffon", WikiUrl = "https://wiki.guildwars.com/wiki/Forest_Griffon" }; + public static readonly Npc SkeletalImpaler = new() { Ids = [2820], Name = "Skeletal Impaler", WikiUrl = "https://wiki.guildwars.com/wiki/Skeletal_Impaler" }; + public static readonly Npc FlamingScepterMage = new() { Ids = [2832], Name = "Flaming Scepter Mage", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Ghosts" }; + public static readonly Npc EternalForgemaster = new() { Ids = [2829], Name = "Eternal Forgemaster", WikiUrl = "https://wiki.guildwars.com/wiki/Eternal_Forgemaster" }; + public static readonly Npc EternalRanger = new() { Ids = [2834], Name = "Eternal Ranger", WikiUrl = "https://wiki.guildwars.com/wiki/Eternal_Ranger" }; + public static readonly Npc SeedofCorruption = new() { Ids = [2811], Name = "Seed of Corruption", WikiUrl = "https://wiki.guildwars.com/wiki/Seed_of_Corruption" }; + public static readonly Npc DoubtersDryder = new() { Ids = [2803], Name = "Doubter's Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Doubter%27s_Dryder" }; + public static readonly Npc ObsidianFurnaceDrake = new() { Ids = [2802], Name = "Obsidian Furnace Drake", WikiUrl = "https://wiki.guildwars.com/wiki/Obsidian_Furnace_Drake" }; + public static readonly Npc SmokeWalker = new() { Ids = [2801], Name = "Smoke Walker", WikiUrl = "https://wiki.guildwars.com/wiki/Smoke_Walker" }; + public static readonly Npc InfernalWurm = new() { Ids = [2822], Name = "Infernal Wurm", WikiUrl = "https://wiki.guildwars.com/wiki/Infernal_Wurm" }; + public static readonly Npc AncientSkale = new() { Ids = [2814], Name = "Ancient Skale", WikiUrl = "https://wiki.guildwars.com/wiki/Ancient_Skale" }; + public static readonly Npc DragonLich = new() { Ids = [2823], Name = "Dragon Lich", WikiUrl = "https://wiki.guildwars.com/wiki/Dragon_Lich" }; + public static readonly Npc VisionOfDespair = new() { Ids = [5440], Name = "Vision of Despair", WikiUrl = "https://wiki.guildwars.com/wiki/Vision_of_Despair" }; + public static readonly Npc SaevioProelium = new() { Ids = [4956], Name = "Saevio Proelium", WikiUrl = "https://wiki.guildwars.com/wiki/Saevio_Proelium" }; + public static readonly Npc BringerOfDeceit = new() { Ids = [5441], Name = "Bringer of Deceit", WikiUrl = "https://wiki.guildwars.com/wiki/Bringer_of_Deceit" }; + public static readonly Npc SpiritOfQuickeningZephyr = new() { Ids = [2886], Name = "Spirit of Quickening Zephyr", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Quickening_Zephyr" }; + public static readonly Npc FlameOfFervor = new() { Ids = [5437], Name = "Flame of Fervor", WikiUrl = "https://wiki.guildwars.com/wiki/Flame_of_Fervor" }; + public static readonly Npc WaterBornTitan = new() { Ids = [2677], Name = "Water Born Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Water_Born_Titan" }; + public static readonly Npc WildGrowth = new() { Ids = [2678], Name = "Wild Growth", WikiUrl = "https://wiki.guildwars.com/wiki/Wild_Growth" }; + public static readonly Npc SeedOfSuffering = new() { Ids = [5438], Name = "Seed of Suffering", WikiUrl = "https://wiki.guildwars.com/wiki/Seed_of_Suffering" }; + public static readonly Npc FortuneTellerGhost = new() { Ids = [4977], Name = "Fortune Teller Ghost", WikiUrl = "https://wiki.guildwars.com/wiki/Fortune_Teller" }; + public static readonly Npc EarthBornTitan = new() { Ids = [2676], Name = "Earth Born Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Earth_Born_Titan" }; + public static readonly Npc WindBornTitan = new() { Ids = [2675], Name = "Wind Born Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Wind_Born_Titan" }; + public static readonly Npc RottingTitan = new() { Ids = [2679], Name = "Rotting Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Rotting_Titan" }; + public static readonly Npc ForgottenIllusionist = new() { Ids = [4974, 1861], Name = "Forgotten Illusionist", WikiUrl = "https://wiki.guildwars.com/wiki/Forgotten_Illusionist" }; + public static readonly Npc WieshurTheInspiring = new() { Ids = [5523], Name = "Wieshur the Inspiring", WikiUrl = "https://wiki.guildwars.com/wiki/Wieshur_the_Inspiring" }; + public static readonly Npc HautohThePilferer = new() { Ids = [5524], Name = "Hautoh the Pilferer", WikiUrl = "https://wiki.guildwars.com/wiki/Hautoh_the_Pilferer" }; + public static readonly Npc LetumContineo = new() { Ids = [4980], Name = "Letum Contineo", WikiUrl = "https://wiki.guildwars.com/wiki/Letum_Contineo" }; + public static readonly Npc SecurisPhasmatis = new() { Ids = [4979], Name = "Securis Phasmatis", WikiUrl = "https://wiki.guildwars.com/wiki/Securis_Phasmatis" }; + public static readonly Npc Razakel = new() { Ids = [5426], Name = "Razakel", WikiUrl = "https://wiki.guildwars.com/wiki/Razakel" }; + public static readonly Npc BindingGuardian = new() { Ids = [5222], Name = "Binding Guardian", WikiUrl = "https://wiki.guildwars.com/wiki/Binding_Guardian" }; + public static readonly Npc Razah = new() { Ids = [4502], Name = "Razah", WikiUrl = "https://wiki.guildwars.com/wiki/Razah" }; + public static readonly Npc MargoniteAnurTuk = new() { Ids = [5171], Name = "Margonite Anur Tuk", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Tuk" }; + public static readonly Npc MargoniteAnurSu = new() { Ids = [5168], Name = "Margonite Anur Su", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Su" }; + public static readonly Npc MargoniteAnurDabi = new() { Ids = [5167], Name = "Margonite Anur Dabi", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Dabi" }; + public static readonly Npc MargoniteAnurVu = new() { Ids = [5170], Name = "Margonite Anur Vu", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Vu" }; + public static readonly Npc MargoniteAnurKi = new() { Ids = [5169], Name = "Margonite Anur Ki", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Ki" }; + public static readonly Npc MargoniteAnurRund = new() { Ids = [5173], Name = "Margonite Anur Rund", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Rund" }; + public static readonly Npc WindOfDarkness = new() { Ids = [5192], Name = "Wind of Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/Wind_of_Darkness" }; + public static readonly Npc ChillOfDarkness = new() { Ids = [5189], Name = "Chill of Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/Chill_of_Darkness" }; + public static readonly Npc ClawOfDarkness = new() { Ids = [5191], Name = "Claw of Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/Claw_of_Darkness" }; + public static readonly Npc ThoughtOfDarkness = new() { Ids = [5188], Name = "Thought of Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/Thought_of_Darkness" }; + public static readonly Npc CurseOfDarkness = new() { Ids = [5193], Name = "Curse of Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/Curse_of_Darkness" }; + public static readonly Npc ScourgeOfDarkness = new() { Ids = [5190], Name = "Scourge of Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/Scourge_of_Darkness" }; + public static readonly Npc MargoniteAnurRuk = new() { Ids = [5172], Name = "Margonite Anur Ruk", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Ruk" }; + public static readonly Npc MargoniteAnurMank = new() { Ids = [5174], Name = "Margonite Anur Mank", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Mank" }; + public static readonly Npc HeartTormentor = new() { Ids = [5207], Name = "Heart Tormentor", WikiUrl = "https://wiki.guildwars.com/wiki/Heart_Tormentor" }; + public static readonly Npc WaterTormentor = new() { Ids = [5206], Name = "Water Tormentor", WikiUrl = "https://wiki.guildwars.com/wiki/Water_Tormentor" }; + public static readonly Npc SpiritTormentor = new() { Ids = [5209], Name = "Spirit Tormentor", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_Tormentor" }; + public static readonly Npc SanityTormentor = new() { Ids = [5212], Name = "Sanity Tormentor", WikiUrl = "https://wiki.guildwars.com/wiki/Sanity_Tormentor" }; + public static readonly Npc MindTormentor = new() { Ids = [5204], Name = "Mind Tormentor", WikiUrl = "https://wiki.guildwars.com/wiki/Mind_Tormentor" }; + public static readonly Npc SoulTormentor = new() { Ids = [5205], Name = "Soul Tormentor", WikiUrl = "https://wiki.guildwars.com/wiki/Soul_Tormentor" }; + public static readonly Npc FleshTormentor = new() { Ids = [5208], Name = "Flesh Tormentor", WikiUrl = "https://wiki.guildwars.com/wiki/Flesh_Tormentor" }; + public static readonly Npc MargoniteAnurKaya = new() { Ids = [5166], Name = "Margonite Anur Kaya", WikiUrl = "https://wiki.guildwars.com/wiki/Margonite_Anur_Kaya" }; + public static readonly Npc StygianBrute = new() { Ids = [5176], Name = "Stygian Brute", WikiUrl = "https://wiki.guildwars.com/wiki/Stygian_Brute" }; + public static readonly Npc StygianGolem = new() { Ids = [5177], Name = "Stygian Golem", WikiUrl = "https://wiki.guildwars.com/wiki/Stygian_Golem" }; + public static readonly Npc ShaunurTheDivine = new() { Ids = [5159], Name = "Shaunur the Divine", WikiUrl = "https://wiki.guildwars.com/wiki/Shaunur_the_Divine" }; + public static readonly Npc LordJadoth = new() { Ids = [5144], Name = "Lord Jadoth", WikiUrl = "https://wiki.guildwars.com/wiki/Lord_Jadoth" }; + public static readonly Npc TurepMakerOfOrphans = new () { Ids = [5160], Name = "Turep, Maker of Orphans", WikiUrl = "https://wiki.guildwars.com/wiki/Turep,_Maker_of_Orphans" }; + public static readonly Npc StygianHunger = new() { Ids = [5175], Name = "Stygian Hunger", WikiUrl = "https://wiki.guildwars.com/wiki/Stygian_Hunger" }; + public static readonly Npc SpiritOfTruth = new() { Ids = [4986], Name = "Spirit of Truth", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Truth" }; + public static readonly Npc TheDarkness = new() { Ids = [5152], Name = "The Darkness", WikiUrl = "https://wiki.guildwars.com/wiki/The_Darkness" }; + public static readonly Npc RageTitan = new() { Ids = [5201], Name = "Rage Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Rage_Titan" }; + public static readonly Npc DespairTitan = new() { Ids = [5203], Name = "Despair Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Despair_Titan" }; + public static readonly Npc GreaterDreamRider = new() { Ids = [5216], Name = "Greater Dream Rider", WikiUrl = "https://wiki.guildwars.com/wiki/Greater_Dream_Rider" }; + public static readonly Npc AnguishTitan = new() { Ids = [5198], Name = "Anguish Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Anguish_Titan" }; + public static readonly Npc MiseryTitan = new() { Ids = [5195], Name = "Misery Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Misery_Titan" }; + public static readonly Npc FuryTitan = new() { Ids = [5200], Name = "Fury Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Fury_Titan" }; + public static readonly Npc DementiaTitan = new() { Ids = [5197], Name = "Dementia Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Dementia_Titan" }; + public static readonly Npc BanishedDreamRider = new() { Ids = [7321], Name = "Banished Dream Rider", WikiUrl = "https://wiki.guildwars.com/wiki/Banished_Dream_Rider" }; + public static readonly Npc ChaosWurm = new() { Ids = [7326], Name = "Chaos Wurm", WikiUrl = "https://wiki.guildwars.com/wiki/Chaos_Wurm" }; + public static readonly Npc GuardianOfKomalie = new() { Ids = [5162, 5161], Name = "Guardian of Komalie", WikiUrl = "https://wiki.guildwars.com/wiki/Guardian_of_Komalie" }; + public static readonly Npc TheFury = new() { Ids = [5149], Name = "The Fury", WikiUrl = "https://wiki.guildwars.com/wiki/The_Fury" }; + public static readonly Npc StygianHorror = new() { Ids = [5178], Name = "Stygian Horror", WikiUrl = "https://wiki.guildwars.com/wiki/Stygian_Horror" }; + public static readonly Npc StygianFiend = new() { Ids = [5179], Name = "Stygian Fiend", WikiUrl = "https://wiki.guildwars.com/wiki/Stygian_Fiend" }; + public static readonly Npc StygianUnderlord = new() { Ids = [5163, 5164], Name = "Stygian Underlord", WikiUrl = "https://wiki.guildwars.com/wiki/Stygian_Underlord" }; + public static readonly Npc StygianLord = new() { Ids = [5148, 5147, 5146, 5145], Name = "Stygian Lord", WikiUrl = "https://wiki.guildwars.com/wiki/Stygian_Lord" }; + public static readonly Npc CharrRitualist = new() { Ids = [6601, 6600], Name = "Charr Ritualist", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Charr" }; + public static readonly Npc SiegeDevourer = new() { Ids = [6531, 6614], Name = "Siege Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Siege_Devourer" }; + public static readonly Npc MantidDigger = new() { Ids = [6673], Name = "Mantid Digger", WikiUrl = "https://wiki.guildwars.com/wiki/Mantid_Digger" }; + public static readonly Npc MantidNymph = new() { Ids = [6672], Name = "Mantid Nymph", WikiUrl = "https://wiki.guildwars.com/wiki/Mantid_Nymph" }; + public static readonly Npc HoraiWingshielder = new() { Ids = [6646], Name = "Horai Wingshielder", WikiUrl = "https://wiki.guildwars.com/wiki/Horai_Wingshielder" }; + public static readonly Npc MantidQueen = new() { Ids = [6674], Name = "Mantid Queen", WikiUrl = "https://wiki.guildwars.com/wiki/Mantid_Queen" }; + public static readonly Npc CharrHexreaper = new() { Ids = [6618], Name = "Charr Hexreaper", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Hexreaper" }; + public static readonly Npc CharrSeeker = new() { Ids = [6634], Name = "Charr Seeker", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Seeker" }; + public static readonly Npc CharrAxemaster = new() { Ids = [6627], Name = "Charr Axemaster", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Axemaster" }; + public static readonly Npc CharrFlameshielder = new() { Ids = [6621], Name = "Charr Flameshielder", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Flameshielder" }; + public static readonly Npc CharrDominator = new() { Ids = [6616], Name = "Charr Dominator", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Dominator" }; + public static readonly Npc CharrBlademaster = new() { Ids = [6631], Name = "Charr Blademaster", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Blademaster" }; + public static readonly Npc MolotovRocktail = new() { Ids = [6649], Name = "Molotov Rocktail", WikiUrl = "https://wiki.guildwars.com/wiki/Molotov_Rocktail" }; + public static readonly Npc ArmoredSaurus = new() { Ids = [6653, 6652], Name = "Armored Saurus", WikiUrl = "https://wiki.guildwars.com/wiki/Armored_Saurus" }; + public static readonly Npc GronFierceclaw = new() { Ids = [6593], Name = "Gron Fierceclaw", WikiUrl = "https://wiki.guildwars.com/wiki/Gron_Fierceclaw" }; + public static readonly Npc BonworFierceblade = new() { Ids = [6590], Name = "Bonwor Fierceblade", WikiUrl = "https://wiki.guildwars.com/wiki/Bonwor_Fierceblade" }; + public static readonly Npc SeerFiercereign = new() { Ids = [6584], Name = "Seer Fiercereign", WikiUrl = "https://wiki.guildwars.com/wiki/Seer_Fiercereign" }; + public static readonly Npc CowlFiercetongue = new() { Ids = [6586], Name = "Cowl Fiercetongue", WikiUrl = "https://wiki.guildwars.com/wiki/Cowl_Fiercetongue" }; + public static readonly Npc RoanFierceheart = new() { Ids = [6588], Name = "Roan Fierceheart", WikiUrl = "https://wiki.guildwars.com/wiki/Roan_Fierceheart" }; + public static readonly Npc CharrWardkeeper = new() { Ids = [6637], Name = "Charr Wardkeeper", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Wardkeeper" }; + public static readonly Npc EliteCharrGuard = new() { Ids = [6574], Name = "Elite Charr Guard", WikiUrl = "https://wiki.guildwars.com/wiki/Elite_Charr_Guard" }; + public static readonly Npc CapturedVanguardSoldier = new() { Ids = [6043, 6044, 6045], Name = "Captured Vanguard Soldier", WikiUrl = "https://wiki.guildwars.com/wiki/Captured_Vanguard_Soldier" }; + public static readonly Npc HierophantBurntsoul = new() { Ids = [6554], Name = "Hierophant Burntsoul", WikiUrl = "https://wiki.guildwars.com/wiki/Hierophant_Burntsoul" }; + public static readonly Npc CharrAvenger = new() { Ids = [6639], Name = "Charr Avenger", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Avenger" }; + public static readonly Npc DestroyerofThoughts = new() { Ids = [6145], Name = "Destroyer of Thoughts", WikiUrl = "https://wiki.guildwars.com/wiki/Destroyer_of_Thoughts" }; + public static readonly Npc DestroyerofDeeds = new() { Ids = [6168], Name = "Destroyer of Deeds", WikiUrl = "https://wiki.guildwars.com/wiki/Destroyer_of_Deeds" }; + public static readonly Npc DestroyerofHordes = new() { Ids = [6169], Name = "Destroyer of Hordes", WikiUrl = "https://wiki.guildwars.com/wiki/Destroyer_of_Hordes" }; + public static readonly Npc DestroyerofBones = new() { Ids = [6157], Name = "Destroyer of Bones", WikiUrl = "https://wiki.guildwars.com/wiki/Destroyer_of_Bones" }; + public static readonly Npc DestroyerofSinew = new() { Ids = [6156], Name = "Destroyer of Sinew", WikiUrl = "https://wiki.guildwars.com/wiki/Destroyer_of_Sinew" }; + public static readonly Npc CaptainLangmar = new() { Ids = [6032], Name = "Captain Langmar", WikiUrl = "https://wiki.guildwars.com/wiki/Captain_Langmar" }; + public static readonly Npc VileMandragor = new() { Ids = [6656], Name = "Vile Mandragor", WikiUrl = "https://wiki.guildwars.com/wiki/Vile_Mandragor" }; + public static readonly Npc MandragorSmokeDevil = new() { Ids = [6658], Name = "Mandragor Smoke Devil", WikiUrl = "https://wiki.guildwars.com/wiki/Mandragor_Smoke_Devil" }; + public static readonly Npc MandragorDustDevil = new() { Ids = [6657], Name = "Mandragor Dust Devil", WikiUrl = "https://wiki.guildwars.com/wiki/Mandragor_Dust_Devil" }; + public static readonly Npc DeadlySkale = new() { Ids = [6675], Name = "Deadly Skale", WikiUrl = "https://wiki.guildwars.com/wiki/Deadly_Skale" }; + public static readonly Npc CharrMender = new() { Ids = [6626], Name = "Charr Mender", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Mender" }; + public static readonly Npc ThraexisThundermaw = new() { Ids = [6644], Name = "Thraexis Thundermaw", WikiUrl = "https://wiki.guildwars.com/wiki/Thraexis_Thundermaw" }; + public static readonly Npc KatyeBloodburner = new() { Ids = [6551], Name = "Katye Bloodburner", WikiUrl = "https://wiki.guildwars.com/wiki/Katye_Bloodburner" }; + public static readonly Npc AnmattheTrickster = new() { Ids = [6550], Name = "Anmat the Trickster", WikiUrl = "https://wiki.guildwars.com/wiki/Anmat_the_Trickster" }; + public static readonly Npc GrawlChampion = new() { Ids = [6670], Name = "Grawl Champion", WikiUrl = "https://wiki.guildwars.com/wiki/Grawl_Champion" }; + public static readonly Npc GrawlDarkPriest = new() { Ids = [6669], Name = "Grawl Dark Priest", WikiUrl = "https://wiki.guildwars.com/wiki/Grawl_Dark_Priest" }; + public static readonly Npc SpiritofPreservation = new() { Ids = [4219], Name = "Spirit of Preservation", WikiUrl = "https://wiki.guildwars.com/wiki/Spirit_of_Preservation" }; + public static readonly Npc TumbledElemental = new() { Ids = [6678], Name = "Tumbled Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Tumbled_Elemental" }; + public static readonly Npc FlowstoneElemental = new() { Ids = [6915], Name = "Flowstone Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Flowstone_Elemental" }; + public static readonly Npc MagmaBlister = new() { Ids = [6916], Name = "Magma Blister", WikiUrl = "https://wiki.guildwars.com/wiki/Magma_Blister" }; + public static readonly Npc GrawlDemagogue = new() { Ids = [6671], Name = "Grawl Demagogue", WikiUrl = "https://wiki.guildwars.com/wiki/Grawl_Demagogue" }; + public static readonly Npc BurningSpirit = new() { Ids = [6918], Name = "Burning Spirit", WikiUrl = "https://wiki.guildwars.com/wiki/Burning_Spirit" }; + public static readonly Npc IgnustheEternal = new() { Ids = [6654], Name = "Ignus the Eternal", WikiUrl = "https://wiki.guildwars.com/wiki/Ignus_the_Eternal" }; + public static readonly Npc SwarmofBees = new() { Ids = [6640], Name = "Swarm of Bees", WikiUrl = "https://wiki.guildwars.com/wiki/Swarm_of_Bees" }; + public static readonly Npc MergoyleWavebreaker = new() { Ids = [1723], Name = "Mergoyle Wavebreaker", WikiUrl = "https://wiki.guildwars.com/wiki/Mergoyle_Wavebreaker" }; + public static readonly Npc SnowEttin = new() { Ids = [2491], Name = "Snow Ettin", WikiUrl = "https://wiki.guildwars.com/wiki/Snow_Ettin" }; + public static readonly Npc IceGolem = new() { Ids = [2647], Name = "Ice Golem", WikiUrl = "https://wiki.guildwars.com/wiki/Ice_Golem" }; + public static readonly Npc WhiskarFeatherstorm = new() { Ids = [2479], Name = "Whiskar Featherstorm", WikiUrl = "https://wiki.guildwars.com/wiki/Whiskar_Featherstorm" }; + public static readonly Npc Snow = new() { Ids = [2548], Name = "Snow", WikiUrl = "https://wiki.guildwars.com/wiki/Snow" }; + public static readonly Npc MasterSeekerNathaniel = new() { Ids = [2229], Name = "Master Seeker Nathaniel", WikiUrl = "https://wiki.guildwars.com/wiki/Master_Seeker_Nathaniel" }; + public static readonly Npc SnowEttinBoss = new() { Ids = [2481], Name = "Snow Ettin Boss", WikiUrl = "https://wiki.guildwars.com/wiki/Snow_Ettin" }; + public static readonly Npc ShiverpeakProtector = new() { Ids = [2487], Name = "Shiverpeak Protector", WikiUrl = "https://wiki.guildwars.com/wiki/Shiverpeak_Protector" }; + public static readonly Npc ShiverpeakWarrior = new() { Ids = [2488], Name = "Shiverpeak Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Shiverpeak_Warrior" }; + public static readonly Npc ShiverpeakLongbow = new() { Ids = [2489], Name = "Shiverpeak Longbow", WikiUrl = "https://wiki.guildwars.com/wiki/Shiverpeak_Longbow" }; + public static readonly Npc MoroStormcalf = new() { Ids = [2475], Name = "Moro Stormcalf", WikiUrl = "https://wiki.guildwars.com/wiki/Moro_Stormcalf" }; + public static readonly Npc JoloLighthaunch = new() { Ids = [2476], Name = "Jolo Lighthaunch", WikiUrl = "https://wiki.guildwars.com/wiki/Jolo_Lighthaunch" }; + public static readonly Npc SnowWolf = new() { Ids = [1350], Name = "Snow Wolf", WikiUrl = "https://wiki.guildwars.com/wiki/Snow_Wolf" }; + public static readonly Npc FrostfireDryder = new() { Ids = [2490, 2483, 2485, 2484], Name = "Frostfire Dryder", WikiUrl = "https://wiki.guildwars.com/wiki/Frostfire_Dryder" }; + public static readonly Npc StoneSummitSage = new() { Ids = [2641], Name = "Stone Summit Sage", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Sage" }; + public static readonly Npc DolyakRider = new() { Ids = [2640], Name = "Dolyak Rider", WikiUrl = "https://wiki.guildwars.com/wiki/Dolyak_Rider" }; + public static readonly Npc StoneSummitHowler = new() { Ids = [2642], Name = "Stone Summit Howler", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Howler" }; + public static readonly Npc StoneSummitScout = new() { Ids = [2646], Name = "Stone Summit Scout", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Summit_Scout" }; + public static readonly Npc ShalisIronmantle = new() { Ids = [2622], Name = "Shalis Ironmantle", WikiUrl = "https://wiki.guildwars.com/wiki/Shalis_Ironmantle" }; + public static readonly Npc SummitAxeWielder = new() { Ids = [2643], Name = "Summit Axe Wielder", WikiUrl = "https://wiki.guildwars.com/wiki/Summit_Axe_Wielder" }; + public static readonly Npc SarisHeadstaver = new() { Ids = [2612], Name = "Saris Headstaver", WikiUrl = "https://wiki.guildwars.com/wiki/Saris_Headstaver" }; + public static readonly Npc TorisStonehammer = new() { Ids = [2616], Name = "Toris Stonehammer", WikiUrl = "https://wiki.guildwars.com/wiki/Toris_Stonehammer" }; + public static readonly Npc TheJudge = new() { Ids = [2614], Name = "The Judge", WikiUrl = "https://wiki.guildwars.com/wiki/The_Judge" }; + public static readonly Npc BoulderElemental = new() { Ids = [2439], Name = "Boulder Elemental", WikiUrl = "https://wiki.guildwars.com/wiki/Boulder_Elemental" }; + public static readonly Npc StoneFury = new() { Ids = [2442], Name = "Stone Fury", WikiUrl = "https://wiki.guildwars.com/wiki/Stone_Fury" }; + public static readonly Npc CharrMartyr = new() { Ids = [1648], Name = "Charr Martyr", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Martyr" }; + public static readonly Npc CharrFlameWielder = new() { Ids = [1641], Name = "Charr Flame Wielder", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Flame_Wielder" }; + public static readonly Npc CharrMindSpark = new() { Ids = [1636], Name = "Charr Mind Spark", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Mind_Spark" }; + public static readonly Npc CharrAshWalker = new() { Ids = [1639], Name = "Charr Ash Walker", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Ash_Walker" }; + public static readonly Npc StormRider = new() { Ids = [2425], Name = "Storm Rider", WikiUrl = "https://wiki.guildwars.com/wiki/Storm_Rider" }; + public static readonly Npc FlashGargoyle = new() { Ids = [2447], Name = "Flash Gargoyle", WikiUrl = "https://wiki.guildwars.com/wiki/Flash_Gargoyle" }; + public static readonly Npc AscalonWarrior = new() { Ids = [2060], Name = "Ascalon Warrior", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalon_Warrior" }; + public static readonly Npc ResurrectGargoyle = new() { Ids = [2451], Name = "Resurrect Gargoyle", WikiUrl = "https://wiki.guildwars.com/wiki/Resurrect_Gargoyle" }; + public static readonly Npc WhiptailDevourer = new() { Ids = [2432], Name = "Whiptail Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Whiptail_Devourer" }; + public static readonly Npc MalletRunecolumn = new() { Ids = [2394], Name = "Mallet Runecolumn", WikiUrl = "https://wiki.guildwars.com/wiki/Mallet_Runecolumn" }; + public static readonly Npc CrownofThorns = new() { Ids = [2455], Name = "Crown of Thorns", WikiUrl = "https://wiki.guildwars.com/wiki/Crown_of_Thorns" }; + public static readonly Npc DrimCindershot = new() { Ids = [1601], Name = "Drim Cindershot", WikiUrl = "https://wiki.guildwars.com/wiki/Drim_Cindershot" }; + public static readonly Npc AscalonianHunter = new() { Ids = [2052], Name = "Ascalonian Hunter", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalonian_Hunter" }; + public static readonly Npc MirashDreambreaker = new() { Ids = [1596], Name = "Mirash Dreambreaker", WikiUrl = "https://wiki.guildwars.com/wiki/Mirash_Dreambreaker" }; + public static readonly Npc AscalonianCrafter = new() { Ids = [2068], Name = "Ascalonian Crafter", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; + public static readonly Npc AscalonianWeaponsmith = new() { Ids = [2087], Name = "Ascalonian Weaponsmith", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; + public static readonly Npc AscalonianMerchant = new() { Ids = [2101, 2015], Name = "Ascalonian Merchant", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; + public static readonly Npc Viggo = new() { Ids = [2139], Name = "Viggo", WikiUrl = "https://wiki.guildwars.com/wiki/Viggo" }; + public static readonly Npc GorgaanHatemonger = new() { Ids = [1600], Name = "Gorgaan Hatemonger", WikiUrl = "https://wiki.guildwars.com/wiki/Gorgaan_Hatemonger" }; + public static readonly Npc PlagueDevourer = new() { Ids = [2431], Name = "Plague Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Plague_Devourer" }; + public static readonly Npc FlintTouchstone = new() { Ids = [2404], Name = "Flint Touchstone", WikiUrl = "https://wiki.guildwars.com/wiki/Flint_Touchstone" }; + public static readonly Npc Grawl = new() { Ids = [2458], Name = "Grawl", WikiUrl = "https://wiki.guildwars.com/wiki/Grawl" }; + public static readonly Npc GrawlUlodyte = new() { Ids = [2457], Name = "Grawl Ulodyte", WikiUrl = "https://wiki.guildwars.com/wiki/Grawl_Ulodyte" }; + public static readonly Npc Renegade = new() { Ids = [2437], Name = "Renegade", WikiUrl = "https://wiki.guildwars.com/wiki/Renegade" }; + public static readonly Npc RenegadeElementalist = new() { Ids = [2436], Name = "Renegade Elementalist", WikiUrl = "https://wiki.guildwars.com/wiki/Renegade_Elementalist" }; + public static readonly Npc CrimsonDevourer = new() { Ids = [2434], Name = "Crimson Devourer", WikiUrl = "https://wiki.guildwars.com/wiki/Crimson_Devourer" }; + public static readonly Npc LarrkEtherburn = new() { Ids = [2375], Name = "Larrk Etherburn", WikiUrl = "https://wiki.guildwars.com/wiki/Larrk_Etherburn" }; + public static readonly Npc AscalonianMage = new() { Ids = [1942], Name = "Ascalonian Mage", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Ascalon" }; + public static readonly Npc PriestessRashena = new() { Ids = [2067], Name = "Priestess Rashena", WikiUrl = "https://wiki.guildwars.com/wiki/Priestess_Rashenna" }; + public static readonly Npc IgnisPhanaura = new() { Ids = [2406], Name = "Ignis Phanaura", WikiUrl = "https://wiki.guildwars.com/wiki/Ignis_Phanaura" }; + public static readonly Npc AscalonStriker = new() { Ids = [2051], Name = "Ascalon Striker", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalon_Striker" }; + public static readonly Npc RynCursewing = new() { Ids = [1681], Name = "Ryn Cursewing", WikiUrl = "https://wiki.guildwars.com/wiki/Ryn_Cursewing" }; + public static readonly Npc BouladthePerverse = new() { Ids = [2721], Name = "Boulad the Perverse", WikiUrl = "https://wiki.guildwars.com/wiki/Boulad_the_Perverse" }; + public static readonly Npc SkeletonSorcerer = new() { Ids = [2737], Name = "Skeleton Sorcerer", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Sorcerer" }; + public static readonly Npc ZombieWarlock = new() { Ids = [2743], Name = "Zombie Warlock", WikiUrl = "https://wiki.guildwars.com/wiki/Zombie_Warlock" }; + public static readonly Npc SkeletonMonk = new() { Ids = [2738], Name = "Skeleton Monk", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Monk" }; + public static readonly Npc SkeletonMesmer = new() { Ids = [2736], Name = "Skeleton Mesmer", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Mesmer" }; + public static readonly Npc Snakebite = new() { Ids = [8055], Name = "Snakebite", WikiUrl = "https://wiki.guildwars.com/wiki/Snakebite" }; + public static readonly Npc GrimPeacekeeper = new() { Ids = [8107], Name = "Grim Peacekeeper", WikiUrl = "https://wiki.guildwars.com/wiki/Grim_Peacekeeper" }; + public static readonly Npc PeacekeeperSibyl = new() { Ids = [8148], Name = "Peacekeeper Sibyl", WikiUrl = "https://wiki.guildwars.com/wiki/Peacekeeper_Sibyl" }; + public static readonly Npc AncientOakheart = new() { Ids = [1734], Name = "Ancient Oakheart", WikiUrl = "https://wiki.guildwars.com/wiki/Ancient_Oakheart" }; + public static readonly Npc ReedStalker = new() { Ids = [1730], Name = "Reed Stalker", WikiUrl = "https://wiki.guildwars.com/wiki/Reed_Stalker" }; + public static readonly Npc SpinedAloe = new() { Ids = [1731], Name = "Spined Aloe", WikiUrl = "https://wiki.guildwars.com/wiki/Spined_Aloe" }; + public static readonly Npc SilentPeacekeeper = new() { Ids = [8098], Name = "Silent Peacekeeper", WikiUrl = "https://wiki.guildwars.com/wiki/Silent_Peacekeeper" }; + public static readonly Npc SkeletonBowmaster = new() { Ids = [2740], Name = "Skeleton Bowmaster", WikiUrl = "https://wiki.guildwars.com/wiki/Skeleton_Bowmaster" }; + public static readonly Npc BogSkaleBlighter = new() { Ids = [1736], Name = "Bog Skale Blighter", WikiUrl = "https://wiki.guildwars.com/wiki/Bog_Skale_Blighter" }; + public static readonly Npc AbbotRamoth = new() { Ids = [2212], Name = "Abbot Ramoth", WikiUrl = "https://wiki.guildwars.com/wiki/Abbot_Ramoth" }; + public static readonly Npc WinglordCaromi = new() { Ids = [1703], Name = "Winglord Caromi", WikiUrl = "https://wiki.guildwars.com/wiki/Winglord_Caromi" }; + public static readonly Npc CaromiTenguElite = new() { Ids = [1745], Name = "Caromi Tengu Elite", WikiUrl = "https://wiki.guildwars.com/wiki/Caromi_Tengu_Elite" }; + public static readonly Npc PeacekeeperEnforcer = new() { Ids = [8119, 8127], Name = "Peacekeeper Enforcer", WikiUrl = "https://wiki.guildwars.com/wiki/Peacekeeper_Enforcer" }; + public static readonly Npc ForestMinotaur = new() { Ids = [1728], Name = "Forest Minotaur", WikiUrl = "https://wiki.guildwars.com/wiki/Forest_Minotaur" }; + public static readonly Npc KrytanCollector = new() { Ids = [1486], Name = "Krytan Collector", WikiUrl = "https://wiki.guildwars.com/wiki/Guild_Wars_Wiki:Projects/NPC_models/Humans/Kryta" }; + public static readonly Npc FogNightmare = new() { Ids = [1729], Name = "Fog Nightmare", WikiUrl = "https://wiki.guildwars.com/wiki/Fog_Nightmare" }; + public static readonly Npc PeacekeeperHuntsman = new() { Ids = [8146], Name = "Peacekeeper Huntsman", WikiUrl = "https://wiki.guildwars.com/wiki/Peacekeeper_Huntsman" }; + public static readonly Npc FenTroll = new() { Ids = [1748], Name = "Fen Troll", WikiUrl = "https://wiki.guildwars.com/wiki/Fen_Troll" }; + public static readonly Npc Bandit = new() { Ids = [1720], Name = "Bandit", WikiUrl = "https://wiki.guildwars.com/wiki/Bandit" }; + public static readonly Npc Galrath = new() { Ids = [2191], Name = "Galrath", WikiUrl = "https://wiki.guildwars.com/wiki/Galrath" }; + public static readonly Npc ApprenticeofVerata = new() { Ids = [1717], Name = "Apprentice of Verata", WikiUrl = "https://wiki.guildwars.com/wiki/Apprentice_of_Verata" }; + public static readonly Npc ShepherdofVerata = new() { Ids = [1718], Name = "Shepherd of Verata", WikiUrl = "https://wiki.guildwars.com/wiki/Shepherd_of_Verata" }; + public static readonly Npc EyesofVerata = new() { Ids = [1719], Name = "Eyes of Verata", WikiUrl = "https://wiki.guildwars.com/wiki/Eyes_of_Verata" }; + public static readonly Npc SageofVerata = new() { Ids = [1716], Name = "Sage of Verata", WikiUrl = "https://wiki.guildwars.com/wiki/Sage_of_Verata" }; + public static readonly Npc DamnedCleric = new() { Ids = [2745], Name = "Damned Cleric", WikiUrl = "https://wiki.guildwars.com/wiki/Damned_Cleric" }; + public static readonly Npc Wraith = new() { Ids = [2734], Name = "Wraith", WikiUrl = "https://wiki.guildwars.com/wiki/Wraith" }; + public static readonly Npc RottingDragon = new() { Ids = [2838], Name = "Rotting Dragon", WikiUrl = "https://wiki.guildwars.com/wiki/Rotting_Dragon" }; + public static readonly Npc Rotscale = new() { Ids = [2837], Name = "Rotscale", WikiUrl = "https://wiki.guildwars.com/wiki/Rotscale" }; + public static readonly Npc NecridHorseman = new() { Ids = [2744], Name = "Necrid Horseman", WikiUrl = "https://wiki.guildwars.com/wiki/Necrid_Horseman" }; + public static readonly Npc FrynRageflame = new() { Ids = [2277], Name = "Fryn Rageflame", WikiUrl = "https://wiki.guildwars.com/wiki/Fryn_Rageflame" }; + public static readonly Npc ArkhelHavenwood = new() { Ids = [2510], Name = "Arkhel Havenwood", WikiUrl = "https://wiki.guildwars.com/wiki/Arkhel_Havenwood" }; + public static readonly Npc EdibboKepkep = new() { Ids = [2521], Name = "Edibbo Kepkep", WikiUrl = "https://wiki.guildwars.com/wiki/Edibbo_Kepkep" }; + public static readonly Npc HailBlackice = new() { Ids = [2506], Name = "Hail Blackice", WikiUrl = "https://wiki.guildwars.com/wiki/Hail_Blackice" }; + public static readonly Npc RuneEthercrash = new() { Ids = [2505], Name = "Rune Ethercrash", WikiUrl = "https://wiki.guildwars.com/wiki/Rune_Ethercrash" }; + public static readonly Npc DarkTitan = new() { Ids = [2683], Name = " Dark Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Dark_Titan" }; + public static readonly Npc TitansHeart = new() { Ids = [2681], Name = "Titan's Heart", WikiUrl = "https://wiki.guildwars.com/wiki/Titan%27s_Heart" }; + public static readonly Npc TitansMalice = new() { Ids = [2680], Name = "Titan's Malice", WikiUrl = "https://wiki.guildwars.com/wiki/Titan%27s_Malice" }; + public static readonly Npc IcyBrute = new() { Ids = [2682], Name = "Icy Brute", WikiUrl = "https://wiki.guildwars.com/wiki/Icy_Brute" }; + public static readonly Npc RykArrowwing = new() { Ids = [2519], Name = "Ryk Arrowwing", WikiUrl = "https://wiki.guildwars.com/wiki/Ryk_Arrowwing" }; + public static readonly Npc SyrHonorcrest = new() { Ids = [2518], Name = "Syr Honorcrest", WikiUrl = "https://wiki.guildwars.com/wiki/Syr_Honorcrest" }; + public static readonly Npc FrostTitan = new() { Ids = [2684], Name = "Frost Titan", WikiUrl = "https://wiki.guildwars.com/wiki/Frost_Titan" }; + public static readonly Npc EvirsoSectus = new() { Ids = [2664], Name = "Evirso Sectus", WikiUrl = "https://wiki.guildwars.com/wiki/Evirso_Sectus" }; - public static IEnumerable Npcs { get; } = new List() - { + public static IEnumerable Npcs { get; } = + [ Unknown, RitualPriest, CanthanGuard, @@ -2993,7 +2990,7 @@ public sealed class Npc SyrHonorcrest, FrostTitan, EvirsoSectus, - }; + ]; public static bool TryParse(int id, out Npc npc) @@ -3035,7 +3032,7 @@ public sealed class Npc return npc; } - public int[] Ids { get; private set; } = Array.Empty(); + public int[] Ids { get; private set; } = []; public string Name { get; private set; } = string.Empty; public string WikiUrl { get; private set; } = string.Empty; diff --git a/Daybreak.Shared/Models/Guildwars/Profession.cs b/Daybreak.Shared/Models/Guildwars/Profession.cs index 5da2f794..a782953c 100644 --- a/Daybreak.Shared/Models/Guildwars/Profession.cs +++ b/Daybreak.Shared/Models/Guildwars/Profession.cs @@ -1,8 +1,5 @@ using Daybreak.Shared.Converters; using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; namespace Daybreak.Shared.Models.Guildwars; @@ -110,8 +107,8 @@ public sealed class Profession : IWikiEntity PrimaryAttribute = Attribute.Mysticism, Attributes = [Attribute.EarthPrayers, Attribute.ScytheMastery, Attribute.WindPrayers] }; - public static IEnumerable Professions = new List - { + public static readonly IEnumerable Professions = + [ None, Warrior, Ranger, @@ -123,7 +120,7 @@ public sealed class Profession : IWikiEntity Ritualist, Paragon, Dervish - }; + ]; public static bool TryParse(int id, out Profession profession) { profession = Professions.Where(prof => prof.Id == id).FirstOrDefault()!; diff --git a/Daybreak.Shared/Models/Guildwars/Quest.cs b/Daybreak.Shared/Models/Guildwars/Quest.cs index e6c27227..16d1ef55 100644 --- a/Daybreak.Shared/Models/Guildwars/Quest.cs +++ b/Daybreak.Shared/Models/Guildwars/Quest.cs @@ -1,8 +1,5 @@ using Daybreak.Shared.Converters; using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; namespace Daybreak.Shared.Models.Guildwars; @@ -1413,8 +1410,8 @@ public sealed class Quest : IWikiEntity public static readonly Quest PilgrimagetotheHallofHeroes = new() { Id = 1439, Name = "Pilgrimage to the Hall of Heroes", WikiUrl = "https://wiki.guildwars.com/wiki/Pilgrimage_to_the_Hall_of_Heroes" }; public static readonly Quest CrossingTheDesolation = new() { Id = 686, Name = "Crossing The Desolation", WikiUrl = "https://wiki.guildwars.com/wiki/Crossing_the_Desolation" }; - public static IEnumerable Quests { get; } = new List - { + public static IEnumerable Quests { get; } = + [ TheAscalonSettlement, TheVillainyofGalrath, BanditTrouble, @@ -2814,7 +2811,7 @@ public sealed class Quest : IWikiEntity TakeMySisterPlease, PilgrimagetotheHallofHeroes, CrossingTheDesolation - }; + ]; public static bool TryParse(int id, out Quest quest) { diff --git a/Daybreak.Shared/Models/Guildwars/Region.cs b/Daybreak.Shared/Models/Guildwars/Region.cs index c4f05d1f..9f2a9175 100644 --- a/Daybreak.Shared/Models/Guildwars/Region.cs +++ b/Daybreak.Shared/Models/Guildwars/Region.cs @@ -1,8 +1,5 @@ using Daybreak.Shared.Converters; using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; namespace Daybreak.Shared.Models.Guildwars; @@ -14,8 +11,8 @@ public sealed class Region : IWikiEntity Id = 0, Name = "Kryta", WikiUrl = "https://wiki.guildwars.com/wiki/Kryta", - Maps = new List - { + Maps = + [ Map.LionsArchCanthanNewYearOutpost, Map.LionsArchHalloweenOutpost, Map.LionsArchOutpost, @@ -45,15 +42,15 @@ public sealed class Region : IWikiEntity Map.TheBlackCurtain, Map.TwinSerpentLakes, Map.WatchtowerCoast - } + ] }; public static readonly Region MaguumaJungle = new() { Id = 1, Name = "Maguuma Jungle", WikiUrl = "https://wiki.guildwars.com/wiki/Maguuma_Jungle", - Maps = new List - { + Maps = + [ Map.HengeOfDenraviOutpost, Map.DruidsOverlookOutpost, Map.MaguumaStadeOutpost, @@ -72,15 +69,15 @@ public sealed class Region : IWikiEntity Map.Silverwood, Map.TangleRoot, Map.TheFalls - } + ] }; public static readonly Region Ascalon = new() { Id = 2, Name = "Ascalon", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalon", - Maps = new List - { + Maps = + [ Map.AscalonCityOutpost, Map.AscalonCityWintersdayOutpost, Map.FrontierGateOutpost, @@ -105,15 +102,15 @@ public sealed class Region : IWikiEntity Map.PockmarkFlats, Map.RegentValley, Map.TheBreach - } + ] }; public static readonly Region ShiverpeakMountains = new() { Id = 3, Name = "Shiverpeak Mountains", WikiUrl = "https://wiki.guildwars.com/wiki/Shiverpeak_Mountains", - Maps = new List - { + Maps = + [ Map.BeaconsPerchOutpost, Map.IceToothCaveOutpost, Map.YaksBendOutpost, @@ -154,15 +151,15 @@ public sealed class Region : IWikiEntity Map.TalusChute, Map.TascasDemise, Map.WitmansFolly - } + ] }; public static readonly Region HeroesAscent = new() { Id = 4, Name = "Heroes' Ascent", WikiUrl = "https://wiki.guildwars.com/wiki/Heroes%27_Ascent", - Maps = new List - { + Maps = + [ Map.BurialMoundsMission, Map.FetidRiverMission, Map.TheUnderworldArenaMission, @@ -176,15 +173,15 @@ public sealed class Region : IWikiEntity Map.SacredTemplesMission, Map.ScarredEarth, Map.ScarredEarth2 - } + ] }; public static readonly Region CrystalDesert = new() { Id = 5, Name = "Crystal Desert", WikiUrl = "https://wiki.guildwars.com/wiki/Crystal_Desert", - Maps = new List - { + Maps = + [ Map.TheAmnoonOasisOutpost, Map.DestinysGorgeOutpost, Map.HeroesAudienceOutpost, @@ -204,30 +201,30 @@ public sealed class Region : IWikiEntity Map.TheAridSea, Map.TheScar, Map.VultureDrifts - } + ] }; public static readonly Region RingOfFireIslands = new() { Id = 6, Name = "Ring of Fire Islands", WikiUrl = "https://wiki.guildwars.com/wiki/Ring_of_Fire_Islands", - Maps = new List - { + Maps = + [ Map.EmberLightCampOutpost, Map.AbaddonsMouth, Map.HellsPrecipice, Map.RingOfFire, Map.PerditionRock, Map.TheFissureofWoe - } + ] }; public static readonly Region PresearingAscalon = new() { Id = 7, Name = "Pre Searing Ascalon", WikiUrl = "https://wiki.guildwars.com/wiki/Ascalon_(pre-Searing)", - Maps = new List - { + Maps = + [ Map.AscalonCityPresearing, Map.AshfordAbbeyOutpost, Map.AshfordCatacombs1070AE, @@ -242,15 +239,15 @@ public sealed class Region : IWikiEntity Map.TheCatacombs, Map.TheNorthlands, Map.WizardsFolly - } + ] }; public static readonly Region KainengCity = new() { Id = 8, Name = "Kaineng City", WikiUrl = "https://wiki.guildwars.com/wiki/Kaineng_City", - Maps = new List - { + Maps = + [ Map.KainengCenterOutpost, Map.KainengCenterCanthanNewYearOutpost, Map.KainengCenterSunspearsInCantha, @@ -291,15 +288,15 @@ public sealed class Region : IWikiEntity Map.WajjunBazaarWindsOfChangeMinistryOfOppression, Map.WajjunBazaarWindsOfChangeViolenceInTheStreets, Map.XaquangSkyway - } + ] }; public static readonly Region EchovaldForest = new() { Id = 9, Name = "Echovald Forest", WikiUrl = "https://wiki.guildwars.com/wiki/Echovald_Forest", - Maps = new List - { + Maps = + [ Map.HouseZuHeltzerOutpost, Map.AspenwoodGateKurzickOutpost, Map.BrauerAcademyOutpost, @@ -326,15 +323,15 @@ public sealed class Region : IWikiEntity Map.MelandrusHope, Map.MorostavTrail, Map.MourningVeilFalls - } + ] }; public static readonly Region TheJadeSea = new() { Id = 10, Name = "The Jade Sea", WikiUrl = "https://wiki.guildwars.com/wiki/The_Jade_Sea", - Maps = new List - { + Maps = + [ Map.CavalonOutpost, Map.AspenwoodGateLuxonOutpost, Map.BaiPaasuReachOutpost, @@ -362,15 +359,15 @@ public sealed class Region : IWikiEntity Map.MountQinkai, Map.RheasCrater, Map.SilentSurf - } + ] }; public static readonly Region ShingJeaIsland = new() { Id = 11, Name = "Shing Jea Island", WikiUrl = "https://wiki.guildwars.com/wiki/Shing_Jea_Island", - Maps = new List - { + Maps = + [ Map.ShingJeaArena, Map.ShingJeaArenaMission, Map.ShingJeaMonasteryCanthanNewYearOutpost, @@ -403,15 +400,15 @@ public sealed class Region : IWikiEntity Map.PanjiangPeninsula, Map.SaoshangTrail, Map.SunquaVale - } + ] }; public static readonly Region Kourna = new() { Id = 12, Name = "Kourna", WikiUrl = "https://wiki.guildwars.com/wiki/Kourna", - Maps = new List - { + Maps = + [ Map.SunspearSanctuaryOutpost, Map.CampHojanuOutpost, Map.WehhanTerracesOutpost, @@ -435,15 +432,15 @@ public sealed class Region : IWikiEntity Map.TheFloodplainOfMahnkelon, Map.TuraisProcession, Map.NightfallenCoast - } + ] }; public static readonly Region Vabbi = new() { Id = 13, Name = "Vabbi", WikiUrl = "https://wiki.guildwars.com/wiki/Vabbi", - Maps = new List - { + Maps = + [ Map.TheKodashBazaarOutpost, Map.BasaltGrottoOutpost, Map.ChantryOfSecretsOutpost, @@ -468,15 +465,15 @@ public sealed class Region : IWikiEntity Map.VehtendiValley, Map.WildernessOfBahdza, Map.YatendiCanyons - } + ] }; public static readonly Region TheDesolation = new() { Id = 14, Name = "TheDesolation", WikiUrl = "https://wiki.guildwars.com/wiki/The_Desolation", - Maps = new List - { + Maps = + [ Map.BonePalaceOutpost, Map.LairOfTheForgottenOutpost, Map.TheMouthOfTormentOutpost, @@ -490,15 +487,15 @@ public sealed class Region : IWikiEntity Map.TheRupturedHeart, Map.TheShatteredRavines, Map.TheSulfurousWastes - } + ] }; public static readonly Region Istan = new() { Id = 15, Name = "Istan", WikiUrl = "https://wiki.guildwars.com/wiki/Istan", - Maps = new List - { + Maps = + [ Map.KamadanJewelOfIstanCanthanNewYearOutpost, Map.KamadanJewelOfIstanExplorable, Map.KamadanJewelOfIstanHalloweenOutpost, @@ -529,15 +526,15 @@ public sealed class Region : IWikiEntity Map.PlainsOfJarin, Map.SunDocks, Map.ZehlonReach - } + ] }; public static readonly Region RealmOfTorment = new() { Id = 16, Name = "Realm of Torment", WikiUrl = "https://wiki.guildwars.com/wiki/Realm_of_Torment", - Maps = new List - { + Maps = + [ Map.DomainOfAnguish, Map.GateOfTormentOutpost, Map.GateOfFearOutpost, @@ -556,15 +553,15 @@ public sealed class Region : IWikiEntity Map.NightfallenGarden, Map.NightfallenJahai, Map.ThroneOfSecrets - } + ] }; public static readonly Region TarnishedCoast = new() { Id = 17, Name = "Tarnished Coast", WikiUrl = "https://wiki.guildwars.com/wiki/Tarnished_Coast", - Maps = new List - { + Maps = + [ Map.RataSumOutpost, Map.GaddsEncampmentOutpost, Map.TarnishedHavenOutpost, @@ -587,15 +584,15 @@ public sealed class Region : IWikiEntity Map.RivenEarth, Map.SparkflySwamp, Map.VerdantCascades - } + ] }; public static readonly Region DepthsOfTyria = new() { Id = 18, Name = "Depths Of Tyria", WikiUrl = "https://wiki.guildwars.com/wiki/Depths_of_Tyria", - Maps = new List - { + Maps = + [ Map.CentralTransferChamberOutpost, Map.DestructionsDepthsMission, Map.DestructionsDepthsLevel1, @@ -657,15 +654,15 @@ public sealed class Region : IWikiEntity Map.VloxenExcavationsLevel1, Map.VloxenExcavationsLevel2, Map.VloxenExcavationsLevel3 - } + ] }; public static readonly Region FarShiverpeaks = new() { Id = 19, Name = "Far Shiverpeaks", WikiUrl = "https://wiki.guildwars.com/wiki/Far_Shiverpeaks", - Maps = new List - { + Maps = + [ Map.GunnarsHoldOutpost, Map.BorealStationOutpost, Map.EyeOfTheNorthOutpost, @@ -693,15 +690,15 @@ public sealed class Region : IWikiEntity Map.NorrhartDomains, Map.PolymockGlacier, Map.VarajarFells - } + ] }; public static readonly Region CharrHomelands = new() { Id = 20, Name = "Charr Homelands", WikiUrl = "https://wiki.guildwars.com/wiki/Charr_Homelands", - Maps = new List - { + Maps = + [ Map.DoomloreShrineOutpost, Map.AgainstTheCharr, Map.AgainstTheCharrMission, @@ -715,15 +712,15 @@ public sealed class Region : IWikiEntity Map.GrothmarWardowns, Map.PolymockCrossing, Map.SacnothValley - } + ] }; public static readonly Region TheBattleIsles = new() { Id = 21, Name = "The Battle Isles", WikiUrl = "https://wiki.guildwars.com/wiki/The_Battle_Isles", - Maps = new List - { + Maps = + [ Map.GreatTempleOfBalthazarOutpost, Map.IsleOfTheDeadGuildHall, Map.IsleOfTheDeadGuildHallMission, @@ -773,53 +770,53 @@ public sealed class Region : IWikiEntity Map.UnchartedIsle, Map.UnchartedIsleMission, Map.UnchartedIsleOutpost - } + ] }; public static readonly Region TheBattleOfJahai = new() { Id = 22, Name = "The Battle Of Jahai", WikiUrl = "https://wiki.guildwars.com/wiki/The_Battle_of_Jahai", - Maps = new List - { + Maps = + [ Map.TheBattleOfJahai - } + ] }; public static readonly Region TheFlightNorth = new() { Id = 23, Name = "The Flight North", WikiUrl = "https://wiki.guildwars.com/wiki/The_Flight_North", - Maps = new List - { + Maps = + [ Map.TheFlightNorth - } + ] }; public static readonly Region TheTenguAccords = new() { Id = 24, Name = "The Tengu Accords", WikiUrl = "https://wiki.guildwars.com/wiki/The_Tengu_Accords", - Maps = new List - { + Maps = + [ Map.TheTenguAccords - } + ] }; public static readonly Region TheRiseOfTheWhiteMantle = new() { Id = 25, Name = "The Rise Of The White Mantle", WikiUrl = "https://wiki.guildwars.com/wiki/The_Rise_of_the_White_Mantle", - Maps = new List - { + Maps = + [ Map.TheRiseOfTheWhiteMantle - } + ] }; public static readonly Region Swat = new() { Id = 26 }; public static readonly Region DevRegion = new() { Id = 27 }; - public static IReadOnlyList Regions { get; } = new List() - { + public static IReadOnlyList Regions { get; } = + [ Kryta, MaguumaJungle, Ascalon, @@ -847,7 +844,7 @@ public sealed class Region : IWikiEntity TheRiseOfTheWhiteMantle, Swat, DevRegion - }; + ]; public static bool TryParse(int id, out Region region) { diff --git a/Daybreak.Shared/Models/Guildwars/Rune.cs b/Daybreak.Shared/Models/Guildwars/Rune.cs index f80e04b3..22484c1a 100644 --- a/Daybreak.Shared/Models/Guildwars/Rune.cs +++ b/Daybreak.Shared/Models/Guildwars/Rune.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace Daybreak.Shared.Models.Guildwars; +namespace Daybreak.Shared.Models.Guildwars; public sealed class Rune : ItemBase, IWikiEntity, IIconUrlEntity, IItemModHash { public static readonly Rune KnightsInsignia = new() { Id = 19152, Name = "Knight's Insignia", Modifiers = [0x25B80000, 0x240801F9, 0xA53003F2, 0xA7F80300, 0xC0000000], ModHash = "25B80000240801F9A53003F2A7F80300C0000000", WikiUrl = "https://wiki.guildwars.com/wiki/Knight's_Insignia", IconUrl = "https://wiki.guildwars.com/images/7/79/Knight%27s_Insignia.png" }; diff --git a/Daybreak.Shared/Models/Guildwars/Skill.cs b/Daybreak.Shared/Models/Guildwars/Skill.cs index 0ab98b48..2baa6dda 100644 --- a/Daybreak.Shared/Models/Guildwars/Skill.cs +++ b/Daybreak.Shared/Models/Guildwars/Skill.cs @@ -1,8 +1,5 @@ using Daybreak.Shared.Converters; using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; namespace Daybreak.Shared.Models.Guildwars; @@ -1494,7 +1491,7 @@ public sealed class Skill public static readonly Skill WeaponsofThreeForges = new() { Id = 3429, Name = "Weapons of Three Forges", Profession = Profession.Ritualist }; public static readonly Skill VowofRevolution = new() { Id = 3430, Name = "Vow of Revolution", Profession = Profession.Dervish }; public static readonly Skill HeroicRefrain = new() { Id = 3431, Name = "Heroic Refrain", Profession = Profession.Paragon }; - public static readonly IReadOnlyCollection Skills = new List + public static readonly IReadOnlyCollection Skills = [.. new List { NoSkill, ResurrectionSignet, @@ -2981,7 +2978,7 @@ public sealed class Skill WeaponsofThreeForges, VowofRevolution, HeroicRefrain, - }.OrderBy(s => s.Name).ToList(); + }.OrderBy(s => s.Name)]; public static bool TryParse(int id, out Skill skill) { diff --git a/Daybreak.Shared/Models/Guildwars/Title.cs b/Daybreak.Shared/Models/Guildwars/Title.cs index 2aa47d3b..e1afcfd5 100644 --- a/Daybreak.Shared/Models/Guildwars/Title.cs +++ b/Daybreak.Shared/Models/Guildwars/Title.cs @@ -1,8 +1,5 @@ using Daybreak.Shared.Converters; using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; namespace Daybreak.Shared.Models.Guildwars; @@ -56,8 +53,8 @@ public sealed class Title : IWikiEntity public static readonly Title Wisdom = new() { Id = 46, Name = "Wisdom", WikiUrl = "https://wiki.guildwars.com/wiki/Wisdom", Tiers = ["Seeker of Wisdom", "Collector of Wisdom", "Devotee of Wisdom", "Devourer of Wisdom", "Font of Wisdom", "Oracle of Wisdom", "Source of Wisdom"] }; public static readonly Title Codex = new() { Id = 47, Name = "Codex", WikiUrl = "https://wiki.guildwars.com/wiki/Codex_Title", Tiers = ["Codex Initiate", "Codex Acolyte", "Codex Disciple", "Codex Zealot", "Codex Stalwart", "Codex Adept", "Codex Exemplar", "Codex Prodigy", "Codex Champion", "Codex Paragon", "Codex Master", "Codex Grandmaster"] }; - public static readonly IEnumerable Titles = new List<Title> - { + public static readonly IEnumerable<Title> Titles = + [ None, Hero, TyrianCartographer, @@ -104,7 +101,7 @@ public sealed class Title : IWikiEntity TreasureHunter, Wisdom, Codex - }; + ]; public static bool TryParse(int id, out Title title) { diff --git a/Daybreak.Shared/Models/Guildwars/VialOfDye.cs b/Daybreak.Shared/Models/Guildwars/VialOfDye.cs index f5e36499..ae2743e1 100644 --- a/Daybreak.Shared/Models/Guildwars/VialOfDye.cs +++ b/Daybreak.Shared/Models/Guildwars/VialOfDye.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace Daybreak.Shared.Models.Guildwars; +namespace Daybreak.Shared.Models.Guildwars; public sealed class VialOfDye : ItemBase, IItemModHash, IWikiEntity, IIconUrlEntity { diff --git a/Daybreak.Shared/Models/Interop/AreaContext.cs b/Daybreak.Shared/Models/Interop/AreaContext.cs deleted file mode 100644 index cff95efd..00000000 --- a/Daybreak.Shared/Models/Interop/AreaContext.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct AreaContext -{ - [FieldOffset(0x0000)] - public readonly uint Campaign; - - [FieldOffset(0x0004)] - public readonly uint Continent; - - [FieldOffset(0x0008)] - public readonly uint RegionId; - - [FieldOffset(0x000C)] - public readonly uint RegionType; - - [FieldOffset(0x0010)] - public readonly uint Flags; - - [FieldOffset(0x0018)] - public readonly uint MinPartySize; - - [FieldOffset(0x001C)] - public readonly uint MaxPartySize; - - [FieldOffset(0x0020)] - public readonly uint MinPlayerSize; - - [FieldOffset(0x0024)] - public readonly uint MaxPlayerSize; - - [FieldOffset(0x0028)] - public readonly uint ControlledOutpostId; - - [FieldOffset(0x0030)] - public readonly uint MinLevel; - - [FieldOffset(0x0034)] - public readonly uint MaxLevel; - - [FieldOffset(0x003C)] - public readonly uint MissionMapsTo; - - [FieldOffset(0x0040)] - public readonly uint IconPositionX; - - [FieldOffset(0x0044)] - public readonly uint IconPositionY; - - [FieldOffset(0x0074)] - public readonly uint NameId; - - [FieldOffset(0x0078)] - public readonly uint DescriptionId; -} diff --git a/Daybreak.Shared/Models/Interop/AreaInfoContext.cs b/Daybreak.Shared/Models/Interop/AreaInfoContext.cs deleted file mode 100644 index fc7c0fcf..00000000 --- a/Daybreak.Shared/Models/Interop/AreaInfoContext.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct AreaInfoContext -{ - [FieldOffset(0x0000)] - public readonly uint CampaignId; - [FieldOffset(0x0004)] - public readonly uint ContinentId; - [FieldOffset(0x0008)] - public readonly uint RegionId; - [FieldOffset(0x000C)] - public readonly RegionType RegionType; - [FieldOffset(0x0010)] - public readonly uint Flags; - [FieldOffset(0x0018)] - public readonly uint MinPartySize; - [FieldOffset(0x001C)] - public readonly uint MaxPartySize; - [FieldOffset(0x0020)] - public readonly uint MinPlayerSize; - [FieldOffset(0x0024)] - public readonly uint MaxPlayerSize; - [FieldOffset(0x0030)] - public readonly uint MinLevel; - [FieldOffset(0x0034)] - public readonly uint MaxLevel; - [FieldOffset(0x0040)] - public readonly uint IconPositionX; - [FieldOffset(0x0044)] - public readonly uint IconPositionY; - [FieldOffset(0x0048)] - public readonly uint IconStartX; - [FieldOffset(0x004C)] - public readonly uint IconStartY; - [FieldOffset(0x0050)] - public readonly uint IconEndX; - [FieldOffset(0x0054)] - public readonly uint IconEndY; - - public bool HasEnterButton => (this.Flags & 0x100) != 0 || (this.Flags & 0x40000) != 0; - public bool IsOnWorldMap => (this.Flags & 0x20) == 0; - public bool IsPvp => (this.Flags & 0x1) != 0; - public bool IsGuildHall => (this.Flags & 0x800000) != 0; -} diff --git a/Daybreak.Shared/Models/Interop/AttributeContext.cs b/Daybreak.Shared/Models/Interop/AttributeContext.cs deleted file mode 100644 index 5d7b2299..00000000 --- a/Daybreak.Shared/Models/Interop/AttributeContext.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public readonly struct AttributeContext -{ - public readonly uint Id; - - public readonly uint BaseLevel; - - public readonly uint ActualLevel; - - public readonly uint DecrementPoints; - - public readonly uint IncrementPoints; -} diff --git a/Daybreak.Shared/Models/Interop/BagInfo.cs b/Daybreak.Shared/Models/Interop/BagInfo.cs deleted file mode 100644 index 0b194fc5..00000000 --- a/Daybreak.Shared/Models/Interop/BagInfo.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct BagInfo -{ - [FieldOffset(0x0000)] - public readonly uint Type; - - [FieldOffset(0x0004)] - public readonly uint Index; - - [FieldOffset(0x0008)] - public readonly uint Id; - - [FieldOffset(0x000C)] - public readonly uint Container; - - [FieldOffset(0x0010)] - public readonly uint ItemsCount; - - [FieldOffset(0x0018)] - public readonly GuildwarsPointerArray<ItemInfo> Items; -} diff --git a/Daybreak.Shared/Models/Interop/EntityAllegiance.cs b/Daybreak.Shared/Models/Interop/EntityAllegiance.cs deleted file mode 100644 index 33a60663..00000000 --- a/Daybreak.Shared/Models/Interop/EntityAllegiance.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public enum EntityAllegiance : byte -{ - AllyNonAttackable = 0x1, - Neutral = 0x2, - Enemy = 0x3, - SpiritOrPet = 0x4, - Minion = 0x5, - NpcOrMinipet = 0x6 -} diff --git a/Daybreak.Shared/Models/Interop/EntityContext.cs b/Daybreak.Shared/Models/Interop/EntityContext.cs deleted file mode 100644 index accc5d9d..00000000 --- a/Daybreak.Shared/Models/Interop/EntityContext.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct EntityContext -{ - [FieldOffset(0x0014)] - public readonly uint Timer; - - [FieldOffset(0x002C)] - public readonly uint AgentId; - - [FieldOffset(0x0030)] - public readonly uint ZCoords; - - [FieldOffset(0x0058)] - public readonly uint NameProperties; - - [FieldOffset(0x0074)] - public readonly GamePosition Position; - - [FieldOffset(0x009C)] - public readonly EntityType EntityType; - - [FieldOffset(0x00F4)] - public readonly ushort EntityModelType; - - [FieldOffset(0x00F6)] - public readonly ushort AgentModelType; - - [FieldOffset(0x010A)] - public readonly byte PrimaryProfessionId; - - [FieldOffset(0x010B)] - public readonly byte SecondaryProfessionId; - - [FieldOffset(0x010C)] - public readonly byte Level; - - [FieldOffset(0x010D)] - public readonly PvpTeam TeamId; - - [FieldOffset(0x0114)] - public readonly float EnergyRegen; // Only works for main player - - [FieldOffset(0x011C)] - public readonly float CurrentEnergyPercentage; // Only works for main player - - [FieldOffset(0x0120)] - public readonly uint MaxEnergy; // Only works for main player - - [FieldOffset(0x0128)] - public readonly float HealthRegen; // Only works for main player - - [FieldOffset(0x0130)] - public readonly float CurrentHealthPercentage; // Only works for main player - - [FieldOffset(0x0134)] - public readonly uint MaxHealth; // Only works for main player - - [FieldOffset(0x0158)] - public readonly EntityState State; - - [FieldOffset(0x01B1)] - public readonly EntityAllegiance Allegiance; -} diff --git a/Daybreak.Shared/Models/Interop/EntityState.cs b/Daybreak.Shared/Models/Interop/EntityState.cs deleted file mode 100644 index ff27774f..00000000 --- a/Daybreak.Shared/Models/Interop/EntityState.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public enum EntityState -{ - Dead = 0x08, - Boss = 0xC00, - Spirit = 0x40000, - ToBeCleanedUp = 0x40008, - Player = 0x400000, -} diff --git a/Daybreak.Shared/Models/Interop/EntityType.cs b/Daybreak.Shared/Models/Interop/EntityType.cs deleted file mode 100644 index 42b455cf..00000000 --- a/Daybreak.Shared/Models/Interop/EntityType.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public enum EntityType -{ - Living = 0xDB, - Gadget = 0x200, - Item = 0x400 -} diff --git a/Daybreak.Shared/Models/Interop/GameContext.cs b/Daybreak.Shared/Models/Interop/GameContext.cs deleted file mode 100644 index 5c4314df..00000000 --- a/Daybreak.Shared/Models/Interop/GameContext.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct GameContext -{ - private const int BaseOffset = 0x007C; - - [FieldOffset(BaseOffset + 0x0000)] - public readonly GuildwarsArray<MapEntityContext> MapEntities; - - [FieldOffset(BaseOffset + 0x0030)] - public readonly GuildwarsArray<PartyAttributesContext> PartyAttributes; - - [FieldOffset(BaseOffset + 0x04AC)] - public readonly uint QuestId; - - [FieldOffset(BaseOffset + 0x04B0)] - public readonly GuildwarsArray<QuestContext> QuestLog; - - [FieldOffset(BaseOffset + 0x0604)] - public readonly GuildwarsPointer<PlayerControlledCharContext> PlayerControlledChar; - - [FieldOffset(BaseOffset + 0x0608)] - public readonly uint HardModeUnlocked; - - [FieldOffset(BaseOffset + 0x0640)] - public readonly GuildwarsArray<ProfessionsContext> Professions; - - [FieldOffset(BaseOffset + 0x0674)] - public readonly GuildwarsArray<SkillbarContext> Skillbars; - - [FieldOffset(BaseOffset + 0x06C4)] - public readonly uint Experience; - - [FieldOffset(BaseOffset + 0x06CC)] - public readonly uint CurrentKurzick; - - [FieldOffset(BaseOffset + 0x06D4)] - public readonly uint TotalKurzick; - - [FieldOffset(BaseOffset + 0x06DC)] - public readonly uint CurrentLuxon; - - [FieldOffset(BaseOffset + 0x06E4)] - public readonly uint TotalLuxon; - - [FieldOffset(BaseOffset + 0x06EC)] - public readonly uint CurrentImperial; - - [FieldOffset(BaseOffset + 0x06F4)] - public readonly uint TotalImperial; - - [FieldOffset(BaseOffset + 0x070C)] - public readonly uint Level; - - [FieldOffset(BaseOffset + 0x0714)] - public readonly uint Morale; - - [FieldOffset(BaseOffset + 0x071C)] - public readonly uint CurrentBalthazar; - - [FieldOffset(BaseOffset + 0x0724)] - public readonly uint TotalBalthazar; - - [FieldOffset(BaseOffset + 0x072C)] - public readonly uint CurrentSkillPoints; - - [FieldOffset(BaseOffset + 0x0734)] - public readonly uint TotalSkillPoints; - - [FieldOffset(BaseOffset + 0x073C)] - public readonly uint MaxKurzick; - - [FieldOffset(BaseOffset + 0x0740)] - public readonly uint MaxLuxon; - - [FieldOffset(BaseOffset + 0x0744)] - public readonly uint MaxBalthazar; - - [FieldOffset(BaseOffset + 0x0748)] - public readonly uint MaxImperial; - - [FieldOffset(BaseOffset + 0x0770)] - public readonly GuildwarsArray<MapIconContext> MissionMapIcons; - - [FieldOffset(BaseOffset + 0x0780)] - public readonly GuildwarsArray<NpcContext> Npcs; - - [FieldOffset(BaseOffset + 0x790)] - public readonly GuildwarsArray<PlayerContext> Players; - - [FieldOffset(BaseOffset + 0x7A0)] - public readonly GuildwarsArray<TitleContext> Titles; - - [FieldOffset(BaseOffset + 0x7B0)] - public readonly GuildwarsArray<TitleTierContext> TitlesTiers; - - [FieldOffset(BaseOffset + 0x07D0)] - public readonly uint FoesKilled; - - [FieldOffset(BaseOffset + 0x07D4)] - public readonly uint FoesToKill; -} diff --git a/Daybreak.Shared/Models/Interop/GamePosition.cs b/Daybreak.Shared/Models/Interop/GamePosition.cs deleted file mode 100644 index 217b11b1..00000000 --- a/Daybreak.Shared/Models/Interop/GamePosition.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public struct GamePosition -{ - public float X; - public float Y; - public uint Plane; -} diff --git a/Daybreak.Shared/Models/Interop/GenericGuildwarsArray.cs b/Daybreak.Shared/Models/Interop/GenericGuildwarsArray.cs deleted file mode 100644 index a2111673..00000000 --- a/Daybreak.Shared/Models/Interop/GenericGuildwarsArray.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public readonly struct GenericGuildwarsArray -{ - public readonly uint Buffer; - - public readonly uint Capacity; - - public readonly uint Size; - - public readonly uint Param; -} diff --git a/Daybreak.Shared/Models/Interop/GlobalContext.cs b/Daybreak.Shared/Models/Interop/GlobalContext.cs deleted file mode 100644 index f433d693..00000000 --- a/Daybreak.Shared/Models/Interop/GlobalContext.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct GlobalContext -{ - [FieldOffset(0x0008)] - public readonly GuildwarsPointer<InstanceContext> InstanceContext; - - [FieldOffset(0x0014)] - public readonly GuildwarsPointer<MapContext> MapContext; - - [FieldOffset(0x002C)] - public readonly GuildwarsPointer<GameContext> GameContext; - - [FieldOffset(0x0040)] - public readonly GuildwarsPointer<ItemContext> ItemContext; - - [FieldOffset(0x0044)] - public readonly GuildwarsPointer<UserContext> UserContext; - - [FieldOffset(0x004C)] - public readonly GuildwarsPointer<PartyContext> PartyContext; -} diff --git a/Daybreak.Shared/Models/Interop/GuildwarsArray.cs b/Daybreak.Shared/Models/Interop/GuildwarsArray.cs deleted file mode 100644 index 7d77ee98..00000000 --- a/Daybreak.Shared/Models/Interop/GuildwarsArray.cs +++ /dev/null @@ -1,42 +0,0 @@ -using Daybreak.Shared.Utils; -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Sequential)] -public readonly struct GuildwarsArray<T> -{ - public readonly GuildwarsPointer<uint> Buffer; - - public readonly uint Capacity; - - public readonly uint Size; - - public readonly uint Param; - - public bool IsValidArray(bool sizeCheck) - { - if (!this.Buffer.IsValid()) - { - return false; - } - - if (!sizeCheck) - { - return true; - } - - if (this.Capacity == this.Size) - { - return true; - } - - var expectedCapacity = MathUtils.RoundUpToTheNextHighestPowerOf2(this.Size); - if (expectedCapacity != this.Capacity) - { - return false; - } - - return true; - } -} diff --git a/Daybreak.Shared/Models/Interop/GuildwarsPointer.cs b/Daybreak.Shared/Models/Interop/GuildwarsPointer.cs deleted file mode 100644 index 541956dd..00000000 --- a/Daybreak.Shared/Models/Interop/GuildwarsPointer.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public readonly struct GuildwarsPointer<T> -{ - public readonly uint Address; - - public bool IsValid() - { - return this.Address != 0x0; - } - - public override string ToString() - { - return this.Address.ToString("X"); - } -} diff --git a/Daybreak.Shared/Models/Interop/GuildwarsPointerArray.cs b/Daybreak.Shared/Models/Interop/GuildwarsPointerArray.cs deleted file mode 100644 index 9b7580c4..00000000 --- a/Daybreak.Shared/Models/Interop/GuildwarsPointerArray.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Sequential)] -public readonly struct GuildwarsPointerArray<T> -{ - public readonly GuildwarsPointer<uint> Buffer; - - public readonly uint Capacity; - - public readonly uint Size; - - public readonly uint Param; -} diff --git a/Daybreak.Shared/Models/Interop/HenchmanPartyMember.cs b/Daybreak.Shared/Models/Interop/HenchmanPartyMember.cs deleted file mode 100644 index f044315f..00000000 --- a/Daybreak.Shared/Models/Interop/HenchmanPartyMember.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct HenchmanPartyMember -{ - [FieldOffset(0x0000)] - public readonly uint AgentId; - [FieldOffset(0x002C)] - public readonly uint Profession; - [FieldOffset(0x0030)] - public readonly uint Level; -} diff --git a/Daybreak.Shared/Models/Interop/HeroPartyMember.cs b/Daybreak.Shared/Models/Interop/HeroPartyMember.cs deleted file mode 100644 index c187d6ca..00000000 --- a/Daybreak.Shared/Models/Interop/HeroPartyMember.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public readonly struct HeroPartyMember -{ - public readonly uint AgentId; - public readonly uint OwnerPlayerId; - public readonly uint HeroId; - private readonly uint H000C; - private readonly uint H0010; - public readonly uint Level; -} diff --git a/Daybreak.Shared/Models/Interop/IPAddressContext.cs b/Daybreak.Shared/Models/Interop/IPAddressContext.cs deleted file mode 100644 index ced6e8ef..00000000 --- a/Daybreak.Shared/Models/Interop/IPAddressContext.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Sequential)] -public readonly struct IPAddressContext -{ - public readonly byte Byte1; - public readonly byte Byte2; - public readonly byte Byte3; - public readonly byte Byte4; -} diff --git a/Daybreak.Shared/Models/Interop/InstanceContext.cs b/Daybreak.Shared/Models/Interop/InstanceContext.cs deleted file mode 100644 index 03fb1146..00000000 --- a/Daybreak.Shared/Models/Interop/InstanceContext.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public readonly struct InstanceContext -{ - public const uint BaseOffset = 0x01AC; - - /// <summary> - /// Milliseconds since the instance was joined. - /// </summary> - public readonly uint Timer; -} diff --git a/Daybreak.Shared/Models/Interop/InstanceInfoContext.cs b/Daybreak.Shared/Models/Interop/InstanceInfoContext.cs deleted file mode 100644 index b9f400b5..00000000 --- a/Daybreak.Shared/Models/Interop/InstanceInfoContext.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; -public readonly struct InstanceInfoContext -{ - public readonly GuildwarsPointer<uint> TerrainInfo; - public readonly InstanceType InstanceType; - public readonly GuildwarsPointer<AreaInfoContext> AreaInfo; - public readonly uint TerrainCount; - public readonly GuildwarsPointer<uint> TerrainInfo2; -} diff --git a/Daybreak.Shared/Models/Interop/InstanceType.cs b/Daybreak.Shared/Models/Interop/InstanceType.cs deleted file mode 100644 index f8313c50..00000000 --- a/Daybreak.Shared/Models/Interop/InstanceType.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public enum InstanceType -{ - Outpost, - Explorable, - Loading -} diff --git a/Daybreak.Shared/Models/Interop/InventoryContext.cs b/Daybreak.Shared/Models/Interop/InventoryContext.cs deleted file mode 100644 index f98f2255..00000000 --- a/Daybreak.Shared/Models/Interop/InventoryContext.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct InventoryContext -{ - [FieldOffset(0x0004)] - public readonly GuildwarsPointer<BagInfo> Backpack; - - [FieldOffset(0x0008)] - public readonly GuildwarsPointer<BagInfo> BeltPouch; - - [FieldOffset(0x000C)] - public readonly GuildwarsPointer<BagInfo> Bag1; - - [FieldOffset(0x0010)] - public readonly GuildwarsPointer<BagInfo> Bag2; - - [FieldOffset(0x0014)] - public readonly GuildwarsPointer<BagInfo> EquipmentPack; - - [FieldOffset(0x0018)] - public readonly GuildwarsPointer<BagInfo> MaterialStorage; - - [FieldOffset(0x001C)] - public readonly GuildwarsPointer<BagInfo> UnclaimedItems; - - [FieldOffset(0x0020)] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 14)] - public readonly GuildwarsPointer<BagInfo>[] StoragePanes; - - [FieldOffset(0x0058)] - public readonly GuildwarsPointer<BagInfo> EquippedItems; -} diff --git a/Daybreak.Shared/Models/Interop/ItemContext.cs b/Daybreak.Shared/Models/Interop/ItemContext.cs deleted file mode 100644 index 7f8a355d..00000000 --- a/Daybreak.Shared/Models/Interop/ItemContext.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct ItemContext -{ - [FieldOffset(0x0024)] - public readonly GuildwarsPointerArray<BagInfo> Bags; - - [FieldOffset(0x00B8)] - public readonly GuildwarsPointerArray<ItemInfo> Items; - - [FieldOffset(0x00F8)] - public readonly GuildwarsPointer<InventoryContext> Inventory; -} diff --git a/Daybreak.Shared/Models/Interop/ItemInfo.cs b/Daybreak.Shared/Models/Interop/ItemInfo.cs deleted file mode 100644 index 402c9707..00000000 --- a/Daybreak.Shared/Models/Interop/ItemInfo.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct ItemInfo -{ - [FieldOffset(0x0000)] - public readonly uint Id; - - [FieldOffset(0x0004)] - public readonly uint EntityId; - - [FieldOffset(0x000C)] - public readonly uint ContainingBagAddress; // Used only to determine which bag the item belongs to - - [FieldOffset(0x0010)] - public readonly uint ModifierArrayAddress; - - [FieldOffset(0x0014)] - public readonly uint ModifierCount; - - [FieldOffset(0x0018)] - public readonly GuildwarsPointer<string> CustomizedPtr; - - [FieldOffset(0x0020)] - public readonly byte Type; - - [FieldOffset(0x0024)] - public readonly uint Value; - - [FieldOffset(0x002C)] - public readonly uint ModelId; - - [FieldOffset(0x0030)] - public readonly GuildwarsPointer<string> InfoPtr; - - [FieldOffset(0x003C)] - public readonly GuildwarsPointer<string> ItemNamePtr; - - [FieldOffset(0x004C)] - public readonly ushort Quantity; - - [FieldOffset(0x0050)] - public readonly byte Slot; -} diff --git a/Daybreak.Shared/Models/Interop/ItemModifier.cs b/Daybreak.Shared/Models/Interop/ItemModifier.cs deleted file mode 100644 index a24acb47..00000000 --- a/Daybreak.Shared/Models/Interop/ItemModifier.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public readonly struct ItemModifier -{ - public readonly uint Modifier; - public readonly uint Identifier => this.Modifier >> 16; - public readonly uint Argument1 => (this.Modifier & 0x0000FF00) >> 8; - public readonly uint Argument2 => this.Modifier & 0x000000FF; -} diff --git a/Daybreak.Shared/Models/Interop/LoginCharacterContext.cs b/Daybreak.Shared/Models/Interop/LoginCharacterContext.cs deleted file mode 100644 index f05b5597..00000000 --- a/Daybreak.Shared/Models/Interop/LoginCharacterContext.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] -public readonly struct LoginCharacterContext -{ - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 44)] - public readonly byte[] ContextBytes; - - public string CharacterName => - new(Encoding.Unicode.GetString(this.ContextBytes, 4, 40).TakeWhile(c => char.IsLetterOrDigit(c) || char.IsWhiteSpace(c)).ToArray()); -} diff --git a/Daybreak.Shared/Models/Interop/MapContext.cs b/Daybreak.Shared/Models/Interop/MapContext.cs deleted file mode 100644 index 6898a6f9..00000000 --- a/Daybreak.Shared/Models/Interop/MapContext.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct MapContext -{ - [FieldOffset(0x0000)] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x14)] - public readonly float[] Boundaries; - - /// <summary> - /// Ptr for the PathingMap. Needs to follow this pointer and then next pointer as well to reach the PathingMapContext. - /// </summary> - [FieldOffset(0x0074)] - public readonly uint PathingMapContextPtr; -} diff --git a/Daybreak.Shared/Models/Interop/MapEntityContext.cs b/Daybreak.Shared/Models/Interop/MapEntityContext.cs deleted file mode 100644 index fc7bae79..00000000 --- a/Daybreak.Shared/Models/Interop/MapEntityContext.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct MapEntityContext -{ - [FieldOffset(0x00)] - public readonly float CurrentEnergy; - - [FieldOffset(0x04)] - public readonly float MaxEnergy; - - /// <summary> - /// Amount of regen in one second. - /// </summary> - [FieldOffset(0x08)] - public readonly float EnergyRegen; - - /// <summary> - /// Milliseconds since the last information update from the server. - /// </summary> - [FieldOffset(0x0C)] - public readonly int SkillTimestamp; - - [FieldOffset(0x20)] - public readonly float CurrentHealth; - - [FieldOffset(0x24)] - public readonly float MaxHealth; - - /// <summary> - /// Amount of regen in one second. - /// </summary> - [FieldOffset(0x28)] - public readonly float HealthRegen; - - /// <summary> - /// Flags containing the current effects on the entity. - /// 0x0001 Bleeding - /// 0x0002 Conditioned - /// 0x000A == 0xA Crippled - /// 0x0010 Dead - /// 0x0020 Deep Wound - /// 0x0040 Poisoned - /// 0x0080 Enchanted - /// 0x0400 Degen Hexed - /// 0x0800 Hexed - /// 0x8000 Holding Item - /// </summary> - [FieldOffset(0x30)] - public readonly uint Effects; -} diff --git a/Daybreak.Shared/Models/Interop/MapIconContext.cs b/Daybreak.Shared/Models/Interop/MapIconContext.cs deleted file mode 100644 index 441c13e1..00000000 --- a/Daybreak.Shared/Models/Interop/MapIconContext.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct MapIconContext -{ - [FieldOffset(0x0000)] - public readonly uint Index; - [FieldOffset(0x0004)] - public readonly float X; - [FieldOffset(0x0008)] - public readonly float Y; - [FieldOffset(0x0014)] - public readonly TeamColor Affiliation; - [FieldOffset(0x001C)] - public readonly uint Id; - [FieldOffset(0x0024)] - private readonly uint H0024; // Needed for proper struct padding -} diff --git a/Daybreak.Shared/Models/Interop/NpcContext.cs b/Daybreak.Shared/Models/Interop/NpcContext.cs deleted file mode 100644 index 7a32e6c9..00000000 --- a/Daybreak.Shared/Models/Interop/NpcContext.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct NpcContext -{ - [FieldOffset(0x0000)] - public readonly uint ModelId; - - [FieldOffset(0x000C)] - public readonly uint Sex; - - [FieldOffset(0x0010)] - public readonly uint Flags; - - [FieldOffset(0x0014)] - public readonly uint Primary; - - [FieldOffset(0x001C)] - public readonly byte DefaultLevel; - - [FieldOffset(0x0020)] - public readonly int EncName; //Ptr to enc name - - [FieldOffset(0x0028)] - public readonly int FilesCount; - - [FieldOffset(0x002C)] - public readonly int FilesCapacity; -} diff --git a/Daybreak.Shared/Models/Interop/PartyAttributesContext.cs b/Daybreak.Shared/Models/Interop/PartyAttributesContext.cs deleted file mode 100644 index 2d917216..00000000 --- a/Daybreak.Shared/Models/Interop/PartyAttributesContext.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -public readonly struct PartyAttributesContext -{ - public readonly uint AgentId; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x36)] - public readonly AttributeContext[] Attributes; -} diff --git a/Daybreak.Shared/Models/Interop/PartyContext.cs b/Daybreak.Shared/Models/Interop/PartyContext.cs deleted file mode 100644 index 4417b572..00000000 --- a/Daybreak.Shared/Models/Interop/PartyContext.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct PartyContext -{ - [FieldOffset(0x0040)] - public readonly GuildwarsPointerArray<PartyInfoContext> Parties; - - [FieldOffset(0x0054)] - public readonly GuildwarsPointer<PartyInfoContext> PlayerParty; - - [FieldOffset(0x00C0)] - public readonly GenericGuildwarsArray PartySearchPointers; -} diff --git a/Daybreak.Shared/Models/Interop/PartyInfoContext.cs b/Daybreak.Shared/Models/Interop/PartyInfoContext.cs deleted file mode 100644 index 8cb42fde..00000000 --- a/Daybreak.Shared/Models/Interop/PartyInfoContext.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct PartyInfoContext -{ - [FieldOffset(0x0000)] - public readonly uint PartyId; - - [FieldOffset(0x0004)] - public readonly GuildwarsArray<PlayerPartyMember> Players; - - [FieldOffset(0x0014)] - public readonly GuildwarsArray<HenchmanPartyMember> Henchmen; - - [FieldOffset(0x0024)] - public readonly GuildwarsArray<HeroPartyMember> Heroes; - - [FieldOffset(0x0034)] - public readonly GuildwarsArray<uint> Others; - - [FieldOffset(0x0080)] - private readonly uint H0080; -} diff --git a/Daybreak.Shared/Models/Interop/PathingMap.cs b/Daybreak.Shared/Models/Interop/PathingMap.cs deleted file mode 100644 index 9533fc1d..00000000 --- a/Daybreak.Shared/Models/Interop/PathingMap.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct PathingMap -{ - [FieldOffset(0x0000)] - public readonly uint ZPlane; - - [FieldOffset(0x0018)] - public readonly uint TrapezoidArray; - - [FieldOffset(0x001C)] - public readonly uint TrapezoidCount; - - [FieldOffset(0x0020)] - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0xD)] - private readonly uint[] H0020; -} diff --git a/Daybreak.Shared/Models/Interop/PathingMapContext.cs b/Daybreak.Shared/Models/Interop/PathingMapContext.cs deleted file mode 100644 index 5f252155..00000000 --- a/Daybreak.Shared/Models/Interop/PathingMapContext.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct PathingMapContext -{ - [FieldOffset(0x0018)] - public readonly GuildwarsArray<PathingMap> PathingMapArray; -} diff --git a/Daybreak.Shared/Models/Interop/PathingTrapezoid.cs b/Daybreak.Shared/Models/Interop/PathingTrapezoid.cs deleted file mode 100644 index 12573bc1..00000000 --- a/Daybreak.Shared/Models/Interop/PathingTrapezoid.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public readonly struct PathingTrapezoid -{ - public readonly uint Id; - - public readonly uint AdjacentPathingTrapezoid1; - - public readonly uint AdjacentPathingTrapezoid2; - - public readonly uint AdjacentPathingTrapezoid3; - - public readonly uint AdjacentPathingTrapezoid4; - - [System.Diagnostics.CodeAnalysis.SuppressMessage("CodeQuality", "IDE0051:Remove unused private members", Justification = "Used for proper padding")] - private readonly uint H0014; - - public readonly float XTL; - - public readonly float XTR; - - public readonly float YT; - - public readonly float XBL; - - public readonly float XBR; - - public readonly float YB; -} diff --git a/Daybreak.Shared/Models/Interop/PlayerContext.cs b/Daybreak.Shared/Models/Interop/PlayerContext.cs deleted file mode 100644 index b991182a..00000000 --- a/Daybreak.Shared/Models/Interop/PlayerContext.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct PlayerContext -{ - [FieldOffset(0x0000)] - public readonly int AgentId; - - [FieldOffset(0x0014)] - public readonly uint PartyFlags; - - [FieldOffset(0x0018)] - public readonly uint PrimaryProfession; - - [FieldOffset(0x001C)] - public readonly uint SecondaryProfession; - - [FieldOffset(0x0028)] - public readonly GuildwarsPointer<string> NamePointer; - - [FieldOffset(0x002C)] - public readonly uint PartyLeaderPlayerNumber; - - [FieldOffset(0x0030)] - public readonly uint ActiveTitleTier; - - [FieldOffset(0x0034)] - public readonly uint PlayerNumber; - - [FieldOffset(0x0038)] - public readonly uint PartySize; - - [FieldOffset(0x003C)] - //Ignore this field. Added so that the struct will have the proper size and be marshaled properly into the array. - private readonly GuildwarsArray<uint> HH3C; - - public bool Pvp => (this.PartyFlags & 0x800) != 0; -} diff --git a/Daybreak.Shared/Models/Interop/PlayerControlledCharContext.cs b/Daybreak.Shared/Models/Interop/PlayerControlledCharContext.cs deleted file mode 100644 index ebe86e8f..00000000 --- a/Daybreak.Shared/Models/Interop/PlayerControlledCharContext.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public readonly struct PlayerControlledCharContext -{ - public const uint BaseOffset = 0x0014; - - public readonly uint AgentId; -} diff --git a/Daybreak.Shared/Models/Interop/PlayerPartyMember.cs b/Daybreak.Shared/Models/Interop/PlayerPartyMember.cs deleted file mode 100644 index e37eefe5..00000000 --- a/Daybreak.Shared/Models/Interop/PlayerPartyMember.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public readonly struct PlayerPartyMember -{ - public readonly uint LoginNumber; - public readonly uint CalledTargetId; - public readonly uint State; - - public bool Connected => (this.State & 1) > 0; - public bool Ticked => (this.State & 2) > 0; -} diff --git a/Daybreak.Shared/Models/Interop/PreGameContext.cs b/Daybreak.Shared/Models/Interop/PreGameContext.cs deleted file mode 100644 index 40915dbb..00000000 --- a/Daybreak.Shared/Models/Interop/PreGameContext.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct PreGameContext -{ - [FieldOffset(0x0000)] - public readonly uint FrameId; - - [FieldOffset(0x0124)] - public readonly uint ChosenCharacterIndex; - - [FieldOffset(0x0140)] - public readonly uint LoginSelectionIndex; - - [FieldOffset(0x0144)] - public readonly uint Index2; - - [FieldOffset(0x0148)] - public readonly GuildwarsArray<LoginCharacterContext> LoginCharacters; -} diff --git a/Daybreak.Shared/Models/Interop/ProfessionsContext.cs b/Daybreak.Shared/Models/Interop/ProfessionsContext.cs deleted file mode 100644 index 79f00bed..00000000 --- a/Daybreak.Shared/Models/Interop/ProfessionsContext.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Sequential)] -public readonly struct ProfessionsContext -{ - public readonly uint AgentId; - - public readonly uint CurrentPrimary; - - public readonly uint CurrentSecondary; - - public readonly uint UnlockedProfessionsFlags; - - //Ignore this field. Added so that the struct will have the proper size and be marshaled properly into the array. - private readonly uint H0010; - - public bool ProfessionUnlocked(int professionId) - { - return (this.UnlockedProfessionsFlags & 1U << professionId) != 0; - } -} diff --git a/Daybreak.Shared/Models/Interop/PvpTeam.cs b/Daybreak.Shared/Models/Interop/PvpTeam.cs deleted file mode 100644 index 7f9c68c1..00000000 --- a/Daybreak.Shared/Models/Interop/PvpTeam.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public enum PvpTeam : byte -{ - None = 0, - Blue = 1, - Red = 2, - Yellow = 3 -} diff --git a/Daybreak.Shared/Models/Interop/QuestContext.cs b/Daybreak.Shared/Models/Interop/QuestContext.cs deleted file mode 100644 index 0ae77eec..00000000 --- a/Daybreak.Shared/Models/Interop/QuestContext.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Numerics; -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit)] -public readonly struct QuestContext -{ - [FieldOffset(0x0000)] - public readonly uint QuestId; - - [FieldOffset(0x0014)] - public readonly uint MapFrom; - - [FieldOffset(0x0018)] - public readonly Vector3 Marker; - - [FieldOffset(0x0028)] - public readonly uint MapTo; - - [FieldOffset(0x0030)] - //Ignore this field. Added so that the struct will have the proper size and be marshaled properly into the array. - private readonly uint HH30; -} diff --git a/Daybreak.Shared/Models/Interop/RegionType.cs b/Daybreak.Shared/Models/Interop/RegionType.cs deleted file mode 100644 index 032383d3..00000000 --- a/Daybreak.Shared/Models/Interop/RegionType.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public enum RegionType : uint -{ - AllianceBattle, - Arena, - ExplorableZone, - GuildBattleArea, - GuildHall, - MissionOutpost, - CooperativeMission, - CompetitiveMission, - EliteMission, - Challenge, - Outpost, - ZaishenBattle, - HeroesAscent, - City, - MissionArea, - HeroBattleOutpost, - HeroBattleArea, - EotnMission, - Dungeon, - Marketplace, - Unknown, - DevRegion -} diff --git a/Daybreak.Shared/Models/Interop/SkillContext.cs b/Daybreak.Shared/Models/Interop/SkillContext.cs deleted file mode 100644 index 18b6303b..00000000 --- a/Daybreak.Shared/Models/Interop/SkillContext.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Sequential)] -public readonly struct SkillContext -{ - public readonly uint Adrenaline1; - - public readonly uint Adrenaline2; - - public readonly uint Recharge; - - public readonly uint Id; - - public readonly uint Event; -} diff --git a/Daybreak.Shared/Models/Interop/SkillbarContext.cs b/Daybreak.Shared/Models/Interop/SkillbarContext.cs deleted file mode 100644 index cca3a1e6..00000000 --- a/Daybreak.Shared/Models/Interop/SkillbarContext.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Sequential, Pack = 0, Size = 0xBC)] -public readonly unsafe struct SkillbarContext -{ - public readonly uint AgentId; - - public readonly SkillContext Skill0; - - public readonly SkillContext Skill1; - - public readonly SkillContext Skill2; - - public readonly SkillContext Skill3; - - public readonly SkillContext Skill4; - - public readonly SkillContext Skill5; - - public readonly SkillContext Skill6; - - public readonly SkillContext Skill7; - - public readonly uint Disabled; - - public readonly uint Casting; - - public readonly uint H00B8; -} diff --git a/Daybreak.Shared/Models/Interop/TeamColor.cs b/Daybreak.Shared/Models/Interop/TeamColor.cs deleted file mode 100644 index c9ee6a93..00000000 --- a/Daybreak.Shared/Models/Interop/TeamColor.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; -public enum TeamColor -{ - Gray, - Blue, - Red, - Yellow, - Teal, - Purple, - Green, - GrayNeutral -} diff --git a/Daybreak.Shared/Models/Interop/TitleContext.cs b/Daybreak.Shared/Models/Interop/TitleContext.cs deleted file mode 100644 index f723f39f..00000000 --- a/Daybreak.Shared/Models/Interop/TitleContext.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public readonly struct TitleContext -{ - public readonly uint Props; - - public readonly uint CurrentPoints; - - public readonly uint CurrentTitleTierIndex; - - public readonly uint PointsNeededForCurrentRank; - - public readonly uint NextTitleTierIndex; - - public readonly uint PointsNeededForNextRank; - - public readonly uint MaxTitleRank; - - public readonly uint MaxTitleTierIndex; - - public readonly int H0020; - - public readonly int H0024; - - public bool IsPercentage => (this.Props & 1U) != 0; - - public bool HasTiers => (this.Props & 3U) == 2; -} diff --git a/Daybreak.Shared/Models/Interop/TitleIds.cs b/Daybreak.Shared/Models/Interop/TitleIds.cs deleted file mode 100644 index 8c81f179..00000000 --- a/Daybreak.Shared/Models/Interop/TitleIds.cs +++ /dev/null @@ -1,54 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public enum TitleIds -{ - Hero, - TyrianCartographer, - CanthanCartographer, - Gladiator, - Champion, - Kurzick, - Luxon, - Drunkard, - Deprecated_SkillHunter, // Pre hard mode update version - Survivor, - KindOfABigDeal, - Deprecated_TreasureHunter, // Old title, non-account bound - Deprecated_Wisdom, // Old title, non-account bound - ProtectorTyria, - ProtectorCantha, - Lucky, - Unlucky, - Sunspear, - ElonianCartographer, - ProtectorElona, - Lightbringer, - LegendaryDefenderOfAscalon, - Commander, - Gamer, - SkillHunterTyria, - VanquisherTyria, - SkillHunterCantha, - VanquisherCantha, - SkillHunterElona, - VanquisherElona, - LegendaryCartographer, - LegendaryGuardian, - LegendarySkillHunter, - LegendaryVanquisher, - SweetTooth, - GuardianTyria, - GuardianCantha, - GuardianElona, - Asura, - Deldrimor, - EbonVanguard, - Norn, - MasterOfTheNorth, - Party, - Zaishen, - TreasureHunter, - Wisdom, - Codex, - None = 0xff -} diff --git a/Daybreak.Shared/Models/Interop/TitleInfo.cs b/Daybreak.Shared/Models/Interop/TitleInfo.cs deleted file mode 100644 index 44e5402a..00000000 --- a/Daybreak.Shared/Models/Interop/TitleInfo.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public readonly struct TitleInfo -{ - public readonly uint TitleId; - public readonly uint NameId; -} diff --git a/Daybreak.Shared/Models/Interop/TitleTierContext.cs b/Daybreak.Shared/Models/Interop/TitleTierContext.cs deleted file mode 100644 index 95838f8e..00000000 --- a/Daybreak.Shared/Models/Interop/TitleTierContext.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Daybreak.Shared.Models.Interop; - -public readonly struct TitleTierContext -{ - public readonly uint Props; - - public readonly uint TierNumber; - - public readonly int TierNamePtr; - - public bool IsPercentageBased => (this.Props & 1) != 0; -} diff --git a/Daybreak.Shared/Models/Interop/UserContext.cs b/Daybreak.Shared/Models/Interop/UserContext.cs deleted file mode 100644 index d5e6cc69..00000000 --- a/Daybreak.Shared/Models/Interop/UserContext.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Runtime.InteropServices; - -namespace Daybreak.Shared.Models.Interop; - -[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Unicode)] -public readonly struct UserContext -{ - public const uint BaseOffset = 0x0074; - - [FieldOffset(0x0000)] - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x28)] - public readonly string PlayerName; - - [FieldOffset(0x0124)] - public readonly uint MapId; - - [FieldOffset(0x01B0)] - public readonly int Language; - - [FieldOffset(0x0230)] - public readonly uint PlayerNumber; - - // The following 3 fields have to be offset like this due to a bug in CLR when reading x32 mapped memory from x64 processes. - [FieldOffset(0x0344)] - public readonly char PlayerEmailFirstChar; - - [FieldOffset(0x346)] - public readonly char PlayerEmailSecondChar; - - [FieldOffset(0x348)] - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x7E)] - public readonly string PlayerEmailRemaining; -} diff --git a/Daybreak.Shared/Models/LaunchConfigurations/GuildWarsApplicationLaunchContext.cs b/Daybreak.Shared/Models/LaunchConfigurations/GuildWarsApplicationLaunchContext.cs index 6af1b65f..357767e4 100644 --- a/Daybreak.Shared/Models/LaunchConfigurations/GuildWarsApplicationLaunchContext.cs +++ b/Daybreak.Shared/Models/LaunchConfigurations/GuildWarsApplicationLaunchContext.cs @@ -1,5 +1,4 @@ -using System; -using System.Diagnostics; +using System.Diagnostics; namespace Daybreak.Shared.Models.LaunchConfigurations; diff --git a/Daybreak.Shared/Models/LaunchConfigurations/LaunchConfigurationWithCredentials.cs b/Daybreak.Shared/Models/LaunchConfigurations/LaunchConfigurationWithCredentials.cs index 3fc3afc1..02edcafe 100644 --- a/Daybreak.Shared/Models/LaunchConfigurations/LaunchConfigurationWithCredentials.cs +++ b/Daybreak.Shared/Models/LaunchConfigurations/LaunchConfigurationWithCredentials.cs @@ -1,7 +1,4 @@ -using Daybreak.Shared.Models; -using System; - -namespace Daybreak.Shared.Models.LaunchConfigurations; +namespace Daybreak.Shared.Models.LaunchConfigurations; public sealed class LaunchConfigurationWithCredentials : IEquatable<LaunchConfigurationWithCredentials> { diff --git a/Daybreak.Shared/Models/LauncherViewContext.cs b/Daybreak.Shared/Models/LauncherViewContext.cs index 631caf1a..16c23702 100644 --- a/Daybreak.Shared/Models/LauncherViewContext.cs +++ b/Daybreak.Shared/Models/LauncherViewContext.cs @@ -1,7 +1,6 @@ using Daybreak.Shared.Models.LaunchConfigurations; using Daybreak.Shared.Services.Api; using Daybreak.Shared.Services.Mods; -using System.Collections.Generic; using System.ComponentModel; namespace Daybreak.Shared.Models; diff --git a/Daybreak.Shared/Models/Log.cs b/Daybreak.Shared/Models/Log.cs index acf22fa0..d06b93c7 100644 --- a/Daybreak.Shared/Models/Log.cs +++ b/Daybreak.Shared/Models/Log.cs @@ -1,5 +1,4 @@ using Microsoft.Extensions.Logging; -using System; namespace Daybreak.Shared.Models; diff --git a/Daybreak.Shared/Models/LoginCredentials.cs b/Daybreak.Shared/Models/LoginCredentials.cs index ddc78889..22fe81a1 100644 --- a/Daybreak.Shared/Models/LoginCredentials.cs +++ b/Daybreak.Shared/Models/LoginCredentials.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Models; +namespace Daybreak.Shared.Models; public sealed class LoginCredentials : IEquatable<LoginCredentials> { diff --git a/Daybreak.Shared/Models/Menu/MenuButton.cs b/Daybreak.Shared/Models/Menu/MenuButton.cs index 2b8f9445..662daded 100644 --- a/Daybreak.Shared/Models/Menu/MenuButton.cs +++ b/Daybreak.Shared/Models/Menu/MenuButton.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Models.Menu; +namespace Daybreak.Shared.Models.Menu; public sealed class MenuButton(string name, string hint, Action<IServiceProvider> action) { diff --git a/Daybreak.Shared/Models/Menu/MenuCategory.cs b/Daybreak.Shared/Models/Menu/MenuCategory.cs index bccca2de..61927cdb 100644 --- a/Daybreak.Shared/Models/Menu/MenuCategory.cs +++ b/Daybreak.Shared/Models/Menu/MenuCategory.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; - -namespace Daybreak.Shared.Models.Menu; +namespace Daybreak.Shared.Models.Menu; public sealed class MenuCategory { private readonly List<MenuButton> buttons = []; diff --git a/Daybreak.Shared/Models/Metrics/Metric.cs b/Daybreak.Shared/Models/Metrics/Metric.cs index 9ba38652..ef0c06ac 100644 --- a/Daybreak.Shared/Models/Metrics/Metric.cs +++ b/Daybreak.Shared/Models/Metrics/Metric.cs @@ -1,5 +1,4 @@ -using System; -using System.Diagnostics.Metrics; +using System.Diagnostics.Metrics; namespace Daybreak.Shared.Models.Metrics; diff --git a/Daybreak.Shared/Models/Metrics/MetricSet.cs b/Daybreak.Shared/Models/Metrics/MetricSet.cs index ea8e22bc..3ebebcef 100644 --- a/Daybreak.Shared/Models/Metrics/MetricSet.cs +++ b/Daybreak.Shared/Models/Metrics/MetricSet.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using System.Diagnostics.Metrics; +using System.Diagnostics.Metrics; namespace Daybreak.Shared.Models.Metrics; diff --git a/Daybreak.Shared/Models/Mods/GuildWarsRunningContext.cs b/Daybreak.Shared/Models/Mods/GuildWarsRunningContext.cs index 6bcdff0d..97864e24 100644 --- a/Daybreak.Shared/Models/Mods/GuildWarsRunningContext.cs +++ b/Daybreak.Shared/Models/Mods/GuildWarsRunningContext.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace Daybreak.Shared.Models.Mods; +namespace Daybreak.Shared.Models.Mods; public sealed class GuildWarsRunningContext { public required ApplicationLauncherContext ApplicationLauncherContext { get; init; } diff --git a/Daybreak.Shared/Models/Mods/GuildWarsStartingContext.cs b/Daybreak.Shared/Models/Mods/GuildWarsStartingContext.cs index 4a56d4a8..b02f769f 100644 --- a/Daybreak.Shared/Models/Mods/GuildWarsStartingContext.cs +++ b/Daybreak.Shared/Models/Mods/GuildWarsStartingContext.cs @@ -1,6 +1,4 @@ -using Daybreak.Shared.Models; - -namespace Daybreak.Shared.Models.Mods; +namespace Daybreak.Shared.Models.Mods; public sealed class GuildWarsStartingContext { public ApplicationLauncherContext ApplicationLauncherContext { get; init; } diff --git a/Daybreak.Shared/Models/Notifications/INotification.cs b/Daybreak.Shared/Models/Notifications/INotification.cs index 19c1333b..7e716e66 100644 --- a/Daybreak.Shared/Models/Notifications/INotification.cs +++ b/Daybreak.Shared/Models/Notifications/INotification.cs @@ -1,5 +1,4 @@ using Microsoft.Extensions.Logging; -using System; namespace Daybreak.Shared.Models.Notifications; diff --git a/Daybreak.Shared/Models/Notifications/Notification.cs b/Daybreak.Shared/Models/Notifications/Notification.cs index e24d969b..53f55054 100644 --- a/Daybreak.Shared/Models/Notifications/Notification.cs +++ b/Daybreak.Shared/Models/Notifications/Notification.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.Notifications.Handling; using Microsoft.Extensions.Logging; -using System; namespace Daybreak.Shared.Models.Notifications; diff --git a/Daybreak.Shared/Models/Notifications/NotificationCancellationToken.cs b/Daybreak.Shared/Models/Notifications/NotificationCancellationToken.cs index 86df6a05..cfc28cab 100644 --- a/Daybreak.Shared/Models/Notifications/NotificationCancellationToken.cs +++ b/Daybreak.Shared/Models/Notifications/NotificationCancellationToken.cs @@ -1,5 +1,4 @@ -using System; -using System.Core.Extensions; +using System.Core.Extensions; using System.Extensions; namespace Daybreak.Shared.Models.Notifications; diff --git a/Daybreak.Shared/Models/Options/OptionProperty.cs b/Daybreak.Shared/Models/Options/OptionProperty.cs index f9bdc362..ce90e501 100644 --- a/Daybreak.Shared/Models/Options/OptionProperty.cs +++ b/Daybreak.Shared/Models/Options/OptionProperty.cs @@ -1,27 +1,15 @@ using Daybreak.Shared.Validators; -using System; using System.ComponentModel; using System.Core.Extensions; namespace Daybreak.Shared.Models.Options; -public sealed class OptionProperty +public sealed class OptionProperty(string name, string description, IValidator validator, Action<object> setter, Func<object> getter, TypeConverter converter, Type type) { - public string Name { get; } - public string Description { get; } - public IValidator Validator { get; } - public Action<object> Setter { get; } - public Func<object> Getter { get; } - public TypeConverter Converter { get; } - public Type Type { get; } - - public OptionProperty(string name, string description, IValidator validator, Action<object> setter, Func<object> getter, TypeConverter converter, Type type) - { - this.Name = name.ThrowIfNull(); - this.Description = description; - this.Validator = validator.ThrowIfNull(); - this.Setter = setter.ThrowIfNull(); - this.Getter = getter.ThrowIfNull(); - this.Converter = converter.ThrowIfNull(); - this.Type = type.ThrowIfNull(); - } + public string Name { get; } = name.ThrowIfNull(); + public string Description { get; } = description; + public IValidator Validator { get; } = validator.ThrowIfNull(); + public Action<object> Setter { get; } = setter.ThrowIfNull(); + public Func<object> Getter { get; } = getter.ThrowIfNull(); + public TypeConverter Converter { get; } = converter.ThrowIfNull(); + public Type Type { get; } = type.ThrowIfNull(); } diff --git a/Daybreak.Shared/Models/Options/OptionSection.cs b/Daybreak.Shared/Models/Options/OptionSection.cs index be7228e2..42b69d0e 100644 --- a/Daybreak.Shared/Models/Options/OptionSection.cs +++ b/Daybreak.Shared/Models/Options/OptionSection.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Models.Options; +namespace Daybreak.Shared.Models.Options; public sealed class OptionSection { public string? Name { get; init; } diff --git a/Daybreak.Shared/Models/Options/OptionSetter.cs b/Daybreak.Shared/Models/Options/OptionSetter.cs index 94412a1d..1e646c0f 100644 --- a/Daybreak.Shared/Models/Options/OptionSetter.cs +++ b/Daybreak.Shared/Models/Options/OptionSetter.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Models.Options; +namespace Daybreak.Shared.Models.Options; public sealed class OptionSetter { diff --git a/Daybreak.Shared/Models/Plugins/PluginConfigurationBase.cs b/Daybreak.Shared/Models/Plugins/PluginConfigurationBase.cs index b9b07e57..933609e3 100644 --- a/Daybreak.Shared/Models/Plugins/PluginConfigurationBase.cs +++ b/Daybreak.Shared/Models/Plugins/PluginConfigurationBase.cs @@ -40,7 +40,7 @@ public abstract class PluginConfigurationBase { } - public HttpMessageHandler SetupLoggingAndMetrics<T>(System.IServiceProvider serviceProvider) + public static HttpMessageHandler SetupLoggingAndMetrics<T>(System.IServiceProvider serviceProvider) { var logger = serviceProvider.GetRequiredService<ILogger<T>>(); var metricsService = serviceProvider.GetRequiredService<IMetricsService>(); @@ -51,12 +51,12 @@ public abstract class PluginConfigurationBase new LoggingHttpMessageHandler(logger!) { InnerHandler = new HttpClientHandler() }); } - public void SetupDaybreakUserAgent(HttpRequestHeaders httpRequestHeaders) + public static void SetupDaybreakUserAgent(HttpRequestHeaders httpRequestHeaders) { httpRequestHeaders.ThrowIfNull().TryAddWithoutValidation("User-Agent", DaybreakUserAgent); } - public void SetupChromeImpersonationUserAgent(HttpRequestHeaders httpRequestHeaders) + public static void SetupChromeImpersonationUserAgent(HttpRequestHeaders httpRequestHeaders) { httpRequestHeaders.ThrowIfNull().TryAddWithoutValidation("User-Agent", ChromeImpersonationUserAgent); } diff --git a/Daybreak.Shared/Models/PostUpdateActionBase.cs b/Daybreak.Shared/Models/PostUpdateActionBase.cs index b3421ddb..03e53f17 100644 --- a/Daybreak.Shared/Models/PostUpdateActionBase.cs +++ b/Daybreak.Shared/Models/PostUpdateActionBase.cs @@ -1,6 +1,4 @@ -using System.Threading.Tasks; - -namespace Daybreak.Shared.Models; +namespace Daybreak.Shared.Models; public abstract class PostUpdateActionBase { diff --git a/Daybreak.Shared/Models/Progress/ActionStatus.cs b/Daybreak.Shared/Models/Progress/ActionStatus.cs index e812c8ec..58472199 100644 --- a/Daybreak.Shared/Models/Progress/ActionStatus.cs +++ b/Daybreak.Shared/Models/Progress/ActionStatus.cs @@ -4,17 +4,15 @@ namespace Daybreak.Shared.Models.Progress; public abstract class ActionStatus : INotifyPropertyChanged { - private LoadStatus currentStep = default!; - public event PropertyChangedEventHandler? PropertyChanged; public LoadStatus CurrentStep { - get => this.currentStep; + get; set { - this.currentStep = value; + field = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.CurrentStep))); } - } + } = default!; } diff --git a/Daybreak.Shared/Models/Progress/DownloadStatus.cs b/Daybreak.Shared/Models/Progress/DownloadStatus.cs index 0e5f92d9..8854f7ea 100644 --- a/Daybreak.Shared/Models/Progress/DownloadStatus.cs +++ b/Daybreak.Shared/Models/Progress/DownloadStatus.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Models.Progress; +namespace Daybreak.Shared.Models.Progress; public abstract class DownloadStatus : ActionStatus { diff --git a/Daybreak.Shared/Models/Progress/GuildwarsInstallationStatus.cs b/Daybreak.Shared/Models/Progress/GuildwarsInstallationStatus.cs index 24b12dfc..6426d96b 100644 --- a/Daybreak.Shared/Models/Progress/GuildwarsInstallationStatus.cs +++ b/Daybreak.Shared/Models/Progress/GuildwarsInstallationStatus.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Models.Progress; +namespace Daybreak.Shared.Models.Progress; public sealed class GuildwarsInstallationStatus : DownloadStatus { public static readonly LoadStatus StartingStep = new GuildwarsInstallationStep("Starting"); @@ -25,11 +23,7 @@ public sealed class GuildwarsInstallationStatus : DownloadStatus } } - public sealed class UnpackingProgressStep : DownloadProgressStep + public sealed class UnpackingProgressStep(double progress, TimeSpan? eta) : DownloadProgressStep("Unpacking", progress, eta) { - public UnpackingProgressStep(double progress, TimeSpan? eta) - : base("Unpacking", progress, eta) - { - } } } diff --git a/Daybreak.Shared/Models/Progress/IconDownloadStatus.cs b/Daybreak.Shared/Models/Progress/IconDownloadStatus.cs index 70f03363..93d883af 100644 --- a/Daybreak.Shared/Models/Progress/IconDownloadStatus.cs +++ b/Daybreak.Shared/Models/Progress/IconDownloadStatus.cs @@ -11,19 +11,17 @@ public sealed class IconDownloadStatus : INotifyPropertyChanged public static IconDownloadStep Downloading(string iconName, double progress) => new DownloadingIconDownloadStep(iconName, progress); public static IconDownloadStep Stopped(double progress) => new StoppedIconDownloadStep(progress); - private IconDownloadStep currentStep = StartingStep; - public event PropertyChangedEventHandler? PropertyChanged; public IconDownloadStep CurrentStep { - get => this.currentStep; + get; set { - this.currentStep = value; + field = value; this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.CurrentStep))); } - } + } = StartingStep; public abstract class IconDownloadStep : LoadStatus { @@ -33,25 +31,16 @@ public sealed class IconDownloadStatus : INotifyPropertyChanged } } - public class StoppedIconDownloadStep : IconDownloadStep + public class StoppedIconDownloadStep(double progress) : IconDownloadStep("Download stopped", progress) { - public StoppedIconDownloadStep(double progress) : base("Download stopped", progress) - { - } } - public class DownloadingIconDownloadStep : IconDownloadStep + public class DownloadingIconDownloadStep(string skillName, double progress) : IconDownloadStep($"Downloading [{skillName}] icon", progress) { - public DownloadingIconDownloadStep(string skillName, double progress) : base($"Downloading [{skillName}] icon", progress) - { - } } - public class CheckingIconDownloadStep : IconDownloadStep + public class CheckingIconDownloadStep(string skillName, double progress) : IconDownloadStep($"Checking [{skillName}] icon", progress) { - public CheckingIconDownloadStep(string skillName, double progress) : base($"Checking [{skillName}] icon", progress) - { - } } public class NotSupportedIconDownloadStep : IconDownloadStep diff --git a/Daybreak.Shared/Models/Progress/LoadStatus.cs b/Daybreak.Shared/Models/Progress/LoadStatus.cs index 61d85e96..76669dd8 100644 --- a/Daybreak.Shared/Models/Progress/LoadStatus.cs +++ b/Daybreak.Shared/Models/Progress/LoadStatus.cs @@ -1,11 +1,7 @@ namespace Daybreak.Shared.Models.Progress; -public abstract class LoadStatus +public abstract class LoadStatus(string description) { - public string Description { get; set; } + public string Description { get; set; } = description; public double Progress { get; set; } - public LoadStatus(string description) - { - this.Description = description; - } } diff --git a/Daybreak.Shared/Models/Progress/StartupStatus.cs b/Daybreak.Shared/Models/Progress/StartupStatus.cs index afba9037..54782472 100644 --- a/Daybreak.Shared/Models/Progress/StartupStatus.cs +++ b/Daybreak.Shared/Models/Progress/StartupStatus.cs @@ -10,22 +10,17 @@ public sealed class StartupStatus : INotifyPropertyChanged public event PropertyChangedEventHandler? PropertyChanged; - private StartupStep currentStep = Starting; - public StartupStep CurrentStep { - get => this.currentStep; + get; set { - this.currentStep = value; + field = value; this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.CurrentStep))); } - } + } = Starting; - public class StartupStep : LoadStatus + public class StartupStep(string description) : LoadStatus(description) { - public StartupStep(string description) : base(description) - { - } } } diff --git a/Daybreak.Shared/Models/Progress/UpdateStatus.cs b/Daybreak.Shared/Models/Progress/UpdateStatus.cs index aa4af922..03aca384 100644 --- a/Daybreak.Shared/Models/Progress/UpdateStatus.cs +++ b/Daybreak.Shared/Models/Progress/UpdateStatus.cs @@ -11,10 +11,7 @@ public sealed class UpdateStatus : DownloadStatus this.CurrentStep = Starting; } - public class UpdateStep : LoadStatus + public class UpdateStep(string name) : LoadStatus(name) { - public UpdateStep(string name) : base(name) - { - } } } diff --git a/Daybreak.Shared/Models/ReShade/ShaderPackage.cs b/Daybreak.Shared/Models/ReShade/ShaderPackage.cs index 47cac92b..a94c6a09 100644 --- a/Daybreak.Shared/Models/ReShade/ShaderPackage.cs +++ b/Daybreak.Shared/Models/ReShade/ShaderPackage.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace Daybreak.Shared.Models.ReShade; +namespace Daybreak.Shared.Models.ReShade; public sealed class ShaderPackage { diff --git a/Daybreak.Shared/Models/ScopeMetadata.cs b/Daybreak.Shared/Models/ScopeMetadata.cs index b8e5ea25..301f264c 100644 --- a/Daybreak.Shared/Models/ScopeMetadata.cs +++ b/Daybreak.Shared/Models/ScopeMetadata.cs @@ -2,12 +2,7 @@ namespace Daybreak.Shared.Models; -public class ScopeMetadata +public class ScopeMetadata(CorrelationVector correlationVector) { - public CorrelationVector CorrelationVector { get; set; } - - public ScopeMetadata(CorrelationVector correlationVector) - { - this.CorrelationVector = correlationVector; - } + public CorrelationVector CorrelationVector { get; set; } = correlationVector; } \ No newline at end of file diff --git a/Daybreak.Shared/Models/SecureString.cs b/Daybreak.Shared/Models/SecureString.cs index bee11831..49ab439a 100644 --- a/Daybreak.Shared/Models/SecureString.cs +++ b/Daybreak.Shared/Models/SecureString.cs @@ -1,7 +1,6 @@ using Daybreak.Shared.Utils; using Newtonsoft.Json; -using System; -using System.Linq; +using System.Core.Extensions; using System.Security.Cryptography; namespace Daybreak.Shared.Models; @@ -50,22 +49,15 @@ public sealed class SecureString public static implicit operator SecureString(string s) => new(s); public static SecureString operator +(SecureString? ss1, SecureString? ss2) { - if (ss1 is null) throw new ArgumentNullException(nameof(ss1)); - if (ss2 is null) throw new ArgumentNullException(nameof(ss2)); - - return new SecureString(ss1.DecryptedValue!.Concat(ss2.DecryptedValue!).ToArray()); + return new SecureString([.. ss1.ThrowIfNull().DecryptedValue!, .. ss2.ThrowIfNull().DecryptedValue!]); } public static SecureString operator +(SecureString? ss1, string s2) { - if (ss1 is null) throw new ArgumentNullException(nameof(ss1)); - - return new SecureString(ss1.DecryptedValue!.Concat(s2.AsBytes()).ToArray()); + return new SecureString([.. ss1.ThrowIfNull().DecryptedValue!, .. s2.AsBytes()]); } public static SecureString operator +(SecureString? ss1, char c) { - if (ss1 is null) throw new ArgumentNullException(nameof(ss1)); - - return new SecureString(ss1.DecryptedValue!.Append(Convert.ToByte(c)).ToArray()); + return new SecureString([.. ss1.ThrowIfNull().DecryptedValue!, Convert.ToByte(c)]); } public static bool operator ==(SecureString? ss1, SecureString? ss2) { diff --git a/Daybreak.Shared/Models/SortedObservableCollection.cs b/Daybreak.Shared/Models/SortedObservableCollection.cs index 3bf229f1..0c606bd0 100644 --- a/Daybreak.Shared/Models/SortedObservableCollection.cs +++ b/Daybreak.Shared/Models/SortedObservableCollection.cs @@ -1,19 +1,12 @@ using System.Collections.Specialized; -using System; -using System.Linq; namespace Daybreak.Shared.Models; -public class SortedObservableCollection<T, TKey> : BatchedObservableCollection<T> +public class SortedObservableCollection<T, TKey>(Func<T, TKey> keySelector) : BatchedObservableCollection<T> { - public Func<T, TKey> KeySelector { get; set; } + public Func<T, TKey> KeySelector { get; set; } = keySelector; public bool Descending { get; set; } = false; - public SortedObservableCollection(Func<T, TKey> keySelector) - { - this.KeySelector = keySelector; - } - protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { base.OnCollectionChanged(e); diff --git a/Daybreak.Shared/Models/StartupActionBase.cs b/Daybreak.Shared/Models/StartupActionBase.cs index b5913335..93d1d182 100644 --- a/Daybreak.Shared/Models/StartupActionBase.cs +++ b/Daybreak.Shared/Models/StartupActionBase.cs @@ -1,7 +1,4 @@ -using System.Threading; -using System.Threading.Tasks; - -namespace Daybreak.Shared.Models; +namespace Daybreak.Shared.Models; public abstract class StartupActionBase { diff --git a/Daybreak.Shared/Models/StaticOptionsMonitor.cs b/Daybreak.Shared/Models/StaticOptionsMonitor.cs index 46b61526..de603c13 100644 --- a/Daybreak.Shared/Models/StaticOptionsMonitor.cs +++ b/Daybreak.Shared/Models/StaticOptionsMonitor.cs @@ -1,5 +1,4 @@ using Microsoft.Extensions.Options; -using System; namespace Daybreak.Shared.Models; public sealed class StaticOptionsMonitor<T>(T currentValue) diff --git a/Daybreak.Shared/Models/Trade/QuoteAlert.cs b/Daybreak.Shared/Models/Trade/QuoteAlert.cs index b7518f7f..cefa3ad1 100644 --- a/Daybreak.Shared/Models/Trade/QuoteAlert.cs +++ b/Daybreak.Shared/Models/Trade/QuoteAlert.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Models.Trade; +namespace Daybreak.Shared.Models.Trade; public sealed class QuoteAlert : ITradeAlert { public string Id { get; set; } = Guid.NewGuid().ToString(); diff --git a/Daybreak.Shared/Models/Trade/TradeAlert.cs b/Daybreak.Shared/Models/Trade/TradeAlert.cs index dd654cc7..a0efa47b 100644 --- a/Daybreak.Shared/Models/Trade/TradeAlert.cs +++ b/Daybreak.Shared/Models/Trade/TradeAlert.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Models.Trade; +namespace Daybreak.Shared.Models.Trade; public sealed class TradeAlert : ITradeAlert { public string Id { get; set; } = Guid.NewGuid().ToString(); diff --git a/Daybreak.Shared/Models/Trade/TraderMessage.cs b/Daybreak.Shared/Models/Trade/TraderMessage.cs index b655ccda..36e97583 100644 --- a/Daybreak.Shared/Models/Trade/TraderMessage.cs +++ b/Daybreak.Shared/Models/Trade/TraderMessage.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Models.Trade; +namespace Daybreak.Shared.Models.Trade; public sealed class TraderMessage : IEquatable<TraderMessage> { diff --git a/Daybreak.Shared/Models/Trade/TraderMessageViewWrapper.cs b/Daybreak.Shared/Models/Trade/TraderMessageViewWrapper.cs index 020735e3..b3d11fdc 100644 --- a/Daybreak.Shared/Models/Trade/TraderMessageViewWrapper.cs +++ b/Daybreak.Shared/Models/Trade/TraderMessageViewWrapper.cs @@ -1,54 +1,48 @@ -using System.Collections.Generic; -using System.ComponentModel; +using System.ComponentModel; using System.Windows.Threading; namespace Daybreak.Shared.Models.Trade; public sealed class TraderMessageViewWrapper : INotifyPropertyChanged { - private TraderMessage? traderMessage; - private DispatcherTimer? updateTimer; - private IEnumerable<ColoredTextElement>? coloredTextElements; - private bool initialized; - public event PropertyChangedEventHandler? PropertyChanged; public IEnumerable<ColoredTextElement>? ColoredTextElements { - get => this.coloredTextElements; + get; init { - this.coloredTextElements = value; + field = value; this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.ColoredTextElements))); } } public TraderMessage? TraderMessage { - get => this.traderMessage; + get; init { - this.traderMessage = value; + field = value; this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.TraderMessage))); } } public DispatcherTimer? UpdateTimer { - get => this.updateTimer; + get; init { - this.updateTimer = value; + field = value; this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.UpdateTimer))); } } public bool Initialized { - get => this.initialized; + get; set { - this.initialized = value; + field = value; this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.Initialized))); } } diff --git a/Daybreak.Shared/Models/Trade/TraderQuote.cs b/Daybreak.Shared/Models/Trade/TraderQuote.cs index 0ceb79b9..fabaa168 100644 --- a/Daybreak.Shared/Models/Trade/TraderQuote.cs +++ b/Daybreak.Shared/Models/Trade/TraderQuote.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Guildwars; -using System; namespace Daybreak.Shared.Models.Trade; diff --git a/Daybreak.Shared/Models/Versioning/Version.cs b/Daybreak.Shared/Models/Versioning/Version.cs index 6f823d15..b095c1cd 100644 --- a/Daybreak.Shared/Models/Versioning/Version.cs +++ b/Daybreak.Shared/Models/Versioning/Version.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Extensions; -using System.Linq; +using System.Extensions; namespace Daybreak.Shared.Models.Versioning; @@ -125,7 +122,7 @@ public sealed class Version : IEquatable<Version>, IComparable<Version> return -1; } - throw new InvalidOperationException($"Failed to compare {this.ToString()} with {other.ToString()}"); + throw new InvalidOperationException($"Failed to compare {this} with {other}"); } public static Version Parse(string version) @@ -196,7 +193,7 @@ public sealed class Version : IEquatable<Version>, IComparable<Version> for(int i = 0; i < tokens.Length - 1; i++) { var token = tokens[i]; - if (token.IsNullOrWhiteSpace() || token.All(c => char.IsDigit(c)) is false) + if (token.IsNullOrWhiteSpace() || token.All(char.IsDigit) is false) { return false; } @@ -213,13 +210,13 @@ public sealed class Version : IEquatable<Version>, IComparable<Version> return false; } - if (lastTokenParts[0].IsNullOrWhiteSpace() || lastTokenParts[0].All(c => char.IsDigit(c)) is false) + if (lastTokenParts[0].IsNullOrWhiteSpace() || lastTokenParts[0].All(char.IsDigit) is false) { return false; } parts.Add(VersionToken.Parse(lastTokenParts[0])); - if (lastTokenParts[1].IsNullOrWhiteSpace() || lastTokenParts[1].All(c => char.IsLetter(c)) is false) + if (lastTokenParts[1].IsNullOrWhiteSpace() || lastTokenParts[1].All(char.IsLetter) is false) { return false; } diff --git a/Daybreak.Shared/Models/Versioning/VersionToken.cs b/Daybreak.Shared/Models/Versioning/VersionToken.cs index 747a4d28..ae30e75f 100644 --- a/Daybreak.Shared/Models/Versioning/VersionToken.cs +++ b/Daybreak.Shared/Models/Versioning/VersionToken.cs @@ -1,19 +1,16 @@ -using System; -using System.Linq; - -namespace Daybreak.Shared.Models.Versioning; +namespace Daybreak.Shared.Models.Versioning; public abstract class VersionToken { public static VersionToken Parse(string token) { - if (token.All(c => char.IsDigit(c))) + if (token.All(char.IsDigit)) { var number = int.Parse(token); return new VersionNumberToken(number); } - if (token.All(c => char.IsLetter(c))) + if (token.All(char.IsLetter)) { return new VersionStringToken(token); } diff --git a/Daybreak.Shared/Services/Api/IDaybreakApiService.cs b/Daybreak.Shared/Services/Api/IDaybreakApiService.cs index 95b5765c..69f76f16 100644 --- a/Daybreak.Shared/Services/Api/IDaybreakApiService.cs +++ b/Daybreak.Shared/Services/Api/IDaybreakApiService.cs @@ -2,8 +2,6 @@ using Daybreak.Shared.Models.LaunchConfigurations; using Daybreak.Shared.Services.Mods; using System.Diagnostics; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.Api; public interface IDaybreakApiService : IModService diff --git a/Daybreak.Shared/Services/Api/ScopedApiContext.cs b/Daybreak.Shared/Services/Api/ScopedApiContext.cs index 5169e024..477ba5b6 100644 --- a/Daybreak.Shared/Services/Api/ScopedApiContext.cs +++ b/Daybreak.Shared/Services/Api/ScopedApiContext.cs @@ -1,12 +1,9 @@ using Daybreak.Shared.Models; using Daybreak.Shared.Models.Api; using Microsoft.Extensions.Logging; -using System; using System.Extensions.Core; using System.Net.Http; using System.Net.Http.Json; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.Api; public sealed class ScopedApiContext( diff --git a/Daybreak.Shared/Services/ApplicationLauncher/IApplicationLauncher.cs b/Daybreak.Shared/Services/ApplicationLauncher/IApplicationLauncher.cs index 6d844a1d..00921e31 100644 --- a/Daybreak.Shared/Services/ApplicationLauncher/IApplicationLauncher.cs +++ b/Daybreak.Shared/Services/ApplicationLauncher/IApplicationLauncher.cs @@ -1,9 +1,6 @@ using Daybreak.Shared.Models.LaunchConfigurations; using Daybreak.Shared.Services.Mods; -using System.Collections.Generic; using System.Diagnostics; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.ApplicationLauncher; diff --git a/Daybreak.Shared/Services/Browser/IBrowserExtension.cs b/Daybreak.Shared/Services/Browser/IBrowserExtension.cs index f5ddaea0..5b8ad6e0 100644 --- a/Daybreak.Shared/Services/Browser/IBrowserExtension.cs +++ b/Daybreak.Shared/Services/Browser/IBrowserExtension.cs @@ -1,6 +1,4 @@ -using System.Threading.Tasks; - -namespace Daybreak.Shared.Services.Browser; +namespace Daybreak.Shared.Services.Browser; public interface IBrowserExtension { diff --git a/Daybreak.Shared/Services/Browser/IBrowserExtensionsManager.cs b/Daybreak.Shared/Services/Browser/IBrowserExtensionsManager.cs index d7387b5e..bdb907ba 100644 --- a/Daybreak.Shared/Services/Browser/IBrowserExtensionsManager.cs +++ b/Daybreak.Shared/Services/Browser/IBrowserExtensionsManager.cs @@ -1,5 +1,4 @@ using Microsoft.Web.WebView2.Core; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.Browser; diff --git a/Daybreak.Shared/Services/BuildTemplates/BuildTemplateManager.cs b/Daybreak.Shared/Services/BuildTemplates/BuildTemplateManager.cs index b3e1726e..d48db8b9 100644 --- a/Daybreak.Shared/Services/BuildTemplates/BuildTemplateManager.cs +++ b/Daybreak.Shared/Services/BuildTemplates/BuildTemplateManager.cs @@ -6,16 +6,10 @@ using Daybreak.Shared.Services.BuildTemplates.Models; using Daybreak.Shared.Utils; using Microsoft.Extensions.Logging; using Newtonsoft.Json; -using System; -using System.Collections.Generic; using System.Extensions; using System.Extensions.Core; using System.IO; -using System.Linq; -using System.Logging; -using System.Reflection; using System.Text; -using System.Threading.Tasks; using AttributeEntry = Daybreak.Shared.Models.Builds.AttributeEntry; using Convert = System.Convert; diff --git a/Daybreak.Shared/Services/BuildTemplates/IBuildTemplateManager.cs b/Daybreak.Shared/Services/BuildTemplates/IBuildTemplateManager.cs index 80d5f461..424c6c6d 100644 --- a/Daybreak.Shared/Services/BuildTemplates/IBuildTemplateManager.cs +++ b/Daybreak.Shared/Services/BuildTemplates/IBuildTemplateManager.cs @@ -1,10 +1,7 @@ using Daybreak.Shared.Models; using Daybreak.Shared.Models.Api; using Daybreak.Shared.Models.Builds; -using System; -using System.Collections.Generic; using System.Extensions; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.BuildTemplates; diff --git a/Daybreak.Shared/Services/BuildTemplates/Models/DecodeCharStream.cs b/Daybreak.Shared/Services/BuildTemplates/Models/DecodeCharStream.cs index b2c4b62c..9370204f 100644 --- a/Daybreak.Shared/Services/BuildTemplates/Models/DecodeCharStream.cs +++ b/Daybreak.Shared/Services/BuildTemplates/Models/DecodeCharStream.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Services.BuildTemplates.Models; +namespace Daybreak.Shared.Services.BuildTemplates.Models; internal sealed class DecodeCharStream(string[] encodedValues) { diff --git a/Daybreak.Shared/Services/Credentials/ICredentialManager.cs b/Daybreak.Shared/Services/Credentials/ICredentialManager.cs index 8d4006b7..e188fd21 100644 --- a/Daybreak.Shared/Services/Credentials/ICredentialManager.cs +++ b/Daybreak.Shared/Services/Credentials/ICredentialManager.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models; -using System.Collections.Generic; namespace Daybreak.Shared.Services.Credentials; diff --git a/Daybreak.Shared/Services/DSOAL/IDSOALService.cs b/Daybreak.Shared/Services/DSOAL/IDSOALService.cs index e63b6e38..0c4ac618 100644 --- a/Daybreak.Shared/Services/DSOAL/IDSOALService.cs +++ b/Daybreak.Shared/Services/DSOAL/IDSOALService.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.Progress; using Daybreak.Shared.Services.Mods; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.DSOAL; diff --git a/Daybreak.Shared/Services/DXVK/IDXVKService.cs b/Daybreak.Shared/Services/DXVK/IDXVKService.cs index 7e8c9fff..a850561d 100644 --- a/Daybreak.Shared/Services/DXVK/IDXVKService.cs +++ b/Daybreak.Shared/Services/DXVK/IDXVKService.cs @@ -1,7 +1,5 @@ using Daybreak.Shared.Models.Progress; using Daybreak.Shared.Services.Mods; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.DXVK; diff --git a/Daybreak.Shared/Services/DirectSong/IDirectSongService.cs b/Daybreak.Shared/Services/DirectSong/IDirectSongService.cs index 68e08a6c..4e891123 100644 --- a/Daybreak.Shared/Services/DirectSong/IDirectSongService.cs +++ b/Daybreak.Shared/Services/DirectSong/IDirectSongService.cs @@ -1,7 +1,5 @@ using Daybreak.Shared.Models.Progress; using Daybreak.Shared.Services.Mods; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.DirectSong; public interface IDirectSongService : IModService diff --git a/Daybreak.Shared/Services/Downloads/IDownloadService.cs b/Daybreak.Shared/Services/Downloads/IDownloadService.cs index 98f4f9c4..a5cdded4 100644 --- a/Daybreak.Shared/Services/Downloads/IDownloadService.cs +++ b/Daybreak.Shared/Services/Downloads/IDownloadService.cs @@ -1,6 +1,4 @@ using Daybreak.Shared.Models.Progress; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.Downloads; diff --git a/Daybreak.Shared/Services/Events/IEventService.cs b/Daybreak.Shared/Services/Events/IEventService.cs index 226d9b5e..80a6bf6e 100644 --- a/Daybreak.Shared/Services/Events/IEventService.cs +++ b/Daybreak.Shared/Services/Events/IEventService.cs @@ -1,6 +1,4 @@ using Daybreak.Shared.Models.Guildwars; -using System; -using System.Collections.Generic; namespace Daybreak.Shared.Services.Events; public interface IEventService diff --git a/Daybreak.Shared/Services/ExecutableManagement/IGuildWarsExecutableManager.cs b/Daybreak.Shared/Services/ExecutableManagement/IGuildWarsExecutableManager.cs index 6e0658f5..b5bc85f6 100644 --- a/Daybreak.Shared/Services/ExecutableManagement/IGuildWarsExecutableManager.cs +++ b/Daybreak.Shared/Services/ExecutableManagement/IGuildWarsExecutableManager.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace Daybreak.Shared.Services.ExecutableManagement; +namespace Daybreak.Shared.Services.ExecutableManagement; public interface IGuildWarsExecutableManager { void AddExecutable(string executablePath); diff --git a/Daybreak.Shared/Services/Guildwars/IGuildwarsCopyService.cs b/Daybreak.Shared/Services/Guildwars/IGuildwarsCopyService.cs index b0394e78..f89abdaa 100644 --- a/Daybreak.Shared/Services/Guildwars/IGuildwarsCopyService.cs +++ b/Daybreak.Shared/Services/Guildwars/IGuildwarsCopyService.cs @@ -1,6 +1,4 @@ using Daybreak.Shared.Models.Progress; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.Guildwars; diff --git a/Daybreak.Shared/Services/Guildwars/IGuildwarsInstaller.cs b/Daybreak.Shared/Services/Guildwars/IGuildwarsInstaller.cs index 669e08c6..67874cf1 100644 --- a/Daybreak.Shared/Services/Guildwars/IGuildwarsInstaller.cs +++ b/Daybreak.Shared/Services/Guildwars/IGuildwarsInstaller.cs @@ -1,8 +1,5 @@ using Daybreak.Shared.Models; using Daybreak.Shared.Models.Progress; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.Guildwars; public interface IGuildWarsInstaller diff --git a/Daybreak.Shared/Services/IconRetrieve/IIconCache.cs b/Daybreak.Shared/Services/IconRetrieve/IIconCache.cs index db67209f..e35ed019 100644 --- a/Daybreak.Shared/Services/IconRetrieve/IIconCache.cs +++ b/Daybreak.Shared/Services/IconRetrieve/IIconCache.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Guildwars; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.IconRetrieve; diff --git a/Daybreak.Shared/Services/Images/IImageCache.cs b/Daybreak.Shared/Services/Images/IImageCache.cs index a2b1527b..2f5f2624 100644 --- a/Daybreak.Shared/Services/Images/IImageCache.cs +++ b/Daybreak.Shared/Services/Images/IImageCache.cs @@ -1,5 +1,4 @@ -using System.Threading.Tasks; -using System.Windows.Media; +using System.Windows.Media; namespace Daybreak.Shared.Services.Images; diff --git a/Daybreak.Shared/Services/Injection/IProcessInjector.cs b/Daybreak.Shared/Services/Injection/IProcessInjector.cs index 433f2df4..3633c4fe 100644 --- a/Daybreak.Shared/Services/Injection/IProcessInjector.cs +++ b/Daybreak.Shared/Services/Injection/IProcessInjector.cs @@ -1,6 +1,4 @@ using System.Diagnostics; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.Injection; public interface IProcessInjector diff --git a/Daybreak.Shared/Services/InternetChecker/IInternetCheckingService.cs b/Daybreak.Shared/Services/InternetChecker/IInternetCheckingService.cs index 89575b89..e93339c0 100644 --- a/Daybreak.Shared/Services/InternetChecker/IInternetCheckingService.cs +++ b/Daybreak.Shared/Services/InternetChecker/IInternetCheckingService.cs @@ -1,6 +1,4 @@ using Daybreak.Shared.Models; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.InternetChecker; diff --git a/Daybreak.Shared/Services/LaunchConfigurations/ILaunchConfigurationService.cs b/Daybreak.Shared/Services/LaunchConfigurations/ILaunchConfigurationService.cs index 43866e1c..d25db739 100644 --- a/Daybreak.Shared/Services/LaunchConfigurations/ILaunchConfigurationService.cs +++ b/Daybreak.Shared/Services/LaunchConfigurations/ILaunchConfigurationService.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.LaunchConfigurations; -using System.Collections.Generic; namespace Daybreak.Shared.Services.LaunchConfigurations; public interface ILaunchConfigurationService diff --git a/Daybreak.Shared/Services/Logging/ILogsManager.cs b/Daybreak.Shared/Services/Logging/ILogsManager.cs index 328b97c4..c4c28c0c 100644 --- a/Daybreak.Shared/Services/Logging/ILogsManager.cs +++ b/Daybreak.Shared/Services/Logging/ILogsManager.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq.Expressions; +using System.Linq.Expressions; using System.Logging; namespace Daybreak.Shared.Services.Logging; diff --git a/Daybreak.Shared/Services/MDns/IMDomainRegistrar.cs b/Daybreak.Shared/Services/MDns/IMDomainRegistrar.cs index 5c1fcb87..d2d24373 100644 --- a/Daybreak.Shared/Services/MDns/IMDomainRegistrar.cs +++ b/Daybreak.Shared/Services/MDns/IMDomainRegistrar.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; - -namespace Daybreak.Shared.Services.MDns; +namespace Daybreak.Shared.Services.MDns; public interface IMDomainRegistrar { IReadOnlyList<Uri>? Resolve(string service); diff --git a/Daybreak.Shared/Services/Menu/IMenuServiceInitializer.cs b/Daybreak.Shared/Services/Menu/IMenuServiceInitializer.cs index 5d7cff3f..132368ed 100644 --- a/Daybreak.Shared/Services/Menu/IMenuServiceInitializer.cs +++ b/Daybreak.Shared/Services/Menu/IMenuServiceInitializer.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Services.Menu; +namespace Daybreak.Shared.Services.Menu; public interface IMenuServiceInitializer { diff --git a/Daybreak.Shared/Services/Menu/IMenuServiceProducer.cs b/Daybreak.Shared/Services/Menu/IMenuServiceProducer.cs index d13f60f1..cd3c190d 100644 --- a/Daybreak.Shared/Services/Menu/IMenuServiceProducer.cs +++ b/Daybreak.Shared/Services/Menu/IMenuServiceProducer.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Menu; -using System.Collections.Generic; namespace Daybreak.Shared.Services.Menu; diff --git a/Daybreak.Shared/Services/Metrics/IMetricsService.cs b/Daybreak.Shared/Services/Metrics/IMetricsService.cs index 744028ae..e66f1e78 100644 --- a/Daybreak.Shared/Services/Metrics/IMetricsService.cs +++ b/Daybreak.Shared/Services/Metrics/IMetricsService.cs @@ -1,6 +1,4 @@ using System.Diagnostics.Metrics; -using System; -using System.Collections.Generic; using Daybreak.Shared.Models.Metrics; namespace Daybreak.Shared.Services.Metrics; diff --git a/Daybreak.Shared/Services/Mods/IModService.cs b/Daybreak.Shared/Services/Mods/IModService.cs index c7f824bf..da469b05 100644 --- a/Daybreak.Shared/Services/Mods/IModService.cs +++ b/Daybreak.Shared/Services/Mods/IModService.cs @@ -1,7 +1,4 @@ using Daybreak.Shared.Models.Mods; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.Mods; diff --git a/Daybreak.Shared/Services/Mods/IModsManager.cs b/Daybreak.Shared/Services/Mods/IModsManager.cs index 9681b70d..890ce05d 100644 --- a/Daybreak.Shared/Services/Mods/IModsManager.cs +++ b/Daybreak.Shared/Services/Mods/IModsManager.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace Daybreak.Shared.Services.Mods; +namespace Daybreak.Shared.Services.Mods; public interface IModsManager { diff --git a/Daybreak.Shared/Services/Mutex/IMutexHandler.cs b/Daybreak.Shared/Services/Mutex/IMutexHandler.cs deleted file mode 100644 index 09710ee5..00000000 --- a/Daybreak.Shared/Services/Mutex/IMutexHandler.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Diagnostics; - -namespace Daybreak.Shared.Services.Mutex; - -public interface IMutexHandler -{ - void CloseMutex(Process process, string mutexName); -} diff --git a/Daybreak.Shared/Services/Navigation/IViewManager.cs b/Daybreak.Shared/Services/Navigation/IViewManager.cs index 5c083ab9..864741f8 100644 --- a/Daybreak.Shared/Services/Navigation/IViewManager.cs +++ b/Daybreak.Shared/Services/Navigation/IViewManager.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; namespace Daybreak.Shared.Services.Navigation; diff --git a/Daybreak.Shared/Services/Notifications/INotificationProducer.cs b/Daybreak.Shared/Services/Notifications/INotificationProducer.cs index c7c3f36a..60ad377f 100644 --- a/Daybreak.Shared/Services/Notifications/INotificationProducer.cs +++ b/Daybreak.Shared/Services/Notifications/INotificationProducer.cs @@ -1,15 +1,12 @@ using Daybreak.Shared.Models.Notifications; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.Notifications; public interface INotificationProducer { - ValueTask OpenNotification(Notification notification, bool storeNotification = true, CancellationToken cancellationToken = default); - ValueTask RemoveNotification(Notification notification, CancellationToken cancellationToken); - ValueTask RemoveAllNotifications(CancellationToken cancellationToken); + Task OpenNotification(Notification notification, bool storeNotification = true, CancellationToken cancellationToken = default); + Task RemoveNotification(Notification notification, CancellationToken cancellationToken); + Task RemoveAllNotifications(CancellationToken cancellationToken); ValueTask<IEnumerable<Notification>> GetAllNotifications(CancellationToken cancellationToken); ValueTask<IEnumerable<Notification>> GetPendingNotifications(CancellationToken cancellationToken); IAsyncEnumerable<Notification> Consume(CancellationToken cancellationToken); diff --git a/Daybreak.Shared/Services/Notifications/INotificationService.cs b/Daybreak.Shared/Services/Notifications/INotificationService.cs index 54fd27cd..aea43dfb 100644 --- a/Daybreak.Shared/Services/Notifications/INotificationService.cs +++ b/Daybreak.Shared/Services/Notifications/INotificationService.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.Notifications; using Daybreak.Shared.Models.Notifications.Handling; -using System; namespace Daybreak.Shared.Services.Notifications; diff --git a/Daybreak.Shared/Services/Options/IOptionsProvider.cs b/Daybreak.Shared/Services/Options/IOptionsProvider.cs index 93066699..133670d9 100644 --- a/Daybreak.Shared/Services/Options/IOptionsProvider.cs +++ b/Daybreak.Shared/Services/Options/IOptionsProvider.cs @@ -1,6 +1,4 @@ using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; namespace Daybreak.Shared.Services.Options; diff --git a/Daybreak.Shared/Services/Options/IOptionsSynchronizationService.cs b/Daybreak.Shared/Services/Options/IOptionsSynchronizationService.cs index 03073741..badc1f73 100644 --- a/Daybreak.Shared/Services/Options/IOptionsSynchronizationService.cs +++ b/Daybreak.Shared/Services/Options/IOptionsSynchronizationService.cs @@ -1,7 +1,4 @@ using Newtonsoft.Json.Linq; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.Options; diff --git a/Daybreak.Shared/Services/Options/IOptionsUpdateHook.cs b/Daybreak.Shared/Services/Options/IOptionsUpdateHook.cs index 6dfa849b..96522137 100644 --- a/Daybreak.Shared/Services/Options/IOptionsUpdateHook.cs +++ b/Daybreak.Shared/Services/Options/IOptionsUpdateHook.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Services.Options; +namespace Daybreak.Shared.Services.Options; public interface IOptionsUpdateHook { diff --git a/Daybreak.Shared/Services/Plugins/IPluginsService.cs b/Daybreak.Shared/Services/Plugins/IPluginsService.cs index 7c240da7..90e4afc1 100644 --- a/Daybreak.Shared/Services/Plugins/IPluginsService.cs +++ b/Daybreak.Shared/Services/Plugins/IPluginsService.cs @@ -9,8 +9,6 @@ using Daybreak.Shared.Services.Options; using Daybreak.Shared.Services.Startup; using Daybreak.Shared.Services.Updater.PostUpdate; using Slim; -using System.Collections.Generic; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.Plugins; diff --git a/Daybreak.Shared/Services/ReShade/IReShadeService.cs b/Daybreak.Shared/Services/ReShade/IReShadeService.cs index f237b893..cfcb6cc6 100644 --- a/Daybreak.Shared/Services/ReShade/IReShadeService.cs +++ b/Daybreak.Shared/Services/ReShade/IReShadeService.cs @@ -1,9 +1,6 @@ using Daybreak.Shared.Models.Progress; using Daybreak.Shared.Models.ReShade; using Daybreak.Shared.Services.Mods; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.ReShade; public interface IReShadeService : IModService diff --git a/Daybreak.Shared/Services/Screens/IScreenManager.cs b/Daybreak.Shared/Services/Screens/IScreenManager.cs index 5c630f7b..223984c7 100644 --- a/Daybreak.Shared/Services/Screens/IScreenManager.cs +++ b/Daybreak.Shared/Services/Screens/IScreenManager.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models; -using System.Collections.Generic; namespace Daybreak.Shared.Services.Screens; diff --git a/Daybreak.Shared/Services/Screenshots/IBackgroundProvider.cs b/Daybreak.Shared/Services/Screenshots/IBackgroundProvider.cs index 6492e078..54cea1e9 100644 --- a/Daybreak.Shared/Services/Screenshots/IBackgroundProvider.cs +++ b/Daybreak.Shared/Services/Screenshots/IBackgroundProvider.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.Screenshots; diff --git a/Daybreak.Shared/Services/Screenshots/IOnlinePictureClient.cs b/Daybreak.Shared/Services/Screenshots/IOnlinePictureClient.cs index d62ba058..25f0a55b 100644 --- a/Daybreak.Shared/Services/Screenshots/IOnlinePictureClient.cs +++ b/Daybreak.Shared/Services/Screenshots/IOnlinePictureClient.cs @@ -1,5 +1,4 @@ -using System.Threading.Tasks; -using System.Windows.Media; +using System.Windows.Media; namespace Daybreak.Shared.Services.Screenshots; diff --git a/Daybreak.Shared/Services/Screenshots/IScreenshotProvider.cs b/Daybreak.Shared/Services/Screenshots/IScreenshotProvider.cs index 6f37368c..45661251 100644 --- a/Daybreak.Shared/Services/Screenshots/IScreenshotProvider.cs +++ b/Daybreak.Shared/Services/Screenshots/IScreenshotProvider.cs @@ -1,5 +1,4 @@ -using System.Threading.Tasks; -using System.Windows.Media; +using System.Windows.Media; namespace Daybreak.Shared.Services.Screenshots; diff --git a/Daybreak.Shared/Services/SevenZip/ISevenZipExtractor.cs b/Daybreak.Shared/Services/SevenZip/ISevenZipExtractor.cs index 1fdf7159..cdbff7aa 100644 --- a/Daybreak.Shared/Services/SevenZip/ISevenZipExtractor.cs +++ b/Daybreak.Shared/Services/SevenZip/ISevenZipExtractor.cs @@ -1,8 +1,4 @@ -using System; -using System.Threading; -using System.Threading.Tasks; - -namespace Daybreak.Shared.Services.SevenZip; +namespace Daybreak.Shared.Services.SevenZip; public interface ISevenZipExtractor { Task<bool> ExtractToDirectory(string sourceFile, string destinationDirectory, Action<double, string> progressTracker, CancellationToken cancellationToken); diff --git a/Daybreak.Shared/Services/Toolbox/IToolboxService.cs b/Daybreak.Shared/Services/Toolbox/IToolboxService.cs index 2fb2748f..f5afa6ac 100644 --- a/Daybreak.Shared/Services/Toolbox/IToolboxService.cs +++ b/Daybreak.Shared/Services/Toolbox/IToolboxService.cs @@ -1,9 +1,6 @@ using Daybreak.Shared.Models.Builds; using Daybreak.Shared.Models.Progress; using Daybreak.Shared.Services.Mods; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.Toolbox; public interface IToolboxService : IModService diff --git a/Daybreak.Shared/Services/TradeChat/IPriceHistoryService.cs b/Daybreak.Shared/Services/TradeChat/IPriceHistoryService.cs index a940cc39..eb310ccf 100644 --- a/Daybreak.Shared/Services/TradeChat/IPriceHistoryService.cs +++ b/Daybreak.Shared/Services/TradeChat/IPriceHistoryService.cs @@ -1,9 +1,5 @@ using Daybreak.Shared.Models.Guildwars; using Daybreak.Shared.Models.Trade; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.TradeChat; diff --git a/Daybreak.Shared/Services/TradeChat/ITradeAlertingService.cs b/Daybreak.Shared/Services/TradeChat/ITradeAlertingService.cs index b26006ee..3c02c95c 100644 --- a/Daybreak.Shared/Services/TradeChat/ITradeAlertingService.cs +++ b/Daybreak.Shared/Services/TradeChat/ITradeAlertingService.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Trade; -using System.Collections.Generic; namespace Daybreak.Shared.Services.TradeChat; diff --git a/Daybreak.Shared/Services/TradeChat/ITradeChatService.cs b/Daybreak.Shared/Services/TradeChat/ITradeChatService.cs index 2df6080e..76dd02ea 100644 --- a/Daybreak.Shared/Services/TradeChat/ITradeChatService.cs +++ b/Daybreak.Shared/Services/TradeChat/ITradeChatService.cs @@ -1,9 +1,5 @@ using Daybreak.Shared.Configuration.Options; using Daybreak.Shared.Models.Trade; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.TradeChat; diff --git a/Daybreak.Shared/Services/TradeChat/ITraderQuoteService.cs b/Daybreak.Shared/Services/TradeChat/ITraderQuoteService.cs index ba43b9cc..ab59f223 100644 --- a/Daybreak.Shared/Services/TradeChat/ITraderQuoteService.cs +++ b/Daybreak.Shared/Services/TradeChat/ITraderQuoteService.cs @@ -1,7 +1,4 @@ using Daybreak.Shared.Models.Trade; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Services.TradeChat; diff --git a/Daybreak.Shared/Services/TradeChat/IWordHighlightingService.cs b/Daybreak.Shared/Services/TradeChat/IWordHighlightingService.cs index 288f5ebb..73e61dc1 100644 --- a/Daybreak.Shared/Services/TradeChat/IWordHighlightingService.cs +++ b/Daybreak.Shared/Services/TradeChat/IWordHighlightingService.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models; -using System.Collections.Generic; using System.Windows.Media; namespace Daybreak.Shared.Services.TradeChat; diff --git a/Daybreak.Shared/Services/UMod/IUModService.cs b/Daybreak.Shared/Services/UMod/IUModService.cs index c6d2594e..71f55984 100644 --- a/Daybreak.Shared/Services/UMod/IUModService.cs +++ b/Daybreak.Shared/Services/UMod/IUModService.cs @@ -1,9 +1,6 @@ using Daybreak.Shared.Models.Progress; using Daybreak.Shared.Models.UMod; using Daybreak.Shared.Services.Mods; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; using Version = Daybreak.Shared.Models.Versioning.Version; namespace Daybreak.Shared.Services.UMod; diff --git a/Daybreak.Shared/Services/Updater/IApplicationUpdater.cs b/Daybreak.Shared/Services/Updater/IApplicationUpdater.cs index 44ad7631..3ae3d41c 100644 --- a/Daybreak.Shared/Services/Updater/IApplicationUpdater.cs +++ b/Daybreak.Shared/Services/Updater/IApplicationUpdater.cs @@ -1,6 +1,4 @@ using Daybreak.Shared.Models.Progress; -using System.Collections.Generic; -using System.Threading.Tasks; using Version = Daybreak.Shared.Models.Versioning.Version; namespace Daybreak.Shared.Services.Updater; diff --git a/Daybreak.Shared/Services/Updater/PostUpdate/IPostUpdateActionProvider.cs b/Daybreak.Shared/Services/Updater/PostUpdate/IPostUpdateActionProvider.cs index c47d9f56..2c680cc7 100644 --- a/Daybreak.Shared/Services/Updater/PostUpdate/IPostUpdateActionProvider.cs +++ b/Daybreak.Shared/Services/Updater/PostUpdate/IPostUpdateActionProvider.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models; -using System.Collections.Generic; namespace Daybreak.Shared.Services.Updater.PostUpdate; diff --git a/Daybreak.Shared/Services/Window/IWindowEventsHook.cs b/Daybreak.Shared/Services/Window/IWindowEventsHook.cs index fc73ccde..4fe63b37 100644 --- a/Daybreak.Shared/Services/Window/IWindowEventsHook.cs +++ b/Daybreak.Shared/Services/Window/IWindowEventsHook.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Services.Window; +namespace Daybreak.Shared.Services.Window; public interface IWindowEventsHook<T> : IDisposable where T : System.Windows.Window diff --git a/Daybreak.Shared/Utils/ColorExtensions.cs b/Daybreak.Shared/Utils/ColorExtensions.cs index 55d1604e..4f50f747 100644 --- a/Daybreak.Shared/Utils/ColorExtensions.cs +++ b/Daybreak.Shared/Utils/ColorExtensions.cs @@ -16,14 +16,14 @@ public static class ColorExtensions var bg = (float)backColor.G / byte.MaxValue; var bb = (float)backColor.B / byte.MaxValue; - var a = fa + ba - fa * ba; + var a = fa + ba - (fa * ba); if (a <= 0) return Colors.Transparent; - var r = (fa * (1 - ba) * fr + fa * ba * fa + (1 - fa) * ba * br) / a; - var g = (fa * (1 - ba) * fg + fa * ba * fa + (1 - fa) * ba * bg) / a; - var b = (fa * (1 - ba) * fb + fa * ba * fa + (1 - fa) * ba * bb) / a; + var r = ((fa * (1 - ba) * fr) + (fa * ba * fa) + ((1 - fa) * ba * br)) / a; + var g = ((fa * (1 - ba) * fg) + (fa * ba * fa) + ((1 - fa) * ba * bg)) / a; + var b = ((fa * (1 - ba) * fb) + (fa * ba * fa) + ((1 - fa) * ba * bb)) / a; return Color.FromArgb( (byte)(a * byte.MaxValue), diff --git a/Daybreak.Shared/Utils/DateTimeExtensions.cs b/Daybreak.Shared/Utils/DateTimeExtensions.cs index 62e69234..4b95f976 100644 --- a/Daybreak.Shared/Utils/DateTimeExtensions.cs +++ b/Daybreak.Shared/Utils/DateTimeExtensions.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Utils; +namespace Daybreak.Shared.Utils; public static class DateTimeExtensions { diff --git a/Daybreak.Shared/Utils/EncryptionHelper.cs b/Daybreak.Shared/Utils/EncryptionHelper.cs index 9db4f98f..07dd9f5e 100644 --- a/Daybreak.Shared/Utils/EncryptionHelper.cs +++ b/Daybreak.Shared/Utils/EncryptionHelper.cs @@ -1,5 +1,4 @@ using System.IO; -using System.Linq; using System.Security.Cryptography; namespace Daybreak.Shared.Utils; @@ -36,7 +35,7 @@ internal static class EncryptionHelper { var saltBytes = new byte[Aes.BlockSize / 8]; var ivBytes = new byte[Aes.BlockSize / 8]; - var cipherBytes = new byte[bytes.Length - Aes.BlockSize / 4]; + var cipherBytes = new byte[bytes.Length - (Aes.BlockSize / 4)]; using var encryptedStream = new MemoryStream(bytes); encryptedStream.Read(saltBytes, 0, saltBytes.Length); @@ -50,7 +49,7 @@ internal static class EncryptionHelper using var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read); var plainTextBytes = new byte[memoryStream.Length]; var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); - return plainTextBytes.Take(decryptedByteCount).ToArray(); + return [.. plainTextBytes.Take(decryptedByteCount)]; } private static byte[] Generate128BitsOfRandomEntropy() diff --git a/Daybreak.Shared/Utils/MetricsHttpMessageHandler.cs b/Daybreak.Shared/Utils/MetricsHttpMessageHandler.cs index 062dad51..34a64ad8 100644 --- a/Daybreak.Shared/Utils/MetricsHttpMessageHandler.cs +++ b/Daybreak.Shared/Utils/MetricsHttpMessageHandler.cs @@ -2,8 +2,6 @@ using System.Diagnostics; using System.Diagnostics.Metrics; using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Shared.Utils; diff --git a/Daybreak.Shared/Utils/NativeMethods.cs b/Daybreak.Shared/Utils/NativeMethods.cs index 7438cdd2..32fbd6f1 100644 --- a/Daybreak.Shared/Utils/NativeMethods.cs +++ b/Daybreak.Shared/Utils/NativeMethods.cs @@ -1,5 +1,4 @@ -using System; -using System.Runtime.InteropServices; +using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; using System.Text; @@ -11,10 +10,10 @@ public static class NativeMethods public const uint ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004; public const uint ENABLE_PROCESSED_OUTPUT = 0x0001; - public static uint WM_KEYDOWN = 0x0100; - public static uint SWP_SHOWWINDOW = 0x0040; - public static nint HWND_TOPMOST = new(-1); - public static nint HWND_TOP = nint.Zero; + public const uint WM_KEYDOWN = 0x0100; + public const uint SWP_SHOWWINDOW = 0x0040; + public const nint HWND_TOPMOST = -1; + public const nint HWND_TOP = 0; public const int WH_KEYBOARD_LL = 13; public const uint LIST_MODULES_32BIT = 0x01; diff --git a/Daybreak.Shared/Utils/PathUtils.cs b/Daybreak.Shared/Utils/PathUtils.cs index f4c52d4c..ee14b457 100644 --- a/Daybreak.Shared/Utils/PathUtils.cs +++ b/Daybreak.Shared/Utils/PathUtils.cs @@ -1,6 +1,4 @@ -using System; -using System.IO; -using System.Linq; +using System.IO; using System.Reflection; namespace Daybreak.Shared.Utils; diff --git a/Daybreak.Shared/Utils/StringUtils.cs b/Daybreak.Shared/Utils/StringUtils.cs index 1c62add6..d6b44de8 100644 --- a/Daybreak.Shared/Utils/StringUtils.cs +++ b/Daybreak.Shared/Utils/StringUtils.cs @@ -1,14 +1,12 @@ -using System; -using System.Extensions; -using System.Linq; +using System.Extensions; using System.Text.RegularExpressions; namespace Daybreak.Shared.Utils; -public static class StringUtils +public static partial class StringUtils { private const int SearchSensitivity = 2; - private static readonly Regex SplitIntoWordsRegex = new Regex(@"\W+", RegexOptions.Compiled); + private static readonly Regex SplitIntoWordsRegex = WordRegex(); public static int DamerauLevenshteinDistance(string s, string t) { @@ -79,4 +77,7 @@ public static class StringUtils SplitIntoWordsRegex.Split(stringToSearch.ToLower()) .Select(word => DamerauLevenshteinDistance(word.ToLower()[..Math.Min(word.Length, searchString.Length)], searchString.ToLower())).Min()); } + + [GeneratedRegex(@"\W+", RegexOptions.Compiled)] + private static partial Regex WordRegex(); } diff --git a/Daybreak.Shared/Validators/ClampedValidator.cs b/Daybreak.Shared/Validators/ClampedValidator.cs index df16971a..c78035fd 100644 --- a/Daybreak.Shared/Validators/ClampedValidator.cs +++ b/Daybreak.Shared/Validators/ClampedValidator.cs @@ -1,18 +1,11 @@ -using System; -using System.ComponentModel; +using System.ComponentModel; namespace Daybreak.Shared.Validators; -public sealed class ClampedValidator<T> : IValidator +public sealed class ClampedValidator<T>(T minValue, T maxValue) : IValidator where T : IComparable<T> { - private readonly T minValue, maxValue; - - public ClampedValidator(T minValue, T maxValue) - { - this.minValue = minValue; - this.maxValue = maxValue; - } + private readonly T minValue = minValue, maxValue = maxValue; public bool IsValid(object value) { diff --git a/Daybreak.Shared/Validators/EnumValidator.cs b/Daybreak.Shared/Validators/EnumValidator.cs index 68873f4a..671e5926 100644 --- a/Daybreak.Shared/Validators/EnumValidator.cs +++ b/Daybreak.Shared/Validators/EnumValidator.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Shared.Validators; +namespace Daybreak.Shared.Validators; public sealed class EnumValidator<T> : IValidator where T : struct, Enum diff --git a/Daybreak.Tests/Daybreak.Tests.csproj b/Daybreak.Tests/Daybreak.Tests.csproj index 89cfbf30..1213e8bf 100644 --- a/Daybreak.Tests/Daybreak.Tests.csproj +++ b/Daybreak.Tests/Daybreak.Tests.csproj @@ -8,21 +8,21 @@ </PropertyGroup> <ItemGroup> - <PackageReference Include="FluentAssertions" Version="8.3.0" /> - <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" /> - <PackageReference Include="MSTest.TestAdapter" Version="3.9.3" /> - <PackageReference Include="MSTest.TestFramework" Version="3.9.3" /> - <PackageReference Include="coverlet.collector" Version="6.0.4"> + <PackageReference Include="FluentAssertions" /> + <PackageReference Include="Microsoft.NET.Test.Sdk" /> + <PackageReference Include="MSTest.TestAdapter" /> + <PackageReference Include="MSTest.TestFramework" /> + <PackageReference Include="coverlet.collector"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> - <PackageReference Include="NSubstitute" Version="5.3.0" /> - <PackageReference Include="NSubstitute.Analyzers.CSharp" Version="1.0.17"> + <PackageReference Include="NSubstitute" /> + <PackageReference Include="NSubstitute.Analyzers.CSharp"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> - <PackageReference Include="System.Linq.Async" Version="6.0.3" /> - <PackageReference Include="System.Private.Uri" Version="4.3.2" /> + <PackageReference Include="System.Linq.Async" /> + <PackageReference Include="System.Private.Uri" /> </ItemGroup> <ItemGroup> diff --git a/Daybreak.Tests/Models/InscriptionTests.cs b/Daybreak.Tests/Models/InscriptionTests.cs index a2e36da4..21b72a55 100644 --- a/Daybreak.Tests/Models/InscriptionTests.cs +++ b/Daybreak.Tests/Models/InscriptionTests.cs @@ -1,10 +1,5 @@ using Daybreak.Shared.Models.Guildwars; using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Collections.Generic; -using System.Extensions; -using System.Linq; -using System.Reflection; -using System.Text; namespace Daybreak.Tests.Models; diff --git a/Daybreak.Tests/Models/ItemBaseTests.cs b/Daybreak.Tests/Models/ItemBaseTests.cs index 33e51489..b0c82f5c 100644 --- a/Daybreak.Tests/Models/ItemBaseTests.cs +++ b/Daybreak.Tests/Models/ItemBaseTests.cs @@ -1,9 +1,6 @@ using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Collections.Generic; using System.Text; -using System; -using System.Linq; using Daybreak.Shared.Models.Guildwars; namespace Daybreak.Tests.Models; diff --git a/Daybreak.Tests/Models/ItemTestsBase.cs b/Daybreak.Tests/Models/ItemTestsBase.cs index 3f59fff7..779ebde6 100644 --- a/Daybreak.Tests/Models/ItemTestsBase.cs +++ b/Daybreak.Tests/Models/ItemTestsBase.cs @@ -1,8 +1,7 @@ using Daybreak.Shared.Models.Guildwars; using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Collections.Generic; +using System.Core.Extensions; using System.Extensions; -using System.Linq; using System.Reflection; using System.Text; @@ -51,7 +50,7 @@ public abstract class ItemTestsBase<T> var definedItemFields = typeof(T).GetFields(BindingFlags.Static | BindingFlags.Public).Where(f => f.FieldType == typeof(T)); foreach (var field in definedItemFields) { - var item = field.GetValue(default).Cast<T>(); + var item = field.GetValue(default).ThrowIfNull().Cast<T>(); itemMap[item] = false; } diff --git a/Daybreak.Tests/Models/MaterialTests.cs b/Daybreak.Tests/Models/MaterialTests.cs index 22190d73..c4726fb8 100644 --- a/Daybreak.Tests/Models/MaterialTests.cs +++ b/Daybreak.Tests/Models/MaterialTests.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.Guildwars; using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Collections.Generic; namespace Daybreak.Tests.Models; diff --git a/Daybreak.Tests/Models/NpcTests.cs b/Daybreak.Tests/Models/NpcTests.cs index 8b8137ad..9b2d27f9 100644 --- a/Daybreak.Tests/Models/NpcTests.cs +++ b/Daybreak.Tests/Models/NpcTests.cs @@ -1,10 +1,8 @@ using Daybreak.Shared.Models.Guildwars; using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; -using System.Collections.Generic; +using System.Core.Extensions; using System.Extensions; -using System.Linq; using System.Reflection; using System.Text; @@ -81,7 +79,7 @@ public sealed class NpcTests var definedNpcsFields = typeof(Npc).GetFields(BindingFlags.Static | BindingFlags.Public).Where(f => f.FieldType == typeof(Npc)); foreach(var field in definedNpcsFields) { - var npc = field.GetValue(default).Cast<Npc>(); + var npc = field.GetValue(default).ThrowIfNull().Cast<Npc>(); npcMap[npc] = false; } diff --git a/Daybreak.Tests/Models/QuestTests.cs b/Daybreak.Tests/Models/QuestTests.cs index 0694bd36..420ebe66 100644 --- a/Daybreak.Tests/Models/QuestTests.cs +++ b/Daybreak.Tests/Models/QuestTests.cs @@ -1,12 +1,10 @@ using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Collections.Generic; using System.Reflection; using System.Text; -using System; -using System.Linq; using System.Extensions; using Daybreak.Shared.Models.Guildwars; +using System.Core.Extensions; namespace Daybreak.Tests.Models; @@ -81,7 +79,7 @@ public sealed class QuestTests var definedNpcsFields = typeof(Quest).GetFields(BindingFlags.Static | BindingFlags.Public).Where(f => f.FieldType == typeof(Quest)); foreach (var field in definedNpcsFields) { - var quest = field.GetValue(default).Cast<Quest>(); + var quest = field.GetValue(default).ThrowIfNull().Cast<Quest>(); questMap[quest] = false; } diff --git a/Daybreak.Tests/Models/RuneTests.cs b/Daybreak.Tests/Models/RuneTests.cs index 77c06c0e..8c88132d 100644 --- a/Daybreak.Tests/Models/RuneTests.cs +++ b/Daybreak.Tests/Models/RuneTests.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.Guildwars; using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Collections.Generic; namespace Daybreak.Tests.Models; diff --git a/Daybreak.Tests/Models/VersionTests.cs b/Daybreak.Tests/Models/VersionTests.cs index f26ed8c0..e160c3ac 100644 --- a/Daybreak.Tests/Models/VersionTests.cs +++ b/Daybreak.Tests/Models/VersionTests.cs @@ -1,8 +1,6 @@ using Daybreak.Shared.Models.Versioning; using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; -using System.Linq; using Version = Daybreak.Shared.Models.Versioning.Version; namespace Daybreak.Tests.Models; @@ -122,7 +120,7 @@ public class VersionTests [TestMethod] public void VersionConstructorTest(string version, bool shouldNotThrow) { - var action = new Action(() => new Version(version)); + var action = new Action(() => _ = new Version(version)); if (shouldNotThrow is false) { action.Should().Throw<ArgumentException>(); diff --git a/Daybreak.Tests/Models/VialOfDyeTests.cs b/Daybreak.Tests/Models/VialOfDyeTests.cs index d718eb8c..9bed57c3 100644 --- a/Daybreak.Tests/Models/VialOfDyeTests.cs +++ b/Daybreak.Tests/Models/VialOfDyeTests.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.Guildwars; using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Collections.Generic; namespace Daybreak.Tests.Models; diff --git a/Daybreak.Tests/Services/BuildTemplateManagerTests.cs b/Daybreak.Tests/Services/BuildTemplateManagerTests.cs index ce710ef7..6deaae26 100644 --- a/Daybreak.Tests/Services/BuildTemplateManagerTests.cs +++ b/Daybreak.Tests/Services/BuildTemplateManagerTests.cs @@ -1,11 +1,11 @@ -using Daybreak.Services.BuildTemplates; -using Daybreak.Shared.Models.Builds; +using Daybreak.Shared.Models.Builds; using Daybreak.Shared.Models.Guildwars; using Daybreak.Shared.Services.BuildTemplates; using FluentAssertions; using Microsoft.Extensions.Logging; using Microsoft.VisualStudio.TestTools.UnitTesting; using NSubstitute; +using Attribute = Daybreak.Shared.Models.Guildwars.Attribute; namespace Daybreak.Tests.Services; @@ -14,7 +14,7 @@ public class BuildTemplateManagerTests { private const string EncodedSingleTemplate = "OwBk0texXNu0Dj/z+TDzBj+TN4AE"; private const string EncodedTeamTemplate = "OQJUAMxOEMLnw0nDXQGY6aw2B OQNCA8wDP9B8DyzmOUi1veC OggjYxXTIPWbp5krZfxEAAAoD OwUTM4HDn5gc9TJSh6xddmETA"; - private IBuildTemplateManager buildTemplateManager; + private BuildTemplateManager buildTemplateManager = default!; [TestInitialize] public void Initialize() diff --git a/Daybreak.sln b/Daybreak.sln index ae3f5753..4a775119 100644 --- a/Daybreak.sln +++ b/Daybreak.sln @@ -30,6 +30,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig .github\CODEOWNERS = .github\CODEOWNERS + Directory.Build.props = Directory.Build.props + Directory.Packages.props = Directory.Packages.props README.md = README.md EndProjectSection EndProject diff --git a/Daybreak/Attributes/OptionCustomValidatorAttribute.cs b/Daybreak/Attributes/OptionCustomValidatorAttribute.cs index 78912575..7b135d12 100644 --- a/Daybreak/Attributes/OptionCustomValidatorAttribute.cs +++ b/Daybreak/Attributes/OptionCustomValidatorAttribute.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Validators; -using System; namespace Daybreak.Attributes; diff --git a/Daybreak/Attributes/OptionIgnoreAttribute.cs b/Daybreak/Attributes/OptionIgnoreAttribute.cs index 3f6fbf2d..e750bbca 100644 --- a/Daybreak/Attributes/OptionIgnoreAttribute.cs +++ b/Daybreak/Attributes/OptionIgnoreAttribute.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Attributes; +namespace Daybreak.Attributes; [AttributeUsage(AttributeTargets.Property)] public sealed class OptionIgnoreAttribute : Attribute diff --git a/Daybreak/Attributes/OptionNameAttribute.cs b/Daybreak/Attributes/OptionNameAttribute.cs index 15cd78d4..aa84d572 100644 --- a/Daybreak/Attributes/OptionNameAttribute.cs +++ b/Daybreak/Attributes/OptionNameAttribute.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Attributes; +namespace Daybreak.Attributes; [AttributeUsage(AttributeTargets.Property)] public sealed class OptionNameAttribute : Attribute diff --git a/Daybreak/Attributes/OptionRangeAttribute.cs b/Daybreak/Attributes/OptionRangeAttribute.cs index 619633c3..bf002fed 100644 --- a/Daybreak/Attributes/OptionRangeAttribute.cs +++ b/Daybreak/Attributes/OptionRangeAttribute.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Attributes; +namespace Daybreak.Attributes; [AttributeUsage(AttributeTargets.Property)] public sealed class OptionRangeAttribute<T> : Attribute diff --git a/Daybreak/Attributes/OptionSetterView.cs b/Daybreak/Attributes/OptionSetterView.cs index 1bb77bf6..81bd41bb 100644 --- a/Daybreak/Attributes/OptionSetterView.cs +++ b/Daybreak/Attributes/OptionSetterView.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; namespace Daybreak.Attributes; diff --git a/Daybreak/Attributes/OptionSynchronizationIgnoreAttribute.cs b/Daybreak/Attributes/OptionSynchronizationIgnoreAttribute.cs index 09ac366d..af85e6f4 100644 --- a/Daybreak/Attributes/OptionSynchronizationIgnoreAttribute.cs +++ b/Daybreak/Attributes/OptionSynchronizationIgnoreAttribute.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Attributes; +namespace Daybreak.Attributes; [AttributeUsage(AttributeTargets.Property)] public sealed class OptionSynchronizationIgnoreAttribute : Attribute diff --git a/Daybreak/Attributes/OptionsIgnoreAttribute.cs b/Daybreak/Attributes/OptionsIgnoreAttribute.cs index 2434f854..708fcc4b 100644 --- a/Daybreak/Attributes/OptionsIgnoreAttribute.cs +++ b/Daybreak/Attributes/OptionsIgnoreAttribute.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Attributes; +namespace Daybreak.Attributes; [AttributeUsage(AttributeTargets.Class)] public sealed class OptionsIgnoreAttribute : Attribute diff --git a/Daybreak/Attributes/OptionsNameAttribute.cs b/Daybreak/Attributes/OptionsNameAttribute.cs index b25f1487..6b5ea297 100644 --- a/Daybreak/Attributes/OptionsNameAttribute.cs +++ b/Daybreak/Attributes/OptionsNameAttribute.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Attributes; +namespace Daybreak.Attributes; [AttributeUsage(AttributeTargets.Class)] public sealed class OptionsNameAttribute : Attribute diff --git a/Daybreak/Attributes/OptionsSynchronizationIgnoreAttribute.cs b/Daybreak/Attributes/OptionsSynchronizationIgnoreAttribute.cs index 26564743..91d30b19 100644 --- a/Daybreak/Attributes/OptionsSynchronizationIgnoreAttribute.cs +++ b/Daybreak/Attributes/OptionsSynchronizationIgnoreAttribute.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Attributes; +namespace Daybreak.Attributes; [AttributeUsage(AttributeTargets.Class)] public sealed class OptionsSynchronizationIgnoreAttribute : Attribute diff --git a/Daybreak/Behaviors/RowAutoMargin.cs b/Daybreak/Behaviors/RowAutoMargin.cs index 36ae7c01..77669135 100644 --- a/Daybreak/Behaviors/RowAutoMargin.cs +++ b/Daybreak/Behaviors/RowAutoMargin.cs @@ -1,5 +1,4 @@ using Microsoft.Xaml.Behaviors; -using System.Linq; using System.Windows; using System.Windows.Controls; diff --git a/Daybreak/Behaviors/ScaleFontWithSize.cs b/Daybreak/Behaviors/ScaleFontWithSize.cs index ffa53ebd..1d3457e4 100644 --- a/Daybreak/Behaviors/ScaleFontWithSize.cs +++ b/Daybreak/Behaviors/ScaleFontWithSize.cs @@ -1,5 +1,4 @@ using Microsoft.Xaml.Behaviors; -using System; using System.ComponentModel; using System.Globalization; using System.Windows; diff --git a/Daybreak/Behaviors/ScrollIntoView.cs b/Daybreak/Behaviors/ScrollIntoView.cs index d99f1fd8..9de87948 100644 --- a/Daybreak/Behaviors/ScrollIntoView.cs +++ b/Daybreak/Behaviors/ScrollIntoView.cs @@ -1,5 +1,4 @@ using Microsoft.Xaml.Behaviors; -using System; using System.Extensions; using System.Windows.Controls; diff --git a/Daybreak/Configuration/Options/CredentialManagerOptions.cs b/Daybreak/Configuration/Options/CredentialManagerOptions.cs index 952bb080..82e5ad4f 100644 --- a/Daybreak/Configuration/Options/CredentialManagerOptions.cs +++ b/Daybreak/Configuration/Options/CredentialManagerOptions.cs @@ -1,7 +1,6 @@ using Daybreak.Attributes; using Daybreak.Shared.Models; using Newtonsoft.Json; -using System.Collections.Generic; namespace Daybreak.Configuration.Options; diff --git a/Daybreak/Configuration/Options/GuildwarsExecutableOptions.cs b/Daybreak/Configuration/Options/GuildwarsExecutableOptions.cs index a5775c5d..cf295697 100644 --- a/Daybreak/Configuration/Options/GuildwarsExecutableOptions.cs +++ b/Daybreak/Configuration/Options/GuildwarsExecutableOptions.cs @@ -1,6 +1,5 @@ using Daybreak.Attributes; using Newtonsoft.Json; -using System.Collections.Generic; namespace Daybreak.Configuration.Options; [OptionsIgnore] diff --git a/Daybreak/Configuration/Options/LaunchConfigurationServiceOptions.cs b/Daybreak/Configuration/Options/LaunchConfigurationServiceOptions.cs index dd42e7cc..605f8e4f 100644 --- a/Daybreak/Configuration/Options/LaunchConfigurationServiceOptions.cs +++ b/Daybreak/Configuration/Options/LaunchConfigurationServiceOptions.cs @@ -1,7 +1,6 @@ using Daybreak.Attributes; using Daybreak.Shared.Models.LaunchConfigurations; using Newtonsoft.Json; -using System.Collections.Generic; namespace Daybreak.Configuration.Options; diff --git a/Daybreak/Configuration/Options/LauncherOptions.cs b/Daybreak/Configuration/Options/LauncherOptions.cs index 16e32e83..06ef85af 100644 --- a/Daybreak/Configuration/Options/LauncherOptions.cs +++ b/Daybreak/Configuration/Options/LauncherOptions.cs @@ -1,7 +1,6 @@ using Daybreak.Attributes; using Daybreak.Views; using Newtonsoft.Json; -using System; namespace Daybreak.Configuration.Options; diff --git a/Daybreak/Configuration/Options/PluginsServiceOptions.cs b/Daybreak/Configuration/Options/PluginsServiceOptions.cs index ddccaa05..1d04d794 100644 --- a/Daybreak/Configuration/Options/PluginsServiceOptions.cs +++ b/Daybreak/Configuration/Options/PluginsServiceOptions.cs @@ -1,6 +1,5 @@ using Daybreak.Attributes; using Daybreak.Services.Plugins.Models; -using System.Collections.Generic; namespace Daybreak.Configuration.Options; diff --git a/Daybreak/Configuration/Options/PriceHistoryOptions.cs b/Daybreak/Configuration/Options/PriceHistoryOptions.cs index 8899f2c7..bb8fd2f4 100644 --- a/Daybreak/Configuration/Options/PriceHistoryOptions.cs +++ b/Daybreak/Configuration/Options/PriceHistoryOptions.cs @@ -1,6 +1,4 @@ using Daybreak.Attributes; -using System; -using System.Collections.Generic; namespace Daybreak.Configuration.Options; diff --git a/Daybreak/Configuration/Options/ThemeOptions.cs b/Daybreak/Configuration/Options/ThemeOptions.cs index fb892f7c..2577724c 100644 --- a/Daybreak/Configuration/Options/ThemeOptions.cs +++ b/Daybreak/Configuration/Options/ThemeOptions.cs @@ -23,5 +23,5 @@ public sealed class ThemeOptions [OptionIgnore] [OptionName(Name = "Wintersday Mode", Description = "If true, Daybreak will apply a Wintersday theme")] - public bool WintersdayMode => false; + public bool WintersdayMode { get; set; } = false; } diff --git a/Daybreak/Configuration/Options/TradeAlertingOptions.cs b/Daybreak/Configuration/Options/TradeAlertingOptions.cs index 32a80670..20ee0ac3 100644 --- a/Daybreak/Configuration/Options/TradeAlertingOptions.cs +++ b/Daybreak/Configuration/Options/TradeAlertingOptions.cs @@ -1,7 +1,5 @@ using Daybreak.Attributes; using Daybreak.Shared.Models.Trade; -using System; -using System.Collections.Generic; namespace Daybreak.Configuration.Options; diff --git a/Daybreak/Configuration/Options/TraderQuotesOptions.cs b/Daybreak/Configuration/Options/TraderQuotesOptions.cs index be07ec8d..13aab235 100644 --- a/Daybreak/Configuration/Options/TraderQuotesOptions.cs +++ b/Daybreak/Configuration/Options/TraderQuotesOptions.cs @@ -1,5 +1,4 @@ using Daybreak.Attributes; -using System; namespace Daybreak.Configuration.Options; diff --git a/Daybreak/Configuration/Options/UModOptions.cs b/Daybreak/Configuration/Options/UModOptions.cs index 503d7bb7..698c3815 100644 --- a/Daybreak/Configuration/Options/UModOptions.cs +++ b/Daybreak/Configuration/Options/UModOptions.cs @@ -1,7 +1,6 @@ using Daybreak.Attributes; using Daybreak.Shared.Models.UMod; using Newtonsoft.Json; -using System.Collections.Generic; namespace Daybreak.Configuration.Options; diff --git a/Daybreak/Configuration/ProjectConfiguration.cs b/Daybreak/Configuration/ProjectConfiguration.cs index 3bb37ba2..23697d9c 100644 --- a/Daybreak/Configuration/ProjectConfiguration.cs +++ b/Daybreak/Configuration/ProjectConfiguration.cs @@ -3,7 +3,6 @@ using Daybreak.Services.BuildTemplates; using Daybreak.Services.Credentials; using Daybreak.Services.IconRetrieve; using Daybreak.Services.Logging; -using Daybreak.Services.Mutex; using Daybreak.Services.Privilege; using Daybreak.Services.Screens; using Daybreak.Services.Screenshots; @@ -45,9 +44,7 @@ using Daybreak.Services.Notifications; using Daybreak.Services.Charts; using Daybreak.Services.Images; using Daybreak.Services.InternetChecker; -using System; using Daybreak.Services.Sounds; -using Daybreak.Models.Notifications.Handling; using Daybreak.Services.TradeChat.Notifications; using Daybreak.Views.Copy; using Daybreak.Services.DSOAL; @@ -107,7 +104,6 @@ using Daybreak.Shared.Services.UMod; using Daybreak.Shared.Services.Updater; using Daybreak.Shared.Services.Injection; using Daybreak.Shared.Services.Metrics; -using Daybreak.Shared.Services.Mutex; using Daybreak.Shared.Services.IconRetrieve; using Daybreak.Shared.Services.Updater.PostUpdate; using Daybreak.Shared.Services.Mods; @@ -136,7 +132,6 @@ using Daybreak.Services.Telemetry; using System.Reflection; using Version = Daybreak.Shared.Models.Versioning.Version; using Daybreak.Shared.Models.Plugins; -using System.Collections.Generic; namespace Daybreak.Configuration; @@ -219,7 +214,6 @@ public class ProjectConfiguration : PluginConfigurationBase services.AddSingleton<IMenuServiceInitializer, MenuService>(sp => sp.GetRequiredService<IMenuService>().Cast<MenuService>()); services.AddSingleton<IMenuServiceProducer, MenuService>(sp => sp.GetRequiredService<IMenuService>().Cast<MenuService>()); services.AddSingleton<IMenuServiceButtonHandler, MenuService>(sp => sp.GetRequiredService<IMenuService>().Cast<MenuService>()); - services.AddSingleton<IMutexHandler, MutexHandler>(); services.AddSingleton<IShortcutManager, ShortcutManager>(); services.AddSingleton<IMetricsService, MetricsService>(); services.AddSingleton<IStartupActionProducer, StartupActionManager>(); @@ -505,72 +499,72 @@ public class ProjectConfiguration : PluginConfigurationBase return services .ThrowIfNull() .RegisterHttpClient<ApplicationUpdater>() - .WithMessageHandler(this.SetupLoggingAndMetrics<ApplicationUpdater>) - .WithDefaultRequestHeadersSetup(this.SetupDaybreakUserAgent) + .WithMessageHandler(SetupLoggingAndMetrics<ApplicationUpdater>) + .WithDefaultRequestHeadersSetup(SetupDaybreakUserAgent) .Build() .RegisterHttpClient<OnlinePictureClient>() - .WithMessageHandler(this.SetupLoggingAndMetrics<OnlinePictureClient>) - .WithDefaultRequestHeadersSetup(this.SetupChromeImpersonationUserAgent) + .WithMessageHandler(SetupLoggingAndMetrics<OnlinePictureClient>) + .WithDefaultRequestHeadersSetup(SetupChromeImpersonationUserAgent) .Build() .RegisterHttpClient<GraphClient>() - .WithMessageHandler(this.SetupLoggingAndMetrics<GraphClient>) - .WithDefaultRequestHeadersSetup(this.SetupDaybreakUserAgent) + .WithMessageHandler(SetupLoggingAndMetrics<GraphClient>) + .WithDefaultRequestHeadersSetup(SetupDaybreakUserAgent) .Build() .RegisterHttpClient<DownloadService>() - .WithMessageHandler(this.SetupLoggingAndMetrics<DownloadService>) - .WithDefaultRequestHeadersSetup(this.SetupDaybreakUserAgent) + .WithMessageHandler(SetupLoggingAndMetrics<DownloadService>) + .WithDefaultRequestHeadersSetup(SetupDaybreakUserAgent) .Build() .RegisterHttpClient<TradeChatService<KamadanTradeChatOptions>>() - .WithMessageHandler(this.SetupLoggingAndMetrics<TradeChatService<KamadanTradeChatOptions>>) - .WithDefaultRequestHeadersSetup(this.SetupDaybreakUserAgent) + .WithMessageHandler(SetupLoggingAndMetrics<TradeChatService<KamadanTradeChatOptions>>) + .WithDefaultRequestHeadersSetup(SetupDaybreakUserAgent) .Build() .RegisterHttpClient<TradeChatService<AscalonTradeChatOptions>>() - .WithMessageHandler(this.SetupLoggingAndMetrics<TradeChatService<AscalonTradeChatOptions>>) - .WithDefaultRequestHeadersSetup(this.SetupDaybreakUserAgent) + .WithMessageHandler(SetupLoggingAndMetrics<TradeChatService<AscalonTradeChatOptions>>) + .WithDefaultRequestHeadersSetup(SetupDaybreakUserAgent) .Build() .RegisterHttpClient<IconCache>() - .WithMessageHandler(this.SetupLoggingAndMetrics<IconCache>) - .WithDefaultRequestHeadersSetup(this.SetupDaybreakUserAgent) + .WithMessageHandler(SetupLoggingAndMetrics<IconCache>) + .WithDefaultRequestHeadersSetup(SetupDaybreakUserAgent) .Build() .RegisterHttpClient<TraderQuoteService>() - .WithMessageHandler(this.SetupLoggingAndMetrics<TraderQuoteService>) - .WithDefaultRequestHeadersSetup(this.SetupDaybreakUserAgent) + .WithMessageHandler(SetupLoggingAndMetrics<TraderQuoteService>) + .WithDefaultRequestHeadersSetup(SetupDaybreakUserAgent) .Build() .RegisterHttpClient<PriceHistoryService>() - .WithMessageHandler(this.SetupLoggingAndMetrics<PriceHistoryService>) - .WithDefaultRequestHeadersSetup(this.SetupDaybreakUserAgent) + .WithMessageHandler(SetupLoggingAndMetrics<PriceHistoryService>) + .WithDefaultRequestHeadersSetup(SetupDaybreakUserAgent) .Build() .RegisterHttpClient<InternetCheckingService>() - .WithMessageHandler(this.SetupLoggingAndMetrics<InternetCheckingService>) - .WithDefaultRequestHeadersSetup(this.SetupDaybreakUserAgent) + .WithMessageHandler(SetupLoggingAndMetrics<InternetCheckingService>) + .WithDefaultRequestHeadersSetup(SetupDaybreakUserAgent) .Build() .RegisterHttpClient<ChromiumBrowserWrapper>() - .WithMessageHandler(this.SetupLoggingAndMetrics<ChromiumBrowserWrapper>) - .WithDefaultRequestHeadersSetup(this.SetupDaybreakUserAgent) + .WithMessageHandler(SetupLoggingAndMetrics<ChromiumBrowserWrapper>) + .WithDefaultRequestHeadersSetup(SetupDaybreakUserAgent) .Build() .RegisterHttpClient<ToolboxClient>() - .WithMessageHandler(this.SetupLoggingAndMetrics<ToolboxClient>) - .WithDefaultRequestHeadersSetup(this.SetupDaybreakUserAgent) + .WithMessageHandler(SetupLoggingAndMetrics<ToolboxClient>) + .WithDefaultRequestHeadersSetup(SetupDaybreakUserAgent) .Build() .RegisterHttpClient<ReShadeService>() - .WithMessageHandler(this.SetupLoggingAndMetrics<ReShadeService>) - .WithDefaultRequestHeadersSetup(this.SetupDaybreakUserAgent) + .WithMessageHandler(SetupLoggingAndMetrics<ReShadeService>) + .WithDefaultRequestHeadersSetup(SetupDaybreakUserAgent) .Build() .RegisterHttpClient<UModService>() - .WithMessageHandler(this.SetupLoggingAndMetrics<UModService>) - .WithDefaultRequestHeadersSetup(this.SetupDaybreakUserAgent) + .WithMessageHandler(SetupLoggingAndMetrics<UModService>) + .WithDefaultRequestHeadersSetup(SetupDaybreakUserAgent) .Build() .RegisterHttpClient<UBlockOriginService>() - .WithMessageHandler(this.SetupLoggingAndMetrics<UBlockOriginService>) - .WithDefaultRequestHeadersSetup(this.SetupDaybreakUserAgent) + .WithMessageHandler(SetupLoggingAndMetrics<UBlockOriginService>) + .WithDefaultRequestHeadersSetup(SetupDaybreakUserAgent) .Build() .RegisterHttpClient<DXVKService>() - .WithMessageHandler(this.SetupLoggingAndMetrics<DXVKService>) - .WithDefaultRequestHeadersSetup(this.SetupDaybreakUserAgent) + .WithMessageHandler(SetupLoggingAndMetrics<DXVKService>) + .WithDefaultRequestHeadersSetup(SetupDaybreakUserAgent) .Build() .RegisterHttpClient<ScopedApiContext>() - .WithMessageHandler(this.SetupLoggingAndMetrics<ScopedApiContext>) - .WithDefaultRequestHeadersSetup(this.SetupDaybreakUserAgent) + .WithMessageHandler(SetupLoggingAndMetrics<ScopedApiContext>) + .WithDefaultRequestHeadersSetup(SetupDaybreakUserAgent) .Build(); } } diff --git a/Daybreak/Configuration/SecretManager.cs b/Daybreak/Configuration/SecretManager.cs index e8473f7b..4c813815 100644 --- a/Daybreak/Configuration/SecretManager.cs +++ b/Daybreak/Configuration/SecretManager.cs @@ -1,7 +1,5 @@ using Newtonsoft.Json.Linq; -using System; using System.Extensions; -using System.Linq; using System.Reflection; namespace Daybreak.Configuration; diff --git a/Daybreak/Controls/AsyncImage.xaml.cs b/Daybreak/Controls/AsyncImage.xaml.cs index 1796372a..4f0a9d81 100644 --- a/Daybreak/Controls/AsyncImage.xaml.cs +++ b/Daybreak/Controls/AsyncImage.xaml.cs @@ -2,8 +2,6 @@ using Daybreak.Shared.Services.Images; using Microsoft.Extensions.DependencyInjection; using System.Core.Extensions; -using System.Threading; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Controls/Buttons/AddButton.xaml.cs b/Daybreak/Controls/Buttons/AddButton.xaml.cs index 146ded5c..07e8761d 100644 --- a/Daybreak/Controls/Buttons/AddButton.xaml.cs +++ b/Daybreak/Controls/Buttons/AddButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; using System.Windows.Input; namespace Daybreak.Controls.Buttons; diff --git a/Daybreak/Controls/Buttons/BackButton.xaml.cs b/Daybreak/Controls/Buttons/BackButton.xaml.cs index d2ef622d..81c53ca3 100644 --- a/Daybreak/Controls/Buttons/BackButton.xaml.cs +++ b/Daybreak/Controls/Buttons/BackButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Controls/Buttons/BinButton.xaml.cs b/Daybreak/Controls/Buttons/BinButton.xaml.cs index 106450d3..9df48608 100644 --- a/Daybreak/Controls/Buttons/BinButton.xaml.cs +++ b/Daybreak/Controls/Buttons/BinButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Controls/Buttons/BrowserButton.xaml.cs b/Daybreak/Controls/Buttons/BrowserButton.xaml.cs index be34597e..0ee366a8 100644 --- a/Daybreak/Controls/Buttons/BrowserButton.xaml.cs +++ b/Daybreak/Controls/Buttons/BrowserButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Controls/Buttons/CancelButton.xaml.cs b/Daybreak/Controls/Buttons/CancelButton.xaml.cs index 586c63fd..6e33177f 100644 --- a/Daybreak/Controls/Buttons/CancelButton.xaml.cs +++ b/Daybreak/Controls/Buttons/CancelButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Controls/Buttons/CircularButton.xaml.cs b/Daybreak/Controls/Buttons/CircularButton.xaml.cs index 2c5412a7..1cb5877b 100644 --- a/Daybreak/Controls/Buttons/CircularButton.xaml.cs +++ b/Daybreak/Controls/Buttons/CircularButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows; +using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Controls/Buttons/CopyButton.xaml.cs b/Daybreak/Controls/Buttons/CopyButton.xaml.cs index ada9c707..7f54bbf1 100644 --- a/Daybreak/Controls/Buttons/CopyButton.xaml.cs +++ b/Daybreak/Controls/Buttons/CopyButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Controls/Buttons/FilePickerButton.xaml.cs b/Daybreak/Controls/Buttons/FilePickerButton.xaml.cs index 24076707..42a5a9e7 100644 --- a/Daybreak/Controls/Buttons/FilePickerButton.xaml.cs +++ b/Daybreak/Controls/Buttons/FilePickerButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Controls/Buttons/GWToolboxButton.xaml.cs b/Daybreak/Controls/Buttons/GWToolboxButton.xaml.cs index 92d18663..215fb22a 100644 --- a/Daybreak/Controls/Buttons/GWToolboxButton.xaml.cs +++ b/Daybreak/Controls/Buttons/GWToolboxButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Controls/Buttons/HelpButton.xaml.cs b/Daybreak/Controls/Buttons/HelpButton.xaml.cs index f2023b01..3f0778e8 100644 --- a/Daybreak/Controls/Buttons/HelpButton.xaml.cs +++ b/Daybreak/Controls/Buttons/HelpButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Controls/Buttons/HighlightButton.xaml.cs b/Daybreak/Controls/Buttons/HighlightButton.xaml.cs index 10cea254..6b52e081 100644 --- a/Daybreak/Controls/Buttons/HighlightButton.xaml.cs +++ b/Daybreak/Controls/Buttons/HighlightButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows; +using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; @@ -33,7 +32,7 @@ public partial class HighlightButton : UserControl [GenerateDependencyProperty(InitialValue = TextWrapping.Wrap)] private TextWrapping textWrapping = TextWrapping.Wrap; [GenerateDependencyProperty] - private Thickness textPadding = new Thickness(0); + private Thickness textPadding = new(0); [GenerateDependencyProperty] private UIElement buttonContent = default!; diff --git a/Daybreak/Controls/Buttons/HomeButton.xaml.cs b/Daybreak/Controls/Buttons/HomeButton.xaml.cs index 7a353d23..d323adc4 100644 --- a/Daybreak/Controls/Buttons/HomeButton.xaml.cs +++ b/Daybreak/Controls/Buttons/HomeButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Controls/Buttons/MaximizeButton.xaml.cs b/Daybreak/Controls/Buttons/MaximizeButton.xaml.cs index 0aa38df6..851dbfe8 100644 --- a/Daybreak/Controls/Buttons/MaximizeButton.xaml.cs +++ b/Daybreak/Controls/Buttons/MaximizeButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Controls/Buttons/MenuButton.xaml.cs b/Daybreak/Controls/Buttons/MenuButton.xaml.cs index 084ba46d..f13cae97 100644 --- a/Daybreak/Controls/Buttons/MenuButton.xaml.cs +++ b/Daybreak/Controls/Buttons/MenuButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Extensions; +using System.Windows.Extensions; using System.Windows; using System.Windows.Controls; using System.Windows.Media; diff --git a/Daybreak/Controls/Buttons/MinusButton.xaml.cs b/Daybreak/Controls/Buttons/MinusButton.xaml.cs index 29abf51c..f43bb88d 100644 --- a/Daybreak/Controls/Buttons/MinusButton.xaml.cs +++ b/Daybreak/Controls/Buttons/MinusButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Controls/Buttons/NavigateFileButton.xaml.cs b/Daybreak/Controls/Buttons/NavigateFileButton.xaml.cs index e44c1c8b..d5030a03 100644 --- a/Daybreak/Controls/Buttons/NavigateFileButton.xaml.cs +++ b/Daybreak/Controls/Buttons/NavigateFileButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Controls/Buttons/RefreshButton.xaml.cs b/Daybreak/Controls/Buttons/RefreshButton.xaml.cs index 91c6d0a7..a67516f6 100644 --- a/Daybreak/Controls/Buttons/RefreshButton.xaml.cs +++ b/Daybreak/Controls/Buttons/RefreshButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Controls/Buttons/SaveButton.xaml.cs b/Daybreak/Controls/Buttons/SaveButton.xaml.cs index 821134e6..d2e6323c 100644 --- a/Daybreak/Controls/Buttons/SaveButton.xaml.cs +++ b/Daybreak/Controls/Buttons/SaveButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Controls/Buttons/StarButton.xaml.cs b/Daybreak/Controls/Buttons/StarButton.xaml.cs index 09d99fde..4e259c9e 100644 --- a/Daybreak/Controls/Buttons/StarButton.xaml.cs +++ b/Daybreak/Controls/Buttons/StarButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Controls/Buttons/SynchronizeButton.xaml.cs b/Daybreak/Controls/Buttons/SynchronizeButton.xaml.cs index c79983c7..623fb365 100644 --- a/Daybreak/Controls/Buttons/SynchronizeButton.xaml.cs +++ b/Daybreak/Controls/Buttons/SynchronizeButton.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows.Controls; +using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Controls/ChromiumBrowserWrapper.xaml.cs b/Daybreak/Controls/ChromiumBrowserWrapper.xaml.cs index 63274bdb..87b89853 100644 --- a/Daybreak/Controls/ChromiumBrowserWrapper.xaml.cs +++ b/Daybreak/Controls/ChromiumBrowserWrapper.xaml.cs @@ -11,8 +11,6 @@ using Daybreak.Utils; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Web.WebView2.Core; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Diagnostics; @@ -20,8 +18,6 @@ using System.Extensions; using System.IO; using System.Net.Http; using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Controls/DropDownButton.cs b/Daybreak/Controls/DropDownButton.cs index 63098c29..43a5eb81 100644 --- a/Daybreak/Controls/DropDownButton.cs +++ b/Daybreak/Controls/DropDownButton.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections; +using System.Collections; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; @@ -98,11 +97,7 @@ public partial class DropDownButton : Control private void DropDownButtonContextMenu_ItemClicked(object? _, object e) { this.SelectedItem = e; - if (this.ContextMenu is not null) - { - this.ContextMenu.IsOpen = false; - } - + this.ContextMenu?.IsOpen = false; this.SelectionChanged?.Invoke(this, e); } diff --git a/Daybreak/Controls/DropDownButtonContextMenu.xaml.cs b/Daybreak/Controls/DropDownButtonContextMenu.xaml.cs index dc5e6f72..95a8885f 100644 --- a/Daybreak/Controls/DropDownButtonContextMenu.xaml.cs +++ b/Daybreak/Controls/DropDownButtonContextMenu.xaml.cs @@ -1,5 +1,4 @@ using Daybreak.Controls.Buttons; -using System; using System.Collections; using System.Extensions; using System.Windows; diff --git a/Daybreak/Controls/ExpandableMenuSection.xaml.cs b/Daybreak/Controls/ExpandableMenuSection.xaml.cs index 5d49c722..ce17a8dc 100644 --- a/Daybreak/Controls/ExpandableMenuSection.xaml.cs +++ b/Daybreak/Controls/ExpandableMenuSection.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.ObjectModel; +using System.Collections.ObjectModel; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Controls/FocusViewComponents/BuildComponent.xaml.cs b/Daybreak/Controls/FocusViewComponents/BuildComponent.xaml.cs index 99548d5c..45cc71ee 100644 --- a/Daybreak/Controls/FocusViewComponents/BuildComponent.xaml.cs +++ b/Daybreak/Controls/FocusViewComponents/BuildComponent.xaml.cs @@ -9,14 +9,9 @@ using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.Notifications; using Daybreak.Views; using Microsoft.Extensions.DependencyInjection; -using System; -using System.Collections.Generic; using System.Collections.ObjectModel; using System.Core.Extensions; using System.Extensions; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Controls/FocusViewComponents/CharacterComponent.xaml.cs b/Daybreak/Controls/FocusViewComponents/CharacterComponent.xaml.cs index 14103ed2..b13485ad 100644 --- a/Daybreak/Controls/FocusViewComponents/CharacterComponent.xaml.cs +++ b/Daybreak/Controls/FocusViewComponents/CharacterComponent.xaml.cs @@ -3,11 +3,9 @@ using Daybreak.Shared; using Daybreak.Shared.Models.FocusView; using Daybreak.Shared.Services.Experience; using Microsoft.Extensions.DependencyInjection; -using System; using System.Collections.ObjectModel; using System.Configuration; using System.Core.Extensions; -using System.Linq; using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; @@ -19,7 +17,6 @@ public partial class CharacterComponent : UserControl private readonly IExperienceCalculator experienceCalculator; private readonly ILiveUpdateableOptions<FocusViewOptions> liveOptions; - public event EventHandler<string>? NavigateToClicked; public event EventHandler<CharacterSelectComponentEntry>? SwitchCharacterClicked; public ObservableCollection<CharacterSelectComponentEntry> Characters { get; } = []; diff --git a/Daybreak/Controls/FocusViewComponents/CurrentMapComponent.xaml.cs b/Daybreak/Controls/FocusViewComponents/CurrentMapComponent.xaml.cs index 139eaacd..46de28fd 100644 --- a/Daybreak/Controls/FocusViewComponents/CurrentMapComponent.xaml.cs +++ b/Daybreak/Controls/FocusViewComponents/CurrentMapComponent.xaml.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Guildwars; -using System; using System.Windows.Controls; using System.Windows.Input; diff --git a/Daybreak/Controls/FocusViewComponents/QuestLogComponent.xaml.cs b/Daybreak/Controls/FocusViewComponents/QuestLogComponent.xaml.cs index 07ffd535..77069cda 100644 --- a/Daybreak/Controls/FocusViewComponents/QuestLogComponent.xaml.cs +++ b/Daybreak/Controls/FocusViewComponents/QuestLogComponent.xaml.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.FocusView; using Daybreak.Shared.Models.Guildwars; -using System; using System.Windows.Controls; namespace Daybreak.Controls.FocusViewComponents; diff --git a/Daybreak/Controls/FocusViewComponents/TitleInformationComponent.xaml.cs b/Daybreak/Controls/FocusViewComponents/TitleInformationComponent.xaml.cs index f9397ec0..9702e88d 100644 --- a/Daybreak/Controls/FocusViewComponents/TitleInformationComponent.xaml.cs +++ b/Daybreak/Controls/FocusViewComponents/TitleInformationComponent.xaml.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.FocusView; using Daybreak.Shared.Models.Guildwars; -using System; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Controls/HorizontalResourceBar.xaml.cs b/Daybreak/Controls/HorizontalResourceBar.xaml.cs index 42ceff65..b5ef3bdd 100644 --- a/Daybreak/Controls/HorizontalResourceBar.xaml.cs +++ b/Daybreak/Controls/HorizontalResourceBar.xaml.cs @@ -29,6 +29,4 @@ public partial class HorizontalResourceBar : UserControl this.barColor = Brushes.Transparent; this.text = string.Empty; } - - } diff --git a/Daybreak/Controls/ImageViewer.xaml.cs b/Daybreak/Controls/ImageViewer.xaml.cs index 85991091..50459015 100644 --- a/Daybreak/Controls/ImageViewer.xaml.cs +++ b/Daybreak/Controls/ImageViewer.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Windows; +using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Animation; diff --git a/Daybreak/Controls/MenuList.xaml.cs b/Daybreak/Controls/MenuList.xaml.cs index 39a067c8..157f9d5f 100644 --- a/Daybreak/Controls/MenuList.xaml.cs +++ b/Daybreak/Controls/MenuList.xaml.cs @@ -6,12 +6,8 @@ using Daybreak.Shared; using Daybreak.Shared.Services.Menu; using Daybreak.Shared.Services.Navigation; using Microsoft.Extensions.DependencyInjection; -using System; using System.Configuration; using System.Core.Extensions; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Extensions; diff --git a/Daybreak/Controls/Notifications/NotificationStackpanel.xaml b/Daybreak/Controls/Notifications/NotificationStackpanel.xaml index 4cf5cf02..4d269a9d 100644 --- a/Daybreak/Controls/Notifications/NotificationStackpanel.xaml +++ b/Daybreak/Controls/Notifications/NotificationStackpanel.xaml @@ -4,7 +4,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Daybreak.Controls.Notifications" - xmlns:notifications="clr-namespace:Daybreak.Models.Notifications" + xmlns:notifications="clr-namespace:Daybreak.Shared.Models.Notifications;assembly=Daybreak.Shared" mc:Ignorable="d" x:Name="_this" Loaded="UserControl_Loaded" diff --git a/Daybreak/Controls/Notifications/NotificationStackpanel.xaml.cs b/Daybreak/Controls/Notifications/NotificationStackpanel.xaml.cs index 2f7453cb..c92fac4c 100644 --- a/Daybreak/Controls/Notifications/NotificationStackpanel.xaml.cs +++ b/Daybreak/Controls/Notifications/NotificationStackpanel.xaml.cs @@ -4,11 +4,9 @@ using Daybreak.Shared.Services.Notifications; using Daybreak.Shared.Services.Sounds; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -using System; using System.Collections.ObjectModel; using System.Core.Extensions; using System.Extensions; -using System.Threading; using System.Windows.Controls; using System.Windows.Threading; @@ -77,7 +75,7 @@ public partial class NotificationStackpanel : UserControl } this.Notifications.Remove(notificationWrapper); - this.notificationProducer.OpenNotification(notificationWrapper.Notification!); + _ = this.notificationProducer.OpenNotification(notificationWrapper.Notification!); notificationWrapper.Notification!.Closed = true; this.soundService.PlayNotifyClose(); } diff --git a/Daybreak/Controls/Notifications/NotificationTemplate.xaml.cs b/Daybreak/Controls/Notifications/NotificationTemplate.xaml.cs index c2d0a629..ea2c535e 100644 --- a/Daybreak/Controls/Notifications/NotificationTemplate.xaml.cs +++ b/Daybreak/Controls/Notifications/NotificationTemplate.xaml.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Notifications; -using System; using System.Windows.Controls; namespace Daybreak.Controls.Notifications; diff --git a/Daybreak/Controls/Notifications/NotificationView.xaml.cs b/Daybreak/Controls/Notifications/NotificationView.xaml.cs index 0632b23a..f0f79205 100644 --- a/Daybreak/Controls/Notifications/NotificationView.xaml.cs +++ b/Daybreak/Controls/Notifications/NotificationView.xaml.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Notifications; -using System; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Controls/Options/EnumOptionTemplate.xaml.cs b/Daybreak/Controls/Options/EnumOptionTemplate.xaml.cs index f0a89fe0..2994d0af 100644 --- a/Daybreak/Controls/Options/EnumOptionTemplate.xaml.cs +++ b/Daybreak/Controls/Options/EnumOptionTemplate.xaml.cs @@ -1,8 +1,6 @@ using Daybreak.Shared.Models.Options; -using System; using System.Collections.ObjectModel; using System.Extensions; -using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Controls/Options/OptionsSection.xaml.cs b/Daybreak/Controls/Options/OptionsSection.xaml.cs index ffe5904d..4f101f04 100644 --- a/Daybreak/Controls/Options/OptionsSection.xaml.cs +++ b/Daybreak/Controls/Options/OptionsSection.xaml.cs @@ -1,17 +1,14 @@ using Daybreak.Attributes; using Daybreak.Controls.Buttons; -using Daybreak.Launch; using Daybreak.Shared; using Daybreak.Shared.Models.Options; using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.Options; using Daybreak.Views; using Microsoft.Extensions.DependencyInjection; -using System; using System.Collections.ObjectModel; using System.Core.Extensions; using System.Extensions; -using System.Linq; using System.Reflection; using System.Windows.Controls; @@ -19,21 +16,15 @@ namespace Daybreak.Controls.Options; /// <summary> /// Interaction logic for OptionsSection.xaml /// </summary> -public partial class OptionsSection : UserControl +public partial class OptionsSection( + IOptionsProvider optionsProvider, + IViewManager viewManager) : UserControl { - private readonly IOptionsProvider optionsProvider; - private readonly IViewManager viewManager; + private readonly IOptionsProvider optionsProvider = optionsProvider.ThrowIfNull(); + private readonly IViewManager viewManager = viewManager.ThrowIfNull(); public ObservableCollection<OptionSection> Options { get; } = []; - public OptionsSection( - IOptionsProvider optionsProvider, - IViewManager viewManager) - { - this.optionsProvider = optionsProvider.ThrowIfNull(); - this.viewManager = viewManager.ThrowIfNull(); - } - public OptionsSection() : this(Global.GlobalServiceProvider.GetRequiredService<IOptionsProvider>(), Global.GlobalServiceProvider.GetRequiredService<IViewManager>()) diff --git a/Daybreak/Controls/SearchTextBox.xaml.cs b/Daybreak/Controls/SearchTextBox.xaml.cs index 23979626..91df3de5 100644 --- a/Daybreak/Controls/SearchTextBox.xaml.cs +++ b/Daybreak/Controls/SearchTextBox.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Extensions; +using System.Extensions; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Controls/SnowfallOverlay.xaml.cs b/Daybreak/Controls/SnowfallOverlay.xaml.cs index ab23c52d..e2830aea 100644 --- a/Daybreak/Controls/SnowfallOverlay.xaml.cs +++ b/Daybreak/Controls/SnowfallOverlay.xaml.cs @@ -1,8 +1,4 @@ -using System; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using System.Windows; +using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Media.Imaging; @@ -13,8 +9,8 @@ namespace Daybreak.Controls; /// </summary> public partial class SnowfallOverlay : UserControl { - private static readonly double[] Frequencies = new double[] { 0.1, 0.025, 1, 0.25 }; - private static readonly double[] Amplitudes = new double[] { 1, 0.1, 0.1, 0.2 }; + private static readonly double[] Frequencies = [0.1, 0.025, 1, 0.25]; + private static readonly double[] Amplitudes = [1, 0.1, 0.1, 0.2]; private static readonly double Divisor = Amplitudes.Sum(); [GenerateDependencyProperty] @@ -83,11 +79,11 @@ public partial class SnowfallOverlay : UserControl while (!cancellationToken.IsCancellationRequested) { var time = this.Time; - this.SnowfallTransform1.X += (this.BaseWind1 + (this.GetNoise(time) * this.WindStrength1)) / this.FlakeSize1; - this.SnowfallTransform2.X += (this.BaseWind2 + (this.GetNoise(time - 0.02) * this.WindStrength2)) / this.FlakeSize2; - this.SnowfallTransform3.X += (this.BaseWind3 + (this.GetNoise(time - 0.03) * this.WindStrength3)) / this.FlakeSize3; - this.SnowfallTransform4.X += (this.BaseWind4 + (this.GetNoise(time - 0.05) * this.WindStrength4)) / this.FlakeSize4; - this.SnowfallTransform5.X += (this.BaseWind5 + (this.GetNoise(time - 0.08) * this.WindStrength5)) / this.FlakeSize5; + this.SnowfallTransform1.X += (this.BaseWind1 + (GetNoise(time) * this.WindStrength1)) / this.FlakeSize1; + this.SnowfallTransform2.X += (this.BaseWind2 + (GetNoise(time - 0.02) * this.WindStrength2)) / this.FlakeSize2; + this.SnowfallTransform3.X += (this.BaseWind3 + (GetNoise(time - 0.03) * this.WindStrength3)) / this.FlakeSize3; + this.SnowfallTransform4.X += (this.BaseWind4 + (GetNoise(time - 0.05) * this.WindStrength4)) / this.FlakeSize4; + this.SnowfallTransform5.X += (this.BaseWind5 + (GetNoise(time - 0.08) * this.WindStrength5)) / this.FlakeSize5; await Task.Delay(16, cancellationToken).ConfigureAwait(true); } } @@ -105,7 +101,7 @@ public partial class SnowfallOverlay : UserControl this.tokenSource = default; } - private double GetNoise(double source) + private static double GetNoise(double source) { var returnValue = 0d; for(var i = 0; i < Frequencies.Length; i++) diff --git a/Daybreak/Controls/Templates/AccountTemplate.xaml.cs b/Daybreak/Controls/Templates/AccountTemplate.xaml.cs index 246458e9..c9c35766 100644 --- a/Daybreak/Controls/Templates/AccountTemplate.xaml.cs +++ b/Daybreak/Controls/Templates/AccountTemplate.xaml.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models; -using System; using System.Extensions; using System.Windows; using System.Windows.Controls; diff --git a/Daybreak/Controls/Templates/AttributeTemplate.xaml.cs b/Daybreak/Controls/Templates/AttributeTemplate.xaml.cs index 6b26ee66..22fd4a5a 100644 --- a/Daybreak/Controls/Templates/AttributeTemplate.xaml.cs +++ b/Daybreak/Controls/Templates/AttributeTemplate.xaml.cs @@ -2,7 +2,6 @@ using Daybreak.Shared.Models.Builds; using Daybreak.Shared.Services.BuildTemplates; using Microsoft.Extensions.DependencyInjection; -using System; using System.Core.Extensions; using System.Extensions; using System.Windows; diff --git a/Daybreak/Controls/Templates/BuildEntryTemplate.xaml.cs b/Daybreak/Controls/Templates/BuildEntryTemplate.xaml.cs index 7cad6a95..1160b5bb 100644 --- a/Daybreak/Controls/Templates/BuildEntryTemplate.xaml.cs +++ b/Daybreak/Controls/Templates/BuildEntryTemplate.xaml.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Builds; -using System; using System.Windows.Controls; namespace Daybreak.Controls; diff --git a/Daybreak/Controls/Templates/BuildTemplate.xaml.cs b/Daybreak/Controls/Templates/BuildTemplate.xaml.cs index 1a09381d..f7ddc91b 100644 --- a/Daybreak/Controls/Templates/BuildTemplate.xaml.cs +++ b/Daybreak/Controls/Templates/BuildTemplate.xaml.cs @@ -1,5 +1,4 @@ using Daybreak.Controls.Buttons; -using Daybreak.Launch; using Daybreak.Shared; using Daybreak.Shared.Models; using Daybreak.Shared.Models.Builds; @@ -9,15 +8,9 @@ using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Utils; using Daybreak.Views; using Microsoft.Extensions.DependencyInjection; -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; using System.ComponentModel; using System.Core.Extensions; using System.Extensions; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; @@ -43,8 +36,6 @@ public partial class BuildTemplate : UserControl private bool browserMaximized = false; private bool showingSkillList = false; - private bool replacingSecondaryProfession; - private bool replacingPrimaryProfession; private SkillTemplate? selectingSkillTemplate; private List<Skill>? skillListCache; @@ -156,7 +147,7 @@ public partial class BuildTemplate : UserControl await Task.Factory.StartNew(() => { - var filteredSkills = this.FilterSkills(searchTerm, buildEntry).ToList(); + var filteredSkills = FilterSkills(searchTerm, buildEntry).ToList(); this.Dispatcher.InvokeAsync(() => { this.PrepareSkillListCache(filteredSkills); @@ -228,7 +219,7 @@ public partial class BuildTemplate : UserControl } } - private IEnumerable<Skill> FilterSkills(string searchTerm, SingleBuildEntry buildEntry) + private static IEnumerable<Skill> FilterSkills(string searchTerm, SingleBuildEntry buildEntry) { // Replace symbols to ease search searchTerm = searchTerm?.Replace("\"", "").Replace("!", "")!; diff --git a/Daybreak/Controls/Templates/GuildwarsPathTemplate.xaml.cs b/Daybreak/Controls/Templates/GuildwarsPathTemplate.xaml.cs index a5ec5a6d..27708db3 100644 --- a/Daybreak/Controls/Templates/GuildwarsPathTemplate.xaml.cs +++ b/Daybreak/Controls/Templates/GuildwarsPathTemplate.xaml.cs @@ -5,12 +5,9 @@ using Daybreak.Shared.Models.Progress; using Daybreak.Shared.Services.Guildwars; using Microsoft.Extensions.DependencyInjection; using Microsoft.Win32; -using System; using System.Core.Extensions; using System.Extensions; using System.IO; -using System.Threading; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Controls/Templates/LaunchButtonTemplate.xaml.cs b/Daybreak/Controls/Templates/LaunchButtonTemplate.xaml.cs index 62631b79..f66dfb9d 100644 --- a/Daybreak/Controls/Templates/LaunchButtonTemplate.xaml.cs +++ b/Daybreak/Controls/Templates/LaunchButtonTemplate.xaml.cs @@ -1,9 +1,6 @@ using Daybreak.Controls.Buttons; using Daybreak.Shared.Models; using Daybreak.Shared.Utils; -using System; -using System.Threading; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Threading; diff --git a/Daybreak/Controls/Templates/PartyMemberTemplate.xaml.cs b/Daybreak/Controls/Templates/PartyMemberTemplate.xaml.cs index 77b6c519..56692bb8 100644 --- a/Daybreak/Controls/Templates/PartyMemberTemplate.xaml.cs +++ b/Daybreak/Controls/Templates/PartyMemberTemplate.xaml.cs @@ -1,7 +1,6 @@ using Daybreak.Shared.Models.Api; using Daybreak.Shared.Models.Builds; using Daybreak.Shared.Models.Guildwars; -using System; using System.Collections.ObjectModel; using System.Windows; using System.Windows.Controls; diff --git a/Daybreak/Controls/Templates/QuestLogTemplate.xaml.cs b/Daybreak/Controls/Templates/QuestLogTemplate.xaml.cs index 3077ef5f..b745d92e 100644 --- a/Daybreak/Controls/Templates/QuestLogTemplate.xaml.cs +++ b/Daybreak/Controls/Templates/QuestLogTemplate.xaml.cs @@ -1,9 +1,6 @@ using Daybreak.Controls.Buttons; using Daybreak.Shared.Models.FocusView; using Daybreak.Shared.Models.Guildwars; -using System; -using System.Collections.Generic; -using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Controls/Templates/ScreenTemplate.xaml.cs b/Daybreak/Controls/Templates/ScreenTemplate.xaml.cs index 8f7073ca..31604f3b 100644 --- a/Daybreak/Controls/Templates/ScreenTemplate.xaml.cs +++ b/Daybreak/Controls/Templates/ScreenTemplate.xaml.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models; -using System; using System.Extensions; using System.Windows; using System.Windows.Controls; diff --git a/Daybreak/Controls/Templates/SkillListEntryTemplate.xaml.cs b/Daybreak/Controls/Templates/SkillListEntryTemplate.xaml.cs index 1639549f..99ad99b3 100644 --- a/Daybreak/Controls/Templates/SkillListEntryTemplate.xaml.cs +++ b/Daybreak/Controls/Templates/SkillListEntryTemplate.xaml.cs @@ -5,8 +5,6 @@ using Daybreak.Shared.Utils; using Microsoft.Extensions.DependencyInjection; using System.Core.Extensions; using System.Extensions; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Controls/Templates/SkillTemplate.xaml.cs b/Daybreak/Controls/Templates/SkillTemplate.xaml.cs index 4ef6fd2e..cb1043ff 100644 --- a/Daybreak/Controls/Templates/SkillTemplate.xaml.cs +++ b/Daybreak/Controls/Templates/SkillTemplate.xaml.cs @@ -1,9 +1,7 @@ -using Daybreak.Launch; -using Daybreak.Shared; +using Daybreak.Shared; using Daybreak.Shared.Models.Guildwars; using Daybreak.Shared.Services.IconRetrieve; using Microsoft.Extensions.DependencyInjection; -using System; using System.Core.Extensions; using System.Extensions; using System.Windows; diff --git a/Daybreak/Controls/Templates/TradeChatMessageTemplate.xaml.cs b/Daybreak/Controls/Templates/TradeChatMessageTemplate.xaml.cs index 64c4da18..3fde00a4 100644 --- a/Daybreak/Controls/Templates/TradeChatMessageTemplate.xaml.cs +++ b/Daybreak/Controls/Templates/TradeChatMessageTemplate.xaml.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Trade; -using System; using System.Windows.Controls; namespace Daybreak.Controls.Templates; diff --git a/Daybreak/Controls/Templates/TradeChatTemplate.xaml.cs b/Daybreak/Controls/Templates/TradeChatTemplate.xaml.cs index e812cbdf..15a10a3a 100644 --- a/Daybreak/Controls/Templates/TradeChatTemplate.xaml.cs +++ b/Daybreak/Controls/Templates/TradeChatTemplate.xaml.cs @@ -1,16 +1,11 @@ -using Daybreak.Launch; -using Daybreak.Shared; +using Daybreak.Shared; using Daybreak.Shared.Models.Trade; using Daybreak.Shared.Services.TradeChat; using Microsoft.Extensions.DependencyInjection; -using System; -using System.Collections.Generic; using System.Collections.ObjectModel; using System.Core.Extensions; using System.Diagnostics; using System.Extensions; -using System.Threading; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Controls/Templates/TradeMessageTemplate.xaml.cs b/Daybreak/Controls/Templates/TradeMessageTemplate.xaml.cs index 1ba975ea..4d9c534a 100644 --- a/Daybreak/Controls/Templates/TradeMessageTemplate.xaml.cs +++ b/Daybreak/Controls/Templates/TradeMessageTemplate.xaml.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Trade; -using System; using System.Extensions; using System.Windows; using System.Windows.Controls; diff --git a/Daybreak/Controls/Templates/TradeQuoteTemplate.xaml.cs b/Daybreak/Controls/Templates/TradeQuoteTemplate.xaml.cs index c612ce2d..752e4b7a 100644 --- a/Daybreak/Controls/Templates/TradeQuoteTemplate.xaml.cs +++ b/Daybreak/Controls/Templates/TradeQuoteTemplate.xaml.cs @@ -2,7 +2,6 @@ using Daybreak.Shared.Services.IconRetrieve; using Daybreak.Shared.Services.Images; using Microsoft.Extensions.DependencyInjection; -using System; using System.Core.Extensions; using System.Windows; using System.Windows.Controls; diff --git a/Daybreak/Controls/Templates/TraderQuoteModel.cs b/Daybreak/Controls/Templates/TraderQuoteModel.cs index 610dd7e1..d175a63e 100644 --- a/Daybreak/Controls/Templates/TraderQuoteModel.cs +++ b/Daybreak/Controls/Templates/TraderQuoteModel.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Guildwars; -using System; namespace Daybreak.Controls.Templates; public sealed class TraderQuoteModel diff --git a/Daybreak/Daybreak.csproj b/Daybreak/Daybreak.csproj index 35edc3e3..bc126d49 100644 --- a/Daybreak/Daybreak.csproj +++ b/Daybreak/Daybreak.csproj @@ -11,15 +11,12 @@ <LangVersion>preview</LangVersion> <ApplicationIcon>Daybreak.ico</ApplicationIcon> <IncludePackageReferencesDuringMarkupCompilation>true</IncludePackageReferencesDuringMarkupCompilation> - <Version>0.9.9.76</Version> <EnableWindowsTargeting>true</EnableWindowsTargeting> <UserSecretsId>cfb2a489-db80-448d-a969-80270f314c46</UserSecretsId> - <AllowUnsafeBlocks>True</AllowUnsafeBlocks> <RuntimeIdentifier>win-x86</RuntimeIdentifier> </PropertyGroup> <ItemGroup> - <None Remove="Controls\FocusViewComponents\PlayerResourcesComponent.xaml~RF3770aaff.TMP" /> <None Remove="Resources\NotifyClose.wav" /> <None Remove="Resources\NotifyError.wav" /> <None Remove="Resources\NotifyInformation.wav" /> @@ -52,38 +49,38 @@ <EmbeddedResource Include="$(UserSecretsFilePath)" Condition="Exists($(UserSecretsFilePath))" /> </ItemGroup> </Target> - + <ItemGroup> - <PackageReference Include="Elastic.OpenTelemetry" Version="1.0.2" /> - <PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.12.0" /> - <PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.12.0" /> - <PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.12.0" /> - <PackageReference Include="Reloaded.Assembler" Version="1.0.16" /> - <PackageReference Include="System.Private.Uri" Version="4.3.2" /> - <PackageReference Include="WpfExtended" Version="0.7.9" /> - <PackageReference Include="WpfExtended.SourceGeneration" Version="0.3.0" /> - <PackageReference Include="WpfScreenHelper" Version="2.1.1" /> - <PackageReference Include="WriteableBitmapEx" Version="1.6.8" /> - <PackageReference Include="Squealify" Version="0.8.2.2" /> - <PackageReference Include="System.Formats.Asn1" Version="9.0.6" /> - <PackageReference Include="System.IO.Compression" Version="4.3.0" /> - <PackageReference Include="System.Linq.Async" Version="6.0.3" /> - <PackageReference Include="PeNet" Version="5.1.0" /> - <PackageReference Include="Plumsy" Version="1.1.0" /> - <PackageReference Include="securifybv.ShellLink" Version="0.1.0" /> - <PackageReference Include="AvalonEdit" Version="6.3.1.120" /> - <PackageReference Include="DiffPlex" Version="1.8.0" /> - <PackageReference Include="HtmlAgilityPack" Version="1.12.1" /> - <PackageReference Include="ini-parser-netstandard" Version="2.5.3" /> - <PackageReference Include="LiveChartsCore.SkiaSharpView.WPF" Version="2.0.0-rc2" /> - <PackageReference Include="MahApps.Metro" Version="2.4.10" /> - <PackageReference Include="Microsoft.CorrelationVector" Version="1.0.42" /> - <PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.6" /> - <PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.6" /> - <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="9.0.6" /> - <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.6" /> - <PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.135" /> - <PackageReference Include="NAudio" Version="2.2.1" /> + <PackageReference Include="Elastic.OpenTelemetry" /> + <PackageReference Include="OpenTelemetry.Exporter.Console" /> + <PackageReference Include="OpenTelemetry.Instrumentation.Http" /> + <PackageReference Include="OpenTelemetry.Instrumentation.Runtime" /> + <PackageReference Include="Reloaded.Assembler" /> + <PackageReference Include="System.Private.Uri" /> + <PackageReference Include="WpfExtended" /> + <PackageReference Include="WpfExtended.SourceGeneration" /> + <PackageReference Include="WpfScreenHelper" /> + <PackageReference Include="WriteableBitmapEx" /> + <PackageReference Include="Squealify" /> + <PackageReference Include="System.Formats.Asn1" /> + <PackageReference Include="System.IO.Compression" /> + <PackageReference Include="System.Linq.Async" /> + <PackageReference Include="PeNet" /> + <PackageReference Include="Plumsy" /> + <PackageReference Include="securifybv.ShellLink" /> + <PackageReference Include="AvalonEdit" /> + <PackageReference Include="DiffPlex" /> + <PackageReference Include="HtmlAgilityPack" /> + <PackageReference Include="ini-parser-netstandard" /> + <PackageReference Include="LiveChartsCore.SkiaSharpView.WPF" /> + <PackageReference Include="MahApps.Metro" /> + <PackageReference Include="Microsoft.CorrelationVector" /> + <PackageReference Include="Microsoft.Data.Sqlite" /> + <PackageReference Include="Microsoft.Data.Sqlite.Core" /> + <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" /> + <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" /> + <PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" /> + <PackageReference Include="NAudio" /> </ItemGroup> <ItemGroup> diff --git a/Daybreak/Launch/ExceptionDialog.xaml.cs b/Daybreak/Launch/ExceptionDialog.xaml.cs index 0e6f1d14..976a91d1 100644 --- a/Daybreak/Launch/ExceptionDialog.xaml.cs +++ b/Daybreak/Launch/ExceptionDialog.xaml.cs @@ -1,5 +1,4 @@ -using System; -using System.Diagnostics; +using System.Diagnostics; using System.Web; using System.Windows; using System.Windows.Extensions; @@ -14,7 +13,7 @@ public partial class ExceptionDialog : Window private const string BodyPlaceholder = "[BODY]"; private const string IssueUrl = $"https://github.com/gwdevhub/Daybreak/issues/new?title={TitlePlaceholder}&body={BodyPlaceholder}&labels=bug"; - private string exceptionName; + private readonly string exceptionName; [GenerateDependencyProperty] private string exceptionMessage = string.Empty; diff --git a/Daybreak/Launch/Launcher.cs b/Daybreak/Launch/Launcher.cs index 5c197bb6..d5cc81d8 100644 --- a/Daybreak/Launch/Launcher.cs +++ b/Daybreak/Launch/Launcher.cs @@ -21,12 +21,10 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Slim; using Slim.Integration.ServiceCollection; -using System; using System.Core.Extensions; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Text; -using System.Threading.Tasks; using System.Windows; using System.Windows.Extensions; using System.Windows.Media; diff --git a/Daybreak/Launch/MainWindow.xaml.cs b/Daybreak/Launch/MainWindow.xaml.cs index efd26d1a..2a2b7f4b 100644 --- a/Daybreak/Launch/MainWindow.xaml.cs +++ b/Daybreak/Launch/MainWindow.xaml.cs @@ -8,12 +8,10 @@ using Daybreak.Shared.Services.Updater; using Daybreak.Views; using MahApps.Metro.Controls; using Microsoft.Extensions.Logging; -using System; using System.Configuration; using System.Core.Extensions; using System.Diagnostics; using System.Extensions; -using System.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Services/Api/DaybreakApiService.cs b/Daybreak/Services/Api/DaybreakApiService.cs index 48de9d9b..a85ebcae 100644 --- a/Daybreak/Services/Api/DaybreakApiService.cs +++ b/Daybreak/Services/Api/DaybreakApiService.cs @@ -8,17 +8,12 @@ using Daybreak.Shared.Services.MDns; using Daybreak.Shared.Services.Notifications; using Daybreak.Shared.Utils; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Diagnostics; using System.Extensions.Core; using System.IO; -using System.Linq; using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.Api; public sealed class DaybreakApiService( diff --git a/Daybreak/Services/ApplicationArguments/ApplicationArgumentService.cs b/Daybreak/Services/ApplicationArguments/ApplicationArgumentService.cs index d4e505a4..6491cd74 100644 --- a/Daybreak/Services/ApplicationArguments/ApplicationArgumentService.cs +++ b/Daybreak/Services/ApplicationArguments/ApplicationArgumentService.cs @@ -2,10 +2,8 @@ using Daybreak.Shared.Services.ApplicationArguments.ArgumentHandling; using Microsoft.Extensions.Logging; using Slim; -using System.Collections.Generic; using System.Core.Extensions; using System.Extensions; -using System.Linq; namespace Daybreak.Services.ApplicationArguments; diff --git a/Daybreak/Services/ApplicationArguments/ArgumentHandling/AutoLaunchArgumentHandler.cs b/Daybreak/Services/ApplicationArguments/ArgumentHandling/AutoLaunchArgumentHandler.cs index 3efe8953..2e88aa56 100644 --- a/Daybreak/Services/ApplicationArguments/ArgumentHandling/AutoLaunchArgumentHandler.cs +++ b/Daybreak/Services/ApplicationArguments/ArgumentHandling/AutoLaunchArgumentHandler.cs @@ -3,34 +3,24 @@ using Daybreak.Shared.Services.LaunchConfigurations; using Daybreak.Shared.Services.Navigation; using Daybreak.Views; using Microsoft.Extensions.Logging; -using System; using System.Core.Extensions; using System.Extensions; -using System.Linq; -using System.Threading.Tasks; namespace Daybreak.Services.ApplicationArguments.ArgumentHandling; -internal sealed class AutoLaunchArgumentHandler : IArgumentHandler +internal sealed class AutoLaunchArgumentHandler( + IViewManager viewManager, + ILaunchConfigurationService launchConfigurationService, + ILogger<AutoLaunchArgumentHandler> logger) : IArgumentHandler { private static readonly TimeSpan StartupDelay = TimeSpan.FromSeconds(1); - private readonly IViewManager viewManager; - private readonly ILaunchConfigurationService launchConfigurationService; - private readonly ILogger<AutoLaunchArgumentHandler> logger; + private readonly IViewManager viewManager = viewManager.ThrowIfNull(); + private readonly ILaunchConfigurationService launchConfigurationService = launchConfigurationService.ThrowIfNull(); + private readonly ILogger<AutoLaunchArgumentHandler> logger = logger.ThrowIfNull(); public string Identifier => "-auto-launch"; public int ExpectedArgumentCount => 1; - public AutoLaunchArgumentHandler( - IViewManager viewManager, - ILaunchConfigurationService launchConfigurationService, - ILogger<AutoLaunchArgumentHandler> logger) - { - this.viewManager = viewManager.ThrowIfNull(); - this.launchConfigurationService = launchConfigurationService.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } - public async void HandleArguments(string[] args) { var scopedLogger = this.logger.CreateScopedLogger(nameof(this.HandleArguments), string.Empty); diff --git a/Daybreak/Services/ApplicationLauncher/ApplicationLauncher.cs b/Daybreak/Services/ApplicationLauncher/ApplicationLauncher.cs index da584021..ff97617d 100644 --- a/Daybreak/Services/ApplicationLauncher/ApplicationLauncher.cs +++ b/Daybreak/Services/ApplicationLauncher/ApplicationLauncher.cs @@ -12,8 +12,6 @@ using Daybreak.Shared.Utils; using Daybreak.Views; using Microsoft.Extensions.Logging; using Microsoft.Win32; -using System; -using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Core.Extensions; @@ -21,12 +19,9 @@ using System.Diagnostics; using System.Extensions; using System.Extensions.Core; using System.IO; -using System.Linq; using System.Runtime.InteropServices; using System.Security.Principal; using System.Text; -using System.Threading; -using System.Threading.Tasks; using System.Windows; using static Daybreak.Shared.Utils.NativeMethods; diff --git a/Daybreak/Services/Browser/BrowserExtensionsManager.cs b/Daybreak/Services/Browser/BrowserExtensionsManager.cs index 79f4cb15..dcfded77 100644 --- a/Daybreak/Services/Browser/BrowserExtensionsManager.cs +++ b/Daybreak/Services/Browser/BrowserExtensionsManager.cs @@ -4,20 +4,13 @@ using Slim; using System.Core.Extensions; using System.Extensions; using System.IO; -using System.Linq; -using System.Threading.Tasks; namespace Daybreak.Services.Browser; -public sealed class BrowserExtensionsManager : IBrowserExtensionsManager, IBrowserExtensionsProducer +public sealed class BrowserExtensionsManager( + IServiceManager serviceManager) : IBrowserExtensionsManager, IBrowserExtensionsProducer { - private readonly IServiceManager serviceManager; - - public BrowserExtensionsManager( - IServiceManager serviceManager) - { - this.serviceManager = serviceManager.ThrowIfNull(); - } + private readonly IServiceManager serviceManager = serviceManager.ThrowIfNull(); public void RegisterExtension<T>() where T : class, IBrowserExtension diff --git a/Daybreak/Services/Browser/BrowserHistoryManager.cs b/Daybreak/Services/Browser/BrowserHistoryManager.cs index 37468f32..ed6a0f0e 100644 --- a/Daybreak/Services/Browser/BrowserHistoryManager.cs +++ b/Daybreak/Services/Browser/BrowserHistoryManager.cs @@ -1,11 +1,8 @@ using Daybreak.Controls; using Daybreak.Shared.Models.Browser; using Microsoft.Web.WebView2.Core; -using System; -using System.Collections.Generic; using System.ComponentModel; using System.Core.Extensions; -using System.Linq; namespace Daybreak.Services.Browser; public sealed class BrowserHistoryManager : IBrowserHistoryManager, INotifyPropertyChanged @@ -15,31 +12,29 @@ public sealed class BrowserHistoryManager : IBrowserHistoryManager, INotifyPrope private DateTime lastOperation = DateTime.Now; private string lastUrlCache = string.Empty; - private HashSet<ulong> eventIds = []; + private readonly HashSet<ulong> eventIds = []; private DateTime userInitiatedTime = DateTime.MinValue; private bool userInitiated; - private bool canGoBack; - private bool canGoForward; private ChromiumBrowserWrapper? browserWrapper; public event PropertyChangedEventHandler? PropertyChanged; public bool CanGoBack { - get => this.canGoBack; + get; set { - this.canGoBack = value; + field = value; this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.CanGoBack))); } } public bool CanGoForward { - get => this.canGoForward; + get; set { - this.canGoForward = value; + field = value; this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(this.CanGoForward))); } } diff --git a/Daybreak/Services/BuildTemplates/AttributePointCalculator.cs b/Daybreak/Services/BuildTemplates/AttributePointCalculator.cs index ae10fb16..4770fc97 100644 --- a/Daybreak/Services/BuildTemplates/AttributePointCalculator.cs +++ b/Daybreak/Services/BuildTemplates/AttributePointCalculator.cs @@ -1,8 +1,6 @@ using Daybreak.Shared.Models.Builds; using Daybreak.Shared.Models.Guildwars; using Daybreak.Shared.Services.BuildTemplates; -using System; -using System.Collections.Generic; namespace Daybreak.Services.BuildTemplates; diff --git a/Daybreak/Services/Charts/LiveChartInitializer.cs b/Daybreak/Services/Charts/LiveChartInitializer.cs index 71a2de8c..566ef6c1 100644 --- a/Daybreak/Services/Charts/LiveChartInitializer.cs +++ b/Daybreak/Services/Charts/LiveChartInitializer.cs @@ -3,7 +3,6 @@ using Daybreak.Shared.Models.Trade; using LiveChartsCore; using LiveChartsCore.Kernel; using LiveChartsCore.SkiaSharpView; -using System; using System.Windows.Extensions.Services; namespace Daybreak.Services.Charts; diff --git a/Daybreak/Services/Credentials/CredentialManager.cs b/Daybreak/Services/Credentials/CredentialManager.cs index 4bf23704..e764fe84 100644 --- a/Daybreak/Services/Credentials/CredentialManager.cs +++ b/Daybreak/Services/Credentials/CredentialManager.cs @@ -2,30 +2,21 @@ using Daybreak.Shared.Models; using Daybreak.Shared.Services.Credentials; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Configuration; using System.Extensions; -using System.Linq; using System.Security.Cryptography; using System.Text; using Convert = System.Convert; namespace Daybreak.Services.Credentials; -internal sealed class CredentialManager : ICredentialManager +internal sealed class CredentialManager( + ILogger<CredentialManager> logger, + ILiveUpdateableOptions<CredentialManagerOptions> liveOptions) : ICredentialManager { private static readonly byte[] Entropy = Convert.FromBase64String("uXB8Vmz5MmuDar36v8SRGzpALi0Wv5Gx"); - private readonly ILogger<CredentialManager> logger; - private readonly ILiveUpdateableOptions<CredentialManagerOptions> liveOptions; - - public CredentialManager( - ILogger<CredentialManager> logger, - ILiveUpdateableOptions<CredentialManagerOptions> liveOptions) - { - this.liveOptions = liveOptions.ThrowIfNull(nameof(liveOptions)); - this.logger = logger.ThrowIfNull(nameof(logger)); - } + private readonly ILogger<CredentialManager> logger = logger.ThrowIfNull(nameof(logger)); + private readonly ILiveUpdateableOptions<CredentialManagerOptions> liveOptions = liveOptions.ThrowIfNull(nameof(liveOptions)); public bool TryGetCredentialsByIdentifier(string identifier, out LoginCredentials? loginCredentials) { @@ -59,11 +50,10 @@ internal sealed class CredentialManager : ICredentialManager public void StoreCredentials(List<LoginCredentials> loginCredentials) { this.logger.LogDebug("Storing credentials"); - this.liveOptions.Value.ProtectedLoginCredentials = loginCredentials + this.liveOptions.Value.ProtectedLoginCredentials = [.. loginCredentials .Select(this.ProtectCredentials) .Where(this.CredentialsProtected) - .Select(this.ExtractProtectedCredentials) - .ToList(); + .Select(this.ExtractProtectedCredentials)]; this.liveOptions.UpdateOption(); } diff --git a/Daybreak/Services/DSOAL/Actions/FixSymbolicLinkNotificationHandler.cs b/Daybreak/Services/DSOAL/Actions/FixSymbolicLinkNotificationHandler.cs index 3ee7da37..5aea302c 100644 --- a/Daybreak/Services/DSOAL/Actions/FixSymbolicLinkNotificationHandler.cs +++ b/Daybreak/Services/DSOAL/Actions/FixSymbolicLinkNotificationHandler.cs @@ -6,15 +6,10 @@ using System.Core.Extensions; namespace Daybreak.Services.DSOAL.Actions; -public sealed class FixSymbolicLinkNotificationHandler : INotificationHandler +public sealed class FixSymbolicLinkNotificationHandler( + IPrivilegeManager privilegeManager) : INotificationHandler { - private readonly IPrivilegeManager privilegeManager; - - public FixSymbolicLinkNotificationHandler( - IPrivilegeManager privilegeManager) - { - this.privilegeManager = privilegeManager.ThrowIfNull(); - } + private readonly IPrivilegeManager privilegeManager = privilegeManager.ThrowIfNull(); public void OpenNotification(Notification notification) { diff --git a/Daybreak/Services/DSOAL/Actions/FixSymbolicLinkStartupAction.cs b/Daybreak/Services/DSOAL/Actions/FixSymbolicLinkStartupAction.cs index 2cb183dc..7144e73a 100644 --- a/Daybreak/Services/DSOAL/Actions/FixSymbolicLinkStartupAction.cs +++ b/Daybreak/Services/DSOAL/Actions/FixSymbolicLinkStartupAction.cs @@ -4,32 +4,22 @@ using Daybreak.Shared.Services.Notifications; using Daybreak.Shared.Services.Privilege; using Daybreak.Shared.Services.Registry; using Microsoft.Extensions.Logging; -using System; using System.Core.Extensions; namespace Daybreak.Services.DSOAL.Actions; -public sealed class FixSymbolicLinkStartupAction : StartupActionBase +public sealed class FixSymbolicLinkStartupAction( + INotificationService notificationService, + IPrivilegeManager privilegeManager, + IDSOALService dSOALService, + IRegistryService registryService, + ILogger<FixSymbolicLinkStartupAction> logger) : StartupActionBase { - private readonly INotificationService notificationService; - private readonly IPrivilegeManager privilegeManager; - private readonly IDSOALService dSOALService; - private readonly IRegistryService registryService; - private readonly ILogger<FixSymbolicLinkStartupAction> logger; - - public FixSymbolicLinkStartupAction( - INotificationService notificationService, - IPrivilegeManager privilegeManager, - IDSOALService dSOALService, - IRegistryService registryService, - ILogger<FixSymbolicLinkStartupAction> logger) - { - this.notificationService = notificationService.ThrowIfNull(); - this.privilegeManager = privilegeManager.ThrowIfNull(); - this.dSOALService = dSOALService.ThrowIfNull(); - this.registryService = registryService.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly INotificationService notificationService = notificationService.ThrowIfNull(); + private readonly IPrivilegeManager privilegeManager = privilegeManager.ThrowIfNull(); + private readonly IDSOALService dSOALService = dSOALService.ThrowIfNull(); + private readonly IRegistryService registryService = registryService.ThrowIfNull(); + private readonly ILogger<FixSymbolicLinkStartupAction> logger = logger.ThrowIfNull(); public override void ExecuteOnStartup() { diff --git a/Daybreak/Services/DSOAL/DSOALService.cs b/Daybreak/Services/DSOAL/DSOALService.cs index e2dd668a..78b3638c 100644 --- a/Daybreak/Services/DSOAL/DSOALService.cs +++ b/Daybreak/Services/DSOAL/DSOALService.cs @@ -9,14 +9,10 @@ using Daybreak.Shared.Services.Registry; using Daybreak.Shared.Utils; using Daybreak.Views; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.IO; using System.IO.Compression; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.DSOAL; diff --git a/Daybreak/Services/DXVK/DXVKService.cs b/Daybreak/Services/DXVK/DXVKService.cs index 6c87e71a..926c94f8 100644 --- a/Daybreak/Services/DXVK/DXVKService.cs +++ b/Daybreak/Services/DXVK/DXVKService.cs @@ -5,12 +5,9 @@ using Daybreak.Shared.Services.Downloads; using Daybreak.Shared.Services.Notifications; using Daybreak.Shared.Utils; using Microsoft.Extensions.Logging; -using System.Collections.Generic; using System.Configuration; using System.IO.Compression; using System.IO; -using System.Threading.Tasks; -using System.Threading; using Daybreak.Shared.Services.DXVK; using System.Core.Extensions; using System.Extensions.Core; @@ -18,7 +15,6 @@ using Daybreak.Shared.Models.Github; using System.Net.Http; using System.Extensions; using Version = Daybreak.Shared.Models.Versioning.Version; -using System.Linq; using Daybreak.Shared.Services.SevenZip; using System.Formats.Tar; diff --git a/Daybreak/Services/DirectSong/DirectSongService.cs b/Daybreak/Services/DirectSong/DirectSongService.cs index 013ebcaa..01cfeeb0 100644 --- a/Daybreak/Services/DirectSong/DirectSongService.cs +++ b/Daybreak/Services/DirectSong/DirectSongService.cs @@ -9,14 +9,11 @@ using Daybreak.Shared.Services.SevenZip; using Daybreak.Shared.Utils; using Daybreak.Views; using Microsoft.Extensions.Logging; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Diagnostics; using System.Extensions; using System.IO; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.DirectSong; internal sealed class DirectSongService( diff --git a/Daybreak/Services/DirectSong/Utils/ProgressMonitoringStream.cs b/Daybreak/Services/DirectSong/Utils/ProgressMonitoringStream.cs index 06f75fc6..abd651df 100644 --- a/Daybreak/Services/DirectSong/Utils/ProgressMonitoringStream.cs +++ b/Daybreak/Services/DirectSong/Utils/ProgressMonitoringStream.cs @@ -2,9 +2,9 @@ using System.IO; namespace Daybreak.Services.DirectSong.Utils; -internal sealed class ProgressMonitoringStream : Stream +internal sealed class ProgressMonitoringStream(Stream stream) : Stream { - private readonly Stream stream; + private readonly Stream stream = stream.ThrowIfNull(); public long ReadBytes { get; private set; } public override bool CanRead => this.stream.CanRead; @@ -17,11 +17,6 @@ internal sealed class ProgressMonitoringStream : Stream set => this.stream.Position = value; } - public ProgressMonitoringStream(Stream stream) - { - this.stream = stream.ThrowIfNull(); - } - public override void Flush() { this.stream.Flush(); diff --git a/Daybreak/Services/Downloads/DownloadService.cs b/Daybreak/Services/Downloads/DownloadService.cs index 43da1b61..343a722d 100644 --- a/Daybreak/Services/Downloads/DownloadService.cs +++ b/Daybreak/Services/Downloads/DownloadService.cs @@ -3,46 +3,36 @@ using Daybreak.Shared.Models.Progress; using Daybreak.Shared.Services.Downloads; using Daybreak.Shared.Services.Metrics; using Microsoft.Extensions.Logging; -using System; using System.Core.Extensions; using System.Diagnostics.Metrics; using System.Extensions.Core; using System.IO; using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.Downloads; -internal sealed class DownloadService : IDownloadService +internal sealed class DownloadService( + IMetricsService metricsService, + IHttpClient<DownloadService> httpClient, + ILogger<DownloadService> logger) : IDownloadService { private const double StatusUpdateInterval = 50; private const string MetricUnits = "bytes/sec"; private const string MetricDescription = "Average download speed. Specified in bytes per second"; - private readonly Histogram<double> averageDownloadSpeed; - private readonly IHttpClient<DownloadService> httpClient; - private readonly ILogger<DownloadService> logger; - - public DownloadService( - IMetricsService metricsService, - IHttpClient<DownloadService> httpClient, - ILogger<DownloadService> logger) - { - this.averageDownloadSpeed = metricsService.ThrowIfNull().CreateHistogram<double>(nameof(DownloadService), MetricUnits, MetricDescription, AggregationTypes.NoAggregate); - this.httpClient = httpClient.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly Histogram<double> averageDownloadSpeed = metricsService.ThrowIfNull().CreateHistogram<double>(nameof(DownloadService), MetricUnits, MetricDescription, AggregationTypes.NoAggregate); + private readonly IHttpClient<DownloadService> httpClient = httpClient.ThrowIfNull(); + private readonly ILogger<DownloadService> logger = logger.ThrowIfNull(); public async Task<bool> DownloadFile(string downloadUri, string destinationPath, DownloadStatus downloadStatus, CancellationToken cancellationToken = default) { var scopedLogger = this.logger.CreateScopedLogger(); downloadStatus.CurrentStep = DownloadStatus.InitializingDownload; - using var response = await this.httpClient.GetAsync(downloadUri, HttpCompletionOption.ResponseHeadersRead); + using var response = await this.httpClient.GetAsync(downloadUri, HttpCompletionOption.ResponseHeadersRead, cancellationToken); if (response.IsSuccessStatusCode is false) { downloadStatus.CurrentStep = DownloadStatus.FailedDownload; - scopedLogger.LogError($"Failed to download installer. Status: {response.StatusCode}. Details: {await response.Content.ReadAsStringAsync()}"); + scopedLogger.LogError($"Failed to download installer. Status: {response.StatusCode}. Details: {await response.Content.ReadAsStringAsync(cancellationToken)}"); return false; } @@ -62,7 +52,7 @@ internal sealed class DownloadService : IDownloadService { downloaded += length; downloadedPerTimeframe += length; - await fileStream.WriteAsync(buffer, 0, length, cancellationToken); + await fileStream.WriteAsync(buffer.AsMemory(0, length), cancellationToken); if ((DateTime.Now - tickTime).TotalMilliseconds > StatusUpdateInterval) { tickTime = DateTime.Now; diff --git a/Daybreak/Services/Events/EventNotifierService.cs b/Daybreak/Services/Events/EventNotifierService.cs index b43ed6d5..a8b73e63 100644 --- a/Daybreak/Services/Events/EventNotifierService.cs +++ b/Daybreak/Services/Events/EventNotifierService.cs @@ -5,33 +5,23 @@ using Daybreak.Shared.Models.Guildwars; using Daybreak.Shared.Services.Events; using Daybreak.Shared.Services.Notifications; using Microsoft.Extensions.Logging; -using System; using System.Configuration; using System.Core.Extensions; using System.Globalization; -using System.Threading.Tasks; namespace Daybreak.Services.Events; -internal sealed class EventNotifierService : IEventNotifierService +internal sealed class EventNotifierService( + IEventService eventService, + INotificationService notificationService, + ILiveOptions<EventNotifierOptions> liveOptions, + ILogger<IEventNotifierService> logger) : IEventNotifierService { private readonly TimespanToETAConverter timespanToETAConverter = new(); - private readonly IEventService eventService; - private readonly INotificationService notificationService; - private readonly ILiveOptions<EventNotifierOptions> liveOptions; - private readonly ILogger<IEventNotifierService> logger; - - public EventNotifierService( - IEventService eventService, - INotificationService notificationService, - ILiveOptions<EventNotifierOptions> liveOptions, - ILogger<IEventNotifierService> logger) - { - this.eventService = eventService.ThrowIfNull(); - this.notificationService = notificationService.ThrowIfNull(); - this.liveOptions = liveOptions.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly IEventService eventService = eventService.ThrowIfNull(); + private readonly INotificationService notificationService = notificationService.ThrowIfNull(); + private readonly ILiveOptions<EventNotifierOptions> liveOptions = liveOptions.ThrowIfNull(); + private readonly ILogger<IEventNotifierService> logger = logger.ThrowIfNull(); public void OnClosing() { diff --git a/Daybreak/Services/Events/EventService.cs b/Daybreak/Services/Events/EventService.cs index 68bcb096..5d60dae1 100644 --- a/Daybreak/Services/Events/EventService.cs +++ b/Daybreak/Services/Events/EventService.cs @@ -1,8 +1,5 @@ using Daybreak.Shared.Models.Guildwars; using Daybreak.Shared.Services.Events; -using System; -using System.Collections.Generic; -using System.Linq; namespace Daybreak.Services.Events; internal sealed class EventService : IEventService @@ -11,12 +8,12 @@ internal sealed class EventService : IEventService public ICollection<Event> GetCurrentActiveEvents() { - return GetActiveEventsInternal(DateTime.UtcNow).ToList(); + return [.. GetActiveEventsInternal(DateTime.UtcNow)]; } public ICollection<Event> GetActiveEvents(DateTime dateTime) { - return GetActiveEventsInternal(dateTime).ToList(); + return [.. GetActiveEventsInternal(dateTime)]; } public Event GetUpcomingEvent() diff --git a/Daybreak/Services/ExceptionHandling/ExceptionHandler.cs b/Daybreak/Services/ExceptionHandling/ExceptionHandler.cs index 2206a05a..7f3c2b42 100644 --- a/Daybreak/Services/ExceptionHandling/ExceptionHandler.cs +++ b/Daybreak/Services/ExceptionHandling/ExceptionHandler.cs @@ -4,29 +4,20 @@ using Daybreak.Shared.Exceptions; using Daybreak.Shared.Services.Notifications; using Daybreak.Shared.Utils; using Microsoft.Extensions.Logging; -using System; using System.Core.Extensions; using System.Diagnostics; using System.IO; -using System.Linq; using System.Reflection; using System.Runtime.InteropServices; -using System.Threading.Tasks; namespace Daybreak.Services.ExceptionHandling; -internal sealed class ExceptionHandler : IExceptionHandler +internal sealed class ExceptionHandler( + INotificationService notificationService, + ILogger<ExceptionHandler> logger) : IExceptionHandler { - private readonly INotificationService notificationService; - private readonly ILogger<ExceptionHandler> logger; - - public ExceptionHandler( - INotificationService notificationService, - ILogger<ExceptionHandler> logger) - { - this.notificationService = notificationService.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly INotificationService notificationService = notificationService.ThrowIfNull(); + private readonly ILogger<ExceptionHandler> logger = logger.ThrowIfNull(); public bool HandleException(Exception e) { diff --git a/Daybreak/Services/ExceptionHandling/IExceptionHandler.cs b/Daybreak/Services/ExceptionHandling/IExceptionHandler.cs index 22a3d68d..f6b11876 100644 --- a/Daybreak/Services/ExceptionHandling/IExceptionHandler.cs +++ b/Daybreak/Services/ExceptionHandling/IExceptionHandler.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Services.ExceptionHandling; +namespace Daybreak.Services.ExceptionHandling; public interface IExceptionHandler { diff --git a/Daybreak/Services/ExecutableManagement/GuildWarsExecutableManager.cs b/Daybreak/Services/ExecutableManagement/GuildWarsExecutableManager.cs index 6606fd06..a8ce57b3 100644 --- a/Daybreak/Services/ExecutableManagement/GuildWarsExecutableManager.cs +++ b/Daybreak/Services/ExecutableManagement/GuildWarsExecutableManager.cs @@ -1,34 +1,23 @@ using Daybreak.Configuration.Options; using Daybreak.Shared.Services.ExecutableManagement; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Extensions; using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Extensions.Services; namespace Daybreak.Services.ExecutableManagement; -internal sealed class GuildWarsExecutableManager : IGuildWarsExecutableManager, IApplicationLifetimeService +internal sealed class GuildWarsExecutableManager( + ILiveUpdateableOptions<GuildwarsExecutableOptions> liveUpdateableOptions, + ILogger<GuildWarsExecutableManager> logger) : IGuildWarsExecutableManager, IApplicationLifetimeService { private readonly static TimeSpan ExecutableVerificationLatency = TimeSpan.FromSeconds(5); private readonly static SemaphoreSlim ExecutablesSemaphore = new(1, 1); private readonly CancellationTokenSource cancellationTokenSource = new(); - private readonly ILiveUpdateableOptions<GuildwarsExecutableOptions> liveUpdateableOptions; - private readonly ILogger<GuildWarsExecutableManager> logger; - - public GuildWarsExecutableManager( - ILiveUpdateableOptions<GuildwarsExecutableOptions> liveUpdateableOptions, - ILogger<GuildWarsExecutableManager> logger) - { - this.liveUpdateableOptions = liveUpdateableOptions.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly ILiveUpdateableOptions<GuildwarsExecutableOptions> liveUpdateableOptions = liveUpdateableOptions.ThrowIfNull(); + private readonly ILogger<GuildWarsExecutableManager> logger = logger.ThrowIfNull(); public IEnumerable<string> GetExecutableList() { diff --git a/Daybreak/Services/Experience/ExperienceCalculator.cs b/Daybreak/Services/Experience/ExperienceCalculator.cs index 1491ee36..a044a64e 100644 --- a/Daybreak/Services/Experience/ExperienceCalculator.cs +++ b/Daybreak/Services/Experience/ExperienceCalculator.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Services.Experience; -using System.Collections.Generic; namespace Daybreak.Services.Experience; diff --git a/Daybreak/Services/Graph/GraphClient.cs b/Daybreak/Services/Graph/GraphClient.cs index 626a2eb2..a4e4417e 100644 --- a/Daybreak/Services/Graph/GraphClient.cs +++ b/Daybreak/Services/Graph/GraphClient.cs @@ -8,19 +8,14 @@ using Daybreak.Shared.Services.Navigation; using Daybreak.Views; using Microsoft.Extensions.Logging; using Newtonsoft.Json; -using System; -using System.Collections.Generic; using System.Collections.Specialized; using System.Configuration; using System.Core.Extensions; using System.Extensions; -using System.Linq; using System.Net.Http; using System.Net.Http.Headers; using System.Security.Cryptography; using System.Text; -using System.Threading; -using System.Threading.Tasks; using System.Web; using System.Windows.Controls; using Convert = System.Convert; @@ -320,7 +315,7 @@ internal sealed class GraphClient : IGraphClient var buildList = this.buildsCache ?? []; // Remove the previous version of the build - buildList = buildList.Where(b => b.FileName != buildEntry.Name).ToList(); + buildList = [.. buildList.Where(b => b.FileName != buildEntry.Name)]; // Add new version of the build buildList.Add(buildFile); // Order by name diff --git a/Daybreak/Services/Graph/IGraphClient.cs b/Daybreak/Services/Graph/IGraphClient.cs index b7d0c4ab..8e827f8a 100644 --- a/Daybreak/Services/Graph/IGraphClient.cs +++ b/Daybreak/Services/Graph/IGraphClient.cs @@ -1,10 +1,6 @@ using Daybreak.Controls; using Daybreak.Services.Graph.Models; -using System; -using System.Collections.Generic; using System.Extensions; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Controls; namespace Daybreak.Services.Graph; diff --git a/Daybreak/Services/Graph/Models/AccessToken.cs b/Daybreak/Services/Graph/Models/AccessToken.cs index 668debd3..b3d7ccd2 100644 --- a/Daybreak/Services/Graph/Models/AccessToken.cs +++ b/Daybreak/Services/Graph/Models/AccessToken.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Services.Graph.Models; +namespace Daybreak.Services.Graph.Models; public sealed class AccessToken { diff --git a/Daybreak/Services/Graph/Models/FileItem.cs b/Daybreak/Services/Graph/Models/FileItem.cs index f03d8637..4bf7fe06 100644 --- a/Daybreak/Services/Graph/Models/FileItem.cs +++ b/Daybreak/Services/Graph/Models/FileItem.cs @@ -1,5 +1,4 @@ using Newtonsoft.Json; -using System; namespace Daybreak.Services.Graph.Models; diff --git a/Daybreak/Services/Graph/Models/FolderItem.cs b/Daybreak/Services/Graph/Models/FolderItem.cs index a09508d7..10031b29 100644 --- a/Daybreak/Services/Graph/Models/FolderItem.cs +++ b/Daybreak/Services/Graph/Models/FolderItem.cs @@ -1,5 +1,4 @@ using Newtonsoft.Json; -using System.Collections.Generic; namespace Daybreak.Services.Graph.Models; diff --git a/Daybreak/Services/Graph/Models/ViewRedirectContext.cs b/Daybreak/Services/Graph/Models/ViewRedirectContext.cs index c8d1a631..44060231 100644 --- a/Daybreak/Services/Graph/Models/ViewRedirectContext.cs +++ b/Daybreak/Services/Graph/Models/ViewRedirectContext.cs @@ -1,6 +1,4 @@ -using System; - -namespace Daybreak.Services.Graph.Models; +namespace Daybreak.Services.Graph.Models; public sealed class ViewRedirectContext { diff --git a/Daybreak/Services/Guildwars/GuildWarsBatchUpdateNotificationHandler.cs b/Daybreak/Services/Guildwars/GuildWarsBatchUpdateNotificationHandler.cs index a2b80577..89e734f7 100644 --- a/Daybreak/Services/Guildwars/GuildWarsBatchUpdateNotificationHandler.cs +++ b/Daybreak/Services/Guildwars/GuildWarsBatchUpdateNotificationHandler.cs @@ -9,33 +9,22 @@ using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.Notifications; using Daybreak.Views.Installation; using Microsoft.Extensions.Logging; -using System.Collections.Generic; using System.Core.Extensions; using System.Extensions; -using System.Threading; namespace Daybreak.Services.Guildwars; -internal sealed class GuildWarsBatchUpdateNotificationHandler : INotificationHandler +internal sealed class GuildWarsBatchUpdateNotificationHandler( + IViewManager viewManager, + IGuildWarsInstaller guildWarsInstaller, + IGuildWarsExecutableManager guildWarsExecutableManager, + INotificationService notificationService, + ILogger<GuildWarsBatchUpdateNotificationHandler> logger) : INotificationHandler { - private readonly IViewManager viewManager; - private readonly IGuildWarsInstaller guildWarsInstaller; - private readonly IGuildWarsExecutableManager guildWarsExecutableManager; - private readonly INotificationService notificationService; - private readonly ILogger<GuildWarsBatchUpdateNotificationHandler> logger; - - public GuildWarsBatchUpdateNotificationHandler( - IViewManager viewManager, - IGuildWarsInstaller guildWarsInstaller, - IGuildWarsExecutableManager guildWarsExecutableManager, - INotificationService notificationService, - ILogger<GuildWarsBatchUpdateNotificationHandler> logger) - { - this.viewManager = viewManager.ThrowIfNull(); - this.guildWarsInstaller = guildWarsInstaller.ThrowIfNull(); - this.guildWarsExecutableManager = guildWarsExecutableManager.ThrowIfNull(); - this.notificationService = notificationService.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly IViewManager viewManager = viewManager.ThrowIfNull(); + private readonly IGuildWarsInstaller guildWarsInstaller = guildWarsInstaller.ThrowIfNull(); + private readonly IGuildWarsExecutableManager guildWarsExecutableManager = guildWarsExecutableManager.ThrowIfNull(); + private readonly INotificationService notificationService = notificationService.ThrowIfNull(); + private readonly ILogger<GuildWarsBatchUpdateNotificationHandler> logger = logger.ThrowIfNull(); public async void OpenNotification(Notification notification) { diff --git a/Daybreak/Services/Guildwars/GuildWarsUpdateNotificationHandler.cs b/Daybreak/Services/Guildwars/GuildWarsUpdateNotificationHandler.cs index 2c400e84..7ef77f3b 100644 --- a/Daybreak/Services/Guildwars/GuildWarsUpdateNotificationHandler.cs +++ b/Daybreak/Services/Guildwars/GuildWarsUpdateNotificationHandler.cs @@ -10,27 +10,18 @@ using Microsoft.Extensions.Logging; using System.Core.Extensions; using System.Extensions; using System.IO; -using System.Threading; namespace Daybreak.Services.Guildwars; -internal sealed class GuildWarsUpdateNotificationHandler : INotificationHandler +internal sealed class GuildWarsUpdateNotificationHandler( + IViewManager viewManager, + IGuildWarsInstaller guildWarsInstaller, + INotificationService notificationService, + ILogger<GuildWarsUpdateNotificationHandler> logger) : INotificationHandler { - private readonly IViewManager viewManager; - private readonly IGuildWarsInstaller guildWarsInstaller; - private readonly INotificationService notificationService; - private readonly ILogger<GuildWarsUpdateNotificationHandler> logger; - - public GuildWarsUpdateNotificationHandler( - IViewManager viewManager, - IGuildWarsInstaller guildWarsInstaller, - INotificationService notificationService, - ILogger<GuildWarsUpdateNotificationHandler> logger) - { - this.viewManager = viewManager.ThrowIfNull(); - this.guildWarsInstaller = guildWarsInstaller.ThrowIfNull(); - this.notificationService = notificationService.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly IViewManager viewManager = viewManager.ThrowIfNull(); + private readonly IGuildWarsInstaller guildWarsInstaller = guildWarsInstaller.ThrowIfNull(); + private readonly INotificationService notificationService = notificationService.ThrowIfNull(); + private readonly ILogger<GuildWarsUpdateNotificationHandler> logger = logger.ThrowIfNull(); public async void OpenNotification(Notification notification) { diff --git a/Daybreak/Services/Guildwars/GuildWarsVersionChecker.cs b/Daybreak/Services/Guildwars/GuildWarsVersionChecker.cs index 91d5a613..e2e5dae1 100644 --- a/Daybreak/Services/Guildwars/GuildWarsVersionChecker.cs +++ b/Daybreak/Services/Guildwars/GuildWarsVersionChecker.cs @@ -4,37 +4,25 @@ using Daybreak.Shared.Services.ExecutableManagement; using Daybreak.Shared.Services.Guildwars; using Daybreak.Shared.Services.Notifications; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Core.Extensions; using System.Extensions; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Extensions.Services; namespace Daybreak.Services.GuildWars; -internal sealed class GuildWarsVersionChecker : IGuildWarsVersionChecker, IApplicationLifetimeService +internal sealed class GuildWarsVersionChecker( + IGuildWarsExecutableManager guildWarsExecutableManager, + IGuildWarsInstaller guildWarsInstaller, + INotificationService notificationService, + ILogger<GuildWarsVersionChecker> logger) : IGuildWarsVersionChecker, IApplicationLifetimeService { public string Name => "GuildWars Version Checker"; public bool IsEnabled { get; set; } = true; public bool IsInstalled => true; - private readonly IGuildWarsExecutableManager guildWarsExecutableManager; - private readonly IGuildWarsInstaller guildWarsInstaller; - private readonly INotificationService notificationService; - private readonly ILogger<GuildWarsVersionChecker> logger; - - public GuildWarsVersionChecker( - IGuildWarsExecutableManager guildWarsExecutableManager, - IGuildWarsInstaller guildWarsInstaller, - INotificationService notificationService, - ILogger<GuildWarsVersionChecker> logger) - { - this.guildWarsExecutableManager = guildWarsExecutableManager.ThrowIfNull(); - this.guildWarsInstaller = guildWarsInstaller.ThrowIfNull(); - this.notificationService = notificationService.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly IGuildWarsExecutableManager guildWarsExecutableManager = guildWarsExecutableManager.ThrowIfNull(); + private readonly IGuildWarsInstaller guildWarsInstaller = guildWarsInstaller.ThrowIfNull(); + private readonly INotificationService notificationService = notificationService.ThrowIfNull(); + private readonly ILogger<GuildWarsVersionChecker> logger = logger.ThrowIfNull(); public IEnumerable<string> GetCustomArguments() { diff --git a/Daybreak/Services/Guildwars/GuildwarsCopyService.cs b/Daybreak/Services/Guildwars/GuildwarsCopyService.cs index 8cd043b7..2b17179f 100644 --- a/Daybreak/Services/Guildwars/GuildwarsCopyService.cs +++ b/Daybreak/Services/Guildwars/GuildwarsCopyService.cs @@ -2,36 +2,27 @@ using Daybreak.Shared.Services.ExecutableManagement; using Daybreak.Shared.Services.Guildwars; using Microsoft.Extensions.Logging; -using System; using System.Core.Extensions; using System.IO; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Forms; namespace Daybreak.Services.Guildwars; -internal sealed class GuildWarsCopyService : IGuildWarsCopyService +internal sealed class GuildWarsCopyService( + IGuildWarsExecutableManager guildWarsExecutableManager, + ILogger<GuildWarsCopyService> logger) : IGuildWarsCopyService { private const string ExecutableName = "Gw.exe"; private static readonly string[] FilesToCopy = - { + [ "Gw.dat", "Gw.exe", "GwLoginClient.dll" - }; + ]; - private readonly IGuildWarsExecutableManager guildWarsExecutableManager; - private readonly ILogger<GuildWarsCopyService> logger; - - public GuildWarsCopyService( - IGuildWarsExecutableManager guildWarsExecutableManager, - ILogger<GuildWarsCopyService> logger) - { - this.guildWarsExecutableManager = guildWarsExecutableManager.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly IGuildWarsExecutableManager guildWarsExecutableManager = guildWarsExecutableManager.ThrowIfNull(); + private readonly ILogger<GuildWarsCopyService> logger = logger.ThrowIfNull(); public async Task CopyGuildwars(string existingExecutable, CopyStatus copyStatus, CancellationToken cancellationToken) { diff --git a/Daybreak/Services/Guildwars/IntegratedGuildwarsInstaller.cs b/Daybreak/Services/Guildwars/IntegratedGuildwarsInstaller.cs index b268a016..ad57369d 100644 --- a/Daybreak/Services/Guildwars/IntegratedGuildwarsInstaller.cs +++ b/Daybreak/Services/Guildwars/IntegratedGuildwarsInstaller.cs @@ -8,18 +8,17 @@ using Daybreak.Shared.Services.Guildwars; using Daybreak.Shared.Services.Notifications; using Daybreak.Shared.Utils; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Core.Extensions; using System.Diagnostics; using System.Extensions; using System.IO; using System.Runtime.CompilerServices; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.GuildWars; -internal sealed class IntegratedGuildwarsInstaller : IGuildWarsInstaller +internal sealed class IntegratedGuildwarsInstaller( + IGuildWarsExecutableManager guildWarsExecutableManager, + INotificationService notificationService, + ILogger<IntegratedGuildwarsInstaller> logger) : IGuildWarsInstaller { private const string ExeName = "Gw.exe"; private const string CompressedTempExeName = $"Gw.{VersionPlaceholder}.temp"; @@ -27,19 +26,9 @@ internal sealed class IntegratedGuildwarsInstaller : IGuildWarsInstaller private const string VersionPlaceholder = "[VERSION]"; private static readonly string StagingFolder = PathUtils.GetAbsolutePathFromRoot("GuildWarsCache"); - private readonly IGuildWarsExecutableManager guildWarsExecutableManager; - private readonly INotificationService notificationService; - private readonly ILogger<IntegratedGuildwarsInstaller> logger; - - public IntegratedGuildwarsInstaller( - IGuildWarsExecutableManager guildWarsExecutableManager, - INotificationService notificationService, - ILogger<IntegratedGuildwarsInstaller> logger) - { - this.guildWarsExecutableManager = guildWarsExecutableManager.ThrowIfNull(); - this.notificationService = notificationService.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly IGuildWarsExecutableManager guildWarsExecutableManager = guildWarsExecutableManager.ThrowIfNull(); + private readonly INotificationService notificationService = notificationService.ThrowIfNull(); + private readonly ILogger<IntegratedGuildwarsInstaller> logger = logger.ThrowIfNull(); public async IAsyncEnumerable<GuildWarsUpdateResponse> CheckAndUpdateGuildWarsExecutables(List<GuildWarsUpdateRequest> requests, [EnumeratorCancellation]CancellationToken cancellationToken) { @@ -109,8 +98,7 @@ internal sealed class IntegratedGuildwarsInstaller : IGuildWarsInstaller public async Task<int?> GetLatestVersionId(CancellationToken cancellationToken) { - var guildWarsClient = new GuildWarsClient(); - var response = await guildWarsClient.Connect(cancellationToken); + var response = await GuildWarsClient.Connect(cancellationToken); return response?.Item2.LatestExe; } @@ -154,7 +142,7 @@ internal sealed class IntegratedGuildwarsInstaller : IGuildWarsInstaller { // Initialize the download client var guildWarsClient = new GuildWarsClient(); - var result = await guildWarsClient.Connect(cancellationToken); + var result = await GuildWarsClient.Connect(cancellationToken); if (!result.HasValue) { scopedLogger.LogError("Failed to connect to ArenaNet servers"); diff --git a/Daybreak/Services/Guildwars/Models/GuildWarsDownloadContext.cs b/Daybreak/Services/Guildwars/Models/GuildWarsDownloadContext.cs index e1e986d1..b9e52d51 100644 --- a/Daybreak/Services/Guildwars/Models/GuildWarsDownloadContext.cs +++ b/Daybreak/Services/Guildwars/Models/GuildWarsDownloadContext.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Progress; -using System.Threading; namespace Daybreak.Services.Guildwars.Models; internal sealed class GuildWarsDownloadContext diff --git a/Daybreak/Services/Guildwars/Models/GuildwarsClientContext.cs b/Daybreak/Services/Guildwars/Models/GuildwarsClientContext.cs index 55ce3ae9..2a7cfea1 100644 --- a/Daybreak/Services/Guildwars/Models/GuildwarsClientContext.cs +++ b/Daybreak/Services/Guildwars/Models/GuildwarsClientContext.cs @@ -1,5 +1,4 @@ -using System; -using System.Net.Sockets; +using System.Net.Sockets; namespace Daybreak.Services.Guildwars.Models; internal readonly struct GuildWarsClientContext : IDisposable diff --git a/Daybreak/Services/Guildwars/Utils/BitStream.cs b/Daybreak/Services/Guildwars/Utils/BitStream.cs index 054826dd..4d6d01b6 100644 --- a/Daybreak/Services/Guildwars/Utils/BitStream.cs +++ b/Daybreak/Services/Guildwars/Utils/BitStream.cs @@ -1,5 +1,4 @@ -using System; -using System.Core.Extensions; +using System.Core.Extensions; using System.IO; namespace Daybreak.Services.Guildwars.Utils; diff --git a/Daybreak/Services/Guildwars/Utils/GuildWarsExecutableParser.cs b/Daybreak/Services/Guildwars/Utils/GuildWarsExecutableParser.cs index 22a2b928..8fedd61a 100644 --- a/Daybreak/Services/Guildwars/Utils/GuildWarsExecutableParser.cs +++ b/Daybreak/Services/Guildwars/Utils/GuildWarsExecutableParser.cs @@ -1,9 +1,5 @@ using PeNet; using PeNet.Header.Pe; -using System; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.Guildwars.Utils; /// <summary> diff --git a/Daybreak/Services/Guildwars/Utils/GuildwarsClient.cs b/Daybreak/Services/Guildwars/Utils/GuildwarsClient.cs index 33361ff4..438bd1bb 100644 --- a/Daybreak/Services/Guildwars/Utils/GuildwarsClient.cs +++ b/Daybreak/Services/Guildwars/Utils/GuildwarsClient.cs @@ -1,15 +1,12 @@ using Daybreak.Services.Guildwars.Models; using Daybreak.Services.GuildWars.Utils; -using System; using System.Net.Sockets; using System.Runtime.InteropServices; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.Guildwars.Utils; internal sealed class GuildWarsClient { - public async Task<(GuildWarsClientContext, ManifestResponse)?> Connect(CancellationToken cancellationToken) + public static async Task<(GuildWarsClientContext, ManifestResponse)?> Connect(CancellationToken cancellationToken) { for(var i = 1; i < 13; i++) { @@ -34,8 +31,8 @@ internal sealed class GuildWarsClient Field7 = 0 }; - await this.Send(handshakeRequest, context, cancellationToken); - var manifest = await this.ReceiveWait<ManifestResponse>(context, cancellationToken); + await Send(handshakeRequest, context, cancellationToken); + var manifest = await ReceiveWait<ManifestResponse>(context, cancellationToken); return (context, manifest); } catch @@ -47,10 +44,10 @@ internal sealed class GuildWarsClient return default; } - public async Task<FileResponse> GetFileResponse(GuildWarsClientContext guildwarsClientContext, int fileId, int version = 0, CancellationToken cancellationToken = default) + public static async Task<FileResponse> GetFileResponse(GuildWarsClientContext guildwarsClientContext, int fileId, int version = 0, CancellationToken cancellationToken = default) { - await this.Send(new FileRequest { Field1 = 0x3F2, Field2 = 0xC, FileId = fileId, Version = version }, guildwarsClientContext, cancellationToken); - var metadata = await this.ReceiveWait<FileMetadataResponse>(guildwarsClientContext, cancellationToken); + await Send(new FileRequest { Field1 = 0x3F2, Field2 = 0xC, FileId = fileId, Version = version }, guildwarsClientContext, cancellationToken); + var metadata = await ReceiveWait<FileMetadataResponse>(guildwarsClientContext, cancellationToken); if (metadata.Field1 == 0x4F2) { // Could not find file @@ -62,17 +59,17 @@ internal sealed class GuildWarsClient return default; } - var response = await this.ReceiveWait<FileResponse>(guildwarsClientContext, cancellationToken); + var response = await ReceiveWait<FileResponse>(guildwarsClientContext, cancellationToken); return response; } public async Task<GuildwarsFileStream?> GetFileStream(GuildWarsClientContext guildwarsClientContext, int fileId, int version = 0, CancellationToken cancellationToken = default) { - var response = await this.GetFileResponse(guildwarsClientContext, fileId, version, cancellationToken); + var response = await GetFileResponse(guildwarsClientContext, fileId, version, cancellationToken); return new GuildwarsFileStream(guildwarsClientContext, this, response.FileId, response.SizeCompressed, response.SizeDecompressed, response.Crc); } - public async Task<T> ReceiveWait<T>(GuildWarsClientContext context, CancellationToken cancellationToken) + public static async Task<T> ReceiveWait<T>(GuildWarsClientContext context, CancellationToken cancellationToken) where T : struct { var size = Marshal.SizeOf<T>(); @@ -96,7 +93,7 @@ internal sealed class GuildWarsClient return str; } - public async Task Send<T>(T str, GuildWarsClientContext context, CancellationToken cancellationToken) + public static async Task Send<T>(T str, GuildWarsClientContext context, CancellationToken cancellationToken) where T : struct { var size = Marshal.SizeOf<T>(); diff --git a/Daybreak/Services/Guildwars/Utils/GuildwarsFileStream.cs b/Daybreak/Services/Guildwars/Utils/GuildwarsFileStream.cs index 465fc672..6d6a006b 100644 --- a/Daybreak/Services/Guildwars/Utils/GuildwarsFileStream.cs +++ b/Daybreak/Services/Guildwars/Utils/GuildwarsFileStream.cs @@ -1,25 +1,25 @@ using Daybreak.Services.Guildwars.Models; using Daybreak.Services.Guildwars.Utils; -using System; +using System.ComponentModel.DataAnnotations; using System.Core.Extensions; using System.IO; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.GuildWars.Utils; -internal sealed class GuildwarsFileStream : Stream +internal sealed class GuildwarsFileStream(GuildWarsClientContext guildwarsClientContext, GuildWarsClient guildwarsClient, int fileId, int sizeCompressed, int sizeDecompressed, int crc) : Stream { - private readonly GuildWarsClient guildwarsClient; - private readonly GuildWarsClientContext guildwarsClientContext; + private readonly GuildWarsClient guildwarsClient = guildwarsClient.ThrowIfNull(); + private readonly GuildWarsClientContext guildwarsClientContext = guildwarsClientContext; - private byte[]? chunkBuffer; + private readonly Memory<byte> downloadBuffer = new(new byte[4096]); + + private Memory<byte>? chunkBuffer; private int positionInBuffer = 0; private int chunkSize = 0; - public int FileId { get; init; } - public int SizeCompressed { get; init; } - public int SizeDecompressed { get; init; } - public int Crc { get; init; } + public int FileId { get; init; } = fileId; + public int SizeCompressed { get; init; } = sizeCompressed; + public int SizeDecompressed { get; init; } = sizeDecompressed; + public int Crc { get; init; } = crc; public override bool CanRead => true; public override bool CanSeek => false; @@ -27,22 +27,12 @@ internal sealed class GuildwarsFileStream : Stream public override long Length => this.SizeCompressed; public override long Position { get; set; } - public GuildwarsFileStream(GuildWarsClientContext guildwarsClientContext, GuildWarsClient guildwarsClient, int fileId, int sizeCompressed, int sizeDecompressed, int crc) - { - this.guildwarsClient = guildwarsClient.ThrowIfNull(); - this.guildwarsClientContext = guildwarsClientContext; - this.FileId = fileId; - this.SizeCompressed = sizeCompressed; - this.SizeDecompressed = sizeDecompressed; - this.Crc = crc; - } - public override void Flush() { throw new System.NotImplementedException(); } - public override async Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + public override async ValueTask<int> ReadAsync(Memory<byte> buffer, CancellationToken cancellationToken = default) { if (this.Position >= this.Length) { @@ -51,7 +41,7 @@ internal sealed class GuildwarsFileStream : Stream if (this.positionInBuffer < this.chunkSize) { - var read = this.ReadCurrentChunkBytes(buffer, offset, count); + var read = this.ReadCurrentChunkBytes(buffer); this.Position += read; return read; } @@ -59,10 +49,10 @@ internal sealed class GuildwarsFileStream : Stream // If we have already requested a previous chunk, we need to request more data if (this.chunkSize > 0) { - await this.guildwarsClient.Send(new FileRequestNextChunk { Field1 = 0x7F3, Field2 = 0x8, Field3 = (uint)this.chunkSize }, this.guildwarsClientContext, cancellationToken); + await GuildWarsClient.Send(new FileRequestNextChunk { Field1 = 0x7F3, Field2 = 0x8, Field3 = (uint)this.chunkSize }, this.guildwarsClientContext, cancellationToken); } - var meta = await this.guildwarsClient.ReceiveWait<FileMetadataResponse>(this.guildwarsClientContext, cancellationToken); + var meta = await GuildWarsClient.ReceiveWait<FileMetadataResponse>(this.guildwarsClientContext, cancellationToken); if (meta.Field1 != 0x6F2 && meta.Field1 != 0x6F3) { throw new InvalidOperationException($"Unknown header in response {meta.Field1:X4}"); @@ -70,28 +60,30 @@ internal sealed class GuildwarsFileStream : Stream this.chunkSize = meta.Field2 - 4; if (this.chunkBuffer is null || - this.chunkBuffer.Length != this.chunkSize) + this.chunkBuffer.Value.Length != this.chunkSize) { - this.chunkBuffer = new byte[this.chunkSize]; + this.chunkBuffer = new Memory<byte>(new byte[this.chunkSize]); } var downloadedChunkSize = 0; do { - var buf = new byte[Math.Min(4096, this.chunkSize - downloadedChunkSize)]; - var readTask = this.guildwarsClientContext.Socket.ReceiveAsync(buf, cancellationToken).AsTask(); + var remainingBytes = this.chunkSize - downloadedChunkSize; + var receiveBuffer = this.downloadBuffer[..Math.Min(this.downloadBuffer.Length, remainingBytes)]; + + var readTask = this.guildwarsClientContext.Socket.ReceiveAsync(receiveBuffer, cancellationToken).AsTask(); if (await Task.WhenAny(readTask, Task.Delay(5000, cancellationToken)) != readTask) { throw new TaskCanceledException("Timed out waiting for download"); } var read = await readTask; - Array.Copy(buf, 0, this.chunkBuffer, downloadedChunkSize, read); + receiveBuffer[..read].CopyTo(this.chunkBuffer.Value[downloadedChunkSize..]); downloadedChunkSize += read; } while (downloadedChunkSize < this.chunkSize); this.positionInBuffer = 0; - var chunkRead = this.ReadCurrentChunkBytes(buffer, offset, count); + var chunkRead = this.ReadCurrentChunkBytes(buffer); this.Position += chunkRead; return chunkRead; } @@ -116,15 +108,15 @@ internal sealed class GuildwarsFileStream : Stream throw new System.NotImplementedException(); } - private int ReadCurrentChunkBytes(byte[] buffer, int offset, int count) + private int ReadCurrentChunkBytes(Memory<byte> buffer) { if (this.chunkBuffer is null) { throw new InvalidOperationException("No chunk buffer ready"); } - var bytesToRead = Math.Min(count, this.chunkSize - this.positionInBuffer); - Array.Copy(this.chunkBuffer, this.positionInBuffer, buffer, offset, bytesToRead); + var bytesToRead = Math.Min(buffer.Length, this.chunkSize - this.positionInBuffer); + this.chunkBuffer.Value.Slice(this.positionInBuffer, bytesToRead).CopyTo(buffer); this.positionInBuffer += bytesToRead; return bytesToRead; } diff --git a/Daybreak/Services/Guildwars/Utils/HuffmanTable.cs b/Daybreak/Services/Guildwars/Utils/HuffmanTable.cs index 5d1013a0..d763e923 100644 --- a/Daybreak/Services/Guildwars/Utils/HuffmanTable.cs +++ b/Daybreak/Services/Guildwars/Utils/HuffmanTable.cs @@ -1,7 +1,4 @@ using Daybreak.Services.Guildwars.Utils; -using System; -using System.Collections.Generic; -using System.Linq; namespace Daybreak.Services.GuildWars.Utils; @@ -159,6 +156,7 @@ internal sealed class HuffmanTable { throw new InvalidOperationException("Failed to build Huffman Table. currentSymbol >= symbolCount"); } + if (nextBitsEncoding >= (1 << encLen)) { throw new InvalidOperationException("Failed to build Huffman Table. nextBitsEncoding >= (1 << encLen)"); diff --git a/Daybreak/Services/IconRetrieve/IconCache.cs b/Daybreak/Services/IconRetrieve/IconCache.cs index 7c4d13af..6ef30a2f 100644 --- a/Daybreak/Services/IconRetrieve/IconCache.cs +++ b/Daybreak/Services/IconRetrieve/IconCache.cs @@ -4,14 +4,11 @@ using Daybreak.Shared.Services.IconRetrieve; using Daybreak.Shared.Utils; using HtmlAgilityPack; using Microsoft.Extensions.Logging; -using System; using System.Configuration; using System.Core.Extensions; using System.Extensions; using System.IO; using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.IconRetrieve; @@ -178,7 +175,7 @@ internal sealed class IconCache : IIconCache foreach (var imgElement in imgElements) { if (imgElement.GetAttributeValue<string>("src", string.Empty) is string src && - src.ToLower().Contains(curedName.ToLower()) && + src.Contains(curedName, StringComparison.CurrentCultureIgnoreCase) && (Uri.TryCreate(src, UriKind.Absolute, out var iconUri) || Uri.TryCreate(new Uri(WikiUrl), src, out iconUri))) { diff --git a/Daybreak/Services/Images/ImageCache.cs b/Daybreak/Services/Images/ImageCache.cs index 09e234c2..e36dce62 100644 --- a/Daybreak/Services/Images/ImageCache.cs +++ b/Daybreak/Services/Images/ImageCache.cs @@ -4,9 +4,7 @@ using Daybreak.Shared.Models.Metrics; using Daybreak.Shared.Services.Images; using Daybreak.Shared.Services.Metrics; using Microsoft.Extensions.Logging; -using System; using System.Collections.Concurrent; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Diagnostics; @@ -16,8 +14,6 @@ using System.Drawing.Imaging; using System.Extensions; using System.IO; using System.Logging; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Media; using System.Windows.Media.Imaging; diff --git a/Daybreak/Services/Injection/ProcessInjector.cs b/Daybreak/Services/Injection/ProcessInjector.cs index a20de844..9eb9171e 100644 --- a/Daybreak/Services/Injection/ProcessInjector.cs +++ b/Daybreak/Services/Injection/ProcessInjector.cs @@ -1,26 +1,18 @@ using Daybreak.Shared.Services.Injection; using Daybreak.Shared.Utils; using Microsoft.Extensions.Logging; -using System; using System.Core.Extensions; using System.Diagnostics; using System.Extensions; using System.IO; using System.Runtime.InteropServices; using System.Text; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.Injection; -internal sealed class ProcessInjector : IProcessInjector +internal sealed class ProcessInjector( + ILogger<ProcessInjector> logger) : IProcessInjector { - private readonly ILogger<ProcessInjector> logger; - - public ProcessInjector( - ILogger<ProcessInjector> logger) - { - this.logger = logger.ThrowIfNull(); - } + private readonly ILogger<ProcessInjector> logger = logger.ThrowIfNull(); public Task<bool> Inject(Process process, string pathToDll, CancellationToken cancellationToken) { diff --git a/Daybreak/Services/Injection/StubInjector.cs b/Daybreak/Services/Injection/StubInjector.cs index 66b1d128..69e79bbe 100644 --- a/Daybreak/Services/Injection/StubInjector.cs +++ b/Daybreak/Services/Injection/StubInjector.cs @@ -2,7 +2,6 @@ using Daybreak.Shared.Utils; using Microsoft.Extensions.Logging; using Reloaded.Assembler; -using System; using System.Core.Extensions; using System.Diagnostics; using System.Extensions.Core; diff --git a/Daybreak/Services/InternetChecker/ConnectivityStatus.cs b/Daybreak/Services/InternetChecker/ConnectivityStatus.cs index da964604..36891874 100644 --- a/Daybreak/Services/InternetChecker/ConnectivityStatus.cs +++ b/Daybreak/Services/InternetChecker/ConnectivityStatus.cs @@ -2,32 +2,23 @@ using Daybreak.Shared.Models.Notifications; using Daybreak.Shared.Services.InternetChecker; using Daybreak.Shared.Services.Notifications; -using System; using System.Core.Extensions; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Extensions.Services; namespace Daybreak.Services.InternetChecker; -internal sealed class ConnectivityStatus : IConnectivityStatus, IApplicationLifetimeService +internal sealed class ConnectivityStatus( + IInternetCheckingService internetCheckingService, + INotificationService notificationService) : IConnectivityStatus, IApplicationLifetimeService { private static readonly TimeSpan ConnectivityBackoff = TimeSpan.FromSeconds(30); private readonly CancellationTokenSource cancellationTokenSource = new(); - private readonly IInternetCheckingService internetCheckingService; - private readonly INotificationService notificationService; + private readonly IInternetCheckingService internetCheckingService = internetCheckingService.ThrowIfNull(); + private readonly INotificationService notificationService = notificationService.ThrowIfNull(); public bool IsInternetAvailable { get; private set; } = false; - public ConnectivityStatus( - IInternetCheckingService internetCheckingService, - INotificationService notificationService) - { - this.internetCheckingService = internetCheckingService.ThrowIfNull(); - this.notificationService = notificationService.ThrowIfNull(); - } - public async void OnStartup() { var checkingConnectionNotification = this.notificationService.NotifyInformation( @@ -45,20 +36,12 @@ internal sealed class ConnectivityStatus : IConnectivityStatus, IApplicationLife checkingConnectionNotification.Cancel(); } - switch (connectionStatus) + this.IsInternetAvailable = connectionStatus switch { - case InternetConnectionState.Available: - case InternetConnectionState.PartialOutage: - this.IsInternetAvailable = true; - break; - case InternetConnectionState.GuildwarsOutage: - case InternetConnectionState.Unavailable: - this.IsInternetAvailable = false; - break; - case InternetConnectionState.Undefined: - default: - throw new InvalidOperationException($"Unexpected connection status {connectionStatus}"); - } + InternetConnectionState.Available or InternetConnectionState.PartialOutage => true, + InternetConnectionState.GuildwarsOutage or InternetConnectionState.Unavailable => false, + _ => throw new InvalidOperationException($"Unexpected connection status {connectionStatus}"), + }; // Only show Connection Restored message when a previous internet unavailable notification has been shown if (connectionStatus is InternetConnectionState.PartialOutage or InternetConnectionState.Available && diff --git a/Daybreak/Services/InternetChecker/InternetCheckingService.cs b/Daybreak/Services/InternetChecker/InternetCheckingService.cs index 9890fea1..6c2341d6 100644 --- a/Daybreak/Services/InternetChecker/InternetCheckingService.cs +++ b/Daybreak/Services/InternetChecker/InternetCheckingService.cs @@ -9,8 +9,6 @@ using System.Diagnostics.Metrics; using System.Extensions; using System.Net.Http; using System.Net.NetworkInformation; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.InternetChecker; diff --git a/Daybreak/Services/LaunchConfigurations/LaunchConfigurationService.cs b/Daybreak/Services/LaunchConfigurations/LaunchConfigurationService.cs index cf90b035..a41b6e5d 100644 --- a/Daybreak/Services/LaunchConfigurations/LaunchConfigurationService.cs +++ b/Daybreak/Services/LaunchConfigurations/LaunchConfigurationService.cs @@ -3,29 +3,19 @@ using Daybreak.Shared.Models.LaunchConfigurations; using Daybreak.Shared.Services.Credentials; using Daybreak.Shared.Services.ExecutableManagement; using Daybreak.Shared.Services.LaunchConfigurations; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Extensions; -using System.Linq; namespace Daybreak.Services.LaunchConfigurations; -internal sealed class LaunchConfigurationService : ILaunchConfigurationService +internal sealed class LaunchConfigurationService( + ICredentialManager credentialManager, + IGuildWarsExecutableManager guildWarsExecutableManager, + ILiveUpdateableOptions<LaunchConfigurationServiceOptions> liveUpdateableOptions) : ILaunchConfigurationService { - private readonly ICredentialManager credentialManager; - private readonly IGuildWarsExecutableManager guildWarsExecutableManager; - private readonly ILiveUpdateableOptions<LaunchConfigurationServiceOptions> liveUpdateableOptions; - - public LaunchConfigurationService( - ICredentialManager credentialManager, - IGuildWarsExecutableManager guildWarsExecutableManager, - ILiveUpdateableOptions<LaunchConfigurationServiceOptions> liveUpdateableOptions) - { - this.credentialManager = credentialManager.ThrowIfNull(); - this.guildWarsExecutableManager = guildWarsExecutableManager.ThrowIfNull(); - this.liveUpdateableOptions = liveUpdateableOptions.ThrowIfNull(); - } + private readonly ICredentialManager credentialManager = credentialManager.ThrowIfNull(); + private readonly IGuildWarsExecutableManager guildWarsExecutableManager = guildWarsExecutableManager.ThrowIfNull(); + private readonly ILiveUpdateableOptions<LaunchConfigurationServiceOptions> liveUpdateableOptions = liveUpdateableOptions.ThrowIfNull(); public IEnumerable<LaunchConfigurationWithCredentials> GetLaunchConfigurations() { @@ -96,13 +86,7 @@ internal sealed class LaunchConfigurationService : ILaunchConfigurationService var configs = this.liveUpdateableOptions.Value.LaunchConfigurations; var maybeConfig = configs .FirstOrDefault(l => l.CredentialsIdentifier == launchConfigurationWithCredentials.Credentials?.Identifier && - l.Executable == launchConfigurationWithCredentials.ExecutablePath); - - if (maybeConfig is null) - { - throw new InvalidOperationException("Provided launch configuration is not part of the known list of launch configurations"); - } - + l.Executable == launchConfigurationWithCredentials.ExecutablePath) ?? throw new InvalidOperationException("Provided launch configuration is not part of the known list of launch configurations"); configs.Remove(maybeConfig); configs.Add(maybeConfig); this.liveUpdateableOptions.Value.LaunchConfigurations = configs; diff --git a/Daybreak/Services/Logging/CompositeLogsWritter.cs b/Daybreak/Services/Logging/CompositeLogsWritter.cs index 2fc4b57d..0ffd5a70 100644 --- a/Daybreak/Services/Logging/CompositeLogsWritter.cs +++ b/Daybreak/Services/Logging/CompositeLogsWritter.cs @@ -1,16 +1,10 @@ -using System.Collections.Generic; -using System.Logging; +using System.Logging; namespace Daybreak.Services.Logging; -internal sealed class CompositeLogsWriter : ILogsWriter +internal sealed class CompositeLogsWriter(params ILogsWriter[] innerLogsWriters) : ILogsWriter { - private readonly IEnumerable<ILogsWriter> logsWriters; - - public CompositeLogsWriter(params ILogsWriter[] innerLogsWriters) - { - this.logsWriters = innerLogsWriters; - } + private readonly IEnumerable<ILogsWriter> logsWriters = innerLogsWriters; public void WriteLog(Log log) { diff --git a/Daybreak/Services/Logging/ConsoleLogsWriter.cs b/Daybreak/Services/Logging/ConsoleLogsWriter.cs index 89dfc752..0c4596bc 100644 --- a/Daybreak/Services/Logging/ConsoleLogsWriter.cs +++ b/Daybreak/Services/Logging/ConsoleLogsWriter.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Services.Logging; using Microsoft.Extensions.Logging; -using System; using System.Logging; namespace Daybreak.Services.Logging; diff --git a/Daybreak/Services/Logging/JsonLogsManager.cs b/Daybreak/Services/Logging/JsonLogsManager.cs index cd663b08..942d13ce 100644 --- a/Daybreak/Services/Logging/JsonLogsManager.cs +++ b/Daybreak/Services/Logging/JsonLogsManager.cs @@ -1,8 +1,5 @@ using Daybreak.Shared.Services.Logging; using Daybreak.Shared.Utils; -using System; -using System.Collections.Generic; -using System.Linq; using System.Linq.Expressions; namespace Daybreak.Services.Logging; diff --git a/Daybreak/Services/MDns/MDomainRegistrar.cs b/Daybreak/Services/MDns/MDomainRegistrar.cs index e09beb47..94a76889 100644 --- a/Daybreak/Services/MDns/MDomainRegistrar.cs +++ b/Daybreak/Services/MDns/MDomainRegistrar.cs @@ -1,13 +1,8 @@ using Daybreak.Shared.Services.MDns; using MeaMod.DNS.Model; using MeaMod.DNS.Multicast; -using System; using System.Collections.Concurrent; -using System.Collections.Generic; using System.Net; -using System.Threading.Tasks; -using System.Threading; -using System.Linq; using System.Windows.Extensions.Services; using Microsoft.Extensions.Logging; using System.Core.Extensions; diff --git a/Daybreak/Services/MDns/ServiceRegistration.cs b/Daybreak/Services/MDns/ServiceRegistration.cs index a9c48f05..cf848781 100644 --- a/Daybreak/Services/MDns/ServiceRegistration.cs +++ b/Daybreak/Services/MDns/ServiceRegistration.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; - -namespace Daybreak.Services.MDns; +namespace Daybreak.Services.MDns; internal sealed class ServiceRegistration { public required string Name { get; init; } diff --git a/Daybreak/Services/Menu/MenuService.cs b/Daybreak/Services/Menu/MenuService.cs index 7fa3215b..dc94ae4c 100644 --- a/Daybreak/Services/Menu/MenuService.cs +++ b/Daybreak/Services/Menu/MenuService.cs @@ -1,8 +1,6 @@ using Daybreak.Shared.Models.Menu; using Daybreak.Shared.Services.Menu; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Core.Extensions; namespace Daybreak.Services.Menu; diff --git a/Daybreak/Services/Metrics/MetricsService.cs b/Daybreak/Services/Metrics/MetricsService.cs index 327b923c..57f545ad 100644 --- a/Daybreak/Services/Metrics/MetricsService.cs +++ b/Daybreak/Services/Metrics/MetricsService.cs @@ -1,11 +1,8 @@ using Daybreak.Shared.Models.Metrics; using Daybreak.Shared.Services.Metrics; -using System; using System.Collections.Concurrent; -using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics.Metrics; -using System.Threading; namespace Daybreak.Services.Metrics; @@ -85,15 +82,10 @@ internal sealed class MetricsService : IMetricsService, IDisposable throw new InvalidOperationException($"Could not find any metrics with name {name}"); } - var instrument = metrics.First?.Value.Instrument; - if (instrument is null) - { - throw new InvalidOperationException($"Could not identify the instrument producing the desired metrics with name {name}"); - } - + var instrument = (metrics.First?.Value.Instrument) ?? throw new InvalidOperationException($"Could not identify the instrument producing the desired metrics with name {name}"); this.aggregationTypeMapping.TryGetValue(instrument!, out var aggregationType); - return new MetricSet { Instrument = instrument, Metrics = metrics.ToImmutableList(), AggregationType = aggregationType }; + return new MetricSet { Instrument = instrument, Metrics = [.. metrics], AggregationType = aggregationType }; } public IEnumerable<MetricSet> GetMetrics() @@ -108,7 +100,7 @@ internal sealed class MetricsService : IMetricsService, IDisposable var instrument = value.First.Value.Instrument; this.aggregationTypeMapping.TryGetValue(instrument, out var aggregationType); - retList.Add(new MetricSet { Instrument = instrument, Metrics = value.ToImmutableList(), AggregationType = aggregationType }); + retList.Add(new MetricSet { Instrument = instrument, Metrics = [.. value], AggregationType = aggregationType }); } return retList; diff --git a/Daybreak/Services/Mods/ModsManager.cs b/Daybreak/Services/Mods/ModsManager.cs index fefa8b88..0b24d064 100644 --- a/Daybreak/Services/Mods/ModsManager.cs +++ b/Daybreak/Services/Mods/ModsManager.cs @@ -1,23 +1,16 @@ using Daybreak.Shared.Services.Mods; using Microsoft.Extensions.Logging; using Slim; -using System.Collections.Generic; using System.Core.Extensions; namespace Daybreak.Services.Mods; -internal sealed class ModsManager : IModsManager +internal sealed class ModsManager( + IServiceManager serviceManager, + ILogger<ModsManager> logger) : IModsManager { - private readonly IServiceManager serviceManager; - private readonly ILogger<IModsManager> logger; - - public ModsManager( - IServiceManager serviceManager, - ILogger<ModsManager> logger) - { - this.serviceManager = serviceManager.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly IServiceManager serviceManager = serviceManager.ThrowIfNull(); + private readonly ILogger<IModsManager> logger = logger.ThrowIfNull(); public IEnumerable<IModService> GetMods() { diff --git a/Daybreak/Services/Monitoring/DiskUsageMonitor.cs b/Daybreak/Services/Monitoring/DiskUsageMonitor.cs index d1d3bb49..488193af 100644 --- a/Daybreak/Services/Monitoring/DiskUsageMonitor.cs +++ b/Daybreak/Services/Monitoring/DiskUsageMonitor.cs @@ -1,16 +1,15 @@ using System.Diagnostics.Metrics; using System.Diagnostics; -using System.Threading.Tasks; using System.Windows.Extensions.Services; using System.Core.Extensions; using System.Extensions; -using System.Threading; using Daybreak.Shared.Services.Metrics; using Daybreak.Shared.Models.Metrics; namespace Daybreak.Services.Monitoring; -internal sealed class DiskUsageMonitor : IApplicationLifetimeService +internal sealed class DiskUsageMonitor( + IMetricsService metricsService) : IApplicationLifetimeService { private const string WriteDiskUsage = "Write Disk Usage"; private const string WriteDiskUsageUnit = "MBs/s"; @@ -19,20 +18,13 @@ internal sealed class DiskUsageMonitor : IApplicationLifetimeService private const string ReadDiskUsageUnit = "MBs/s"; private const string ReadDiskUsageDescription = "MBs/s read by Daybreak"; - private readonly Histogram<double> writeDiskUsageHistogram; - private readonly Histogram<double> readDiskUsageHistogram; + private readonly Histogram<double> writeDiskUsageHistogram = metricsService.ThrowIfNull().CreateHistogram<double>(WriteDiskUsage, WriteDiskUsageUnit, WriteDiskUsageDescription, AggregationTypes.NoAggregate); + private readonly Histogram<double> readDiskUsageHistogram = metricsService.ThrowIfNull().CreateHistogram<double>(ReadDiskUsage, ReadDiskUsageUnit, ReadDiskUsageDescription, AggregationTypes.NoAggregate); private readonly CancellationTokenSource cancellationTokenSource = new(); private PerformanceCounter? readPerformanceCounter; private PerformanceCounter? writePerformanceCounter; - public DiskUsageMonitor( - IMetricsService metricsService) - { - this.writeDiskUsageHistogram = metricsService.ThrowIfNull().CreateHistogram<double>(WriteDiskUsage, WriteDiskUsageUnit, WriteDiskUsageDescription, AggregationTypes.NoAggregate); - this.readDiskUsageHistogram = metricsService.ThrowIfNull().CreateHistogram<double>(ReadDiskUsage, ReadDiskUsageUnit, ReadDiskUsageDescription, AggregationTypes.NoAggregate); - } - public void OnClosing() { this.cancellationTokenSource.Cancel(); diff --git a/Daybreak/Services/Monitoring/MemoryUsageMonitor.cs b/Daybreak/Services/Monitoring/MemoryUsageMonitor.cs index 441d5d45..a02abcc5 100644 --- a/Daybreak/Services/Monitoring/MemoryUsageMonitor.cs +++ b/Daybreak/Services/Monitoring/MemoryUsageMonitor.cs @@ -1,34 +1,26 @@ using System.Diagnostics.Metrics; using System.Diagnostics; -using System.Threading.Tasks; using System.Windows.Extensions.Services; using System.Core.Extensions; using System.Extensions; -using System.Threading; using Daybreak.Shared.Services.Metrics; using Daybreak.Shared.Models.Metrics; namespace Daybreak.Services.Monitoring; -internal sealed class MemoryUsageMonitor : IApplicationLifetimeService +internal sealed class MemoryUsageMonitor( + IMetricsService metricsService) : IApplicationLifetimeService { private const string MemoryUsage = "Memory Usage"; private const string MemoryUsageUnit = "MBs"; private const string MemoryUsageDescription = "MBs used by Daybreak"; - private readonly Histogram<long> memoryUsageHistogram; - private readonly Process currentProcess; + private readonly Histogram<long> memoryUsageHistogram = metricsService.ThrowIfNull().CreateHistogram<long>(MemoryUsage, MemoryUsageUnit, MemoryUsageDescription, AggregationTypes.NoAggregate); + private readonly Process currentProcess = Process.GetCurrentProcess(); private readonly CancellationTokenSource cancellationTokenSource = new(); private PerformanceCounter? memoryPerformanceCounter; - public MemoryUsageMonitor( - IMetricsService metricsService) - { - this.memoryUsageHistogram = metricsService.ThrowIfNull().CreateHistogram<long>(MemoryUsage, MemoryUsageUnit, MemoryUsageDescription, AggregationTypes.NoAggregate); - this.currentProcess = Process.GetCurrentProcess(); - } - public void OnClosing() { this.cancellationTokenSource.Cancel(); diff --git a/Daybreak/Services/Monitoring/ProcessorUsageMonitor.cs b/Daybreak/Services/Monitoring/ProcessorUsageMonitor.cs index 8ba34cef..839c970e 100644 --- a/Daybreak/Services/Monitoring/ProcessorUsageMonitor.cs +++ b/Daybreak/Services/Monitoring/ProcessorUsageMonitor.cs @@ -1,34 +1,24 @@ using Daybreak.Shared.Models.Metrics; using Daybreak.Shared.Services.Metrics; -using System; using System.Core.Extensions; using System.Diagnostics; using System.Diagnostics.Metrics; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Extensions.Services; namespace Daybreak.Services.Monitoring; -internal sealed class ProcessorUsageMonitor : IApplicationLifetimeService +internal sealed class ProcessorUsageMonitor( + IMetricsService metricsService) : IApplicationLifetimeService { private const string ProcessorTime = "Processor Usage"; private const string ProcessorTimeUnit = "% CPU"; private const string ProcessorTimeDescription = "Percentage of CPU used by Daybreak"; - private readonly Histogram<double> processorTimeHistogram; - private readonly Process currentProcess; - private readonly int processorCount; + private readonly Histogram<double> processorTimeHistogram = metricsService.ThrowIfNull().CreateHistogram<double>(ProcessorTime, ProcessorTimeUnit, ProcessorTimeDescription, AggregationTypes.NoAggregate); + private readonly Process currentProcess = Process.GetCurrentProcess(); + private readonly int processorCount = Environment.ProcessorCount; private readonly CancellationTokenSource cancellationTokenSource = new(); - public ProcessorUsageMonitor( - IMetricsService metricsService) - { - this.processorTimeHistogram = metricsService.ThrowIfNull().CreateHistogram<double>(ProcessorTime, ProcessorTimeUnit, ProcessorTimeDescription, AggregationTypes.NoAggregate); - this.currentProcess = Process.GetCurrentProcess(); - this.processorCount = Environment.ProcessorCount; - } - public void OnClosing() { this.cancellationTokenSource.Cancel(); diff --git a/Daybreak/Services/Mutex/MutexHandler.cs b/Daybreak/Services/Mutex/MutexHandler.cs deleted file mode 100644 index 5cbd41c1..00000000 --- a/Daybreak/Services/Mutex/MutexHandler.cs +++ /dev/null @@ -1,146 +0,0 @@ -using Daybreak.Shared.Services.Mutex; -using Daybreak.Shared.Utils; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Runtime.InteropServices; - -namespace Daybreak.Services.Mutex; - -internal sealed class MutexHandler : IMutexHandler -{ - public void CloseMutex(Process process, string mutexName) - { - CloseHandle(process, mutexName); - } - - private static List<NativeMethods.SystemHandleInformation> GetHandles(Process targetProcess, IntPtr systemHandle) - { - var processHandles = new List<NativeMethods.SystemHandleInformation>(); - var basePointer = systemHandle.ToInt64(); - NativeMethods.SystemHandleInformation currentHandleInfo; - for (int i = 0; i < Marshal.ReadInt32(systemHandle); i++) - { - var currentOffset = IntPtr.Size + (i * Marshal.SizeOf(typeof(NativeMethods.SystemHandleInformation))); - currentHandleInfo = (NativeMethods.SystemHandleInformation)Marshal.PtrToStructure(new IntPtr(basePointer + currentOffset), typeof(NativeMethods.SystemHandleInformation))!; - if (currentHandleInfo.OwnerPID == (uint)targetProcess.Id) - { - processHandles.Add(currentHandleInfo); - } - } - - return processHandles; - } - - private static void CloseHandle(Process targetProcess, string handleName) - { - var systemHandles = GetAllHandles(); - if (systemHandles == IntPtr.Zero) - { - return; - } - - List<NativeMethods.SystemHandleInformation> processHandles = GetHandles(targetProcess, systemHandles); - Marshal.FreeHGlobal(systemHandles); - var processHandle = NativeMethods.OpenProcess(NativeMethods.ProcessAccessFlags.DupHandle, false, (uint)targetProcess.Id); - foreach (var handleInfo in processHandles) - { - if (GetHandleName(handleInfo, processHandle).Contains(handleName)) - { - if (CloseOwnedHandle(handleInfo.OwnerPID, new IntPtr(handleInfo.HandleValue))) - { - NativeMethods.CloseHandle(processHandle); - return; - } - } - } - - NativeMethods.CloseHandle(processHandle); - return; - } - - private static string GetHandleName(NativeMethods.SystemHandleInformation targetHandleInfo, IntPtr processHandle) - { - if (targetHandleInfo.AccessMask.ToInt64() == 0x0012019F) - { - return string.Empty; - } - - try - { - var thisProcess = Process.GetCurrentProcess().Handle; - NativeMethods.DuplicateHandle(processHandle, new IntPtr(targetHandleInfo.HandleValue), thisProcess, out var handle, 0, false, NativeMethods.DuplicateOptions.DUPLICATE_SAME_ACCESS); - var bufferSize = GetHandleNameLength(handle); - var stringBuffer = Marshal.AllocHGlobal(bufferSize); - NativeMethods.NtQueryObject(handle, NativeMethods.ObjectInformationClass.ObjectNameInformation, stringBuffer, bufferSize, out _); - NativeMethods.CloseHandle(handle); - var handleName = ConvertToString(stringBuffer); - Marshal.FreeHGlobal(stringBuffer); - return handleName; - } - catch(Exception e) - { - return string.Empty; - } - } - - private static IntPtr GetAllHandles() - { - int bufferSize = 0x10000; - var pSysInfoBuffer = Marshal.AllocHGlobal(bufferSize); - var queryResult = NativeMethods.NtQuerySystemInformation(NativeMethods.SystemInformationClass.SystemHandleInformation, - pSysInfoBuffer, bufferSize, out _); - - while (queryResult == NativeMethods.NtStatus.STATUS_INFO_LENGTH_MISMATCH) - { - Marshal.FreeHGlobal(pSysInfoBuffer); - bufferSize *= 2; - pSysInfoBuffer = Marshal.AllocHGlobal(bufferSize); - queryResult = NativeMethods.NtQuerySystemInformation(NativeMethods.SystemInformationClass.SystemHandleInformation, - pSysInfoBuffer, bufferSize, out _); - } - - if (queryResult == NativeMethods.NtStatus.STATUS_SUCCESS) - { - return pSysInfoBuffer; - } - else - { - Marshal.FreeHGlobal(pSysInfoBuffer); - return IntPtr.Zero; - } - } - - private static int GetHandleNameLength(IntPtr handle) - { - var infoBufferSize = Marshal.SizeOf(typeof(NativeMethods.ObjectBasicInformation)); - var pInfoBuffer = Marshal.AllocHGlobal(infoBufferSize); - NativeMethods.NtQueryObject(handle, NativeMethods.ObjectInformationClass.ObjectBasicInformation, pInfoBuffer, infoBufferSize, out _); - NativeMethods.ObjectBasicInformation objInfo = (NativeMethods.ObjectBasicInformation)Marshal.PtrToStructure(pInfoBuffer, typeof(NativeMethods.ObjectBasicInformation))!; - Marshal.FreeHGlobal(pInfoBuffer); - if (objInfo.NameInformationLength == 0) - { - return 0x100; - } - else - { - return (int)objInfo.NameInformationLength; - } - } - - private static string ConvertToString(IntPtr stringBuffer) - { - var baseAddress = stringBuffer.ToInt64(); - var offset = IntPtr.Size * 2; - var handleName = Marshal.PtrToStringUni(new IntPtr(baseAddress + offset)); - return handleName!; - } - - private static bool CloseOwnedHandle(uint processId, IntPtr handleToClose) - { - var processHandle = NativeMethods.OpenProcess(NativeMethods.ProcessAccessFlags.All, false, processId); - var success = NativeMethods.DuplicateHandle(processHandle, handleToClose, IntPtr.Zero, out _, 0, false, NativeMethods.DuplicateOptions.DUPLICATE_CLOSE_SOURCE); - NativeMethods.CloseHandle(processHandle); - return success; - } -} diff --git a/Daybreak/Services/Navigation/ViewManager.cs b/Daybreak/Services/Navigation/ViewManager.cs index 02fe7bae..7fc78222 100644 --- a/Daybreak/Services/Navigation/ViewManager.cs +++ b/Daybreak/Services/Navigation/ViewManager.cs @@ -1,8 +1,6 @@ using Daybreak.Services.Telemetry; -using Daybreak.Shared.Models.Guildwars; using Daybreak.Shared.Services.Navigation; using Slim; -using System; using System.Diagnostics; using System.Extensions; using System.Windows; diff --git a/Daybreak/Services/Notifications/Handlers/NavigateToCalendarViewHandler.cs b/Daybreak/Services/Notifications/Handlers/NavigateToCalendarViewHandler.cs index ea7500a5..ad22a42e 100644 --- a/Daybreak/Services/Notifications/Handlers/NavigateToCalendarViewHandler.cs +++ b/Daybreak/Services/Notifications/Handlers/NavigateToCalendarViewHandler.cs @@ -4,18 +4,12 @@ using Daybreak.Shared.Models.Notifications.Handling; using Daybreak.Shared.Services.Navigation; using Daybreak.Views; using System.Core.Extensions; -using System.Linq; namespace Daybreak.Services.Notifications.Handlers; -public sealed class NavigateToCalendarViewHandler : INotificationHandler +public sealed class NavigateToCalendarViewHandler( + IViewManager viewManager) : INotificationHandler { - private readonly IViewManager viewManager; - - public NavigateToCalendarViewHandler( - IViewManager viewManager) - { - this.viewManager = viewManager.ThrowIfNull(); - } + private readonly IViewManager viewManager = viewManager.ThrowIfNull(); public void OpenNotification(Notification notification) { diff --git a/Daybreak/Services/Notifications/Handlers/NoActionHandler.cs b/Daybreak/Services/Notifications/Handlers/NoActionHandler.cs index bf76a51b..5708f77b 100644 --- a/Daybreak/Services/Notifications/Handlers/NoActionHandler.cs +++ b/Daybreak/Services/Notifications/Handlers/NoActionHandler.cs @@ -1,7 +1,7 @@ using Daybreak.Shared.Models.Notifications; using Daybreak.Shared.Models.Notifications.Handling; -namespace Daybreak.Models.Notifications.Handling; +namespace Daybreak.Services.Notifications.Handlers; public sealed class NoActionHandler : INotificationHandler { diff --git a/Daybreak/Services/Notifications/INotificationStorage.cs b/Daybreak/Services/Notifications/INotificationStorage.cs index d620dcd0..368bc48c 100644 --- a/Daybreak/Services/Notifications/INotificationStorage.cs +++ b/Daybreak/Services/Notifications/INotificationStorage.cs @@ -1,7 +1,4 @@ using Daybreak.Services.Notifications.Models; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.Notifications; diff --git a/Daybreak/Services/Notifications/NotificationService.cs b/Daybreak/Services/Notifications/NotificationService.cs index 81b287e8..d2bbf22b 100644 --- a/Daybreak/Services/Notifications/NotificationService.cs +++ b/Daybreak/Services/Notifications/NotificationService.cs @@ -1,4 +1,4 @@ -using Daybreak.Models.Notifications.Handling; +using Daybreak.Services.Notifications.Handlers; using Daybreak.Services.Notifications.Models; using Daybreak.Shared.Models.Notifications; using Daybreak.Shared.Models.Notifications.Handling; @@ -6,34 +6,22 @@ using Daybreak.Shared.Services.Notifications; using Daybreak.Shared.Utils; using Microsoft.Extensions.Logging; using Slim; -using System; using System.Collections.Concurrent; -using System.Collections.Generic; using System.Core.Extensions; using System.Extensions; -using System.Linq; using System.Runtime.CompilerServices; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.Notifications; -internal sealed class NotificationService : INotificationService, INotificationProducer, INotificationHandlerProducer +internal sealed class NotificationService( + IServiceManager serviceManager, + INotificationStorage notificationStorage, + ILogger<NotificationService> logger) : INotificationService, INotificationProducer, INotificationHandlerProducer { private readonly ConcurrentQueue<Notification> pendingNotifications = new(); - private readonly IServiceManager serviceManager; - private readonly INotificationStorage storage; - private readonly ILogger<NotificationService> logger; - - public NotificationService( - IServiceManager serviceManager, - INotificationStorage notificationStorage, - ILogger<NotificationService> logger) - { - this.serviceManager = serviceManager.ThrowIfNull(); - this.storage = notificationStorage.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly IServiceManager serviceManager = serviceManager.ThrowIfNull(); + private readonly INotificationStorage storage = notificationStorage.ThrowIfNull(); + private readonly ILogger<NotificationService> logger = logger.ThrowIfNull(); public NotificationToken NotifyInformation( string title, @@ -80,7 +68,7 @@ internal sealed class NotificationService : INotificationService, INotificationP return this.NotifyInternal<THandlingType>(title, description, metaData, expirationTime, dismissible, LogLevel.Error, persistent); } - async ValueTask INotificationProducer.OpenNotification(Notification notification, bool storeNotification, CancellationToken cancellationToken) + async Task INotificationProducer.OpenNotification(Notification notification, bool storeNotification, CancellationToken cancellationToken) { if (storeNotification) { @@ -107,12 +95,12 @@ internal sealed class NotificationService : INotificationService, INotificationP handler?.OpenNotification(notification); } - async ValueTask INotificationProducer.RemoveNotification(Notification notification, CancellationToken cancellationToken) + async Task INotificationProducer.RemoveNotification(Notification notification, CancellationToken cancellationToken) { await this.storage.RemoveNotification(ToDTO(notification), cancellationToken); } - async ValueTask INotificationProducer.RemoveAllNotifications(CancellationToken cancellationToken) + async Task INotificationProducer.RemoveAllNotifications(CancellationToken cancellationToken) { await this.storage.RemoveAllNotifications(cancellationToken); } diff --git a/Daybreak/Services/Notifications/NotificationStorage.cs b/Daybreak/Services/Notifications/NotificationStorage.cs index 80945894..57c5bb95 100644 --- a/Daybreak/Services/Notifications/NotificationStorage.cs +++ b/Daybreak/Services/Notifications/NotificationStorage.cs @@ -1,23 +1,13 @@ using Daybreak.Services.Notifications.Models; -using System; -using System.Collections.Generic; using System.Core.Extensions; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.Notifications; -internal sealed class NotificationStorage : INotificationStorage +internal sealed class NotificationStorage( + NotificationsDbContext liteCollection) : INotificationStorage { private List<NotificationDTO>? notificationsCache; - private readonly NotificationsDbContext liteCollection; - - public NotificationStorage( - NotificationsDbContext liteCollection) - { - this.liteCollection = liteCollection.ThrowIfNull(); - } + private readonly NotificationsDbContext liteCollection = liteCollection.ThrowIfNull(); public async ValueTask<IEnumerable<NotificationDTO>> GetPendingNotifications(CancellationToken cancellationToken) { diff --git a/Daybreak/Services/Onboarding/OnboardingService.cs b/Daybreak/Services/Onboarding/OnboardingService.cs index adb82284..13cef5ae 100644 --- a/Daybreak/Services/Onboarding/OnboardingService.cs +++ b/Daybreak/Services/Onboarding/OnboardingService.cs @@ -11,27 +11,18 @@ using System.Extensions; namespace Daybreak.Services.Onboarding; -internal sealed class OnboardingService : IOnboardingService +internal sealed class OnboardingService( + ICredentialManager credentialManager, + IGuildWarsExecutableManager guildWarsExecutableManager, + ILaunchConfigurationService launchConfigurationService, + ILiveOptions<LauncherOptions> liveOptions, + ILogger<OnboardingService> logger) : IOnboardingService { - private readonly ICredentialManager credentialManager; - private readonly IGuildWarsExecutableManager guildWarsExecutableManager; - private readonly ILaunchConfigurationService launchConfigurationService; - private readonly ILiveOptions<LauncherOptions> options; - private readonly ILogger<OnboardingService> logger; - - public OnboardingService( - ICredentialManager credentialManager, - IGuildWarsExecutableManager guildWarsExecutableManager, - ILaunchConfigurationService launchConfigurationService, - ILiveOptions<LauncherOptions> liveOptions, - ILogger<OnboardingService> logger) - { - this.credentialManager = credentialManager.ThrowIfNull(); - this.guildWarsExecutableManager = guildWarsExecutableManager.ThrowIfNull(); - this.launchConfigurationService = launchConfigurationService.ThrowIfNull(); - this.options = liveOptions.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly ICredentialManager credentialManager = credentialManager.ThrowIfNull(); + private readonly IGuildWarsExecutableManager guildWarsExecutableManager = guildWarsExecutableManager.ThrowIfNull(); + private readonly ILaunchConfigurationService launchConfigurationService = launchConfigurationService.ThrowIfNull(); + private readonly ILiveOptions<LauncherOptions> options = liveOptions.ThrowIfNull(); + private readonly ILogger<OnboardingService> logger = logger.ThrowIfNull(); public LauncherOnboardingStage CheckOnboardingStage() { diff --git a/Daybreak/Services/Options/OptionsManager.cs b/Daybreak/Services/Options/OptionsManager.cs index f81eb9df..190b6fc2 100644 --- a/Daybreak/Services/Options/OptionsManager.cs +++ b/Daybreak/Services/Options/OptionsManager.cs @@ -3,13 +3,10 @@ using Daybreak.Shared.Services.Options; using Daybreak.Shared.Utils; using Newtonsoft.Json; using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Extensions; using System.IO; -using System.Linq; using System.Reflection; namespace Daybreak.Services.Options; diff --git a/Daybreak/Services/Options/OptionsSynchronizationService.cs b/Daybreak/Services/Options/OptionsSynchronizationService.cs index 0c3d7515..47dae76a 100644 --- a/Daybreak/Services/Options/OptionsSynchronizationService.cs +++ b/Daybreak/Services/Options/OptionsSynchronizationService.cs @@ -5,40 +5,27 @@ using Daybreak.Shared.Services.Options; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Extensions; -using System.Linq; using System.Reflection; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Extensions.Services; namespace Daybreak.Services.Options; -public sealed class OptionsSynchronizationService : IOptionsSynchronizationService, IApplicationLifetimeService +public sealed class OptionsSynchronizationService( + IOptionsProvider optionsProvider, + IGraphClient graphClient, + ILiveOptions<LauncherOptions> liveOptions, + ILogger<OptionsSynchronizationService> logger) : IOptionsSynchronizationService, IApplicationLifetimeService { private static readonly TimeSpan StartupDelay = TimeSpan.FromMinutes(1); private static readonly TimeSpan BackupFrequency = TimeSpan.FromSeconds(15); - private readonly IOptionsProvider optionsProvider; - private readonly IGraphClient graphClient; - private readonly ILiveOptions<LauncherOptions> liveOptions; - private readonly ILogger<OptionsSynchronizationService> logger; - - public OptionsSynchronizationService( - IOptionsProvider optionsProvider, - IGraphClient graphClient, - ILiveOptions<LauncherOptions> liveOptions, - ILogger<OptionsSynchronizationService> logger) - { - this.optionsProvider = optionsProvider.ThrowIfNull(); - this.graphClient = graphClient.ThrowIfNull(); - this.liveOptions = liveOptions.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly IOptionsProvider optionsProvider = optionsProvider.ThrowIfNull(); + private readonly IGraphClient graphClient = graphClient.ThrowIfNull(); + private readonly ILiveOptions<LauncherOptions> liveOptions = liveOptions.ThrowIfNull(); + private readonly ILogger<OptionsSynchronizationService> logger = logger.ThrowIfNull(); public Task<Dictionary<string, JObject>> GetLocalOptions(CancellationToken cancellationToken) { diff --git a/Daybreak/Services/Plugins/PluginsService.cs b/Daybreak/Services/Plugins/PluginsService.cs index 39c05494..78776c2b 100644 --- a/Daybreak/Services/Plugins/PluginsService.cs +++ b/Daybreak/Services/Plugins/PluginsService.cs @@ -18,17 +18,12 @@ using Microsoft.Extensions.Logging; using Plumsy; using Plumsy.Models; using Slim; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Extensions; using System.IO; -using System.Linq; using System.Logging; using System.Reflection; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.Plugins; diff --git a/Daybreak/Services/Plugins/Validators/DaybreakPluginValidator.cs b/Daybreak/Services/Plugins/Validators/DaybreakPluginValidator.cs index 0701d53d..a0012be1 100644 --- a/Daybreak/Services/Plugins/Validators/DaybreakPluginValidator.cs +++ b/Daybreak/Services/Plugins/Validators/DaybreakPluginValidator.cs @@ -1,8 +1,5 @@ using Daybreak.Shared.Models.Plugins; using Plumsy.Validators; -using System; -using System.Collections.Generic; -using System.Linq; using System.Reflection.Metadata; namespace Daybreak.Services.Plugins.Validators; diff --git a/Daybreak/Services/Privilege/PrivilegeManager.cs b/Daybreak/Services/Privilege/PrivilegeManager.cs index 11d1c646..3522e16b 100644 --- a/Daybreak/Services/Privilege/PrivilegeManager.cs +++ b/Daybreak/Services/Privilege/PrivilegeManager.cs @@ -1,5 +1,4 @@ -using Daybreak.Models; -using Daybreak.Shared.Models; +using Daybreak.Shared.Models; using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.Privilege; using Daybreak.Views; @@ -10,20 +9,14 @@ using System.Windows.Controls; namespace Daybreak.Services.Privilege; -internal sealed class PrivilegeManager : IPrivilegeManager +internal sealed class PrivilegeManager( + IViewManager viewManager, + ILogger<PrivilegeManager> logger) : IPrivilegeManager { public bool AdminPrivileges => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator); - private readonly IViewManager viewManager; - private readonly ILogger<PrivilegeManager> logger; - - public PrivilegeManager( - IViewManager viewManager, - ILogger<PrivilegeManager> logger) - { - this.logger = logger.ThrowIfNull(nameof(logger)); - this.viewManager = viewManager.ThrowIfNull(nameof(viewManager)); - } + private readonly IViewManager viewManager = viewManager.ThrowIfNull(nameof(viewManager)); + private readonly ILogger<PrivilegeManager> logger = logger.ThrowIfNull(nameof(logger)); public void RequestAdminPrivileges<TCancelView>(string messageToUser, object? dataContextOfCancelView = default) where TCancelView : UserControl diff --git a/Daybreak/Services/ReShade/Notifications/ReShadeConfigChangedHandler.cs b/Daybreak/Services/ReShade/Notifications/ReShadeConfigChangedHandler.cs index e0d63e90..5b8e0b0e 100644 --- a/Daybreak/Services/ReShade/Notifications/ReShadeConfigChangedHandler.cs +++ b/Daybreak/Services/ReShade/Notifications/ReShadeConfigChangedHandler.cs @@ -3,18 +3,12 @@ using Daybreak.Shared.Models.Notifications.Handling; using Daybreak.Shared.Services.ReShade; using System.Core.Extensions; using System.IO; -using System.Threading; namespace Daybreak.Services.ReShade.Notifications; -internal sealed class ReShadeConfigChangedHandler : INotificationHandler +internal sealed class ReShadeConfigChangedHandler( + IReShadeService reShadeService) : INotificationHandler { - private readonly IReShadeService reShadeService; - - public ReShadeConfigChangedHandler( - IReShadeService reShadeService) - { - this.reShadeService = reShadeService.ThrowIfNull(); - } + private readonly IReShadeService reShadeService = reShadeService.ThrowIfNull(); public async void OpenNotification(Notification notification) { diff --git a/Daybreak/Services/ReShade/ReShadeService.cs b/Daybreak/Services/ReShade/ReShadeService.cs index 46a61e80..58df8639 100644 --- a/Daybreak/Services/ReShade/ReShadeService.cs +++ b/Daybreak/Services/ReShade/ReShadeService.cs @@ -15,8 +15,6 @@ using HtmlAgilityPack; using IniParser.Parser; using Microsoft.Extensions.Logging; using Microsoft.Win32; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Data; @@ -24,10 +22,7 @@ using System.Diagnostics; using System.Extensions; using System.IO; using System.IO.Compression; -using System.Linq; using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Extensions.Services; namespace Daybreak.Services.ReShade; diff --git a/Daybreak/Services/ReShade/Utils/OffsetStream.cs b/Daybreak/Services/ReShade/Utils/OffsetStream.cs index b50dfb03..6c3b86df 100644 --- a/Daybreak/Services/ReShade/Utils/OffsetStream.cs +++ b/Daybreak/Services/ReShade/Utils/OffsetStream.cs @@ -1,5 +1,4 @@ -using System; -using System.Core.Extensions; +using System.Core.Extensions; using System.IO; namespace Daybreak.Services.ReShade.Utils; diff --git a/Daybreak/Services/Registry/RegistryService.cs b/Daybreak/Services/Registry/RegistryService.cs index 54b7f560..7941c1dc 100644 --- a/Daybreak/Services/Registry/RegistryService.cs +++ b/Daybreak/Services/Registry/RegistryService.cs @@ -1,12 +1,9 @@ using Daybreak.Shared.Services.Registry; using Microsoft.Win32; using Newtonsoft.Json; -using System; -using System.Collections.Generic; using System.Core.Extensions; using System.Extensions; using System.IO; -using System.Linq; namespace Daybreak.Services.Registry; diff --git a/Daybreak/Services/Screens/GuildwarsScreenPlacer.cs b/Daybreak/Services/Screens/GuildwarsScreenPlacer.cs index 2a6a4fb0..c16a088f 100644 --- a/Daybreak/Services/Screens/GuildwarsScreenPlacer.cs +++ b/Daybreak/Services/Screens/GuildwarsScreenPlacer.cs @@ -2,33 +2,21 @@ using Daybreak.Shared.Models.Mods; using Daybreak.Shared.Services.Screens; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.Screens; -internal sealed class GuildwarsScreenPlacer : IGuildwarsScreenPlacer +internal sealed class GuildwarsScreenPlacer( + ILiveUpdateableOptions<LauncherOptions> liveOptions, + IScreenManager screenManager, + ILogger<GuildwarsScreenPlacer> logger) : IGuildwarsScreenPlacer { private static readonly TimeSpan Delay = TimeSpan.FromSeconds(5); - private readonly ILiveUpdateableOptions<LauncherOptions> liveOptions; - private readonly IScreenManager screenManager; - private readonly ILogger<GuildwarsScreenPlacer> logger; - - public GuildwarsScreenPlacer( - ILiveUpdateableOptions<LauncherOptions> liveOptions, - IScreenManager screenManager, - ILogger<GuildwarsScreenPlacer> logger) - { - this.liveOptions = liveOptions.ThrowIfNull(); - this.screenManager = screenManager.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly ILiveUpdateableOptions<LauncherOptions> liveOptions = liveOptions.ThrowIfNull(); + private readonly IScreenManager screenManager = screenManager.ThrowIfNull(); + private readonly ILogger<GuildwarsScreenPlacer> logger = logger.ThrowIfNull(); public string Name => "Screen placer"; public bool IsEnabled diff --git a/Daybreak/Services/Screens/ScreenManager.cs b/Daybreak/Services/Screens/ScreenManager.cs index 560fcbc3..778f6860 100644 --- a/Daybreak/Services/Screens/ScreenManager.cs +++ b/Daybreak/Services/Screens/ScreenManager.cs @@ -4,15 +4,11 @@ using Daybreak.Shared.Models; using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.Screens; using Daybreak.Shared.Utils; -using Daybreak.Views; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Diagnostics; using System.Extensions; -using System.Linq; using System.Windows; using System.Windows.Extensions.Services; using System.Windows.Media; @@ -97,7 +93,7 @@ internal sealed class ScreenManager( public void MoveGuildwarsToScreen(Screen screen) { - this.logger.LogDebug($"Attempting to move guildwars to screen screenId", screen.Id); + this.logger.LogDebug("Attempting to move guildwars to screen {screenId}", screen.Id); var hwnd = GetMainWindowHandle(); NativeMethods.SetWindowPos(hwnd, NativeMethods.HWND_TOP, screen.Size.Left.ToInt(), screen.Size.Top.ToInt(), screen.Size.Width.ToInt(), screen.Size.Height.ToInt(), NativeMethods.SWP_SHOWWINDOW); } diff --git a/Daybreak/Services/Screens/SplashScreenService.cs b/Daybreak/Services/Screens/SplashScreenService.cs index 5e0e5ef5..ac81cac6 100644 --- a/Daybreak/Services/Screens/SplashScreenService.cs +++ b/Daybreak/Services/Screens/SplashScreenService.cs @@ -5,10 +5,8 @@ using Daybreak.Shared.Models; using Daybreak.Shared.Services.Screens; using Daybreak.Shared.Services.Themes; using Microsoft.Extensions.Options; -using System.Collections.Generic; using System.Core.Extensions; using System.Extensions; -using System.Linq; using System.Windows; namespace Daybreak.Services.Screens; diff --git a/Daybreak/Services/Screenshots/BackgroundProvider.cs b/Daybreak/Services/Screenshots/BackgroundProvider.cs index 7478815a..a4beff74 100644 --- a/Daybreak/Services/Screenshots/BackgroundProvider.cs +++ b/Daybreak/Services/Screenshots/BackgroundProvider.cs @@ -2,32 +2,22 @@ using Daybreak.Shared.Models; using Daybreak.Shared.Services.Screenshots; using Microsoft.Extensions.Logging; -using System; using System.Configuration; using System.Core.Extensions; -using System.Threading.Tasks; using System.Windows.Media; namespace Daybreak.Services.Screenshots; -internal sealed class BackgroundProvider : IBackgroundProvider +internal sealed class BackgroundProvider( + IScreenshotProvider screenshotProvider, + IOnlinePictureClient bloogumClient, + ILiveOptions<BackgroundProviderOptions> liveOptions, + ILogger<BackgroundProvider> logger) : IBackgroundProvider { - private readonly IScreenshotProvider screenshotProvider; - private readonly IOnlinePictureClient bloogumClient; - private readonly ILiveOptions<BackgroundProviderOptions> liveOptions; - private readonly ILogger<BackgroundProvider> logger; - - public BackgroundProvider( - IScreenshotProvider screenshotProvider, - IOnlinePictureClient bloogumClient, - ILiveOptions<BackgroundProviderOptions> liveOptions, - ILogger<BackgroundProvider> logger) - { - this.screenshotProvider = screenshotProvider.ThrowIfNull(); - this.bloogumClient = bloogumClient.ThrowIfNull(); - this.liveOptions = liveOptions.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly IScreenshotProvider screenshotProvider = screenshotProvider.ThrowIfNull(); + private readonly IOnlinePictureClient bloogumClient = bloogumClient.ThrowIfNull(); + private readonly ILiveOptions<BackgroundProviderOptions> liveOptions = liveOptions.ThrowIfNull(); + private readonly ILogger<BackgroundProvider> logger = logger.ThrowIfNull(); public async Task<BackgroundResponse> GetBackground() { diff --git a/Daybreak/Services/Screenshots/Models/Event.cs b/Daybreak/Services/Screenshots/Models/Event.cs index ef553fed..ac868bd6 100644 --- a/Daybreak/Services/Screenshots/Models/Event.cs +++ b/Daybreak/Services/Screenshots/Models/Event.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Guildwars; -using System.Collections.Generic; namespace Daybreak.Services.Screenshots.Models; internal sealed class Event diff --git a/Daybreak/Services/Screenshots/Models/Location.cs b/Daybreak/Services/Screenshots/Models/Location.cs index 97f5ea06..c21ff9c9 100644 --- a/Daybreak/Services/Screenshots/Models/Location.cs +++ b/Daybreak/Services/Screenshots/Models/Location.cs @@ -1,5 +1,4 @@ using Daybreak.Shared.Models.Guildwars; -using System.Collections.Generic; namespace Daybreak.Services.Screenshots.Models; diff --git a/Daybreak/Services/Screenshots/OnlinePictureClient.cs b/Daybreak/Services/Screenshots/OnlinePictureClient.cs index be6ada23..25873672 100644 --- a/Daybreak/Services/Screenshots/OnlinePictureClient.cs +++ b/Daybreak/Services/Screenshots/OnlinePictureClient.cs @@ -6,16 +6,11 @@ using Daybreak.Shared.Services.Images; using Daybreak.Shared.Services.Screenshots; using Daybreak.Shared.Utils; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Extensions; using System.IO; -using System.Linq; using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Media; namespace Daybreak.Services.Screenshots; @@ -157,24 +152,7 @@ internal sealed class OnlinePictureClient : IOnlinePictureClient return GetRandomScreenShot(location); } - return this.GetImageUri(validLocations, validCategories); - } - - private (string Uri, string CreditText) GetImageUri(List<Location> validLocations, List<Entry> validCategories) - { - var selectedCategory = validCategories[Random.Shared.Next(0, validCategories.Count)]; - if (selectedCategory.Count == 0) - { - if (validLocations.None()) - { - return GetRandomScreenShot(); - } - - var location = validLocations[Random.Shared.Next(0, validLocations.Count)]; - return GetRandomScreenShot(location); - } - - return GetScreenshotName(selectedCategory, Random.Shared.Next(selectedCategory.StartIndex ?? 0, (selectedCategory.Count + selectedCategory.StartIndex) ?? 0)); + return GetImageUri(validLocations, validCategories); } private async Task<Stream?> GetRemoteImage(string url) @@ -217,6 +195,23 @@ internal sealed class OnlinePictureClient : IOnlinePictureClient } } + private static (string Uri, string CreditText) GetImageUri(List<Location> validLocations, List<Entry> validCategories) + { + var selectedCategory = validCategories[Random.Shared.Next(0, validCategories.Count)]; + if (selectedCategory.Count == 0) + { + if (validLocations.None()) + { + return GetRandomScreenShot(); + } + + var location = validLocations[Random.Shared.Next(0, validLocations.Count)]; + return GetRandomScreenShot(location); + } + + return GetScreenshotName(selectedCategory, Random.Shared.Next(selectedCategory.StartIndex ?? 0, (selectedCategory.Count + selectedCategory.StartIndex) ?? 0)); + } + private static (string Uri, string CreditText) GetRandomScreenShot() { var location = Location.Locations[Random.Shared.Next(0, Location.Locations.Count)]; diff --git a/Daybreak/Services/Screenshots/ScreenshotProvider.cs b/Daybreak/Services/Screenshots/ScreenshotProvider.cs index 2b59f9c9..8e267a73 100644 --- a/Daybreak/Services/Screenshots/ScreenshotProvider.cs +++ b/Daybreak/Services/Screenshots/ScreenshotProvider.cs @@ -1,12 +1,9 @@ using Daybreak.Shared.Services.Images; using Daybreak.Shared.Services.Screenshots; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Core.Extensions; using System.Extensions; using System.IO; -using System.Threading.Tasks; using System.Windows.Media; namespace Daybreak.Services.Screenshots; @@ -33,20 +30,20 @@ internal sealed class ScreenshotProvider : IScreenshotProvider public async Task<ImageSource?> GetRandomScreenShot() { var screenshots = GetScreenshots(); - if (screenshots.Count == 0) + if (screenshots.Length == 0) { this.logger.LogDebug("Attempted to retrieve a random screenshot. No screenshots present"); return default; } - var screenShot = screenshots[Random.Shared.Next(0, screenshots.Count)]; + var screenShot = screenshots[Random.Shared.Next(0, screenshots.Length)]; return await this.GetScreenshotInternal(screenShot); } private async Task<ImageSource?> GetScreenshotInternal(string name) { var screenshots = GetScreenshots(); - if (screenshots.Count == 0) + if (screenshots.Length == 0) { this.logger.LogDebug("Attempted to retrieve a random screenshot. No screenshots present"); return default; @@ -55,8 +52,5 @@ internal sealed class ScreenshotProvider : IScreenshotProvider return await this.imageCache.GetImage(name); } - private static IList<string> GetScreenshots() - { - return Directory.GetFiles(ScreenshotsPath); - } + private static string[] GetScreenshots() => Directory.GetFiles(ScreenshotsPath); } diff --git a/Daybreak/Services/SevenZip/SevenZipExtractor.cs b/Daybreak/Services/SevenZip/SevenZipExtractor.cs index 7ab02dd6..cc7c923b 100644 --- a/Daybreak/Services/SevenZip/SevenZipExtractor.cs +++ b/Daybreak/Services/SevenZip/SevenZipExtractor.cs @@ -1,26 +1,17 @@ using Daybreak.Shared.Services.SevenZip; using Daybreak.Shared.Utils; using Microsoft.Extensions.Logging; -using System; using System.Core.Extensions; using System.Diagnostics; using System.Extensions; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.SevenZip; -internal sealed class SevenZipExtractor : ISevenZipExtractor +internal sealed class SevenZipExtractor( + ILogger<SevenZipExtractor> logger) : ISevenZipExtractor { private const string ExtractorExeName = "Daybreak.7ZipExtractor.exe"; - private readonly ILogger<SevenZipExtractor> logger; - - public SevenZipExtractor( - ILogger<SevenZipExtractor> logger) - { - this.logger = logger.ThrowIfNull(); - } + private readonly ILogger<SevenZipExtractor> logger = logger.ThrowIfNull(); public async Task<bool> ExtractToDirectory(string sourceFile, string destinationDirectory, Action<double, string> progressTracker, CancellationToken cancellationToken) { diff --git a/Daybreak/Services/Startup/Actions/BrowserHistorySizeEnforcer.cs b/Daybreak/Services/Startup/Actions/BrowserHistorySizeEnforcer.cs index 5bb08751..fe305ad5 100644 --- a/Daybreak/Services/Startup/Actions/BrowserHistorySizeEnforcer.cs +++ b/Daybreak/Services/Startup/Actions/BrowserHistorySizeEnforcer.cs @@ -4,15 +4,10 @@ using System.Configuration; using System.Core.Extensions; namespace Daybreak.Services.Startup.Actions; -public sealed class BrowserHistorySizeEnforcer : StartupActionBase +public sealed class BrowserHistorySizeEnforcer( + IUpdateableOptions<FocusViewOptions> liveOptions) : StartupActionBase { - private readonly IUpdateableOptions<FocusViewOptions> liveOptions; - - public BrowserHistorySizeEnforcer( - IUpdateableOptions<FocusViewOptions> liveOptions) - { - this.liveOptions = liveOptions.ThrowIfNull(); - } + private readonly IUpdateableOptions<FocusViewOptions> liveOptions = liveOptions.ThrowIfNull(); public override void ExecuteOnStartup() { diff --git a/Daybreak/Services/Startup/Actions/CleanupDatabases.cs b/Daybreak/Services/Startup/Actions/CleanupDatabases.cs index 772d994c..99d0c211 100644 --- a/Daybreak/Services/Startup/Actions/CleanupDatabases.cs +++ b/Daybreak/Services/Startup/Actions/CleanupDatabases.cs @@ -1,34 +1,22 @@ -using Daybreak.Services.Logging; -using Daybreak.Services.Notifications; +using Daybreak.Services.Notifications; using Daybreak.Services.TradeChat; using Daybreak.Shared.Models; using Microsoft.Extensions.Logging; using System.Core.Extensions; using System.Extensions; using System.Extensions.Core; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.Startup.Actions; -internal sealed class CleanupDatabases : StartupActionBase +internal sealed class CleanupDatabases( + TradeQuoteDbContext quotesCollection, + NotificationsDbContext notificationsCollection, + TradeMessagesDbContext traderMessagesCollection, + ILogger<CleanupDatabases> logger) : StartupActionBase { - private readonly TradeQuoteDbContext quotesCollection; - private readonly NotificationsDbContext notificationsCollection; - private readonly TradeMessagesDbContext traderMessagesCollection; - private readonly ILogger<CleanupDatabases> logger; - - public CleanupDatabases( - TradeQuoteDbContext quotesCollection, - NotificationsDbContext notificationsCollection, - TradeMessagesDbContext traderMessagesCollection, - ILogger<CleanupDatabases> logger) - { - this.quotesCollection = quotesCollection.ThrowIfNull(); - this.notificationsCollection = notificationsCollection.ThrowIfNull(); - this.traderMessagesCollection = traderMessagesCollection.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly TradeQuoteDbContext quotesCollection = quotesCollection.ThrowIfNull(); + private readonly NotificationsDbContext notificationsCollection = notificationsCollection.ThrowIfNull(); + private readonly TradeMessagesDbContext traderMessagesCollection = traderMessagesCollection.ThrowIfNull(); + private readonly ILogger<CleanupDatabases> logger = logger.ThrowIfNull(); public override async Task ExecuteOnStartupAsync(CancellationToken cancellationToken) { @@ -44,7 +32,7 @@ internal sealed class CleanupDatabases : StartupActionBase if (allQuotes.Count > 20000) { // Delete the oldest 2000 entries in the db. We probably won't need them anymore - var quotes = await this.quotesCollection.FindAll(cancellationToken).OrderBy(q => q.TimeStamp).Take(2000).ToListAsync(); + var quotes = await this.quotesCollection.FindAll(cancellationToken).OrderBy(q => q.TimeStamp).Take(2000).ToListAsync(cancellationToken); foreach (var quote in quotes) { await this.quotesCollection.Delete(quote.Id, cancellationToken); diff --git a/Daybreak/Services/Startup/Actions/CredentialsOptionsMigrator.cs b/Daybreak/Services/Startup/Actions/CredentialsOptionsMigrator.cs index 86aad66c..39dd48f7 100644 --- a/Daybreak/Services/Startup/Actions/CredentialsOptionsMigrator.cs +++ b/Daybreak/Services/Startup/Actions/CredentialsOptionsMigrator.cs @@ -4,32 +4,25 @@ using Daybreak.Shared.Models; using Daybreak.Shared.Services.Options; using Microsoft.Extensions.Logging; using Newtonsoft.Json.Linq; -using System; using System.Core.Extensions; using System.Extensions; using System.Reflection; namespace Daybreak.Services.Startup.Actions; -internal sealed class CredentialsOptionsMigrator : StartupActionBase +internal sealed class CredentialsOptionsMigrator( + IOptionsProvider optionsProvider, + ILogger<CredentialsOptionsMigrator> logger) : StartupActionBase { private const string OldOptionsKey = "CredentialManagerOptions"; - private readonly IOptionsProvider optionsProvider; - private readonly ILogger<CredentialsOptionsMigrator> logger; - - public CredentialsOptionsMigrator( - IOptionsProvider optionsProvider, - ILogger<CredentialsOptionsMigrator> logger) - { - this.optionsProvider = optionsProvider.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly IOptionsProvider optionsProvider = optionsProvider.ThrowIfNull(); + private readonly ILogger<CredentialsOptionsMigrator> logger = logger.ThrowIfNull(); public override void ExecuteOnStartup() { var newOptionsKey = GetNewOptionsKey(); var scopedLogger = this.logger.CreateScopedLogger(nameof(this.ExecuteOnStartup), string.Empty); - if (this.optionsProvider.TryGetKeyedOptions(newOptionsKey) is JObject) + if (this.optionsProvider.TryGetKeyedOptions(newOptionsKey) is not null) { scopedLogger.LogDebug($"Found [{newOptionsKey}]. No migration needed"); return; diff --git a/Daybreak/Services/Startup/Actions/EnsureDatabaseTablesExist.cs b/Daybreak/Services/Startup/Actions/EnsureDatabaseTablesExist.cs index c091de50..caa263ba 100644 --- a/Daybreak/Services/Startup/Actions/EnsureDatabaseTablesExist.cs +++ b/Daybreak/Services/Startup/Actions/EnsureDatabaseTablesExist.cs @@ -1,8 +1,6 @@ using Daybreak.Services.Notifications; using Daybreak.Services.TradeChat; using Daybreak.Shared.Models; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.Startup.Actions; public sealed class EnsureDatabaseTablesExist( diff --git a/Daybreak/Services/Startup/Actions/RenameInstallerAction.cs b/Daybreak/Services/Startup/Actions/RenameInstallerAction.cs index 726229b3..a1f09107 100644 --- a/Daybreak/Services/Startup/Actions/RenameInstallerAction.cs +++ b/Daybreak/Services/Startup/Actions/RenameInstallerAction.cs @@ -6,7 +6,8 @@ using System.IO; namespace Daybreak.Services.Startup.Actions; -internal sealed class RenameInstallerAction : StartupActionBase +internal sealed class RenameInstallerAction( + ILogger<RenameInstallerAction> logger) : StartupActionBase { private const string TemporaryInstallerFileNameSubPath = "Daybreak.Installer.Temp.exe"; private const string InstallerFileNameSubPath = "Daybreak.Installer.exe"; @@ -14,13 +15,7 @@ internal sealed class RenameInstallerAction : StartupActionBase private static readonly string TemporaryInstallerFileName = PathUtils.GetAbsolutePathFromRoot(TemporaryInstallerFileNameSubPath); private static readonly string InstallerFileName = PathUtils.GetAbsolutePathFromRoot(InstallerFileNameSubPath); - private readonly ILogger<RenameInstallerAction> logger; - - public RenameInstallerAction( - ILogger<RenameInstallerAction> logger) - { - this.logger = logger.ThrowIfNull(); - } + private readonly ILogger<RenameInstallerAction> logger = logger.ThrowIfNull(); public override void ExecuteOnStartup() { diff --git a/Daybreak/Services/Startup/Actions/RestoreWindowPositionStartupAction.cs b/Daybreak/Services/Startup/Actions/RestoreWindowPositionStartupAction.cs index c2527318..7a4dc2c4 100644 --- a/Daybreak/Services/Startup/Actions/RestoreWindowPositionStartupAction.cs +++ b/Daybreak/Services/Startup/Actions/RestoreWindowPositionStartupAction.cs @@ -5,8 +5,6 @@ using Daybreak.Shared.Services.Screens; using Daybreak.Views; using System.Core.Extensions; using System.Extensions; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Threading; namespace Daybreak.Services.Startup.Actions; diff --git a/Daybreak/Services/Startup/Actions/UpdateToolboxAction.cs b/Daybreak/Services/Startup/Actions/UpdateToolboxAction.cs index 6b115e08..91cf3bd0 100644 --- a/Daybreak/Services/Startup/Actions/UpdateToolboxAction.cs +++ b/Daybreak/Services/Startup/Actions/UpdateToolboxAction.cs @@ -3,22 +3,14 @@ using Daybreak.Shared.Services.Toolbox; using Microsoft.Extensions.Logging; using System.Core.Extensions; using System.Extensions.Core; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.Startup.Actions; -public sealed class UpdateToolboxAction : StartupActionBase +public sealed class UpdateToolboxAction( + IToolboxService toolboxService, + ILogger<UpdateToolboxAction> logger) : StartupActionBase { - private readonly IToolboxService toolboxService; - private readonly ILogger<UpdateToolboxAction> logger; - - public UpdateToolboxAction( - IToolboxService toolboxService, - ILogger<UpdateToolboxAction> logger) - { - this.toolboxService = toolboxService.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly IToolboxService toolboxService = toolboxService.ThrowIfNull(); + private readonly ILogger<UpdateToolboxAction> logger = logger.ThrowIfNull(); public override async Task ExecuteOnStartupAsync(CancellationToken cancellationToken) { diff --git a/Daybreak/Services/Startup/Actions/UpdateUModAction.cs b/Daybreak/Services/Startup/Actions/UpdateUModAction.cs index 6bc8fac5..4576bac5 100644 --- a/Daybreak/Services/Startup/Actions/UpdateUModAction.cs +++ b/Daybreak/Services/Startup/Actions/UpdateUModAction.cs @@ -1,19 +1,12 @@ using Daybreak.Shared.Models; using Daybreak.Shared.Services.UMod; using System.Core.Extensions; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.Startup.Actions; -internal sealed class UpdateUModAction : StartupActionBase +internal sealed class UpdateUModAction( + IUModService uModService) : StartupActionBase { - private readonly IUModService uModService; - - public UpdateUModAction( - IUModService uModService) - { - this.uModService = uModService.ThrowIfNull(); - } + private readonly IUModService uModService = uModService.ThrowIfNull(); public override async Task ExecuteOnStartupAsync(CancellationToken cancellationToken) { diff --git a/Daybreak/Services/Startup/StartupActionManager.cs b/Daybreak/Services/Startup/StartupActionManager.cs index 27840d8a..21c375e5 100644 --- a/Daybreak/Services/Startup/StartupActionManager.cs +++ b/Daybreak/Services/Startup/StartupActionManager.cs @@ -2,27 +2,17 @@ using Daybreak.Shared.Services.Startup; using Microsoft.Extensions.Logging; using Slim; -using System; -using System.Collections.Generic; using System.Core.Extensions; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Extensions.Services; namespace Daybreak.Services.Startup; -internal sealed class StartupActionManager : IStartupActionProducer, IApplicationLifetimeService +internal sealed class StartupActionManager( + IServiceManager serviceManager, + ILogger<StartupActionManager> logger) : IStartupActionProducer, IApplicationLifetimeService { - private readonly IServiceManager serviceManager; - private readonly ILogger<StartupActionManager> logger; - - public StartupActionManager( - IServiceManager serviceManager, - ILogger<StartupActionManager> logger) - { - this.serviceManager = serviceManager.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly IServiceManager serviceManager = serviceManager.ThrowIfNull(); + private readonly ILogger<StartupActionManager> logger = logger.ThrowIfNull(); public void OnClosing() { @@ -42,7 +32,7 @@ internal sealed class StartupActionManager : IStartupActionProducer, IApplicatio try { - Task.WaitAll(asyncTasks.ToArray()); + Task.WaitAll([.. asyncTasks]); } catch (Exception e) { diff --git a/Daybreak/Services/Telemetry/SwappableLoggerProvider.cs b/Daybreak/Services/Telemetry/SwappableLoggerProvider.cs index 22b485c5..ab08b69e 100644 --- a/Daybreak/Services/Telemetry/SwappableLoggerProvider.cs +++ b/Daybreak/Services/Telemetry/SwappableLoggerProvider.cs @@ -1,7 +1,5 @@ using Microsoft.Extensions.Logging; -using System; using System.Collections.Concurrent; -using System.Threading; namespace Daybreak.Services.Telemetry; diff --git a/Daybreak/Services/Telemetry/TelemetryHost.cs b/Daybreak/Services/Telemetry/TelemetryHost.cs index 97d0410d..4edebe54 100644 --- a/Daybreak/Services/Telemetry/TelemetryHost.cs +++ b/Daybreak/Services/Telemetry/TelemetryHost.cs @@ -9,7 +9,6 @@ using OpenTelemetry.Logs; using OpenTelemetry.Metrics; using OpenTelemetry.Resources; using OpenTelemetry.Trace; -using System; using System.Configuration; using System.Core.Extensions; using System.Diagnostics; diff --git a/Daybreak/Services/Themes/ThemeManager.cs b/Daybreak/Services/Themes/ThemeManager.cs index daceadf4..3748be09 100644 --- a/Daybreak/Services/Themes/ThemeManager.cs +++ b/Daybreak/Services/Themes/ThemeManager.cs @@ -5,11 +5,9 @@ using Daybreak.Shared.Models; using Daybreak.Shared.Services.Options; using Daybreak.Shared.Services.Themes; using Daybreak.Shared.Utils; -using System; using System.Configuration; using System.Core.Extensions; using System.Extensions; -using System.Linq; using System.Reflection; using System.Windows.Extensions.Services; using System.Windows.Media; diff --git a/Daybreak/Services/Toolbox/Models/DownloadLatestOperation.cs b/Daybreak/Services/Toolbox/Models/DownloadLatestOperation.cs index 493c6f79..2afaff4e 100644 --- a/Daybreak/Services/Toolbox/Models/DownloadLatestOperation.cs +++ b/Daybreak/Services/Toolbox/Models/DownloadLatestOperation.cs @@ -1,20 +1,14 @@ -using System; -using System.Core.Extensions; +using System.Core.Extensions; namespace Daybreak.Services.Toolbox.Models; internal abstract class DownloadLatestOperation { public abstract string Message { get; } - public sealed class Success : DownloadLatestOperation + public sealed class Success(string pathToDll) : DownloadLatestOperation { public override string Message => "Retrieved latest version"; - public string PathToDll { get; } - - public Success(string pathToDll) - { - this.PathToDll = pathToDll.ThrowIfNull(); - } + public string PathToDll { get; } = pathToDll.ThrowIfNull(); } public sealed class NoVersionFound : DownloadLatestOperation @@ -26,25 +20,15 @@ internal abstract class DownloadLatestOperation } } - public sealed class NonSuccessStatusCode : DownloadLatestOperation + public sealed class NonSuccessStatusCode(int statusCode) : DownloadLatestOperation { public override string Message => "Received unsuccessful status code"; - public int StatusCode { get; } - - public NonSuccessStatusCode(int statusCode) - { - this.StatusCode = statusCode; - } + public int StatusCode { get; } = statusCode; } - public sealed class ExceptionEncountered : DownloadLatestOperation + public sealed class ExceptionEncountered(Exception exception) : DownloadLatestOperation { public override string Message => "Encountered exception"; - public Exception Exception { get; } - - public ExceptionEncountered(Exception exception) - { - this.Exception = exception.ThrowIfNull(); - } + public Exception Exception { get; } = exception.ThrowIfNull(); } } diff --git a/Daybreak/Services/Toolbox/Notifications/ToolboxUpdateHandler.cs b/Daybreak/Services/Toolbox/Notifications/ToolboxUpdateHandler.cs index 28284fa4..2ee6cb3c 100644 --- a/Daybreak/Services/Toolbox/Notifications/ToolboxUpdateHandler.cs +++ b/Daybreak/Services/Toolbox/Notifications/ToolboxUpdateHandler.cs @@ -7,18 +7,12 @@ using System.Core.Extensions; using System.Extensions.Core; namespace Daybreak.Services.Toolbox.Notifications; -internal sealed class ToolboxUpdateHandler : INotificationHandler +internal sealed class ToolboxUpdateHandler( + IViewManager viewManager, + ILogger<ToolboxUpdateHandler> logger) : INotificationHandler { - private readonly IViewManager viewManager; - private readonly ILogger<ToolboxUpdateHandler> logger; - - public ToolboxUpdateHandler( - IViewManager viewManager, - ILogger<ToolboxUpdateHandler> logger) - { - this.viewManager = viewManager.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly IViewManager viewManager = viewManager.ThrowIfNull(); + private readonly ILogger<ToolboxUpdateHandler> logger = logger.ThrowIfNull(); public void OpenNotification(Notification notification) { diff --git a/Daybreak/Services/Toolbox/ToolboxService.cs b/Daybreak/Services/Toolbox/ToolboxService.cs index a95152f2..9736f133 100644 --- a/Daybreak/Services/Toolbox/ToolboxService.cs +++ b/Daybreak/Services/Toolbox/ToolboxService.cs @@ -13,19 +13,14 @@ using Daybreak.Shared.Services.Toolbox; using Daybreak.Shared.Utils; using Microsoft.Extensions.Logging; using Microsoft.Win32; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Diagnostics; using System.Extensions; using System.Extensions.Core; using System.IO; -using System.Linq; using System.Runtime.CompilerServices; using System.Text; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.Toolbox; diff --git a/Daybreak/Services/Toolbox/Utilities/IToolboxClient.cs b/Daybreak/Services/Toolbox/Utilities/IToolboxClient.cs index 12bab68a..53eea6a9 100644 --- a/Daybreak/Services/Toolbox/Utilities/IToolboxClient.cs +++ b/Daybreak/Services/Toolbox/Utilities/IToolboxClient.cs @@ -1,8 +1,6 @@ using Daybreak.Services.Toolbox.Models; using Daybreak.Shared.Models.Progress; -using Daybreak.Shared.Models.Versioning; -using System.Threading; -using System.Threading.Tasks; +using Version = Daybreak.Shared.Models.Versioning.Version; namespace Daybreak.Services.Toolbox.Utilities; internal interface IToolboxClient diff --git a/Daybreak/Services/Toolbox/Utilities/ToolboxClient.cs b/Daybreak/Services/Toolbox/Utilities/ToolboxClient.cs index c97b3aa9..344e8803 100644 --- a/Daybreak/Services/Toolbox/Utilities/ToolboxClient.cs +++ b/Daybreak/Services/Toolbox/Utilities/ToolboxClient.cs @@ -3,39 +3,27 @@ using Daybreak.Shared.Models.Github; using Daybreak.Shared.Models.Progress; using Daybreak.Shared.Services.Downloads; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Core.Extensions; using System.Extensions; using System.Extensions.Core; using System.IO; -using System.Linq; using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; using Version = Daybreak.Shared.Models.Versioning.Version; namespace Daybreak.Services.Toolbox.Utilities; -internal sealed class ToolboxClient : IToolboxClient +internal sealed class ToolboxClient( + IDownloadService downloadService, + IHttpClient<ToolboxClient> httpClient, + ILogger<ToolboxClient> logger) : IToolboxClient { private const string DllName = "GWToolboxdll.dll"; private const string TagPlaceholder = "[TAG_PLACEHOLDER]"; private const string ReleaseUrl = "https://github.com/gwdevhub/GWToolboxpp/releases/download/[TAG_PLACEHOLDER]/GWToolboxdll.dll"; private const string ReleasesUrl = "https://api.github.com/repos/gwdevhub/GWToolboxpp/git/refs/tags"; - private readonly IDownloadService downloadService; - private readonly IHttpClient<ToolboxClient> httpClient; - private readonly ILogger<ToolboxClient> logger; - - public ToolboxClient( - IDownloadService downloadService, - IHttpClient<ToolboxClient> httpClient, - ILogger<ToolboxClient> logger) - { - this.downloadService = downloadService.ThrowIfNull(); - this.httpClient = httpClient.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly IDownloadService downloadService = downloadService.ThrowIfNull(); + private readonly IHttpClient<ToolboxClient> httpClient = httpClient.ThrowIfNull(); + private readonly ILogger<ToolboxClient> logger = logger.ThrowIfNull(); public async Task<DownloadLatestOperation> DownloadLatestDll(ToolboxInstallationStatus toolboxInstallationStatus, string destinationFolder, CancellationToken cancellationToken) { @@ -105,7 +93,7 @@ internal sealed class ToolboxClient : IToolboxClient return default; } - var responseString = await getListResponse.Content.ReadAsStringAsync(); + var responseString = await getListResponse.Content.ReadAsStringAsync(cancellationToken); var releasesList = responseString.Deserialize<List<GithubRefTag>>(); var latestRelease = releasesList?.Where(t => t.Ref?.Contains("Release") is true) .Select(t => t.Ref?.Replace("refs/tags/", "")) diff --git a/Daybreak/Services/TradeChat/IPriceHistoryDatabase.cs b/Daybreak/Services/TradeChat/IPriceHistoryDatabase.cs index c1de4b82..30f62b8f 100644 --- a/Daybreak/Services/TradeChat/IPriceHistoryDatabase.cs +++ b/Daybreak/Services/TradeChat/IPriceHistoryDatabase.cs @@ -1,10 +1,6 @@ using Daybreak.Services.TradeChat.Models; using Daybreak.Shared.Models.Guildwars; using Daybreak.Shared.Models.Trade; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.TradeChat; diff --git a/Daybreak/Services/TradeChat/ITradeHistoryDatabase.cs b/Daybreak/Services/TradeChat/ITradeHistoryDatabase.cs index ab45f719..edeb67c7 100644 --- a/Daybreak/Services/TradeChat/ITradeHistoryDatabase.cs +++ b/Daybreak/Services/TradeChat/ITradeHistoryDatabase.cs @@ -1,8 +1,4 @@ using Daybreak.Services.TradeChat.Models; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.TradeChat; diff --git a/Daybreak/Services/TradeChat/ItemHashService.cs b/Daybreak/Services/TradeChat/ItemHashService.cs index a5fdbfeb..d7612976 100644 --- a/Daybreak/Services/TradeChat/ItemHashService.cs +++ b/Daybreak/Services/TradeChat/ItemHashService.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models.Guildwars; using Daybreak.Shared.Services.TradeChat; -using System.Collections.Generic; using System.Extensions; using System.Text; diff --git a/Daybreak/Services/TradeChat/Models/TraderMessageDTO.cs b/Daybreak/Services/TradeChat/Models/TraderMessageDTO.cs index ed0ae852..9eb076f9 100644 --- a/Daybreak/Services/TradeChat/Models/TraderMessageDTO.cs +++ b/Daybreak/Services/TradeChat/Models/TraderMessageDTO.cs @@ -1,5 +1,4 @@ using Squealify; -using System; namespace Daybreak.Services.TradeChat.Models; diff --git a/Daybreak/Services/TradeChat/Models/TraderMessageQueryResponse.cs b/Daybreak/Services/TradeChat/Models/TraderMessageQueryResponse.cs index 70444ca6..a9ce42c4 100644 --- a/Daybreak/Services/TradeChat/Models/TraderMessageQueryResponse.cs +++ b/Daybreak/Services/TradeChat/Models/TraderMessageQueryResponse.cs @@ -1,5 +1,4 @@ using Newtonsoft.Json; -using System.Collections.Generic; namespace Daybreak.Services.TradeChat.Models; diff --git a/Daybreak/Services/TradeChat/Models/TraderQuoteDTO.cs b/Daybreak/Services/TradeChat/Models/TraderQuoteDTO.cs index 51a7e402..48f5dc3e 100644 --- a/Daybreak/Services/TradeChat/Models/TraderQuoteDTO.cs +++ b/Daybreak/Services/TradeChat/Models/TraderQuoteDTO.cs @@ -1,5 +1,4 @@ -using System; -using Squealify; +using Squealify; namespace Daybreak.Services.TradeChat.Models; diff --git a/Daybreak/Services/TradeChat/Models/TraderQuotePayload.cs b/Daybreak/Services/TradeChat/Models/TraderQuotePayload.cs index ea954b2b..e4ed5bb8 100644 --- a/Daybreak/Services/TradeChat/Models/TraderQuotePayload.cs +++ b/Daybreak/Services/TradeChat/Models/TraderQuotePayload.cs @@ -1,6 +1,5 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -using System; namespace Daybreak.Services.TradeChat.Models; internal sealed class TraderQuotePayload diff --git a/Daybreak/Services/TradeChat/Models/TraderQuotesResponse.cs b/Daybreak/Services/TradeChat/Models/TraderQuotesResponse.cs index f3f3de2f..358a8fe7 100644 --- a/Daybreak/Services/TradeChat/Models/TraderQuotesResponse.cs +++ b/Daybreak/Services/TradeChat/Models/TraderQuotesResponse.cs @@ -1,5 +1,4 @@ using Newtonsoft.Json; -using System.Collections.Generic; namespace Daybreak.Services.TradeChat.Models; diff --git a/Daybreak/Services/TradeChat/Notifications/TradeMessageNotificationHandler.cs b/Daybreak/Services/TradeChat/Notifications/TradeMessageNotificationHandler.cs index 63a42a53..afeac1c2 100644 --- a/Daybreak/Services/TradeChat/Notifications/TradeMessageNotificationHandler.cs +++ b/Daybreak/Services/TradeChat/Notifications/TradeMessageNotificationHandler.cs @@ -9,14 +9,9 @@ using System.Extensions; namespace Daybreak.Services.TradeChat.Notifications; -internal sealed class TradeMessageNotificationHandler : INotificationHandler +internal sealed class TradeMessageNotificationHandler(IViewManager viewManager) : INotificationHandler { - private readonly IViewManager viewManager; - - public TradeMessageNotificationHandler(IViewManager viewManager) - { - this.viewManager = viewManager.ThrowIfNull(); - } + private readonly IViewManager viewManager = viewManager.ThrowIfNull(); public void OpenNotification(Notification notification) { diff --git a/Daybreak/Services/TradeChat/PriceHistoryDatabase.cs b/Daybreak/Services/TradeChat/PriceHistoryDatabase.cs index 8054f98a..d5e1737f 100644 --- a/Daybreak/Services/TradeChat/PriceHistoryDatabase.cs +++ b/Daybreak/Services/TradeChat/PriceHistoryDatabase.cs @@ -4,30 +4,18 @@ using Daybreak.Shared.Models.Trade; using Daybreak.Shared.Services.TradeChat; using Daybreak.Shared.Utils; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Core.Extensions; using System.Extensions; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.TradeChat; -internal sealed class PriceHistoryDatabase : IPriceHistoryDatabase +internal sealed class PriceHistoryDatabase( + IItemHashService itemHashService, + TradeQuoteDbContext collection, + ILogger<PriceHistoryDatabase> logger) : IPriceHistoryDatabase { - private readonly IItemHashService itemHashService; - private readonly TradeQuoteDbContext collection; - private readonly ILogger<PriceHistoryDatabase> logger; - - public PriceHistoryDatabase( - IItemHashService itemHashService, - TradeQuoteDbContext collection, - ILogger<PriceHistoryDatabase> logger) - { - this.itemHashService = itemHashService.ThrowIfNull(); - this.collection = collection.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly IItemHashService itemHashService = itemHashService.ThrowIfNull(); + private readonly TradeQuoteDbContext collection = collection.ThrowIfNull(); + private readonly ILogger<PriceHistoryDatabase> logger = logger.ThrowIfNull(); public async ValueTask<bool> AddTraderQuotes(IEnumerable<TraderQuoteDTO> traderQuotes, CancellationToken cancellationToken) { diff --git a/Daybreak/Services/TradeChat/PriceHistoryService.cs b/Daybreak/Services/TradeChat/PriceHistoryService.cs index a5531584..d511d494 100644 --- a/Daybreak/Services/TradeChat/PriceHistoryService.cs +++ b/Daybreak/Services/TradeChat/PriceHistoryService.cs @@ -5,15 +5,10 @@ using Daybreak.Shared.Models.Trade; using Daybreak.Shared.Services.TradeChat; using Microsoft.Extensions.Logging; using Newtonsoft.Json; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Extensions; -using System.Linq; using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.TradeChat; diff --git a/Daybreak/Services/TradeChat/TradeAlertingService.cs b/Daybreak/Services/TradeChat/TradeAlertingService.cs index 8ccbb0c2..8e1f40e6 100644 --- a/Daybreak/Services/TradeChat/TradeAlertingService.cs +++ b/Daybreak/Services/TradeChat/TradeAlertingService.cs @@ -9,16 +9,11 @@ using Daybreak.Shared.Services.TradeChat; using Daybreak.Shared.Utils; using Microsoft.Extensions.Logging; using Newtonsoft.Json; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Extensions; using System.Globalization; -using System.Linq; using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Extensions.Services; namespace Daybreak.Services.TradeChat; @@ -242,7 +237,7 @@ internal sealed class TradeAlertingService : ITradeAlertingService, IApplication this.options.UpdateOption(); } - private void NotifyAlertMatch(TraderMessageDTO traderMessageDTO, ITradeAlert alert) + private void NotifyAlertMatch(TraderMessageDTO traderMessageDTO, TradeAlert alert) { var traderMessage = new TraderMessage { diff --git a/Daybreak/Services/TradeChat/TradeChatService.cs b/Daybreak/Services/TradeChat/TradeChatService.cs index 88a45cd9..9dae09c9 100644 --- a/Daybreak/Services/TradeChat/TradeChatService.cs +++ b/Daybreak/Services/TradeChat/TradeChatService.cs @@ -5,19 +5,14 @@ using Daybreak.Shared.Services.TradeChat; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; -using System; -using System.Collections.Generic; using System.Core.Extensions; using System.Extensions; using System.IO; -using System.Linq; using System.Logging; using System.Net.Http; using System.Net.WebSockets; using System.Runtime.CompilerServices; using System.Text; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.TradeChat; diff --git a/Daybreak/Services/TradeChat/TradeHistoryDatabase.cs b/Daybreak/Services/TradeChat/TradeHistoryDatabase.cs index 87660a5b..57904df0 100644 --- a/Daybreak/Services/TradeChat/TradeHistoryDatabase.cs +++ b/Daybreak/Services/TradeChat/TradeHistoryDatabase.cs @@ -1,22 +1,12 @@ using Daybreak.Services.TradeChat.Models; -using System; -using System.Collections.Generic; using System.Core.Extensions; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.TradeChat; -internal sealed class TradeHistoryDatabase : ITradeHistoryDatabase +internal sealed class TradeHistoryDatabase( + TradeMessagesDbContext liteCollection) : ITradeHistoryDatabase { - private readonly TradeMessagesDbContext liteCollection; - - public TradeHistoryDatabase( - TradeMessagesDbContext liteCollection) - { - this.liteCollection = liteCollection.ThrowIfNull(); - } + private readonly TradeMessagesDbContext liteCollection = liteCollection.ThrowIfNull(); public async ValueTask<IEnumerable<TraderMessageDTO>> GetTraderMessagesSinceTime(DateTimeOffset since, CancellationToken cancellationToken) { diff --git a/Daybreak/Services/TradeChat/TradeQuoteDbContext.cs b/Daybreak/Services/TradeChat/TradeQuoteDbContext.cs index 5a21b35b..c9a29959 100644 --- a/Daybreak/Services/TradeChat/TradeQuoteDbContext.cs +++ b/Daybreak/Services/TradeChat/TradeQuoteDbContext.cs @@ -1,7 +1,5 @@ using Squealify; using System.Data.Common; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.TradeChat; public sealed class TradeQuoteDbContext(DbConnection connection) : TraderQuoteDTOTableContextBase(connection) diff --git a/Daybreak/Services/TradeChat/TraderQuoteService.cs b/Daybreak/Services/TradeChat/TraderQuoteService.cs index d44ba355..d90454ca 100644 --- a/Daybreak/Services/TradeChat/TraderQuoteService.cs +++ b/Daybreak/Services/TradeChat/TraderQuoteService.cs @@ -6,16 +6,11 @@ using Daybreak.Shared.Services.TradeChat; using Daybreak.Shared.Utils; using Microsoft.Extensions.Logging; using Newtonsoft.Json; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Extensions; -using System.Linq; using System.Logging; using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.TradeChat; @@ -250,7 +245,7 @@ internal sealed class TraderQuoteService : ITraderQuoteService private async Task<string> GetAsync(string? uri, HttpRequestMessage? httpRequestMessage, ScopedLogger<TraderQuoteService> scopedLogger, CancellationToken cancellationToken) { var response = httpRequestMessage is not null ? - await this.httpClient.SendAsync(httpRequestMessage) : + await this.httpClient.SendAsync(httpRequestMessage, cancellationToken) : await this.httpClient.GetAsync(uri!, cancellationToken); if (!response.IsSuccessStatusCode) { diff --git a/Daybreak/Services/TradeChat/WordHighlightingService.cs b/Daybreak/Services/TradeChat/WordHighlightingService.cs index d4a90646..1fc1911a 100644 --- a/Daybreak/Services/TradeChat/WordHighlightingService.cs +++ b/Daybreak/Services/TradeChat/WordHighlightingService.cs @@ -1,6 +1,5 @@ using Daybreak.Shared.Models; using Daybreak.Shared.Services.TradeChat; -using System.Collections.Generic; using System.Text.RegularExpressions; using System.Windows.Media; diff --git a/Daybreak/Services/UBlockOrigin/UBlockOriginService.cs b/Daybreak/Services/UBlockOrigin/UBlockOriginService.cs index 972aeec5..5b100d1f 100644 --- a/Daybreak/Services/UBlockOrigin/UBlockOriginService.cs +++ b/Daybreak/Services/UBlockOrigin/UBlockOriginService.cs @@ -1,13 +1,8 @@ -using System.Collections.Generic; -using System; -using System.IO; -using System.Threading; -using System.Threading.Tasks; +using System.IO; using System.Core.Extensions; using System.Net.Http; using Microsoft.Extensions.Logging; using System.Extensions; -using System.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.IO.Compression; @@ -19,7 +14,11 @@ using Daybreak.Shared.Services.Downloads; using Daybreak.Shared.Models.Progress; namespace Daybreak.Services.UBlockOrigin; -public sealed class UBlockOriginService : IBrowserExtension +public sealed class UBlockOriginService( + INotificationService notificationService, + IDownloadService downloadService, + IHttpClient<UBlockOriginService> httpClient, + ILogger<UBlockOriginService> logger) : IBrowserExtension { private const string TagPlaceholder = "[TAG_PLACEHOLDER]"; private const string ReleaseUrl = "https://github.com/gorhill/uBlock/releases/download/[TAG_PLACEHOLDER]/uBlock0_[TAG_PLACEHOLDER].chromium.zip"; @@ -33,22 +32,10 @@ public sealed class UBlockOriginService : IBrowserExtension private static volatile bool VersionUpToDate; - private readonly INotificationService notificationService; - private readonly IDownloadService downloadService; - private readonly IHttpClient<UBlockOriginService> httpClient; - private readonly ILogger<UBlockOriginService> logger; - - public UBlockOriginService( - INotificationService notificationService, - IDownloadService downloadService, - IHttpClient<UBlockOriginService> httpClient, - ILogger<UBlockOriginService> logger) - { - this.notificationService = notificationService.ThrowIfNull(); - this.downloadService = downloadService.ThrowIfNull(); - this.httpClient = httpClient.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly INotificationService notificationService = notificationService.ThrowIfNull(); + private readonly IDownloadService downloadService = downloadService.ThrowIfNull(); + private readonly IHttpClient<UBlockOriginService> httpClient = httpClient.ThrowIfNull(); + private readonly ILogger<UBlockOriginService> logger = logger.ThrowIfNull(); public string ExtensionId { get; } = "uBlock-Origin"; @@ -82,7 +69,7 @@ public sealed class UBlockOriginService : IBrowserExtension } using var cancellationTokenSource = new CancellationTokenSource(5000); - var currentVersionString = await this.GetCurrentVersion(cancellationTokenSource.Token); + var currentVersionString = await GetCurrentVersion(cancellationTokenSource.Token); var latestVersionString = await this.GetLatestVersion(cancellationTokenSource.Token); if (latestVersionString is null) { @@ -138,7 +125,34 @@ public sealed class UBlockOriginService : IBrowserExtension return destinationPath; } - private async Task<string?> GetCurrentVersion(CancellationToken cancellationToken) + private async Task<string?> GetLatestVersion(CancellationToken cancellationToken) + { + var scopedLogger = this.logger.CreateScopedLogger(nameof(this.GetLatestVersion), string.Empty); + scopedLogger.LogDebug("Retrieving version list"); + var getListResponse = await this.httpClient.GetAsync(ReleasesUrl, cancellationToken); + if (!getListResponse.IsSuccessStatusCode) + { + scopedLogger.LogError($"Received non success status code [{getListResponse.StatusCode}]"); + return default; + } + + var responseString = await getListResponse.Content.ReadAsStringAsync(cancellationToken); + var releasesList = responseString.Deserialize<List<GithubRefTag>>(); + var latestRelease = releasesList? + .Select(t => t.Ref?.Replace("refs/tags/", "")) + .OfType<string>() + .Where(v => !v.Contains('b') && !v.Contains("rc")) + .LastOrDefault(); + if (latestRelease is not string tag) + { + scopedLogger.LogError("Could not parse version list. No latest version found"); + return default; + } + + return latestRelease; + } + + private static async Task<string?> GetCurrentVersion(CancellationToken cancellationToken) { var manifestFilePath = Path.GetFullPath(InstallationPath, Path.Combine(InstallationFolderName, "manifest.json")); var fileInfo = new FileInfo(manifestFilePath); @@ -157,31 +171,4 @@ public sealed class UBlockOriginService : IBrowserExtension return value; } - - private async Task<string?> GetLatestVersion(CancellationToken cancellationToken) - { - var scopedLogger = this.logger.CreateScopedLogger(nameof(this.GetLatestVersion), string.Empty); - scopedLogger.LogDebug("Retrieving version list"); - var getListResponse = await this.httpClient.GetAsync(ReleasesUrl, cancellationToken); - if (!getListResponse.IsSuccessStatusCode) - { - scopedLogger.LogError($"Received non success status code [{getListResponse.StatusCode}]"); - return default; - } - - var responseString = await getListResponse.Content.ReadAsStringAsync(); - var releasesList = responseString.Deserialize<List<GithubRefTag>>(); - var latestRelease = releasesList? - .Select(t => t.Ref?.Replace("refs/tags/", "")) - .OfType<string>() - .Where(v => !v.Contains("b") && !v.Contains("rc")) - .LastOrDefault(); - if (latestRelease is not string tag) - { - scopedLogger.LogError("Could not parse version list. No latest version found"); - return default; - } - - return latestRelease; - } } diff --git a/Daybreak/Services/UMod/UModService.cs b/Daybreak/Services/UMod/UModService.cs index 806296a5..99818bc6 100644 --- a/Daybreak/Services/UMod/UModService.cs +++ b/Daybreak/Services/UMod/UModService.cs @@ -10,17 +10,12 @@ using Daybreak.Shared.Services.Notifications; using Daybreak.Shared.Services.UMod; using Daybreak.Shared.Utils; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Diagnostics; using System.Extensions; using System.IO; -using System.Linq; using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; namespace Daybreak.Services.UMod; diff --git a/Daybreak/Services/Updater/ApplicationUpdater.cs b/Daybreak/Services/Updater/ApplicationUpdater.cs index c0ed1b13..198620f8 100644 --- a/Daybreak/Services/Updater/ApplicationUpdater.cs +++ b/Daybreak/Services/Updater/ApplicationUpdater.cs @@ -10,20 +10,15 @@ using Daybreak.Shared.Services.Updater; using Daybreak.Shared.Services.Updater.PostUpdate; using Daybreak.Shared.Utils; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Configuration; using System.Core.Extensions; using System.Data; using System.Diagnostics; using System.Extensions; using System.IO; -using System.Linq; using System.Net.Http; using System.Net.Http.Json; using System.Text; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Extensions.Services; using UpdateStatus = Daybreak.Shared.Models.Progress.UpdateStatus; using Version = Daybreak.Shared.Models.Versioning.Version; @@ -133,10 +128,10 @@ internal sealed class ApplicationUpdater( { var serializedList = await response.Content.ReadAsStringAsync(); var versionList = serializedList.Deserialize<GithubRefTag[]>(); - return versionList!.Select(v => v.Ref!.Remove(0, RefTagPrefix.Length)).Select(v => new Version(v)); + return versionList!.Select(v => v.Ref![RefTagPrefix.Length..]).Select(v => new Version(v)); } - return new List<Version>(); + return []; } public async Task<string?> GetChangelog(Version version) @@ -247,7 +242,6 @@ internal sealed class ApplicationUpdater( { return false; } - }) .Where(m => { @@ -314,8 +308,8 @@ internal sealed class ApplicationUpdater( var fileSize = file.Size; while (fileSize > 0) { - var readBytes = await downloadStream.ReadAsync(downloadBuffer, 0, downloadBuffer.Length); - await packageStream.WriteAsync(downloadBuffer, 0, readBytes); + var readBytes = await downloadStream.ReadAsync(downloadBuffer); + await packageStream.WriteAsync(downloadBuffer.AsMemory(0, readBytes)); fileSize -= readBytes; downloaded += readBytes; diff --git a/Daybreak/Services/Updater/PostUpdate/PostUpdateActionManager.cs b/Daybreak/Services/Updater/PostUpdate/PostUpdateActionManager.cs index f86562d0..811fe59f 100644 --- a/Daybreak/Services/Updater/PostUpdate/PostUpdateActionManager.cs +++ b/Daybreak/Services/Updater/PostUpdate/PostUpdateActionManager.cs @@ -2,23 +2,16 @@ using Daybreak.Shared.Services.Updater.PostUpdate; using Microsoft.Extensions.Logging; using Slim; -using System.Collections.Generic; using System.Core.Extensions; namespace Daybreak.Services.Updater.PostUpdate; -internal sealed class PostUpdateActionManager : IPostUpdateActionManager +internal sealed class PostUpdateActionManager( + IServiceManager serviceManager, + ILogger<PostUpdateActionManager> logger) : IPostUpdateActionManager { - private readonly IServiceManager serviceManager; - private readonly ILogger<PostUpdateActionManager> logger; - - public PostUpdateActionManager( - IServiceManager serviceManager, - ILogger<PostUpdateActionManager> logger) - { - this.serviceManager = serviceManager.ThrowIfNull(); - this.logger = logger.ThrowIfNull(); - } + private readonly IServiceManager serviceManager = serviceManager.ThrowIfNull(); + private readonly ILogger<PostUpdateActionManager> logger = logger.ThrowIfNull(); public void AddPostUpdateAction<T>() where T : PostUpdateActionBase diff --git a/Daybreak/Services/Updater/UpdateNotificationHandler.cs b/Daybreak/Services/Updater/UpdateNotificationHandler.cs index fc1c007e..3e72d8a1 100644 --- a/Daybreak/Services/Updater/UpdateNotificationHandler.cs +++ b/Daybreak/Services/Updater/UpdateNotificationHandler.cs @@ -1,19 +1,14 @@ using Daybreak.Shared.Models.Notifications; using Daybreak.Shared.Models.Notifications.Handling; -using Daybreak.Shared.Models.Versioning; using Daybreak.Shared.Services.Navigation; using Daybreak.Views; using System.Core.Extensions; +using Version = Daybreak.Shared.Models.Versioning.Version; namespace Daybreak.Services.Updater; -internal sealed class UpdateNotificationHandler : INotificationHandler +internal sealed class UpdateNotificationHandler(IViewManager viewManager) : INotificationHandler { - private readonly IViewManager viewManager; - - public UpdateNotificationHandler(IViewManager viewManager) - { - this.viewManager = viewManager.ThrowIfNull(); - } + private readonly IViewManager viewManager = viewManager.ThrowIfNull(); public void OpenNotification(Notification notification) { diff --git a/Daybreak/Services/Window/WindowEventsHook.cs b/Daybreak/Services/Window/WindowEventsHook.cs index b28d3828..d16a4d58 100644 --- a/Daybreak/Services/Window/WindowEventsHook.cs +++ b/Daybreak/Services/Window/WindowEventsHook.cs @@ -1,7 +1,5 @@ using Daybreak.Behaviors; using Daybreak.Shared.Services.Window; -using System; -using System.Collections.Generic; using System.Core.Extensions; using System.Extensions; using System.Windows; diff --git a/Daybreak/Views/BuildsListView.xaml.cs b/Daybreak/Views/BuildsListView.xaml.cs index f6e93b77..e91f129e 100644 --- a/Daybreak/Views/BuildsListView.xaml.cs +++ b/Daybreak/Views/BuildsListView.xaml.cs @@ -4,12 +4,8 @@ using Daybreak.Shared.Services.BuildTemplates; using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.Toolbox; using Daybreak.Shared.Utils; -using System; -using System.Collections.Generic; using System.Core.Extensions; using System.Extensions; -using System.Linq; -using System.Threading; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Views/BuildsSynchronizationView.xaml.cs b/Daybreak/Views/BuildsSynchronizationView.xaml.cs index 35cf19ef..efc3ba35 100644 --- a/Daybreak/Views/BuildsSynchronizationView.xaml.cs +++ b/Daybreak/Views/BuildsSynchronizationView.xaml.cs @@ -4,18 +4,10 @@ using System.Core.Extensions; using System.Windows; using System.Windows.Extensions; using System.Windows.Controls; -using System.Collections.ObjectModel; -using Daybreak.Services.Graph.Models; using System.Extensions; -using System.Threading.Tasks; -using System; -using System.Linq; -using System.Collections.Generic; using Daybreak.Shared.Services.BuildTemplates; using Daybreak.Shared.Models; using Daybreak.Shared.Services.Navigation; -using System.Threading; -using System.Windows.Forms.VisualStyles; namespace Daybreak.Views; diff --git a/Daybreak/Views/Copy/GuildwarsCopySelectionView.xaml.cs b/Daybreak/Views/Copy/GuildwarsCopySelectionView.xaml.cs index d8ec4cb4..fe4c4aac 100644 --- a/Daybreak/Views/Copy/GuildwarsCopySelectionView.xaml.cs +++ b/Daybreak/Views/Copy/GuildwarsCopySelectionView.xaml.cs @@ -3,8 +3,6 @@ using Daybreak.Shared.Models.Onboarding; using Daybreak.Shared.Services.ExecutableManagement; using Daybreak.Shared.Services.Navigation; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Core.Extensions; using System.Extensions; using System.Windows; diff --git a/Daybreak/Views/Copy/GuildwarsCopyView.xaml.cs b/Daybreak/Views/Copy/GuildwarsCopyView.xaml.cs index a5ac2869..45b7ea49 100644 --- a/Daybreak/Views/Copy/GuildwarsCopyView.xaml.cs +++ b/Daybreak/Views/Copy/GuildwarsCopyView.xaml.cs @@ -3,11 +3,9 @@ using Daybreak.Shared.Services.Guildwars; using Daybreak.Shared.Services.Navigation; using Daybreak.Views.Launch; using Microsoft.Extensions.Logging; -using System; using System.ComponentModel; using System.Core.Extensions; using System.Extensions; -using System.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Views/EventCalendarView.xaml.cs b/Daybreak/Views/EventCalendarView.xaml.cs index 06a64fea..f838a5a2 100644 --- a/Daybreak/Views/EventCalendarView.xaml.cs +++ b/Daybreak/Views/EventCalendarView.xaml.cs @@ -1,11 +1,9 @@ using Daybreak.Models; using Daybreak.Shared.Models.Guildwars; using Daybreak.Shared.Services.Events; -using System; using System.Collections.ObjectModel; using System.Core.Extensions; using System.Extensions; -using System.Linq; using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Input; diff --git a/Daybreak/Views/FocusView.xaml b/Daybreak/Views/FocusView.xaml index a176899d..bccc9e12 100644 --- a/Daybreak/Views/FocusView.xaml +++ b/Daybreak/Views/FocusView.xaml @@ -39,7 +39,6 @@ <components:CharacterComponent Margin="0, 0, 0, 10" DataContext="{Binding ElementName=_this, Path=CharacterSelectComponentContext, Mode=OneWay}" Visibility="{Binding ElementName=_this, Path=MainPlayerDataValid, Mode=OneWay, Converter={StaticResource BooleanToVisibilityConverter}}" - NavigateToClicked="Component_NavigateToClicked" SwitchCharacterClicked="CharacterSelectComponent_SwitchCharacterClicked"/> <Grid Visibility="{Binding ElementName=_this, Path=VanquishComponentContext.Vanquishing, Mode=OneWay, Converter={StaticResource BooleanToVisibilityConverter}}" Margin="0, 0, 0, 10"> diff --git a/Daybreak/Views/FocusView.xaml.cs b/Daybreak/Views/FocusView.xaml.cs index a7a016de..774e98bc 100644 --- a/Daybreak/Views/FocusView.xaml.cs +++ b/Daybreak/Views/FocusView.xaml.cs @@ -15,14 +15,10 @@ using Daybreak.Shared.Services.Screens; using Daybreak.Shared.Services.Window; using Daybreak.Views.Trade; using Microsoft.Extensions.Logging; -using System; using System.Configuration; using System.Core.Extensions; using System.Extensions; using System.Extensions.Core; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; @@ -291,6 +287,7 @@ public partial class FocusView : UserControl { if (this.DataContext is not FocusViewContext context || context.ApiContext is not ScopedApiContext apiContext || + e is null || e.CharacterName.IsNullOrWhiteSpace()) { return; @@ -326,7 +323,6 @@ public partial class FocusView : UserControl { this.viewManager.ShowView<TeamBuildTemplateView>(e.Build); } - } private void Component_NavigateToClicked(object _, string e) @@ -351,7 +347,7 @@ public partial class FocusView : UserControl return; } - var indexOfSeparator = e.IndexOf("["); + var indexOfSeparator = e.IndexOf('['); indexOfSeparator = indexOfSeparator >= 0 ? indexOfSeparator : e.Length; var curedNpcName = e[..indexOfSeparator]; var npcUrl = WikiUrl.Replace(NamePlaceholder, curedNpcName); diff --git a/Daybreak/Views/GraphAuthorizationView.xaml.cs b/Daybreak/Views/GraphAuthorizationView.xaml.cs index ec7b0bd2..f78186c7 100644 --- a/Daybreak/Views/GraphAuthorizationView.xaml.cs +++ b/Daybreak/Views/GraphAuthorizationView.xaml.cs @@ -3,7 +3,6 @@ using Daybreak.Services.Graph.Models; using Daybreak.Shared.Services.Navigation; using Microsoft.Extensions.Logging; using System.Core.Extensions; -using System.Threading; using System.Windows; using System.Windows.Controls; diff --git a/Daybreak/Views/Installation/GuildWarsDownloadSelectionView.xaml.cs b/Daybreak/Views/Installation/GuildWarsDownloadSelectionView.xaml.cs index b62dba11..e504941f 100644 --- a/Daybreak/Views/Installation/GuildWarsDownloadSelectionView.xaml.cs +++ b/Daybreak/Views/Installation/GuildWarsDownloadSelectionView.xaml.cs @@ -4,7 +4,6 @@ using Daybreak.Shared.Services.Guildwars; using Daybreak.Shared.Services.Navigation; using Microsoft.Extensions.Logging; using System.Core.Extensions; -using System.Threading; using System.Windows; using System.Windows.Forms; diff --git a/Daybreak/Views/Installation/GuildwarsDownloadView.xaml.cs b/Daybreak/Views/Installation/GuildwarsDownloadView.xaml.cs index fae88c29..51b77dc7 100644 --- a/Daybreak/Views/Installation/GuildwarsDownloadView.xaml.cs +++ b/Daybreak/Views/Installation/GuildwarsDownloadView.xaml.cs @@ -2,7 +2,6 @@ using System.Windows; using System.Core.Extensions; using System.Windows.Extensions; -using System.Threading; using System.Windows.Controls; using Daybreak.Services.Guildwars.Models; using Daybreak.Shared.Services.Menu; @@ -48,7 +47,7 @@ public partial class GuildWarsDownloadView : UserControl this.InitializeComponent(); } - private void DownloadStatus_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + private void DownloadStatus_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) { var newDescription = this.installationStatus?.CurrentStep.Description ?? string.Empty; var newProgressValue = (int)(this.installationStatus?.CurrentStep.As<DownloadStatus.DownloadProgressStep>()?.Progress * 100 ?? 0); @@ -109,7 +108,6 @@ public partial class GuildWarsDownloadView : UserControl this.cancellationTokenSource = null; } -#pragma warning disable CS8622 // Nullability of reference types in type of parameter doesn't match the target delegate (possibly because of nullability attributes). if (this.installationStatus is not null) { this.installationStatus.PropertyChanged -= this.DownloadStatus_PropertyChanged; @@ -120,6 +118,5 @@ public partial class GuildWarsDownloadView : UserControl this.installationStatus = context.GuildwarsInstallationStatus; this.cancellationTokenSource = context.CancellationTokenSource; this.installationStatus.PropertyChanged += this.DownloadStatus_PropertyChanged; -#pragma warning restore CS8622 // Nullability of reference types in type of parameter doesn't match the target delegate (possibly because of nullability attributes). } } diff --git a/Daybreak/Views/Launch/AccountsView.xaml.cs b/Daybreak/Views/Launch/AccountsView.xaml.cs index 331bdb97..99783e50 100644 --- a/Daybreak/Views/Launch/AccountsView.xaml.cs +++ b/Daybreak/Views/Launch/AccountsView.xaml.cs @@ -2,11 +2,9 @@ using Daybreak.Shared.Models; using Daybreak.Shared.Services.Credentials; using Daybreak.Shared.Services.Navigation; -using System; using System.Collections.ObjectModel; using System.Core.Extensions; using System.Extensions; -using System.Linq; using System.Windows.Controls; namespace Daybreak.Views.Launch; @@ -45,7 +43,7 @@ public partial class AccountsView : UserControl private void SaveButton_Clicked(object sender, EventArgs e) { - this.credentialManager.StoreCredentials(this.Accounts.ToList()); + this.credentialManager.StoreCredentials([.. this.Accounts]); this.viewManager.ShowView<LauncherView>(); } diff --git a/Daybreak/Views/Launch/ExecutablesView.xaml.cs b/Daybreak/Views/Launch/ExecutablesView.xaml.cs index ef030af5..adf52775 100644 --- a/Daybreak/Views/Launch/ExecutablesView.xaml.cs +++ b/Daybreak/Views/Launch/ExecutablesView.xaml.cs @@ -1,11 +1,9 @@ using Daybreak.Shared.Models; using Daybreak.Shared.Services.ExecutableManagement; using Daybreak.Shared.Services.Navigation; -using System; using System.Collections.ObjectModel; using System.Core.Extensions; using System.Extensions; -using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Views/Launch/LaunchConfigurationView.xaml.cs b/Daybreak/Views/Launch/LaunchConfigurationView.xaml.cs index 3499ec15..c180022f 100644 --- a/Daybreak/Views/Launch/LaunchConfigurationView.xaml.cs +++ b/Daybreak/Views/Launch/LaunchConfigurationView.xaml.cs @@ -5,11 +5,9 @@ using Daybreak.Shared.Services.ExecutableManagement; using Daybreak.Shared.Services.LaunchConfigurations; using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.Notifications; -using System; using System.Collections.ObjectModel; using System.Core.Extensions; using System.Extensions; -using System.Linq; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Views/Launch/LaunchConfigurationsView.xaml.cs b/Daybreak/Views/Launch/LaunchConfigurationsView.xaml.cs index 730dc4cf..bdfc135e 100644 --- a/Daybreak/Views/Launch/LaunchConfigurationsView.xaml.cs +++ b/Daybreak/Views/Launch/LaunchConfigurationsView.xaml.cs @@ -1,11 +1,9 @@ using Daybreak.Shared.Models.LaunchConfigurations; using Daybreak.Shared.Services.LaunchConfigurations; using Daybreak.Shared.Services.Navigation; -using System; using System.Collections.ObjectModel; using System.Core.Extensions; using System.Extensions; -using System.Linq; using System.Windows; using System.Windows.Controls; diff --git a/Daybreak/Views/LauncherView.xaml.cs b/Daybreak/Views/LauncherView.xaml.cs index c9cc32e0..43f6d9e9 100644 --- a/Daybreak/Views/LauncherView.xaml.cs +++ b/Daybreak/Views/LauncherView.xaml.cs @@ -14,16 +14,11 @@ using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.Notifications; using Daybreak.Shared.Services.Onboarding; using Daybreak.Shared.Services.Screens; -using System; -using System.Collections.Generic; using System.Collections.ObjectModel; using System.Configuration; using System.Core.Extensions; using System.Diagnostics; using System.Extensions; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; @@ -515,7 +510,7 @@ public partial class LauncherView : UserControl description: "The mods have changed since Guild Wars was launched. Please click 'Reapply mods' to reapply the mod configuration"); } - if (mods.Any()) + if (mods.Count > 0) { await this.Dispatcher.InvokeAsync(() => this.CanReapply = true); } diff --git a/Daybreak/Views/LogsView.xaml.cs b/Daybreak/Views/LogsView.xaml.cs index ab86de2c..1c62858c 100644 --- a/Daybreak/Views/LogsView.xaml.cs +++ b/Daybreak/Views/LogsView.xaml.cs @@ -4,13 +4,9 @@ using ICSharpCode.AvalonEdit.Highlighting; using ICSharpCode.AvalonEdit.Search; using Microsoft.Extensions.Logging; using Microsoft.Win32; -using System; using System.Extensions; using System.IO; -using System.Linq; using System.Text; -using System.Threading; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; @@ -68,7 +64,7 @@ public partial class LogsView : UserControl this.cachedText.Append(adornedMessage); } - await this.WriteLogs(true, logs.TakeLast(MaximumLookbackPeriod).ToArray()); + await this.WriteLogs(true, [.. logs.TakeLast(MaximumLookbackPeriod)]); } private async Task WriteLogs(bool forceScrollToEnd, params Log[] logs) diff --git a/Daybreak/Views/MetricsView.xaml.cs b/Daybreak/Views/MetricsView.xaml.cs index 58e82eb1..e6d9055f 100644 --- a/Daybreak/Views/MetricsView.xaml.cs +++ b/Daybreak/Views/MetricsView.xaml.cs @@ -1,18 +1,14 @@ using Daybreak.Shared.Models.Metrics; using Daybreak.Shared.Services.Metrics; -using LiveChartsCore; using LiveChartsCore.SkiaSharpView; using LiveChartsCore.SkiaSharpView.Painting; using LiveChartsCore.SkiaSharpView.VisualElements; using LiveChartsCore.SkiaSharpView.WPF; using SkiaSharp; -using System; -using System.Collections.Generic; using System.Collections.ObjectModel; using System.Core.Extensions; using System.Data; using System.Extensions; -using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Media; diff --git a/Daybreak/Views/NotificationsView.xaml.cs b/Daybreak/Views/NotificationsView.xaml.cs index 8c20d25b..557f799e 100644 --- a/Daybreak/Views/NotificationsView.xaml.cs +++ b/Daybreak/Views/NotificationsView.xaml.cs @@ -1,13 +1,9 @@ using Daybreak.Shared.Models.Notifications; using Daybreak.Shared.Services.Notifications; using Microsoft.Extensions.Logging; -using System; using System.Collections.ObjectModel; using System.Core.Extensions; using System.Extensions; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Controls; using System.Windows.Extensions; @@ -59,11 +55,11 @@ public partial class NotificationsView : UserControl { var unsortedNotifications = this.ShowAll ? (await this.notificationProducer.GetAllNotifications(cancellationToken)).ToList() : - (await this.notificationProducer.GetPendingNotifications(cancellationToken)).ToList(); + [.. await this.notificationProducer.GetPendingNotifications(cancellationToken)]; var notifications = this.Descending ? unsortedNotifications.OrderByDescending(n => n.CreationTime).Take(100).ToList() : - unsortedNotifications.OrderBy(n => n.CreationTime).Take(100).ToList(); - using var context = await this.semaphoreSlim.Acquire(); + [.. unsortedNotifications.OrderBy(n => n.CreationTime).Take(100)]; + using var context = await this.semaphoreSlim.Acquire(cancellationToken); var notificationsToAdd = notifications.Where(n => this.Notifications.None(n2 => n2.Id == n.Id)).ToList(); var notificationsToRemove = this.Notifications.Where(n => notifications.None(n2 => n2.Id == n.Id)).ToList(); foreach (var notification in notificationsToRemove) @@ -115,7 +111,7 @@ public partial class NotificationsView : UserControl this.Descending = !this.Descending; var sortedNotification = this.Descending ? this.Notifications.OrderByDescending(n => n.CreationTime).ToList() : - this.Notifications.OrderBy(n => n.CreationTime).ToList(); + [.. this.Notifications.OrderBy(n => n.CreationTime)]; this.Notifications.ClearAnd().AddRange(sortedNotification); } } @@ -128,7 +124,7 @@ public partial class NotificationsView : UserControl (await this.notificationProducer.GetPendingNotifications(CancellationToken.None)); var sortedNotification = this.Descending ? unsortedNotifications.OrderByDescending(n => n.CreationTime).ToList() : - unsortedNotifications.OrderBy(n => n.CreationTime).ToList(); + [.. unsortedNotifications.OrderBy(n => n.CreationTime)]; this.Notifications.ClearAnd().AddRange(sortedNotification); } } diff --git a/Daybreak/Views/Onboarding/DXVK/DXVKInstallationChoiceView.xaml.cs b/Daybreak/Views/Onboarding/DXVK/DXVKInstallationChoiceView.xaml.cs index eee87d53..b3513c26 100644 --- a/Daybreak/Views/Onboarding/DXVK/DXVKInstallationChoiceView.xaml.cs +++ b/Daybreak/Views/Onboarding/DXVK/DXVKInstallationChoiceView.xaml.cs @@ -1,5 +1,4 @@ -using Daybreak.Shared.Models; -using Daybreak.Shared.Services.Navigation; +using Daybreak.Shared.Services.Navigation; using Microsoft.Extensions.Logging; using System.Core.Extensions; using System.Extensions; diff --git a/Daybreak/Views/Onboarding/DXVK/DXVKInstallingView.xaml.cs b/Daybreak/Views/Onboarding/DXVK/DXVKInstallingView.xaml.cs index 6824d9e1..94b50776 100644 --- a/Daybreak/Views/Onboarding/DXVK/DXVKInstallingView.xaml.cs +++ b/Daybreak/Views/Onboarding/DXVK/DXVKInstallingView.xaml.cs @@ -4,7 +4,6 @@ using Daybreak.Shared.Services.Navigation; using Microsoft.Extensions.Logging; using System.Core.Extensions; using System.Extensions; -using System.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Views/Onboarding/DirectSong/DirectSongInstallationView.xaml.cs b/Daybreak/Views/Onboarding/DirectSong/DirectSongInstallationView.xaml.cs index a6b11935..659da186 100644 --- a/Daybreak/Views/Onboarding/DirectSong/DirectSongInstallationView.xaml.cs +++ b/Daybreak/Views/Onboarding/DirectSong/DirectSongInstallationView.xaml.cs @@ -2,10 +2,8 @@ using Daybreak.Shared.Services.DirectSong; using Daybreak.Shared.Services.Navigation; using Microsoft.Extensions.Logging; -using System; using System.Core.Extensions; using System.Extensions; -using System.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Views/Onboarding/LauncherOnboardingView.xaml.cs b/Daybreak/Views/Onboarding/LauncherOnboardingView.xaml.cs index 9f556df5..267217c6 100644 --- a/Daybreak/Views/Onboarding/LauncherOnboardingView.xaml.cs +++ b/Daybreak/Views/Onboarding/LauncherOnboardingView.xaml.cs @@ -4,7 +4,6 @@ using Daybreak.Shared.Services.Menu; using Daybreak.Shared.Services.Navigation; using Daybreak.Views.Launch; using Microsoft.Extensions.Logging; -using System; using System.Core.Extensions; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Views/Onboarding/ReShade/ReShadeBrowserView.xaml.cs b/Daybreak/Views/Onboarding/ReShade/ReShadeBrowserView.xaml.cs index 842382f2..f5404df3 100644 --- a/Daybreak/Views/Onboarding/ReShade/ReShadeBrowserView.xaml.cs +++ b/Daybreak/Views/Onboarding/ReShade/ReShadeBrowserView.xaml.cs @@ -2,10 +2,8 @@ using Daybreak.Shared.Services.Notifications; using Daybreak.Shared.Services.UMod; using Daybreak.Utils; -using System; using System.Core.Extensions; using System.IO; -using System.Linq; using System.Windows.Controls; namespace Daybreak.Views.Onboarding.ReShade; @@ -14,7 +12,7 @@ namespace Daybreak.Views.Onboarding.ReShade; /// </summary> public partial class ReShadeBrowserView : UserControl { - private static readonly string[] WhitelistedExtensions = new[] { ".tpf", ".zip" }; + private static readonly string[] WhitelistedExtensions = [".tpf", ".zip"]; private readonly INotificationService notificationService; private readonly IUModService uModService; @@ -52,6 +50,7 @@ public partial class ReShadeBrowserView : UserControl description: $"Downloading uMod mod to {e.ResultingFilePath}"); await this.Browser.WebBrowser.ExecuteScriptAsync(Scripts.CreateAlert($"Downloading {Path.GetFileName(e.ResultingFilePath)}")); } + return; } diff --git a/Daybreak/Views/Onboarding/ReShade/ReShadeConfigView.xaml.cs b/Daybreak/Views/Onboarding/ReShade/ReShadeConfigView.xaml.cs index 21b41360..f5427c42 100644 --- a/Daybreak/Views/Onboarding/ReShade/ReShadeConfigView.xaml.cs +++ b/Daybreak/Views/Onboarding/ReShade/ReShadeConfigView.xaml.cs @@ -1,7 +1,6 @@ using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.ReShade; using System.Core.Extensions; -using System.Threading; using System.Windows.Controls; namespace Daybreak.Views.Onboarding.ReShade; diff --git a/Daybreak/Views/Onboarding/ReShade/ReShadeInstallationChoiceView.xaml.cs b/Daybreak/Views/Onboarding/ReShade/ReShadeInstallationChoiceView.xaml.cs index 2e585f43..e56ff1e5 100644 --- a/Daybreak/Views/Onboarding/ReShade/ReShadeInstallationChoiceView.xaml.cs +++ b/Daybreak/Views/Onboarding/ReShade/ReShadeInstallationChoiceView.xaml.cs @@ -2,7 +2,6 @@ using Daybreak.Shared.Services.ReShade; using Microsoft.Extensions.Logging; using System.Core.Extensions; -using System.Threading; using System.Windows.Controls; namespace Daybreak.Views.Onboarding.ReShade; diff --git a/Daybreak/Views/Onboarding/ReShade/ReShadeInstallingView.xaml.cs b/Daybreak/Views/Onboarding/ReShade/ReShadeInstallingView.xaml.cs index 482298ef..ae4fc9a3 100644 --- a/Daybreak/Views/Onboarding/ReShade/ReShadeInstallingView.xaml.cs +++ b/Daybreak/Views/Onboarding/ReShade/ReShadeInstallingView.xaml.cs @@ -4,7 +4,6 @@ using Daybreak.Shared.Services.ReShade; using Microsoft.Extensions.Logging; using System.Core.Extensions; using System.Extensions; -using System.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Views/Onboarding/ReShade/ReShadeMainView.xaml.cs b/Daybreak/Views/Onboarding/ReShade/ReShadeMainView.xaml.cs index 526d8e53..e6f68b3f 100644 --- a/Daybreak/Views/Onboarding/ReShade/ReShadeMainView.xaml.cs +++ b/Daybreak/Views/Onboarding/ReShade/ReShadeMainView.xaml.cs @@ -7,7 +7,6 @@ using System.Collections.ObjectModel; using System.Configuration; using System.Core.Extensions; using System.Extensions; -using System.Threading; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Views/Onboarding/ReShade/ReShadePresetView.xaml.cs b/Daybreak/Views/Onboarding/ReShade/ReShadePresetView.xaml.cs index ad3c9134..d3b8d7a6 100644 --- a/Daybreak/Views/Onboarding/ReShade/ReShadePresetView.xaml.cs +++ b/Daybreak/Views/Onboarding/ReShade/ReShadePresetView.xaml.cs @@ -1,7 +1,6 @@ using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.ReShade; using System.Core.Extensions; -using System.Threading; using System.Windows.Controls; namespace Daybreak.Views.Onboarding.ReShade; diff --git a/Daybreak/Views/Onboarding/ReShade/ReShadeStockEffectsSelectorView.xaml.cs b/Daybreak/Views/Onboarding/ReShade/ReShadeStockEffectsSelectorView.xaml.cs index 3094eeb1..749a67ff 100644 --- a/Daybreak/Views/Onboarding/ReShade/ReShadeStockEffectsSelectorView.xaml.cs +++ b/Daybreak/Views/Onboarding/ReShade/ReShadeStockEffectsSelectorView.xaml.cs @@ -3,7 +3,6 @@ using Daybreak.Shared.Services.ReShade; using System.Collections.ObjectModel; using System.Core.Extensions; using System.Extensions; -using System.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Views/Onboarding/Toolbox/ToolboxSwitchView.xaml.cs b/Daybreak/Views/Onboarding/Toolbox/ToolboxSwitchView.xaml.cs index c64e7085..0c8758be 100644 --- a/Daybreak/Views/Onboarding/Toolbox/ToolboxSwitchView.xaml.cs +++ b/Daybreak/Views/Onboarding/Toolbox/ToolboxSwitchView.xaml.cs @@ -2,7 +2,6 @@ using Daybreak.Shared.Services.Toolbox; using Microsoft.Extensions.Logging; using System.Core.Extensions; -using System.Threading; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Views/Onboarding/UMod/UModBrowserView.xaml.cs b/Daybreak/Views/Onboarding/UMod/UModBrowserView.xaml.cs index d1865f93..c59b043f 100644 --- a/Daybreak/Views/Onboarding/UMod/UModBrowserView.xaml.cs +++ b/Daybreak/Views/Onboarding/UMod/UModBrowserView.xaml.cs @@ -2,10 +2,8 @@ using Daybreak.Shared.Services.Notifications; using Daybreak.Shared.Services.UMod; using Daybreak.Utils; -using System; using System.Core.Extensions; using System.IO; -using System.Linq; using System.Windows.Controls; namespace Daybreak.Views.Onboarding.UMod; @@ -14,7 +12,7 @@ namespace Daybreak.Views.Onboarding.UMod; /// </summary> public partial class UModBrowserView : UserControl { - private static readonly string[] WhitelistedExtensions = new[] { ".tpf", ".zip" }; + private static readonly string[] WhitelistedExtensions = [".tpf", ".zip"]; private readonly INotificationService notificationService; private readonly IUModService uModService; @@ -52,6 +50,7 @@ public partial class UModBrowserView : UserControl description: $"Downloading uMod mod to {e.ResultingFilePath}"); await this.Browser.WebBrowser.ExecuteScriptAsync(Scripts.CreateAlert($"Downloading {Path.GetFileName(e.ResultingFilePath)}")); } + return; } diff --git a/Daybreak/Views/Onboarding/UMod/UModMainView.xaml.cs b/Daybreak/Views/Onboarding/UMod/UModMainView.xaml.cs index e03a33f0..152d38bd 100644 --- a/Daybreak/Views/Onboarding/UMod/UModMainView.xaml.cs +++ b/Daybreak/Views/Onboarding/UMod/UModMainView.xaml.cs @@ -3,14 +3,11 @@ using Daybreak.Shared.Models.UMod; using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.UMod; using Microsoft.Win32; -using System; -using System.Collections.Generic; using System.Collections.ObjectModel; using System.Configuration; using System.Core.Extensions; using System.Extensions; using System.IO; -using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; @@ -33,7 +30,7 @@ public partial class UModMainView : UserControl public bool uModEnabled; [GenerateDependencyProperty] - public string currentVersion; + public string currentVersion = default!; public ObservableCollection<UModEntry> Mods { get; } = []; @@ -58,7 +55,7 @@ public partial class UModMainView : UserControl private void SaveButton_Clicked(object _, EventArgs e) { - this.uModService.SaveMods(this.Mods.ToList()); + this.uModService.SaveMods([.. this.Mods]); this.uModService.IsEnabled = this.UModEnabled; while(this.queuedSaveActions.TryDequeue(out var action)) { diff --git a/Daybreak/Views/OptionSectionView.xaml.cs b/Daybreak/Views/OptionSectionView.xaml.cs index 6d41e8de..f441704b 100644 --- a/Daybreak/Views/OptionSectionView.xaml.cs +++ b/Daybreak/Views/OptionSectionView.xaml.cs @@ -5,12 +5,10 @@ using Daybreak.Shared.Models.Options; using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.Options; using Daybreak.Shared.Validators; -using System; using System.Collections.ObjectModel; using System.ComponentModel; using System.Core.Extensions; using System.Extensions; -using System.Linq; using System.Reflection; using System.Windows; using System.Windows.Controls; @@ -159,7 +157,7 @@ public partial class OptionSectionView : UserControl return (false, default, default); } - var action = customSetterViewAttribute.GetType().GetProperty(nameof(OptionSetterView<UserControl>.Action))? + var action = customSetterViewAttribute.GetType().GetProperty(nameof(OptionSetterView<>.Action))? .GetValue(customSetterViewAttribute)?.As<string>(); var viewType = customSetterViewAttribute.GetType().GetGenericArguments().FirstOrDefault(); @@ -188,7 +186,7 @@ public partial class OptionSectionView : UserControl return a.GetType().GetGenericTypeDefinition() == typeof(OptionCustomValidatorAttribute<>); }) is object customValidatorAttribute) { - var validatorPropertyInfo = customValidatorAttribute.GetType().GetProperty(nameof(OptionCustomValidatorAttribute<AllGoesValidator>.Validator)); + var validatorPropertyInfo = customValidatorAttribute.GetType().GetProperty(nameof(OptionCustomValidatorAttribute<>.Validator)); return (validatorPropertyInfo?.GetValue(customValidatorAttribute) as IValidator, new StringOptionTemplate()); } @@ -310,7 +308,7 @@ public partial class OptionSectionView : UserControl return default; } - private static IValidator? GetClampedValidator<T>(PropertyInfo propertyInfo, T defaultMinValue, T defaultMaxValue, out (bool IsRange, T Min, T Max) clampDetails) + private static ClampedValidator<T>? GetClampedValidator<T>(PropertyInfo propertyInfo, T defaultMinValue, T defaultMaxValue, out (bool IsRange, T Min, T Max) clampDetails) where T : IComparable<T> { var maybeOptionRangeAttribute = propertyInfo.GetCustomAttribute<OptionRangeAttribute<T>>(); diff --git a/Daybreak/Views/PluginsView.xaml.cs b/Daybreak/Views/PluginsView.xaml.cs index bfc6424c..0f22aba7 100644 --- a/Daybreak/Views/PluginsView.xaml.cs +++ b/Daybreak/Views/PluginsView.xaml.cs @@ -2,12 +2,10 @@ using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.Plugins; using Microsoft.Win32; -using System; using System.Collections.ObjectModel; using System.Core.Extensions; using System.Diagnostics; using System.Extensions; -using System.Linq; using System.Windows; using System.Windows.Controls; diff --git a/Daybreak/Views/ScreenChoiceView.xaml.cs b/Daybreak/Views/ScreenChoiceView.xaml.cs index 19df05fd..f15bb86d 100644 --- a/Daybreak/Views/ScreenChoiceView.xaml.cs +++ b/Daybreak/Views/ScreenChoiceView.xaml.cs @@ -4,10 +4,8 @@ using Daybreak.Shared.Models; using Daybreak.Shared.Services.ApplicationLauncher; using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.Screens; -using System; using System.Configuration; using System.Extensions; -using System.Linq; using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Media; @@ -42,7 +40,7 @@ public partial class ScreenChoiceView : UserControl this.applicationLauncher = applicationLauncher.ThrowIfNull(nameof(applicationLauncher)); this.InitializeComponent(); this.selectedId = this.liveOptions.Value.DesiredGuildwarsScreen; - this.CanTest = applicationLauncher.GetGuildwarsProcesses().FirstOrDefault() is not null; + this.CanTest = applicationLauncher.GetGuildwarsProcesses().Count > 0; this.SetupView(); } @@ -62,6 +60,7 @@ public partial class ScreenChoiceView : UserControl minY = screen.Size.Top; } } + foreach(var screen in this.screenManager.Screens) { var screenTemplate = new ScreenTemplate diff --git a/Daybreak/Views/SettingsSynchronizationView.xaml.cs b/Daybreak/Views/SettingsSynchronizationView.xaml.cs index 59cfd065..78a6f33c 100644 --- a/Daybreak/Views/SettingsSynchronizationView.xaml.cs +++ b/Daybreak/Views/SettingsSynchronizationView.xaml.cs @@ -9,8 +9,6 @@ using Newtonsoft.Json; using System.Core.Extensions; using System.Extensions; using System.Text; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Controls; using System.Windows.Extensions; using System.Windows.Media; @@ -32,16 +30,16 @@ public partial class SettingsSynchronizationView : UserControl private bool loading; [GenerateDependencyProperty] - private string displayName; + private string displayName = default!; [GenerateDependencyProperty] - private string email; + private string email = default!; [GenerateDependencyProperty] - private string currentOptions; + private string currentOptions = default!; [GenerateDependencyProperty] - private string remoteOptions; + private string remoteOptions = default!; [GenerateDependencyProperty] private bool synchronized; diff --git a/Daybreak/Views/SingleBuildTemplateView.xaml.cs b/Daybreak/Views/SingleBuildTemplateView.xaml.cs index a02d1060..0962b7d1 100644 --- a/Daybreak/Views/SingleBuildTemplateView.xaml.cs +++ b/Daybreak/Views/SingleBuildTemplateView.xaml.cs @@ -3,10 +3,8 @@ using Daybreak.Shared.Services.BuildTemplates; using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.Notifications; using Microsoft.Extensions.Logging; -using System; using System.Core.Extensions; using System.Extensions; -using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Views/TeamBuildTemplateView.xaml.cs b/Daybreak/Views/TeamBuildTemplateView.xaml.cs index 0dc17f83..22b4a840 100644 --- a/Daybreak/Views/TeamBuildTemplateView.xaml.cs +++ b/Daybreak/Views/TeamBuildTemplateView.xaml.cs @@ -8,12 +8,8 @@ using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.Notifications; using Daybreak.Shared.Services.Toolbox; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; using System.Core.Extensions; using System.Extensions; -using System.Linq; -using System.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; @@ -305,12 +301,12 @@ public partial class TeamBuildTemplateView : UserControl if (this.SelectedBuild == singleBuildEntry) { // We need to perform the check before we change the build collection, otherwise SelectedBuild will be null - this.CurrentBuild.Builds = this.CurrentBuild.Builds.Where(b => b != singleBuildEntry).ToList(); + this.CurrentBuild.Builds = [.. this.CurrentBuild.Builds.Where(b => b != singleBuildEntry)]; this.SelectedBuild = this.CurrentBuild.Builds.FirstOrDefault(); } else { - this.CurrentBuild.Builds = this.CurrentBuild.Builds.Where(b => b != singleBuildEntry).ToList(); + this.CurrentBuild.Builds = [.. this.CurrentBuild.Builds.Where(b => b != singleBuildEntry)]; } } diff --git a/Daybreak/Views/Trade/PriceHistoryView.xaml.cs b/Daybreak/Views/Trade/PriceHistoryView.xaml.cs index f2672375..3e9cf197 100644 --- a/Daybreak/Views/Trade/PriceHistoryView.xaml.cs +++ b/Daybreak/Views/Trade/PriceHistoryView.xaml.cs @@ -7,12 +7,8 @@ using LiveChartsCore.SkiaSharpView; using LiveChartsCore.SkiaSharpView.Painting; using LiveChartsCore.SkiaSharpView.VisualElements; using SkiaSharp; -using System; -using System.Collections.Generic; using System.Core.Extensions; using System.Extensions; -using System.Linq; -using System.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Views/Trade/PriceQuotesView.xaml.cs b/Daybreak/Views/Trade/PriceQuotesView.xaml.cs index 63a71ed6..94657b11 100644 --- a/Daybreak/Views/Trade/PriceQuotesView.xaml.cs +++ b/Daybreak/Views/Trade/PriceQuotesView.xaml.cs @@ -4,14 +4,9 @@ using Daybreak.Shared.Models.Trade; using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.TradeChat; using Daybreak.Shared.Utils; -using System; -using System.Collections.Generic; using System.Collections.ObjectModel; using System.Core.Extensions; using System.Extensions; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; diff --git a/Daybreak/Views/Trade/QuoteAlertSetupView.xaml.cs b/Daybreak/Views/Trade/QuoteAlertSetupView.xaml.cs index 149a6af2..45619253 100644 --- a/Daybreak/Views/Trade/QuoteAlertSetupView.xaml.cs +++ b/Daybreak/Views/Trade/QuoteAlertSetupView.xaml.cs @@ -2,10 +2,7 @@ using Daybreak.Shared.Models.Trade; using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.TradeChat; -using System; -using System.Collections.Generic; using System.Core.Extensions; -using System.Linq; using System.Windows; using System.Windows.Controls; @@ -18,7 +15,7 @@ public partial class QuoteAlertSetupView : UserControl private readonly IViewManager viewManager; private readonly ITradeAlertingService tradeAlertingService; - public List<ItemBase> AvailableItems { get; } = ItemBase.AllItems.Where(i => i.Modifiers is null).ToList(); + public List<ItemBase> AvailableItems { get; } = [.. ItemBase.AllItems.Where(i => i.Modifiers is null)]; public QuoteAlertSetupView( IViewManager viewManager, diff --git a/Daybreak/Views/Trade/TradeAlertSetupView.xaml.cs b/Daybreak/Views/Trade/TradeAlertSetupView.xaml.cs index 6011bed5..af52f459 100644 --- a/Daybreak/Views/Trade/TradeAlertSetupView.xaml.cs +++ b/Daybreak/Views/Trade/TradeAlertSetupView.xaml.cs @@ -1,7 +1,6 @@ using Daybreak.Shared.Models.Trade; using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.TradeChat; -using System; using System.Core.Extensions; using System.Windows; using System.Windows.Controls; diff --git a/Daybreak/Views/Trade/TradeAlertsChoiceView.xaml.cs b/Daybreak/Views/Trade/TradeAlertsChoiceView.xaml.cs index f5fcd4c9..10f1c94b 100644 --- a/Daybreak/Views/Trade/TradeAlertsChoiceView.xaml.cs +++ b/Daybreak/Views/Trade/TradeAlertsChoiceView.xaml.cs @@ -1,7 +1,6 @@ using Daybreak.Shared.Models.Trade; using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.TradeChat; -using System; using System.Core.Extensions; using System.Windows.Controls; diff --git a/Daybreak/Views/Trade/TradeAlertsView.xaml.cs b/Daybreak/Views/Trade/TradeAlertsView.xaml.cs index 0441c473..0f82bcf5 100644 --- a/Daybreak/Views/Trade/TradeAlertsView.xaml.cs +++ b/Daybreak/Views/Trade/TradeAlertsView.xaml.cs @@ -1,7 +1,6 @@ using Daybreak.Shared.Models.Trade; using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.TradeChat; -using System; using System.Collections.ObjectModel; using System.Core.Extensions; using System.Extensions; diff --git a/Daybreak/Views/Trade/TradeNotificationView.xaml.cs b/Daybreak/Views/Trade/TradeNotificationView.xaml.cs index 1212097b..b5853714 100644 --- a/Daybreak/Views/Trade/TradeNotificationView.xaml.cs +++ b/Daybreak/Views/Trade/TradeNotificationView.xaml.cs @@ -1,7 +1,6 @@ using Daybreak.Shared.Models.Trade; using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.Notifications; -using System; using System.Core.Extensions; using System.Windows; using System.Windows.Controls; diff --git a/Daybreak/Views/UpdateConfirmationView.xaml.cs b/Daybreak/Views/UpdateConfirmationView.xaml.cs index 163b8514..23386f33 100644 --- a/Daybreak/Views/UpdateConfirmationView.xaml.cs +++ b/Daybreak/Views/UpdateConfirmationView.xaml.cs @@ -1,10 +1,10 @@ -using Daybreak.Shared.Models.Versioning; -using Daybreak.Shared.Services.Navigation; +using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.Updater; using System.Core.Extensions; using System.Windows; using System.Windows.Controls; using System.Windows.Extensions; +using Version = Daybreak.Shared.Models.Versioning.Version; namespace Daybreak.Views; /// <summary> diff --git a/Daybreak/Views/UpdateView.xaml.cs b/Daybreak/Views/UpdateView.xaml.cs index 0ce440a6..6fe47932 100644 --- a/Daybreak/Views/UpdateView.xaml.cs +++ b/Daybreak/Views/UpdateView.xaml.cs @@ -2,7 +2,6 @@ using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.Updater; using Microsoft.Extensions.Logging; -using System; using System.Core.Extensions; using System.Windows; using System.Windows.Controls; diff --git a/Daybreak/Views/VersionManagementView.xaml.cs b/Daybreak/Views/VersionManagementView.xaml.cs index 797c93e6..b694a52f 100644 --- a/Daybreak/Views/VersionManagementView.xaml.cs +++ b/Daybreak/Views/VersionManagementView.xaml.cs @@ -1,10 +1,8 @@ using Daybreak.Shared.Services.Navigation; using Daybreak.Shared.Services.Updater; -using System; using System.Collections.ObjectModel; using System.Diagnostics; using System.Extensions; -using System.Linq; using System.Windows.Controls; using System.Windows.Extensions; using Version = Daybreak.Shared.Models.Versioning.Version; diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 00000000..cc24117c --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,16 @@ +<Project> + <PropertyGroup> + <NoWarn>$(NoWarn);IL2104;IL3053;IL3000;IL3002;NU1701;CS0108</NoWarn> + + <Version>0.9.9.76</Version> + + <Nullable>enable</Nullable> + <ImplicitUsings>enable</ImplicitUsings> + <AllowUnsafeBlocks>true</AllowUnsafeBlocks> + </PropertyGroup> + + <PropertyGroup> + <!--Event Source support is experimental in NativeAOT--> + <_SuppressNativeLibEventSourceWarning>true</_SuppressNativeLibEventSourceWarning> + </PropertyGroup> +</Project> diff --git a/Directory.Packages.props b/Directory.Packages.props new file mode 100644 index 00000000..4378b925 --- /dev/null +++ b/Directory.Packages.props @@ -0,0 +1,78 @@ +<Project> + <PropertyGroup> + <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally> + </PropertyGroup> + + <ItemGroup> + <PackageVersion Include="SharpCompress" Version="0.40.0" /> + + <PackageVersion Include="Elastic.OpenTelemetry" Version="1.0.2" /> + <PackageVersion Include="OpenTelemetry.Exporter.Console" Version="1.12.0" /> + <PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.12.0" /> + <PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.12.0" /> + <PackageVersion Include="Reloaded.Assembler" Version="1.0.16" /> + <PackageVersion Include="System.Private.Uri" Version="4.3.2" /> + <PackageVersion Include="WpfExtended" Version="0.7.9" /> + <PackageVersion Include="WpfExtended.SourceGeneration" Version="0.3.0" /> + <PackageVersion Include="WpfScreenHelper" Version="2.1.1" /> + <PackageVersion Include="WriteableBitmapEx" Version="1.6.8" /> + <PackageVersion Include="Squealify" Version="0.8.2.2" /> + <PackageVersion Include="System.Formats.Asn1" Version="9.0.6" /> + <PackageVersion Include="System.IO.Compression" Version="4.3.0" /> + <PackageVersion Include="System.Linq.Async" Version="6.0.3" /> + <PackageVersion Include="PeNet" Version="5.1.0" /> + <PackageVersion Include="Plumsy" Version="1.1.0" /> + <PackageVersion Include="securifybv.ShellLink" Version="0.1.0" /> + <PackageVersion Include="AvalonEdit" Version="6.3.1.120" /> + <PackageVersion Include="DiffPlex" Version="1.8.0" /> + <PackageVersion Include="HtmlAgilityPack" Version="1.12.1" /> + <PackageVersion Include="ini-parser-netstandard" Version="2.5.3" /> + <PackageVersion Include="LiveChartsCore.SkiaSharpView.WPF" Version="2.0.0-rc2" /> + <PackageVersion Include="MahApps.Metro" Version="2.4.10" /> + <PackageVersion Include="Microsoft.CorrelationVector" Version="1.0.42" /> + <PackageVersion Include="Microsoft.Data.Sqlite" Version="9.0.6" /> + <PackageVersion Include="Microsoft.Data.Sqlite.Core" Version="9.0.6" /> + <PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="9.0.6" /> + <PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.6" /> + <PackageVersion Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.135" /> + <PackageVersion Include="NAudio" Version="2.2.1" /> + + <PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="9.0.6" /> + <PackageVersion Include="MinHook.NET" Version="1.1.1" /> + <PackageVersion Include="Net.Sdk.Web.Extensions" Version="0.8.10" /> + <PackageVersion Include="Net.Sdk.Web.Extensions.SourceGenerators" Version="0.9.5" /> + <PackageVersion Include="Serilog" Version="4.3.0" /> + <PackageVersion Include="Serilog.Extensions.Logging" Version="9.0.2" /> + <PackageVersion Include="Serilog.Settings.Configuration" Version="9.0.0" /> + <PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" /> + <PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" /> + <PackageVersion Include="Swashbuckle.AspNetCore" Version="9.0.1" /> + <PackageVersion Include="Swashbuckle.AspNetCore.Swagger" Version="9.0.1" /> + <PackageVersion Include="Swashbuckle.AspNetCore.SwaggerGen" Version="9.0.1" /> + <PackageVersion Include="Swashbuckle.AspNetCore.SwaggerUI" Version="9.0.1" /> + <PackageVersion Include="SystemExtensions.NetStandard.Generators" Version="0.1.6" /> + <PackageVersion Include="ZLinq" Version="1.4.12" /> + + <PackageVersion Include="MeaMod.DNS" Version="1.0.71" /> + <PackageVersion Include="MemoryPack" Version="1.21.4" /> + <PackageVersion Include="MemoryPack.Generator" Version="1.21.4" /> + <PackageVersion Include="Microsoft.Extensions.Http" Version="9.0.6" /> + <PackageVersion Include="Microsoft.Web.WebView2" Version="1.0.3296.44" /> + <PackageVersion Include="Slim" Version="1.9.2" /> + <PackageVersion Include="System.Net.Http" Version="4.3.4" /> + <PackageVersion Include="System.Reflection.Metadata" Version="9.0.6" /> + <PackageVersion Include="System.Text.Encoding.CodePages" Version="9.0.6" /> + <PackageVersion Include="System.Text.Json" Version="9.0.6" /> + <PackageVersion Include="System.Text.RegularExpressions" Version="4.3.1" /> + <PackageVersion Include="SystemExtensions.NetCore" Version="1.6.12" /> + <PackageVersion Include="SystemExtensions.NetStandard.DependencyInjection" Version="1.6.9" /> + + <PackageVersion Include="FluentAssertions" Version="8.3.0" /> + <PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1" /> + <PackageVersion Include="MSTest.TestAdapter" Version="3.9.3" /> + <PackageVersion Include="MSTest.TestFramework" Version="3.9.3" /> + <PackageVersion Include="coverlet.collector" Version="6.0.4" /> + <PackageVersion Include="NSubstitute" Version="5.3.0" /> + <PackageVersion Include="NSubstitute.Analyzers.CSharp" Version="1.0.17" /> + </ItemGroup> +</Project>