Adding Custom Player Outfits - Kamzik123/AnvilToolkit-Resources GitHub Wiki

This tutorial walks you through adding a new craftable player outfit to AC4: Black Flag by editing the game's XML data files. The outfit will appear in the crafting menu, and once crafted, will be equipable from the hideout wardrobe and the Jackdaw cabin outfit selection.

Game compatibility: This tutorial was written for and tested on Assassin's Creed IV: Black Flag only. Other AnvilNext titles (AC Rogue, AC3, etc.) may use a similar system but this has not been tested on those games.

A note on Path vs ID: Throughout the XML examples you'll see Path attributes on References, Handles, and ObjectPtrs. These paths are not used by the game engine — the engine locates and loads all files exclusively by their numeric ID. The Path values are filled in by AnvilToolkit as a human-readable convenience so you can tell which file is being referenced. When modding, the ID is what matters.

A note on StringID: The StringID field in UIString elements refers to a localization key in the game's localization package. If the ID doesn't exist in the localization data, nothing will display in-game.


WARNING: Back up your save file before making any of these edits. Modifying game data files — especially the PlayerProgressionManager and EconomicSystemSettings — can corrupt your save. Always keep a backup of your save folder before testing.


Table of Contents


Overview

Adding an outfit requires creating 5 new files and modifying 4 existing files. The outfit system uses a two-item design: a crafting item (Category 9 QuestItem) that gets created when the player crafts, and the actual outfit (Category 38 Outfit) that gets unlocked automatically once the crafting item enters the inventory.

New Files Type Purpose
Outfit InventoryItemSettings Item definition The wearable outfit (Category 38)
Crafting InventoryItemSettings Item definition The crafting result (Category 9)
Outfit UIInventoryItem UI data Name/description/icon for wardrobe
Crafting UIInventoryItem UI data Name/description/icon for crafting menu
UICraftingRecipe Recipe Ingredients and crafted item
Modified Files What to add
CraftingContext Recipe reference
ACGA_UI_Page_Shop_Outfits Outfit UIInventoryItem reference (controls hideout wardrobe and Jackdaw cabin)
EconomicSystemSettings Both InventoryItemSettings references
PlayerProgressionManager_ACGA OutfitItemDataMapping + PlayerAttributesBuilder + WorldUpgradeInventorySettings

What You Need Before Starting

  • An EntityBuilder for your outfit. You can create a custom one or reuse an existing one for testing.
  • A TextureMapSpec for the outfit's inventory icon. You can reuse an existing one for testing.
  • Ingredient InventoryItemSettings IDs if you want the recipe to require crafting materials. You can leave the ingredients list empty for testing.
  • Unique IDs for all new objects. Pick a range that doesn't conflict with existing game data.

Step 1: Create the Outfit InventoryItemSettings

This is the actual wearable outfit item. It uses Category 38 (InvItem_Outfit).

Important: The SubCategory must be a unique value not used by any other outfit. And Locked must be False.

<InventoryItemSettings ID="[OUTFIT_SETTINGS_ID]">
    <Value Name="Locked" Type="Bool">False</Value>
    <Value Name="IsEconomicQuestItem" Type="Bool">False</Value>
    <Value Name="Rechargeable" Type="Bool">False</Value>
    <Value Name="IsSellable" Type="Bool">False</Value>
    <Value Name="ULCMode" Type="Enum" EnumName="ULCMode" ValueName="NotULCItem">0</Value>
    <Value Name="Price" Type="UInt32">0</Value>
    <UIString Name="Name" ID="[UNIQUE_ID]">
        <Value Name="StringID" Type="Int32">-1</Value>
        <Value Name="DevString" Type="String">My Custom Outfit</Value>
    </UIString>
    <UIString Name="Description" ID="[UNIQUE_ID]">
        <Value Name="StringID" Type="Int32">-1</Value>
        <Value Name="DevString" Type="String">My custom outfit description</Value>
    </UIString>
    <InventoryItemCategorization ID="[UNIQUE_ID]">
        <Value Name="Category" Type="Enum" EnumName="InventoryItemCategory" ValueName="InvItem_QuestItem">38</Value>
        <Value Name="SubCategory" Type="Int32">32</Value>
    </InventoryItemCategorization>
    <Value Name="Rank" Type="Int32">0</Value>
    <Value Name="StoreInInventory" Type="Bool">True</Value>
