Maintenance for the week of January 30:
• PC/Mac: No maintenance – January 30
• Xbox: NA and EU megaservers for maintenance – February 1, 6:00AM EST (11:00 UTC) - 9:00AM EST (14:00 UTC)
• PlayStation®: NA and EU megaservers for maintenance – February 1, 6:00AM EST (11:00 UTC) - 9:00AM EST (14:00 UTC)

Update 17 API Patch Notes & Change Log (PTS)

Community Manager
ESO UI API Patch Highlights (V100022)
A summary of important changes to the ESO UI API in this update.

The Outfit System is a new feature that allows players to change the appearance of Outfit slots using collectibles. Outfit slots are enumerated by the OUTFIT_SLOT_* enum values and they include equipment, costumes, mounts, etc. Equipment-based Outfit slots are changed using Outfit style collectibles. The other slots (e.g. MOUNT, POLYMORPH, etc.) use the corresponding collectible type. Outfit changes can be paid for using gold or a new currency type, CURT_STYLE_STONES. The gold cost is based on the types of styles being applied and how many dyes have been changed. The style stone cost is one flat cost for any change. The Outfit System is an extension of the restyle system (formerly dyes) and goes hand in hand with dyeing. Below are the new APIs for outfits:
  • GetOutfitName(outfitIndex) – name.
  • GetOutfitSlotInfo(outfitIndex, outfitSlot) – collectibleId, itemMaterialIndex, primaryDyeId, secondaryDyeId, accentDyeId.
  • EquipOutfit(outfitIndex)
  • UnequipOutfit()
  • GetEquippedOutfitIndex() – outfitIndex.
  • GetOutfitStyleFreeConversionCollectibleId(outfitStyleId) – freeConversionCollectibleId - Returns the collectible id that, if owned by the player, allows using this style in an outfit for free. Replaces "Convert to Imperial/Morag Tong".
  • IsOutfitStyleWeapon(outfitStyleId) – isWeapon.
  • IsOutfitStyleArmor(outfitStyleId) – isArmor.
  • GetOutfitStyleWeaponModelType(outfitStyleId) – weaponModelType.
  • GetOutfitStyleVisualArmorType(outfitStyleId) – visualArmorType.
  • GetOutfitChangeFlatCost() – flatCostStyleStones – The cost if using the style stone currency. It is the same cost regardless of how many changes you make.
  • SendOutfitChangeRequest(useFlatCurrency, outfitIndex, [outfitSlot, collectibleId, itemMaterialIndex, primaryDyeId, secondaryDyeId, accentDyeId]…) – Enacts an outfit change. After outfitIndex pass in groups of six arguments (outfitSlot, collectibleId, itemMaterialIndex, primaryDyeId, secondaryDyeId, accentDyeId) per slot change.
  • GetOutfitSlotDataCollectibleCategoryId(outfitSlot) – collectibleCategoryId - This is the collectible category that has the outfit style collectibles that can be properly used to populate this outfit slot.
  • GetOutfitSlotDataHiddenOutfitStyleCollectibleId(outfitSlot) – collectibleId – Returns the collectible id for the collectible that hides the equipment in that slot.
  • RenameOutfit(outfitIndex, name).
  • GetEquipSlotForOutfitSlot(outfitSlot) – equipSlot.
  • GetEligibleOutfitSlotsForCollectible(collectibleId) – outfitSlot…
  • CanEquippedItemBeShownInOutfitSlot(equipSlot, outfitSlot) – canShowItem.
  • GetApplyCostForIndividualOutfitSlot(outfitIndex, outfitSlot, collectibleId, changedDyeCount) – applyCostGold. – Computes the cost in gold to make this change to the slot. Changed dye count is the number of dye channels that have changes to be applied in this slot.
  • GetTotalApplyCostForOutfitSlots(outfitIndex, [outfitSlot, collectibleId, changedDyeCount]…) – totalCostGold - Specify the outfit you want to evaluate, then groups of 3 arguments (outfitSlot, collectibleId, changedDyeCount) per slot.
  • GetOutfitSlotsForCurrentlyHeldWeapons() - mainHandOutfitSlot, offHandOutfitSlot.
  • GetOutfitSlotsForEquippedWeapons() - mainHandOutfitSlot, offHandOutfitSlot, backupMainHandOutfitSlot, backupOffHandOutfitSlot.
  • AreDyeChannelsDyeableForOutfitSlotData(outfitSlot, collectibleId) - primary, secondary, accent.
  • BeginRestyling(restyleMode) – Used to let Lua begin restyling outside of a station.
  • EndRestyling()
  • GetNumUnlockedOutfits() – numOutfits.
  • IsCollectiblePresentInEffectivelyEquippedOutfit(collectibleId) – isPresent – We wait to equip an outfit for real until after the UI is closed to prevent forcing extensive rebuilding of player models. This function returns if the collectibleId is being shown to the player as a preview of changing to that outfit.
  • GetNumOutfitStyleItemMaterials(outfitStyleId) – numItemMaterials. – For the time being, this is always going to return 1.
  • GetOutfitStyleItemMaterialName(outfitStyleId, itemMaterialIndex) – materialName.
  • GetOutfitStyleCost(outfitStyleId) - goldCost, isFree.
  • WouldOutfitBeHidden(outfitIndex) – isHidden, highestPriorityVisualLayerThatIsShowing.

  • EVENT_OUTFIT_CHANGE_RESPONSE - response, outfitIndex.
  • EVENT_OUTFIT_RENAME_RESPONSE - response, outfitIndex.

