Releases: sliekens/gw2sdk
v1.0.0
I am thrilled to announce the first official release of GW2SDK!
The SDK now offers a robust set of features for interacting with the Guild Wars 2 API and game client. All planned features are now complete, reviewed, tested, documented and optimized for extreme performance, without sacrificing ease of use.
Highlights
I added support for weapon skill overrides to chat links for build templates. This is used for Ranger builds that utilize Unleashed hammer skills.
I removed unnecessary NuGet dependencies, which could otherwise pollute your solution with unwanted packages. The only required dependency is System.Text.Json
. For legacy .NET Framework projects, there is an additional dependency on System.Runtime.InteropServices.RuntimeInformation
.
Enjoy!
Full Changelog: v1.0.0-rc.3...v1.0.0
v1.0.0-rc.3
This is one of the last pre-releases with improvements to the public API of the code. All code has been meticulously reviewed and documented. I now consider it ready for general use. I don't expect to make any further design changes, only bug fixes.
Highlights
I invested heavily in improving the performance for this release.
Bulk queries now have better throughput. Previously, the rate limiter would wait for a response to be fully processed before allowing the next request to begin. Now, the next request is allowed to begin immediately after receiving a response. This way, the time it takes to process a response is no longer a factor in rate limiting.
Heap allocations in JSON parsers have been further reduced by using static lambdas, to avoid allocating many System.Func<T>
and "DisplayClass" closure objects.
Methods which take a collection of IDs, like GetAchievementsByIds
, now accept IEnumerable<T>
instead of IReadOnlyCollection<T>
, making it possible to compose requests with LINQ, without the use of ToList()
.
WvW objectives polymorphy has been reworked, because there were inconsistencies and name conflicts between owned objectives and the reference data for those owned objectives.
The API exceptions have been simplified. All API failures now throw HttpRequestException
instead of InvalidOperationException
. A subtype BadResponseException
was introduced for responses that don't contain a success status code and a valid JSON document.
The NuGet package size was reduced by about 20% by eliminating duplicate code.
New features
Characters:
- Added the ability to retrieve multiple characters by name at once
Training:
- Added the ability to retrieve specializations by page numbers and page size
Bug fixes
Guilds:
- Fixed a crash when retrieving a guild without a valid access token
- Properties of
Guild
which require a valid access token can now benull
Miscellaneous:
- Improved
ReadAsStreamAsync
cancellation in older .NET versions - Fixed
ValueOnly()
extension method could throwAggregateException
instead of the real exception - Fixed missing
Extensible<T>
enum support forMountName
,ProfessionName
andRaceName
Breaking changes
Story journal:
- Removed unused
MissingMemberHandling
argument from methodGetCompletedStorySteps
WvW objectives:
- Removed property
Objective.Kind
and instead introduced subtypes likeCamp
,Tower
,Keep
etc.
WvW matches:
- Renamed record
Objective
toOwnedObjective
to fix name conflicts - Did the same for all subtypes like
OwnedCamp
,OwnedTower
,OwnedKeep
etc.
Miscellaneous:
- Changed
ByIds
methods to operate onIEnumerable<T>
instead ofIReadOnlyCollection<T>
- Changed
QueryBuilder
to be always mutable since the immutability was never really needed - Moved
Link
header types to a newWebLinks
namespace - Changed
Gw2Client
error handling to throwHttpRequestException
instead of types likesInvalidOperationException
Full Changelog: v1.0.0-rc.2...v1.0.0-rc.3
v1.0.0-rc.2
This is one of the last pre-releases with improvements to the public API of the code. All code has been meticulously reviewed and documented. I now consider it ready for general use. I don't expect to make any further design changes, only bug fixes.
Highlights
Skill polymorphy has been reworked because there were a lot of nullable properties on the base type that should have been required properties of a subtype instead. Now, the Skill
base type only contains the properties which are truly shared for all abilities. A new ActionSkill
subtype was introduced for skills which must be activated. Another subtype SlotSkill
was introduced as the base type for healing, utility and elite skills.
New features
Dye colors:
- Added method
DyeColor.GetChatLink
Bug fixes
Exploration:
- Fixed incorrect waypoint chat links generation for god shrines (Orr maps)
Breaking changes
Items:
- Moved properties
Item.Races
,Item.Professions
andItem.BodyTypes
to a new propertyRestrictions
of typeItemRestriction
- Changed the type of these properties to
Extensible<TEnum>
and added a propertyOther
to support future restrictions without throwing
Equipment skins:
- Changed the type of
EquipmentSkin.Races
toExtensible<TEnum>
Skills:
- Changed
Skill.IconHref
to not-null (but possibly empty) - Introduced base type
ActionSkill
for skills that require activation - Introduced base type
SlotSkill
for heal, utility and elite skills - Changed
ActionSkill
properties to not-null as they were previously nullable only to support passive skills:Slot
WeaponType
Professions
- Changed the
Professions
property from an empty list to a list of all professions when there are no profession restrictions, for example for open-world bundle skills.
Super Adventure Box:
- Renamed
SuperAdventureBoxMode.{Infantile->Exploration}
Full Changelog: v1.0.0-rc.1...v1.0.0-rc.2
v1.0.0-rc.1
This is one of the last pre-releases with improvements to the public API of the code. All code has been meticulously reviewed and documented. I now consider it ready for general use. I don't expect to make any further design changes, only bug fixes.
Highlights
Enums have been reworked to be extensible with Extensible<TEnum>
. This is a type that behaves much like the underlying enum, but it can be assigned from strings and compared to strings.
This change was needed because new enum values are added to the API every now and then, and the code had to be updated to work with the new enum values each time this happened. Now, the code will just accept the unknown enum value. In your application code, you can then do a string comparison if the enum member is not already defined.
The string comparisons are ordinal/ignore case.
Note that while System.Enum
implements IComparable
, I decided not to implement it for Extensible<TEnum>
, as it's not clear how unknown enum values should be compared to known enum values (or with each other). In my view, there is no right answer, just don't try to do that.
// Extensible<TEnum> can be assigned from a defined enum member
Extensible<Rarity> legendary = Rarity.Legendary;
// Extensible<TEnum> can also be assigned from any string
Extensible<Rarity> mythical = "Mythical";
// Same for comparisons, both defined enum members and strings are supported
Console.WriteLine(legendary == Rarity.Legendary); // true
Console.WriteLine(legendary == "Mythical"); // false
Console.WriteLine(mythical == Rarity.Legendary); // false
Console.WriteLine(mythical == "Mythical"); // true
Types in the Pvp
namespace have been reworked, to make them easier to use. Some types and properties were renamed to align with the names used in the game or on the official wiki.
New features
PvP:
- Added property
CurrentStanding.EffectiveRating
Miscellaneous:
- Added extensible enums (see highlights above)
Bug fixes
PvP:
- Fixed a wrong JSON mapping for property
LeaderboardScoring.Name
Breaking changes
Masteries:
- Renamed method
Get{Masteries->MasteryTracks}ByIds
PvP:
- Renamed argument
heroId->mistChampionId
- Renamed property
MistChampion.{Overlay->OverlayImageHef}
- Renamed property
MistChampion.{Underlay->UnderlayImageHef}
- Changed property
Season.Divisions
toIReadOnlyList<Division>
- Changed property
Division.Tiers
toIReadOnlyList<DivisionTier>
- Changed property
Leaderboard.Scorings
toIReadOnlyList<LeaderboardScoring>
- Changed property
LeaderboardEntry.Scores
toIReadOnlyList<Score>
- Changed property
LeaderboardSettings.Tiers
toIReadOnlyList<LeaderboardTier>
- Changed property
SeasonRank.Tiers
toIReadOnlyList<RankTier>
- Renamed type
SeasonRank->SkillBadge
- Renamed type
RankTier->SkillBadgeTier
- Renamed method
Get{Leaderboards->LeaderboardIds}
- Renamed property
BestStanding.{Points->Pips}
- Renamed property
BestStanding.Total{Points->Pips}
- Renamed property
CurrentStanding.{Points->Pips}
- Renamed property
CurrentStanding.Total{Points->Pips}
Full Changelog: v1.0.0-preview.15...v1.0.0-rc.1
v1.0.0-preview.15
This is just a small hotfix to the PACKAGE readme, which contained an error in preview 14. Unfortunately it could not be changed without creating a new release. There are no other changes.
Full Changelog: v1.0.0-preview.14...v1.0.0-preview.15
v1.0.0-preview.14
This is one of the last pre-releases with improvements to the public API of the code. The only area of the code left to document and potentially improve is the PvP namespace. I expect to publish the first release candidate not long after that. It was also announced that changes to the WvW API are coming, which I expect will have some impact for everyone using those parts.
Highlights
The Wizard's Vault can now be accessed using Gw2Client.WizardsVault
.
Performance has been improved: the number of String
allocations in JSON parsers has been drastically reduced, thanks to internal use of Span<char>
without instantiating the String
.
Types in the Items
namespace have been largely reworked, to make them much easier to use. Some types and properties were renamed to align with the names used in the game or on the official wiki.
More helper methods to create chat links were added.
New features
- Added extension method
AsDictionary
, which helps you turn aHashSet
result into aDictionary
result more easily - Added extension method
ValueOnly
, which lets you discard theMessageContext
from a result more easily - Added the ability to retrieve the Wizard's Vault season, objectives, progress, rewards and purchased rewards
- Added the ability to fetch home gathering nodes by ID or by page
- Added the ability to create chat links for WvW objectives (camps, towers etc.)
- Added method
Objective.GetChatLink
- Added method
EquipmentItem.GetChatLink
- Added method
JadeBotSkin.GetChatLink
- Added method
RecipeSheet.GetRecipeChatLink
- Added method
RecipeSheet.GetExtraRecipeChatLinks
- Added method
Transmutation.GetSkinChatLinks
- Added method
EquipmentSkin.GetChatLink
- Added property
SalvageTool.Unbreakable
(bool) - Greatly reduced the number of
String
allocations in JSON parsers
Bug fixes
Achievements:
- Fixed a potential JSON exception for unknown/future achievement types
Items:
- Added a workaround for PvP runes and sigils not being classified as such in the API
WvW:
- Fixed property
Objective.Coordinates
to be set tonull
instead of(0, 0, 0)
- Fixed property
MatchStats.Maps
to be a collection ofMapSummary
instead ofobject
Miscellaneous:
- Improved handling of malformed JSON
- Changed property
BaseAddress.Default
fromstatic readonly string
toconst string
- Removed invalid
FlagsAttribute
from theMapType
enum used by the Mumble integration - Added forgotten
MissingMemberBehavior
parameters toBuildsClient
,MasteriesClient
,DungeonsClient
,MapChestsClient
,RaidsClient
andGameTick
Breaking changes
Dyes:
- Renamed type
Dye->DyeColor
Items:
- Split property
EquipmentItem.UpgradeItemIds
intoSuffixItemId
andSecondarySuffixItemId
- Split property
Item.Restrictions
intoRaces
,Professions
andBodyTypes
- Changed property
Item.Races
to be a list of all races when no restrictions apply - Changed property
Item.Professions
to be a list of all professions when no restrictions apply - Changed property
Item.BodyTypes
to be a list of all body types when no restrictions apply - Renamed method
Get{ItemStats->AttributeCombinations}Index
- Renamed property
Armor.Default{Skin->SkinId}
- Renamed property
Backpack.Default{Skin->SkinId}
- Renamed property
Weapon.Default{Skin->SkinId}
- Changed property
Armor.InfusionSlots
toIReadOnlyList<InfusionSlot>
- Changed property
Backpack.InfusionSlots
toIReadOnlyList<InfusionSlot>
- Changed property
Trinket.InfusionSlots
toIReadOnlyList<InfusionSlot>
- Changed property
Weapon.InfusionSlots
toIReadOnlyList<InfusionSlot>
- Changed property
Armor.StatChoices
toIReadOnlyList<int>
and changed it to not-nullable - Changed property
Backpack.StatChoices
toIReadOnlyList<int>
and changed it to not-nullable - Changed property
Trinket.StatChoices
toIReadOnlyList<int>
and changed it to not-nullable - Changed property
Weapon.StatChoices
toIReadOnlyList<int>
and changed it to not-nullable - Changed property
Rune.Bonuses
toIReadOnlyList<string>
- Renamed property
InfixUpgrade.{ItemstatsId->AttributeCombinationId}
- Changed property
InfixUpgrade.Attributes
to a dictionary, copying the design ofEquipmentItem.Attributes
- Flattened property of type
InfixUpgrade
:Armor.Prefix
,Backpack.Prefix
,Trinket.Prefix
,Weapon.Prefix
andUpgradeComponent.Suffix
- Deleted the
InfixUpgrade
type - Removed type
DefaultContainer
and replaced usages with the base typeContainer
- Removed type
DefaultGizmo
and replaced usages with the base typeGizmo
- Removed type
DefaultUpgradeComponent
and replaced usages with the base typeUpgradeComponent
- Removed type
Tool
and replaced usages with the derived typeSalvageTool
(the only derived type) - Renamed type
ItemUpgrade->InfusionSlotUpgradePath
- Moved property
Trinket.UpgradesFrom
to typeRing
since only rings can be upgraded - Moved property
Trinket.UpgradesInto
to typeRing
since only rings can be upgraded - Changed property
Backpack.UpgradesFrom
to new typeInfusionSlotUpgradeSource
with the same properties as before - Changed property
Backpack.UpgradesFrom
to not-nullable - Changed property
Backpack.UpgradesInto
to not-nullable - Changed property
Ring.UpgradesFrom
to new typeInfusionSlotUpgradeSource
with the same properties as before - Changed property
Ring.UpgradesFrom
to not-nullable - Changed property
Ring.UpgradesInto
to not-nullable - Changed property
CraftingMaterial.UpgradesInto
to not-nullable - Renamed property
Transmutation.{Skins->SkinIds}
- Renamed type
ImmediateConsumable->Service
- Grouped consumable effect properties into a new
Effect
typeName
Description
Duration
ApplyCount
IconHref
- Added properties of type
Effect
toFood
,Utility
,Service
andGenericConsumable
and deleted the old properties - Renamed type
Mount{RandomUnlocker->License}
- Renamed type
{Ms->MountSkin}Unlocker
- Renamed type
Upgrade{Remover->Extractor}
- Renamed type
BagSlot{Unlocker->Expansion}
- Renamed type
BankTab{Unlocker->Expansion}
- Renamed type
Build{LibrarySlotUnlocker->StorageExpansion}
- Renamed type
Build{LoadoutTabUnlocker->TemplateExpansion}
- Renamed type
GearLoadoutTabUnlocker->EquipmentTemplateExpansion
- Renamed type
CollectibleCapacityUnlocker->StorageExpander
- Renamed type
{Champion->MistChampion}Unlocker
- Renamed type
CraftingRecipeUnlocker->RecipeSheet
- Changed property
RecipeSheet.ExtraRecipeIds
to not-nullable - Renamed type
DyeUnlocker->Dye
- Renamed type
Shared{SlotUnlocker->InventorySlot}
- Renamed type
OpenUiContainer->BlackLionChest
- Renamed type
ContainerKey->BlackLionChestKey
- Renamed type
ForagingTool->HarvestingSickle
- Renamed
Logging{Tool->Axe}
- Renamed
MiningTool->Pick
- Replaced type
Key
withTrophy
(weird type, had nothing to do with keys, the items are trophies) - Removed property
Gizmo.VendorIds
(weird and inconsistent data, vendors API is unavailable anyway)
Mount skins:
- Renamed
Mount.Default{Skin->SkinId}
Equipment skins:
- Renamed type
Skin->EquipmentSkin
- Renamed property
EquipmentSkin.{Restrictions->Races}
- Changed property
EquipmentSkin.Races
to be a list of all races when no restrictions apply
Ranger pets:
- Changed property
Pet.Skills
toIReadOnlyList<PetSkill>
WvW:
- Changed property
Ability.Ranks
toIReadOnlyList<AbilityRank>
- Changed property
ObjectiveUpgrade.Tiers
toIReadOnlyList<UpgradeTier>
- Changed property
UpgradeTier.Upgrades
toIReadOnlyList<Upgrade>
- Renamed property
Objective.Marker{Href->IconHref}
Quaggans:
- Renamed property
Quaggan.{Picture->Image}Href
Miscellaneous:
- Moved enum
WeightClass
to namespaceHero
- Moved enum
RaceName
to namespaceHero
- Moved enum
Gender
to namespaceHero
- Renamed enum
Gender->BodyType
- Flattened property
MessageContext.ResultContext
and deleted theResultContext
type - Flattened property
MessageContext.PageContext
and deleted thePageContext
type - Added class
BulkProgress
to replaceResultContext
in bulk queries withIProgess<>
- Removed unused map types from the
MapType
enum used by the Mumble integration
Full Changelog: v1.0.0-preview.13...v1.0.0-preview.14
v1.0.0-preview.13
This is another intermediate preview release to improve the public API of the code, this time focusing on Hero (masteries, emotes, etc.)
Masteries and (background) stories were improved to use terminology found in the game and in the GW2 wiki. Previously, names were used which could mean something else in the game or wiki, which might cause confusion.
Good news for Revenants as I fixed a few of the broken legends. Vindicator is still not working correctly, but must be fixed in the API first.
The API was previously missing mastery region names for EoD and SotO, but a recent API update rectified it. This release adds the associated region names Jade and Sky. I also changed MasteryPointsTotal.Region
from string
to the MasteryRegionName
enum. This is how the API was originally designed, but the data was silently changed from region names to expansion names. Possibly it was not an intended change as it was not documented in the API release notes. Mastery insight points in the Maps API still refer to the region name only, not the expansion name. This release contains compensating code to convert expansion names back to region names.
This release also introduces chat links creation. You can now create chat links from objects using a simple API:
var link = new ItemLink
{
ItemId = 23040
};
string chatLink = link.ToString();
You can also parse existing links, to inspect them or even update them:
var link = ItemLink.Parse("[&AgEAWgAA]");
var count = link.Count;
var newLink = link with { Count = count + 1 };
string chatLink = newLink.ToString();
I also enabled AOT compilation as of this release.
New features
- Chat links
- Added missing mastery region names (Jade and Sky)
- Added
Build.SelectedSpecializationIds()
method - Added
Build.SelectedTraitIds()
method - Added
Build.SelectedSkillIds()
method - Added
SkillBar.SelectedSkillIds()
method - Added ability to retrieve unlocked glider skins
- Enabled ahead-of-time compilation (reduces startup time)
Bug fixes
- Fixed
Build.Legends
garbage legend IDs
Breaking changes
Builds:
- Renamed
WeaponType.Speargun
toHarpoonGun
- Split
SkillBar.UtilitySkillIds
into 3 props - Split
Build.Specializations
into 3 props - Split
SelectedSpecialization.TraitIds
into 3 props - Grouped
Build.Legends
andBuild.AquatingLegends
intoSelectedLegends
- Reworked
Build.PetSkills
toPets
, it had nothing to do with skills
Dyes:
- Renamed
GetUnlockedDyesIndex
toGetUnlockedColors
- Renamed
Dye.Item
toItemId
- Renamed
DyeSlot.ColorId
toDyeId
- Split
Categories
intoHue
,Material
andColorSet
Emotes:
- Renamed
Emote.UnlockItems
toUnlockItemIds
Equipment:
- Renamed
EquipmentItem.DyeIds
toDyeColorIds
- Changed
EquipmentItem.DyeColorIds
to be an empty list instead of null - Changed
EquipmentItem.UpgradeItemIds
to be an empty list instead of null - Changed
EquipmentItem.InfusionItemIds
to be an empty list instead of null - Changed
EquipmentItem.TemplateNumbers
to be an empty list instead of null - Renamed
CombatAttribute
toAttributeName
- Renamed old attribute names like
CritDamage
to modern names likeFerocity
- Replaced
UpgradeAttributeName
withAttributeName
- Renamed
SelectedStat
toSelectedAttributeCombination
- Changed
SelectedAttributeCombination.Attributes
to aDictionary<AttributeName, int>
Exploration:
- Renamed
MapSummariesByIds
toGetMapSummariesByIds
Finishers:
- Renamed
Finisher.UnlockItems
toUnlockItemIds
- Renamed
Finisher.UnlockDetails
toLockedText
Gliders:
- Renamed
Glider
toGliderSkin
- Renamed
GliderSkin.UnlockItems
toUnlockItemIds
- Renamed
GliderSkin.DefaultDyes
toDefaultDyeColorIds
and changed toIReadOnlyList
Home:
- Renamed
GetOwnedCatsIndex
toGetUnlockedCats
- Renamed
GetUnlockedNodesIndex
toGetUnlockedNodes
Items:
- Renamed
ItemStats
toAttributeCombination
Jade bots:
- Renamed
JadeBot
toJadeBotSkin
Mail carriers:
- Renamed
MailCarrier.UnlockItems
toUnlockItemIds
- Renamed
GetOwnedMailCarriers
toGetUnlockedMailCarriers
Masteries:
- Changed the type of
MasteryPointsTotal.Region
fromstring
to theMasteryRegionName
enum - Renamed
Mastery
toMasteryTrack
- Renamed
MasteryLevel
toMastery
- Renamed
Levels
toMasteries
and converted toIReadOnlyList
- Renamed
Background
toBackgroundHref
Miniatures:
- Renamed
Minipet
toMiniature
- Renamed
Miniature.Unlock
toLockedText
Mounts:
- Renamed
GetOwnedMounts
toGetUnlockedMounts
- Renamed
GetOwnedMountSkins
toGetUnlockedMountSkins
- Renamed
Mount.Skin
toSkinIds
- Renamed
MountName.Turtle
toSiegeTurtle
- Changed
MountSkin.DyeSlots
toIReadOnlyList
Novelties:
- Renamed
GetUnlockedNoveltiesIndex
toGetUnlockedNovelties
- Renamed
Novelty.UnlockItems
toUnlockItemIds
Races:
- Renamed
Race.Skills
toSkillIds
and converted toIReadOnlyList
Background stories:
- Reorganized namespaces
- Renamed
CharacterBackstory.Backstory
toAnswerIds
- Renamed
Backstory
toBackgroundStory
everywhere else - Renamed
Question
toQuestionId
- Renamed
Answers
toAnswerIds
and converted toIReadOnlyList
- Changed
Races
andProfessions
collections in background story Q&A to not-null collections- Previously they contained a list of restrictions, or were
null
if no restrictions applied - Now the collections contain all races and professions instead of being null
- Previously they contained a list of restrictions, or were
Inventories:
- Changed
ItemSlot.UpgradeItemIds
toSuffixItemId
andSecondarySuffixItemId
- Renamed
ItemSlot.DyeIds
toDyeColorIds
- Changed
ItemSlot.DyeColorIds
to be an empty list instead of null - Changed
ItemSlot.InfusionItemIds
to be an empty list instead of null
Outfits:
- Renamed
GetUnlockedOutfitsIndex
toGetUnlockedOutfits
- Renamed
Outfit.UnlockItems
toUnlockItemIds
Pvp:
- Renamed
GetUnlockedHeroesIndex
toGetUnlockedMistChampions
- Renamed
MistChampionSkin.UnlockItems
toUnlockItemIds
Skiffs:
- Renamed
Skiff
toSkiffSkin
Story lines:
- Renamed
Season
toStoryline
- Renamed
Quest
toStoryStep
- Renamed
Story
toStoryId
- Renamed
Goal
toObjective
- Renamed
GetCharacterQuests
toGetCompletedStorySteps
- Changed
Story.Chapters
toIReadOnlyList
- Changed
StoryStep.Objectives
toIReadOnlyList
- Changed
Story.Races
to not-null collection- Previously it contained a list of restrictions, or was
null
if no restrictions applied - Now the collection contains all races instead of being null
- Previously it contained a list of restrictions, or was
Titles:
- Renamed
GetUnlockedTitlesIndex
toGetUnlockedTitles
Training:
- Reorganized namespaces
- Renamed
SkillReference
toSkillSummary
- Renamed
Specializations
toSpecializationIds
and converted toIReadOnlyList
- Changed
Weapons
dictionary key from string toWeaponType
enum - Changed
Skills
toIReadOnlyList
- Changed
Training
toIReadOnlyList
- Added an exception when duplicate skill palettes are encountered instead of arbitrarily choosing the last one
Wardrobe:
- Renamed
GetUnlockedSkinsIndex
toGetUnlockedSkins
- Changed
DyeSlotInfo
properties toIReadOnlyList
- Changed
Skin.Restrictions
list type toRaceName
Full Changelog: v1.0.0-preview.12...v1.0.0-preview.13
v1.0.0-preview.12
Another intermediate preview release to improve the public API of the code, this time focusing on Crafting. I also cleaned up the root namespace and improved support for flag enums.
Previously almost all enums were in the root namespace, ignoring more logical choices. For example ItemRestriction
is now moved to the Items
namespace.
Collections of flag enums were replaced with record types consisting of boolean properties for each flag.
Breaking changes
General:
- Moved enums from the root namespace into specific namespaces
- Converted collections of flag enums to record types
- Removed unused code
AccessCondition
enumDay
enum
Crafting:
- Reorganized
Crafting
namespace intoDisciplines
,Recipes
andDaily
Hero:
- Renamed
AttributeAdjustmentTarget
toCombatAttribute
Items:
- Renamed
JadeBotUpgrade
toJadeTechModule
Tokens:
- Renamed namespace
Authentication
toAuthorization
since it contains code to deal with permissions
HTTP plumbing:
- Moved
LinkHeader
to namespaceGuildWars2.Http.Headers
- Renamed
LinkHeaderValue
toLinkValue
and moved to namespaceGuildWars2.Http.Headers
New features
General:
- Exceptions thrown during JSON conversions now include the raw JSON text in
Exception.Data["Value"]
to aid debugging
Full Changelog: v1.0.0-preview.11...v1.0.0-preview.12
v1.0.0-preview.11
Another intermediate preview release to improve the public API of the code, this time focusing on Authentication, Commerce, Exploration, Guilds and Worlds.
This is also the first release that is built with .NET 8.0.100 and C# 12, previously .NET 8.0 RC2 and C# 11.
Breaking changes
General:
- Changed
IReadOnlyCollection
toIReadOnlyList
in places where order matters - Renamed
Icon
toIconHref
- Renamed
ChunkQuery
toBulkRequest
Commerce:
- Renamed
GemsForGold
toGemsToGold
- Renamed
GoldForGems
toGoldToGems
- Renamed
Order.Price
toUnitPrice
- Renamed
Transaction.Price
toUnitPrice
Exploration:
- Renamed
MasteryPoint
toMasteryInsight
- Renamed
UnlockerPointOfInterest
toRequiresUnlockPointOfInterest
- Renamed
GetMapSummariesIndex
toGetMapsIndex
Guilds:
- Split
EmblemPart
intoEmblemForeground
andEmblemBackground
- Renamed
GuildBackgroundEmblem
toGuildEmblemBackground
- Renamed
GuildForegroundEmblem
toGuildEmblemForeground
- Changed
GuildEmblemFlags
from a list of enums to a class with boolean properties - Changed
GuildUpgradeCost
to an inheritable type, with derived types for each cost kindGuildUpgradeCoinsCost
GuildUpgradeCollectibleCost
GuildUpgradeCurrencyCost
GuildUpgradeItemCost
- Renamed
GuildStash
toGuildBank
- Removed
GuildPermission
enum, strings are now used instead
Skills:
- Changed
AttributeAdjustment.Target
to nullable as some newer skills that appeared in the beta don't use this property
New features
Skills:
- Added
AttributeAdjustment.HitCount
for skills that modify an attribute for a number of hits
Worlds:
- Added
World.TransferFee
, the gem fee for transferring to the world - Added
World.Region
, indicating EU or NA - Added
World.Language
, indicating the language associated with the world
Full Changelog: v1.0.0-preview.10...v1.0.0-preview.11
v1.0.0-preview.10
Another intermediate preview release to improve the logical grouping of APIs.
My goal for this release is to make things easy to find in the SDK based on your knowledge of the game. I.e. if you know where to find it in the game, you should be able to find it in the SDK. (The API endpoints are not organized that way, so this is an opiniated choice.)
Specifically, most APIs pertaining to the player have been moved into a new Hero
namespace. The namespace layout should be familiar to players of the game, it's modeled after the Hero panel in the game.
A diagram of the new situation can be found on the wiki Features page.
I don't expect to do any more large scale changes after this. I'm reasonably happy with the current design. I only expect more localized breaking changes as I'm reviewing and documenting all the code and making improvements along the way. I'd rather do these changes now than after the v1.0.0 stable release.
Breaking changes
- Reorganized namespaces (and
Gw2Client
members) to match game concepts - Renamed
Query
classes toClient
as it sounds more familiar
New features
- Added Jade bot skins
- Added Skiffs skins
Bug fixes
- Fixed overlapping members in the
ItemRestriction
enum - Fixed heal skills containing an undefined
Attunement
value for non-Elementalist heal skills
Full Changelog: v1.0.0-preview.9...v1.0.0-preview.10