Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Adding stuff to the game, for the major-leagues
As suggested by psiberx, the general usage documentation for ArchiveXL will be kept in this wiki for ease of use. You can find the readme on github or check the repository's wiki section.
ArchiveXL (nexus | github) is one of the core frameworks of Cyberpunk 2077 modding. Together with TweakXL, It allows you to add things to the game, such as
world sectors (deletions and additions)
custom lipsync maps
If you want to look up garment appearance slots: The princess is in another castle. Check Different equipment slots instead.
This page will document how to set item properties via tags & suffixes (the vanilla way), or via dynamic switching (new, cool, version >= 1.5).
Let's dive right in.
When adding items, you will normally offer multiple mesh appearances (variants), for example, the same shirt in black, white, and red. This is what you're modding for, after all: making cool things.
On top of having different colours, you also have different circumstances – for example camera states: not even Johnny Silverhand wears his sunglasses in first person perspective.
CDPR deals with this by using suffixes, which are tedious to use. psiberx has since created a better system (dynamic appearances or conditions), which are much easier to use.
For more detail on this, please see the sub-page ArchiveXL: Suffixes and Substitutions
Tags are a way to add extra information to entities or appearances. They are defined on their own sub-page: ArchiveXL: Tags
If you have ever tried to make ten colour variants of an item for two body genders with four different states of feet, then you're familiar with the struggle. Version 1.5.0 of ArchiveXL solves this problem by introducing dynamic variants, allowing you to define rules to hook up your yaml straight to the mesh entity. picking components and even appearances dynamically.
For a tutorial about this, check ItemAdditions: Dynamic Appearances
Here's an overview of how the dynamic variants work. By comparison, this is the old diagram. Especially for items with many appearances, the new way is much faster.
Preserved for posterity - do not use this
With ArchiveXL 1.14, this information is outdated. It will be preserved for posterity, but you should use the current method under ArchiveXL: body mods and refits instead.
In any of the files you modded, check your components
:
morphtargetComponent
?Yes:
Add a tag with the exact name of your body in this component's tag array (for our example, NewBody
)
No:
Add a new component (of any type) and give it the following name:
Body:NewBody
If you edit the leg component for female V, you must change both the regular and the flat feet component:
base\characters\common\player_base_bodies\appearances\l0_000_base__full.app
base\characters\common\player_base_bodies\appearances\l0_000_base__cs_flat.app
The files below have been confirmed to work — make the changes stated above to each of them:
The list of files below is known to be incomplete. At the very least it will not cover Male V as they appear in a mirror. Even more so than for Female V, please use the currently recommended patching based method.
After packing your project, check if the body tag registers by running the CET command.
If yes, you're good to go!
If not and you have used a component, check if it's added to the playerPuppet, either via CET:
or via RedHotTools:
Published: August 2023 by
Translations (check for a guide)
You can find more detail about this on the sub-page ArchiveXL: Suffixes and Substitutions ->
If you are a mod user and want to dynamically recolour an item, check the Recolours and Refits guide -> sub-page Emissive ->
How suffixes and substitutions work
Published: ??? by manavortex Last documented update: Feb 18 2024 by manavortex
This page will teach you about conditional appearance switching in Cyberpunk and give you an overview of existing suffixes and substitutions.
ArchiveXL did not invent suffixes. In fact, they are CDPR's solution to a problem, and they are annoying to use.
psiberx has found ways to make this less painful. This page documents these ways.
For a hands-on guide to Adding new items, check the corresponding pages in the Modding Guides section
Dynamic appearances have their own guide (see ItemAdditions: Dynamic Appearances)
There is an own page for Influencing other items
To conditionally hide items or parts of items, check Influencing other items or ArchiveXL: Tags (especially the section about Root entity tags)
Sometimes, you want to load different meshes/appearances under different circumstances. Before ArchiveXL 1.5, the only way to do that were suffixes — registering them in the .yaml
, then adding one appearance for each variation in the root entity (so for 2 suffixes, you'd have 4 entries, for 3 suffixes, you'd have 8…).
Suffixes are outdated! Do yourself a favour and use dynamic appearances!
Since 1.5, psiberx has made it possible to use conditionals via dynamic appearances, which require a lot less of an overhead. (Personally, I've gone from 96 entries in the root entity down to 9!)
But while the solution has changed (and improved), the problems remain and require handling.
There are two body genders with different proportions, and you can't make them wear the same shirt (at least not without clipping). To solve that, you can do what CDPR did and have one variant per rig.
The suffix for the body is Male
/ Female
, the ArchiveXL string substitution is {gender}
and resolves to m
or w
.
ArchiveXL allows body modders to register a custom body tag, which can then be used for suffixes and for substitutions in dynamic variants. To learn more about this, check ArchiveXL: body mods and refits.
You can check the current foot state by running the following command from CET:
Sometimes, you need to hide parts of the item in first person. – for example helmets, since you don't want to have half a helmet floating in front of your face (unless you consider that immersive; most people don't).
First Person Perspective
&FPP
fpp
&camera=fpp
Third Person Perspective
&TPP
tpp
&camera=tpp
The arm states represent the different cyberware. For example, since you can't hire the forearms for mantis blades, you can roll up the sleeves just for this. The definitions are:
None
&BaseArms
base_arms
&arms=base_arms
Mantis Blades
&MantisBlades
mantis_blades
&arms=mantis_blades
Monowire
&Monowire
monowire
&arms=monowire
Projectile Launcher
&ProjectileLauncher
projectile_launcher
&arms=projectile_launcher
If the arm states aren't working as expected, check if the table above is outdated by comparing the names with the source code.
You can check the current foot state by running the following command from CET:
To achieve gender equality in regard to foot states, you need to use Toggleable Feet. The substitution key for dynamic appearances is feet
.
Feet states for male-rigged V are not supported by the base game. You need to install either a body mod, or Toggleable Feet.
Female
Unequipped
&Flat
flat
&feet=flat
Female
Equipped (default)
&Lifted
lifted
&feet=lifted
Female
Equipped with HighHeels
tag
&HighHeels
high_heels
&feet=high_heels
Female
Equipped with FlatShoes
tag
&FlatShoes
flat_shoes
&feet=flat_shoes
Male
Any
(empty)
If the foot states aren't working as expected, check if the table above is outdated by comparing the names with the source code.
You can check the current foot state by running the following command from CET:
Conditions are a feature of dynamic appearances . They can be used in two places:
Inside your .app
file for appearanceAppearanceDefinition.name
:
This lets you to select a different appearance based on body gender, camera state... (see the tables above).
By using conditional appearances, you can still make use of partsOverrides
to use chunkmask hiding.
For a hands-on example, see ArchiveXL: Dynamic conversion guide -> Step 2: The .app
Inside your mesh_entity.ent
for component.name
:
For a hands-on example, see ArchiveXL: Dynamic conversion guide -> Method 1: Conditional Components
Substitutions are a feature of dynamic appearances . They can only be used inside your mesh_entity.ent
.
Substitutions allow ArchiveXL to load a different mesh based on different circumstances.
For a hands-on example, see ArchiveXL: Dynamic conversion guide -> Method 2: Component substitution
Do yourself a favour and don't use suffixes! They are outdated - use dynamic item additions instead.
For a list of active suffixes, check the tables above.
itemsFactoryAppearanceSuffix.Gender
This item is gendered
When resolving the appearance name via rootentity.ent
, the game will look for appearanceName&Female
and appearanceName&Male
.
itemsFactoryAppearanceSuffix.Camera
This item has special rules for first and third person camera
When resolving the appearance name via rootentity.ent
, the game will look for appearanceName&FPP
and appearanceName&TPP
.
itemsFactoryAppearanceSuffix.Partial
If the current item has hide_T1part
part and slot OuterChest
is not hidden, will search rootentity.ent
for&Full
or &Part
itemsFactoryAppearanceSuffix.HairType
Defines how your item will look if a certain hair type is loaded (e.g., hide the back half of a bandana for long hair).
When resolving the appearance name via rootentity.ent
, the game will look for &Short
, &Long
, &Dreads
, &Buzz
, &Bald
You can disable suffixes by adding the following line to your .yaml entry:
the base appearance (with no suffix)
the most specific suffix collection it can find
V has a female body gender and you're in photo mode (third person camera). Your base appearance is called appearance_
.
appearance_
Found first, then ignored because a more specific appearance exists.
appearance_&Male
appearance_&Male&FPP
appearance_&Male&TPP
Ignored: V's body gender isn't male
appearance_&Female
ignored: a better match exists
appearance_&Female&FPP
ignored: you are not in first person camera
appearance_&Female&TPP
best match! The game will use this one!
Since 1.8.0, ArchiveXL supports substitutions for Dynamic appearances. You can use them in two places:
inside mesh entity
components in the fields name
, depotPath
and appearance
in the .app
appearances for the field name
For a tutorial about this, check ItemAdditions: Dynamic Appearances
Any placeholders will be interpolated at run-time (replaced with the correct value for your current state)!
If any of the placeholders aren't working the way you expect them, check if the table below is outdated by referring directly to the source. (Please update the wiki if that happens!)
Substitution will only become active if the property name starts with an asterisk (*
).
{camera}
fpp
or tpp
{gender}
m
or w
{body}
base_body
or body mod name in snake case
{arms}
base_arms
, mantis_blades
, monowire
, projectile_launcher
{feet}
flat
, lifted
, high_heels
, flat_shoes
(empty for mascV!)
{sleeves}
full
, part
{skin_color}
{hair_color}
For Dynamic appearances, you can conditionally switch out components or entire appearances by name. You can switch use any of the entries from Which substitutions exist?
The order works as follows:
my_item!variant&camera=tpp
1
Has the highest priority because it requires a specific variant and one state condition.
my_item!variant
2
Has second priority because it requires a specific variant.
my_item&gender=w&camera=tpp
3
Has third priority because it has two state conditions.
my_item&camera=tpp
4
Has fourth priority because it has one state condition.
my_item
5
Has the lowest priority and will be used when no other elements match the criteria.
Modify resources in a non-conflicting ways and reuse definitions.
The example below uses mesh materials, but these aren't even the tip of the iceberg. By using this technique, we can re-work everything, from CDPR's messed-up material paths up to the character creator.
You can find a guide under ArchiveXL: Patching appearances
This page explains resource patching, a very powerful ArchiveXL feature that lets you modify resources without conflicting with other mods or even game updates. Also allows you to reuse e.g. material definitions in multiple meshes, possibilities are endless!
For the most efficient way to define multiple materials, check out ArchiveXL: dynamic materials!
While ArchiveXL: body mods and refits has solved one problem, it introduced a new one. You now have a bunch of meshes inside your .archive, and you have to copy the materials across each of them.
Not only does resource patching fix that issue, it also allows multiple mods to modify the same resource without conflicts! Now you can have multiple mods add appearances to the same weapon and more.
In general, have a file that contains your changes (and only your changes), this is your "patch file". And you should know what file you want to patch, the "target file". Add the following code to your .xl
file:
You can patch multiple files with the same or different files, as many as you'd like. (Don't duplicate the first two lines)
Example: If you have many meshes and want to share materials between them, don't define materials in your mesh files, instead have another mesh file with just the materials! Then add the following lines to your .xl
file:
And just like that, it will work. All your meshes will have the materials you defined in your material mesh and any change to it will propagate to the patched meshes.
You can patch pretty much any .ent
, .app
or .mesh
file! Give it a try via .xl
file.
appearances (added/replaced appearances use materials from patch mesh)
After patching, appearance_black
would use metal_base.remt
, while appearance_black_2
would still use multilayered.mt
.
You can patch appearances, components, entity, visual tags
You can patch definitions (components, parts values, parts overrides, visual tags)
Some things are scattered across multiple files — for example, there are different player entities for first and third person. Fortunately, ArchiveXL solves this problem in the cradle by defining patchable scopes. You can find examples on the github repository:
the player ent
This will include all the needed files for patching without the need to specify each of them manually.
This will add the list &AddPosesF
to the list of photo_mode.character.altPoses
.
Photo mode scopes were added in version 1.19
If it becomes necessary, you can expand scopes and add your own files to them. For example:
You can't overwrite scopes, and you can't remove anything from them. Only appending is possible!
How to add new items to the character creator
To prevent the character creator from becoming a cluttered unusable mess, we strongly encourage sticking to already-established switcher groups.
Do not change the index! If two switchers have the same index, then only the first one will be used.
This page explains how ArchiveXL expansions work in the context of the character creator. It is currently a work in progress.
The full list of hair style materials as supported by CCXL extension:
While @cap01
falls back to CapBaseMaterial, this is how you can define an extra hair cap texture for cyberware_01
.
Starting with version 1.14, ArchiveXL allows you to create resource symlinks. This guide will teach you how to avoid duplicate meshes for dynamic substitution that way.
Rhetorical question, it's not. But body types don't care.
This is where linking comes in.
Like most other things, you do this by adding a block to your .xl
file. The example below will re-use the item for rb
(Hyst's realistic butt) for both ebbrb
and ebbprb
(boobs in various states of push-uppery):
And just like that, we have one mesh instead of three.
Now we can do away with the extra components and simply use body mod substitution — and anything duplicate can be linked.
You can now also give your .mesh
files passive aggressive filenames and then use substitution to hook them up to the body mods. The possibilities are endless!
How to convert your mod to use dynamic variants... in ten minutes
This page will teach you how to convert your existing ArchiveXL mod to the "new" system.
An ArchiveXL mod that you want to convert
We will go through the process step-by-step. I'll explain what I'm doing as I go along.
Instead of one entry per item variant, we only need one entry per item.
Our variants are defined via $instances
and generated via substitutions. Let's take a look at this:
You'll notice that the displayName
s are different now. I could prevent that by writing my_shirt_localization_name_$(shirt)_$(ribbons)
, but this is a great chance to clean up the historically-grown mess.
We defined a list of $instances
, which will generate all of our different appearances
We replaced all parts that are different with the corresponding key from $instances
. The rest will be magic.
Instead of one entry per variant and gender, we only need one entry in total.
Our appearance's name
must still match the .yaml
, but only up to the variant separator: we're going with appearance_root_entity_
.
By leaving the appearanceName
blank, we're telling ArchiveXL to re-use name
. If you want to use a specific appearance name (or if you don't want appearance_root_entity_
in your .app), you can put something different here.
We added the DynamicAppearance
tag to enable the feature
We deleted all appearances but one
We deleted everything variant-related from the appearance
We deleted the appearanceName, so that ArchiveXL will re-use name
for the .app
We deleted all but one appearance per gender
We added the condition &gender=w
and &gender=m
We deleted the partsOverrides
Gender matching now happens via condition. The different meshes for male and female body gender are loaded in the different mesh entity files.
Right! You've been paying attention! Let's take a look at that next.
We will only change a single field (meshAppearance
).
Before, it was mesh_white_red
(the default appearance), and each appearance overwrote it via partsOverride
. We're now changing it to dynamic
:
Old: mesh_white_red
New: *mesh_{variant.2}_{variant.1}
This is where file validation currently stops working (as of June 2024). If you make any mistakes here, you will always see the first mesh appearance.
By adding a leading *
, we told ArchiveXL that this field is involved in magic (substitution in this case)
By replacing white
with {variant.2}
, we're using the second parameter from the yaml's appearanceName
(shirt).
By replacing red
with {variant.1}
, we're using the first parameter from the yaml's appearanceName
(ribbons).
Let's unpack this.
In this example, we have the following mesh appearances:
mesh_white_red
mesh_black_red
mesh_black_blue
By using !
in the appearanceName
, we're telling ArchiveXL that everything after is part of the mesh appearance definition:
This is the reason why we've used only appearance_root_entity_
as the appearanceName, and not the whole ordeal.
The +
in the variant
splits it up. If we didn't have it, we couldn't use variant_1
and variant_2
.
Let's compare our setup ( *mesh_{variant.2}_{variant.1}
) to the alternative.
yaml:
Our meshAppearance
would be *mesh_{variant}
.
Without the split, we need to make sure to pass the variant exactly as expected
.
Unless you got hopelessly lost, this should have taken no more than ten minutes, and your mod just works(tm).
You now have one root_entity
entry, two appearanceAppearanceDefinition
s in your .app
, and one mesh_entity
per body gender.
Currently, we have two mesh_entities:
Each of them points at a different mesh:
Delete one of the mesh entities and rename the other:
Delete one of your appearances, and strip the suffix name from the other, leaving only appearance_root_entity_
.
Change the path of your partsValue
to the only remaining mesh entity, and save the file.
This will only load one body gender (the one you defined in the mesh_entity
).
You should use the other approach where possible; this is only documented here for the sake of completeness.
Pro: Especially with many body mods, you can just put all the logic into the components
Cons: All of these components will be added to the player entity, even if half of them will be hidden. This is bad for performance, especially if everyone does it.
The best way of dealing with multiple meshes is to have a single component and let ArchiveXL handle all the heavy lifting by using substitutions in the path:
This is our mesh's depot path:
A combination of
Tags are case-sensitive!
There are a few tags that can be added to the root entity or in the .app file. Here's a list:
This will hide an item under certain conditions. Add the following tag to the root entity:
EmptyAppearance:FPP
You have the following other options to achieve the same end:
force_Hair
A tag that forces hair to show up while wearing a head item. By default, head items turn hair invisible. By adding this tag to the root entity, you can override this process.
force_FlatFeet
A tag that forces female V's feet to be flat. Only works with a foot item as $base
in the .yaml
: use this if you're making flat shoes and don't want female V's feet to look as if she was wearing heels.
This tag will turn feet invisible for mascV unless the user has switch feet installed. You want to apply this to a conditional appearance in the .app file (&gender=m
)
For this, it is mandatory that you have unique component names. If you include your modder name, it's unlikely that anyone will overwrite them by accident.
PartsOverrides can't un-hide components for you. It can only hide them. If you want to load a different mesh (for example, a de-formed hakama when wearing a kimono or haori), then you're flat out of luck.
By being clever about your submeshes, you can offer different versions of your mesh (cropped! No arms! No legs), and users only need to install an .xl file! No need to have different meshes or even different .archive files.
Add custom tags in your .xl
file (not in your .yaml
!)
Simply add the tag to your appearance's tags array near the bottom of the individual entries.
This section will show an example how Custom Tags are utilized with Body Mods and AXL Clothes. This reference can also be applied for other projects.
To make use of custom tags, one of the Visual Tags below must be included within your .app file information list:
hyst_boobs_natural
[this tag will load the existing natural chest shape that is available when FemV doesn't wear clothes]
OR
hyst_boobs_squish
[this tag will load a squished chest shape that is ideal for tight garments such as bras or corsets]
This page explains how to enable body mod support in ArchiveXL:
NOTE
Run the following code snippet in CET to see which body is currently installed:
Create an .xl file in your Wolvenkit Project's resources folder (File -> New file -> ArchiveXL)
Optional: Name it the same as your current project (e.g. boobs_for_back_problems.archive.xl)
Put the following file content:
If you downloaded the template project, a patch .ent will already be included.
Inside the patch .ent, find the entMeshComponent
under the components
array.
Change its name
to match your body mod, e.g. Body:BoobsForBackProblems
-> Body:NewBody
Make sure that your patch .ent is added to the game by telling ArchiveXL about it. Add the following block to your .xl
file:
Include only the relevant body gender!
That's it, everything should work now! Let's test.
Launch the game and load into a save
If yes: Congratulations, you've made it much easier for people to add refits for your body!
The process is so simple that there aren't many things to go wrong:
If that doesn't work, check if the component gets added correctly. There are two ways to do this:
If a mod supports body tags, ArchiveXL can detect the current body mod, and conditionally load the correct mesh. Now, everything can be put into a single .archive!
If no body mod is installed, the value will be base_body
, so make sure to name your files and folders accordingly!
If you're sticking to the classical approach, you need to add the following lines to your .yaml
:
The following body mods support dynamic body switching.
You can use dynamic path substitution in clothing items, or in any s loaded via mesh.ent, as long as the depot path is set to Soft
If you are a mod user and want to dynamically recolour an item, check the Recolours and Refits guide -> sub-page Emissive ->
from customization, e.g. 03_senna
from customization. e.g. black_liquorice
Published: May 18 2024 by manavortex Last documented update: July 23 2024 by
Published: Jan 19 2025 by and Last documented edit: Jan 19 2025 by and
This page groups the individual CCXL addition guides and gives you an overview of the .
For a full explanation of the structure, see
For a guide on starting from zero, see
To learn more about the character creator, check ->
If the list below doesn't meet your needs, feel free to and
Published: March 12 2025 by Last documented edit: March 12 2025 by
Published: May 18 2024 by Last documented update: May 18 2024 by
If you want to avoid duplicate material definitions, check .
While has solved one problem, it introduced a new one. If you want to use the preferred approach of mesh path substitution, then you'll end up with a million duplicate files.
While will let you keep your materials in one spot, why would the chest size be relevant for a pair of socks?
Published: June 30 2024 by Last documented update: June 30 2024 by
We deleted the appearanceSuffixes
(we'd only need them for , and we can't be arsed with that)
Defines the variants — you'll get a gold star for paying attention, but we're getting to that later ()
Instead of one appearance per variant and gender, we will squash everything down so that we have only one appearance per gender. In , I will teach you how to reduce that even further, but for now, we'll be going step by step.
For a full list of conditions, see
Just like with appearances, you can also use with component names.
If you want several different body mods or feet state to use the same mesh, you can use instead.
Published: ??? by Last documented update: February 04 2025 by LadyLea
This page will tell you about tags and how they can be used to influence item behaviour. It also teaches you how can help you conditionally un-hide items or add new features.
Tags are used for calculating Garment Support score, see
There is an own page for
are a way to tell Cyberpunk that an item has certain properties and should behave in a certain way. This makes the game apply properties to your items, which can then be utilized by the game and ArchiveXL.
To apply visual tags to an item you must add them to property of your appearance definition or to of your root entity template.
Check below!
Check the section for more tags concerning .
Check the for shoe sound tags.
Check the section below for more tags.
Tags to partially hide default arms and cyberarms are not available, however, you can make use of with the aid of this OR you can create your own .
This only works for legacy ArchiveXL projects. If you're using , please use in your .app file.
If you don't want your new boots to sound as if V was barefoot, add one of the following tags to the :
Custom tags let you set from the .xl file without the need of touching either .app or .ent file.
Not convinced? Pity, but if you find a new use case for those things, do !
Thanks to the development of Custom Tags; Hyst's Body Mods [], [] [], are now updated with a new feature Shapes Add-ons - which allows creators to make use of different chest states other than the default chest - either: Squish or Natural [EBBN]. These add-ons will replace the default chest look of the modded bodies, by adding a Visual Tag.
First things first, make use of as this page contains the Shapes Add-ons resources to refit your garment. Once the ideal shape is chosen, it is time to build up your AXL project (further details on how to make AXL clothes can be found and )
The below example shows how the tag hyst_boobs_squish
+ other are being utilized together for an AXL garment + Body Mods that are making use of .
Published: ?? by Last documented update: February 27 2025 by AllKnowingLion Minimum required ArchiveXL version: 1.5
To learn more about body mods, check the page.
The past method of adding the components to each individual appearance . However, you'll want to use the new method (for version >= 1.14), since it is both more robust and less tedious.
Starting with version 1.14, you can use to inject your tags into the existing files!
You can download the , or create one yourself.
We'll make use of for this.
by running the CET command.
Update
Double-check your .yaml
via and make sure you don't have syntax errors (indent matters)
Check
If that still doesn't work, consider using the , which has been tried and tested on May 18 2024 with ArchiveXL
Make sure that your mesh has appearances and materials. If you are using , it's easy to forget a new body's mesh in the list like a gonk. This has never happened to the author, by the way.
Even with the , the process of supporting body mods is tedious. And even worse: you then have to pack everything separately for Nexus:
If you're using , you don't need to register a suffix and can simply match or substitute for the body tag:
NOTE: base_body
is also meant for body mods that are vanilla based shaped - for instance and
Now, you can use the suffixes in your just like camera states or body genders:
If you know something that should be on the list, please edit !
Hair
hairs
Body tattoo
body_tattoo
neck_tattoo
3300
left_arm_tattoo
3301
right_arm_tattoo
3302
left_shoulder_tattoo
3303
right_shoulder_tattoo
3304
chest_tattoo
3305
stomach_tattoo
3306
back_tattoo
3307
left_leg_tattoo
3308
right_leg_tattoo
3309
@beard
BeardBaseMaterial
@braid
BraidBaseMaterial
@cap
CapBaseMaterial
@cap01
CapBaseMaterial
@curls
CurlsBaseMaterial
@dread
DreadBaseMaterial
@long
LongBaseMaterial
@short
ShortBaseMaterial
@brows
BrowsBaseMaterial
@lashes
LashesBaseMaterial
hide_H1
Hides an item in the Head
slot.
hide_F1
Hides an item in the Eyes
slot.
hide_T1
Hides an item in the Chest
slot.
hide_T2
Hides an item in the Torso
slot.
hide_L1
Hides an item in the Legs
slot.
hide_S1
Hides an item in the Feet
slot.
hide_T1part
Toggles the partial suffix (&Full
→&Part
) when applied to Torso
item.
hide_Hair
Hides hair.
hide_Genitals
Hides genitals in uncensored mode and underwear in censored mode.
hide_Head
Hides head.
hide_Torso
Hides the whole torso (0, 1, 2)
hide_LowerAbdomen
Hides lower abdomen. (3)
hide_UpperAbdomen
Hides upper abdomen. (2)
hide_CollarBone
Hides collar bone area. (1)
hide_Arms
Hides the whole arms, including hands. (There's no easy way to partially hide arms, you would have to create custom tags)
hide_Thighs
Hides thighs. (4)
hide_Calves
Hides calves. (5)
hide_Ankles
Hides ankles. (6)
hide_Feet
Hides feet. (7)
hide_Legs
Hides the entire legs (including feet, 4, 5, 6, 7)
HighHeels
Turns the current (shoe) item into high heels. (Item's yaml $base
must be a foot item)
FlatShoes
Turns the current (shoe) item into flat shoes. (Item's yaml $base
must be a foot item)
Root entity appearance (without dynamic variants)
name
: my_appearance&FPP
.app path: base\characters\appearances\player\items\empty_appearance.app
default
.app conditional appearance: change default appearance name
name
: my_appearance&camera=tpp
ArchiveXL will automatically add empty appearances for anything you have not defined
.app conditional appearance: add empty appearance yourself
name
: my_appearance&camera=fpp
no partsValues, no components. Do not do this - use the line above this one instead!
Adonis
&body=adonis
Atlas
&body=atlas
Gymfiend
&body=gymfiend
Lush
&body=lush
Lush
&body=lush
Ult
&body=ult
Solo_OG
&body=solo_og
SoloArms
&body=soloarms
Song2
&body=song2
Flat
&body=flat
ELEGY
&body=elegy
RB
&body=rb
EBB
&body=ebb
EBBP
&body=ebbp
EBBRB
&body=ebbrb
EBBPRB
&body=ebbprb
Angel
&body=angel
Small Big
&body=small
&body=big
*NOTE*: you don't need this unless your mod specially modifies body meshes for this body, otherwise the value is base_body
(see official mod page for further info.)
VHD
&body=vhd
This page will tell you how to use ArchiveXL to add hair to the character creator.
To learn more about the character creator, check Game Components explained -> Character Creator: .inkcc
To convert an existing hair mod to CCXL, check Convert a hair mod to hair CCXL mod
You have downloaded the example project from Nexus
If you would rather understand what you're doing, please skip to Step 1: Deleting .ent files!
Download example project
Add your .mesh
file to the project
Copy the appearances
, materialEntries
, and localMaterialDefinitions
from the template mesh
Overwrite it with your own
Overwrite the .rig
and the .animgraph
with your own, if you have them
Adjust .app
file entry
If you're not using base game textures: Change files paths in the .mi
Rename the .xl
file
Change translation key in the .json
file to something unique for your mod
Change translation entries in the .inkcharactercustomization
file
Custompath everything — do not publish anything that still contains tutorial files!
Profit
We will be moving backwards through the files: starting at the bottom, and working our way to the top (the character creation and the .xl control file).
Start by downloading the example project from Nexus
Unpack the source
folder into the root of your existing hair project so that it merges with yours
Move any .mesh
, .animgraph
, and .rig
files from your original hair to your_modder_name\ccxl\your_first_addition\meshes
If you don't have any .ent
files, you're good!
If you do have them, delete them now – we don't need them in our CCXL projects.
Thanks to ArchiveXL magic, your .app file needs only one appearance. All other appearances will be extrapolated from it!
You can use any of the existing base game hair colours, as long as the definition itself is valid.
The template file has three .app
files – one of them is for your hair's default appearance, one is for the cyberware_01
appearance, and one is for the first person hair.
If you do not have a cyberware_01 appearance, you can delete this file and adjust the file path under Step 6: The .incharactercustomization file
If you want to add more meshes/rigs to the template .app (for example from uuhv4), you can duplicate the entSkinnedMeshComponent
and the matching entAnimatedComponent
from the context menu.
File Validation can help you making sure that your hair components and paths are correct.
This section will explain how ArchiveXL works its magic to pick all the right hair colours and -textures from three entries and a piece of duct tape.
If you are converting an existing hair mod, you probably already have these files.
In this case, copy appearances
, materialEntries
, and localMaterialInstances
from the template file to your existing hair mesh.
We'll now go through everything step by step.
As you can see, you only need a single appearance — ArchiveXL will generate all the rest.
If your hair mesh is set up differently from the template file, you need to adjust the chunk materials here!
In our example, the first submesh uses the material @long
, and the second one the material @cap
.
The names must be set as follows:
The tutorial hair has only two materials, and three material entries (@context
, @long
, @cap
):
You can define more materials here if you need them (please note the box below)
You have to use the exact material names that ArchiveXL is expecting, or extra hair colours won't work.
For a full list, see ArchiveXL: Character Creator additions -> #hair-materials
Now, let's look at the materials themselves.
This is not actually a material instance – instead, this is where you register your mesh file's material properties for ArchiveXL's character creator extensions.
Please note the following:
It does not have a base material
Each value
points at one .mi
file in the project
All of its values
must be of the type CpuNameU64
. You can create one as follows:
You need to create one entry for every type of material that you want ArchiveXL to expand.
For a full list, see CCXL Theory: Scopes and extensions-> Hair materials
If your hair is using a material multiple times (e.g. long, long, cap), you still create only one LongBaseMaterial value.
This material defines the hair cards. It points at the .mi
file in your project, where the hair's textures are defined.
All ResourcePaths must have Soft
flags for this to work, including the baseMaterial! (see screenshot)
Since the dynamic context does not transfer to the .mi
, we need to set the HairProfile
here.
The {material}
placeholder in the file entry will be replaced with the chunk mask name from the appearance (e.g. black_carbon
).
This material defines the hair cap (the stubbles on the scalp). It points at the .mi
file in your project, where the scalp's textures are defined.
Since the dynamic context does not transfer to the .mi
, we need to set the GradientMap
here. Omitting this will lead to the hair cap looking way darker than it's supposed to.
The .mi
file and the @context
are required for ArchiveXL character creator extensions. Without a .mi file, you won't have e.g. extra hair colours (e.g. Hair Profiles CCXL)
With the exception of the hair cap, the .mi file is a completely normal material tempate file (link not necessary for understanding this guide).
The hair cap base material is included within ArchiveXL. If you aren't using one, you don't need to know any of this — just move all properties without dynamic properties from the .mesh
file into your .mi
.
Open the included .json file, and make sure to change the entries according to your needs.
There are two translation entries, because this tutorial assumes that you want to name the cyberware_01
variant differently.
For an explanation of what is what, keep reading.
femaleVariant
Your First Hair
maleVariant
leave it blank
If no value is found, then femaleVariant
acts as default
primaryKey
0
Will be generated by ArchiveXL, leave it alone
secondaryKey
UI-Customization-your_first_hair
Used in the .inkcharactercustomization
file to set your hair's entry name
incharactercustomization
fileHere is where everything connects to each other.
For more information about this, see .inkcharactercustomization: CC options
Open the file, we will look at the entries now.
These entries create character creator additions, while the CustomizationOptions define them (think of a materialDefinition and a materialInstance in a .mesh
file).
Let's take a look at the headCustomizationOptions
. The first to entries of the type gameuiSwitcherInfo
add our new hair to Cyberpunk's character creator menu, so that they show up when you scroll through the hairs.
If you're only using one hairstyle mesh, keep this entry nameless, or it will overwrite the Character Creator: .inkcc's base switcher!
link: Targets one of the headGroups
entries
names: Contains the headGroup
's options
If you want to use a different mesh when cyberware_01 is enabled, you will have to cut "hairstyle" from the link
in the first entry and instead put it in name
to have two visibly distinct meshes. Otherwise you'll only have one mesh visible.
hairstyle_cyberware
This entry defines the hairstyle for cyberware_01
.
gameUiAppearanceInfo
sThe template inkcc has three gameUiAppearanceInfo
s, one for your hair, one for the cyberware_01 variant, and one for FPP.
If you do not have an extra appearance for cyberware_01, you can re-use the default hair .app
file.
Make sure to adjust the paths to your corresponding .app file:
From your project's resource directory, open the .archive.xl
file that you created in the previous guide. Add the following lines at the bottom (make sure that there are no leading spaces):
Now it's time to custompath your project.
On some versions of WolvenKit, you might encounter an issue where a file like .inkcharcustomization
fails to apply the custom path, in that case you'll have to open the file and copy relative path of your .apps
It's recommended to look in the Log view and check if there's an error in a renaming custompaths in files.
Most likely, you screwed up the names of your material definitions. They must be exactly as ArchiveXL expects them to be. Go back to 3.2 Material definitions and double-check everything.
This happens due to having a different localizedName
forcyberware_hairstyle
switcher that's inside the.inkcc
file. For exampleUI-Customization-your_first_hair
in the blank switcher, and UI-Customization-your_first_hair_cyberware
in the cyberware_hairstyle
switcher.
If you want to have a unique hairstyle mesh when cyberware_01 is enabled refer to 6.2 gameUiSwitcherInfos, specifically the hint about link
and name
.
This page will tell you how to use ArchiveXL to add body tattoos to the character creator
To learn more about the character creator, check Game Components explained -> Character Creator: .inkcc
If you want to create a tattoo first, check out For V - Creating Custom Skins - Tattoos - Scars Textures
You have downloaded the example project from Nexus, and merged it with your project's source
folder
We recommend that you use the suggested paths, as the template is configured to load files from there, then rename files at the very end once everything works.
If you ignore this advice, you're making things needlessly difficult for yourself.
You can look up all mesh paths in Cheat Sheet: Body
This is the path to acquire the gender you want to work on for vanilla V.
For the tutorial, I will take male V's right arm:
If you have downloaded the template project, you'll want to name your tattoo exactly as described below. We will rename it again later, which is easier if you stick to the workflow now.
ArchiveXL will do the heavy lifting, but if we leave the body mesh where it is right now, you will break the player body. For that reason, you need to rename the mesh file (you can use Wolvenkit's rename menu - hotkey: f2
).
For this tutorial, we'll put it in the following path (where the template files expect it):
This tutorial will not go into details about this process, but you need to
Slightly inflate the mesh so that it doesn't clip with the body (you can use a shrinkwrap modifier for this)
Import back into your project (check the link in the first bullet point)
In this section, we will configure your .mesh
file to load the texture(s) via the included .mi
.
The textures are inside the textures
folder. They are loaded by the .mi
file.
If you want to tweak the parameters, make sure to edit this file (we will look at it in more detail later).
You can learn more about meshes and materials on the 3d objects: .mesh files page, and about .mi files under Re-using materials: .mi.
This is not necessary for the purpose of this tutorial.
Open your .mesh file in Wolvenkit
Create or edit a materialEntry
:
Set the name to your_tattoo
Set isLocalInstance to true
(check the box)
Create or edit a local material instance:
If your mesh does not have preloadLocalMaterialInstances
, use localInstances.materials
instead.
Set baseMaterial to your_modder_name\ccxl\your_tattoo\textures\your_tattoo.mi
(the relative path to the .mi
file)
Create or edit an appearance
: the chunkMaterials
need to point at your_tattoo
.
As this is a template project, the .app
is already configured. Since you moved the .mesh to your_modder_name\ccxl\your_tattoo\models\your_tattoo_pma.mesh
, you don't need to change anything here:
Now, use dynamic renaming feature and rename your files.
Since our imported mesh is named as your_tattoo_pma
, the dynamic renaming feature will allow you to rename it to whatever you want. If you ignored our advice, have fun correcting all those entries one by one:
You can use the dynamic renaming feature (check the box) to safely move all the files in your project.
Change the localizedName
entry to something globally unique – call it something like UI-customization_yourmoddername_my-first-tattoo
.
If you end up using the same translation key as somebody else, the game might show either entry, and you probably don't want that.
This works the same as in CCXL: Hairs -> Step 5: The translation entry
This entry defines what the game will display instead of UI-customization_yourmoddername_my-first-tattoo
(as defined in our .inkcharcustomization file).
FemaleVariant
is used as default, so you can leave the male variant empty.
Open the .archive.xl on your project's directory. Here, double-check the paths and make sure that they point at the relative paths of your files.
Note: If you want to do for only one gender, just delete either male or female from the .xl and make sure to pick the mesh path to load the one you want if you want either of the genders. Adapting a tattoo is usually pretty easy! Why not make your mod for both genders?
Published: Jan 20 2025 by manavortex and IslandDancer Last documented edit: Feb 16 2025 by manavortex, IslandDancer, , , and
To understand appearances, you can check 3d objects: .mesh files-> . This is not necessary to complete the guide, though!
To understand material definitions, you can check 3d objects: .mesh files -> . This is not necessary to complete the guide, though!
To understand materials, you can check 3d objects: .mesh files -> . This is not necessary to complete the guide, though!
For more information on this, see .inkcharactercustomization: CC options -> . This is not necessary for the purpose of this guide!
You have a
In this tutorial, we will create an overlay mesh from a base game body mesh, which you can get from the .
If you want to create an overlay from a modded body, use the instead.