Home Storage
New collectibles have been added that allow placing storage chests in your house. Each chest is backed by a different bag of the form BAG_HOUSE_BANK_ONE through BAG_HOUSE_BANK_TEN. These chests are accessed using a standard banking interaction, which now provides which bag the bank interaction is servicing. It is returned by GetBankingBag() and also sent with EVENT_OPEN_BANK. GetBankingBag() returns BAG_BANK for the standard bank. However, the standard bank also services BAG_SUBSCRIBER_BANK as well.
  • GetBankingBag() – bankingBag.
  • IsHouseBankBag(bag) – isHouseBankBag.
  • GetCollectibleForHouseBankBag(houseBankBag) – collectibleId.
  • GetCollectibleBankAccessBag(collectibleId) – houseBankBag.

Skill information has been augmented on the client to support the Skills Advisor. The client now has all skill lines including inactive skill lines (Vampire or Werewolf if you are not a Vampire or Werewolf) and other class skill lines. Some new skill APIs have been added as well.
  • GetSkillLineAbilityRank(skillType, skillIndex, abilityIndex) - rankIndex - Gets the rank index (1-4) of a progression ability (active ability). This only works for the version of the skill that you currently have purchased or the unmorphed version if you have not purchased the skill. This should be fixed in the future to include ranks of all versions.
  • GetSkillHighestRankIndexAvailableAtSkillLineRank(skillType, skillIndex, abilityIndex, skillLineRank) - rankIndex. - Gets the highest rank index that an upgrade ability (passive ability) could be when its skill line has the passed in skillLineRank.
  • GetProgressionSkillProgressionName(skillType, skillIndex, abilityIndex) - progressionName. The name of the progression for a progression ability (active ability). It is the same as the unmorphed ability name without the rank index.
  • GetSpecificSkillAbilityInfo(skillType, skillIndex, abilityIndex, morphChoice, rankIndex) – abilityId, skillLineRankNeeded. Gets info for a specific morph and rank of a skill (passive or active ability). MorphChoice is 0-2. RankIndex is 1-4.
  • GetSpecificSkillAbilityKeysByAbilityId(abilityId) - skillType, skillIndex, abilityIndex, morphChoice, rankIndex – The mirrored version of GetSpecificSkillAbilityInfo.

Skills Advisor
The Skills Advisor provides an ordered set of passive and active skills called a skill build. It is integrated with the skill windows to provide suggestions when purchasing skills.
  • SetAdviseSkillLine(skillType, skillIndex, advise) – Sets a skill line to be advised. Used when a skill build advises a skill in a skill line you have not discovered.
  • GetSkillsAdvisorSuggestionLimit() – suggestionLimit.
  • GetNumAvailableSkillBuilds() – numSkillBuilds.
  • GetSkillBuildInfo(skillBuildId) - name, description, isTank, isHealer, isDPS.
  • GetNumSkillBuildAbilities(skillBuildId) – numSkillBuilds.
  • GetSkillBuildEntryInfo(skillBuildId, skillBuildAbilityIndex) - skillType, skillLineIndex, abilityIndex, isActiveAbility, morphChoice, rankIndex.
  • GetAvailableSkillBuildIdByIndex(skillBuildIndex) – skillBuildId.
  • SelectSkillBuild(skillBuildId, isAdvancedMode) – Advanced mode disables the skill advisor.
  • GetSkillBuildId() – skillBuildId.
  • IsSkillBuildAdvancedMode() – isSkillBuildAdvancedMode.
  • GetDefaultSkillBuildId() – skillBuildId – A default basic build.

