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

This tutorial walks you through adding a new player outfit to AC4: Black Flag by editing the game's XML data files. The outfit 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: The Path attributes on References and Handles in the XML examples are not used by the game. The engine finds files only by their numeric ID. AnvilToolkit fills in the paths so you can tell which file is referenced. When modding, the ID is what matters.

WARNING: Back up your save file before testing. Editing the PlayerProgressionManager and EconomicSystemSettings can corrupt your save.

Table of Contents


Method Player gets the outfit Forges edited
1. Free outfit (main) Automatically on the next load, also on existing saves DataPC.forge
2. Shop outfit By buying it at a general store DataPC.forge + DataPC_Hideout.forge
3. Craftable outfit By crafting it DataPC.forge

All methods share steps 1-7. Every XML example uses placeholder IDs and the name MyOutfit, replace them with your own.


Common Steps

1. Unpack and export

  1. Select Black Flag in AnvilToolkit.
  2. Unpack DataPC.forge, then 51_-_Game Bootstrap Settings.data inside it.
  3. Export these files to XML into the root of the unpacked .data folder (next to the game files):
    • 6147_-_ACGA_UI_Page_Shop_Outfits.UIInventoryPage
    • 111_-_000000006E1A3E32.EconomicSystemSettings
    • 107_-_PlayerProgressionManager_ACGA.PlayerProgressionManager

2. Pick IDs

Every new object, including inline sub-objects, needs a unique 64-bit ID. Use a range far from the game's own IDs and count up. The outfit also needs a unique SubCategory; vanilla uses 0-25, so start at 26.

You also need an EntityBuilder for the outfit's model and a TextureMapSpec for its icon. Both can be reused from existing outfits for testing.

3. Create the outfit item

Save as <N>_-_ACGA_Outfit_MyOutfit.xml in the same folder, with <N> higher than the last file index. The part after _-_ becomes the file name.

<?xml version="1.0" encoding="utf-8"?>
<?info tool="AnvilToolkit" toolVersion="1.3.7" type="1"?>
<Object ID="777000000001" Type="InventoryItemSettings" IsManaged="true">
    <Bool Name="Locked">False</Bool>
    <Bool Name="IsEconomicQuestItem">False</Bool>
    <Bool Name="Rechargeable">False</Bool>
    <Bool Name="Sellable">False</Bool>
    <Enum Name="ULCMode" Type="ULCMode" Value="ULCMode_NotULCItem">0</Enum>
    <Unsigned32 Name="DefaultPrice">0</Unsigned32>
    <ObjectPtr Name="ResourcePrice" PointerType="Null" />
    <BaseObject ID="777000000002" Name="ItemName" Type="UIString">
        <Signed32 Name="OasisLineID">-1</Signed32>
        <LString Name="TempString"></LString>
    </BaseObject>
    <BaseObject ID="777000000003" Name="ItemDescription" Type="UIString">
        <Signed32 Name="OasisLineID">-1</Signed32>
        <LString Name="TempString"></LString>
    </BaseObject>
    <Object ID="777000000004" Name="Categorization" Type="InventoryItemCategorization">
        <Enum Name="Category" Type="InventoryItemCategory" Value="InvItem_Outfit">38</Enum>
        <Unsigned32 Name="SubCategory">26</Unsigned32>
    </Object>
    <Unsigned32 Name="Rank">0</Unsigned32>
    <Bool Name="StoreInInventory">True</Bool>
</Object>
  • Name and description come only from OasisLineID, a line in the game's localization. TempString is ignored, and -1 shows an empty text. Point it to an existing line (e.g. a vanilla outfit's) or add a new localization line.
  • Keep Sellable = False.

4. Create the UI item

Save as <N+1>_-_ACGA_UI_Outfit_MyOutfit.xml.