</InventoryItemSettings>

Note: Despite the ValueName showing InvItem_QuestItem, the actual value 38 corresponds to InvItem_Outfit. The ValueName is a display label in the toolkit and doesn't affect the game — only the numeric value matters.


Step 2: Create the Crafting InventoryItemSettings

This is the intermediate item that gets created when the player crafts. It uses Category 9 (InvItem_QuestItem).

Important: Locked must be False — this controls whether the crafting recipe appears as available.

<InventoryItemSettings ID="[CRAFTING_SETTINGS_ID]">
    <Value Name="Locked" Type="Bool">False</Value>
    <Value Name="IsEconomicQuestItem" Type="Bool">False</Value>
    <Value Name="Rechargeable" Type="Bool">False</Value>
    <Value Name="IsSellable" Type="Bool">False</Value>
    <Value Name="ULCMode" Type="Enum" EnumName="ULCMode" ValueName="NotULCItem">0</Value>
    <Value Name="Price" Type="UInt32">0</Value>
    <UIString Name="Name" ID="[UNIQUE_ID]">
        <Value Name="StringID" Type="Int32">-1</Value>
        <Value Name="DevString" Type="String">My Custom Outfit</Value>
    </UIString>
    <UIString Name="Description" ID="[UNIQUE_ID]">
        <Value Name="StringID" Type="Int32">-1</Value>
        <Value Name="DevString" Type="String">My custom outfit description</Value>
    </UIString>
    <InventoryItemCategorization ID="[UNIQUE_ID]">
        <Value Name="Category" Type="Enum" EnumName="InventoryItemCategory"
               ValueName="InvItem_QuestItem">9</Value>
        <Value Name="SubCategory" Type="Int32">0</Value>
    </InventoryItemCategorization>
    <Value Name="Rank" Type="Int32">0</Value>
    <Value Name="StoreInInventory" Type="Bool">True</Value>
</InventoryItemSettings>

Step 3: Create the Outfit UIInventoryItem

This controls how the outfit appears in the hideout wardrobe and Jackdaw cabin outfit selection.

<UIInventoryItem ID="[OUTFIT_UI_ID]">
    <Value Name="InventoryItemSettingsRef" Type="UInt64" Path="[OUTFIT_SETTINGS_ID]">[OUTFIT_SETTINGS_ID]</Value>
    <UIString Name="Name" ID="[UNIQUE_ID]">
        <Value Name="StringID" Type="Int32">-1</Value>
        <Value Name="DevString" Type="String">My Custom Outfit</Value>
    </UIString>
    <UIString Name="Description" ID="[UNIQUE_ID]">
        <Value Name="StringID" Type="Int32">-1</Value>
        <Value Name="DevString" Type="String">My custom outfit description</Value>
    </UIString>
    <Value Name="TextureMapSpecRef" Type="UInt64" Path="[ICON_PATH]">[ICON_TEXTURE_ID]</Value>
</UIInventoryItem>

Step 4: Create the Crafting UIInventoryItem

This controls how the item appears in the crafting menu.

<UIInventoryItem ID="[CRAFTING_UI_ID]">
    <Value Name="InventoryItemSettingsRef" Type="UInt64" Path="[CRAFTING_SETTINGS_ID]">[CRAFTING_SETTINGS_ID]</Value>
    <UIString Name="Name" ID="[UNIQUE_ID]">
        <Value Name="StringID" Type="Int32">-1</Value>
        <Value Name="DevString" Type="String">My Custom Outfit</Value>
    </UIString>
    <UIString Name="Description" ID="[UNIQUE_ID]">
        <Value Name="StringID" Type="Int32">-1</Value>
        <Value Name="DevString" Type="String">My custom outfit description</Value>
    </UIString>
    <Value Name="TextureMapSpecRef" Type="UInt64" Path="[ICON_PATH]">[ICON_TEXTURE_ID]</Value>
