Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
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: ?? by Last documented update: October 26 2024 by AllKnowingLion Minimum required ArchiveXL version: 1.5
This page explains how to enable body mod support in ArchiveXL:
#clothing-mods-making-use-of-the-tags
To learn more about body mods, check the Overlay textures by framework page.
Run the following code snippet in CET to see which body is currently installed:
NOTE
The past method of adding the components to each individual appearance does still work. 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 ArchiveXL: Resource patching to inject your tags into the existing files!
You can download the template from Nexus, or create one yourself.
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:
We'll make use of ArchiveXL: Resource patching for this.
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
check if the body tag registers by running the CET command.
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:
Update ArchiveXL
Double-check your .yaml
via yamllint and make sure you don't have syntax errors (indent matters)
Check ArchiveXL's log file
If that doesn't work, check if the component gets added correctly. There are two ways to do this:
If that still doesn't work, consider using the template from Nexus, 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 ArchiveXL: Resource patching, 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 AKL AutoRefitter, the process of supporting body mods is tedious. And even worse: you then have to pack everything separately for Nexus:
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 you're using dynamic appearances, you don't need to register a suffix and can simply match or substitute for the body tag:
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
:
Now, you can use the suffixes in your root entity just like camera states or body genders:
The following body mods support dynamic body switching.
If you know something that should be on the list, please edit The Wiki!
As of 18th March 2024, Nim's More Body Meshes is compatible again with Gymfiend Body Mod.
Use only one main archive! [#_nim_more_body_meshes_Gymfiend_patch.archive]
Lush
&body=lush
Lush
&body=lush
Ult
&body=ult
Solo_OG
&body=solo_og
SoloArms
&body=soloarms
Song2
&body=song2
Angel
&body=angel
RB
&body=rb
EBB
&body=ebb
EBBP
&body=ebbp
EBBRB
&body=ebbrb
EBBPRB
&body=ebbprb
Gymfiend
&body=gymfiend
Adonis
&body=adonis
Flat
&body=flat
Atlas
&body=atlas
Published: ??? by manavortex Last documented update: August 2 2024 by LadyLea
This page will tell you about tags and how they can be used to influence item behaviour. It also teaches you how #adding-custom-tags can help you conditionally un-hide items.
Tags are used for calculating Garment Support score, see Garment Support: How does it work?
There is an own page for Influencing other items
Tags 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 visualTags property of your appearance definition or to visualTagsSchema of your root entity template.
Tags are case-sensitive!
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.
Check #hiding-body-parts-diagram below!
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
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)
Check the #foot-states section for more tags concerning Toggleable Feet.
Check the #setting-footwear-sounds for shoe sound tags.
Check the #root-entity-tags section below for more tags.
Tags to partially hide default arms and cyberarms are not available, however, you can make use of Chunkmasks with the aid of this component list for Arms and Cyberarms OR you can create your own Custom Tags.
There are a few tags that can be added to the root entity or in the .app file. Here's a list:
This only works for legacy ArchiveXL projects. If you're using ItemAdditions: Dynamic Appearances, please use conditional appearances in your .app file.
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:
Root entity appearance (without dynamic variants)
name
: my_appearance&FPP
.app path: base\characters\appearances\player\items\empty_appearance.app
default
name
: my_appearance&camera=tpp
ArchiveXL will automatically add empty appearances for anything you have not defined
name
: my_appearance&camera=fpp
no partsValues, no components. Do not do this - use the line above this one instead!
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
)
If you don't want your new boots to sound as if V was barefoot, add one of the following tags to the #root-entity:
Custom tags let you set component chunk masks from the .xl file without the need of touching either .app or .ent file.
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.
Not convinced? Pity, but if you find a new use case for those things, do edit it in!
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.
Adding stuff to the game, for the major-leagues
Published: August 2023 by manavortex
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
Translations (check #how-does-the-game-assign-display-namesfor a guide)
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.
You can find more detail about this on the sub-page ArchiveXL: Suffixes and Substitutions -> #which-substitutions-exist
For a tutorial about this, check ItemAdditions: Dynamic Appearances
If you are a mod user and want to dynamically recolour an item, check the Recolours and Refits guide -> sub-page Emissive -> #switching-existing-colours
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.
Published: May 18 2024 by manavortex Last documented update: May 18 2024 by manavortex
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.
If you want to avoid duplicate material definitions, check ArchiveXL: Resource patching.
While ArchiveXL: body mods and refits 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 ArchiveXL: Resource patching will let you keep your materials in one spot, why would the chest size be relevant for a pair of socks?
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!
Modify resources in a non-conflicting ways and reuse definitions.
Published: May 18 2024 by manavortex Last documented update: July 23 2024 by
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.
Until the more comprehensive knowledge drops, this guide will be a placeholder.
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
Use them like this:
This will include all the needed files for patching without the need to specify each of them manually.
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 convert your mod to use dynamic variants... in ten minutes
Published: June 30 2024 by manavortex Last documented update: June 30 2024 by manavortex
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 deleted the appearanceSuffixes
(we'd only need them for Gendered preview icons, and we can't be arsed with that)
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.
Defines the variants — you'll get a gold star for paying attention, but we're getting to that later (#step-3-the-mesh-entity)
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
Instead of one appearance per variant and gender, we will squash everything down so that we have only one appearance per gender. In #lets-simplify-this-even-further, I will teach you how to reduce that even further, but for now, we'll be going step by step.
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.
For a full list of conditions, see ArchiveXL: Suffixes and Substitutions
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.
Just like with appearances, you can also use #conditions with component names.
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.
If you want several different body mods or feet state to use the same mesh, you can use ArchiveXL: Resource linking instead.
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
How suffixes and substitutions work
Published: ??? by Last documented update: Feb 18 2024 by
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 , check the corresponding pages in the Modding Guides section
Dynamic appearances have their own guide (see )
There is an own page for
To conditionally hide items or parts of items, check or (especially the section about )
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 !
Since 1.5, psiberx has made it possible to use conditionals via , 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
.
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).
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:
You can check the current foot state by running the following command from CET:
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).
Inside your mesh_entity.ent
for component.name
:
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 list of active suffixes, check the tables above.
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_
.
inside mesh entity
components in the fields name
, depotPath
and appearance
in the .app
appearances for the field name
Any placeholders will be interpolated at run-time (replaced with the correct value for your current state)!
Substitution will only become active if the property name starts with an asterisk (*
).
The order works as follows:
Hides the whole arms, including hands. (There's , you would have to )
.app : change default appearance name
.app : add empty appearance yourself
ArchiveXL allows body modders to , which can then be used for suffixes and for substitutions in dynamic variants. To learn more about this, check .
If the arm states aren't working as expected, check if the table above is outdated by comparing the names with the .
To achieve gender equality in regard to foot states, you need to use . 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 .
If the foot states aren't working as expected, check if the table above is outdated by comparing the names with the .
By using conditional appearances, you can still make use of partsOverrides
to use .
For a hands-on example, see ->
For a hands-on example, see ->
For a hands-on example, see ->
Do yourself a favour and don't use suffixes! They are outdated - use instead.
Since 1.8.0, ArchiveXL supports substitutions for . You can use them in two places:
For a tutorial about this, check
If you are a mod user and want to dynamically recolour an item, check the guide -> sub-page Emissive ->
If any of the placeholders aren't working the way you expect them, check if the table below is outdated by referring . (Please update the wiki if that happens!)
For , you can conditionally switch out components or entire appearances by name. You can switch use any of the entries from
First Person Perspective
&FPP
fpp
&camera=fpp
Third Person Perspective
&TPP
tpp
&camera=tpp
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
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)
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
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!
{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}
skin color name from customization, e.g. 03_senna
{hair_color}
hair color name from customization. e.g. black_liquorice
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.