<?xml version="1.0" encoding="utf-8"?>
<?info tool="AnvilToolkit" toolVersion="1.3.7" type="1"?>
<Object ID="777000000011" Type="UIInventoryItem" IsManaged="true">
    <Handle Name="ItemSettings" Type="InventoryItemSettings" PointerType="Inlined" Path="DataPC\Game Bootstrap Settings\ACGA_Outfit_MyOutfit.InventoryItemSettings">777000000001</Handle>
    <BaseObject ID="777000000012" Name="ItemName" Type="UIString">
        <Signed32 Name="OasisLineID">-1</Signed32>
        <LString Name="TempString"></LString>
    </BaseObject>
    <BaseObject ID="777000000013" Name="ItemDescription" Type="UIString">
        <Signed32 Name="OasisLineID">-1</Signed32>
        <LString Name="TempString"></LString>
    </BaseObject>
    <Handle Name="ItemTexture" Type="TextureMapSpec" PointerType="Inlined" Path="DataPC_extra\HeroUpgradeCloakOutfit_MapDesc\HeroUpgradeCloakOutfit_MapDesc.TextureMapSpec">41013951729</Handle>
</Object>

ItemTexture is the icon (here the Cloak outfit icon).

5. Add the UI item to the outfit page

In 6147_-_ACGA_UI_Page_Shop_Outfits.xml, append to InventoryItems:

        <Reference Type="UIInventoryInfo" PointerType="External" ReferenceType="0" Path="DataPC\Game Bootstrap Settings\ACGA_UI_Outfit_MyOutfit.UIInventoryItem">777000000011</Reference>

6. Register the item

In 111_-_000000006E1A3E32.xml (export it with the Schema-Based exporter: Shift+Right Click β†’ export Schema-Based), add to InventoryItemSettingsRepository β†’ InventoryItemList:

            <Reference Type="InventoryItemSettings" PointerType="External" ReferenceType="0" Path="DataPC\Game Bootstrap Settings\ACGA_Outfit_MyOutfit.InventoryItemSettings">777000000001</Reference>

7. Map the outfit to a model

In 107_-_PlayerProgressionManager_ACGA.xml, add to OutfitItemEntityBuilderMapping (top of the file):

        <BaseObjectPtr ID="777000000041" Type="OutfitItemDataMapping" PointerType="Inlined">
            <Handle Name="OutfitItem" Type="InventoryItemSettings" PointerType="Inlined" Path="DataPC\Game Bootstrap Settings\ACGA_Outfit_MyOutfit.InventoryItemSettings">777000000001</Handle>
            <Handle Name="CorrespondingEntityBuilder" Type="EntityBuilder" PointerType="Inlined" Path="DataPC_extra_chr\CHR_P_EdwardKenway_Marooned\CHR_P_EdwardKenway_Marooned.EntityBuilder">33792577160</Handle>
        </BaseObjectPtr>

Any Edward EntityBuilder works (see the table at the end). For a new EntityBuilder, also add an entry to the PlayerAttributesBuilder array in the same file (not CharacterAttributesBuilderData), otherwise the game falls back to the default outfit model:

        <ObjectPtr ID="777000000042" Type="PlayerAttributesBuilder" PointerType="Inlined" IsManaged="true">
            <Handle Name="EntityBuilder" Type="EntityBuilder" PointerType="Inlined" Path="[ENTITY_BUILDER_PATH]">[ENTITY_BUILDER_ID]</Handle>
            <BaseObject ID="777000000043" 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>

25725995267 is the main player's ProgressionCharacter, the same for all outfits.


Method 1: Free Outfit (Main Method)

The player owns the outfit automatically on the next load. Works on new and existing saves.

8. Add the grant rule

