WD2 Custom Item/Clothing Creation Tutorial
Source: Discord community tutorials (the task of the Pesky Fly, disastorm, redcomet, CobraGamer, 2016-2023) + XeNTaX forum knowledge. Cross-reference: XeNTaX WD2 clothing hashes & categories → XeNTaX Watch Dogs knowledge §8–9, §11; Entity XML structure →
../watch_dogs/entity-xml-structure.md
Prerequisites
- WD2Extract + WD2Pack (Sir Kane) — extract/repack
patch.fat/dat - Gibbed.Disrupt.ConvertBinaryObject —
.lib↔ XML conversion - Remove WD1 class definitions from
project/Watch Dogs/binary objects/files/gibbed/ - Anti-cheat disabled for testing
File Structure Overview
patch.fat/dat
├── items.lib # Clothing/item definitions
├── graphickit_models.lib # Character model assemblies
├── graphickit_parts.lib # Individual model parts (heads, torsos, etc.)
├── itemsshopproperties.lib # Shop data (category, price, unlock)
├── shopcomponentsettings.lib # Which items appear in which shops
├── tagcategories.lib # Category definitions
├── tags.lib # Tag definitions
└── texturedb.lib # Texture database references
Method 1: Simple Clothing Swap (Replace Existing)
Source: disastorm (2016-12-14)
- Extract
patch.fat/dat - Convert
items.lib→ XML - Open clothing XML for source item
- Open
graphickit_models.lib→ XML for target character - Find
D935FAD9field (graphickit_part reference) - Copy the object section containing the reference
grepongraphickit_partsdirectory to identify what each section represents- Replace target sections with source sections
- Convert back to binary, repack, test
Method 2: Head Swap WITH Animation (redcomet, 2016-12-22)
- Edit
W2CH_MOD_nar_ava.avatar.xmlingraphickit_models.lib - Replace head definition with target character's head definition
- Results in swapped face with animation
Method 3: Create New Custom Clothing Item (CobraGamer, 2017-04-08)
Files to Edit
| File | Purpose |
|---|---|
items.lib | Create new clothing item with graphickit_part reference |
itemsshopproperties.lib | Define shop category and price |
shopcomponentsettings.lib | Make item appear in specific shop |
graphickit_models.lib | Contains model parts (reference only) |
Key Hash Fields (from XeNTaX/disastorm)
| Hash | Field | Notes |
|---|---|---|
389F6DA7 | Item ID | Hex A-F only |
D935FAD9 | graphickit_part reference | Links to model part |
73280CDE | Link to item in items.lib | |
92AF09E1 | Shop category | |
33E4CFD7 | Price | Hex → decimal |
24436F9E | Texture of clothing item | Refers to texturedb.lib |
A849532C | Material of model part | |
7E23AAAE | Model path | Binary hex string |
73642E5E | Graphickit part container | |
0F43A933, 54D14F92, 4CAAD60F | Availability rules | Set to FFFFFFFFFFFFFFFF to unlock |
E7575742 | Category | FFFFFFFFFFFFFFFF = uncategorized |
Clothing Category Values (WD2)
| Hash | Category |
|---|---|
DDD0721E02000080 | NORMCORE |
DED0721E02000080 | BIKER |
DFD0721E02000080 | URBAN |
E0D0721E02000080 | HIPPIE |
C61D21C801000080 | HIPSTER |
DBD0721E02000080 | SUITS |
DCD0721E02000080 | HIP-HOP |
Step-by-Step: New Clothing Item
- Create graphickit_parts entry
- Duplicate existing part entry
- Assign unique IDs
- Erase all model overrides except one
- Replace with your custom
.model(hashed filepath) - Point material to your custom
.material.bin(with new texture paths)
- Create items.lib entry
- Unique IDs
- Point to your graphickit_parts entry (
D935FAD9) - Set availability rules to
FFFFFFFFFFFFFFFF
- Extract tagcategories.lib + tags.lib
- Find store tag category in tagcategories.lib
- Find matching store tag in tags.lib
- Replace
FF...store tag in graphickit_parts with your store tag
- Create itemsshopproperties.lib entry
- Unique IDs
- Point to your items.lib entry (
73280CDE) - Set category hash (
E7575742) and price (33E4CFD7)
- Edit shopcomponentsettings.lib
- Add your item to desired shop
- Create custom model + material
- Extract original texture + model
- Locate original
.material.bin - Duplicate material, point to new texture path
- Locate original
.modelfile - Duplicate
.model, hex edit to point to new material - Hash the new filepath for graphickit_parts entry
Method 4: Create New Item Variants (the task of the Pesky Fly, 2023)
Adding Tutorial
- Find model in
graphickit_models - Find part by comparing with
graphickit_parts - Create new duplicate entry in
graphickit_parts, unique IDs - Erase all model overrides except one
- Replace override with your hashed filepath
- Create new
items.libentry, unique IDs, point to custom graphickit_parts - Extract
tagcategories.libandtags.lib - Find store tag category in tagcategories.lib
- Find matching store tag in tags.lib
- Replace
FF...store tag in graphickit_parts entry - Create new
itemsshopproperties.libentry, unique IDs, point to items.lib - Edit
shopcomponentsettings.lib— add item to desired shop
Creating Variants
- Extract original texture + model
- Locate original
.material.bin - Duplicate material bin → point to new texture path
- Locate original
.modelfile - Duplicate
.modelfile - Hex edit
.model→ point to new material - Find base model in
graphickit_models - Find base part in
graphickit_parts - Create new duplicate entry in
graphickit_parts, unique IDs - Erase model overrides except one → replace with your
.model - Create new
items.libentry → point to custom graphickit_parts - Extract
tagcategories.lib+tags.lib - Find store tag category → find matching store tag
- Replace
FF...store tag - Create
itemsshopproperties.libentry → point to items.lib - Edit
shopcomponentsettings.lib→ add to shop
Important Notes
- Modified items won't appear in locker — must equip before adding modded patch
- Each item maps to ONE graphickit part
- After modifying patch, restart game
- One item per graphickit part definition
- Custom model workflow: Import → copy rigging → attach to retail model → delete retail parts → keep custom model + retail skeleton → repeat for second pass (single pass = no rigging in game)
Item Category Structure (clothes1.txt)
itemcategory.lib defines all potential item categories:
<object name="libobj">
<field name="hidSingleObject" type="Boolean">False</field>
<field name="text_hidName" type="String">Clothing.SP_MOD</field>
<field name="hidName" type="BinHex">80C15CE9</field>
<field name="hidKey" type="BinHex">80C15CE9</field>
<field name="bEnable" type="Boolean">True</field>
<field name="blgnoreCurrentGen" type="Boolean">False</field>
<object name="locstridltemCategoryNameld">
<field name="Localizationld" type="Int64">190602</field>
</object>
</object>
Item Definitions and Part Lookups (clothes2-4.txt, EpicStreamMan)
items.lib defines all potential items and their properties:
- Which Graphic Kit Model to use
- Which item grants access to this item
- Localization IDs of short/long descriptions
- Reward properties (looting feedback type, reward message)
- Shop properties (price, item category — see
itemcategory.lib) - Asset properties (item icon texture name)
Model lookup: search the BinHex value (e.g. 4816479C) of the item's
Graphic Kit Model in graphickit_models.lib — the file with a matching
hidKey defines all properties of which parts that item/clothing uses.
Part lookup: search the BinHex value (e.g. BB9F21CF) of the Graphic Kit
Part in graphickit_parts.lib — the file with a matching hidKey defines
all properties of that part of the item/clothing.
Vehicle Modding (Car on Demand) — neburas, 2016-12-18
- Add vehicles via
CarHackingRewards.Generic.Budjet.XXXX.xmlinitems.lib - All Car on Demand vehicles = "player owned" (no wanted level)
- Vehicle archetypes identified by GUID hashes (griffin02, 2017-01-24)
Traffic Density (Paul44, 2017-03-05)
- Settings in
common.dat→trafficpatternselector.lib - XML settings allocated to specific map areas (blocks/streets)
- Density values = spawn timing (lower = more frequent)
- File:
generated/databases/generic/trafficpatternselector.lib