ESO UI API Patch Notes (Version 100014)
These patch notes highlight the larger changes to the ESO API. For the full, updated API, take a look at the newest version of the ESO UI documentation.
This patch adds a combat text system which displays damage numbers, healing numbers, and effects on units. The system comes will a default configuration, but can be modified using the SCT API functions:
Global System Functions:
- SetSCTKeyboardFont(fontName, fontStyle)
- SetSCTGamepadFont(fontName, fontStyle)
Events are the individual pieces of text that show up when something that the SCT system is tracking happens. The event types are listed in the SCT_EVENT_TYPE enumeration. Use CreateNewSCTEventVisualInfo to make an object that describes how an event displays. This function returns an id which can be used with the other APIs to manipulate the object.
- CreateNewSCTEventVisualInfo() – SCTEventVisualInfoId
- SetSCTEventVisualInfo(eventType, SCTEventVisualInfoId)
- Sets the global visual info for this event. It is inherited by all slots unless the slot has an overriding visual info set on this eventType.
- SetSCTEventVisualInfoTextFormat(SCTEventVisualInfoId, textType, format)
- The text type is main text or extra text (the two labels in an SCT event).
- The format string uses standard printf style and accepts the SCT event value (damage or healing) as its only argument.
- SetSCTEventVisualInfoTextFontSizes(SCTEventVisualInfoId, textType, keyboardFontSize, gamepadFontSize)
- SetSCTEventVisualInfoTextColorSCTEventVisualInfoId, textType, r, g, b)
- SetSCTEventVisualInfoHideWhenValueIsZero(SCTEventVisualInfoId, hideWhenValueIsZero)
Slots describe where SCT events appear. A slot has a location (relative to a unit or fixed on the screen), an animation style, and a set of filters which describe which SCT events are shown in the slot.
- CreateNewSCTSlot() – slotIndex
- SetSCTSlotPosition(slotIndex, SCTAnchorType, anchorPoint, UIOffsetX, UIOffsetY, cameraOffsetRight, cameraOffsetUp)
- Camera offsets are in world space. They will get larger as the camera gets closer to the unit and smaller as it gets farther away.
- SetSCTSlotZoomedInPosition(slotIndex, zoomedInCameraDistanceThreshold, zoomedInUIOffsetX, zoomedInUIOffsetY)
- Allows you to set a distance where if the camera is closer to the player than that distance, the offsets specified will be used. This is used to constrain SCT events when zoomed in, especially in first person.
- SetSCTSlotClamping(slotIndex, topEdgeUIOffsetBuffer, bottomEdgeUIOffsetBuffer)
- Clamps the SCT events in this slot between the screen top plus top edge offset and screen bottom minus bottom edge offset.
- SetSCTSlotAnimationTimeline(slotIndex, animationTimelineName)
- SetSCTSlotAnimationMinimumSpacing(slotIndex, minSpacingMS)
- Sets a duration such that no two SCT events will be closer than this duration in their animations. If many SCT events happen at one time it will advance the animations of events until they are all at least this duration apart.
- SetSCTSlotEventTypeShown(slotIndex, eventType, isShown)
- Sets whether this slot show the supplied event type.
- AddSCTSlotAllowedTargetType(slotIndex, targetType)
- AddSCTSlotExcludedTargetType(slotIndex, targetType)
- AddSCTSlotAllowedSourceType(slotIndex, sourceType)
- AddSCTSlotExcludedSourceType(slotIndex, sourceType)
- SetSCTSlotTargetReputationTypes(slotIndex, showForFriendly, showForNeutral, showForEnemy)
- SetSCTSlotSourceReputationTypes(slotIndex, showForFriendly, showForNeutral, showForEnemy)
- SetSCTSlotEventControlScales(slotIndex, defaultScale, critScale)
- Sets the scale of crit and non-crit events.
- SetSCTSlotEventVisualInfo(slotIndex, eventType, SCTEventVisualInfoId)
- Sets the override visual info for this event on this slot.
A cloud is an arrangement of SCT events. It allows you to specify a set of positions for SCT events to occupy around the positive specified by the slot.
- CreateNewSCTCloud() - SCTCloudId
- SetSCTSlotKeyboardCloud(slotIndex, SCTCloudId)
- SetSCTSlotGamepadCloud(slotIndex, SCTCloudId)
- AddSCTCloudOffset(SCTCloudId, ordering, UIOffsetX, UIOffsetY)
- Ordering is the order in which the slots are filled from 1 – N.
- SetSCTCloudAnimationOverlapPercent(SCTCloudId, animationOverlapPercent)
- Sets an percentage from 0-1 such that if there is an event in the cloud that has less than that percentage of its animation remaining, it will terminate that event and put the new event in its place.
A system has been added to the game to allow localizing in non-supported languages. Localizing the game engine strings will still be done through the .lang file. Interface strings, however, are now loaded for pregame and ingame from the files: EsoUI/lang/<langCode>_pregame.str and EsoUI/lang/<langCode>_client.str. They replace custom modification of the similarly named .lua files which were insecure. These .str files can contain string localizations and font settings. To localize a string use the following format:
[<numericStringId>] = “<localization>”
[SI_ABANDON_QUEST_CONFIRM] = “Abandon Quest”
To setup a font use this format:
[Font:<fontObjectName>] = “<fontDefinition>”
[Font:ZoGameFont] = “ EsoUI/Common/Fonts/Univers57.otf|25|sotf-shadow-thick"
These strings and fonts will be loaded before the stock UI is loaded so that the stock UI will make use of them. Any two letter language code can be chosen for a custom language (that isn’t already in use). The $(language) substitution will be replaced with that two letter code. The new substitution $(officialLanguage) will always be “en” for custom languages, and the language code for official languages.
Looking For Group
The looking for group systems have been significantly changed. The player can no longer choose a different role for each activity they queue for. The role state is global and it’s automatically used when adding all search entries. Players still have preferred roles, which they control, but now also have an assigned role, which the LFG system assigns when they player is placed in an LFG group.
The GetLFGOption function changed:
- Old: returns name, minLevel, maxLevel, minRank, maxRank, groupTypeAllowed, passedRequirements, description, keyboardDescriptionTexture, gamepadDescriptionTexture
- New: returns name, minLevel, maxLevel, minRank, maxRank, groupTypeAllowed, minNumMembers, description
The flow to queue for LFG is now AddGroupFinderSearchEntry (with as many entries as you want) followed StartGroupFinderSearch(). The old queueing functions have been removed completely:
The “Any” option has been removed and has been replaced by “Random.” Random will search for every specific activity you’re eligible to take part in and put you in the first one that is available. Along with random comes a new incentive feature: Daily/Standard rewards. Once per day you’ll be eligible for the daily reward. Upon acquisition, for the next 24 hours you’ll get standard rewards in place of daily rewards.
- GetLFGActivityRewardData(activity) – reward type, xpReward.
LFM lets you find more members for the current activity your LFG group is already doing. Only an LFG group can LFM now.
Also, there has been some separation added between the player’s difficulty setting and the group’s difficulty setting. A player’s difficulty setting will only ever be changed by the player, with the exception of the case where they become leader of an existing group, where they will take on the group’s difficulty if possible. The player’s difficulty is applied to the group if they are the leader and also applied when they enter a dungeon solo. The group’s difficulty can come from many things including LFG, or the fact that there is only a normal or only a veteran mode for a dungeon. We have also added a difficulty enum to allow for future expansion of difficulty modes (should that become necessary).
- Choose between the former two based on if the player is in the group.
Items can have up to three tags that are relevant for certain thieves’ guild quest conditions.
- GetItemLinkItemTagDescription(link, index)
The soul reservoir system has been changed slightly to allow revives at 0 raid lives left. There were some minor API changes and additions to support the new messaging.
- GetRaidReviveCounterInfo was renamed to GetRaidReviveCountersRemaining
Champion Points can now be disabled in certain campaigns. AreChampionPointsActive() returns if champion points are active and also the reason why if they are inactive.
Label Line Markup
We added the “|L” markup which allows lines to be placed on text. It is useful for underlines and strike through. Surround the text with you want to have the line on and it will word wrap the line properly with the text. The format is:
Removed the in-game web browser and reimplemented the customer service windows using game UI and APIs.
Added some functions to inspect whether a collectible or category of collectibles can be used for some effect:
Some collectibles can now grant quests (DLC unlocks right now):
Some collectibles can have cooldowns:
Also added a way to get the active collectible in a category:
GetJournalQuestConditionInfo() and GetJournalQuestConditionValues() now return isVisible which indicates if the condition should be shown to the player.
Added GetQuestItemCooldownInfo() to get the cooldown of quest items, in addition to the previously existing quest tool cooldown function.
Added two functions to help getting quest reward info for quests that end in different zones than they start.
- GetJournalQuestRewardInfoInZone(zoneIndex, questIndex, rewardIndex)
- Returns the reward that would be generated if the quest was completed in that zone.
- GetJournalQuestStartingZone(questIndex) – zoneIndex.
Renamed RESURRECT_FAILURE_REASON to RESURRECT_RESULT and added a result for SUCCESS to note when your resurrection of another player succeeds.
Added new event registration filters:
Added GetGuildEventId(guildId, category, eventIndex) to uniquely identify guild events.
Added AreUnitsCurrentlyAllied(unitTag1, unitTag2). It is used to determine if two units are on the same effective alliance. It is useful when dealing with cross alliance activities.
Added some more functions to get names for links:
EVENT_ZONE_CHANGED now also supplies the zoneId and subzoneId. EVENT_SCREEN_RESIZED is once again only sent once instead of once for each gui.
- Returns false when the player is using a special override action bar.
- GetZoneId(zoneIndex) and GetZoneIndex(zoneId)