In 107_-_PlayerProgressionManager_ACGA.xml, append this to the end of InventoryUpgradeRuleSettingsRepository β†’ WorldUpgradeInventorySettingsList (one rule per outfit, each with its own IDs):

            <ObjectPtr ID="777000000050" Type="WorldUpgradeInventorySettings" PointerType="Inlined" IsManaged="true">
                <DynamicSmallArray Name="UpgradeInventoryStates" Type="ObjectPtr">
                    <ObjectPtr ID="777000000051" Type="DefaultWorldUpgradeRuleState" PointerType="Inlined">
                        <ObjectPtr Name="WorldUpgradeCondition" PointerType="Null" />
                        <DynamicSmallArray Name="WorldUpgradeActions" Type="ObjectPtr" />
                    </ObjectPtr>
                    <ObjectPtr ID="777000000052" Type="DefaultWorldUpgradeRuleState" PointerType="Inlined">
                        <ObjectPtr ID="777000000053" Name="WorldUpgradeCondition" Type="WorldUpgradeInventoryCondition" PointerType="Inlined">
                            <ObjectPtr ID="777000000054" Name="ConditionHolder" Type="BasicInventoryConditionHolder" PointerType="Inlined">
                                <Object ID="777000000055" Name="InventoryCondition" Type="InventoryCondition" IsManaged="true">
                                    <Bool Name="CheckAllCharacters">False</Bool>
                                    <Bool Name="CheckItemsInSameCharacter">False</Bool>
                                    <Bool Name="CheckAllItems">False</Bool>
                                    <Bool Name="CheckCurrentAgainstMax">False</Bool>
                                    <Enum Name="PlayerCharacterFilter" Type="PlayerCharacterFilter" Value="PlayerCharacterFilter_All">0</Enum>
                                    <BaseObject ID="777000000056" 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">
                                        <Handle Type="InventoryItemSettings" PointerType="Inlined" Path="DataPC\Game Bootstrap Settings\ACGA_Outfit_MyOutfit.InventoryItemSettings">777000000001</Handle>
                                    </DynamicSmallArray>
                                    <Enum Name="InventoryCheckType" Type="InventoryCondition::InventoryCheckType" Value="InventoryCheckType_GainedInventory">1</Enum>
                                    <Enum Name="ItemLockStatus" Type="InventoryItemLockStatus" Value="InventoryItemLockStatus_Any">0</Enum>
                                    <Object ID="777000000057" 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_Equal">0</Enum>
                                    <Unsigned32 Name="Count">0</Unsigned32>
                                </Object>
                            </ObjectPtr>
                            <BaseObject ID="777000000058" Name="ProgressionCharacterSelector" Type="ProgressionCharacterSelector">
                                <Handle Name="ProgressionCharacter" Type="ProgressionCharacter" PointerType="Inlined" Path="0">0</Handle>
                            </BaseObject>
                        </ObjectPtr>
                        <DynamicSmallArray Name="WorldUpgradeActions" Type="ObjectPtr">
                            <ObjectPtr ID="777000000059" 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="777000000060" 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">
                                        <Handle Type="InventoryItemSettings" PointerType="Inlined" Path="DataPC\Game Bootstrap Settings\ACGA_Outfit_MyOutfit.InventoryItemSettings">777000000001</Handle>
                                    </DynamicSmallArray>
                                </ObjectPtr>
                            </ObjectPtr>
                            <ObjectPtr ID="777000000061" 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="777000000062" 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="777000000063" Name="InventoryItems" Type="ActionQuestItemInventoryItemWrapper">
                                        <DynamicSmallArray Name="Items" Type="ObjectPtr">
                                            <ObjectPtr ID="777000000064" Type="ActionQuestItemInventoryItem" PointerType="Inlined">
                                                <Handle Name="InventoryItemSettings" Type="InventoryItemSettings" PointerType="Inlined" Path="DataPC\Game Bootstrap Settings\ACGA_Outfit_MyOutfit.InventoryItemSettings">777000000001</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="777000000065" 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>

The outfit appears in three places in the rule: the condition, the unlock action and the add action. Replace all of them.

9. Repack

Repack 51_-_Game Bootstrap Settings.data, then DataPC.forge.

On the first load the outfit is owned and equipped. With several new outfits, the last one granted ends up equipped. On later loads nothing changes and the player keeps the outfit they chose.


Method 2: Shop Outfit

The outfit is sold at a general store. Do steps 1-7, then:

8. Set the price

In the outfit item (step 3), set DefaultPrice to the price in reales. To make it buyable only later, set Locked = True and unlock it with an ActionItemSettingsLock (LockType_Unlock) from an upgrade rule or accomplishment.

9. Add the outfit to the store

  1. Unpack DataPC_Hideout.forge, then 2047_-_Cell00562_DataBlock.data.
  2. Export 106_-_GEN_Shop_GeneralStore_001.Entity to XML in the root of that folder.
  3. Find the ShopItemGroup whose UIPageInfo is ACGA_UI_Page_Shop_Outfits and append to its ItemList:
                                    <ObjectPtr ID="777000000100" Type="ShopItemSettings" PointerType="InlinedManaged" IsManaged="false">
                                        <Float Name="PriceMultiplier">1</Float>
                                        <Handle Name="Item" Type="InventoryItemSettings" PointerType="Inlined" Path="DataPC\Game Bootstrap Settings\ACGA_Outfit_MyOutfit.InventoryItemSettings">777000000001</Handle>
                                        <Handle Name="UIItemInfo" Type="UIInventoryItem" PointerType="Inlined" Path="DataPC\Game Bootstrap Settings\ACGA_UI_Outfit_MyOutfit.UIInventoryItem">777000000011</Handle>
                                    </ObjectPtr>