</UIInventoryItem>

Step 5: Create the UICraftingRecipe

This defines the crafting recipe — what ingredients are needed and what gets crafted.

The CraftedItem must point to the Crafting InventoryItemSettings (Category 9), not the outfit itself. If you point it to the Category 38 outfit directly, crafting will silently fail (no materials consumed, no item created).

<?xml version="1.0" encoding="utf-8"?>
<?info tool="AnvilToolkit" toolVersion="1.3.5" type="1"?>
<Object ID="[RECIPE_ID]" Type="UICraftingRecipe" IsManaged="true">
    <BaseObject ID="[UNIQUE_ID]" Name="RecipeName" Type="UIString">
        <Signed32 Name="OasisLineID">-1</Signed32>
        <LString Name="TempString">My Custom Outfit</LString>
    </BaseObject>
    <Handle Name="CraftedItem" Type="InventoryItemSettings" PointerType="Inlined" Path="[CRAFTING_SETTINGS_ID]">[CRAFTING_SETTINGS_ID]</Handle>
    <DynamicSmallArray Name="Ingredients" Type="BaseObject">
        <!-- Add ingredients here. Example: -->
        <!--
        <BaseObject ID="[UNIQUE_ID]" Type="CraftingIngredient">
            <Handle Name="Ingredient" Type="InventoryItemSettings" PointerType="Inlined" Path="[INGREDIENT_ID]">[INGREDIENT_ID]</Handle>
            <String Name="MapIconID">ANIMAL_WhiteJaguar_Menu</String>
            <Unsigned32 Name="Quantity">1</Unsigned32>
        </BaseObject>
        -->
    </DynamicSmallArray>
    <Handle Name="AFSImage" Type="TextureMapSpec" PointerType="Inlined" Path="[ICON_PATH]">[ICON_TEXTURE_ID]</Handle>
    <Unsigned32 Name="PlayerValue">0</Unsigned32>
    <Enum Name="CraftingCategory" Type="CraftingCategory" Value="CraftingCategory_Outfit">4</Enum>
    <Bool Name="IsUnique">True</Bool>
</Object>

Step 6: Register in CraftingContext

File: CraftingContext.xml (file 2112)

Add your recipe reference to the UICraftingRecipe array:

<Reference Type="UICraftingRecipe" PointerType="External" ReferenceType="0" Path="[RECIPE_ID]">[RECIPE_ID]</Reference>

Step 7: Register in the Outfit Page

File: ACGA_UI_Page_Shop_Outfits.xml (file 6147)

Add your outfit UIInventoryItem reference to the InventoryItems array:

<FileReference IsGlobal="0" Path="[OUTFIT_UI_ID]">[OUTFIT_UI_ID]</FileReference>

Note: The exact element name (FileReference vs Reference) may vary depending on your exporter format.


Step 8: Register in EconomicSystemSettings

File: EconomicSystemSettings (file 111)

Recommended to use Schema-Based exporter (Shift+Right Click the file and export Schema-Based)

Add both InventoryItemSettings to the item reference list — the outfit (Category 38) and the crafting item (Category 9):

<Reference Type="InventoryItemSettings" PointerType="External" ReferenceType="0" Path="[OUTFIT_SETTINGS_ID]">[OUTFIT_SETTINGS_ID]</Reference>
<Reference Type="InventoryItemSettings" PointerType="External" ReferenceType="0" Path="[CRAFTING_SETTINGS_ID]">[CRAFTING_SETTINGS_ID]</Reference>

Step 9: Add OutfitItemDataMapping in PlayerProgressionManager

File: PlayerProgressionManager_ACGA.xml (file 107)

Find the OutfitItemEntityBuilderMapping array and add your mapping entry. This tells the game which EntityBuilder to use for your outfit.

