ESO UI API Patch Highlights (V100021)AddOn Loading
The addon system will now only process manifest files that have the same name as the folder they are in. If your addon is in a folder name MyFolder, then the addon will only load MyFolder.txt as a manifest. It will no longer try to load files like ReadMe.txt. Additionally, all paths in the manifest file will now be relative to the location the manifest file is in, not AddOns/<AddOnName>. This should be more intuitive and also supports moving addons into subfolders. This is important because the addon system will now scan two levels deep into the folders in the AddOns directory looking for manifest files. This means you can put addons within folders or folders of folders and they will still load. In the future, look for more changes that build on these to allow better handling of libraries.Currency
The currency API changes are complete. Existing API functionality should be unchanged with the compatibility aliases, but the official APIs have been significantly reduced as they are now parameterized by currency type and currency location instead of having a different function for each combination. The currency locations are: CURRENCY_LOCATION_CHARACTER, CURRENCY_LOCATION_BANK, CURRENCY_LOCATION_GUILD_BANK, and CURRENCY_LOCATION_ACCOUNT. The concept of currency caps has been implemented. You can call IsCurrencyCapped(currencyType, currencyLocation) to see if a currency is capped and use GetMaxPossibleCurrency(currencyType, currencyLocation) to get the cap amount.
- GetCurrencyAmount(currencyType, currencyLocation) – amount.
- GetMaxPossibleCurrency(currencyType, currencyLocation) – max.
- GetMaxCurrencyTransfer(currencyType, fromLocation, toLocation) – maxTransfer.
- TransferCurrency(currencyType, amount, fromLocation, toLocation).
- CanCurrencyBeStoredInLocation(currencyType, currencyLocation) – canBeStored.
- GetCurrencyPlayerStoredLocation(currencyType) – currencyLocation.
- IsCurrencyValid(currencyType) – isValid.
- GetCurrencyName(currencyType, isSingular, isLower) – name.
- GetCurrencyKeyboardColor(currencyType) – r, g, b.
- GetCurrencyKeyboardIcon(currencyType) – iconPath, percentOfLineSize (for embedding in texture markup).
- GetCurrencyLootKeyboardIcon(currencyType) – iconPath.
- GetCurrencyGamepadColor(currencyType) – r, g, b.
- GetCurrencyGamepadIcon(currencyType) – iconPath, percentOfLineSize.
- IsCurrencyDefaultNameLowercase(currencyType) – defaultIsLowercase.
- ShouldShowCurrencyInLootHistory(currencyType) – shouldShowInLootHistory.
- IsCurrencyCapped(currencyType, currencyLocation) – isCapped.
Also check out EsoUI/PublicAllIngames/Currency/Currency.lua for more currency functionality.Retraiting
A new system has been added for replacing the traits on items. It is an interaction similar to other crafting systems. Its cost is paid using CURT_CHAOTIC_CREATIA which is stored in CURRENCY_LOCATION_ACCOUNT. RequestItemTraitChange(bagId, slotIndex, itemTrait) is the main API and results in a RETRAIT_RESPONSE being sent through EVENT_RETRAIT_RESPONSE when called:
- CanItemBeRetraited(bag, slotIndex) – canBeRetraited.
- RequestItemTraitChange(bagId, slotIndex, ItemTraitType).
- GetItemRetraitCost() - retraitCost, currencyType, currencyLocation.
- GetResultingItemLinkAfterRetrait(bagId, slotIndex, pendingTrait, linkStyle) – link.
- IsItemTraitKnownForRetraitResult(bagId, slotIndex, pendingTrait) – isKnown.
- GetRearchLineInfoFromRetraitItem(bagId, slotIndex) - craftingType, researchLineName.
- GetItemTraitTypeCategory(itemTraitType) – itemTraitTypeCategory.
Events that have enumeration fields now note which enumerations they are in the documentation.Dyeing
The dyeing API has been repurposed into a more generic restyling system. The old structure used a hand-curated enum called DYEABLE_SLOT that was a composite of mode and contextual slot (e.g.: equipment mode and equip slot.) The new API splits this into a RESTYLE_MODE enum and a second enum parameter that is based on the restyle mode. For example, equipment uses equip slot while collectibles use collective category type. The dyeing functions are now accessed with those parameters.Crazy King
The Crazy King battleground game type has been added. In support of this mode, objectives can now activate and deactivate. Some new APIs and events were added to handle this:
- GetObjectiveVirtualId(keepId, objectiveId, battlegroundContext) – virtualId.
- In Crazy King as an objective “moves” it actually deactivate its current objective and activates a new objective. Virtual id allows you to track the king of the kill area by id as it moves between objectives.