This adds it to the Hideout store only. To sell it in other stores too, repeat this for each store entity (see "Where shops get their items").

10. Repack

  1. Repack 51_-_Game Bootstrap Settings.data, then DataPC.forge.
  2. Repack 2047_-_Cell00562_DataBlock.data, then DataPC_Hideout.forge.

Method 3: Craftable Outfit

The player crafts the outfit in the crafting menu. Do steps 1-7 with Locked = True on the outfit item, then:

  1. Crafting item: create a second InventoryItemSettings with Category = 9 (InvItem_QuestItem), SubCategory = 0, Locked = False, StoreInInventory = True, plus a UIInventoryItem for it.

  2. Recipe: create a UICraftingRecipe with CraftedItem = the crafting item, Ingredients = CraftingIngredient entries (item + quantity), CraftingCategory = CraftingCategory_Outfit (4), IsUnique = True.

  3. CraftingContext (file 2112): add the recipe to the UICraftingRecipe array. UIInventoryContext: add the crafting item's UIInventoryItem to the InventoryItems array of the CraftingMenuStruture object.

  4. EconomicSystemSettings: also register the crafting item (step 6).

  5. Grant rule: add the rule from Method 1, step 8, with these changes:

    • Condition: the crafting item, InventoryCheckType_PlayerInventory (0), ItemLockStatus_Unlocked (1), ComparisonType_Greater (3), Count 0.
    • CanExecuteOffline = False on the add action.

    The vanilla Hunter/Poacher/Whaler/Shark Hunter outfits use this setup.

  6. Repack as in Method 1.

CraftedItem must be the Category 9 item, crafting can't give Category 38 (outfit) items directly.


How It Works

Locked vs. owned