<BaseObjectPtr ID="[UNIQUE_ID]" Type="OutfitItemDataMapping" PointerType="Inlined">
    <Handle Name="OutfitItem" Type="InventoryItemSettings" PointerType="Inlined" Path="[OUTFIT_SETTINGS_ID]">[OUTFIT_SETTINGS_ID]</Handle>
    <Handle Name="CorrespondingEntityBuilder" Type="EntityBuilder" PointerType="Inlined" Path="[ENTITY_BUILDER_ID]">[ENTITY_BUILDER_ID]</Handle>
</BaseObjectPtr>

Step 10: Add PlayerAttributesBuilder in PlayerProgressionManager

File: PlayerProgressionManager_ACGA.xml (file 107)

Find the PlayerAttributesBuilder array (the list of PlayerAttributesBuilder ObjectPtrs, not to be confused with CharacterAttributesBuilderData). Add a new entry for your outfit's EntityBuilder. Without this, the game will fall back to the default outfit model even though the OutfitItemDataMapping exists.

<ObjectPtr ID="[UNIQUE_ID]" Type="PlayerAttributesBuilder" PointerType="Inlined" IsManaged="true">
    <Handle Name="EntityBuilder" Type="EntityBuilder" PointerType="Inlined" Path="[ENTITY_BUILDER_ID]">[ENTITY_BUILDER_ID]</Handle>
    <BaseObject ID="[UNIQUE_ID]" Name="ProgressionCharacterSelector" Type="ProgressionCharacterSelector">
        <Handle Name="ProgressionCharacter" Type="ProgressionCharacter" PointerType="Inlined" Path="25725995267">25725995267</Handle>
    </BaseObject>
    <Bool Name="CanBuilderBeOverriden">True</Bool>
    <DynamicSmallArray Name="AgeSelector" Type="ObjectPtr" />
    <DynamicSmallArray Name="ChestArmorSelector" Type="ObjectPtr" />
    <DynamicSmallArray Name="BootsSelector" Type="ObjectPtr" />
    <DynamicSmallArray Name="RightArmSelector" Type="ObjectPtr" />
    <DynamicSmallArray Name="ShouldersSelector" Type="ObjectPtr" />
    <DynamicSmallArray Name="LeftArmSelector" Type="ObjectPtr" />
    <DynamicSmallArray Name="RightArmHBSelector" Type="ObjectPtr" />
    <DynamicSmallArray Name="PoisonBladeSelector" Type="ObjectPtr" />
    <DynamicSmallArray Name="MetalFistSelector" Type="ObjectPtr" />
    <DynamicSmallArray Name="KnivesSelector" Type="ObjectPtr" />
    <DynamicSmallArray Name="HealthObjectPouchSelector" Type="ObjectPtr" />
    <DynamicSmallArray Name="SmokeBombPouchSelector" Type="ObjectPtr" />
    <DynamicSmallArray Name="ParachutesPouchSelector" Type="ObjectPtr" />
    <DynamicSmallArray Name="CapeSelector" Type="ObjectPtr" />
    <DynamicSmallArray Name="ColorSelector" Type="ObjectPtr" />
    <DynamicSmallArray Name="NarrativeSelector" Type="ObjectPtr" />
    <DynamicSmallArray Name="AssassinMarkSelector" Type="ObjectPtr" />
</ObjectPtr>

Note: 25725995267 is the ID of the main player ProgressionCharacter. This value is the same for all outfits.


Step 11: Add WorldUpgradeInventorySettings in PlayerProgressionManager

File: PlayerProgressionManager_ACGA.xml (file 107)

Find the WorldUpgradeInventorySettingsList array inside the InventoryUpgradeRuleSettingsRepository and add a new entry. This is the mechanism that automatically unlocks the outfit when the crafting item enters the player's inventory.

It has two states:

  • State 0 (default): No condition, no actions.
  • State 1 (upgrade): Monitors for the crafting QuestItem in the player's inventory. When detected, unlocks the outfit and adds it to the gained inventory.
