What's New in Dalamud v9
Dalamud v9 was a prior version of Dalamud, released together with Patch 6.5. This is a high-level overview of changes. You can see a code diff of all of these changes here.
Key Information
- Branch:
v9(view on GitHub) - Release Date: Targeted to release alongside Patch 6.5 (estimated September/October 2023).
- API Level: 9
- .NET Version: .NET 7.0 / .NET 8.0
New Features
- The console (
/xllog) has been redone, and now lets you create filters that can filter to specific plugins. - Added a new plugin-specific logging class that you can receive as a service
instance via the
IPluginLogtype.- Static functions in
PluginLoghave been deprecated, and we recommend that you move to the new service. They were slow and unreliable, due to having to look up the calling plugin via reflection, and won’t support new filtering features in the improved console. - We are planning to remove the static functions in a future API cycle.
- Static functions in
- Extended
DtrBarEntryto now allow for a tooltip, and an OnClick event, to add even more functionality to your DTR bar entries. - Added
IAddonLifecycleandIAddonEventManagerservices which simplify access to addons greatly. - Added comprehensive new service to acquire ImGui textures from game
icons/textures via
ITextureProvider, detailed below. - Added various new functions to manipulate colors for UI work in
Dalamud.Interface.ColorHelpers.
Major Changes
General
- All services must be used via interfaces, their implementations are now
private.
- This allows us to create per-plugin implementations of services, which will be able to safely dispose of plugin-specific resources - something we have never been able to do before reliably - and opens up the possibility of creating mocks that allow for testing outside of the game.
- We can also now build features that rely on detecting what plugin is using a service, like plugin-scoped logs and reliable command lists.
- To migrate, you only have to change the type used to the interface
equivalent in the
Dalamud.Plugin.Servicesnamespace (e.g.DataManager=>IDataManager)
IDataManager.ClientOpcodesandIDataManager.ServerOpcodeshave been removed. Dalamud systems that use opcodes directly will now use hooks instead. We recommend any plugin that has been using these opcodes to switch to hooks.
UI and ImGui
- The
UiBuilder.OpenMainUievent has been added, which you should subscribe to to open your plugin's "main interface", if applicable- This is shown as a separate, highlighted button in the plugin installer, in
addition to the already existing
OpenConfigUibutton
- This is shown as a separate, highlighted button in the plugin installer, in
addition to the already existing
- Texture- and Icon-related functions on DataManager have been removed and are
now available in a new service,
ITextureProvider.- API has been simplified in a major way and now properly supports high-resolution textures
- Icons and textures are now only loaded once globally when requesting them using this service, reducing memory usage
- Icons and textures are now automatically unloaded if not drawn for more than 2 seconds, and will be reloaded transparently if they are accessed again by your plugin
- An API that allows plugins to replace paths to tex files has been added. This means that you no longer manually have to implement this functionality to make your plugin compatible with e.g. UI mods.
- ITextureProvider is designed for ImGui specific use cases. Plugins that need to work with raw tex files should implement their own logic.
- All Dalamud APIs that interact with textures now return
IDalamudTextureWrap, andIDalamudTextureWrapno longer inherits from theTextureWraptype in ImGuiScene. This has been done to decouple the public API from ImGuiScene, and to remove the need for plugins to reference it.- To migrate, you merely need to switch the types used. The exposed API is exactly the same.
IDalamudTextureWrap.Size(Vector2) has been added, finally.
- IDisposable ImGui-helpers have been moved to the main Dalamud assembly and are
now accessible via the
Dalamud.Interface.Utilitynamespace- We recommend using these for any new UI, as they are much safer and reduce the chance of crashes caused by misbehaving UI code
Hooking
- Obsolete constructors for
Hook<T>and the staticHook<T>.FromX()functions have been removed.- Please use the equivalent functions in the
IGameInteropProviderservice IGameInteropProvider.HookFromSignature()has been added
- Please use the equivalent functions in the
SignatureHelper.Initialize()has been removed. Please useIGameInteropProvider.InitializeFromAttributes().
Minor Changes
Util.HttpClienthas been removed in favor of allowing plugins to manage their own HTTP lifecycles.- You can use
Dalamud.Networking.Http.HappyEyeballsCallbackas yourSocketsHttpHandler.ConnectCallbackto enable improved IPv6 connection handling to dual-stack servers.
- You can use
SeStringManagerhas been removed. Please useSeStringBuilderinstead.ChatHandlershas been removed.ChatHandlers.IsAutoUpdateCompleteis now available asDalamudPluginInterface.IsAutoUpdateCompleteChatHandlers.MakeItalics()can be accessed viaSeStringBuilder
Util.CopyTo()has been removed, as it has been added to the standard library asStream.CopyTo().DalamudPluginInterface.PluginNamesandPluginInternalNameshave been replaced in favor ofInstalledPlugins, which provides more context.- Obsolete/non-functional icons in
FontAwesomeIconhave been removed. DataManager.IsDataReadyhas been removed, as it is always true when plugins are loaded.SeStringBuilder.AddItemLink()now correctly adds a full item link, instead of only adding anItemPayload.Util.IsLinux()has been changed toUtil.IsWine().Util.GetHostPlatform()has been added to get the actual platform the game is running on - this relies on a special env var that may not be present on all environments Dalamud can run under yet.- The Serilog property
SourceContextis no longer used for Dalamud systems. Plugins implementing their own logging systems should write their plugin internal name to theDalamud.PluginNameproperty instead, otherwise, filtering in the new console will not work. UIBuilder.GposeActivehas been moved toIClientState.IsGPosing, and is now more reliable/will only be true if the user is actually in GPose.IDalamudPlugin.Namehas been removed. This has not been shown anywhere in more than 2 years.- Dev-Plugins without a manifest are no longer supported. Please have a manifest or use DalamudPackager!
- Most
FlyTextKindenum members have been renamed, see commit here.
Errata
These changes have been made after the official stabilization.
SigScannerwas mistakenly made internal, making it impossible for plugins to create their own scannersSigScannerwas made public with the same API, and the internal service implementation was decoupled
Contributors
We want to thank the following people for their contributions to Dalamud during this patch cycle:
- MidoriKami
- Haselnussbomber
- kalilistic
- Soreepeong
- nebel
- Caraxi
- Ottermandias
- Aireil
FFXIVClientStructs changes
These are relevant changes made to FFXIVClientStructs, listed here for reference. We want to thank aers, Pohky, WildWolf and the other FFXIVClientStructs contributors for their work.
From a593cb163e1c5d33b27d34df4d1ccc57d1e67643, as of commit
0af185ef155cf03f24c2dee8f50f3973a7d417aa:
Client/Game/ActionManager.cs:
- Changed
UseActionto take aulonginstead oflongfortargetID - Changed
UseActionLocationto take aulonginstead oflongfortargetID - Changed
GetActionStatusto take aulonginstead oflongfortargetID
Client/Game/ActionTimelineManager.cs:
- Added
Parentcharacter pointer - Added
GetHeightAdjustActionTimelineRowId
Client/Game/Character/Character.cs:
- Changed
ActionRecipientsObjectIdArrayto beulonginstead oflong - Added
EmoteController - Added
CalculateHeight
Client/Game/Character/CharacterManager.cs:
- Changed
LookupBattleCharaByObjectIdto take auintinstead ofint
Client/Game/Control/TargetSystem.cs:
- Changed GetCurrentTargetID to return
ulonginstead ofuint - Changed GameObjectArray.Objects to be
ulonginstead oflong
Client/Game/InstanceContent/PublicContentDirector.cs:
- Added
HandleEnterContentInfoPacket
Client/Game/InventoryManager.cs:
- Changed
MoveItemSlotto useushortinstead ofuintfor slot
Client/Game/Object/GameObject.cs:
- Removed
longoperators
Client/Game/QuestManager.cs:
- Removed
Obsoletefields and structs
Client/Game/RetainerManager.cs:
- Removed
Obsoletefields and structs - Changed
RetainerList.RetainertoRetainer - Changed functions from
RetainerList.RetainertoRetainer
Client/Game/UI/Map.cs:
- Added
MarkerInfo.ShouldRenderfield - Removed obsolete fields and structs
Client/Graphics/Kernel/Notifier.cs:
- Changed namespace to match file location
Client/Graphics/Kernel/Texture.cs:
- Changed namespace to match file location
Client/Graphics/Scene/CharacterBase.cs:
- Changed
ColorSetTexturestoColorTableTextures - Changed
ColorSetTexturesSpantoColorTableTexturesSpan
Client/System/Framework/Framework.cs:
- Added
TaskManagerfield
Client/System/Resource/Handle/ResourceHandle.cs:
- Added
Unknown0Afield - Added
Expansionfield - Added
UserDatafield - Added
LoadStatefield - Added
LoadIntoKernelmethod - Added
Loadmethod - Added
GetUserDatamethod
Client/System/Resource/ResourceGraph.cs:
- Changed
ResourceCategoryto be aushort
Client/UI/AddonLookingForGroupDetail.cs:
- Added
RelayPartyFinderInfoButtonfield - Added
CategoryImageNodefield
Client/UI/AddonRecipeNote.cs:
- Changed many Unk fields to
AtkTextNode*
Client/UI/AddonSalvageItemSelector.cs:
- Changed
ItemsDatatoItemswith a fixed size array
Client/UI/Agent/AgentContext.cs:
- Changed
ContextMenu.EventParamsto be a fixed array
Client/UI/Agent/AgentFriendList.cs:
- Added
SelectedPlayerName,SelectedContentIdandSelectedIndexfields
Client/UI/Agent/AgentHudLayout.cs:
- Changed namespace to
FFXIVClientStructs.FFXIV.Client.UI.Agent
Client/UI/Agent/AgentReadyCheck.cs:
- Changed
ReadyCheckEntriesfromFixedArraytoFixedSizeArray
Client/UI/Agent/AgentRetainerList.cs:
- Changed
Retainersto fixed array
Client/UI/Agent/AgentSalvage.cs:
- Changed
DesynthResulttoDesynthResultsand changedFixedArraytoFixedSizeArray
Client/UI/Info/InfoProxyCommonList.cs:
- Changed
DatatoCharData - Changed
ContentIDtoulong - Changed
GetContentIDForEntryto returnulong - Removed
CharIndexfield fromInfoProxyCommonList - Removed
CharacterDictandCharacterArrayfromInfoProxyCommonList - Moved
OnlineStatus,MentorState,PartyStatus,DutyStatusto singleOnlineStatusenum linked to bitflag ofOnlineStatus.exd - Added
Sortfield - Added
ExtraFlagsfield
Client/UI/Info/InfoProxyCatalogSearch.cs:
- Was
InfoProxyItemSearch
Client/UI/Info/InfoProxyItemSearch.cs:
- Was
InfoProxy11 - Changed
SelectedItemIdtoSearchItemId - Changed
GlobalItemIdtoListingId - Added
RetainerListings - Added
RetainerListingsCount - Added
PlayerRetainers
Client/UI/Misc/CharaViewPortrait.cs:
- Changed
DirectionalLightingVerticalAngleandDirectionalLightingHorizontalAngleto be signed
Client/UI/Misc/ItemOrderModule.cs:
- Changed
RetainerSorterto be aStdMap<ulong, Pointer<ItemOrderModuleSorter>> - Removed
RetainerSorterCount
Client/UI/Misc/RaptureGearsetModule.cs:
- Changed
Gearsetto be a fixed array namedEntries - Changed
IsValidGearsetto returnboolinstead ofbyte - Changed
CreateGearsetto returnsbyteinstead ofuint - Changed
HasLinkedGlamourPlateto returnboolinstead ofbyte - Changed
IsGearsetLinkedWithBannertoHasLinkedBanner - Changed
GetBannerIndexByGearsetIndextoGetBannerIndex - Changed
SetBannerIndexForGearsetIndextoSetBannerIndex - Added
FindGearsetIDByName - Added
GearsetItem.Flagsfield - Changed
GearsetEntry.RightLeftto be namedRingLeft
Client/UI/Misc/RaptureMacroModule.cs:
- Changed
Instanceto be a method instead of a property - Changed
IndividualandSharedto be fixed arrays - Added
RaptureTextModuleandTextCheckerfields
Client/UI/Misc/RetainerCommentModule.cs:
- Changed
Retainersto fixed array - Changed
SetCommentto returnvoidinstead ofvoid*
Client/UI/Shell/RaptureShellModule.cs:
- Changed
Instanceto be a method instead of a property
Client/UI/UIModule.cs:
- Changed
GetUIInputDatato returnUIInputData*
Component/GUI/AtkComponentDragDrop.cs:
- Added
AtkDragDropInterfacefield
Component/GUI/AtkComponentListItemRenderer.cs:
- Added
AtkDragDropInterfacefield
Component/GUI/AtkDragDropManager.cs:
- Added
DragDrop1,DragDrop2andDragDropSpointer fields - Added
IsDragging,ReclickToDrop,MouseMovedandIsNotDiscardingbool fields
Component/GUI/AtkLinkedList.cs:
- Obsoleted
AtkLinkedListin favor ofStdLinkedList
Component/GUI/AtkModule.cs:
- Added
AtkTextureResourceManagerfield - Changed
DefaultTextureVersiontoAtkTextureResourceManager.DefaultTextureVersion - Changed
ExdModuletoAtkTextureResourceManager.ExdModule
Component/GUI/AtkStage.cs:
- Added
AtkTextureResourceManagerfield
Component/GUI/AtkTextureResource.cs:
- Changed
Count_1toCount - Changed
Count_2toVersion - Added
ShareCountfield
Component/GUI/AtkUnitBase.cs:
- Added
ShowHideFlagsfield - Changed
ShowandHideparamenters to match the game
Component/GUI/AtkUnitList.cs:
- Changed
AtkUnitEntriesto fixed array namedEntries; - Changed
Counttoushort
STD/Pair.cs:
- Added
Deconstructmethod toStdPair
New Files Added:
Component/GUI/AtkDragDropInterface.csComponent/GUI/AtkTextureResourceManager.csClient/UI/UIInputData.csClient/UI/Agent/AgentScenarioTree.csClient/UI/Agent/AgentMycBattleAreaInfo.csClient/UI/Agent/AgentMiragePrismPrismItemDetail.csClient/UI/Agent/AgentItemDetail.csClient/System/Framework/TaskManager.csClient/System/Framework/Task.csClient/System/Framework/RootTask.csApplication/Network/WorkDefinitions/EnterContentInfo.csClient/Game/Control/EmoteController.csClient/Game/Conditions.cs
Changed All Agents to use the new AgentGettersGenerator
Changed All VTable to vtbl