An outfit has two states:

  • Locked (Locked on the item): a locked outfit is hidden in the wardrobe.
  • Owned (in the save's gained inventory): an unlocked outfit that isn't owned shows as "Unavailable" in the wardrobe and "Available in shop" when sold.

ActionItemSettingsLock changes the locked state, ActionQuestItem (TransactionType_Add) adds an item to the gained inventory. Buying an outfit also adds it.

Why the grant rule looks like that

Upgrade rules (WorldUpgradeInventorySettings) don't save their own state. On every load, the game re-checks each rule's condition. If it is already true, the game assumes the rule fired in an earlier session and only runs the actions marked CanExecuteOffline. During play, a rule whose condition becomes true runs all its actions.

  • CanExecuteOffline = True on the add action: the condition is true when the save loads, so without it the outfit would never be added.
  • Condition "outfit is owned 0 times": the rule only fires until the outfit is owned. Adding an outfit also equips it, so a condition that stays true would force the outfit back on at every load.
  • Append rules at the end of the list rather than inserting them in the middle.

Crafting rules don't need CanExecuteOffline on the add action: the crafted item isn't there when the save loads, so their condition only becomes true during play.

ComparisonType values: 0 Equal, 1 NotEqual, 2 GreaterOrEqual, 3 Greater, 4 LessOrEqual, 5 Less. ItemLockStatus: 0 Any, 1 Unlocked, 2 Locked.

Where shops get their items

Each shopkeeper has its own item list, the outfit page only names the shop tab:

GEN_Shop_GeneralStore_XXX.Entity
  └─ GcLNonSpawningShop
       └─ ShopSettings
            └─ ItemGroupList[] : ShopItemGroup        ← one per shop tab
                 β”œβ”€ ItemList[] : ShopItemSettings    (PriceMultiplier, Item, UIItemInfo)
                 └─ UIPageInfo                       (ACGA_UI_Page_Shop_Outfits for outfits)

General store entities:

Forge Data file Entity
DataPC_Hideout Cell00562_DataBlock GEN_Shop_GeneralStore_001
DataPC_Havana DataBlock_HAV_Interior_GeneralStore_001 / 002 / 003 GEN_Shop_GeneralStore_001 / 002 / 003
DataPC_Kingston Cell00139_DataBlock GEN_Shop_GeneralStore_001
DataPC_Kingston DataBlock_KIN_Interior_GeneralStore_001 / 002 / 003 GEN_Shop_GeneralStore_001 / 002 / 003
DataPC_Nassau DataBlock_NAS_Interior_GeneralStore, DataBlock_NAS_Interior_GeneralStore_002 GEN_Shop_GeneralStore_001 / 002
DataPC_CaribbeanSea Cell05298, Cell08935, Cell09240, Cell10303 GEN_Shop_GeneralStore_002 / 006 / 005 / 003

In the shop, a locked outfit is hidden, an owned one can be equipped, anything else is buyable for DefaultPrice * PriceMultiplier.

Don't use accomplishments to grant outfits

An accomplishment that starts resolved with an ActionQuestItem doesn't add the outfit. Accomplishments can still unlock an outfit with ActionItemSettingsLock.


Reference

Vanilla outfits

Outfit SubCategory Price How obtained
Default 0 0 Starting outfit
Cloak 1 1 1500 Shop
Cloak 2 2 6000 Shop
Cloak 3 3 3000 Shop
Regular 1 4 5000 Shop
Regular 2 5 8000 Shop
Regular 3 6 0
Regular 4 7 10000 Shop
Walpole 1 8 0
Walpole 2 9 0
Walpole 3 10 12000 Shop
Templar Armor 11 0 Accomplishment (Gibbet keys)
Stealth 12 0
Mayan 13 0
Altair / Connor 14 0 DLC/Uplay
Ezio 15 0 DLC/Uplay
Captain Morgan 16 0 DLC
Stede Bonnet 17 0 DLC
Haytham 18 0 DLC
Captain Drake 19 0 DLC
Legend 20 0
Whaler 21 0 Crafting
Hunter 22 0 Crafting
Poacher 23 0 Crafting
Shark Hunter 24 0 Crafting
Swim 25 0 Story
Walpole, Marooned, Foreigner, Simple Sailor, FlashBack 1/2 0 0 Story

Outfit EntityBuilders

Outfit EntityBuilder Path
Default DataPC_extra_chr\CHR_P_EdwardKenway_Default\CHR_P_EdwardKenway_Default.EntityBuilder
Walpole DataPC_extra_chr\CHR_P_EdwardKenway_Walpole\CHR_P_EdwardKenway_Walpole.EntityBuilder
Marooned DataPC_extra_chr\CHR_P_EdwardKenway_Marooned\CHR_P_EdwardKenway_Marooned.EntityBuilder
Foreigner DataPC_extra_chr\CHR_P_EdwardKenway_Foreigner\CHR_P_EdwardKenway_Foreigner.EntityBuilder
Simple Sailor DataPC_extra_chr\CHR_P_EdwardKenway_SimpleSalor\CHR_P_EdwardKenway_SimpleSalor.EntityBuilder
FlashBack 1 DataPC_extra_chr\CHR_P_EdwardKenway_FlashBack\CHR_P_EdwardKenway_FlashBack.EntityBuilder
FlashBack 2 DataPC_extra_chr\CHR_P_EdwardKenway_FlashBack2\CHR_P_EdwardKenway_FlashBack2.EntityBuilder
Swim DataPC_extra_chr\CHR_P_EdwardKenway_Swim\CHR_P_EdwardKenway_Swim.EntityBuilder
Hunter DataPC_extra_chr\CHR_P_EdwardKenway_Hunter\CHR_P_EdwardKenway_Hunter.EntityBuilder
Poacher DataPC_extra_chr\CHR_P_EdwardKenway_Poacher\CHR_P_EdwardKenway_Poacher.EntityBuilder
Whaler DataPC_extra_chr\CHR_P_EdwardKenway_Whaler\CHR_P_EdwardKenway_Whaler.EntityBuilder
Shark Hunter DataPC_extra_chr\CHR_P_EdwardKenway_Shark_Hunter\CHR_P_EdwardKenway_Shark_Hunter.EntityBuilder
Cloak 1 DataPC_extra_chr\CHR_P_EdwardKenway_Cloak_1\CHR_P_EdwardKenway_Cloak_1.EntityBuilder
Cloak 2 DataPC_extra_chr\CHR_P_EdwardKenway_Cloak_2\CHR_P_EdwardKenway_Cloak_2.EntityBuilder
Cloak 3 DataPC_extra_chr\CHR_P_EdwardKenway_Cloak_3\CHR_P_EdwardKenway_Cloak_3.EntityBuilder
Regular 1 DataPC_extra_chr\CHR_P_EdwardKenway_Regular_1\CHR_P_EdwardKenway_Regular_1.EntityBuilder
Regular 2 DataPC_extra_chr\CHR_P_EdwardKenway_Regular_2\CHR_P_EdwardKenway_Regular_2.EntityBuilder
Regular 3 DataPC_extra_chr\CHR_P_EdwardKenway_Regular_3\CHR_P_EdwardKenway_Regular_3.EntityBuilder
Regular 4 DataPC_extra_chr\CHR_P_EdwardKenway_Regular_4\CHR_P_EdwardKenway_Regular_4.EntityBuilder
Walpole 1 DataPC_extra_chr\CHR_P_EdwardKenway_Walpole_1\CHR_P_EdwardKenway_Walpole_1.EntityBuilder
Walpole 2 DataPC_extra_chr\CHR_P_EdwardKenway_Walpole_2\CHR_P_EdwardKenway_Walpole_2.EntityBuilder
Walpole 3 DataPC_extra_chr\CHR_P_EdwardKenway_Walpole_3\CHR_P_EdwardKenway_Walpole_3.EntityBuilder
Captain Drake DataPC_extra_chr\CHR_P_EdwardKenway_Captain_Drake\CHR_P_EdwardKenway_Captain_Drake.EntityBuilder
Captain Morgan DataPC_extra_chr\CHR_P_EdwardKenway_Captain_Morgan\CHR_P_EdwardKenway_Captain_Morgan.EntityBuilder
Haytham DataPC_extra_chr\CHR_P_EdwardKenway_Haytham\CHR_P_EdwardKenway_Haytham.EntityBuilder
Legend DataPC_extra_chr\CHR_P_EdwardKenway_Legend\CHR_P_EdwardKenway_Legend.EntityBuilder
Mayan DataPC_extra_chr\CHR_P_EdwardKenway_Mayan1stCiv_Outfit\CHR_P_EdwardKenway_Mayan1stCiv_Outfit.EntityBuilder
Stealth DataPC_extra_chr\CHR_P_EdwardKenway_Stealth_Outfit\CHR_P_EdwardKenway_Stealth_Outfit.EntityBuilder
Stede Bonnet DataPC_extra_chr\CHR_P_EdwardKenway_Stede_Bonnet\CHR_P_EdwardKenway_Stede_Bonnet.EntityBuilder
Templar Armor DataPC_extra_chr\CHR_P_EdwardKenway_TemplarArmor\CHR_P_EdwardKenway_TemplarArmor.EntityBuilder
Altair DataPC_extra_chr\CHR_P_EdwardKenway_AltairOutfit\CHR_P_EdwardKenway_AltairOutfit.EntityBuilder
Ezio DataPC_extra_chr\CHR_P_EdwardKenway_EzioOutfit\CHR_P_EdwardKenway_EzioOutfit.EntityBuilder
Connor DataPC_extra_chr\CHR_P_EdwardKenway_ConnorOutfit\CHR_P_EdwardKenway_ConnorOutfit.EntityBuilder

Game files (Game Bootstrap Settings.data)

File # Name Purpose
69 Cheat Manager Shows the unlock actions for every outfit
107 PlayerProgressionManager_ACGA Outfit→model mapping, upgrade rules
111 000000006E1A3E32 (EconomicSystemSettings) Master item list
2112 CraftingContext Crafting recipe list
3041-3073 ACGA_Outfit_* Vanilla outfit items
6147 ACGA_UI_Page_Shop_Outfits Outfit page (wardrobe list, shop tab)
7767-7792 ACGA_UI_Outfit_* Vanilla outfit UI items
⚠️ **GitHub.com Fallback** ⚠️