<ObjectPtr ID="[UNIQUE_ID]" Type="WorldUpgradeInventorySettings" PointerType="Inlined" IsManaged="true">
    <DynamicSmallArray Name="UpgradeInventoryStates" Type="ObjectPtr">

        <!-- State 0: Default (no condition, no actions) -->
        <ObjectPtr ID="[UNIQUE_ID]" Type="DefaultWorldUpgradeRuleState" PointerType="Inlined">
            <ObjectPtr Name="WorldUpgradeCondition" PointerType="Null" />
            <DynamicSmallArray Name="WorldUpgradeActions" Type="ObjectPtr" />
        </ObjectPtr>

        <!-- State 1: Triggered when crafting item is in inventory -->
        <ObjectPtr ID="[UNIQUE_ID]" Type="DefaultWorldUpgradeRuleState" PointerType="Inlined">
            <ObjectPtr ID="[UNIQUE_ID]" Name="WorldUpgradeCondition" Type="WorldUpgradeInventoryCondition" PointerType="Inlined">
                <ObjectPtr ID="[UNIQUE_ID]" Name="ConditionHolder" Type="BasicInventoryConditionHolder" PointerType="Inlined">
                    <Object ID="[UNIQUE_ID]" Name="InventoryCondition" Type="InventoryCondition" IsManaged="true">
                        <Bool Name="CheckAllCharacters">False</Bool>
                        <Bool Name="CheckItemsInSameCharacter">False</Bool>
                        <Bool Name="CheckAllItems">True</Bool>
                        <Bool Name="CheckCurrentAgainstMax">False</Bool>
                        <Enum Name="PlayerCharacterFilter" Type="PlayerCharacterFilter" Value="PlayerCharacterFilter_All">0</Enum>
                        <BaseObject ID="[UNIQUE_ID]" Name="ProgressionCharacterSelector" Type="ProgressionCharacterSelector">
                            <Handle Name="ProgressionCharacter" Type="ProgressionCharacter" PointerType="Inlined" Path="25725995267">25725995267</Handle>
                        </BaseObject>
                        <Enum Name="ItemType" Type="InventoryCondition::ItemType" Value="ItemType_Specific">1</Enum>
                        <DynamicSmallArray Name="InventoryItems" Type="Handle">
                            <!-- Points to CRAFTING item (Cat 9), NOT the outfit -->
                            <Handle Type="InventoryItemSettings" PointerType="Inlined" Path="[CRAFTING_SETTINGS_ID]">[CRAFTING_SETTINGS_ID]</Handle>
                        </DynamicSmallArray>
                        <Enum Name="InventoryCheckType" Type="InventoryCondition::InventoryCheckType" Value="InventoryCheckType_PlayerInventory">0</Enum>
                        <Enum Name="ItemLockStatus" Type="InventoryItemLockStatus" Value="InventoryItemLockStatus_Unlocked">1</Enum>
                        <Object ID="[UNIQUE_ID]" Name="ItemCategorization" Type="InventoryItemCategorization">
                            <Enum Name="Category" Type="InventoryItemCategory" Value="InvItem_Unset">0</Enum>
                            <Unsigned32 Name="SubCategory">0</Unsigned32>
                        </Object>
                        <Enum Name="ItemCategory" Type="InventoryItemCategory" Value="InvItem_Unset">0</Enum>
                        <Enum Name="ContainerCategory" Type="InventoryItemCategory" Value="InvItem_Unset">0</Enum>
                        <Enum Name="ComparisonType" Type="InventoryCondition::ComparisonType" Value="ComparisonType_Greater">3</Enum>
                        <Unsigned32 Name="Count">0</Unsigned32>
                    </Object>
                </ObjectPtr>
                <BaseObject ID="[UNIQUE_ID]" Name="ProgressionCharacterSelector" Type="ProgressionCharacterSelector">
                    <Handle Name="ProgressionCharacter" Type="ProgressionCharacter" PointerType="Inlined" Path="0">0</Handle>
                </BaseObject>
            </ObjectPtr>
            <DynamicSmallArray Name="WorldUpgradeActions" Type="ObjectPtr">

                <!-- Action 1: Unlock the outfit (set Locked = false) -->
                <ObjectPtr ID="[UNIQUE_ID]" Type="WorldUpgradeAction" PointerType="Inlined">
                    <Enum Name="WorldUpgradeActionType" Type="WorldUpgradeActionType" Value="WorldUpgradeActionType_OnUpgrade">1</Enum>
                    <Bool Name="CanExecuteOffline">True</Bool>
                    <Enum Name="RevertMode" Type="AbstractWorldUpgradeAction::RevertMode" Value="RevertMode_Never">2</Enum>
                    <Bool Name="IsExecuteAllowedOnExternalCommit">False</Bool>
                    <ObjectPtr ID="[UNIQUE_ID]" Name="AIAction" Type="ActionItemSettingsLock" PointerType="Inlined" IsManaged="true">
                        <Enum Name="Type" Type="AIActionType" Value="AIActionType_Reversible">1</Enum>
                        <Enum Name="LockType" Type="ActionItemSettingsLock::LockType" Value="LockType_Unlock">1</Enum>
                        <DynamicSmallArray Name="InventoryItems" Type="Handle">
                            <!-- Points to OUTFIT item (Cat 38) -->
                            <Handle Type="InventoryItemSettings" PointerType="Inlined" Path="[OUTFIT_SETTINGS_ID]">[OUTFIT_SETTINGS_ID]</Handle>
                        </DynamicSmallArray>
                    </ObjectPtr>
                </ObjectPtr>

                <!-- Action 2: Add outfit to gained inventory -->
                <ObjectPtr ID="[UNIQUE_ID]" Type="WorldUpgradeAction" PointerType="Inlined">
                    <Enum Name="WorldUpgradeActionType" Type="WorldUpgradeActionType" Value="WorldUpgradeActionType_OnUpgrade">1</Enum>
                    <Bool Name="CanExecuteOffline">False</Bool>
                    <Enum Name="RevertMode" Type="AbstractWorldUpgradeAction::RevertMode" Value="RevertMode_Never">2</Enum>
                    <Bool Name="IsExecuteAllowedOnExternalCommit">False</Bool>
                    <ObjectPtr ID="[UNIQUE_ID]" Name="AIAction" Type="ActionQuestItem" PointerType="Inlined" IsManaged="true">
                        <Enum Name="Type" Type="AIActionType" Value="AIActionType_Reversible">1</Enum>
                        <Enum Name="EntitySelectionMode" Type="AIActionEntity::EntitySelectionMode" Value="EntitySelectionMode_Context">0</Enum>
                        <Handle Name="Entity" Type="Entity" PointerType="Inlined" Path="0">0</Handle>
                        <Enum Name="TransactionType" Type="ActionQuestItem::TransactionType" Value="TransactionType_Add">0</Enum>
                        <DynamicSmallArray Name="ActionQuestItemInventoryItems" Type="ObjectPtr" />
                        <Object ID="[UNIQUE_ID]" Name="InventoryItems" Type="ActionQuestItemInventoryItemWrapper">
                            <DynamicSmallArray Name="Items" Type="ObjectPtr">
                                <ObjectPtr ID="[UNIQUE_ID]" Type="ActionQuestItemInventoryItem" PointerType="Inlined">
                                    <!-- Points to OUTFIT item (Cat 38) -->
                                    <Handle Name="InventoryItemSettings" Type="InventoryItemSettings" PointerType="Inlined" Path="[OUTFIT_SETTINGS_ID]">[OUTFIT_SETTINGS_ID]</Handle>
                                    <Unsigned32 Name="Quantity">1</Unsigned32>
                                </ObjectPtr>
                            </DynamicSmallArray>
                        </Object>
                        <Bool Name="ForceAction">True</Bool>
                        <Bool Name="ForceCheckCharacterInventory">False</Bool>
                        <DynamicSmallArray Name="ActionQuestItemCategories" Type="ObjectPtr" />
                        <BaseObject ID="[UNIQUE_ID]" Name="ProgressionCharacterSelector" Type="ProgressionCharacterSelector">
                            <Handle Name="ProgressionCharacter" Type="ProgressionCharacter" PointerType="Inlined" Path="25725995267">25725995267</Handle>
                        </BaseObject>
                        <Bool Name="ShowTransactionOnHUD">False</Bool>
                        <Enum Name="TrackingSpendType" Type="ActionQuestItem::TrackingSpendType" Value="TrackingSpendType_Unknown">0</Enum>
                        <Enum Name="TrackingEarnType" Type="ActionQuestItem::TrackingEarnType" Value="TrackingEarnType_MissionRewards">0</Enum>
                        <Unsigned32 Name="PreviousQuantity">0</Unsigned32>
                    </ObjectPtr>
                </ObjectPtr>

            </DynamicSmallArray>
        </ObjectPtr>
    </DynamicSmallArray>
