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.ClientOpcodesand- IDataManager.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 use- IGameInteropProvider.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 use- SeStringBuilderinstead.
- ChatHandlershas been removed.- ChatHandlers.IsAutoUpdateCompleteis now available as- DalamudPluginInterface.IsAutoUpdateComplete
- ChatHandlers.MakeItalics()can be accessed via- SeStringBuilder
 
- Util.CopyTo()has been removed, as it has been added to the standard library as- Stream.CopyTo().
- DalamudPluginInterface.PluginNamesand- PluginInternalNameshave been replaced in favor of- InstalledPlugins, 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 an- ItemPayload.
- Util.IsLinux()has been changed to- Util.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 to- IClientState.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 scanners- SigScannerwas 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.cs
- Component/GUI/AtkTextureResourceManager.cs
- Client/UI/UIInputData.cs
- Client/UI/Agent/AgentScenarioTree.cs
- Client/UI/Agent/AgentMycBattleAreaInfo.cs
- Client/UI/Agent/AgentMiragePrismPrismItemDetail.cs
- Client/UI/Agent/AgentItemDetail.cs
- Client/System/Framework/TaskManager.cs
- Client/System/Framework/Task.cs
- Client/System/Framework/RootTask.cs
- Application/Network/WorkDefinitions/EnterContentInfo.cs
- Client/Game/Control/EmoteController.cs
- Client/Game/Conditions.cs
Changed All Agents to use the new AgentGettersGenerator
Changed All VTable to vtbl