Level Up Advisor
The Level Up Advisor has been added to the game. There are a number of APIs for getting information on the description, tips, and rewards for each level. There are also APIs for choosing and claiming rewards. See the API documentation for more information.

In the new previewing API, Lua has substantially more control over what happens when. The main new concept is the Preview Collection, which is a grouping of any number of individual previews that are applied at the same time. Currently, the only use case for multiple previews is with the Outfit System, as each slot is its own preview element. Other preview types cannot be mixed.
  • AddPreviewCollection() – previewCollectionId. – Creates a blank preview collection object to be populated with preview elements.
  • RemovePreviewCollection(previewCollectionId) SetPreviewCollectionShown(previewCollectionId, show) – success. – Clear out whatever collection is currently shown (invalidating its id) and shows the specified collection instead.
  • RefreshPreviewCollectionShown() – Run any of the character rebuilding logic necessary on the currently shown preview collection. Used to prevent excessive rebuilding on multiple changes at one time.
  • EnablePreviewMode(forceDismount)
  • DisablePreviewMode()
  • GetPreviewModeEnabled() – previewModeEnabled.
  • SetPreviewingOutfitIndexInPreviewCollection(previewCollectionId, outfitIndex)
  • SetPreviewingUnequippedOutfitInPreviewCollection(previewCollectionId)
  • ClearPreviewingOutfitIndexInPreviewCollection(previewCollectionId)
  • AddOutfitSlotPreviewElementToPreviewCollection(previewCollectionId, outfitSlot, collectibleDefId, itemMaterialIndex, primaryDyeDefId, secondaryDyeDefId, accentDyeDefId, refreshIfShowing)
  • ClearOutfitSlotPreviewElementFromPreviewCollection(previewCollectionId, outfitSlot, refreshIfShowing)
  • ClearAllOutfitSlotPreviewElementsFromPreviewCollection(previewCollectionId, refreshIfShowing)
  • GetPreviewCollectionCurrentlyShown() – previewCollectionId.
  • GetOutfitSlotInfoForOutfitSlotInPreviewCollection(previewCollectionId, outfitSlot) - collectibleDefId, itemMaterialIndex, primaryDyeDefId, secondaryDyeDefId, accentDyeDefId.
  • SetFrameLocalPlayerLookAtDistanceFactor(lookAtDistanceFactor) – Allows moving the player framing camera closer or farther from the player.

  • Add-ons will no longer receive BEGIN combat events in PvP areas if they target the player and come from a hostile source. Combat events will now only arrive when you’ve been damaged by the ability in these circumstances.
  • GetSmithingPatternMaterialItemInfo() now also returns for a certain quantity of a certain material which level item it makes.
  • Animation objects can now be enabled and disabled. When disabled they do not contribute to the timeline duration or act on their controls. Animation timelines can now set a minimum duration to allow looping timelines with the animations group toward the start.
  • EVENT_BATTLEGROUND_KILL now includes the killing ability id.
Gina Bruno
Senior Community Manager
Dev Tracker | Service Alerts | ESO Twitter | My Twitter
Staff Post
  • imenace

    • Add-ons will no longer receive BEGIN combat events in PvP areas if they target the player and come from a hostile source. Combat events will now only arrive when you’ve been damaged by the ability in these circumstances.

    did not do anything to addons such as miats, the addon creator confirmed that abilities such as snipe still show up before they hit, please look it into and give us an answer
  • ArtOfShred
    Is there a new function intended to replace ZO_LocalizeDecimalNumber? Have a few functions calling it and they throw errors on the PTS.

    Looked into it looks like line #130:
    local decimalSeparatorIndex = zo_strfind(amountString, "%"..DIGIT_GROUP_DECIMAL_REPLACER) -- Look for the literal separator
    is referencing a DIGIT_GROUP_DECIMAL_REPLACER which doesn't have a defined value anymore.
  • Ahanu2
    imenace wrote: »

    • Add-ons will no longer receive BEGIN combat events in PvP areas if they target the player and come from a hostile source. Combat events will now only arrive when you’ve been damaged by the ability in these circumstances.

    did not do anything to addons such as miats, the addon creator confirmed that abilities such as snipe still show up before they hit, please look it into and give us an answer

    this is very important @ZOS_GinaBruno @ZOS_JessicaFolsom pls guys
  • Walting

    Please make ingame titles only changeable by addons when the users approves the change. If this is not possible let addons not change displayed titles. Lot of popular addons have a function CustomTitlesLib that is hidden and useres are not informed about it nor can they deactivate it.
Sign In or Register to comment.