</ObjectPtr>

Critical fields:

  • The condition's InventoryItems must point to the crafting item (Cat 9), not the outfit.
  • Both actions must point to the outfit item (Cat 38).
  • ForceAction must be True on the ActionQuestItem — without this, the outfit won't be added to the gained inventory.

How It All Connects

Player opens crafting menu
  → Game loads UICraftingRecipe from CraftingContext
  → Recipe shows as available (Crafting item has Locked = False)

Player crafts the recipe
  → Game creates the Cat 9 QuestItem and adds it to player inventory
  → Crafting ingredients are consumed

Inventory update triggers WorldUpgradeInventorySettings
  → Condition detects Cat 9 item in player inventory
  → Action 1: ActionItemSettingsLock unlocks the Cat 38 outfit (Locked → False)
  → Action 2: ActionQuestItem adds Cat 38 outfit to gained inventory

Outfit is now equipable
  → Shows in hideout wardrobe and Jackdaw cabin outfit selection
  → Game loads EntityBuilder from OutfitItemDataMapping when equipped
  → PlayerAttributesBuilder ensures the EntityBuilder loads correctly

Reference: Existing Outfit EntityBuilders

You can use these for testing or as a base for custom outfits:

Outfit EntityBuilder ID Path
Default 11821907168 DataPC_extra_chr\CHR_P_EdwardKenway_Default
Mayan 40580630714 DataPC_extra_chr\CHR_P_EdwardKenway_Mayan1stCiv_Outfit
Templar Armor 40580630643 DataPC_extra_chr\CHR_P_EdwardKenway_TemplarArmor
Stealth 40580630658 DataPC_extra_chr\CHR_P_EdwardKenway_Stealth_Outfit
Captain Drake 40580630672 DataPC_extra_chr\CHR_P_EdwardKenway_Captain_Drake
Captain Morgan 40580630700 DataPC_extra_chr\CHR_P_EdwardKenway_Captain_Morgan
Altair 45806627405 DataPC_extra_chr\CHR_P_EdwardKenway_AltairOutfit
Ezio 45806627434 DataPC_extra_chr\CHR_P_EdwardKenway_EzioOutfit
Connor 45806627570 DataPC_extra_chr\CHR_P_EdwardKenway_ConnorOutfit
Hunter 40580630686 DataPC_extra_chr\CHR_P_EdwardKenway_Hunter
Poacher 40580630721 DataPC_extra_chr\CHR_P_EdwardKenway_Poacher
Whaler 40580630693 DataPC_extra_chr\CHR_P_EdwardKenway_Whaler
Shark Hunter 40580630707 DataPC_extra_chr\CHR_P_EdwardKenway_Shark_Hunter
Legend 38189378033 DataPC_extra_chr\CHR_P_EdwardKenway_Legend
Stede Bonnet 40580630665 DataPC_extra_chr\CHR_P_EdwardKenway_Stede_Bonnet
Haytham 40580630679 DataPC_extra_chr\CHR_P_EdwardKenway_Haytham
⚠️ **GitHub.com Fallback** ⚠️