arrow-left

All pages
gitbookPowered by GitBook
1 of 73

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Analysing other mods

This guide will walk you through analysing or extracting archive files from tutorial resources or other mods.

hashtag
Required: WolvenKitarrow-up-right

circle-exclamation

Please keep in mind that you are looking at somebody else's work. Always credit if you use anything from other peoples' mods, unless it's explicitly stated that you don't have to!

triangle-exclamation

Some modders don't want their mods to be unbundled. Most people don't mind if you do it for your own personal use, but you should seek permission and respect their decision.

For a documentation on how to use Wolvenkit CLI, see . Unless you have a very good reason to use the console, you probably don't want to.

hashtag
Step 1: Switch to mod browser

You can now add the content to your project just like you do it with game files:

hashtag
Step 2: Find the correct files

The folders in the mod browser correspond to the names of the .archive files you have installed.

E.g., To find all .mlsetup (colour definition) files inside the , search for:

If you want all mesh files from the , search for

f you want to know more, you can read up on .

hashtag
Step 3: Add the files to your project

Select the file that you want to add by checking the box. Then right-click on it, and click on the Add selected items to project option.

That's it!

Modding Guides

circle-info

This page contains instructions on making mods. If you want to install mods instead, check here.

hashtag
Here, you can find

  • various modding guides in the menu tree to the left

  • an overview on and

  • information on inside a mod

  • A guide on how to

  • Information and how to configure them

  • to quickly look up files in the game paths

  • Information on and

If you just want to look something up or find a file, check the "" section.

Legacy: Analysing other mods with Wolvenkit Console

Unbundling mods with CLI

circle-exclamation

This technique is outdated as of 2023. If you don't have a very good reason why you need Wolvenkit console, then you should .

hashtag
wolvenkit.cli.exe

existing frameworks
tools
folder structure and file types
analyse other mods
on Cyberpunk materials
Reference lists and cheat sheets
textures
how the game uses them for UI elements
References, lists and overviews
📚References, lists and overviewschevron-right
circle-exclamation

You need to download the WolvenKit.Console version for this, rather than the regular one.

  1. Optional, but recommended: Make sure that your downloaded .archive is inside a folder with no other items.

  2. Open WIndows Command (press Windows+R and type cmd, then press enter).

  3. Drag and drop WolvenKit.cli.exe into the command window

  4. Type a space

  5. Type unbundle -p

  6. Type another space

  7. Drag and drop the archive you downloaded into the command window.

You will now see something like

triangle-exclamation

If your paths contain spaces or special characters, make sure that they are surrounded by quotation marks as in the example above, or the command will fail.

If you press enter now, WolvenKit will unpack the archive, putting the contents into the same directory.

circle-check

You can now copy the extracted folders to your WolvenKit project's archive folder.

stick to the GUI
"C:/Path/to/Wolvenkit.cli.exe" unbundle -p "D:/Path/to/subdir/downloaded.archive"
- Path
  - to
    - subdir
        archive.archive
        - base
here
Netrunning Suits mod
Custom T-Shirt Mod
Switch to "Mod browser"
Add items to project

Animations/Poses

This page will gather knowledge and guides about animations.

hashtag
Summary

This page and its subpages contain links to guides about making animations and poses (static animations) for Cyberpunk 2077 and importing them into the game. For theoretical information, please refer to the .

For individual guides, please check the sub-pages in the navigation tree or use the "Next" button at the bottom of this page to browse through.

archive:ArchiveXL_Netrunner > .mlsetup
archive:my_tshirt > .mesh
circle-info

For a video on how to edit poses with Redmod, see (official video guides).

This guide will teach you how to make your own static poses in Blender and import them into an existing .anim file.

You can use the same process to make photo mode replacers or create animations with multiple keyframes.

This walks you through the process of hooking an existing .anims file up with AppearanceMenuMod.

How to add standalone poses to photo mode (rather than making replacers)

How to replace the default set of expressions with those from an NPC

Animations part of the knowledge base

Editing existing items

Irons, threads and everything else

This section contains guides how to alter or overwrite already existing items (please see the page tree in the navigation menu on the left).

If you want to look up , find the corresponding page in .

herearrow-up-right
Poses/Animations: make your own
AMM: Collab anims/poses
ArchiveXL: adding Photo Mode Poses
Photo Mode / AMM: Other Facial Expressions
Variants and appearances
References, lists and overviews
Changing materials, colors and textureschevron-right
Replace a player item with an NPC itemchevron-right

Archived

Out-of-date content and guides.

All of these articles are out-of-date. Only use if you really know what you're doing.

Custom icons and UI

Expanding Cyberpunk's base UI

This is the landing page for guides that teach you how to influence Cyberpunk's base UI and its textures.

For a full overview of guides linked here, please check the link tree on the left.

Vehicles

circle-info

This section collects information for vehicle modding. However, all we have as of now are two links.

Boe6 has been so nice to share their (very detailed) guide on Google Docarrow-up-right and given full permission to transfer it to the wiki. However, nothing has happened yet.

A second guide is herearrow-up-right, although it is not very detailed.

NPCs & V

This is the landing page for guides on how to change people. Here you can learn how to modify or create custom NPCs.

Please check the link tree in the menu on the left for details.

If you want to know where to find a specific NPC, check NPCs and their files in the References, lists and overviews section.

Inkwidgets: a custom interface

How to create a custom interface via inkwidgets

triangle-exclamation

There's nothing here yet! Maybe you are the person to change that?

Quests

Textures and LUTs

Modify Cyberpunk's visuals

This section contains guides for

  • the process of modifying Cyberpunk's visuals.

Everything else

Stuff that didn't fit the other categories

This collects all guides that didn't fit any of the other categories. Check the navigation tree on the left / in your phone's menu.

Sound

WIP: This page contains a selection of guides on how to create sound-related mods but is still incomplete.

triangle-exclamation

Feel free to sign up and add your knowledge to the wiki. It doesn't matter if the guide is shitty or if your English is bad, the next person can always improve on your stuff – as long as there is any stuff!

hashtag
Guides:

Playing Sounds in-game : Basicschevron-right

hashtag
External links:

There are a couple of pages about sounds on Roms1383s wiki for his Addicted Mod:

Customise CP77 info on GOG

hashtag
Summary

Created by @Pinkydude Published Summer 2021

Go in the two little lines with circle thingies, and go to “edit” / the second option. Click on the “Media” tab and you’ll be able to put any pictures!

Mind the resolution, and put something smaller than the ones recommended (it doesn’t work if it’s exactly 660x930px)

f!V and her gremlin feet

hashtag
Summary

As you have probably noticed, female V has two different feet states because fuck you, that's why. Fortunately, that's why a bunch of really smart people came up with ToggleableFeetarrow-up-right, which gives you some freedom for ArchiveXL and EquipmentEx.

To see the documentation, scroll to the bottom of the Nexus mod's page and click on the spoiler tags

Items: Equipment

Weapon, armour, consumable, hair, cyberware..

Welcome to the equipment section. Here, you can find guides on how to edit equipment and wepaons in Cyberpunk. The section is split into the following subsections:

hashtag
Wait, that's not what I want!

This section contains hands-on guide for editing equipment.

Troubleshooting normal maps

In-game, your normal map isn't looking as expected

hashtag
Import settings

The texture has to be imported without the isGamma flag. Import over an already-existing normal map to rule out this as a source of error. See for more detail.

NPV: Cleanup and troubleshooting

I'm done, what's next?

hashtag
Re-path your folder

chevron-rightWhy are we doing this?hashtag

When packing a mod, Wolvenkit generates an .archive file with the files in your project's

https://cyb3rpsych0s1s.github.io/4ddicted/cheatsheet/sounds.htmlarrow-up-right
https://cyb3rpsych0s1s.github.io/4ddicted/travelog/2023-03-31.htmlarrow-up-right
If you want specific information (where is...), check here:

References, lists and overviews contains overviews, such as

  • Spawn Codes (BaseIDs/Hashes)

  • Variants and appearances

We also have a section on 3d Modelling, where you can find specific knowledge on how to edit objects. For a detailed step-by-step guide, see R&R: Refitting (step by step).

For help about editing textures, see the Textures and LUTs section.

For general troubleshooting and help with Wolvenkit's interface, see

Textures: Importing, editing, exporting

Exporting and importing meshes

Adding new itemschevron-right
Editing existing itemschevron-right
Recolours and Refitschevron-right
Influencing other itemschevron-right
hashtag
UV scaling

Cyberpunk actually considers the UV map's scaling when calculating the weight of the normal maps:

the problem

Since the neck part is scaled much larger than the chest, this will make the parts of the mesh visibly distinct.

The solution

this conversation on Discordarrow-up-right
source
folder. The problem here is that each file can only be
modified once
.

Assume both you and your friend make an NPV. They made Alice, you are making Bob. And because your friend was lazy, they didn't complete this step. And since their project is called Alice_NPV.archive, none of your changes will even show!

That's why you'll have to re-path your folder. If you don't, you will ruin someone's day.

You need to re-name the template folders. Unless you want to make more NPVs, it will be enough to re-name tutorial to your_username. Find a full guide to the process under Moving and renaming in existing projects.

hashtag
My NPV doesn't show!

Read Why are we doing this? in the Re-path your folder section: make sure to disable all other NPVs.

hashtag
I'm getting errors in Wolvenkit!

circle-info

You can check the page on the Wolvenkit wiki.

hashtag
It installs, but doesn't launch

Just install the mod via WKit, launch Cyberpunk the way you normally do.

How to Remove an Animation (and Potentially Replace It)

Guide made by Forsentio - Quest Team member working on WolvenKit at RED Modding Tools.

hashtag
Summary:

We will demonstrate the step-by-step process which allows you to remove (and potentially change or replace) an animation in game.

hashtag
Requirements:

  • (thanks for rfuzzo).

  • .

  • (thanks to alphaZomega).

hashtag
The Steps:

1. Unbundle and uncook basegame_3_nightcity.archive, basegame_4_gamedata.archive using CP77Tools 2. Find the animation you want to remove (in our case we want to remove the idle animation that plays when the player is standing in front of a mirror)

The game works by using .scene files for certain interaction; you should take a look into those and search for the sectionNode that plays the animation you want to remove after you opened it in the 010 Editor, by using alphaZomega's template. The scene file we are using is located in "base\quest\minor_quests\mq000\scenes\mq000_01_apartment.scene"

3. Once the sectionNode is found, open Struct Data, then scnSceneResource, then scnSceneEvent array, then scnPlaySkAnimEvent, then scnEventBlendWorkspotSetup; inside of it you will find a workspotId, which you must take note of.

SIDE NOTE: Most of the game relies on Workspots used as interactable points both by the AI and the Player. In this case, the Workspot we are changing is used for the various interactions in V's appartment. The Workspot's location is "base\worksposts\quest\main_quests\prologue\q001\q001_01_wakeup\q001_01_wakeup__look_mirror.workspot"

4. Return to scnSceneResource and open scnWorkspotInstance. Search for the one that has the same number right next to workspotInstanceId; open it and take note of the dataId 5. Return to scnSceneResource and then open the scnWorkspotData and open each of theme until you find the one that has the same dataId. Open it and take note of the path right after the workspotResource 7. Open the .workspot file and then go to Struct Data, then workWorkspotResource, then workWorkspotTree, then handle:worldEntry, then workSequence, then worklEntry: there you will find a different named work[...]Anim; search for the one that has the same name as the animation you want to remove and take note of the number right before the name 8. Go into the CNAME array and zero out the name 9. Save, pack and place in the Mod folder

Adding Locations and Structures with ArchiveXL

This guide demonstrates how to add new locations to the world by creating new .streamingsector files and adding them to the game world by merging them with the all.streamingblock via ArchiveXL

Valid as of March 21 2023

Requirements

  • Wolvenkit 8.8.1arrow-up-right (bugs in nightlys and stable version 8.9.0 prevent adding new nodes to a streaming sector)

  • (thanks Psiberx!)

Resources

  • - this adds a low poly house exterior mesh to the center of the glass dome in corpo plaza (near the giant holo fish)

hashtag
Adding a custom location to a new streaming sector and merging it with the game world

  • After following the previous guide to add and position the objects you want to add to the game, open the example mod project in Wolvenkit and open the file new_mod_sector.streamingsector

  • in the "Node Data" section, right click on the existing node and click "Import from JSON (no coords update)

Gendered preview icons

This is a sub-page of "your own preview icons" and only contains information on how to hook up gendered variants once you already have the files. If you aren't quite there yet, refer to the other guide first.

hashtag
Requirements:

This will not work unless your item is using the corresponding suffix. Without it, the game has no way to tell male and female items apart.

circle-info

If you want to know more about this, you can read up here:

If you don't have a gendered item yet, see the original ArchiveXL guide, section "".

hashtag
How to do it

By adding an icon property to your item's yaml, you're telling ArchiveXL to create an UIIcon record for you. The generated records will be the same for all genders, variants and tags.

If you want to use a gendered preview picture, you can create a more specific record yourself. In this case, you can delete the icon entry from your item.

Its name will follow this schema:

hashtag
Wait, what?

ENTITYNAME, APPEARANCENAME, SUFFIXES and VISUALTAGSabove are placeholders for the corresponeding fields in your YAML.

circle-info

You can look up the actual names of the created records in CET's Tweak Browser and simply copy them to your .yaml

For example, if you have the following item:

… then you'd define a preview image like this:

The trailing underscore separates the empty visual tags from the suffixes entry.

circle-info

Your items won't need an icon record anymore, the assignment now happens by magic!

Swap Johnny during the Alt's scene

hashtag
Summary

Created by @Pinkydude Published Summer 2021

What you’ll need :

  • A “Never fade away” Savefile before entering the room

First off, grab my FixSwap and Removers mods and drop them in your Mod Folder

Load your “Never Fade Away” save file before entering the room, and open AMM

Spawn > At Own Risk > Johnny mirror

The spawned Johnny will be invisible, you’ll need to scan his feet shadow to be able to swap!

Make a quick save and reload it

Make sure to despawn your V/Johnny before entering the room!

There will be small a moment, when Alt takes off Johnny’s glasses, where your V will turn invisible ; That’s ok, they’ll pop right back when the mirror scene start!

How to Edit Voiceover and Subtitles In a Quest.

Guide made by Forsentio - Quest Team member working on WolvenKit at RED Modding Tools.

hashtag
Requirements:

  • CP77 Toolsarrow-up-right

  • (Thanks to alphaZomega for his great work)

  • Some basic knowledge of what are you doing (Seriously)

First and foremost you need to have the raw files of the game extracted If not, use the latest release of CP77 Tools and extract the archive. You also need to extract and unbundle the lang_eng_text archive for this tutorial.

Now that you have the raw files, head to the "quest" folder (found here: [...]\basegame_4_gamedata\base\quest) then chose a quest from one of the sub folders:

  • main_quests (the main story quest, internally labled as qxxx)

  • minor_quests (minor activites such as psycho sighting... etc, internally labeled mqxxx)

  • side_quests (the side gigs such as Judy's quest, River's story... etc, internally labled as sqxxx)

For this guide, we're going to use the one named MQ041, also known as "War Pigs", avaialable only for the Corpo lifepath. You should find it here: [...]\basegame_4_gamedata\base\quest\minor_quests

We want to make the main character say a different line then the one he is supposed to. For example replacing "Hey, yeah, sure. Damn, you ol' bastard, been a while since..." with "Fuuuck!" when the holocall starts.

You should have also unbundled and uncooked the lang_eng_text archive.

Okey, now that everything is clear, let's start. 1. Open the scenes folder inside MQ041, and then open the file named mq041_corpo_01_deadmans_switch.scene in 010Editor with alphaZomega's CP77_CR2W.bt template already installed.

2. Go to struct Data, open scnSceneResource, then scnscreenplayStore; inside you're going to find an array named scnscreenplayDialogLine 3. We're going to associate each entry with the line we see on screen; to do so we need the locstringIds and another file you can get from the lang_eng_text archive 4. Next, open the lang_eng_text archive and search for mq041 here: [...]\lang_en_text\base\localization\en-us\subtitles\quest 5. Once found the quest folder open the .json named mq041_corpo_01_deadmans_switch 6. Open struct Data, then JsonResource, handle:iSerializable, localizationPersistenceSubtitleEntry and finally array:localizationPersistenceSubtitleEntry 7. Here in the value column you're going to see lots of stringId; remember the locstringIds from point 3? Good! They're the same 8. We now know that stringId = 1822802647440039936 is responsible for "Hey, yeah, sure. Damn, you ol' bastard, been a while since...", and that stringId = 1874801294016040960 is the same as "Fuuuck!" 9. Let's go back to the the

[PLACEHOLDER FOR A VIDEO]

R&R: Troubleshooting

The troubleshooting section for the Recolours & Refits guide

hashtag
Summary

Created by @manavortex Published September 30 2023

This page is a part of the Recolours and Refit guide. It will

circle-info

The troubleshooting steps below will be expanded as people follow this guide and run into problems. If you encounter anything not on the list,

  • make sure to double-check the guide — did you complete all required steps in the correct order?

  • find @manavortex on the , for example in #mod-dev-chat

hashtag
Import/Export

You can check or see for general troubleshooting.

hashtag
I can't import my file back

hashtag
Have you moved any files?

File paths are which files belong together. If you have moved files, do this:

  1. Export the target file again

  2. Overwrite the exported file in your project's raw folder with your changes

  3. Import back

hashtag
MLSetupBuilder

You can find tool-specific troubleshooting on .

hashtag
I can't build a depot

That's okay, you can still , or you can check for more instructions.

hashtag
Refitting

hashtag
My mesh is string cheese!

You either need to , or .

World Editing

Step by step guide on how to move or delete a object from the world of cyberpunk 2077.

hashtag
Summary

Created by @Krat0es Published October 10 2022

This guide aims to teach you moving and deleting objects from the world.

hashtag
Requirements

  • or higher

circle-info

For more documentation on streaming sector files, see .

For a list of interesting locations to modify, see .

For a guide how to export streaming sectors to Blender, see .

hashtag
Finding the required sector

  • first of all you will need your in-game player coordinates you can use print(GetPlayer():GetWorldPosition()) in the CET console to get them.

  • after that search for streaming block in the asset browser and open the block then click on sector preview

  • After finding the sector you need add it to your project then open it then click on sector preview again, from the menu on the right find the object you want to move or delete, click on the small red box to confirm if its the right object or not (you will see it disappear when you do that)

  • After finding the object you want to move or delete go back to the WorldStreamingSector tab then click on nodeData then find the object in the list (You can memorize where the node is from the sector preview menu) (edited)

Note: when you delete a object and you see a low res mesh in its place in the game that means the object has a proxy assigned you will have to find the sector the proxy is in and delete the proxy mesh. (you may do that following the same steps)

Adding Objects to the World

will share info on how to add objects like door, loot, walls etc

hashtag
Summary

Created by @Krat0es updated by Doctor Presto Valid as of March 21, 2023

This guide aims to teach you adding objects to the world.

hashtag
Requirements

hashtag
Recommended

  • and updated file created by KeanuWheeze - this archive contains an ent for every single vanilla mesh in the game, allowing you to spawn anything you'd like. place the archive in your mods folder and use the allpaths text file to replace the one in your object spawner data folder in the CET directory - should be something like this: Cyberpunk 2077\bin\x64\plugins\cyber_engine_tweaks\mods\entSpawner\data

hashtag
Adding Objects to the World

  • Install Object Spawner

  • Start the game, load a save, navigate to the location you'd like to build and press your CET hotkey. Object Spawner will open along side CET and any other CET mods you have installed

  • Go to the "Spawn New" tab of Object Spawner and search for the objects you'd like to spawn - simply click on the name to spawn it.

Note: depending on the object spawned, it may or may not have baked in collisions. Keep this in mind and don't worry - there are a number of ways to either add collisions or fake them depending on the context.

  • Add your objects to a group - if creating a building or other complicated structure, you should also create subgroups for each of your exterior walls and other major components.

  • after placing the objects, save the group incase you want to change something later on and then use Object Spawner's export function to create a .JSON file which you can use to add these objects permanently to the world.

Now you are ready to move on to the next guide which will help you add these items to a new .streamingsector file and merge your additions with the game world using ArchiveXL so that your items are a permanent addition with no worries about conflicting with other mods.

How to Change Position and Rotation of an entMeshComponent

Guide made by Forsentio with the help of Loomy, PixelRick and Sombra - Team members working on various projects at RED Modding Tools.

hashtag
Summary:

We will guide you through the step-by-step process that will allow you to rotate and position differently the duvet above V's bed, so that it flows with how the sleep animation plays out.

hashtag
Requirements:

  • .

  • .

  • Some basic knowledge about modding Cyberpunk 2077.

hashtag
The Steps:

1. Unbundle and uncook basegame_3_nightcity.archive, basegame_4_gamedata.archive. 2. Find the entity you want to modify (in our case it's located here "basegame_3_nightcity\base\quest\minor_quests\mq000\entities") 3. Once you have the entity open its buffer in the Cyberpunk Save Editor by dragging and dropping it inside. 4. Open the entMeshComponent that has the same name as the mesh you want to modify (in our case is 3 entMeshComponent "bed_duvet_poor"). 5. Open the localTrasnform array, and inside of it Position and Orientation; you're going to see different values. IMPORTANT NOTE: ijkr are to be read as xyzw, **** where z is front/backword, x is left/rigth, y up/down. 6. Edit those values accordingly to how you want the entMeshComponent to appear in game (this is where experimenting is encouraged until you get the result you want ) IMPORTANT: For a better understanding of how your changes may affect the ingame position and rotation use this

Playing Sounds in-game : Basics

A Basic guide on the different ways to play a sound effect in-game

hashtag
Difficulty:

This is a very basic tutorial so you don't need much knowledge to do it successfully.

hashtag

  appearanceSuffixes: [ itemsFactoryAppearanceSuffix.Gender ]

Notepad (Recommanded since you need to copy some info)

  • A basic understanding of Cyberpunk 2077 modding.

  • CP77Toolsarrow-up-right
    010Editorarrow-up-right
    CP77_CR2.btarrow-up-right
    array
    mentioned in point
    3
    ; first thing we do is swap the two the
    locstringIds
    10.
    Once that is done we need to swap the names we see on the left; in this case
    m_194BE559A84E2000
    with
    m_1A04A1D80244D000
    ; we can do that by simply going in the
    CName
    array and replacing their entries.
    11.
    Once that is done be sure to
    save, pack
    and put the archive in your
    Mod
    folder
    010 Editorarrow-up-right
    CP77_CR2W.btarrow-up-right
    (kindly provided by
    Loomy
    )
    7
    .
    Repack, Build
    and put into the
    Mod
    folder
    CP77Toolsarrow-up-right
    Cyberpunk Save Editor (CPSE) v0.5.5-devarrow-up-right
    websitearrow-up-right
    My Alt’s scene FixSwap modarrow-up-right
    My JohnnyPlayer Remover modarrow-up-right
    My Netrunner suit Remover modarrow-up-right
    AMMarrow-up-right
    Requirements:
    • Wolven kit

    • Any text editor capable of opening a big JSON file without crashing

    That's about it.

    hashtag
    A quick introduction:

    This tutorial presumes that you already have a mod project in WolvenKit and will not walk you through how to create one.

    If you don't have redscripts in your project, you will need to add the following structure to your resources folder inside your mod folder:

    hashtag
    Actually playing sounds:

    There are 3 documented ways to play sounds using scripting. Two are linked to the event system and the third one is linked to a helper function:

    hashtag
    Using the event system:

    hashtag
    The first way:

    hashtag
    The second way:

    hashtag
    Using the helper function:

    If you try to run the script now it will most likely fail because you don't have the player object used to queue or play the event.

    So how to get the player?

    It's actually quite easy, once a save has been loaded, you can simply use:

    You are not even obligated to get the player. You can use any GameObject capable of handling events in the event way and you can use any GameObject at all using the helper function. If it isn't valid, the GameObject method will use the game engine to play the sound. (It will not be spatialized this way)

    hashtag
    Playing any sounds that aren't V grunting:

    If you did everything correctly, your sound should be played in the part of the script where you used it.

    And now, you will probably want to play other sounds. Sounds played by the game are referenced using a redIdentifier. To find many of these identifiers for sounds, you will need to use WolvenKit and navigate to:

    You can then import it into your project, turn it into JSON and explore the JSON file to find all the tags, for example:

    Use any of these IDs and experiment!

    There is a lot of them so use string search to find them more quickly. You can also search for them in the events array for an easier search with tags.

    r6/
    ├─ scripts/
    │  ├─ your_script.reds
    let evt: ref<SoundPlayEvent> = new SoundPlayEvent();
    evt.soundName = n"ono_v_effort_short";
    player.QueueEvent(evt);
    let evt: ref<AudioEvent> = new AudioEvent();
    evt.eventName = n"ono_v_effort_short";
    player.QueueEvent(evt);
    GameObject.PlaySoundEvent(player, n"ono_v_effort_short");
    let player: wref<PlayerPuppet> = GetPlayer(GetGameInstance())
    base/
    ├─ sound/
    │  ├─ event/
    │  │  ├─ event_metadata.json
    sq027_sc_08_panam_pours_drink
    This will open a window which allows you to browse to the export folder of Object Spawner. this will be something like Cyberpunk 2077\bin\x64\plugins\cyber_engine_tweaks\mods\entSpawner\export You will find a JSON file named after the main group you created and exported in this folder folder
  • Select that file and Wolvenkit will create the necessary nodes, in the streaming sector, adding them to the location you selected.

  • Delete the node which was included as an example and rename the file to something unique for your mod.

  • Open the new_mod.streamingblock file in the project

  • Under the "descriptors" tab, edit the 1st entry so that the depot path points to your .streamingsector file

    • Now you need to set the streaming box for your new sector. The easiest way to figure this out is to just take the coordinates from a central object in your mod (you can find these in your .streamingsector file on each node) and add 300 units to each number for the max, subtract 300 for the min. This will need to be adjusted based on how far away you want your objects to be visible in the world.

    • rename this streamingblock file to something unique to your mod

    • Now all that's left is to edit the .xl file included in the resources section of the example so that it points to your streamingblock file. All you need to do is replace "mod\new_mod.streamingblock" with the relative path to your streamingblock.

    Once you've done the above steps, install your new mod and launch the game, if you've completed all the steps, your new objects, structure or location will spawn just like the rest of the world

  • If you run into any troubles, double check the guides and then pop over to #world-editing on the cyberpunk discord server

  • The latest stable release of ArchiveXLarrow-up-right
    Example mod project, including template .XL file, .streamingsector and .streamingblockarrow-up-right
    use the player cords to find the area you are looking for

    after finding the object node in the list click on it to expand the node there you will find Postion, Orientation and scale

    nise
  • from there you may change the object coordinates (remember to save after making any changes)

  • you may right click the node then delete it like you see in this image (this will delete the object from the world)

    deletus
  • WolvenKit 8.7arrow-up-right
    here
    herearrow-up-right
    herearrow-up-right
    veri nise
    amazing

  • Use the tools in the "Spawned" tab to move and position your objects. It is a good practice to give each object a unique and recognizable label. Try to proceed slowly and always keep in mind that you may want to move/change or otherwise edit these components later on so a few extra moments to keep them organized and labelled can save you a lot of frustration later on.

  • Wolvenkit 8.8.1+ arrow-up-right
    Object Spawnerarrow-up-right
    allmeshes.archivearrow-up-right
    allpaths arrow-up-right
    adding a male instance
    REDmodding Discordarrow-up-right
    Exporting and importing meshes
    Troubleshooting your mesh edits
    MLSB's wiki page
    complete the guide without a full depot
    MLSetupBuilder's wiki page
    import garment support
    delete the parameters

    Replace a player item with an NPC item

    Put your item in place of a default game item. Supports variants.

    hashtag
    Summary

    Created by @manavortex Published November 05 2022 Updated July 26 2023

    This tutorial will teach you how to switch a player mesh for an NPC garment and map its variants to the existing colours.

    Other relevant know-how for this process:

    For a guide how to import meshes into Cyberpunk, check .

    triangle-exclamation

    Make sure that you replace an item that you can actually spawn — not all items in V's folder are actually spawn-able =>

    hashtag
    Step 1: Replace the mesh

    Perquisite: You need a Wolvenkit project.

    Find the mesh that you want to use ("the old mesh") and replace it with the one that you want to switch in ("the new mesh").

    circle-info

    Example: Replacing the short-sleeved poser jacket with the monk shirt with the tied-back sleeves.​ For the male variant, replace _pwa_ with _pma_ and _wa_ with _ma_.

    1. Find both files in the Asset Browser and add them to your project.

    2. Move the replacement mesh to the original mesh's folder.

    3. Rename the old mesh (e.g. "t2_084_pwa__short_sleeves.mesh" -> "original.mesh").

    hashtag
    Step 2: Enabling variants

    The game looks up appearances in a mesh file by name. If none can be found, then game meshes will fall back to the default appearance, which is how the early replacers worked — every variant (base_01, old_01, rich_01) would simply spawn the default appearance.

    We can simply transfer the names from the old mesh to the new mesh by renaming the entries in the appearances array.

    circle-info

    If there are more entries than variants available, or if you're just curious which spawn code corresponds to which appearance, go for a guide how to find out.

    Now that we have done that, we can start recolouring.

    hashtag
    Step 3 (optional): Find the .mlsetups

    Each appearance in the appearances array has a list of chunkMask entries (one per submesh), which are assigned a material by name. For a more detailed explanation, you can check , but all we care about right now is this lookup chain:

    hashtag
    Step 4: Success!

    You can now save your mesh, then install your mod by clicking on the green arrow in Wolvenkit's toolbar. Once you have started up the game, the old item will now look like your new mesh — including its variants.

    circle-info

    For a guide on how to edit an .mlsetup file (or to change an item's appearance in general), see .

    Enjoy!

    Custom bodyhair for NPCs

    hashtag
    Summary

    Created by @Pinkydude Published Summer 2021

    What you’ll need :

    • or the game files extracted [basegame_4_animation.archive]

    • The 010 hex editing software with the CP77 template as well as the scripts

    • The WolvenKIT console (CP77Tools)

    🟨 WON’T WORK With AMM’s naked/shirtless custom appearances

    I’ll assume you already know some basic modding (extracting the files with the console or WKit etc)

    You need to grab the mesh you’re going to use as a body / chest and swap on the NPC. I made edit to mine, but I used the “t0_000_ma_base__full” body

    Open the “buffer 0″ and check the files list, search for the skintone your NPC is using. Mitch is using the “male_01_ca_pale.mi” file

    You can see I have it custom pathed already, but you can check the other files to see the path

    Go to the “base\characters\common\skin\character_mat_instance\male\body” folder and grab the .mi file corresponding to your NPC’s skin tone

    Copy and Paste it in a custom folder created at the base of your mod

    Also create another folder where you will put the custom texture you want your NPC to use (edited or not)

    Let’s go back to our buffer 0 of our mesh

    custom path your skintone, in my case “male_01_ca_pale.mi”, to point to your custom folder. In my case “base\materialinstances\male_01_ca_pale.mi”

    Open that .mi file. That file point to another .mi file, that we also need to copy and paste in the custom folder, and then custom path

    It calls for another file, that we also have to copy and paste into the custom folder. That .mi file finally calls for the texture files! We custom path those as well

    Once you have the .mi files all custom pathed, and the texture custom pathed as well (don’t forget to save the edited files of course) you can custom path the one in the mesh buffer as well and save, then rebuild the mesh using the console (so that the edit in the buffer actually have an impact on the mesh!)

    Copy that mesh, and create the folders that goes to your NPC’s main outfit, and swap one of the slot. I used Mitch’s jacket to load the body mesh

    That specific body mesh will now read and load the .mi files and .xbm files from your custom folders in the mod and your NPC should now have a different texture than your V!

    Your own HUD icons

    hashtag
    Summary

    Created by Published July 15. 2023

    This guide is a subsection of the Weapons ArchiveXL guide and details the process of adding a HUD icon. The same principle applies for other parts of the UI.

    hashtag
    Adding custom player HUD icon

    To add custom HUD icon:

    1. Add base\gameplay\gui\widgets\ammo_counter\atlas_ammo_counter.inkatlas and base\gameplay\gui\widgets\ammo_counter\atlas_ammo_counter.xbm to your project.

    2. base\gameplay\gui\widgets\ammo_counter\atlas_ammo_counter.xbm as PNG and create a custom icon in chosen editing software. (You can refer to if you need further reference material).

    1. Edit the inkatlas file as in the .

    hashtag
    Editing the .yaml file

    Now that you have a custom preview icon, it's time to hook it up. You do this by editing the .yaml file.

    You'll find written instructions below the screenshot.

    hashtag
    The base record

    Add a HUDWeaponIcons entry at the root level of your .yaml (no indent). Give it a name, such as HUDWeaponIcons.TheFallout in the screenshot above.

    It has the following properties (indent level 1):

    Key
    Value
    Explanation

    hashtag
    Making the weapon use it

    Add a new property to the weapon that refers to the record you have created above:

    That's it! After starting the game,

    Textures: Importing, editing, exporting

    How to edit images and preserve transparency

    circle-check

    Rache Bartmoss once said: the first step to importing a texture is exporting a texture.

    circle-info

    For documentation on the Wolvenkit Import/Export tool, see herearrow-up-right.

    hashtag
    Exporting a texture

    1. Add the texture you want to overwrite to your Wolvenkit project.

      1. If necessary, move and rename it. You should stick to the game's naming convention.

    2. Find the Export Tool (Tools -> Export Tool) and export the texture.

    hashtag
    Editing a texture

    Editing textures is straightforward: just change them in your image editor of choice. The only hitch for reimport is the transparency.

    circle-info

    Wolvenkit supports the .dds file format, but since that is more complex, we won't talk about it here and stick to the .png format. If you're using .dds files, you probably know what you're doing anyway :)

    hashtag
    Paint.NET

    is a free image editing software for Windows. It supports PNG transparency out-of-the-box.

    hashtag
    Adobe Photoshop

    To export with transparency in Photoshop, you need an alpha channel. Fortunately, creating one is simple. (For the initiated: The alpha channel is just a layer mask over the entire image.)

    Find the Channels palette at the bottom right of your Workspace and add a new channel:

    Your image will turn black now, because the selected alpha channel will not have transparency yet.

    circle-info

    To get your image back, select "RGB" on the Channels palette — but we'll stay on the Alpha channel for now.

    In the layers palette, use your image as selection by ctrl+clicking on the layer's icon:

    With the alpha channel selected, fill your selection with white to mark the transparent parts.

    circle-info

    The fastest way to do that is to press d, x, delete

    You can now save your image as a PNG with transparency. If you have exported a texture in the first section, you should overwrite that file.

    hashtag
    Importing a texture

    • Find the Import Tool (Tools -> Import Tool) and select your texture.

    • If you have stuck to the game's naming convention, Wolvenkit will select the right preset for you. Otherwise, you need to select the right preset:

      • TexG_Generic_Color for a diffuse/albedo

    hashtag
    Troubleshooting

    hashtag
    My texture shows up completely black or completely white

    Change Compression to TCM_None, then reimport

    Custom Loading Screens

    hashtag
    Summary

    Created by @Pinkydude Published Summer 2021

    What you’ll need :

    • or the extracted game files

    • Photoshop / Art program

    I’ll assume you already know some basic modding (extracting the files with the console or WKit etc)

    First of you’ll need to create your mod folder, it should look like this

    This is where the Loading screen image are stocked, so go in that exact same folder in your Game Extracts!

    Depending on the resolution you’re using, you’ll have to edit either the 4k files or the 4k_1080p files

    I personally need the 4k files ; There is 13 loading screens in total, and you’ll need the .tga .dds and .xbm files for each one, meaning 39 files in total in your mod folder

    Now open Photoshop, and edit the .tga files with your screenshots!

    You’ll notice that the loading pics are vertically swapped; be sure to also vertically swap your pics so that it’ll look normal in game

    Once you’re done editing all 13 .tga files, you save them

    We now open Noesis, and navigate to our mod folder

    You’ll need to Right Click on your .tga files and select Export, and change the Main Output Type to .xbm

    Click export, you should see a pop up window; simply click OK

    Once you’re done exporting all your 13 .tga files to .xbm, you can delete the .tga files from the mod folder (or keep them somewhere else! remember to put them back in the mod folder to export them if you do want to edit them later)

    You should now have 52 files - the originals and your exported .xbm with “out” at the end of the name. Delete the originals and rename your exported .xbm to take out the “out” !

    Then you’re left with 26 files, it should look like that :

    We now open CP77 Tools / Wolvenkit Console ! We need to rebuild the .xbm files

    cp77tools import -p [PATH] –keep

    Pack your mod and test it!

    Archived: Custom poses for spawned NPCs

    hashtag
    Summary

    Created by @Pinkydude Published Summer 2021

    triangle-exclamation

    As with AMM 2.0, this guide is rather obsolete, but will be kept archived!

    What you’ll need :

    • (or any other mods that spawn characters)

    • or the game files extracted [basegame_4_animation.archive]

    • The 010 hex editing software with the CP77 template as well as the scripts

    I’ll assume you already know some basic modding (extracting the files with the console or WKit etc)

    It’s important to also know that some characters have their own locomotion files (meaning unique pathing etc) Like Panam, Goro etc

    I won’t go over every single ones here!

    For this tutorial, I’ll make an animation for Mitch, who uses the Man Average Civilian Locomotion (MAC)

    The MAC locomotion [man_average_civilian_locomotion.anims] is located here [base\animations\npc\generic_characters\male_average\locomotion]

    This will be the path of your mod!

    To grab an animation, you’ll have to go into the Animations folder, there you’ll see multiple other folders- the [main_quests] and [side_quests] have unique animations not used by any other characters outside of that that specific quest!

    For example, q103 is Ghost Town, the start of Panam’s quest line

    I’ll use the animation of Mitch hugging Panam when we meet them at the camp!

    Once you find the animation you wish to use, simply copy and paste it in your last folder in your mod project, the [locomotion] folder, and rename the .anims file with the character’s locomotion file’s name, in Mitch’s case its [man_average_civilian_locomotion]

    Once pasted and renamed, you can now open the .anims file in 010!

    A lot of .anims file actually have multiple animation inside of it to choose from, simply open the [struct DATA] handle to expand the list. Since mine is an unique animation, there’s only one [animAnimation]

    I’ll now click on the [CNAMES] handle and use the PASTE script

    (I recommend setting a shortkey, you’ll use it a lot for custom poses among other things!)

    A window should pop up asking for an input : Here, type [idle_stand]

    (this is the name of the idle animation the NPCs use when spawned!)

    This will add a new CNAME to the list. Now, go back into [struct DATA] and open up the [animAnimation] you wish to grab!

    The new CNAME we added will automatically be the last one in the list, not wasting time by checking what number it has, I simply put a really large number to be sure to grab the last name in the list!

    Click on the OG name and simply put 500 with the numpad to change the CNAME to [idle_stand]

    Save your file and pack your mod! You’re done!

    Load a save file, spawn any character using the MAC locomotion and VOILA 💛

    Custom in-game icons

    Creating a custom inkatlas

    hashtag
    Preview images

    Okay, now you've added something! But it doesn't have a preview icon yet - you'll have to add this manually. For this purpose, you'll have to edit an image.

    circle-exclamation

    For a guide how to ensure image transparency, see .

    Cyberpunk uses xbm as format for its textures. These textures are then mapped (divided into slices) by inkatlas files. The individual slots can then be used by the game for pretty much everything from UI elements to phone call icons — and image previews.

    circle-info

    If you want to use the in-game previews, you can find them under base\gameplay\gui\common\icons\items

    hashtag
    Setting up the files

    First of all, the template archive (kindly provided by Apart). This includes the following files:

    Template
    Size of slot image

    This guide assumes that you have a bunch of ready-made icons lying around - if you don't and have no idea where to start, you can check , section "Making the icon".

    Select 40_items_inkatlas_template and copy the .inkatlas and the .xbm to a folder of your choice inside your Wolvenkit project( this guide will be using tutorial\ops).

    I'm renaming both of them to preview_icons so that future me won't be confused about this:

    1. Export preview_icons.xbm via the Export tool — we'll overwrite the resulting file to reimport it.

    2. Open 40_item_template.pdn in and put all your icons in.

    1. Import the file. Make sure that IsGamma is turned off, everything else should already be OK:

    You can now open preview_images.xbm in Wolvenkit and see your new, edited items.

    Photo Mode / AMM: Other Facial Expressions

    Guide to change expressions for photo mode and AMM

    hashtag
    Summary

    Created by @manavortex Published ??? Updated: 15. 09. 2023

    This tutorial will teach you how to replace the default Photo mode or AMM expressions with those from an NPC.

    Difficulty: You need to be able to read. If you run into trouble anyway, please hit us up on Discord so that we can improve this guide!

    Textures: Custom MultilayerMask

    How to make a custom MultilayerMask for your mesh

    hashtag
    Summary

    Created by @manavortex Published April 12 2023

    This tutorial will teach you how to create your own MultilayerMask for an item and then assign an own MultilayerSetup to it.

    Difficulty: You know how to read.

    Moving and renaming in existing projects

    How to avoid changing every single depotPath in your mod by hand

    hashtag
    TL;DR:

    Check the following steps:

    Adding new items: files from scratch

    How to set up the folder structure from scratch

    hashtag
    Summary

    Created by @manavortex Updated June 10 2023

    This page is a part of the guide and deals with finding the correct files for .

    external: NPVs (V as NPC) - custom NPCs

    A subpage dedicated to custom NPCs

    This page is dedicated to the process of creating custom NPCs via community guides and -resources.

    circle-info

    For the wiki version of this guide, see .

    hashtag

    Throwing weapons: projectiles

    How to make a custom projectiles for throwing weapons

    This page is a sub-page of and tells you how to create a custom projectile for a throwing weapon.

    To create a custom throwing weapon, check the parent guide and use knife as a base type.

    circle-check

    Everything after the yaml works like adding regular items with a root entity, an appearance file and a mesh. We won't be using a mesh entity here.

    UIIcon.clothing_ENTITYNAME_APPEARANCENAME_SUFFIXES_VISUALTAGS
    Items.my_custom_shirt_redwhite:
      $base: Items.GenericInnerChestClothing
      entityName: my_custom_shirt_factory_name
      appearanceName: appearance_root_entity_white_red
      appearanceSuffixes: [ itemsFactoryAppearanceSuffix.Gender ]
    UIIcon.clothing_my_custom_shirt_factory_name_appearance_root_entity_white_red_Female_:
        $type: UIIcon
        atlasResourcePath: tutorial\torso\my_custom_shirt\ops\preview_icons_pwa.inkatlas
        atlasPartName: slot_01
        
    UIIcon.clothing_my_custom_shirt_factory_name_appearance_root_entity_white_red_Male_:
        $type: UIIcon
        atlasResourcePath: tutorial\torso\my_custom_shirt\ops\preview_icons_pma.inkatlas
        atlasPartName: slot_01

    You can now find a png file in your project's raw folder.

  • TexG_Generic_Normal for a normal map

  • TexG_Generic_UI for anything that you want to use in .inkatlas files

  • … etc

  • If your texture is upside-down, uncheck the box for VFlip.

  • Click the "import" button. Your .png will now be imported Into the .xbm file.

  • Paint.NETarrow-up-right
    Use 32-Bit to get the highest available image quality.
    You now have an alpha channel.
    Layer to selection

    The WolvenKIT console (CP77Tools)

    AMMarrow-up-right
    WolvenKITarrow-up-right
    (I recommend joining the CP77 Modding server to grab those!)arrow-up-right
    WolvenKITarrow-up-right
    (I recommend joining the CP77 Modding server to grab those!)arrow-up-right
    Noesisarrow-up-right
    WolvenKitarrow-up-right
    hashtag
    Step 1: the yaml

    Add the following lines to your yaml:

    hashtag
    Step 2: the entity

    You can find all projectile entities in base\gameplay\projectiles\knife.

    circle-info

    base\gameplay\projectiles\knife\tanto_projectile.ent is a root entity with associated .app file, while base\gameplay\projectiles\knife\knife_projectile.ent is a mesh entity with the component directly included.

    Create a copy of the entity that you want, then connect it in your factory.

    hashtag
    Step 3: The factory

    Finally, hook everything up by registering the appearanceResourceName from your .yaml file in your factory.csv. As a reminder, this is the line we're talking about:

    Make sure that the corresponding entry points at your projectile's entity file from step 3.

    hashtag
    Step 4: The right mesh

    In your entity or the linked .app file, make sure that you change all paths to the right mesh. (The mesh path is contained in resolvedDependencies and inplaceResources as well. TODO: Check if this is really necessary, then update the guide or tell mana, who couldn't be arsed to check herself)

    hashtag
    Step 5: Test

    If you did everything correctly, you should now have a custom projectile for thrown weapons.

    Adding Weapons
    KnifeAttacks.MyKnifeThrowAttackProjectile:
      $type: Attack_Projectile
      projectileTemplateName: my_knife_projectile
    
    Items.my_knife:
      $base: Items.Preset_Knife_Default
      appearanceResourceName: my_knife_appfile
      projectileTemplateName: my_knife_projectile
      attacks: [!append KnifeAttacks.MyKnifeThrowAttackProjectile]
    Items.my_knife:
      appearanceResourceName: my_knife_appfile
  • Rename the new mesh to replace the old mesh (e.g. "t2_135_wa_jacket__monk_shirt.mesh" -> "t2_084_pwa__short_sleeves.mesh")

  • Open both meshes in WolvenKit by double-clicking them in the Project Explorer — we will now transfer the appearance names to enable variants.

  • the old mesh

    base\characters\garment\player_equipment\torso\t2_084_jacket__short_sleeves\t2_084_pwa__short_sleeves.mesh

    the new mesh

    base\characters\garment\gang_monk\torso\t2_135_jacket__monk_shirt\t2_135_wa_jacket__monk_shirt.mesh

    Finding an item's spawn code and mesh
    Editing mesh appearances
    here
    Spawn Codes (BaseIDs/Hashes)
    here
    this page
    here
    See Step 2 for more intel on this

    Import your PNG over the xbm with those settings:

    atlasPartName

    slot_02

    name of the icon's slot in the inkatlas. If you don't know it, see .

    $type

    gamedataUIIcon_Record

    This tells the game that it's a UI icon

    atlasResourcePath

    path/to/your/file.inkatlas

    relative path to your inkatlas file (right-click it in Wolvenkit and select "Copy relative path")

    hudIcon

    HUDWeaponIcons.TheFallout

    Export
    creating custom inventory icons
    icon creation guide
    Custom HUD created for the rebar club.
    HUD Icon import settings.
    Once you're done, hide the background layer and overwrite the file you've created in Step 1:

    5_outfits

    160x320 (x5)

    5_weapons

    360x120 (x5)

    40_items_inkatlas_template

    160x160 (x40)

    here
    downloadarrow-up-right
    thisarrow-up-right
    linkarrow-up-right
    paint.netarrow-up-right

    hashtag
    Step 1: Locate the right file

    hashtag
    Photo Mode

    female rig

    male rig

    hashtag
    AMM

    Both genders will use

    base\animations\facial\male_average\interactive_scene\generic_average_male_facial_idle.anims

    circle-info

    This will be called the target file in the rest of this guide

    hashtag
    Step 2: Replace the target file with the one you want

    NPC animation files have the extension .anims and reside in the folder base\animations\facial. You can find the ones for facial expressions by searching in WolvenKit for

    Find the file that you want to use and copy it over the original file.

    circle-info

    Although the file names are gendered, you can pick any of them.

    If you aren't sure which file you want to use, check the references.

    👉 If you are missing reference screenshots, feel free to create and upload them. The existing ones have been created the hard way.

    hashtag
    Step 3: Pick the expressions you want

    Photo mode uses a total of 12 expressions by looking for animation names in the target file. You need to connect the selection picker with the NPC file you just copied.

    circle-check

    Find their names here.

    Important: AMM and photo mode use different keys. Just make sure to pick the right table, and everything will be fine.

    Do this by opening the target file (which you replaced with the NPC of your choice) in WolvenKit.

    Find the animation you want to use and change its name:

    Replace the original name with one from the . If you don't know which ones you want to use, check out the .

    Rinse and repeat the process until you're done.

    circle-check

    Save the file, pack the project, and start the game - voila, you now have custom expressions.

    hashtag
    References

    circle-info

    You can find a list of screenshots with facial expression references here.

    hashtag
    Troubleshooting

    hashtag
    My expressions don't work at all!

    Make sure that you have replaced the correct file, and that your mod has been correctly packed and installed.

    hashtag
    Some of my expressions aren't working!

    The game will look for the animation by exact name. AMM is using a different list than photo mode — make sure that you are using the right keys.

    hashtag
    It's showing expressions, but not the one I picked!

    Check your target file: you have used a key twice.

    If the game is looking for the neutral expression, it will stop looking as soon as it finds an animation with the name of facial_neutral. If you have multiple of those, it won't care.

    circle-info

    To find out what an MLMask does, see here. To learn about MLSetups, see here.

    hashtag
    Export the MultilayerMask

    Start by adding any .mlmask file to your WKit project. It doesn't matter which one, but you can start with this (6 white layers):

    Then, export it via the Export Tool.

    This will give you the following file structure:

    hashtag
    Blender: Painting the MLMask

    1. Add the mesh that's supposed to hold your material to your project and export it.

    2. Import it into Blender and select the Texture Paint perspective.

    3. Switch into Edit Mode

    4. Select those parts of the mesh that you want to color.

    5. Duplicate them (Ctrl +D, ESC) and split off a new submesh (P -> Split Selection).

    6. Switch back into Object Mode.

    7. Select the new submesh; hide the old one.

    8. Create a new image. It can be 512x512 for now; only upscale if you find that you can't get it un-pixelated in-game. Most CDPR layer masks are really low resolution!

    9. Switch the right viewport into "Texture Paint"

    10. Find the "Texture Slots" dropdown in the menu (you may have to scroll)

    11. Set Mode to Single Image

    12. Select your new black image from the list below.

    1. In either of the panels, set your brush foreground color to white (or gray). This determines the transparency of the layer. I recommend that you use white and regulate transparency via mlsetup, but if you want to paint e.g. clothing folds or wear&tear, you might want to paint greyscale.

    2. Optional: Set these properties under "Options":

    1. Paint!

    1. Rinse and repeat until all parts of your mesh that should have your material are white on the left-hand image.

    2. Now for the annoying part: On the right side, make sure the mask is more or less smooth, as you will see this in-game.

    Now, save the image: overwrite one of the layers from the mlmask that you have exported. If you run out of layers, you can just add them at the end.

    triangle-exclamation

    The game assumes that layer 1 is white, so start exporting over layers >0

    Do this as often as necessary.

    hashtag
    Import the MultilayerMask

    Once you're done, open the masklisk and make sure that you have exactly as many entries as you have images in your folder (adding or deleting them as needed). Then, in Wolvenkit, import the masklist via Import Tool.

    triangle-exclamation

    All images in the multilayer mask need to have the same resolution. Otherwise, it will crash your game.

    You can now assign your new Masklisk to your mesh and use it together with custom MultilayerSetups.

    before => after

    Changing the file paths

  • Importing back

  • hashtag
    Exporting the files to JSON

    1. In Wolvenkit, save all your open tabs and close them. You don't want any files to be open in Wolvenkit for what comes next.

    2. Move and rename your files and folders, e.g. tutorial\myshirt to your_modder_name\my_tshirt. (If Wolvenkit doesn't let you, you can use the Windows Explorer.)

    circle-exclamation

    Make sure that you stick to lower case letters and use _ instead of spaces!

    Good: your_modder_name\my_tshirt Bad: yourModderName\myShirt Horrible: your modder name\My Shirt

    1. In Wolvenkit, right-click on the top level folder under archive and select "Convert to JSON"

    hashtag
    Changing the file paths

    We will use Notepad++arrow-up-right to adjust the file paths in all files in your project. For that, we need to find and replace the following entries. If you aren't sure about that, see the next section.

    What kind of file:
    Find What (your old path)
    Replace with (your new path)

    Inside the .archive (with double slashes)

    tutorial\\myshirt

    your_modder_name\\my_tshirt

    in resource files (e.g. .xl)

    tutorial\myshirt

    circle-info

    If you already know what to do, you can skip forward to Importing Back.

    hashtag
    Preparation: what do I replace again?

    1. Switch Wolvenkit's project browser to raw, then open one of the created .json files in Notepad++.

    2. Use "Search: Find in Files..." (Ctrl+Shift+F)

    3. In Find What, enter the name of your old folder (e.g. tutorial)

    4. Click Find All - that will give you all the entries you have to replace.

    circle-exclamation

    Make sure that you are using the same kind of slashes. If the old path has double backslashes, the new path must have them as well.

    hashtag
    We goin' in

    You know what to replace now. For every type of entry, do the following:

    1. Use "Search: Find in Files..." (Ctrl+Shift+F)

      1. Check the Follow Current Doc. checkbox.

      2. Click into the Directory field. It now has the path to the file you've just opened

      3. Cut off the subdirectories: you'll want to search and replace directly under source

      4. For Find what put the name of your old folder that you copied in step 6

      5. For Replace with put the name of your new folder. Make sure that you have double backslashes!

      6. Click on Replace in Files

    hashtag
    Importing back

    Now that we have changed the paths, we need to get those changes back into our Wolvenkit project. In the project's raw view, right-click on the toplevel folder and select "Import from JSON" (however it is named, there's just one item that will let you import your json files)

    hashtag
    Deleting leftover files

    If you have packed any tutorial projects before renaming files or folders, make sure to delete leftover files from your Cyberpunk 2077 directory. It's easiest to search the root folder for tutorial and delete everything that looks like your old stuff — if it's from your project, the next install will put it back.

    That's it! Have fun!

    Exporting the files to JSON

    For an explanation of the file structure, see the corresponding wiki page.

  • If you want to add an atelier store, see Your own Atelier Store.

  • If you want to add preview items, check this guide.

  • circle-info

    TL;DR: If you can't be arsed doing this by yourself, find a template project with one working item (female rigged) herearrow-up-right.

    hashtag
    Overview:

    File in modded dir
    was originally copied from

    rootentity.ent

    base\gameplay\items\equipment\underwear\player_underwear_item.ent

    appearance.app

    base\gameplay\items\equipment\underwear\appearances\player_underwear_item_appearances.app

    mesh_entity.ent ⚠ Check the red hint box ⚠

    base\characters\garment\player_equipment\torso\t1_080_pwa_tank__judy.ent

    triangle-exclamation

    For mesh_entity.ent, your entity file needs to correspond to your item's body part. If you put a shirt in an entity file for shoes, it will deform badly once you put it on.

    If you rename your components, we recommend using CDPR's naming prefixes for reasons of garmentSupport. You dont need to understand how this works, just name your component like l1_myCustomPants instead of myCustomPants and call it a day.

    For further details, check .

    circle-check

    It is good practice to keep local copies of everything that you change (=> custompathing) instead of overwriting files under base. This makes sure that no other mods will overwrite your changes.

    ℹ Only keep files under base if you are okay with them being overwritten!

    hashtag
    Optional, but very recommended: Clean out obsolete entries

    1. Open the file translation_strings.json in WolvenKit. Expand the array root and then the array entries. Delete all entries but one.

    2. Open the file my_shirt_factory.csv in WolvenKit. In compiledData, delete all entries but one. In data, delete everything - these will get autogenerated.

    3. Open the file root_entity.ent.

      Expand the list appearances. Delete all entries but the first (most likely default).

    4. Open the file my_custom_shirt.app. Expand the list appearances. Delete all entries but default.

    5. Open the file mesh_entity.ent Select resolvedDependencies and delete all the entries. (We don't need Judy's top anymore.)

    6. Make a back-up copy of your t1_custom_shirt.mesh, then open it.

      1. Expand the first appearances at the top of the file. Open the appearance default and check which material is linked in the chunkMaterials array.

    circle-check

    Now is a good time for a backup.

    Adding new items
    an ArchiveXL item addition
    Guides

    How to (Google Docs) - resources on - utility script for glb shapekeys on

    How to manually swap V over an NPC, by NoraLee (Google Docs/Drive)

    WolvenKit: (Google Docs) Contains a section on

    How to implement part 4+ of NoraLee's guide in WolvenKit (by nx#3390)

    How to via Tweak XL

    how to add custom behaviour, equipment, and translation strings (by xbaebsae)

    YouTube video by Vesna [CyberVesna/Vesn4_]

    hashtag
    Resources and Utilities

    Website: NoraLee's

    A (WIP) mapping between the character creator and appearance keys in the app/ent files

    Blender:

    Set up for use with NoraLee's glb files (needs adjusting otherwise)

    hashtag
    Other relevant guides on this wiki

    • How to find items in the game files

    • Changing NPC appearances: How to swap out components in an .app file

    hashtag
    Other information

    The base head that's used for NPV can be found under

    To export a head mesh with shape keys, you have to export the corresponding .morphtarget, e.g.

    As these are not named in a human-readable way, you'll want to apply them via Blender scriptarrow-up-right.

    here

    A new head for V

    How to change V's head

    hashtag
    Summary

    Created by @manavortex Published September 30 2023

    circle-check

    This guide is a rough draft. Unlike my other guides, it has not been excessively tested, so you might run into issues. In this case, feel free to hit up #mod-dev-chat on the , or and improve it!

    circle-info

    If you want to edit other files for V, you may be able to find their paths in or one of the surrounding pages.

    hashtag
    Step 0: Prerequisites

    • You have

    • You have downloaded from Nexus, as you will need the .blend file from there

    hashtag
    Step 1: Preparing the files

    circle-info

    We will do the same thing here as in the guide, just that our files will be in a different path. This section will tell you which files to add and where to put the .blend file; for detailed instructions, see the other guide.

    1. Look up on -> where to find the files you need.

    2. Add all the files with the corresponding extension to your Wolvenkit project.

    3. Export them all via Wolvenkit Export Tool (see )

    1. Copy it to h0_000_pwa_c__basehead in your Wolvenkit project's raw folder

    These steps will become obsolete after the 2.0 update of the NPV example files, but aren't obsolete yet.

    1. Open the .blend file in Blender. You should now see the script 00_import_files.py

    2. Replate its content with the code from the collapsible box below:

    chevron-rightThe codehashtag

    You're good to go and can proceed to step 2.

    hashtag
    Step 2: Getting the head shape right

    circle-info

    If you don't want to apply any shapekeys, you can set their values to 1

    1. Follow the until the shapekeys are applied.

    2. Apply custom edits if you want - see or for tips

    3. Go back to the NPV guide and follow the steps until you have run the export script - this will write the .mesh files

    hashtag
    Step 3: Testing

    If everything has worked, you should now have a broken character creator and a not-broken head. Otherwise, the right place to ask for help is #mod-dev-chat on the .

    Happy modding!

    NPV - V as custom NPC

    How to create your V as an NPC

    Created by @manavortex Published May 13 2023

    This guide will show you how to do the following things:

    • Setting up a Wolvenkit project with the prepared example files

    • Creating your V's head in Blender (has its own sub-page)

    • Adding them as an NPC to spawn them with AppearanceMenuMod (has its own sub-page)

    hashtag
    Difficulty:

    Easy, but not trivial: you don't need any prior knowledge, but the process is complex, and if you miss steps or deviate from the instructions, things will end up not working for you.

    circle-check

    If you run into issues with this guide, the right place to ask for help is #mod-dev-chat on the .

    This guide uses the following versions:

    • Cyberpunk 2077 game version >= 1.6

    • Wolvenkit:

      • for game versions < 2.0, use

    circle-info

    This tutorial should cover your basic needs, but there are many more guides and resources about NPV creation outside of this wiki. You can find them .

    If you want to edit original V's files, you're (generally) in the right place. You can find extra information on .

    circle-exclamation

    None of this would have been possible without NoraLee, who pioneered the process and taught me everything that I needed to know to set up these tools. This guide doesn't use any of their resources, but a lot of their knowledge. For the full guide with all edge-cases, bells, whistles and context, see their .

    This is the speedrun version. If you want extra details and context, please check Nora's Google Doc.

    hashtag
    Preparation

    I have prepared an example project () for you again, but due to the complexity of V's head mesh, you have to do a little bit of prep work here.

    Don't worry, I'll walk you through it step by step.

    circle-check

    At any time during the guide, you can install the Wolvenkit project (Wolvenkit has a button in the toolbar) and spawn Tutorial Man and Tutorial Woman via AMM to check out your progress.

    hashtag
    The character preset

    To create a face, we need to know the following numeric values from the character creator:

    • Eyes

    • Eyebrows

    • Nose

    Find the mirror in V's apartment and note them down.

    hashtag
    Setting up the files

    circle-info

    Body gender:

    As a rule of thumb, I'll document the process for an NPV with a female body gender, because as we all know, the other doesn't exist I have one of those. In doubt, double-check paths.

    1. Download the example project of files from and load up your Wolvenkits

    2. In Windows Explorer, find the prepared folders per body gender:

    body gender
    file path
    1. Delete the one you're not using (do one project per NPC. No, really, I mean it.)

    Now it's time to do the actual work.

    • If you want to create your V's head for Cyberpunk, read on

    • If you already have a head mesh and just want to set up the file structure, read on

    triangle-exclamation

    Please remember that before sharing your NPV, you have to change the paths! At the very least, rename the tutorial folders inside of archive and resources to your user name and then do a .

    However, you might want to do that after , as you would otherwise have to move the utility script around.

    circle-check

    At any time during the guide, you can install the Wolvenkit project (Wolvenkit has a button in the toolbar) and spawn Tutorial Man and Tutorial Woman via AMM to check out your progress.

    Advanced: Reverse-Engineered LUT pipeline

    An investigation and documentation of several methods of advanced LUT workflows.

    circle-info

    This is a complex document meant for experts. Made hastily to finally get the method out there and let others experiment with it. Will be expanded as time goes on.

    hashtag
    Understanding CDPR's rendering pipeline

    Your own Atelier Store

    How to set up an atelier store for your mod

    This guide will detail how to add an Atelier store with your items. It is part of the ArchiveXL tutorial, but you can complete these steps independently.

    circle-exclamation

    You need to install the mod for this.

    You also have to add it to your mod's requirements, as atelier stores will cause script errors if users don't have it installed.

    Editing LUTs

    Here we will go over one of the first steps to visual modding, editing LUTs!

    circle-exclamation

    This article is severely out of date. Please tread lightly.

    hashtag
    What is a LUT?

    YourWolvenkitProject
      source
        archive
          tutorial  
    	ops		   
          	  - preview_icons.inkatlas  
          	  - preview_icons.xbm      
    <yourModDirectory>\raw\tutorial\ops\preview_icons.png
    base\animations\facial\ *.anims
    Example:
    
    To put Rogue's facial expressions on a male V, you copy
    base\animations\facial\main_characters\rogue\rogue_facial_idle_poses.anims
    over the target file at 
    base\animations\ui\photomode\photomode_male_facial.anims
    
    To use her expressions in AMM, overwrite
    base\animations\facial\male_average\interactive_scene\generic_average_male_facial_idle.anims
    base\characters\cyberware\player\a0_005__strongarms\entities\meshes\textures\white.mlmask
    - name_of_your_mlmask_file.masklist    // file containing a list with relative paths to the images
    - name_of_your_mlmask_file_layers      // folder containing the images 
      - name_of_your_mlmask_file_0.png
      - name_of_your_mlmask_file_1.png
      - name_of_your_mlmask_file_2.png
      - name_of_your_mlmask_file_3.png
      - name_of_your_mlmask_file_4.png
      - name_of_your_mlmask_file_5.png
    base\characters\head\player_base_heads\player_female_average\h0_000_pwa_c__basehead\
    base\characters\head\player_base_heads\player_male_average\h0_000_pma_c__basehead\
    base\characters\head\player_base_heads\player_female_average\h0_000_pwa__morphs.morphtarget

    my_mesh.mesh

    base\characters\garment\gang_monk\torso\t2_135_jacket__monk_shirt\t2_135_wa_jacket__monk_shirt.mesh

    my_tshirt_factory.csv

    base\gameplay\factories\items\clothing.csv

    translation_strings.json

    base\localization\en-us\onscreens\onscreens.json

    preview_icons.inkatlas

    base\gameplay\gui\common\icons\items\item_icons6.inkatlas

    preview_icons.xbm

    base\gameplay\gui\common\icons\items\item_icons6.xbm

    tutorial_my_custom_tshirt.archive.xl

    Wolvenkit -> New File -> ArchiveXL

    tutorial_my_custom_tshirt.yaml

    Wolvenkit -> New File -> TweakXL

    here
    create an NPVarrow-up-right
    Google Drivearrow-up-right
    gistarrow-up-right
    Create an NPVarrow-up-right
    facial animationsarrow-up-right
    customize an NPVarrow-up-right
    Adding/editing appearances to Custom NPV/NPC on the custom framework in WolvenKitarrow-up-right
    NPV pickerarrow-up-right
    Python script to apply shapekeysarrow-up-right

    your_modder_name\my_tshirt

    in script files (e.g. reds)

    tutorial/myshirt

    your_modder_name/my_tshirt

    What are suffixes?
    here
    MxOrcBoi

    In the NPV example files that you downloaded, find the following file:

    You need to export the .morphtargets as well. Check the linked section on the Morphtargetspage for how to do that.

  • Do that with each armature in the .blend file, overwriting the .morphtarget.glb files in the morphtargets directory.

  • Import the files back into Wolvenkit (see the NPV guide and the morphtargets page as for how)

  • redmodding Discord serverarrow-up-right
    sign uparrow-up-right
    Cheat Sheet: Body
    the NPV example filesarrow-up-right
    NPV: Preparing the head in Blender
    Cheat Sheet: Head
    NPV guide
    here
    here
    redmodding Discord serverarrow-up-right

    for game versions >= 2.0 / Phantom Liberty, use >= 8.11 (Link to Nightlyarrow-up-right)

  • Blenderarrow-up-right 3.6 (anything >= 3.4 should work. If it doesn't, try updating, though.)

  • AppearanceMenuModarrow-up-right >= 2.1

  • Mouth
  • Jaw

  • Ears

  • female

    tutorial\npv\your_female_character

    male

    tutorial\npv\your_male_character

    redmodding Discord serverarrow-up-right
    8.10.0arrow-up-right
    herearrow-up-right
    A new head for V
    Google Drivearrow-up-right
    Nexusarrow-up-right
    Nexusarrow-up-right
    here
    here
    fulltext search and replace in json
    preparing the head in Blender
    You'll be editing these two
    hashtag
    Lighting

    Lighting in REDengine is complex. Since the conception of it, REDengine has been using a probe-based global illumination system, which requires a single bake of lighting for all times of day. This method is inferior to baked RT, but is suitable for systems with dynamic time of day and weather.

    However, this method has its limitation, several, and we see them being corrected with the initial implementation of fullly dynamic semi-global illumination in the form of Psycho RT. Differing from other quality levels, Psycho implements a pseudo-global illumination tech, instead of other RT levels simply tracing lighting for global light sources, such as the sun and the moon.

    After patch 1.62, and after the creation of ReSTIR GI, we see now that CDPR has implemented a fully-realized RT pipeline. Each step of the way is handled by rays rather than normal approximations.

    The benefits, other than the obvious ability for fully realized global illumination and direct illumination, are numerous. Each light can now cast shadows, use material parameters for nearly-perfect subsurface scattering, ideal light blending and intensity.

    I will go further into detail on the new possibilities with PT in another entry, today, we will focus on...

    hashtag
    Color

    Recently, I have been working on recreating a cinema-accurate and professional-quality workflow for color grading in Cyberpunk, and generally, trying to retrace the steps CDPR took to get such a unique, albeit, polarizing look to Cyberpunk.

    hashtag
    A history lesson

    Before 2020, while the game was in heavy development, CDPR used a different, more parametrizable method for handling HDR assets and lighting. They would simply running through a TMO (tone mapping operator) to get back to 8-bit range and afterwards apply color grading.

    This, while convenient, did make handling HDR display quite difficult. How could you apply a color grade made for SDR on top of HDR without losing precision or missing data? This required a full restructuring of the method.

    Eventually, CDPR landed on the method I have been able to reproduce. They used a normal, neutral LUT texture and ran it through ACES (Academy Color Encoding System) transforms to go to a neutral color space, ACES AP1. I do not know the gamma they used (could be ACEScct or ACEScc, maybe even the linear ACEScg), but I do know that eventually, the HDR data was ran through the RRT (Reference Rendering Transform) as a tone mapper, then through the ODT to go to either HDR or SDR.

    Unfortunately, I have not been able to single out a method to generate HDR LUTs from scratch, however, I have been able to create a workflow to create tone mapped LUTs for SDR.

    hashtag
    Tools used/required

    • DaVinci Resolve Does not matter if it is studio, but studio will be required for the eventual HDR workflow.

    • Photoshop

    • WolvenKit

    • NVTT Exporter and the respective Photoshop plugin. Can be found on NVIDIA developer, does require an account to download.

    hashtag
    Intermission: Troubleshooting DaVinci

    Right here is where I almost gave up.

    DaVinci refused to open. I tried all I could, searched the internet, tried every damn solution. Nothing worked.

    BUT, looking at the log files, I was able to deduce the culprit.

    SyManager.DeckLink failed to respond due to some USB issue, I even looked that up and well, no dice.

    Eventually, I came to think that it may be an issue with the control panels utility for Resolve, as Blackmagic sells some cool decks and accessories for colorists to work faster. But, I'm not rich enough for those, so, I figured, why not just uninstall the entire framework for them.

    Boom, DaVinci opened right after.

    hashtag
    Setting up your project

    Some of you who are more familiar with DaVinci may be already going ahead and setting up ACES in the DaVinci color settings, changing and messing with color science and management, etc. Stop. We're gonna be using nodes.

    Below are 2 sample pictures captured with the method, we will be getting a grasp with non-destructive color grading this way.

    Insert these pictures into your timeline and head into the Color tab. Then, select your clips and add them to a group, the group name doesn't really matter. We'll only be doing this to use pre-clips and post-clips.

    Head into the pre-clip level and apply an ACES transform node. Set your input transform to SRGB and output transform to ACEScct (ACEScct behaves better than ACEScc at times, use your preference) and don't forget to turn on the reference gamut compress.

    Afterwards, go to the post-clip level and add another ACES transform node. Now set your input transform to ACEScct (or ACEScc) and set the output transform to SRGB.

    Your clip level now has full range and fidelity. You can color grade to your heart's content in the clip level, but I won't be going into detail in how to do this. Or you could proceed onwards, if you do so, then ignore anything about importing your color graded LUT.

    So, how do we put your grade into the game? Glad you asked. After you're done grading, turn off everything but your effects in the clip level. Generate a LUT from here. It doesn't matter if the image you see doesn't match up with the one you graded with, we'll be correcting for it further on when we generate the LUT.

    hashtag
    Generating a finished CUBE LUT

    A LUT texture from the ReShade project. This will be useful when we output our grade to the game.

    It's now good to mention that Cyberpunk outputs data with an ARRI LogC3 encoding, but SRGB color space. ACES, on the other hand, expects ARRI LogC3 encoding but ARRI Wide Gamut 3 color space as well. At the end, Cyberpunk expects SRGB data with SRGB gamma too, so you need a TMO to handle this conversion from HDR data encoded in a Log curve to fit in SDR range, but decoded and then put into the display gamut and dynamic range.

    ACES is apt for the job.

    Take the LUT texture above and add it to your timeline as well, and assign it to another group.

    Go to the pre-clip level for your LUT clip and add a Color Space Transform node. Specify the input color space and gamma as SRGB, but output color space as ARRI Wide Gamut and output gamma of SRGB as well.

    Subsequently after the CST (Color Space Transform) add your IDT (Input Device Transform) using an ACES transform node. Set the input transform to ARRI LogC3 with an exposure index of 800 and output transform of ACEScct (or ACEScc depending on what your color grade was made in/for). Make sure you enable color gamut compression, or else you will get horrible clipping in higher exposures.

    At the post-clip level, add your ODT (Output Device Transform). Set your input transform to ACEScct/cc and output transform to SRGB. Once again, turn on reference gamut compress.

    Now, in your clip level, add a corrector node and then drag your generated color grading CUBE LUT atop the corrector node (skip this if you didn't grade)

    Once you have done all of this, right click and select "Generate LUT" and export a CUBE.

    hashtag
    Creating the LUT texture

    Congrats! You have now reached the homestretch in the reverse-engineered LUT workflow. This part could be confusing for some, but it's easy enough if you're familiar with visual modding or handling XBM textures on a very high level.

    Once your CUBE is done exporting, open the lut.png file you downloaded before in Photoshop. Here, you need to add a "Color Lookup" layer. Select the 3D LUT file to be your generated LUT from when you finished the CUBE LUT in the last step. Once it is applied, apply a channel mixer correction layer and flip the blue and green channels.

    After this is done, export using the NVIDIA Texture Tools plugin as a 32x4f DDS with no mipmaps as well as highest quality compression.

    Once you are done, put the texture into WolvenKit and import using these settings:

    Afterwards, set the depth, height, and with properties to 32, then go to renderTextureResource -> renderResourceBlobPC -> header -> sizeInfo and set all of the properties there to 32 also. Don't forget to change the texture type to 3D in textureInfo!

    There it is. Your tonemapped LUT from scratch.

    hashtag
    Footnotes

    1. This initial revision is messy, very messy. Ideally I would've loved to make a video showing off the process in detail, being able to go on tangents and show you around exactly how I stumbled and developed upon the system, reasoning behind a few of the decisions I made in this entry, but I lack the resources right now (notably a microphone)

    2. Normally I'd try to make the entire thing seem more accessible in general, but really, this is an extremely complex topic that would take some experts press their eyes in frustration. I know it happened to me a ton.

    3. If you're looking for pre-made examples, I have a few right here:

    file-image
    47KB
    AWG3-ACES-GamutCompress.xbm
    image
    arrow-up-right-from-squareOpen
    Gamut compressed LUT using AWG3 gamut conversion, looks a bit desaturated.
    file-image
    50KB
    AWG3-LogC.xbm
    image
    arrow-up-right-from-squareOpen
    A method which I didn't have the ability to go over in the entry, but gives surprisingly pleasant results in both AWG3 conversion and SRGB.
    file-image
    35KB
    SRGB-ACES-GamutCompress.xbm
    image
    arrow-up-right-from-squareOpen
    Gamut compressed, ACES-tone mapped without AWG3 gamut conversion. Has clipping problems that are simply inherent to the incorrect color due to not using AWG3 conversion, but has a very unique look.
    file-image
    29KB
    SRGB-LogC.xbm
    image
    arrow-up-right-from-squareOpen
    A variant of the undocumented method that is similar to the ACES-tone mapped SRGB LUT but has less clipping.
    hashtag
    Generating an icon

    First of all, downloadarrow-up-right the template archive (kindly provided by Apart) and find the folder virtual_atelier_inkatlas_icon_template with the following files:

    Put the .inkatlas and .xbm into your project (if you're using the example project, you can put them into the ops folder). Then, rename them to atelier_icon:

    Now, create your icon. The process is the same as for "preview images". The resulting slot will be named slot_01.

    hashtag
    Creating the atelier file

    1. Visit thisarrow-up-right website and fill out the information:

    Field
    Content

    Store ID (characters only, w/o spaces, '-', '_' and etc.)

    MyTutorialAtelierStore

    Store Name

    My Tutorial Atelier Store

    Atlas Resource

    tutorial/torso/my_custom_shirt/ops/atelier_icon.inkatlas

    1. Now, add your item.

    circle-exclamation

    In atlasResource, you have to replace all \ with /

    Your atelier store will cause script errors if you don't.

    Field
    Content

    TweakDBID

    as defined in your yaml, e.g.

    Items.my_custom_shirt_redwhite

    Price

    Whatever price you want, 0 means that it's free

    Quality

    Are we settling for anything but legendary here?

    ​ Ignore "Icon path" and "description", we have these in the item itself.

    1. Click "Add Item". Repeat the process with as many items as you want.

    2. Click "Generate".

    triangle-exclamation

    In the downloaded file, check that atlasResource has forward slashes / instead of backwards slashes \, as per the warning box above.

    hashtag
    Placing the atelier file

    Move the atelier file from your download folder to WolvenKit's resources folder:

    Now, it's time to test! Install the mod and start Cyberpunk.

    hashtag
    Troubleshooting

    hashtag
    My atelier store causes scripting errors!

    I'm not sure how you managed to read past all the red and yellow boxes on this page, but make sure that the path under atlasResource has forward slashes / instead of backwards slashes \.

    If that wasn't it, you might have to re-generate your Atelier store.

    hashtag
    My atelier store makes the game crash!

    That happens when there are two atelier stores with the same store ID. Do a full-text search for the store ID (MyTutorialAtelierStore) in r6\scripts and make sure that you don't have any duplicates.

    Adding new items
    VirtualAtelierarrow-up-right
    The term LUT has its origins in mathematics, where a Look-Up Table would be able to shorten certain math operations by containing readily-calculated values for any input value, or an operation for an input value for a desired outcome. This shortcut was quite efficient and sped up many operations, and was normally designed as a matrix of different numbers and variables. Soon enough, this improvement in speed would be applied in many other fields, and eventually reached computer graphics and film production.

    LUTs are essentially a texture or text file containing every single possible color that can be displayed, and the transformation of an input color into an output color through it.

    hashtag
    Cyberpunk's use of LUTs

    There are many different types of color-grading-related LUTs, such as .CUBE files and .3DL files, but video games often use a texture.

    Initially, Cyberpunk took an approach like many other games, and encoding the LUT as an unwrapped 3D texture:

    "3D" LUT texture from ReShade project.

    Afterwards, Cyberpunk would repackage LUT textures with the blue and green channels inverted to get higher quality, as the human eye values green more than other colors and is more efficient to get all gradients laid on top of green instead of blue. Here we can safely assume is where the switch to using true 3D textures was also made, but we will not show a 3D texture due to redundancy and inability to do so, so just assume from now on all textures are actually just a 3D cube.

    An edited version of the ReShade project's "3D" LUT texture to show the G-B inversion.

    To get even more odd, Cyberpunk would then put the image tone mapping, the process in which HDR colors are processed into SDR, inside of the LUT! This came with the conversion from using a normal sRGB transform, which is industry standard, to using an input of ARRI LogC1 and outputting a linear color which is afterwards processed into normal sRGB gamma by the linear tonemapping.

    The actual base-game LUT with tonemapping applied within. You can see the reason why there is so little highlight fidelity in SDR now! It all just gets mapped to white!!!

    hashtag
    Editing base-game LUTs

    With all that backstory done--how do we start?!

    You will obviously need WolvenKit, but we also require Adobe Photoshop CS4 and on, preferrable Photoshop CC, and also NVIDIA Texture Tools Exporter's Photoshop plugin.

    All of these can be found with a quick Google search, but the last requirement is a bit strange. We need an old version of CP77Tools. Pre-WolvenKit days. You can find it here:

    hashtag
    Okay, now we can get started!

    Create a new WolvenKit project and call it whatever you want.

    After that, import the file base\weather\24h_basic\luts\cp2077_gen_lut_nge_v017.xbm into your project.

    Then open it, and change depth to 1, height to 32, and width to 1024. After that, navigate to renderTextureResource/renderResourceBlobPC/header/sizeInfo and apply the same edits as before.

    Export the file into a DDS...

    Open it up in Photoshop and... voila!

    We now successfuly have the 32-bit HDR LUT imported into Photoshop. You can do any color correction here, or do some ReShade edits in-game and then put that into a LUT image and then use a Photoshop plugin to import it and apply it ontop of this LUT. Make sure you DO NOT simply replace this image with your exported LUT from ReShade or some other editing app, as you will completely ruin the tone mapping the base-game does. I recommend DaVinci Resolve as well and then exporting as as .CUBE file from inside of it.

    When you edit your LUT, make sure you flip the vertical axis (make it upside down) inside of Photoshop!

    hashtag
    Re-importing your edited LUT.

    Let's say I just did some curves tweaking and contrast, etc., etc. Maybe make the green saturation lower and other saturation higher to get rid of the green tint. Now what?!

    Save back your DDS using NVTT and apply these settings:

    • Format: 32x4f RGBA 128bpp | floating-point

    • Generate Mipmaps: OFF

    • Image Options - Compression Quality: Highest

    If you forgot to flip your image inside of Photoshop, turn on the Image Options - Flip Vertically option inside of NVTT.

    We finally come to the hardest part of the process--as if the rest was not. Importing our LUT back into an XBM!

    It's too much of a complex process to encapsulate in an image or two, so listen up:

    1. Extract the downloaded CP77Tools archive somewhere safe and open it up in PowerShell

    2. Copy the original XBM (cp2077_gen_lut_nge_v017.xbm) into the same place that your DDS file is.

    3. Inside of the PowerShell window, type .\CP77Tools.exe rebuild -b -t --keep --unsaferaw -p and then drag the folder your DDS and XBM files are in onto the console window. It should fill in the path after the -p.

    4. Hit enter, hopefully there are no errors.

    When your XBM file imports, overwrite the original XBM file in the project.

    Go back into the XBM and do the opposite of changng the depth, width, and height: setting them all back to 32. Since we've already gone over this, you can just remind yourself how to do it by just doing the step where we stretched out our texture backwards.

    After you've done all that, go ahead and test out your LUT mod. I personally added a bit more contrast and saturation in Photoshop, but go ahead and be as creative as you like.

    hashtag
    Results!

    Before
    After

    As you can see, vanilla's red saturation leaves more to be desired.

    After our edits the red saturation is a lot better and the contrast is more satisfying!

    list
    references

    Your own preview icons

    How to add custom preview images by using a custom .inkatlas file

    hashtag
    Summary

    Created by Updated July 27. 2023

    The guide below will teach you how to make preview icons. While it's a technically a subsection of the ArchiveXL item additions guide, you can use the steps below to make any kind of preview item.

    Difficulty Level: You know how to read and can either edit images or make use of . It's easy!

    circle-info

    If you want to have gendered preview icons, check .

    hashtag
    The required files

    If you downloaded the example project (), the preview is already hooked up. Otherwise, the template archive (kindly provided by Apart).

    hashtag
    Go away with your examples, I'll do everything by hand!

    Okay, you do you. Here's how:

    chevron-rightFinding the files by handhashtag
    1. search in Wolvenkit for icons > .inkatlas

    2. Pick one of CDPR's icon files (look inside first, you want the right format) and add it to your project

    You should now have a structure like this:

    hashtag
    Taking preview pictures

    You have two options on taking preview pictures. Both are relatively tedious, since you have to do it by hand. This is not a step-by-step, but you can find a few pointers here:

    hashtag
    Blender

    You can to Blender and take your preview pictures there.

    hashtag
    In-game

    • Make sure V isn't on the screenshots with 's invisible V toggle, , or the

    • Get an outfit manager like to create outfits where V is wearing nothing but the item

    • Optional: Use

    hashtag
    Fixing up your texture

    1. Export the original .xbm file via Tools -> Export Tool

    2. Find the resulting file under "raw"

    3. Open it in your image editor

    hashtag
    Hooking up the inkatlas

    1. Open the file in WolvenKit.

    2. Open the list slots.

    3. For the first two inkTextureSlot items, set the value for DepotPath

    circle-check

    Congratulations! You now have a preview icon!

    hashtag
    Using it

    You can now hook up your preview icon(s) to whatever mod you are making.

    circle-info

    If you want to use gendered preview icons, check . In this case, you do not add an icon record to your item.

    hashtag
    ArchiveXL: Add it to the .yaml

    Check the code box below — the last three lines add a preview icon.

    Please refer to the for an explanation of the other properties, as this page will only hold information about preview icons.

    • atlasResourcePath: relative path to your .inkatlas file

    • atlasPartName: slot name in your .inkatlas file (which you can see in the PartsMapping tab)

    circle-exclamation

    Again, please note that indent is crucial here, as it determines the node structure. The first line needs to have an indent of 0, the lines from $base to icon need to have two spaces, and the lines atlasResourcePath and atlasPartName need to have four.

    hashtag
    That's it! Time to test!

    If you run into any issues with your texture's transparency, please

    ArchiveXL: adding Photo Mode Poses

    How to hook up custom photo mode poses with ArchiveXL

    hashtag
    Summary

    Created by @manavortex Published May 09 2023

    This guide will walk you through adding poses to Cyberpunk 2077's photo mode with ArchiveXL.

    Difficulty: You know how to read ;)

    Weapons

    Adding weapons

    hashtag
    Summary

    Created by @manavortex Published July 08. 2023

    Weapons work a little different from regular ArchiveXL items, starting right at the root entity. With the help of @Apart and psiberx, I was able to figure out the process and document it for you.

    Abusing workspots

    Or how to play an animation on an entity through clever gimmicks in Redscript.

    circle-exclamation

    This is an advanced tutorial that requires you to understand the basics of wolvenkit

    hashtag
    Credits

    R&R: Emissive

    How to change the Netrunner suit's glowey bits

    This page is a part of the and will tell you how to change the suits' emissive materials.

    will show you how to swap between existing colours in the .yaml file.

    The second section will show you how to .

    hashtag
    Time to complete:

    source\raw\tutorial\npv\your_female_character\head
    import os
    import bpy
    import re
    
    # path of your blend file
    filepath = bpy.data.filepath
    directory = os.path.dirname(filepath)
    
    morphtargetDirectoryFile = os.path.join(directory, "morphtargets")
    
    if not any(filename.endswith(".morphtarget.glb") for filename in os.listdir(morphtargetDirectoryFile)):
        parentFolder = os.path.dirname(directory)
        if any(filename.endswith(".morphtarget.glb") for filename in os.listdir(parentFolder)):
            morphtargetDirectoryFile = parentFolder
            
    targetPath = ''
    
    
    for root, dirs, files in os.walk(morphtargetDirectoryFile):
        files = [ file for file in files if file.endswith( ('.glb') ) ]
        for file in files: # loops through directories and files
            pot2 = os.path.join(root,file)
            armatureName = file.replace('.morphtarget.glb', '').replace('__morphs_default', '__morphs').replace('__morphs', '_c__basehead')  
            print("\nimporting = ", file)        
            imported_object = bpy.ops.import_scene.gltf(filepath=pot2, loglevel=0)
            selectedObject = bpy.context.scene.objects.get("Armature")
            selectedObject.name = armatureName
            print("imported to ", armatureName)
            
    
    bpy.ops.object.select_all(action='DESELECT')
    atelier_icon_template.inkatlas                        << map for the game  
    atelier_icon_template.png                             << 200x200px image for a final slot  
    atelier_icon_template.xbm                             << game texture  
    virtual_atelier_png_to_xbm_import_settings.png        << image, also embedded here  
    tutorial
      torso
        my_custom_shirt
          ops		   
          	- my_shirt_factory.csv  
          	- translation_strings.json  
          	- preview_icons.inkatlas       
          	- preview_icons.xbm            
          	- atelier_icon.inkatlas        <<<  
          	- atelier_icon.xbm             <<<  
    resources
      - tutorial_my_custom_tshirt.archive.xl  
      - tutorial_my_custom_tshirt.yaml         
      - MyTutorialAtelierStore-atelier-store.reds         << new file
    base\animations\ui\photomode\photomode_female_facial.anims
    base\animations\ui\photomode\photomode_male_facial.anims

    Texture Part

    slot_01

    Right-click on the file in the asset browser and select "find used files"

  • Find the .xbm file and add it to your project as well

  • Move both of these files to your custom folder, as you don't want to overwrite game default icons

  • Optionally: Re-name them. This guide assumes that they're named preview_icons.inkatlas and preview_icons.xbm

  • for backgrounds — it has black, white, or greenscreen
    Edit it to your heart's content
  • Overwrite the png file with your edited one. Mind the transparency!

  • Import it back.

  • to the relative path of your xbm (
    tutorial\torso\my_custom_shirt\ops\preview_icons.xbm
    ):
  • Save the file. If it doesn't update, close and re-open it.

  • You now have a tab "PartMapping". You can see which texture corresponds to which slot by selecting it in the other tab and checking the partsValue: arrow-up-right

  • the corresponding guide
    here
    downloadarrow-up-right
    export your mesh with all its materials
    Appearance Menu Modarrow-up-right
    Invisible Characterarrow-up-right
    ArchiveXL Invisibility Cloakarrow-up-right
    Wardrobearrow-up-right
    here
    ArchiveXL guide
    check the textures import/export guide!
    Getting the files
    AMM Photo Studio Propsarrow-up-right
    triangle-exclamation

    This guide will teach you how to hook up an existing .anims file to the photo mode. If you don't have an .anims file, you can find a dummy file in the AMM pose guide, or you can learn how to make your ownarrow-up-right.

    It uses the following versions:

    • Cyberpunk 2077 game version 1.6.2 Hotfix

    • WolvenKitarrow-up-right >= 8.9.0

    • TweakXLarrow-up-right 1.1.4

    • 1.4.5 (the first version supporting this feature)

    • 1.12.0

    circle-info

    You do not need any pose mode extender like PMU or MPAF anymore, although the ArchiveXL feature is compatible wiith all of them.

    circle-check

    Check out this toolarrow-up-right by @wolv, it will generate yaml files for you

    hashtag
    Getting the files

    Download either of these files:

    • full Wolvenkit project (Nexusarrow-up-right)

    • Wolvenkit source folder (Nexusarrow-up-right)

    hashtag
    Setting up the files

    At any point during this guide, you can press the green Install button on Wolvenkit's toolbar to check the mod in Wolvenkit.

    hashtag
    Step 1: Rename the folders

    circle-info

    This step is optional, but if you want to release your mod, you have to complete it (or cause mod conflicts for your users. Don't cause mod conflicts for your users.)

    We usually do this at the very end and I'm leaving you alone with it. However, this time we start by renaming the folders.

    The screenshot below shows suggestions. Name your files and folders whatever you want, as long as they have no uppercase letters.

    hashtag
    The .xl file

    This file tells Cyberpunk to load your custom poses and will be in the same folder as the .archive file for your mod. It looks like this:

    You have to adjust the paths under set and en-us to your new changed folder structure.

    circle-info

    If you want to support more body types from the Nibbles Replacer, you can switch to the Mod Browser and enter the following search query to find all the entities: base\characters\entities\photomode_replacer > .ent

    Here's what those things do:

    animations: A list of entities and animation files that you want to add to them animations/entity: The relative path to the photomode .ent file. There are just three of them. animations/set: The relative path to the .anims file in your Wolvenkit project. localization/onscreens/en-us: A file with translation strings. Holds the name of your photo mode pose set.

    hashtag
    localization.json

    circle-info

    You can name this file whatever you want, just make sure that you change the path and name in the .xl file.

    • Change the yellow box UI-Photomode-tutorial-netrunner-making-poses to something unique to your mod.

    • The green text is the name that will show up in photo mode — the female variant is the default.

    hashtag
    The .anim file(s)

    If you have created your own animations (as a replacerarrow-up-right or for AMM), then you are already familiar with this kind of file. If not, it is time to appropriate one from the game files - pick any, since the process is just like with a replacer.

    Just as a reminder, here's how they look:

    You will need the green text in your .yaml file.

    circle-info

    Optional: If you want your pose to move, you can set the duration in the .yaml as well!

    hashtag
    The .yaml file

    This file will go into r6/tweaks/yourfolder and appends the poses that you defined to the photo mode. Without this file, the animations will be in the entity, but the photo mode won't know about them.

    circle-check

    You can use this toolarrow-up-right by @wolv to autogenerate your .yaml. If you do that, then you can skip this entire section and check the result.

    It has three sections:

    hashtag
    Adding the category

    The first block will introduce your new category to the photo mode.

    circle-info

    I recommend doing search and replace on netrunner_making_poses, because it's used a bunch of times.

    • PhotoModePoseCategories.netrunner_making_poses: This is the name of the category, used to assign individual pose entries to your category.

    • displayName: This must match the secondaryKey in your .json

    hashtag
    Define the pose entries

    triangle-exclamation

    If one of your poses is called idle_stand, that will break a bunch of other mods. Please re-name it in both the .anims file and the .yaml before releasing.

    Now comes a long list of entries. They'll look like this:

    circle-check

    You need to add one of those for every pose from your .anim file that you want to show up in photo mode.

    PhotoModePoses.sit_chair_table_keyboard__2h_on_keyboard__make_amm_addon: This is the unique key to assign your pose to your pose set. You'll need it in the third block. animationName: This must match the animation name in your .anim file (the green box). category: This must match the category in the first block. displayName: What'll show up in photo mode

    hashtag
    Telling photo mode about the poses

    You register your poses for photo mode by creating the following entry categories:

    An entry looks like this:

    The entries in the list must match the unique keys that you've defined in the second block, and you need one entry per pose. If you have different names for differently-gendered poses, you need to use the correct lists.

    circle-info

    photo_mode.character.quadrupedPoses enables Nibbles photo mode replacer support for AMM >= 2.2.4

    hashtag
    Finishing up

    Before you can share your pose pack, you need to change the paths. If you don't and the next modder also doesn't, then only one of your mods will work.

    You can find a full guide on changing the paths here.

    If you rename files or folders under resources, remember to delete the old control files from your game directory.

    hashtag
    The result

    circle-info

    At any point during this guide, you can press the green Install button on Wolvenkit's toolbar to check the mod in Wolvenkit.

    She has no idea what she's doing
    Fortunately, you can hire specialists
    circle-info

    This guide assumes that you are at least somewhat familiar with ArchiveXL item additions as per the "Adding new Items" guide. If you have no idea where to start, make sure that you set up a working shirt and then start making the changes below.

    hashtag
    Selecting the base

    Start by finding the .app file of an original weapon of the type you want to make (Theres a list herearrow-up-right) and adding it to your project. We will change that file, rather than assembling anything by hand.

    In the app file, you can also find the value for the yaml file's $base property:

    hashtag
    Getting the mesh_entity.ent

    You need the correct mesh entity to go with your appearance file. You can find them under base\weapons\ - search for the name of your weapon, or just navigate through the folders.

    This file makes the weapon show up in photo mode. Instead of going into the PartsValues, it will be linked in the app file's root as baseEntity (there's a screenshot below). Leave it alone for now, it's easier to make the appearances working correctly in the .app file and then copying over an entire component array.

    hashtag
    Factory: .app instead of root_entity

    Instead of a root entity file, you need to point your factory.csv directly to your iron's app file (the one from the section above).

    hashtag
    Appearance selection

    An equipment item's lookup chain goes from the appearanceName in the yaml to the root_entity, where the appearanceName will lead to the correct appearance in the .app file.

    With a weapon, all that happens through visualTags.

    hashtag
    YAML: Define the field:

    hashtag
    .app file: Define the visual tag

    visualTags (violet): Must match the visualTags in your .yaml file. If multiple entries match, one will be chosen at random.

    circle-info

    Unlike with an entity file, the appearance name doesn't matter. You can name all of them foo, and as long as you had the visual tags right, it still works (I would advise against it, though)

    visualTags (violet): Must match the visualTags in your .ent file. If multiple entries match, one will be chosen at random.

    hashtag
    Step by step

    As the process is finicky and there can be all sorts of sudden unexpected behaviour, here's the best way to go about this.

    The list links you to sections of the guide which tell you to change things. Optimally, you do a dry run with one appearance to make sure that something shows up in the game at all, then start fine-tuning, but you do you.

    Here's what's worked for me (@manavortex):

    1. Find the .app file of a suitable base weapon, add it to your project, and rename it. Don't change anything for now, future you might need the original data for troubleshooting later.

    2. Find the correct .ent file under base\weapons\ (it's linked in the .app's baseEntity field).

    circle-info

    Optimally, the number of components in the .ent file should be the same as in any appearance's component array (red arrow on the screenshot above).

    If it's not, that could indicate that you have the wrong .app file. It could also mean nothing, but if you run into trouble in step 6, this might be why.

    1. Configure the yaml as described here

    2. Set up one (1) appearance for testing by assigning the correct visual tags. Do not delete the other appearances yet, future you might need them for troubleshooting.

    3. Start the game and make sure that you can spawn a custom weapon with the apppearance you picked and that it

      1. shows up in inventory/photo mode

      2. shows up in first person

    If that's not the case, check the mesh entity (see the blue box in step 2).

    If that doesn't help, you may have taken the wrong .app file - go looking again.

    circle-exclamation

    You haven't changed anything at this point: the goal here is to make sure that your visual tags are correct and that you can spawn a weapon addition.

    It's crucial that you make this work — anything you do after this point will add complexity and make troubleshooting more difficult, so this is where you shore up your bases.

    1. Optional: You just added a weapon to the game that didn't exist before. Take a moment to bask in the success!

    2. Custompath your mesh entity:

      1. Create a copy of the file and move it to a custom folder

      2. rename it

      3. Change the baseEntity path in your .app file

    3. Optional, but recommended: Repeat step 5 and make sure that everything spawns

    4. Now it's time to actually change things. Open your appearance's component array and make sure that the MeshComponents load your custom stuff (anything that has a depotPath pointing to a .mesh file).

    5. After you've changed the paths, launch the game and make sure that your weapon

      1. shows up in your inventory with your meshes

      2. shows up in first person with your meshes

    Fix any issues that might arise before you proceed.

    circle-info

    This is why we kept the original appearances around: if you run into any issues here, you can compare your stuff with the original, un-changed game variants.

    Don't forget that you can

    • split off meshes or submeshes for individual pieces (for chunkmask hiding or extra materials)

    • add more components (duplicate existing ones, or copy them from the mesh entity)

    1. Once everything works, delete all the default appearances, then duplicate and adjust the one you customized to show your color variants.

    2. Now, finally, copy a working appearance from the .app file to your mesh entity. This will make your weapon show up in photo mode.

    3. Luanch

    If you wish to add a custom icon, follow the steps in the corresponding guide.

    hashtag
    Your own HUD icons

    To make your own HUD icons for the lower right corner, check here.

    hashtag
    Custom throwing weapons

    You can set up throwing weapons just like a regular weapon, but the projectile (when you throw it) will default to . Check here for how to have custom projectiles.

    hashtag
    Editing weapon meshes

    When exporting an existing weapon mesh for your custom weapon, make sure to uncheck LOD Filter — the lower LOD mesh is used for calculating the hitbox.

    circle-info

    This is especially important if you add a melee weapon of a different size than the original: if you only replace LOD 1, there will be a separate, invisible hit box that does not align with your new weapon.

    Mesh export LOD Filter

    In Blender, put your custom mesh in both LODs.

    circle-info

    If your weapon is significantly bigger than the original one, you'll notice that the hitbox won't auto-scale with your mesh. If you know how to solve this problem or want to brainstorm, hit up @Mx_OrcBoi on Discord!

    hashtag
    Troubleshooting

    hashtag
    My weapon is fully invisible, no matter what I do!

    First of all, unequip and re-equip

    First of all, let's give credits to people out there:
    • Cyberscriptarrow-up-right and Smoke Everywherearrow-up-right authors donk7413 and Eli, who originally found out how to play animation through workspots. All credits to them in that regard.

    • psiberx for his numerous hints and advices, as always.

    hashtag
    How to ?

    It started from a talk with @Eli and @donk7413 the authors of Cyberscriptarrow-up-right and Smoke Everywherearrow-up-right mods.

    When asked details about how they managed to have V smokes a cigarette anywhere in-game, they mentioned having merged all .workspot files in a gigantic file for convenience (namely Cyberscript Core Animation Archivearrow-up-right), so that Cyberscript can play any animation in-game on V or any NPC.

    At first it didn't ring a bell, but then @psiberx mentioned about modders "abusing" .workspot by spawning an invisible .ent to have the target being animated.

    hashtag
    🤔 ...

    The trick is actually to spawn an invisible device (.ent) right onto your entity, which then allows to trigger animation(s).

    hashtag
    WolvenKit

    So it happens that we need a .ent file whose components contains a workWorkspotResourceComponent which references a .workspot by name and DepotPath.

    In turn, .workspot file contains a list of worksSequences containing workAnimClip which are the animations to play with idleName and animName.

    Of course the .ent must be made invisible and contain a set of specific properties, and this is where all hard work was already made by Cyberscript people.

    💡arrow-up-right Generally speaking if you need to play a ton of animations I would recommend you to use Cyberscript directly, since it already does everything for you and also comes up with a ton of useful more features to build a mod with ease.

    On the other hand, if like me you only want to play 1 or 2 animations at most, then it's probably a lot of overhead and you can keep reading.

    What I personally did was to reuse Cyberscript archive .ent stripped of components that I don't need, and .workspot with only the animations that I'm interested into.

    To do the same, you will need to download the Cyberscript Core Animation Archivearrow-up-right, install it in your mod folder so that Wolvenkit can find it, and locate the workspot_anim.ent file in the following directory structure:

    You can then use wolvenkit and your file explorer to move the workspot_anim.ent in the location of your choice inside your mod. Then you can strip it of every components that isn't aworkWorkspotResourceComponent using wolvenkit.

    Then you will need to locate an interesting .workspot file inside the base/workspot of the game and place it in the location of your choice inside the archive folder of the mod you are creating.

    A theorical mod file structure

    Redscript

    Once the previous files are ready, we need something able to spawn an entity in Redscript (once again if your preference goes to Lua, I'd recommend you to use Cyberscript directly).

    This is exactly what Codewarearrow-up-right offers with DynamicEntitySystem: see "Entities" in its wikiarrow-up-right!

    Here's a short example which will get us going:

    (You will need to replace the paths to the .ent and .workspot files with the paths to your files )

    hashtag
    Adding the script to your mod

    to add this script to your mod, you will need to create the following structure in the ressources folder of your mod:

    hashtag
    Clearing misconceptions

    • .ent can be anything, not just a "living entity". it can be a cigarette, the act of smoking.. it can really be "whatever".

      • it contains components with e.g. workspotMapper, entSlot, etc

      • it also contains obviously a workWorkspotResourceComponent with points out to the .workspot.

    • .workspot gets triggered throughout .ent: you don't spawn a workspot and play it on a target, you spawn an entity which references the workspot and plays the workspot through the entity (which in turn play the animation(s), and you can "jump" from one animation to another in the same workspot).

  • ~ 30 min tops for the tutorial

  • once you know how it works:

    • < 1 minute for .yaml edits

    • < 5 minutes for material edits

  • hashtag
    Switching existing colours

    Since ArchiveXL's Dynamic Appearances feature is that cool, you can switch the emissive material simply by changing the property in the .yaml file. You can choose from the following emissive colours:

    Static
    Animated

    blue

    glitch_blue

    green

    glitch_green

    orange

    glitch_orange

    To change the emissive of an existing suit, you only need to change a single thing in the yaml file. Find it in your game directory:

    Open it in a text editor, and find the list $instances near the top of the file. It will look like this:

    Change the current entry against one from the list above. Make sure that you don't delete the comma or the colon, the amount of spaces only matters at the beginning of a line (other than for my personal OCD).

    Save the file and start the game.

    circle-check

    If you did everything correctly, the emissive will now have a different colour.

    If you made a spelling mistake (or selected the appearance off), then the emissive will be gone.

    If V is naked, then you fucked up (deleted the , or the :). In that case, remember that you can un-do the last change with Ctrl+Z!

    chevron-rightCan I do this for every mod???hashtag

    Unfortunately not!

    hashtag
    Changing the presets

    circle-info

    I won't document this step-by-step (yet), since it's pretty self-explanatory once you have the right file open.

    All the emissive materials live in .mi files. Inside the archive, they're bundled in this folder:

    Each file will be named emissive_VARIANT, (VARIANT being the colour as listed in the table above). E.g., the file for the regular green emissive will be called emissive_green.mi

    See R&R: Colour Editing on R&R: Colour Editing for how to extract the file.

    Open the file in Wolvenkit and check the values. You'll see something like this:

    You can change the values in the panel on the right — feel free to experiment. You can make a copy first in case you break something, but even then, you can still install the original mod again and re-extract the file.

    circle-info

    All emissive files use one of two templates:

    manavortex\torso\netrunning_suit\textures\emissive\_emissive_glitch_base.mi

    manavortex\torso\netrunning_suit\textures\emissive\_emissive_base.mi

    If you are missing any properties, open the template and copy them from there.

    hashtag
    OK, what now?

    Time to test! Install and launch your Wolvenkit project:

    If you did everything right, your recolour will now be active.

    Otherwise, check R&R: Troubleshooting.

    Recolours and Refit guide
    The first section
    change the existing presets

    R&R: Colour Editing

    Doing a custom recolor of the Netrunning suit

    This page is a subsection of the Netrunning Suit guide. It will teach you how to recolour Cyberpunk items via MLSetupBuilder.

    hashtag
    Assumed level of skill:

    You know how to read — if you can read and struggle with this guide, then it's not yet good enough. Please reach out to on the redModding Discordarrow-up-right so that I can improve it.

    hashtag
    Time to complete:

    • <1h for the tutorial

    • < 5 minutes once you know how it works

    hashtag
    Prerequisites:

    If you can check all those boxes, let's go.

    hashtag
    Overview

    MLSetupBuilder can't directly edit game files. For that reason, we need to

    1. export our .mlsetup to an .mlsetup.json

    2. edit that file via MLSetupBuilder

    3. import it back

    You can't skip any steps in this section that don't say otherwise.

    circle-exclamation

    Do not move any of the files. Wolvenkit will lose track of them if you move them around.

    hashtag
    Step 1: Loading the file into MLSetupBuilder

    circle-check

    Getting the file into the tool, and opening the right preview

    Now that you have added the right file(s) to your project, right-click on them or on their folder and select the option to export them as json:

    Once you have done that, switch to your project browser's raw tab, right-click on the first file, and select the option to open it in MLSetupBuilder:

    This will open MLSB with the correct file already loaded.

    circle-info

    Alternatively, you can also open MLSetupBuilder by hand, then press Ctrl+I or select Import from the menu.

    circle-exclamation

    If your material list is saying [object object], check the

    hashtag
    (Optional) Step 2: Preview and Layer Masks

    circle-check

    If you don't care for this, you can skip to

    hashtag
    Enable preview

    1. Switch to MLSetupBuilder's .

    2. Check if the .mlsetup that you want to edit is in a subfolder layer_mask_2

      • No: Search for t0_005_pwa_body__t_bug

    circle-info

    Songbird's suit has a custom mlmask, which I've been too lazy to set up. Future MLSetupBuilder updates will support dynamic switching.

    chevron-rightWhat's going on here? hashtag

    This is an optional theory block. You can skip this box.

    An .mlsetup is a list of 20 material definitions, which are projected on the 3d object like layers of paint. The is a list of 20 cut-out stencils, which block out parts of the layer. (You can see a live example by clicking through the list of layers in MLSB!)

    The layers will be applied in order: first Layer 0, then Layer 1, then Layer 2. This is how we can colour the arm stripes separately on t0_001_wa_body__t_bug.

    hashtag
    Step 3: Recolouring

    hashtag
    Prerequisites

    circle-info

    There will be a bunch of links in this section, which you can absolutely ignore. They'll lead you to look-up tables or extra theory.

    hashtag
    Potential breaking point

    circle-info

    If you are here to edit other mlsetups, you can skip this section

    circle-exclamation

    Some suits are using custom materials, which MLSB isn't yet equipped to handle. You can identify them by the missing icon in the preview (see the screenshot below). For details on how to handle those, check below.

    hashtag
    Change the colours

    1. Click through the layer list on the left (1).

    2. The Material value (2) changes based on your layer selection, as will the available options

    3. Change the colour by clicking on it in the Color Picker (3)

    1. Repeat the process until you're satisfied

    2. Now export the .mlsetup (shortcut: Ctrl+E).

    3. Overwrite the file you imported (e.g. mirror_hex_black.mlsetup.json

    hashtag
    Custom material paths

    circle-info

    This section tells you how to deal with custom materials. You can identify them by their broken preview icon.

    If you don't have any of those in your .mlsetup or if you are just recolouring MlSetups independently from the Netrunner guide, then you can skip to

    Since I knew that I was going to share this, I've moved custom materials into a subfolder manavortex in their original path.

    To get the original color picker back, we'll need to change the path while you're editing the material, then put the original back when it's time for export. You do it like this:

    1. Click into the material path (orange box)

    1. Press Ctrl+A to select the path.

    2. Press Ctrl+C to copy it. Paste it into a text document so that you can restore it later.

    3. Find the subfolder manavortex\

    1. You now have a working colour palette and can edit the material.

    2. When you're done, click into the material path again and restore the original value.

    3. You can now export (ctrl+E)

    hashtag
    Step 4: Importing into Wolvenkit

    Switch back to Wolvenkit.

    1. Make sure that the Project Explorer shows either of the tabs source or raw

    2. Find the file that you just edited

    3. Right-click on it and select the option to convert it from JSON:

    hashtag
    Step 5: Testing

    Time to test! Install and launch your Wolvenkit project:

    If you did everything right, your recolour will now be active.

    Otherwise, check .

    Creating a LUT from scratch

    A description of a streamlined, refined, accessible, and relatively easy system for creating Cyberpunk 2077 LUT mods from scratch.

    triangle-exclamation

    This method is for LDR. Little to none is known about HDR LUT creation, so please, do not expect anything on HDR LUTs.

    hashtag
    What is a LUT, really?

    It's imperative to understand what LUT really is before starting. Often, beginners have a misconception caused by other software which often uses different formats for LUTs and different ways to apply them, such as ReShade.

    Cyberpunk LUTs are distinctly different from ReShade LUTs due to two things:

    1. They are 3D textures, not 2D textures with tiles describing different parts of the RGB cube, no, Cyberpunk LUTs are full-on 3D textures sampled with trilinear filtering.

    2. They are applied with an input of ARRI LogC3 data with an sRGB color space. This means you can't go and use any ReShade LUTs, as they often do not expect LogC3 output. Along with this, many tools expect ARRI LogC3 data with an ARRI Wide Gamut 3 color space when generating your LUT. If you do not convert to it, you will end up with clipping colors.

    But, aside from that, they are similar. Any LUT expects an input of a color, with an output of a new color. That's it. Cyberpunk's implementation is as simple as extracting the pixel out of the LUT texture that matches the input color, and if there isn't an exact match, it interpolates linearly to get a near-perfect approximation of the true output color.

    If you're still confused, I recommend looking at .

    hashtag
    Prerequisites

    A backup of NVTT can be found here

    If you don't trust a random exe file, that's good, but if you want to download it from the source you need to create or use your current NVIDIA account and add yourself to the developer program.

    DaVinci's website prompts you to fill out some data before being able to download the software. You can fill this out with fake data, it doesn't really matter.

    You can use Fusion Studio just as easily as well for parts of the guide, and DaVinci Resolve Studio is also recommended in general.

    By the way, if you just wanna skip the steps on repeat projects, there is a reference GitHub repository containing NVTT settings, DaVinci Resolve and WolvenKit projects, as well as pre-made LUT files if you just wanna test them out quickly.

    hashtag
    Workflow

    hashtag
    WolvenKit

    Create a new project in WolvenKit and import the file base\weather\24h_basic\luts\cp2077_gen_lut_nge_v017.xbm and export to a DDS, then rename it, removing the xbm file extension. You should have a dummy name with a file path containing that same file in the "raw" folder. You can delete the file in there, we only need the folder set up correctly.

    hashtag
    DaVinci Resolve

    circle-info

    If you have issues getting Resolve to run for the first time, uninstall the panels program. It causes crashes if you don't have any DaVinci panels or sliders.

    Create a Resolve project, and head straight over to the Fusion tab, without importing any media. Add a LUT Cube Creator node, change the type to vertical and size to 32, 48, or 64. Remember this number, as you will use it later. Select for the generated Media Out node to output to both sides of the preview by enabling both of the circles below it. On one of the sides, select Views>3D Histogram. You should now have a LUT cube present. If you'd like more accuracy, right click and go to 3D Histogram and select solid with 1:1 sampling.

    Right after the LUT Cube Creator node, add a Color Space Transform node, and matching the fact that tools expect ARRI Wide Gamut 3 with ARRI LogC3 data, but the game outputs sRGB with ARRI LogC3 gamma, we need to go from sRGB color space with ARRI LogC3 gamma to an output color space of ARRI Wide Gamut 3 with output gamma of ARRI LogC3

    After this, we need to go from this LogC3 data to sRGB, which is what our display expects.

    hashtag
    ACES method (recommended)

    This is the method used by the original game to go from the input LogC3 to sRGB output, so it's what's recommended.

    Add an ACES Transform node after the Color Space Transform node. Set the input transform to ARRI LogC3 with an output transform of sRGB and use ACES reference gamut compression.

    hashtag
    ARRI LogC3 method

    This method uses LUTs from ARRI themselves, and as such gives us two options: LogC3 and LogC3 "classic". I encourage you to use the normal LogC3 LUT, but experiment with Classic and see if you like it. Though, this method requires a change in the settings that are described later.

    In the link above, select LogC wide gamut as the source format and destination format as video. Select your preference of ARRI Classic 709 and ARRI 709 in the conversion parameter. The file type can be either Blackmagic Fusion or Blackmagic DaVinci Resolve, it really doesn't matter.

    Add a serial File LUT node and point to your downloaded file.

    hashtag
    ARRI LogC4 method

    It may share a name with the LogC3 method, but is distinct from it as it uses a more recent revision of the color science compared to the LogC3 method, but we will need to change things before and after this step if you decide to use this method.

    Follow the same link described in the section until you reach this part. Download the "ARRI LogC4 LUT Package".

    Once you have downloaded it, extract the Rec.709 Gamma 2.4 65-point .CUBE file from the zip file. Add a serial node after the Color Space Transform called File LUT and point the LUT file to your extracted .CUBE file.

    We have to make some changes to the Color Space Transform node, change the output color space to ARRI Wide Gamut 4 (instead of 3) and then the output gamma to ARRI LogC4. Your LUT should now look correctly exposed.

    You can mess with the Tone Mapping Method, but just select None as a good option.

    We need to change an option afterward that will be described later for both the LogC3/4 methods.

    hashtag
    Resolve Color Managed method

    This method uses DaVinci's integrated tone mappers to go from the LogC3 input to sRGB output. It produces a neutral and accurate output. It's also very minimal.

    For this method to work, we just need to change the settings in the Color Space Transform.

    Instead of having an output color space of ARRI Wide Gamut 3, set the color space to sRGB and gamma to sRGB as well. Then, change the tone mapping method to DaVinci, or some other method if you know what they mean.

    This method creates a color cube that is very "unbiased"--it has fidelity in all directions, which, while creating a good representation of true color, can result in unnatural saturation. To account for this, the saturation compression gamut compression method can be selected.

    After you have used your preferred method, you need to apply gamma correction. If you do not do this, you end up with incorrect gamma, which can mainly be seen on skin tones.

    For the ACES method, you need to add another Color Space Transform node, with input color space and gamma of sRGB, with the output color space of sRGB but output gamma of linear.

    For both ARRI methods, nearly the exact same steps are taken as the ACES method, but, instead of sRGB input color space and gamma, we use an input color space of Rec.709, but input gamma of Gamma 2.4. Keep the output color space at sRGB and output gamma at linear.

    For the Resolve Color Managed method, simply change the output gamma in the color space transform to linear, but turn on Apply Forward OOTF.

    This is the final stage. We now just need to output to an image, and use the right format. To do this, use a Resolve FX Transform>Transform node (not any other transform node) and switch on "Flip Vertical" to correctly output.

    Right click on the LUT picture and save your image as a TGA or PNG file.

    hashtag
    NVIDIA Texture Tools

    Drag on your exported file onto the NVTT window and tick off "Generate Mipmaps" and select format as 32x4f. Tick off KTX2 compression and tick on DXT10 header as well turn on Highest compression quality.

    Turn on "Extract From Atlas" and set "Depth of Volume" to the exact size of your LUT that you set up when first creating it. To verify you got it right, you should see a Z slider on the top right of the NVTT interface. Drag it and see if there is any vertical shift in the texture. If there is not, you got it right.

    Save as a DDS file (only DDS) and put it in the folder that was generated after you exported the XBM file at the start of the article.

    hashtag
    WolvenKit again

    You should now see it in the import tool in WolvenKit. Change its TextureGroup property to TEXG_Generic_LUT, turn off IsGamma, VFlip, GenerateMipMaps, IsStreamable, and PremultiplyAlpha. Set compression to TCM_None. If your file doesn't have RawFormat as TRF_HDRFloat, then something in the DDS importing went wrong, and you need to re-set the format as 32x4f in NVTT.

    Import the DDS. We need to tell the file it is actually a 3D texture in the header (even if the 3D data is already there), so go to renderTextureResource>renderResourceBlobPC>header>textureInfo>type and change it from TEXTYPE_2D to TEXTYPE_3D.

    Make a copy of the XBM file and rename it to cp2077_gen_lut_nge_v017. Our dummy file there is for being able to quickly copy the filename, so, select your LUT XBM, C-c, C-v, select the dummy file, F2, C-c, select your LUT copy XBM, F2, C-v.

    Your LUT is now correctly set up. You can install and launch now!

    hashtag
    Results

    Changing materials, colors and textures

    Changing how an item looks in-game

    hashtag
    Summary

    Created by @manavortex Published November 05 2022

    This guide will teach you how to change an item's appearance by editing its MultilayerSetup (*.mlsetup file), how to rename materials, and how add your own mlsetups (custompathing).

    It uses the following versions:

    tutorial  
    	ops		   
          	- my_tshirt_factory.csv 
          	- translation_strings.json  
          	- preview_icons.inkatlas       <<<  
          	- preview_icons.xbm            <<<  
    Items.my_custom_shirt_redwhite:
      $base: Items.GenericInnerChestClothing
      entityName: my_custom_shirt_factory_name
      appearanceName: appearance_root_entity_white_red
      displayName: my_shirt_localization_name_white_red
      localizedDescription: my_shirt_localization_desc
      quality: Quality.Legendary
      appearanceSuffixes: []
      icon:
        atlasResourcePath: tutorial\torso\my_custom_shirt\ops\preview_icons.inkatlas
        atlasPartName: slot_01
    animations:
      - entity: base\characters\entities\player\photo_mode\player_wa_photomode.ent
        set: tutorial\animations\netrunner_making_poses\pwa.anims
      - entity: ep1\characters\entities\player\photo_mode\player_wa_photomode_ep1.ent
        set: tutorial\animations\netrunner_making_poses\pwa.anims
      - entity: base\characters\entities\player\photo_mode\player_ma_photomode.ent
        set: tutorial\animations\netrunner_making_poses\pma.anims
      - entity: ep1\characters\entities\player\photo_mode\player_ma_photomode_ep1.ent
        set: tutorial\animations\netrunner_making_poses\pma.anims
      - entity: base\characters\entities\player\photo_mode\johnny_photomode.ent
        set: tutorial\animations\netrunner_making_poses\pma.anims    
      - entity: base\characters\entities\photomode_replacer\photomode_npc_woman_average.ent
        set: tutorial\animations\netrunner_making_poses\pwa.anims
      - entity: base\characters\entities\photomode_replacer\photomode_npc_man_average.ent
        set: tutorial\animations\netrunner_making_poses\pwa.anims
    localization:
      onscreens:
        en-us: tutorial\animations\netrunner_making_poses\localization.json
    
    photo_mode.character.malePoses
    photo_mode.character.johnnyPoses
    photo_mode.character.femalePoses
    photo_mode.character.quadrupedPoses
    cyberscript.archive/
    ├─ base/
    │  ├─ cyberscript/
    │  │  ├─ entity/
    │  │  │  ├─ workspot_anim.ent
    // minimal example
    // use in CET console like: Game.GetPlayer():Smoke();
    
    @addMethod(PlayerPuppet)
    public func Smoke() -> Void {
    
        // first listen for entity spawning events
        // this is because spawning happens asynchronously
        GameInstance
            .GetDynamicEntitySystem()
            .RegisterListener(n"MyMod", this, n"OnEntityUpdate");
    
        let spec = new DynamicEntitySpec();
    
        // then designate entity to spawn
        spec.templatePath = r"base\\mymod\\entity\\smoke.ent";
        
        // position it on the player
        spec.position = this.GetWorldPosition();
        spec.orientation = EulerAngles.ToQuat(Vector4.ToRotation(this.GetWorldPosition()));
    
        // add a tag to differentiate it once spawned
        // this is because DynamicEntitySystem listen to all the entities spawned
        // not just the ones it creates
        spec.tags = [n"MyMod"];
    
        // process with entity spawning ...
        GameInstance
            .GetDynamicEntitySystem()
            .CreateEntity(spec);
    }
    
    // and this is the method that will be called by DynamicEntitySystem
    // with entity spawning events
    @addMethod(PlayerPuppet)
    private cb func OnEntityUpdate(event: ref<DynamicEntityEvent>) {
    
        // make sure this is our .ent and it has spawned succesfully
        if Equals(event.GetEventType(),DynamicEntityEventType.Spawned){
    
            // retrieve our invisible device
            let device = GameInstance
                .GetDynamicEntitySystem()
                .GetEntity(event.GetEntityID()) as GameObject;
    
            // make our player enter workspot
            GameInstance
                .GetWorkspotSystem(this.GetGame())
                .PlayInDevice(device, this);
    
            // when player smokes,
            // it probably need to own a cigarette and a lighter in the first place :)
            GameInstance
                .GetTransactionSystem(this.GetGame())
                .GiveItem(this, ItemID.FromTDBID(t"Items.crowd_cigarette_i_stick"), 1);
            GameInstance
                .GetTransactionSystem(this.GetGame())
                .GiveItem(this, ItemID.FromTDBID(t"Items.apparel_lighter_a"), 1);
    
            // and these objects better be in his/her hands too :)
            GameInstance
                .GetTransactionSystem(this.GetGame())
                .AddItemToSlot(this, t"AttachmentSlots.WeaponLeft", ItemID.FromTDBID(t"Items.crowd_cigarette_i_stick"));
            GameInstance
                .GetTransactionSystem(this.GetGame())
                .AddItemToSlot(this, t"AttachmentSlots.WeaponRight", ItemID.FromTDBID(t"Items.apparel_lighter_a"));
            let left = new AIEquipCommand();
            left.slotId = t"AttachmentSlots.WeaponLeft";
            left.itemId = t"Items.crowd_cigarette_i_stick";
            let right = new AIEquipCommand();
            right.slotId = t"AttachmentSlots.WeaponRight";
            right.itemId = t"Items.apparel_lighter_a";
            let controller = this.GetAIControllerComponent();
            controller.SendCommand(left);
            controller.SendCommand(right);
            
            // more steps eluded for simplicity:
            // you probably wanna play SFX and VFX too... 
    
            // finally start anim on player!
            GameInstance
                .GetWorkspotSystem(this.GetGame())
                .SendJumpToAnimEnt(this, n"stand_car_lean180__rh_cigarette__01__smoke__01", true);
                
            // from there on, you probably want to use Callback
            // and coordinate each step of the anim :)
        }
    }
    r6/
    ├─ scripts/
    │  ├─ your_script.reds
    Cyberpunk 2077\r6\tweaks\manavortex\_ArchiveXL_Netrunner_variants.yaml
    manavortex\torso\netrunning_suit\textures\emissive
    shows up in photo mode at all (it shouldn't be invisible, but will still have the default appearance)
  • all parts and extra meshes are visible

  • is in the right position in regards to V's hands (at least as much as for the Tactician shotgun)

  • all parts and extra meshes show the correct appearances

  • Yes: Search for t0_001_wa_body__t_bug

  • Click on the entry that has no suffixes (_cuff or _tight) to load the model into the 3d viewport.

  • Close the library tab again.

  • If you want to know more, you can read up on the Multilayered shader.
    • Layer 0 will always be applied to the entire suit.

    Click "Apply Edits" (4)

    )
  • Change more .mlsetup files, or head to Step 4: Importing into Wolvenkit

  • in the path and delete it
    • If the name of the material is mirror_01_300, change it to mirror_01_100

    configured MLSetupBuilder
    Wolvenkit project
    extracted the .mlsetup files
    MLSB troubleshooting page.
    Library tab
    layer mask
    exported your .mlsetup to json
    R&R: Troubleshooting
    This is how you identify a custom material. Read custom material paths on what to do.
    This is how custom materials currently look in the preview. (MLSB 1.6.7)
    Step 3: Recolouring
    Custom material paths
    Step 4: Importing into Wolvenkit
    The essential tool for all Cyberpunk modding. Nightly is preferred (and what this guide has been made with), but stable works just as well with newer versions (older versions will have errors).
    thisarrow-up-right
    file-download
    36MB
    NVIDIA_Texture_Tools_2023.2.0.exe
    arrow-up-right-from-squareOpen
    How the Project Explorer should look like right now.
    An example to show the current workspace should look like.
    Settings for the Color Space Transform node.
    How the workspace should look like after using the ACES method.
    The workspace after following the directions for the LogC3 method.
    The LogC4 LUTs we will use.
    How your workspace should look like, including the CST settings.
    Your workspace after this method. It's easy and minimal, but has very low contrast.
    The color cube after saturation compression.
    ACES method after gamma correction.
    LogC4 after gamma correction.
    Gamma corrected RCM method.
    NVTT correctly set up with the RCM (Resolve Color Managed) LUT in it.
    Settings set up correctly.
    Changing the texture type.
    Vanilla
    RCM
    ACES
    LogC4
    ARRI LogC3 method
  • WolvenKit: 8.7.1-nightly.2022-11-06arrow-up-right (but anything > 8.7 will do)

  • MLSetupBuilder: 1.6.5arrow-up-right (older versions won't be compatible with WKit 8.7 and game version 1.6)

  • circle-info

    Most items in Cyberpunk are not textured, but use a procedurally generated material consisting out of an mlmask (a list of alpha masks) and an mlsetup (a list of material paths and -colours). There is a section on the exceptions below.

    If you want to learn how mesh material assignment works in general, you can check the corresponding page.

    circle-check

    For an overview of base materials and example files, you can check here.

    circle-exclamation

    If your changes do not become active, you will want to install Material and Texture Overridearrow-up-right from Nexus.

    hashtag
    Step 1: Finding your item

    circle-info

    This tutorial assumes that you already know which mesh and appearance you want to change. If you don't know that, you need to find the correct game file. If you only have a cheat code, see Spawn Codes instead.

    We will use the female variant of the puffy vest (as I've already mapped and documented it):

    circle-check

    Add the item to your project and open it in WolvenKit. You want the original to look up material names, even if you overwrite it with your own mesh.

    hashtag
    Step 2: Finding the correct appearance

    circle-info

    If you don't know which appearance you want to edit, check here.

    default is the fallback appearance that'll be used if anything can't be resolved by name or index. This is the reason why most item swap mods give you only a single appearance - people didn't set up the variants.

    We will change the appearance bwstripes, which is used by Vest_17_basic_01:

    find material bwstripes and remember the name of the chunkMaterial
    circle-info

    chunkMaterials corresponds to the chunkMasks: For submesh_00, the material at array position 0 will be used, for submesh_01 the material at position 1, and so on.

    This vest has only one chunkMask, so there's only one material.

    Remember its name (ml_t2_002_ma_vest__puffy_bwstripes) and find the corresponding material definition:

    circle-exclamation

    Most meshes have their materials under localMaterialBuffer/materials. However, some of them (especially those with physics) use preloadLocalMaterialInstances instead.

    It's ml_t2_002_ma_vest__puffy_bwstripes

    You will (hopefully) see a material with three entries in values (order doesn't matter):

    Key
    Value (DepotPath)

    MultilayerSetup

    base\characters\garment\citizen_casual\torso\t2_002_vest__puffy\textures\ml_t2_002_ma_vest__puffy_bwstripes.mlsetup

    MultilayerMask

    base\characters\garment\citizen_casual\torso\t2_002_vest__puffy\textures\ml_t2_002_ma_vest__puffy_default.mlmask

    GlobalNormal

    base\characters\garment\citizen_casual\torso\t2_002_vest__puffy\textures\t2_002_ma_vest__puffy_n01.xbm

    For the purpose of this guide, all that matters is the mlsetup, which determines all the individual material assignments in this CMaterial. For an explanation of the shader, check here.

    This is the path to the mlsetup file. By editing this, you can change colours and surface materials.
    circle-info

    If you have your own mlsetup file, this is where you need to set tohe path. See custompathing for further details.

    circle-check

    Most materials in Cyberpunk use the engine\materials\multilayered.mt material and assign colours via an .mlsetup file. If you're used to textures, you are probably going to hate this. As somebody who has been where you are: the mlsetup system is cool. Genuinely. Give it a chance!

    hashtag
    multilayered material

    circle-check

    If you would rather use a textured material, check here.

    A multilayered material consists of multiple layers of materials, projected on the mesh through the mlmask: white parts get affected, black parts are blocked out. (Again, for a full explanation, check here).

    circle-info

    You can turn any multilayered material into its cyberspace variant by changing the material from engine\materials\multilayered.mt to base\characters\common\cyberspace\silverhand_overlay_cyberspace_mml.mi

    hashtag
    Exporting the .mlsetup

    We're going to edit the mlsetup file and then import it back, causing a global change in the appearances of every item which uses this particular material file. (If you don't want that, see Custompathing below).

    We do that by editing the MultilayerSetup:

    1. Find the file and add it to your project.

    2. Right-click the file and select "Convert to JSON".

    circle-info

    If you have set configured MLSB, you can make use of MlSetupBuilder's export feature, rather than doing it via WolvenKit:

    Move your new json file in the same folder as the multilayer setup.

    circle-info

    The json file will be named ml_t2_002_ma_vest__puffy_bwstripes.mlsetup.json (originalFileName.originalExtension.json)

    hashtag
    Step 3: Editing the .mlsetup file

    Open up MlSetupBuilder and load your .mlsetup.json file.

    circle-info

    If you select WolvenKit's "Open in File Explorer" option, you can copy the path from the explorer's address bar and paste it into the MlSetupBuilder's address bar.

    If you want to see which layers correspond to which part of the mesh, you can load it from the library:

    Optional: Find your mesh in the library
    circle-info

    This step requires the tool to be set up correctly, which is not part of this guide. Fortunately, it's also optional, as you can tweak values around without seeing the affected areas or material previews.

    Change the colours and materials to whatever you want.

    circle-check

    TBD: Create/link to material description

    Save the file and overwrite the original .mlsetup.json:

    If you have configured MLSB and had both files in the same folders, you will see a notification when the MlSetupBuilder has overwritten your original *.mlsetup. This takes a few seconds.

    Otherwise, you need to right-click on the json file under "raw" and select "import from JSON".

    circle-check

    This is already working. You can pack the project and see it work!

    circle-info

    Since you haven't changed anything in the mesh itself, you can (and should) delete it from your mod. Only keep it if you want to do the steps below.

    hashtag
    Step 4 (optional): Custompathing

    If you want to put up your own .mlsetup, rather than overwriting the original one, you can do that. All you have to do is changing the DepotPaths to the relative path of your mlsetup.

    circle-exclamation

    Keep your folder and file names unique! If you have two mods adding a file at the same location, the second one will be unable to overwrite it and will use the first mod's file. That is, unless your mods are in REDmod format, which will be loaded even later and in order of their folder names.

    Understood? No? That's fine. Just keep it unique. :D

    hashtag
    Step 5 (optional): Renaming materials

    You can rename a material by changing the "name" property inside the CMeshMaterialEntry in the materials array:

    circle-exclamation

    Inside the appearances block, the material assignment to the individual submeshes happens by name, so don't forget to change the chunkMaterial names!

    hashtag
    Step 6 (optional): adding new materials

    To add a new material to a mesh, you need to create two entries. The first of those needs to be in the materialEntries array:

    Edit the new material's index and name. This is crucial!

    Now, add an entry in the localMaterialBuffer.

    circle-info

    If your mesh doesn#t have entries under localMaterialBuffer, use preloadLocalMaterialInstances instead.

    The new material will have the name you defined in the CMeshMaterialEntry in the previous step.

    You can now use your new material just like the regular, old materials.

    pink

    glitch_pink

    violet

    glitch_violet

    turquoise

    glitch_turquoise

    red

    glitch_red

    white

    glitch_white

    yellow

    glitch_yellow

    gold (warm white)

    glitch_gold (warm white)

    black

    glitch_greenblue

    glitch_darkblue

    glitch_matrix

    off

    glitch_redblack

    ArchiveXLarrow-up-right
    Red4extarrow-up-right

    Custom facial piercings - PRC Framework

    Adding custom facial piercings through PRC Framework.

    Created by Mx_OrcBoi

    Published on 12/07/2023

    PRC Framework was created by eagul, he also taught me how to do them, so I'm passing on the knowledge.

    Required:

    Blender 3.5

    Wkit 8.9.1-Nightly

    Level: If you can read and follow instructions you should be ok.

    Disclaimer: The detailed steps show how to place piercings in spots where vanilla ones already are.

    For any other location on the face the steps are slightly different, as you will need to create your piercing on the head mesh and import over head mesh.

    This is explained in a separate section.

    I would suggest trying to create one in an existing location first, so you familiarise yourself with the steps and then play around with different locations.

    hashtag
    Getting started

    1. Download and install the below:

    2. In wkit import the below to your project depending on which V you want to create the piercings for:

    1. Export to GLB so you end up with those files in the raw folder.

    1. Import them into Blender using Cyberpunk GLTF import plugin. In this example I will be working on fV. You should end up with files like this and be able to see the head, vanilla piercings and a set of shape keys.

    Each shape key corresponds with the number on the character creation slider. Basis is 1 on all sliders or no shape keys active. The rest is divided into ears, nose, eyes, mouth and jaw and subsequent numbers correspond to the character creator settings (1x is slider 2, 2x is slider 3 and so on).

    You can see the shape keys actually working by selecting one of them and setting Value to 1.

    For easier selection merge head mesh vertices by distance. To do this, select the head mesh, go into edit mode (Tab) and go to Mesh -> Clean Up -> Merge by Distance. Set merge distance to 0.0001.

    1. Import your piercing mesh. I’ll use the septum half ring as an example. Make sure the mesh is already UV unwrapped if using custom mesh.

    1. Duplicate the vanilla piercing. To do so select it in the viewport (object mode), press shift+D and then click the right mouse button. Hide the original mesh.

    2. With vanilla mesh duplicate selected, go to edit mode (TAB) and press Del -> vertices. You will end up with an empty submesh.

    3. Select your piercing mesh, then Ctrl select newly emptied vanilla submesh. Press Ctrl+J to join.

    hashtag
    Weight painting

    Now we need to either weight paint, or transfer weights if your new piercing is in the same position as vanilla one. Mine is, so I will go over transferring weights.

    You can see the current weights the mesh has in Weight Paint mode.

    I’ve selected the vanilla piercing here. By clicking different vertex groups you can see the colour of the mesh changes. This colour denotes how much influence each bone has on the mesh. Red is 100% and dark blue is 0%.

    1. Go back to object mode if you’re in weight paint mode. Select your mesh and remove all vertex groups.

    1. Go to modifiers (wrench icon) and add Data transfer modifier with below options. The source would be the vanilla piercing submesh that has weights.

    1. Click Generate Data Layers, then apply the modifier.

      You can now see that your mesh has weights the same as vanilla mesh:

    hashtag
    Creating morphtargets (shape keys)

    1. Unhide the head mesh if hidden and make sure no shape keys have value other than 0, then select Basis shape key.

    2. Go to edit mode (TAB) and position your mesh where you want it to be. You can keep the vanilla piercing visible for reference.

      I wanted mine to be a bit further back than the vanilla one, otherwise it clipped with the nostrils.

    1. Now go through all the nose shape keys and position your mesh in the best position for each. You can set the value of the corresponding shape key on the head and vanilla piercing meshes to 1 for easier positioning (to do that come out of edit mode back to object mode) - if you do that, make sure you’re not setting any shape key to 1 on your new piercing mesh, they all have to stay 0. If creating nose piercing you only need to go through all the shape keys with nose in the name, if creating earring, go through ear shape keys and so on. No need to go through other, like for example eyes for a nose piercing.

    2. Delete all unnecessary meshes if you have them, like head reference. Also delete the original piercing submesh, so only yours is left and rename the submesh accordingly (it should be something like submesh_00_LOD_1 and not something like submesh_00_LOD_1.005)

    hashtag
    Exporting the mesh from Blender and importing in Wkit

    Once you’re done export your mesh as gltf 2.0 with below settings. Save it over the glb exported in wkit.

    If your piercing is influenced by more than 4 bones, also include this option on export.

    Next import it in wkit.

    hashtag
    Creating the mod

    1. Add to project a morphtarget from PRC or create folder structure manually. They need to be named exactly like this, do not create a custom folder.

    1. Now rename the morphtarget you imported from blender to whichever slot you want to use. The number will correspond to the slot. It does not matter which you use really, but if you want your mod to be compatible with any specific set of piercings made by someone else, check what slot they used and use different.

    2. Move the file to eagul/piercingmorphs/.. (if you added to project a morphtarget from PRC to create the folder structure, delete it first, just leave empty folder before moving your new renamed morphtarget).

    1. Now you can delete the character folders in base and install the mod.

    Naming is important, your mod needs to load before PRC, so it is best to follow PRC’s naming convention: PRC_f/m_slot#.

    To test your mod, set piercings to slider 12 for fV or 14 for mV and you should see your creation.

    hashtag
    Supplement for creating piercings in non-vanilla locations

    1. You can only export the head morphtarget as it is the only one we’ll need.

    1. Import selected one into Blender, merge by distance, duplicate the mesh and delete all vertices from your duplicate in edit mode. This is similar to points 4-8 from the first section of the guide, except we’re working just with head mesh, not piercing meshes.

    2. Weight paint your piercing. Since the location is not covered by any vanilla piercing, transfer the weights from your head mesh. Delete unused vertex groups (the ones that do not affect your piercing, ie have 0 weight). Since piercings are solid objects we don't want them to stretch, so go through the vertex groups that affect your piercing in weight paint mode and colour them in one sold weight colour (you can use the picker to pick one from somewhere around the middle of the mesh).

    Change the path to: eagul\piercingmorphs\wa_linked.mesh for fV eagul\piercingmorphs\ma_linked.mesh for mV

    If you ever need to re-export your mesh again for editing you’ll have to change this back to the original path.

    Now install your mod and enjoy.

    Appearances: change the looks

    Changing an NPC's default appearances (and adding more via AMM)

    circle-info

    If you want to create a custom NPC from scratch, look here.

    You can find another guide about this linked on the Community Guides page (direct link)arrow-up-right

    Created by @manavortex Published December 27 2022

    This guide will walk you through editing NPC appearances for Cyberpunk 2077.

    If you want to create your own custom NPC, see .

    It uses the following versions:

    • Cyberpunk 2077 game version >= 1.6

    • >= 8.7.1-nightly.2022-11-04

    • (only if you want to add new appearances) >= 1.15

    circle-info

    Assumed skill level: You're able to read.

    hashtag
    The .ent file

    The game's first point of contact is the .ent file. You can find it by searching WolvenKit like this:

    If you come up blank, try around with variations. E.g., Johnny is "silverhand", Viktor is "ripperdoc".

    circle-check

    You don't need to add the .ent file to your project, unless you want to .

    However, the file contains the path to an .app file. Find and add it to your project.

    circle-info

    Major NPCs have their own .app files: base\characters\appearances\main_npc\.

    Others are not so lucky - e.g., Mamá Welles is lobbed in with the other valentino goons: base\characters\appearances\gang\gang__valentinos_wa.app

    hashtag
    The .app file

    The array appearances will contain a list with every appearance that's defined for this NPC, matching the key appearanceName in the .ent file.

    circle-info

    Not all of these have been "published" (as in "hooked up to .ent files"). For an example of this, check base\characters\appearances\citizen\citizen__children_mc.app

    The only thing you need to care about is the components array, where you can add, remove, or modify parts of an NPC's appearance:

    circle-info

    The names of components need to (read: "should") be unique so you can .

    CDPR's style of unique naming allows us to find components and their usage across the game files, which will come on handy when we're trying to add items.

    This is where the magic happens.

    hashtag
    Changing and removing components

    Change items by selecting a or a :

    Remove items by deleting their entries from the list:

    hashtag
    Animations: if you can't avoid them, copy them as well!

    Anything of the type entAnimatedComponent means that components are animated. That's mostly the case for physics-enabled stuff influenced by gravity, such as coats, jackets, or long hair.

    circle-info

    Physics gave us the atomic bomb. (It also gave us computers, but this is besides the point right now.)

    Animations are usually unique to meshes on a by-pixel basis and do not react kindly to edits or swaps. (Try splitting the obi from Saburo's kimono into its own submesh if you don't believe me).

    If you copy an animated component (e.g. Johnny's vest), then you need to copy the corresponding entAnimatedComponent as well, or the mesh won't move.

    circle-info

    If you delete a physics-enabled component, you can safely delete the corresponding AnimatedComponent.

    hashtag
    (Safely) adding components

    circle-info

    If you want to exchange an NPC's hair, check .

    The obvious thing to do if you want to add a new item is to duplicate another component and then act as if it was just another change:

    And this might work. Or it might end up leaving them standing in an exploded pixel cloud. In case of animated components, editing them will almost certainly break them.

    triangle-exclamation

    Anything of the type entGarmentSkinnedMeshComponent will not take kindly to manipulation.

    In that case, you need to browse the files for any occurances of the component you want to add and copy the relevant components. For example, if you want to put Johnny into a different kind of vest, this is how you'd go about it:

    1. Search for the mesh name of the vest that you want to use (e.g. ma_vest__high_collar*.mesh)

    2. Select the mesh, then "find files using this": If you run into an error, make sure that you have the "Wolvenkit Resources" plugin installed!I

    3. Find an .app file that looks promising - for example Scorpion's: Open it without adding it to the project (you don't need the file).

    circle-check

    Save the .app file, pack your mod, and go testing!

    hashtag
    Adding new appearances

    circle-exclamation

    This part of the guide requires

    Adding a new appearance to AMM requires you to register it in three files:

    1. the .lua

    2. the .ent

    3. the .app

    If you are using HotReload, don't forget to "reload all mods" to make AMM pick up the changes in the script.

    hashtag
    The .lua file

    To tell AMM about your new appearances and make them available, you have to create a LUA file in the following folder: Cyberpunk 2077\bin\x64\plugins\cyber_engine_tweaks\mods\AppearanceMenuMod\Collabs\Custom Appearances. Let's call it AMM_JohnnyTutorial.lua.

    Give it the following content:

    triangle-exclamation

    The entity_id is unique for each NPC and tells AMM which file to load.

    You can find the correct entity ID by looking at the character with AMM:

    circle-info

    If the NPC doesn't yet exist, you can create a custom entity. For an example file, check one of .

    Now, we have to hook up the new appearances.

    hashtag
    The .ent file

    Find the .ent file that you've identified in the , and add it to your WolvenKit project. Open it, then duplicate the last item in the appearances array. Now, change the new entry to match your custom appearance:

    hashtag
    The .app file

    In the app file, duplicate one of the already existing appearances, and change the name of the new item to the one you specified in the .ent file:

    circle-check

    Congratulations — that's it! Install your mod and go testing!

    hashtag
    Troubleshooting

    hashtag
    My new component won't move at all!

    You may have forgotten to copy the animation file. Look for an entAnimatedComponent inside the .app — they're usually called something like xxx_dangle(s) or collar.

    hashtag
    I added an appearance, but a random one is showing when I select it

    That's what happens when the game can't find the appearance you picked. You're probably trying to add an AMM appearance. Check the spelling between your lua file with the appearance name, the mapping entry inside the .ent, and the appearance's name in the .app file.

    hashtag
    For further troubleshooting steps, see .

    Head file paths

    AMM: Collab anims/poses

    How to add your poses to AMM

    hashtag
    Summary

    Created by @manavortex Published April 16 2023

    hashtag

    NPV: Creating a custom NPC

    Step 2: How to create a custom NPC

    hashtag
    Summary

    Created by @manavortex Published May 13 2023

    circle-info

    Self-made normal maps

    How to create normal maps (bumpmaps) with Blender

    hashtag
    Other guides about this:

    by Тима (Teem)#3118

    hashtag

    R&R: Refitting (step by step)

    Step-by-step guide on refitting a mesh - for newbies!

    This page is a subsection of the . It will teach you how to do custom refits in Blender.

    hashtag
    Assumed level of skill:

    You know how to read — if you can read and struggle with this guide, then it's not yet good enough. Please reach out to on so that I can improve it.

    before: base\surfaces\materials\glass\mirror\manavortex\mirror_01_300.mltemplate
    after: base\surfaces\materials\glass\mirror\mirror_01_100.mltemplate
    base\characters\garment\player_equipment\torso\t2_002_vest__puffy\t2_002_pwa_vest__puffy.mesh
    By doing step 7 and 8 you’ll end up with your mesh having the correct bones for where it is placed.

    The result should be like this:

    Once you’re done with the weight painting proceed to creating your shape keys as in the morphtarget creation section of this guide. You can use your original head mesh as reference. Tip: If you want to test if your mesh works ok before going through all shape keys make sure you create at least one, otherwise it will flatline your game. Creating means moving at least one of the shape key positions to where they should be, not at the same position as the basis shape key.
  • When done, delete the original head mesh and rename your own submesh. It should be called submesh_00_LOD_1.

  • Export your file to gltf with the same settings as in the guide.

  • Import your file in wkit over the existing head file, place in the correct folder and rename to whichever slot you’d like to use.

  • Open your morphtarget and edit the path in this section:

  • https://www.nexusmods.com/cyberpunk2077/mods/8590 arrow-up-right
    https://www.nexusmods.com/cyberpunk2077/mods/7179 arrow-up-right
    Files for mV
    Files for fV
    I’ve hidden the rest of the piercings for visibility, only leaving the one that will help me to adjust the position.
  • Find and select the components in the other NPC's appearance list:

  • Select "Copy Selection From Array/Buffer"

  • Go back to your original .app file and select either the "components" array or any component inside it. Now right-click and select "Paste Selection From Array/Buffer".

  • If you haven't done that yet, delete the original component(s) and animations:

  • appearanceName

    cyberspace_glasses

    name

    silverhand_cyberspace_glasses

    here
    WolvenKitarrow-up-right
    AppearanceMenuModarrow-up-right
    add more appearances
    manipulate them outside of the .app file
    different appearance
    different mesh
    here
    Appearance Menu Modarrow-up-right
    thesearrow-up-right
    modsarrow-up-right
    first step of this guide
    (See here)
    here
    If you are using Appearance Menu Modarrow-up-right, this list will look familiar.
    Wake up, Johnny! … Follow the white rabbit, Johnny!
    no more ring!
    Any of these are an indicator that there is TROUBLE
    This is usually safe, as long as you are sticking to entSkinnedMeshComponents.
    leave the rest alone, unless you know what you're doing
    You can now change components around as specified above!
    Versions:

    Wolvenkit

    >= 8.9.0 (or whatever works for you)

    AppearanceMenuMod

    >= 2.2 (earlier versions won't support this)

    This guide will teach you how to add custom animations to AppearanceMenuMod's Pose tab.

    Difficulty level: You're able to read ;) You don't even need to know your way around Wolvenkit for this one!

    triangle-exclamation

    This guide will teach you how to hook up an existing .anims file to AMM. If you don't have one yet, you can learn how to make your own.

    To add poses to photo mode, check ArchiveXL: adding Photo Mode Poses.

    circle-info

    This tutorial will use animation and pose interchangeably. An animation is simply a pose that moves.

    hashtag
    Getting started

    Create a new Wolvenkit project and download the prepared files from mana's mega, either

    • the source folderarrow-up-right for a working project that you can use immediately

    • the filesarrow-up-right to set up your own structure and start from scratch

    The screenshots show the example project, but it's absolutely no problem if you set up everything on your own: the guide will tell you which path goes where.

    circle-check

    If you have downloaded the example Wolvenkit project, you can start it (the "Install" button has an "Install and launch" option in the dropdown) to see everything in action: - Spawn an NPC (generic male or female) - Switch to the Poses tab - Find the Netrunner making AMM mods category and select one of the poses - Your NPC should now move!

    hashtag
    Connecting the files

    Start by customizing your file structure. If you leave it as it is and publish the mod and somebody else does the same, only one of the two will work. Create a folder structure that is unique to you.

    circle-info

    It is good practice to leave base for the game files, and simply have a folder with your username at the root level of archive.

    triangle-exclamation

    Your file structure must not contain spaces, capital letters, or any funky characters, or the game might not find your files. Stick to a-z, 0-9, - and _, and you're safe.

    hashtag
    File structure: The .lua

    1. Rename your_optional_subfolder to something you want to group by, e.g. your username. You can also remove it, we only need the file

    2. Rename amm_tutorial.lua to something that identifies your pose pack, e.g. netrunner_coding

    3. Open the file in a text editor. Let's look at the entries (we'll ignore anims for now and look at it in the second part about customizing animations):

    1. Change modder to your name so people know who made this.

    2. Change category to the name of your pose pack. This will be used for AMM to sort your poses into categories, which people will use to browse, so don't go overboard.

    3. Change entity_path: Right-click on your .ent file in WKit and select Copy relative Path and paste it into the lua. Don't forget the duplicate \.

    hashtag
    File structure: The .ent

    Open the components array, find the component with the name of amm_workspot_collab, and set the depotPath of workspotResource to the relative path of your .workspot file.

    Do not change anything else — we're done here.

    hashtag
    File structure: The .anim

    circle-info

    You don't need to change anything here yet, we'll be doing this in the next step.

    An .anims file is targeting a specific rig and holds a list of animations. These hold the pose data; they're what you overwrite when importing from Blenderarrow-up-right.

    hashtag
    File structure: The .workspot

    Scroll to the bottom of the file and find the node named workspotTree. Open it and find the list finalAnimsets.

    Each of the workWorkspotAnimsetEntries inside finalAnimset connects animation files and rigs.

    circle-info

    You can delete entries if you don't have animations for that rig.

    circle-info

    The tutorial version uses the same .anim file for V's first person animations. Looks weird, but works. You can change it later on your own.

    For each of the entries you keep, make sure that the following paths point at the right animset:

    • animations.cinematics[0].animSet

    • loadingHandles[0]

    circle-exclamation

    If you have launched the game before, make sure to delete the file

    Cyberpunk 2077\bin\x64\plugins\cyber_engine_tweaks\mods\AppearanceMenuMod\Collabs\Custom Poses\your_optional_subfolder\amm_tutorial.lua

    circle-check

    A good time to check: make sure that everything works again and that the files are correctly connected. If not, check the troubleshooting section of this guide.

    hashtag
    Custom poses

    Now that we have the basic structure covered, let's talk about pose names. This time, we start at the end and make our way backwards.

    hashtag
    Custom poses: The .anims

    circle-info

    Files for each type of rig are included in the example files, but you can also find them yourself by searching Wolvenkit for rigName > .anims or character > .anims (e.g. massive > .anims or Smasher > .anims)

    Find and open your .anims file. Here's what you're looking at:

    Open the animations array to see data for all defined animations (poses). You can make more by duplicating them, delete obsolete entries and change their names; any other changes are coming from Blender.

    circle-info

    An animation's name must match the .lua and the .workspot, spelling mistakes will break it. They must not contain spaces, use _ instead. AMM will take care of that for you.

    hashtag
    Custom poses: The .workspot

    Open your .workspot file and expand the following nodes:

    • workspotTree

      • rootEntry

        • list

    First, we're going to look at workSequences.This data type is used for pose transitions and -definitions (e.g. an NPC standing up). For our purpose, we don't need any of the fancy stuff.

    While this list in the example file contains two workSequences, you're gonna need one per however many animations/poses you have. Duplicate to your hearts content.

    Here's how a workSequence looks. Note the duplicate ID property - and each of those has to be unique!
    circle-info

    You need one workSequence for each of your animations!

    1. Open the workSequence and expand both id and list.

    2. Expand the first list entry (workAnimClip) and its proprety id.

    3. Point it at the right animation: Change the workAnimClip's property animName to the name of your animation (green on screenshot)

    4. Make sure the IDs in the workSequence are unique. (You can skip this for the two entries from the template - if you continue they pattern they establish, all id's will be incremented and unique.)

      1. Find the workSequence's property id and increment its numeric value +1 from the previous id (orange on screenshot)

    5. To clarify - our first example workSequence had a property id of 2 and its workAnimClip's propery id was 3. Our second example workSequence had a property id of 4 and its workAnimClip had a property id of 5. Therefore, your next workSequence should have a property id

    6. Optional, but recommended: Set the workSequence's property idleAnim to the name of your appearance (purple on screenshot). This is purely for your convenience, as you can see which is which when scrolling through the list.

    triangle-exclamation

    The numeric values for all theid properties - under workSequence and workAnimClip - need to be unique within the scope of the workspotTree. As soon as you have duplications here, things will be out of order.

    hashtag
    Custom poses: The .lua

    As of version 2.2, AMM doesn't know anything about the file structure. For that reason, you need to tell it about the poses you added, and the anims array is how you do that.

    The lists tell AMM which poses belong to which rig, allowing to hide them when they aren't supported. As you can see, it's no problem if there are duplicate names, and you can even reuse entries in the workspotTree — the game knows which animation to use because of the file structure above.

    hashtag
    Troubleshooting

    circle-exclamation

    If you have launched the project in its default state before starting to customize it, delete the file

    Cyberpunk 2077\bin\x64\plugins\cyber_engine_tweaks\mods\AppearanceMenuMod\Collabs\Custom Poses\your_optional_subfolder\amm_tutorial.lua

    circle-info

    A pose gets correctly added by AMM if you see it in the list and can delete it.

    hashtag
    AMM doesn't show my poses

    The problem is in your .lua, AMM fails to pick up the pose information you provided. You can check AppearanceMenuMod.log, which might tell you what's wrong, but it's probably fastest to just start over from the template .lua file.

    circle-info

    Make sure that you don't add or delete any commas or quotation marks.

    hashtag
    I click, but nothing happens (no pose shows up in AMM)

    The problem is between your .lua and your .ent file: the poses were registered correctly with AMM, but Cyberpunk can find nothing to spawn.

    hashtag
    The NPC briefly T-poses, and then the game crashes

    Check your .workspot file for copy-paste mistakes when hooking up your .anim files.

    hashtag
    My custom pose changes are ignored

    The error is between Blender and your .anims file. Double-check names and make sure that you actually imported.

    hashtag
    The wrong pose is triggered

    You messed up the indices in the .workspot file. Go back and make sure that they're all unique.

    As much of the information here has been documented in other guides, the information below will be kept initially brief. Might write more to a later point, but there is a lot of documentation already.

    This page is a part of the NPV guide. It will show you how to use the provided example project to create a custom NPC for Cyberpunk 2077, whom you can then spawn with AppearanceMenuMod.

    circle-info

    This guide assumes that

    • you already have a head mesh (see this section otherwise)

    • that you're using a set of default paths (if not, read the last paragraph of this box)

      • the corresponding files are in either of these folders tutorial\npv\your_female_character\head tutorial\npv\your_male_character\head

      • the meshes are named like their in-game equivalents, e.g. h0_000_pwa_c__basehead.mesh

    It's not a problem if you use your own custom paths, although it is easier to . If you decide to go for it, keep in mind that your paths are different and that you need to put different values into the provided .ent and .app file.

    circle-check

    At any time during the tutorial, you can install the Wolvenkit project (Wolvenkit has a button in the toolbar) and spawn Tutorial Man and Tutorial Woman via AMM to check out your progress.

    hashtag
    Skipping and skimming

    This guide contains as little fluff as possible. Extra information

    hashtag
    The .lua file

    We're registering our NPC with AppearanceMenuMod via a .lua file, which needs to end up in AMM's Custom Entities folder. The full path in the Cyberpunk directory will be this:

    bin\x64\plugins\cyber_engine_tweaks\mods\AppearanceMenuMod\Collabs\Custon Entities

    I have prepared two example files in the Wolvenkit's project's resources. Delete the one that you aren't using, then let's take a look at the other one:

    tutorial_custom_female_character.lua

    tutorial_custom_male_character.lua

    hashtag
    The file structure

    This is the file content for the female example:

    It loads our root entity from tutorial\npv\your_female_character\ops\your_female_character.ent. That's the file which tells the game what to load.

    circle-check

    You can and should change this file — see the inline documentation above for what to change.

    hashtag
    The root entity

    You find the root entity for your character here:

    circle-info

    Would you like to know more?

    The root entity hooks up your .app file and the appearance names in the .lua file, and that's about everything there is to say about it. Here's how it looks:

    Adjust entries as needed. If you want to
    circle-check

    If you want to add more appearances:

    • duplicate an existing entry

    • change the last key name to match the one in your .lua

    • change the first key appearanceName to the one you want to put in your .app

    Let's look at the .app file now.

    hashtag
    The app file

    This section will tell you how to edit your NPV's appearance – their skin colour, chrome, piercings, tattoos. We will do this in the .app file.

    triangle-exclamation

    When changing component names, you want to leave the (t1_) in place — the game needs them to calculate collisions!

    This is where all of your NPC's appearances are defined (appearanceDefinition, linked to the root entity via name). The appearanceDefinition's components define your NPV's properties, pulling in equipment, facial expressions, hair and skin.

    circle-info

    Would you like to know more?

    It looks like this:

    Before renaming
    circle-check

    The next section, How do I know what to put?, will help you find the right appearance names.

    If you feel completely lost, you can read up on how to change NPC appearances – the concept is exactly the same.

    circle-check

    If you want to add another appearance

    • duplicate an existing entry

    • change the key name to match the one in your root entity

    • change the components

    hashtag
    How do I know what to put?

    To find out which variants and appearances to use, I suggest that you use NoraLee's excellent NPV Part Pickerarrow-up-right. It will look like this:

    Find it at
    circle-check

    The NPV picker does this for you, but here's how to select your eyebrow appearance by hand:

    • open up the mesh file and expand the first list appearances

    • see a bunch of entries with naming schemas like colour_01

    • the numbers correspond with the type of eyebrow in the character editor (look them up )

    • Select the correct colour and appearance number

    hashtag
    Customizing Cyberware

    circle-info

    If you skip this step, you will end up with invisible cyberware or the wrong colour/appearance.

    When selecting a different cyberware than the preconfigured one, you have to set the appearance name, or the whole thing will show up in grey. The appearance names are usually identical to the cyberware (cyberware_01, cyberware_02 etc.), but if you are uncertain, you can also open the mesh file and check the appearances list at the top.

    hashtag
    Customizing piercings and chrome: Chunkmasks

    circle-info

    If you skip this step, you will end up with the wrong or too many piercings and cyberware.

    You have the full piercing or cyberware file, but you're only using parts of it — yet the game stubbornly shows you the whole mesh.

    Fortunately, you don't have to edit it in Blender, because you can hide the parts you aren't using via chunkmasks. Find the piercing or cyberware component in your .app file:

    This is where you can turn off submeshes

    hashtag
    How do I know which numbers to put?

    You can see that inside the .mesh file (which you can see in the component's depotPath). Open it in Wolvenkit, then switch to the Mesh Preview tab and toggle the checkboxes on the right; those directly correspond to the boxes you need to uncheck in the .app file:

    Here we see the indices of these three submeshes: this is what we need to uncheck in the .app file

    To hide those bits in the .app, we simply need to uncheck the corresponding boxes - check the previous screnshot!

    hashtag
    Hair

    This section will teach you how to add another hair mesh to your NPV. We will first remove the default hair, then replace it with the one you want.

    circle-info

    To use modded hair, find the correct files inside the mod and add them to your project.

    1. Delete the current hair from the .app — there should be 2-3 components, their names will start with either hair_ or hh_0

    2. Find the correct hair mesh. You have three options for this:

      1. Looking it up on

      2. Using

      3. Filtering the files and clicking through their previews: female: base\characters\common\hair > wa_ > .mesh > !shadow male: base\characters\common\hair > ma_ > .mesh > !shadow

    3. Enter the name of the hair mesh that you want to use into the Asset Browser's search bar (see next screenshot) and hit Return.

    4. Once you have found the correct mesh file, right-click it and select "Find Files Using This":

    1. This will give you a list of files, which you can mostly ignore. The only thing we care about is the hair's .ent file:

      This is how you find the hair's .ent file
    2. Open the .ent file and expand the components array. You will find three components in there, which you can now copy over to your .app!

    hashtag
    And that's the gist of it!

    Go forth and create custom apperances!

    You can check this guide, or look through the .app files for other NPCs for ideas. If you need further details, I highly recommend checking out NoraLee's much more detailed tutorialarrow-up-right, which will also give you all the context you could possibly need.

    For guides on how to export a whole animated character to Blender, you can check herearrow-up-right.

    triangle-exclamation

    Please remember that before sharing your NPV, you have to change the paths! You can find a full guide on the fastest way to do that here.

    circle-check

    Don't forget, you can pack the Wolvenkit project by pressing the green button in Wolvenkit's toolbar, spawning Tutorial Man and Tutorial Woman via AMM to check out your progress.

    Summary

    Created by @manavortex Published January 06 2023

    Version

    >= 3.3

    Assumed skill level

    • You know what a is

    • You're able to draw stick figures

    • You are not afraid of Blender

    circle-info

    If you don't have Photoshop, Photopea offers almost the same thing online for free.

    circle-info

    For a free tool for faster normal baking, check out xnormalarrow-up-right.

    hashtag
    Step 0: Preparing the viewport

    1. Export your mesh from WolvenKit

    2. Import it into Blender

    3. Select the object

    4. Pick a material:

    5. Switch to the "Shading" perspective and add an "Image Texture". Select your image by clicking the corresponding button:

    6. The viewport should already be set to "Solid". Click on the dropdown arrow next to the options and select "Texture" from the list.

    You will now get the selected texture directly as an overlay.

    hashtag
    Step 1: The Displacement Map

    As the first step, we create a Displacement Maparrow-up-right for our 3d object. This black and white image will turn your mesh into an object with actual (simulated) depth, which we will then "bake" into a normal map.

    image source:

    circle-info

    This tutorial won't cover the process of how to draw such a map in-depth, but there will be a few tips how to do that in Blender.

    circle-exclamation

    The displacement image should be saved in 32 bit image depth rather than the usual 8. This will yield better results with the normal maps.

    hashtag
    Texture Paint Mode

    The Texture Paint perspective lets you draw directly on your mesh's surface:

    You will probably want to fix this up in Photoshop (Photopea).

    hashtag
    UV edit mode

    To see how the mesh is projected on your image, you can check out the UV edit mode.

    Switch to "Edit" (shortcut: Tab) and select all vertices (shortcut: ctrl+A). You will now see them projected on the texture:

    circle-info

    Feel free to change the UV mapping. You can export this back into Cyberpunk!

    hashtag
    Step 2: High Poly and Low Poly meshes

    Once you are done with your displacement map and the UV mapping looks like you want it to, it's time for the next step: projecting!

    circle-exclamation

    Take your displacement map and create a slightly blurry version of it. This will prevent artifacts on the normal map, as the algorithm doesn't like perfectly straight edges.

    circle-info

    I create a duplicate of my entire armature, just to make certain that I don't accidentally overwrite anything I want to keep. Only work on the new object, since we're getting destructive here.

    1. Make sure that your viewport is in Object Mode

    2. Select all objects that you want to go on the same normal map, then join them together (shortcut: Ctrl+J).

    3. Create a duplicate of this mesh (Ctrl+D, ESC to stop moving), then rename that to "Low Poly".

    4. Select the mesh you duplicated and rename it to "High Poly".

    5. Open the "Modifiers" tab and assign the following modifiers after the armature modifier (check screenshot in Step 6)

      1. Generate -> Subdivision Surface Levels Viewport: 2 or so Render: As many as Blender lets you get away with without crashing, I used 7 Advanced: UV Smooth: Keep Corners, Junctions Boundary Smoothing: Keep Corners

    6. For the "Displace" Modifier, create a new picture, then click on the two sliders to show this texture in the textures tab

    7. Load your blurred texture:

    circle-check

    If you hide your "Low Poly" mesh, the modifiers should now let you see creases on your high poly object! Exciting!!

    circle-info

    The normal map will only care for relative depth, so keep the creases on your mesh shallow. If you make them too sharp, this can lead to artifacts on the baked normal map.

    hashtag
    Step 3: Prepare the material

    Switch to the "Shading" perspective again. Add another image texture and create an image with your target resolution. Call it "Bake" or whatever.

    Remove the link to your material's normal input - otherwise, it'll bake your normal map into your normal map, and the results won't be pretty.

    hashtag
    Step 4: Prepare the low poly mesh

    The high poly mesh needs to be completely covered by the low poly one, like plastic wrap. If that isn't yet the case, you can inflate your low poly mesh:

    1. Set the viewport to Object Mode

    2. Select the Low Poly mesh

    3. Switch into Edit Mode (tab)

    4. Select all vertices (ctrl+A)

    5. Fatten (Alt+S, adjust amount of fattening via mouse)

    6. Fix up whatever parts didn't fatten correctly by hand.

    hashtag
    If your mesh inflates asymmetrically

    1. Undo your action and select all vertices again.

    2. Put the 3d cursor in the center of the selected vertices: Right-Click -> Snap Vertices -> Cursor To Selected

    3. Set the Pivot Point to 3D cursor (Shortcut: . (dot), Numpad 6)

    4. Fatten again!

    hashtag
    Step 5: Baking

    triangle-exclamation

    In Blender, the "active" object is the "previously selected" one. Select your meshes in the following order:

    1. Low Poly

    2. 2. High Poly

    Find the "Render Properties" tab.

    1. At the very top, set "Device" to "GPU Compute" (unless you'd rather bake on your CPU)

    2. Scroll down all the way to "Bake". Configure it like this:

      1. Bake Type: Normal

      2. Influence / Space: Tangent

      3. Selected to Active: Checked

      4. Extrusion: 0.04 m If your generated normal map shows artifacts, try tweaking this.

      5. Max Ray Distance: 0.04 m If your generated normal map shows artifacts, try tweaking this.

      6. Output / Target: Image Textures

      7. Clear Image: Checked

      8. Margin / Size: 16px (or whatever suits you)

    3. Save. Your. File.

    Things are looking like this now? Great, then click "Bake"!
    circle-info

    Baking takes time (several minutes) and most of your PC's free resources. This is normal.

    If everything went well, the image editor on the bottom left will change and display your normal map.

    A normal map with no artifacts or distortions: this is the kind of result we want.

    You can export the image via the hamburger menu in the image editor (bottom left panel of the screenshot).

    hashtag
    Troubleshooting

    circle-info

    This troubleshooting section is for the baking process — the one for normal map textures is here.

    hashtag
    My normal map has yellow stripes!

    Make sure to remove the normal mapping from your material.

    hashtag
    My normal map has yellow spots!

    circle-check

    First of all, make sure that all your normals are pointing the right way. In the viewport editor, click the "Show Overlays" button and select "Geometry -> Face Orientation" near the bottomn. Blue means outside, red means inside.

    The baking process works by capturing the rays of light that bounce between the high poly mesh and the low poly mesh. If you have artifacts, then some of those rays bounced off something else first, which makes them register as inverted. That's the reason why steep creases are a problem — a ray of light might get caught in there and be flipped around.

    Check the troubleshooting step for artifacts.

    hashtag
    My normal map has artifacts!

    • Make sure your displacement map (the one used by the modifier) is blurred.

    • Try lowering the strength of the Displace modifier on the High Poly mesh, making the creases more shallow.

    • Try changing Extrusion and Max Ray Distance in the Bake settings.

    • If that doesn't help, you could try a , or otherwise hit Google.

    hashtag
    Blender complains about my meshes

    Restart Step 4 and make sure that you haven't deleted or altered any vertices, other than scaling/inflating the low poly mesh.

    Google Docarrow-up-right
    hashtag
    Time to complete:
    • < 1h for import, export and setup (< 5 min once you know how it works)

    • as long as you want on the actual editing

    circle-info

    You don't need the Wolvenkit Blender Add-onarrow-up-right for this, but it is really cool, and if you want to keep editing Cyberpunk stuff, you should definitely install it.

    hashtag
    Step 1: Adding the meshes to your project

    hashtag
    The body

    First, you need the mesh of the body that you want to refit for. (Technically speaking, you could do without, so if you like suffering, go ahead and skip this step.)

    There are two ways of acquiring the body mesh:

    hashtag
    From Nexus

    Check the Nexus page of the body mod you're using — there's a good chance that the modder is simply offering a resource that you cna import into Blender.

    hashtag
    From the mod itself

    It might be easier and faster to simply export the base body.

    1. Switch to the Mod Browser

    2. In the Wolvenkit search bar, find the base body mesh:

      • Female body gender: base\characters\common\player_base_bodies\player_female_average\t0_000_pwa_base__full.mesh

      • Male body gender: base\characters\common\player_base_bodies\player_man_average\t0_000_pma_base__full.mesh

      • Anything else: Check or go hunting - here's the !

    3. Check the preview to make sure that you're grabbing the right mesh, then add it to your project by double-clicking or via context menu.

    hashtag
    The suit

    1. In the Mod Browser, now search for the following files:

      • female body gender: manavortex\torso\netrunning_suit\meshes\pwa_netrunning_suit.mesh manavortex\torso\netrunning_suit\meshes\pwa_emissive.mesh

      • male body gender: manavortex\torso\netrunning_suit\meshes\pma_netrunning_suit.mesh manavortex\torso\netrunning_suit\meshes\pma_emissive.mesh

    2. Add them to your project by double-clicking or via context menu.

    3. If you don't want to use the emissive mesh, you can delete it now.

    hashtag
    Step 2: Exporting the meshes from WKit

    The whole process is explained here.

    TL;DR:

    • Find "Export Tool"

    • Select the mesh(es) you want

      • Body

      • Netrunning Suit

      • optional: emissive submesh

    • Click Export button

    In Wolvenkit, switch to the raw folder (or scroll all the way down). Right-click on the glb file, and select "Open in File Explorer":

    hashtag
    Windows Explorer Path

    You will now see a Windows Explorer window. Copy the file path like this:

    Alternatively, you can also navigate Blend

    hashtag
    Step 3: Importing to Blender

    circle-info

    You might see the submesh and armature numbers changing through the guide. That is to keep you on your toes because I didn't take them in one setting, and also because they don't matter - any number from .001 to .999 will be removed on reimport with Wolvenkit.

    Open Blender and create a new file. You will probably be greeted by a bunch of standard objects that we need to get rid of:

    Now, let's import our meshes.

    From the "File" menu, select "Import" and then one of the entries for "gltf":

    You will now see a file picker.

    1. In the path bar at the top, paste the path from the previous step.

    2. Select the mesh(es) that you want to refit, and import them

    3. Now, repeat the process with the body mesh. If you don't know where it is, you can find it here (.. means that you need to co up a directory from the one with the netrunning suits): ..\..\..\..\base\characters\common\player_base_bodies\player_female_average\t0_000_pwa_base__full.glb

    4. If you have imported without the plugin, you will see something like this and need to hide the armatures. If you have imported with the plugin, it will already have done that for you.

    circle-info

    You are currently in Object Mode, which will let you select whole objects.

    1. Change the colour of the body mesh to better see clipping (see the next screenshot for details):

      1. Click on the body mesh, or find it in the Scene Collection under its armature parent, and select it there.

      2. Select the "Material Properties" tab in the right sidebar (a round red icon near the bottom at the list)

      3. Click on "Use Nodes" to uncheck it

      4. Set a base colour that is not white to see clipping

    hashtag
    Step 4: Refitting

    We will use the Proportional Editing mode here. If you don't vibe with that, you can read up here on other approaches for refitting, or refer to the community guides section.

    circle-info

    Proportional editing will leave the garment supports intact, preventing the risk of string cheese.

    1. While still in Object Mode, expand both armatures (not the one with the body) and select all included meshes.

    2. Switch into Edit Mode by hitting Tab or selecting it from the dropdown at the topleft

    3. Turn on "Proportional Editing" by checking the round button at the top of the viewport

    1. Hide the body mesh by shift-clicking on the body armature's eye icon twice: it's in the way, and we need to select some vertices.

    Shift-click will hide the entire armature and its children.
    1. Make a selection — somewhere close to the future highest point.

    1. Show the body mesh again:

      1. Shift-click on the eye icon next to the body armature to show everything

      2. left-click on the eye icon (no shift, just a regular click) to hide only the armature)

    hashtag
    The tools

    We will use scaling (shortcut: S) and movement (shortcut: G).

    • You can lock the axis on which you are moving by pressing X, Y or Z

    • You can scale the strength of the proportional modifier by using the mouse wheel — but only after you have a tool selected.

    I'm afraid that this is where you draw the rest of the owlarrow-up-right - you need to refit the suit. Try playing around with the settings. For example, you can start by pressing G - Y to let out the chest, then try scaling.

    Do this until you have covered all skin that you don't want exposed. Now it's time to export our edited meshes, and import them back.

    circle-info

    Pro tip: Keep the .blend file open until you have seen the refit in action. It's quite likely that it still clips somewhere and that you'll have to get active again.

    hashtag
    Step 5: Exporting

    1. Switch back to Object mode by pressing Tab

    2. select all meshes under one armature (e.g. the emissive meshes)

      • If you are exporting without the Wolvenkit Plugin, select the armature as well.

    3. From the menu, select File -> Export

    If you are exporting without the Wolvenkit Plugin, find the correct settings in the , then check Selected Only.
    1. Overwrite the file you originally imported from (pwa_emissive.glb)

    2. Repeat the process with the other armature.

    hashtag
    Step 6: Importing into Wolvenkit

    circle-info

    As of 8.9.1, Garment Support is still experimental. If your meshes look like string cheese or twitch all over the place, you can delete the parameters. That will destroy the automatic deform when you put a jacket on, but at least your mesh will work.

    1. In the Import Tool, select the first file that you want to import, then check the Import Garment Support box.

    2. Do the same for the second mesh. (As of 09/09/2023, the emissive component doesn't have garment support, but eventually I will make this work)

    3. Import both glb files.

    hashtag
    OK, what now?

    Time to test! Install and launch your Wolvenkit project:

    If you did everything right, your refit will now be active. If not, it's troubleshooting time.

    • Check the Export/Import guide for step-by-step instructions

    • If anything is wrong with your mesh, head to Troubleshooting your mesh edits

    • Check R&R: Troubleshooting for tutorial-specific issues

    Otherwise:

    circle-check

    Happy modding, choomba!

    hashtag
    Troubleshooting

    As of now, there are no problems limited to the scope of this guide. You can find the general troubleshooting for 3d edits and -imports under Troubleshooting your mesh edits.

    Netrunning Suit guide
    Discordarrow-up-right
    mana vortex

    Influencing other items

    PartsOverrides, visual tags, and how to use them

    hashtag
    Summary

    Created by @manavortex Published November 12 2022

    hashtag
    Requirement: ArchiveXL >= 1.1.6

    This guide will explain how to influence meshes by directly in the .app file, overriding whatever is defined for the components in the .ent file which loads them.

    For even further customization options for wardrobe items, see 's readme.

    hashtag
    PartsOverrides

    circle-info

    This section assumes that you're loading appearance parts via rather than including them as components.

    In the .app file, each appearance lets you define , which — as the name implies — let you override the appearance of parts. An entry looks as follows:

    Where partsValues lets you define the individual entity files that you'll load, partsOverrides lets you assign properties which take precedence over those defined in the .ent file:

    circle-info

    Components need to be unambiguously identified by their name as defined in the .ent file. For that reason, it's good practice to have globally unique identifiers.

    Starting with version >= , ArchivXL can understand the following variables for meshAppearance in appearanceOverrides:

    So depending on your PC's body gender and colouring, the meshAppearance my_app_{gender}{skin_color}_{hair_color} could translate to my_app_w__01_ca_pale__blue_red_ombre.

    hashtag
    Arms

    circle-exclamation

    Due to cyberware, V has more arms than Shiva the Destroyer (although not at the same time). For a full list of component names, see .

    The list below is a summary, but might not be up-to-date. Please refer to the linked page if you're missing anything.

    You can find the corresponding entity files in base\characters\common\player_base_bodies > .ent, the file names will start with a0_.

    hashtag
    Body

    The player base body component name is

    hashtag
    ArchiveXL

    Normally, you can override only components from .ent files that you include via partsValues in the same appearance. ArchiveXL expands this by letting you manipulate any components that are loaded as part of the player.ent:

    To delete an already existing reference, set the numeric value to the right of the depot path to 0:

    hashtag
    VisualTags

    These can be used in addition to PartsOverrides and will let you influence your item even further. You can find an array named visualTags.tags in both the root entity and the .app file's appearances.

    circle-info

    This mechanism is how e.g. your sunglasses disappear when you put on a helmet.

    circle-exclamation

    Visual tags in the root entity will get applied to every appearance in the app.

    However: Due to technical limitations, any visual tags that hide parts of the mesh must go into the .app file to take effect.

    hashtag
    ArchiveXL

    The following tags are used by the base game; however, to make use of them, you require .

    circle-info

    For the most recent documentation of existing tags, see , or see .

    Tag
    Effect
    circle-exclamation

    hide_Genitals will hide only the genitals, not the entire body submesh!

    ArchiveXL additionally defines the following :

    Tag
    submesh(es)
    hides…

    hashtag
    Visual tags: diagram

    Your image as custom mesh

    Guide to creating neon signs from 2d textures

    hashtag
    Summary

    Created by @manavortex Published August 2023

    hashtag
    This guide uses the following tools and versions:

    circle-info

    This guide will take you through the steps of replacing one of Cyberpunk's neon signs with a custom mesh. If you want to add custom props to the game, you can check out the corresponding after you're done with this one!

    hashtag
    Step 0: Make or find an image

    Start with an image. We're aiming for our own neon sign here, and we'll aassign the colours later in Wolvenkit, so make sure that it is something with clean lines and good contrasts. I'll use this:

    circle-info

    Make sure that your image is as clean as possible.

    hashtag
    Step 1: Convert to SVG

    I started by following , but I'll write you a TL;DR

    1. Open Inkscape and create a new document

    2. Select File -> Import and import your .png from step 0

    3. Make sure that your image is selected (click on it if you're not sure, it will have that resizing handle)

    Time to switch to Blender to turn it into a mesh!

    hashtag
    Step 2: Making a mesh

    For this, I've originally followed guide, but here's a TL;DR for you again:

    1. In Blender, select File -> Import -> Scalable Vector Graphic (SVG)

    2. Import your SVG. It will show up as solid black:

    1. With an active selection, find the curve properties panel in the bottom right (the green icon).

    2. In the "Geometry" section and find "Extrude".

    3. Set it to something like 0.001 — play around with it until your mesh is appropriately extruded.

    We're now leaving the previous guide.

    hashtag
    Step 3: Fixing up the mesh for Cyberpunk

    Scale, rotate, and move your curve to the centre of the viewport

    1. Fix rotation: Press R -> X -> 90

    2. Fix scale: Press S and move the mouse

    hashtag
    Cleaning up the geometry

    circle-info

    You will get much better results with the Blender AddOn QuadRemesher; however, after the first 30 days it costs money. You can download a trial version .

    Let's reduce poly count and clean up our mesh. For a detailed guide, see , I'm going to give you a TL;DR again:

    hashtag
    Remesh modifier

    1. Switch to the "Modifiers" tab in the sidebar panel on the right (the wrench, below the one highlighted in the screenshot above)

    2. From the dropdown, select Generate -> Remesh

    3. Your mesh will be a black box now. Don't panic, we'll fix this by setting the modifier proprerties:

    Setting
    Value
    explanation

    Switch back to Object Mode (press Tab) and apply the modifier. The result should be something like this:

    Now, triangulate: switch to edit mode, select everything, and press Ctrl+T. It's necessary for the Cyberpunk reimport.

    circle-info

    For better results, I cheated: I split off the ghosts' eyes, the ghosts themselves and Pacman, and used Quad Remesher on each of them. This guide will show you the basics, you can make prettier meshes on your own later once you got it to work.

    hashtag
    Creating an UV map

    Switch to the Object Data Properties in the right sidebar, fold out "UV Maps" and click the + button. This is necessary for material projection, and Wolvenkit won't let you import if you didn't do it.

    hashtag
    Naming

    Rename your original mesh to submesh_00_LOD_1 — we need that for the import in Wolvenkit.

    hashtag
    Optional: More submeshes for more colours

    You can assign one material per submesh. To split off a part of the mesh,

    1. Change back to Edit Mode

    2. Turn on X-Ray (Alt+Z) and select the shape that you want to split off

    3. Press P -> S (Split -> Selection)

    hashtag
    Creating a Wolvenkit project

    Time to pull up Wolvenkit.

    Assuming you have Wolvenkit , you can now . Let's find ourselves an in-game neon sign to replace by searching in the Asset Browser for neon > .mesh and scrolling through the entries until we find one that we like.

    circle-info

    You can obviously use any kind of mesh or material here!

    I'll be replacing base\environment\decoration\advertising\signage\sex_shop_neon_sign\sex_shop_neon_sign_b.mesh, the heart-shaped ad banner.

    1. Decide on a mesh and add it to your project.

    2. In the project explorer, right-click on the exported file (sex_shop_neon_sign_b.glb) and open it in the Windows Explorer. We will now overwrite this file in Blender.

    hashtag
    Exporting

    In Blender,

    1. select all the meshes that you want included (in Object Mode)

    2. use the to overwrite the file from the previous step.

    In Wolvenkit, use the Import Tool to import sex_shop_neon_sign_b.glb. The preview in the File Information panel should update.

    hashtag
    Assigning Materials

    circle-info

    I'll give the TL;DR version, you should be able to follow along. If not, feel free to read up on or find us on !

    Open sex_shop_neon_sign_b.mesh in Wolvenkit and open the appearance on (as this is the one they're using on Jig Jig Street).

    hashtag
    ChunkMaterials

    At the very top of the mesh, we'll need to change the chunk masks as follows:

    hashtag
    MaterialEntries

    Now, we register the materials:

    1. Find the array materialEntries

    2. Add four new entries (or duplicate one four times, or…)

    3. Name them according to the entries in the ChunkMaterials step

    hashtag
    LocalMaterials

    … and finally, we actually add the materials.

    1. Find and expand the array localMaterialBuffer and its child materials

    2. Copy the second entry, sex_shop_neon_sign_emissive_red_on via right-click menu

    hashtag
    Let's pack the project!

    In Wolvenkit's top bar, select Install and then boot up Cyberpunk. Let's hit up Jig Jig Street to look at our sign…

    triangle-exclamation

    Please remember that before sharing your custom neon, you have to change the paths, or you'll conflict with the next modder! You can find a full guide on the fastest way to do that .

    mana vortex
    mana vortex
    Releases · WolvenKit/CP77ToolsGitHubchevron-right
    You're looking for the latest release. It requires .NET 5.0 runtime (desktop runtime preferred).

    Community guides

    This page holds a list of community guides all over the internet.

    hashtag
    Modding guides

    <npcName>*.ent
    return {
      modder = "tutorial",
      unique_identifier = "tutorial_johnny_appearances",
      entity_id = "0x5E611B16, 24",
      appearances = {
        "silverhand_cyberspace_glasses",
        "silverhand_fluffy_socks",
      },
    }
    return {
      -- Your beautiful name :)
      modder = "your_name_here",
      
      -- A custom category for your poses that will appear on the list in the tab. 
      -- You could use your name or a description of your pose pack. 
      -- You can also add your stuff to a category that somebody else has already defined.
      category = "Netrunner making AMM mods",
      
      -- relative path to your ent file. You can copy this from Wolvenkit.
      -- Don't forget to add the extra slashes!
      entity_path = "tutorial\\amm_custom_poses\\making_addons\\ops\\amm_tutorial.ent",
      
      -- we'll get to these at "Custom Poses: The .lua"
      anims = { --[[ here be code ]]  }
    }
      anims = {        
          ["Man Average"] = {                       -- male body gender, e.g. spawned masc V, Johnny, Viktor, Takemura…
            "sit_chair_table_keyboard__2h_on_keyboard__make_amm_addon",
            "sit_chair_table_keyboard__2h_on_keyboard__01__thinking",
          },                    
          ["Woman Average"] = {                     -- female body gender, e.g. spawned femme V, Panam, Judy, Mamá Welles…
            "sit_chair_table_keyboard__2h_on_keyboard__make_amm_addon",
            "sit_chair_table_keyboard__2h_on_keyboard__01__thinking",      
          },                   
          ["Big"] = {},                             -- any body gender: big folks, e.g. Jackie, River, Rhino…
          ["Child"] = {},                           -- any body gender: children
          ["Fat"] = {},                             -- any body gender: fat folks, e.g. Dexter
          ["Man Massive"] = {},                     -- Smasher      
          ["Player Man"] = {},                      -- first person: male body gender V
          ["Player Woman"] = {},                    -- first person: female body gender V
      }
    return {
      -- Your beautiful name :)
      modder = "tutorial",
    
      -- This must be UNIQUE so be creative!
      -- NO SPACES OR SYMBOLS ALLOWED
      unique_identifier = "tutorial_female_character",
    
      -- This is the info about your new entity
      entity_info = {
      -- name: The name that will be shown in the Spawn tab
        name = "Tutorial Woman",
      -- path: The path to your entity file. Must use double slash bars \\
        path = "tutorial\\npv\\your_female_character\\ops\\your_female_character.ent",
      -- record: This is the TweakDB record that will be used to add your character. More information below.
        record = "Character.afterlife_merc_fast_melee_w_hard",
      -- type: Character or Vehicle
        type = "Character",
      -- customName: Set this to true if you want the name you set here to appear in AMM Scan tab.
        customName = true
      },
    
      appearances = {
        "tutorial_woman_casual", 
        "tutorial_woman_business", 
      },  
    
      -- Here you can pass a list of attributes from different records to be copied to your new character.
      -- More information below.
      attributes = {
      },
    }
    tutorial\npv\your_female_character\ops\your_female_character.ent
    tutorial\npv\your_male_character\ops\your_male_character.ent

    Find the workAnimClip's property id and increment its numeric value +1 from the previous id (orange on screenshot)

    of 6 and its
    workAnimClip
    's property
    id
    should be 7, and so on.
    But good news!
    WolvenKit's File Validation can fill in these numbers for you. Visit
    for more information.
    this pagearrow-up-right

    Hides item in the Torso slot (jackets, coats)

    hide_L1

    Hides item in the Legs slot (pants, skirts)

    hide_S1

    Hides item in the Feet slot (shoes)

    hide_T1part

    Torso item: controls the partial suffix (&Full/&Part)

    hide_Hair

    Hides hair (hair)

    hide_Genitals

    Replaces genitals/underwear with blank mesh, angel style.

    hide_CollarBone

    1

    collarbone

    hide_UpperAbdomen

    2

    stomach region

    hide_LowerAbdomen

    3

    hips

    hide_Torso

    0, 1, 2, 3

    entire torso

    hide_Arms

    8, 9, 10

    arms and hands

    hide_Thighs

    4

    thighs (upper legs)

    hide_Calves

    5

    calves

    hide_Ankles

    6

    ankles

    hide_Feet

    7

    feet

    hide_Legs

    4, 5, 6, 7

    entire leg (including feet)

    hide_L1

    Leg clothing

    hide_S1

    Shoes

    {gender}

    m or w depending on V's body gender

    {skin_color}

    Cheat Sheet: Head

    {hair_color}

    Cheat Sheet: Hair

    hide_H1

    Hides item in the Head slot (hats, caps, headbands)

    hide_F1

    Hides item in the Eyes slot (sunglasses, face masks)

    hide_T1

    Hides item in the Chest slot (shirts, tops)

    hide_Head

    head.

    hide_Chest

    0

    chest

    EquipmentExarrow-up-right
    associated .ent file
    PartsOverrides
    1.4.0arrow-up-right
    here
    ArchiveXLarrow-up-right
    ArchiveXL's readmearrow-up-right
    visual tagsarrow-up-right
    Overwrite the component "kimono" and "kimono_filler", which are defined in the file "kimono_meshentity.ent" This is the reason why Cyberpunk has all the player components stored in .ent files!
    componentsOverride > .ent file
    This is hiding a submesh of the default body, which isn't part of the referenced pants_leggins.ent. This is only possible because of ArchiveXL!
    male version - image by LadyLea
    female version - image by LadyLea
    Visual tags: diagram

    hide_T2

    // The male equivalent will have pma instead of pwa
    
    a0_001_pwa_base_hq__full              // default arms
    a0_001_pwa_base_hq__full8640          
    left_arm                              
    right_arm                             
    a0_000_pwa_base__fists                // fists (fighting arms)
    a0_005_wa__strongarms_holstered_r     // gorilla arms (holstered)
    a0_005_wa__strongarms_holstered_l    
    a0_005_wa__strongarms_r               // gorilla arms
    a0_005_wa__strongarms_l
    a0_005_wa__strongarms_photo_mode_r    // gorilla arms (photo mode)
    a0_005_wa__strongarms_photo_mode_l
    a0_002_wa__monowire_whip_l_cableless  // monowire
    a0_002_wa__monowire_whip_r_cableless
    t0_000_pwa_base__full
    t0_000_pma_base__full

    Deform -> Displace Coordinates: UV UV Map: UVMap Direction: Normal Strength: -0.002 (you can play around with this) Midlevel: 0.000

    You know how to read.

    cagearrow-up-right
    Blenderarrow-up-right
    normal maparrow-up-right
    Wikipediaarrow-up-right
    Set it to "3D Cursor"

    From the menu, select Path -> Trace Bitmap (it doesn't have to be a bitmap)

  • Pick your options in the right-hand panel. I won't cover them in detail here, check the linked guide arrow-up-rightor noodle around until the result looks OK.

  • Press the Apply button at the bottom

  • Your new traced path will be auto-selected for you.

  • Select File -> Save As and save it as an *.svg file.

  • Do not bevel it! We want the corners nice and sharp, we can always make it round l,ater.

  • Once you're satisfied, transform the curve into a mesh: Object -> Convert -> Mesh

  • Fix position:

    1. Press G -> Z to move the mesh up and down

    2. Press G -> X to move the mesh left and right

    3. You don't need to move it on the y axis

  • Apply transformations: Press Ctrl+A -> T

  • Scale

    0.1

    Size of quads in the remeshed object

    Sharpness

    1

    Preserve sharp edges

    Rinse and repeat until you have all the submeshes split off

    Make sure that their indices match the array positions

    paste it into materials
  • Duplicate it three more times

  • In the new material entries, find the property ColorOneStart and change it in the side panel.

  • Repeat for each material, then save the mesh.

  • Inkscapearrow-up-right 1.3

    Converting your picture into an svg which you can then import into Blender to create a mesh

    Blenderarrow-up-right 3.6

    Converting your SVG to a 3d object that you can import into Cyberpunk. You also need the WKit Pluginarrow-up-right.

    Wolvenkitarrow-up-right (recent)

    converting your mesh to an in-game-item

    Mode

    sharp

    Remesh type: preserving sharp edges

    Octree Depth

    8

    Level of detail

    AMM guide
    this guidearrow-up-right
    thisarrow-up-right
    herearrow-up-right
    herearrow-up-right
    Export the mesh
    Cyberpunk Blender Pluginarrow-up-right
    how materials work in meshes
    Discordarrow-up-right
    here
    In case you end up with an object rather than a curve (a spiraly thingy rather than a フ), you used the wrong import.
    You can play around further, trying to get the poly count down. We'll leave it at this for now.

    by BeautiDuwanger#1637 by Hyst

    Google Doc by Rosza#6193

    By PinkyDude on tumblr

    Guide on Nexus

    Google Doc link (who made this?)

    Guide by Halvkyrie#4000

    (youtube)

    What it is, what it does, how to use

    How to edit scripts (Redscript comparison)

    How to install/replace animations

    Google Doc (who made this?) Requires Photoshop or

    Google Doc (who made this?)

    hashtag
    Clothing

    Google Doc link (who made this?)

    Google Drive, by Halk

    Google Doc (who made this?)

    hashtag
    Rigging and animations

    xbaebsae

    youtube video by Hineytroll

    youtube video by Raq#6517

    Tutorial by Deceptious & Zwei

    hashtag
    AMM (Appearance Menu Mod)

    Not a guide, just a framework

    by PinkyDude

    hashtag
    Custom NPCs (NPVs)

    Please see the corresponding sub-page

    hashtag
    References

    by trala#5476 - ordered by animated actor

    (See also )

    by Halvkyrie#4000 - identifies the internal names of the hair colour swatches in character creator with picture references. Update required as of patch 1.6 due to the addition of 8 new hair profiles.

    Overview section on this wiki

    hashtag
    Scripting and quests

    Bioskop's research

    Bioskop's Wiki (WIP)

    hashtag
    Sound

    ()

    How to Vocode voices for the game

    ()

    Guide on Nexus

    Guide on github

    hashtag
    Know-how

    Tutorial

    Step-by-step guide for exporting to Blender

    Adding the rigs to the models in Blender

    How to export parts of Night City

    hashtag
    Collections

    Google Drive, by nanarc#1301

    xbaebsae's website

    nexus, by omnishambles

    hashtag
    Discord conversation references

    CET dialogue popuparrow-up-right

    Legacy: Introductionarrow-up-right (Google Docs, by Halvkyrie)

    By now, this is outdated, but this document contains the first comprehensive introduction to CP2077 modding

    change it at the end
    here
    our nifty list
    NoraLee's NPV Part Pickerarrow-up-right
    https://noraleedoes.neocities.org/npv/npv_part_pickerarrow-up-right
    Copy these and move them over to your .app
    this list
    import/export guide

    Recolours and Refits

    How do I change this item?

    hashtag
    Summary

    Created by @manavortex Published August 20 2023

    circle-info

    If you just want to change the emissive colour, check

    This will guide you to the process of making your own custom edit of my . It has several sections, which you can find linked below (but please check the wiki's navigation tree anyway).

    hashtag
    Assumed level of skill:

    You know how to read — if you can read and struggle with this guide, then it's not yet good enough. Please reach out to on the so that I can improve it.

    circle-info

    The steps in this guide teach you how to recolour or refit almost every item in Cyberpunk. Keep reading!

    hashtag
    Time to complete:

    • Setup:

      • If Wolvenkit is already set up: ~ 5 - 30 minutes for MLSB

      • Full setup: 30 minutes to ~2 hours (most of which you can spend afk)

    circle-exclamation

    If you are editing modded items, you should seek permission first. For your personal use, you can (legally) do what you want, but making mods takes time and effort.

    Please respect mod creators' wishes in that regard.

    You can check find the standard permissions on a mod's Nexus page, Description tab, under the

    hashtag
    Tools and versions used

    hashtag
    Skipping and skimming

    hashtag
    TL;DR

    Do not skip or skim anything. Also, if you find a TL;DR block, this sums up all sections until the next header (in this case, until ).

    I'm writing these guides with the minimal amount of fluff and no background information — that will be linked, but not included, which is the opposite approach from the rest of the internet and the .

    The sections are annotated with a rough estimate of how long a total newbie would need. They're guesses, so if you're slightly off, don't worry. If you're wildly off, you might want to get in touch.

    If you skip or skim in these guides, you will get in trouble. Unless a section's first paragraph offers you to read on somewhere else, do not skip. Don't skim and do ok it was something like this. You're supposed to stick to the road, where you won't run into monsters, and the guide will not tell you what to do if you encounter any.

    The bright side of this approach is that you don't need to understand what you're doing as long as you do what the guide says.

    hashtag
    Links

    You will find two kinds of links. It's usually clearly annotated which is which.1

    The first will help you do something, leading to other guides on this wiki. They usually link the specific section that you need to complete. Please be thorough here as well, as the rules above apply.

    The second contains background information and references (like "here's how this can look"). They are optional, you can browse or ignore them, and skim all you want.

    hashtag
    Overview

    circle-info

    To do this, you must have MLSetupBuilder running at least minimally. If you don't, then please complete the section "" below.

    This guide will walk you through the following steps

    1. Doing the

      • If you already have MLSB working, please read !

    2. Creating a with the right files

    hashtag
    R&R Step 0: Setup

    This section will link you to guides for installing Wolvenkit and MLSetupBuilder, which allows you to use the cool preview of which parts of an item you're colouring.

    You will also be told how to download and extract the files for the .

    If you have done both, you can skip it and proceed with .

    1. : You need Wolvenkit on your computer, and you need to be able to start it. Follow the steps in the linked guide until you can open the program.

    2. Follow the steps under until you reach Configure MLSetupBuilder.

    3. Make a decision if you want to use these features independently of the Netrunner suit

    hashtag
    Netrunner Suit Preview

    In this step, we'll enable custom previews by downloading the files I've prepared and extracting them into MLSB's depot. It should take you no more than five minutes.

    circle-info

    The Netrunner suit uses custom multilayer masks. To get an accurate preview in MLSetupBuilder, you need to complete this section.

    You can make recolours blindly by just tweaking the colour values without knowing which parts of the mesh they affect, so you can skip this step and ,

    hashtag
    MLSB's Uncook Folder

    This is where MLSB (and Wolvenkit) store the files they extracted.

    1. Go to Nexus page. You can find two files here, one with the modded multilayer masks, one with the original ones

    2. Download the archive with the modded mlsetup

    3. Extract the entire archive into MLSB's uncook folder, or drag and drop the base

    1. Open the Model Library and search for t0_005_pwa_body__t_bug.

    1. Click on the entry. If a 3d model shows up, you're done here and can go on.

    2. If no model shows up, select View -> Logs from the taskbar. It will complain about files being in the wrong spot. You need to make sure that the files you downloaded in Step 1 end up in exactly these folders and none other. If the file paths are ending in .dds, open MLSB's preferences and configure it to use pngs instead.

    hashtag
    Install the mod

    circle-info

    The tutorial assumes that the mod is installed manually rather than via Vortex. If you have already done that, no sweat — it means that a few files might be in different places, and all this is annotated.

    If you don't want the extra complication, simply deactivate the mod in Vortex and follow the steps below.

    hashtag
    TL;DR

    Extract the downloaded archive directly into your Cyberpunk 2077 directory and go to .

    hashtag
    Detailed instructions

    1. Download the mod from

    2. Open the downloaded .zip file. You will see something like this:

    1. These files need to go directly into your Cyberpunk 2077 directory, where they will merge with the existing folders. This is the same directory that contains REDprelauncher.exe.

    2. Extract or

    hashtag
    OK, what now?

    Now that you're all set up, we'll .

    Poses/Animations: make your own

    Make your own pose, then import it into photo mode

    hashtag
    Summary

    Created by @manavortex Published September 2023

    circle-info

    This guide will teach you how to create a custom pose in Blender and import it into the game via Wolvenkit.

    You will make a photo mode replacer - your custom pose(s) will replace to existing vanilla pose(s) provided by Photo Mode in the game.

    This is a prerequisite for pose sets for both and .

    Check the section for more general knowledge.

    hashtag
    It has been tested with the following software versions. Install these or newer.

    circle-exclamation

    We all stand on the shoulders of giants: this process has first been documented by , who also provided the . Thank you!

    hashtag
    Skipping and skimming

    This guide will include the minimum amount of fluff and will link background information rather than giving it.

    For that reason, you shouldn't skip or skim unless the section tells you that it's optional.

    Any links in the text will either

    • provide additional information which you do not need to complete this guide

    • lead to step-by-step instructions for any given process

    Follow them if you want to learn more, or if you are unclear on how to complete the current step, then come back here.

    hashtag
    Step 0: Preparations

    hashtag
    Your Wolvenkit project

    To import your pose into Cyberpunk, you need a Wolvenkit project.

    1. . Give it a name that you can identify later.

    2. Now, your project needs the photo mode .anims file appropriate for your pose(s). The table below shows your options. for the correct photo mode file and add it to your project:

    body gender
    file
    1. Export the file(s) to GLB via . Default settings are fine. (We will overwrite these glb(s) with our new pose, then use Wolvenkit to merge them into the existing .anims file.)

    triangle-exclamation

    You can not move these .glb files. Wolvenkit needs them to stay where they are so it can splice your new animation into the existing .anims file.

    hashtag
    Download the template files

    Download the animation template(s) for your rig(s):

    • for single characters: from

    • for multiple characters: of Angy's templates

    Move/copy them somewhere, then open the one you want in Blender.

    I'll be using Angy's template for female V, because the other one doesn't exist I happen to have one of those.

    hashtag
    Step 1: Posing the mannequin

    This step will happen in Blender.

    circle-info

    If the written instructions aren't clear enough for you, check the screenshots below them.

    1. Open up the file

    2. Select the armature by clicking on one of the bones in the viewport (the red circle on the screenshot below). They will be highlighted if you did it right.

    1. Switch the viewport to Pose Mode in the dropdown menu at the topleft of the viewport, immediately below the "File" and "Edit" menus. This will turn the armature red.

    1. Now, you need to create your pose. Before you do that, check the box below:

    chevron-rightNice-to-know about creating poseshashtag

    General

    • The real human skeleton changes pose only via bone rotation — moving bones leads to dislocated joints. Do not move bones.

    Tooling

    1. As of today (September 2023), we can only create poses and animations by adjusting each bone by hand. This is how:

      1. Select a bone by clicking on it (it will appear highlighted)

      2. Rotate the bone by either

    1. Now, , then proceed to the next section.

    hashtag
    Step 2: Creating the animation

    You now need to create an animation that Wolvenkit can add into the existing file. For that purpose, we will create a nonlinear animation in Blender.

    1. In the panel at the bottom, click on <No Action> to select it.

    2. In the Armature -> Animation Data panel, click on the New button.

    1. Now, we need to add keyframes, one for the fallback position and one for the pose.

      1. Make sure that the keyframe selected in the animation timeline is 0 (see "Animation Timeline" screenshot below)

      2. Click into the main viewport next to the armature

    1. Now, rename both your NLA strip and your animation to idle_stand_01. This will overwrite the "Tabula Rasa" animation. (Find a list of animations and their associated names .) If you aren't planning on replacing the in-game idle poses (i,e., Tabula Rasa), it is still required that your NLA strip and your animation have the same name.

    hashtag
    This is important!

    triangle-exclamation

    This step is crucial. If you don't do this, then Wolvenkit won't import your animation.

    The names must be the same, and they must match the name in your .anim file.

    1. Go back and read the warning box under step 4.

    2. Double-check the names. (Yes, this is that important)

    3. Optional: To add another pose, you can go back to Step 1, then rinse and repeat.

    1. This will open a file picker. Do the following things:

      • Check the As Photomode Pose box on the right

      • Navigate the to the path of the file you exported in the and click on it to overwrite it

    Now it's time to import the file back into Wolvenkit.

    hashtag
    Step 3: Importing and testing

    1. Switch back to Wolvenkit and open the .

    2. Click on photomode__female__idle.glb to select it and open the import settings panel.

    3. In the panel on the right, change Target File Format

    1. Hit the Import Selected button.

    circle-check

    Youc an now test your mod: Install your Wolvenkit project by clicking the green button on the taskbar, and launch the game.

    If all went well, entering photo mode will show your new pose.

    hashtag
    Troubleshooting

    hashtag
    My pose doesn't import!

    I have no idea how to tell you this, choomba, other than stressing thrice that it's important and putting a big red box, but the NLA strip and the animation must have the same name. Go back to "" and double-check. The animation might have trailing numbers, e.g. be called photomode__female__idle.001, that will already do it.

    hashtag
    Very funny, but it wasn't that

    If you're really 100% sure, then you might have a broken NLA strip. That happens sometimes — simply recreate it:

    1. If your armature isn't selected anymore, click on it to select it

    2. Switch into Pose Mode

    3. Press A to select all bones

    hashtag
    Nope, still borked

    We're reaching the end of the rope here. Go back and . If that wasn't it,

    1. create a new copy of the .blend file you downloaded (but keep yours open)

    2. In your old Blend file, repeat 1-4 of the

    3. In your new Blend file, repeat 5+6 of the

    R&R: Your own Wolvenkit project

    hashtag
    Summary

    Created by @manavortex Published September 30 2023

    This page is a part of the Recolours and Refit guide and will walk you through the process of creating your own Wolvenkit project. Here, we will:

    • create our project

    • solve load order via project name

    • get the files from the mod that we want to change

    Time to complete:

    • ~30 minutes for the tutorial

    • once you know how it works: < 5 minutes to create a project and add the correct files from a mod

    circle-info

    The principles you learn here are universal. Once you have understood how this works, you can recolour and refit any Cyberpunk item.

    circle-exclamation

    If you are editing modded items, you should seek permission first. For your personal use, you can (legally) do what you want, but making mods takes time and effort.

    Please respect mod creators' wishes in that regard.

    You can check find the standard permissions on a mod's Nexus page, Description tab, under the

    hashtag
    Prerequisites

    The links in the check list go to more detailed guides. For the exact things you have to do if you can't check the boxes, see the previous section of the guide ->,

    hashtag
    Why do I want a Wolvenkit project?

    To edit an appearance, you need to make a mod, and for that, you need a Wolvenkit project.

    As soon as you have changed the first file, you can and check if it is working.

    There are two ways you can go about the process: do either a full repack of my mod, or create a compatibility archive. This section will explain the differences, the will walk you through the process of setting things up for either of those options.

    Full Repack
    Compatibility Archive
    circle-check

    Once you've made your decision, you can proceed to the next section and . If you aren't certain yet, you can keep reading to find the pros and cons listed more clearly.

    hashtag
    A full repack

    Your mod completely overwrites the original mod, creating your own local copy.

    circle-info

    I do this with mods for my own personal use — I don't care if the original mod is updated, my character will only ever wear that one custom variant.

    hashtag
    Pros:

    • Anything I do to the mod in the future won't affect you

    hashtag
    Cons:

    • Anything I do to the mod in the future won't affect you

    • If you update or reinstall the original mod, you will overwrite your changes

    • If you're anything like me, you'll lose track of which files you have or haven't modified

    hashtag
    A patch

    You'll create a compatibility mod that will exist together with the original.

    circle-info

    I do this with mods where I only want to change little things, e.g. removing a submesh. When the original mod updates, I can update my compatibility mod in <5 minutes.

    hashtag
    Pros:

    • You can still update and reinstall the original without overwriting your changes

    • Your mod has only exactly those files that you've actually changed

    hashtag
    Cons:

    • You have to keep the original installed

    • Only works together with the original

    • Updates on the original mod might necessitate an update on your part

    This is where you pick any of those options.

    hashtag
    Creating your Wolvenkit project

    circle-exclamation

    The .archive that Wolvenkit packs for you will have the same name as your project. Stick to the recommendations in Step 4, or read the expandable box to learn more.

    1. From Wolvenkit's menu bar, select File -> New Project

    2. Fill the fields in the dialogue:

    3. Creation Location: This is where your loose files are going to live. From here, Wkit can pack it as a mod and install it to your game directory. Select any folder outside of your game directory.

    chevron-rightWhy do we name it like that?hashtag

    In Cyberpunk, any file can only be modded once. When something has altered a texture or mesh, everyone else can get lost.

    At some point during start-up, Cyberpunk 2077 will open up the mod directory, grab a list of all mods, and load them. Naturally, it will start at the top of that list, so your mod needs to be further up than the original.

    We achieve that via file name - hence #4 on the above list.

    hashtag
    Add files from the mod to your project

    This part will show you how to add files to your project (you can't change them if you don't).

    hashtag
    Prerequisites

    You have installed the mod from .

    hashtag
    Why are we doing this?

    circle-check

    Skip to if you don't care.

    To alter an existing item, you need to create a mod that will overwrite the original resource. This mod must modify that file first - which is where the load order comes in.

    triangle-exclamation

    Do not move or rename any of those files, they need to be exactly where Wolvenkit puts them.

    The section

    1. describes the process of

    2. tells you which files to use it on for

    circle-info

    For the general documentation on adding files to your project, see .

    hashtag
    How to export files

    1. In Wolvenkit, open the Asset Browser (pinned at the right-hand side by default), and toggle the switch to "Mod Browser".

    1. Find _ArchiveXL_Netrunner_Variants, then click on it. It will be near the bottom of the list, together with your other mods starting with _

    2. You can now browse the archive, or use (next to the big red toggle button) to find files inside the archive by searching for archive:ArchiveXL_Netrunner.

    hashtag
    Selected files: full repack

    If you want to overwrite the complete mod, run this query in Wolvenkit's Mod Browser:

    1. Add all files to the project — everything.

    2. Now, switch the Project Explorer to Resources. It will be empty; you have to create the following folder structure:

    Find and copy the following files from your game directory into the subfolders of resources (there'll be a screenshot in a minute)

    hashtag
    _ArchiveXL_Netrunner_variants.yaml

    From: Cyberpunk 2077\r6\tweaks\manavortex To: resources\manavortex

    hashtag
    ArchiveXL_Netrunner_variants_atelier.reds

    From: Cyberpunk 2077\r6\scripts\manavortex To: resources\r6\scripts\manavortex

    hashtag
    _ArchiveXL_Netrunner_variants.archive.xl

    From: either vanilla install: Cyberpunk 2077\archive\pc\mod REDmod: Cyberpunk 2077\mods\RANDOMNUMBER_ArchiveXL_Netrunner_variants\archives To: resources

    hashtag
    Selected files: Emissive

    hashtag
    TL;DR: via search browser query

    Add all those files to your project, then skip the rest of this page and go to

    hashtag
    Selected files: Recolour

    All material colour definitions are stored in .mlsetup files, which we'll be editing in .

    hashtag
    TL;DR: via search browser query

    hashtag
    File structure explained

    • All material definitions in this mod are in the folder manavortex\torso\netrunning_suit\textures

    • The first level subfolders group the .mlsetup files by material (e.g. nylon, snake, other)

    If the names aren't clear enough or if you can't guess which file you have to take, you can open netrunner_recolours_translation.json in Wolvenkit:

    Expand the root node and then the entries node. By selecting a node, you can see the translation text. The field for secondaryKey contains the colour variant, which corresponds to the mlsetup file name:

    hashtag
    Selected files: Refit

    For a refit, you only need two files (one if you don't care about the emissive properties):

    hashtag
    female body gender

    mesh
    path in files

    hashtag
    male body gender

    mesh
    path in files

    Simply add both files to your project, then hit up the section to get them fixed.

    hashtag
    OK, what now?

    Depending on which files you added, you now proceed to the next guide:

    /

    NPV: Preparing the head in Blender

    Step 1: How to generate your V's custom head mesh

    hashtag
    Summary

    Created by @manavortex Published May 13 2023

    This page is a part of the NPV guide. It will show you how to create your V's head in Blender.

    hashtag
    Prerequisites

    In this section, we will be moving/deleting files. You can complete these steps in Wolvenkit or in the Windows File Explorer.

    circle-exclamation

    It's important that you leave the file structure as it is. Moving or renaming files will confuse Wolvenkit and break the example project.

    The final section of tells you how to safely move files.

    hashtag
    Step 1: Getting head

    1. Open the head folder in your project's archive section.

      1. Optional: Be confused and/or panic about why there are over 9000 files.

    circle-info

    It's too many of them!

    True! That's because I included all options for any given V. But don't worry: after you have deleted the ones that you won't be using, you should be left with a maximum of 13 files for female V and 14 files for male V.

    I have included all meshes and morphtargets from the game files. We'll now thin out the options, deleting those parts that your NPV won't be using.

    hashtag
    Deleting unused files: the convenient option

    circle-check

    The best and most convenient tool for the job is . It will give you a list of files that you need to keep.

    The list will give you a number of Source Mesh entries like h0_000_pwa_c__basehead.mesh.

    You need to keep these files inside the head

    hashtag
    What the actual fuck are all these files?

    circle-info

    If you don't care and just want to know what to delete, go .

    hashtag
    Meshes vs Morphtargets

    The .mesh files are the 3d files making up your NPV's head. I've taken them from the game files and prepared them for you (by making them use the player animations and -expressions).

    The .morphtarget files are the character creator options (a direct game export). You can safely overwrite them with the most recent version by searching Wolvenkit for the file name – you need to put it into the correct folder, though, or it won't be picked up by the scripts.

    We only need the .morphtargets to generate the actual meshes by duplicating the character creator process.

    hashtag
    Okay, and all those numbers?

    The different variants in the character creator correspond to the different meshes. For example, if you select cyberware 3 in the character creator, the mesh that will get loaded is cyberware_03. Not so difficult, is it?

    Here's what the prefixes mean:

    hashtag
    Finding the right piercing

    circle-info

    If your V isn't using any piercings, you can skip this step and go directly to .

    In the files, you will see four files for jewelry:

    … none of which is your V's exact piercings. Instead, there are full sets of jewellery, most of which will be hidden.

    You have to look at the meshes and find the file that includes your set of piercings. We'll go about hiding the excess in one of the later steps.

    hashtag
    Deleting files

    circle-check

    Number in file name <=> Number in character creator

    circle-info

    Do not delete any files if you're (Ignore this hint if you don't)

    Many of the files are variants and your V will be using one or none of them. That means you have a bunch of files to delete. If you have chosen above, you should already have a list of files that you need to keep. Otherwise, the table below should give you some oversight.

    When deleting files that you aren't using, you need to remove both the .mesh file in the head folder and the .morphtarget file in the head/morphtargets folder.

    The following table will show you examples on what to keep (as in, you delete everything else):

    Body gender/variant
    Files not to delete from variants

    hashtag
    Expected result

    After deletions, both head and head/morphtargets should hold only the files that your V is actually using.

    For a list, see the .

    Once you're done, you should have this many files:

    hashtag
    Step 2: Exporting head

    Now, we will export all .morphtarget files from Wolvenkit so that we can edit them in Blender. You will complete most of these steps in Blender, only the import/export happen in Wolvenkit.

    1. Find the Export Tool (Tools -> Export)

      1. To filter, click into the empty row under "name" and write "morphtarget"

      2. Check the box in the header to select everything

    1. Switch to your project's raw folder or Wolvenkit's raw perspective. You will find the entire file structure mirrored there.

    2. In head folder, find the file head_import.blend. This file is a utility file which will automatically import and export the files for you. For that reason, it needs to be in a certain relative path.

    circle-info

    If you have already changed your structure (by re-naming your folders), you need to make sure that head_import.blend is in the folder head right next to the folder morphtargets.

    1. Open it in Blender. It will take you to the scripting perspective, where you'll see something like this:

    1. Press the play button.

    2. The script will now import a bunch of armatures from the morphtargets folder. You will see them showing up in the topright corner (see the next screenshot under 7. for how it should look)

    3. Switch to the next script in the file, but don't run it yet:

    circle-info

    If you've been previously afraid of scripting: This is a good place to stop! :))

    1. Find line 26 and following in the script, and alter the values to those of your V (which you get from the character preset, see for further explanation).

    circle-info

    You don't need to select the eyebrows here, as those are "painted on" later via mesh appearance. The mesh only needs to have the right shape, which is what we're doing here.

    1. After you've changed the values to those of your V, click the "play" button again. This will apply the morphs to your V's face:

    triangle-exclamation

    Some shapekeys don't correspond 1:1 with their numbers in the character creator. If a part of your shape is shaped subtly wrong or looks weird in the game, undo your changes (Ctrl+Z), add or subtract 1 from the corresponding shape key, and run the script again.

    hashtag
    Step 3: Importing head

    circle-info

    Unless you are editing original V, start by deleting the morphtargets from the template file — we don't need them anymore.

    Remove the entire folder, both from raw and archive. From now on, it's meshes only!

    hashtag
    Exporting from Blender

    Now that your head looks the way you want, it's time to run the final script, which will export your changed head to .glb for you:

    This will overwrite already existing files, leaving you with a set of import-ready mesh files.

    Now it's time to get them back into Wolvenkit.

    1. Find the Import Tool (Tools -> Import Tool)

    2. Click "Import All"

    3. You're done!

    circle-check

    You can now start the game and look at your V's face to make sure that your head and eyes are showing up correctly . If it does, read on how to . Otherwise, keep reading.

    hashtag
    Can I have that with textures?

    Yes, you absolutely can! Once you have imported them back into Wolvenkit, you can use the With Materials option and the Wolvenkit Blender Plugin to get a fully textured and shaded set.

    hashtag
    Step 4: Troubleshooting

    Optimally, this process just runs with no hitches. However, during beta testing and troubleshooting, people ran into a few issues, so I'm listing them here.

    hashtag
    Blender import errors

    If you get an error within Blender, e.g. something like AttributeError: 'NoneType' object has no attribute 'name', then something is wrong with your install or you are using the wrong version. Reminder: This has been tested with 3.5.1, but anything >= 3.4 should work.

    hashtag
    The piercings are in the wrong position!

    The problem went away after the person having it upgraded Blender to 3.5.

    hashtag
    V was imported, but the textures are all wrong!

    This happens when the UV maps are flipped. 8.9 doesn't implement that feature yet, so you might have to use a of Wolvenkit — the Nightly from is currently stable.

    Alternatively, you can use the last script in the file, which will attempt to flip the UV maps for you. It might have an offset, though.

    hashtag
    V was imported, but they're unsettlingly, subtly wrong

    If you had the example project lying around for a very long time, please try and redownload it (), as the first version had been using an NPC animationgraph for facial expressions.

    If that's not it, then you ran into the shapekey offset issue: ssome shapekeys don't correspond 1:1 with their numbers in the character creator. If a part of your shape is shaped subtly wrong or looks weird in the game, add or subtract 1 from the corresponding shape key, and run the script again.

    Step 2: Exporting head

    Custom props

    How to create custom props to use with AMM or sector editing

    hashtag
    Summary

    Created by @manavortex Published April 2023, updated July 2023

    This guide will teach you how to create a customizable by chaining an .ent, an .app, and a .mesh file with multiple appearances.

    circle-info

    For a guide on how to make meshes out of 2d textures, see .

    Its focus is on the file structure and the relations between the files. If you want more hands-on tips what you can do with materials, check or .

    It uses the following versions:

    • Cyberpunk 2077 game version 1.6.1 (DLSS)

    • >= 8.8.1

    • (>= version 2.1, anything earlier won't have customizable appearances)

    Level of difficulty: You know how to read.

    hashtag
    Setting up the project

    This section will tell you how to get the files, then give you an of what they do and finally show you a on how they hang together.

    1. Create a project in Wolvenkit and give it a name. This will later be the name of your archive file.

    2. Download the AMM prop template from or from manavortex's , or download the complete for Wolvenkit. It will have prepared files, which is faster than doing everything from scratch by yourself.

    3. Prepare your Wolvenkit project and make sure that you have the following files:

    circle-info

    The first part of the structure is up to you, although for the sake of the tutorial you might want to stick to it. There's a section later on .

    The second part (under "resources") is where AMM will look for custom props. You can't change it other than creating subfolders under "Custom Props".

    hashtag
    Explanation: what did you just download?

    circle-check

    This section gives an explanation of the included files, explaining the difference in file structure between props with vs without variants.

    If you don't want to know this, you can skip ahead to to get crackin', or check the to see how the files connect.

    hashtag
    LUA file

    This file registers your prop with AMM. File content looks like this:

    Without a lua file, AMM (as of version 2.1) won't be able to spawn your props.

    Here's what the lines do:

    circle-check

    When you edit the .lua, it's usually enough to reload all mods in CET.

    hashtag
    Entity file

    Defined in your LUA file, this file holds the game entity that AMM spawns when you click the button. There are two ways of using entity files:

    Mesh entity (the legacy version)

    One entity file per variant. The props will not have appearances — AMM's prop browser has one entry per entity file (e.g. cube_black, cube_white, cube_glowing).

    circle-info

    Fun fact: The cluttered prop browser annoyed manavortex so much that she joined the AMM developer team, helped Max implement the alternative workflow described below the picture, and wrote this guide!

    It was bad!

    You add props by putting meshes directly into the components array.

    Root entity

    One entity file per prop, one entry in AMM's prop browser (e.g. cube). After spawning it, you can toggle its appearances (white, black, glowing) the same way you do it with NPCs.

    circle-info

    If you have , then this will be familiar to you. If you haven't, please ignore the link and keep reading — this is the simpler version!

    Instead of adding items directly via the components array, we link appearances to an .app file. The only component we keep in the root entity is the targeting component for the CET cursor: this way, it will be added to each appearance in the .app file.

    hashtag
    Appearance file

    This file holds a list of appearances. Inside each appearance, you can define any number of things to be loaded (components) and specify or override their behaviour.

    circle-info

    We will only use entPhysicalMeshComponents, and they must be named amm_prop_slot1 .. amm_prop_slot4 if you want to enable scaling.

    circle-exclamation

    If you have more than four mesh files assigned to your app's components, the prop will no longer be scaleable (as of AMM 2.1). You can get around this limitation by making meshes with more submeshes instead of having individual files.

    hashtag
    template_textured.mesh

    A pre-configured mesh for a textured material. Uses the following files in the subfolder textures:

    • template_01_d.xbm: A diffuse (albedo) map, colouring the mesh

    • template_01_n.xbm: A normal (bump) map, adding depth to the object.

    circle-info

    If you stick to this naming convention and have your filenames end in _d or _n, Wolvenkit will recognize and identify the correct settings for image import.

    You can learn more about textured materials . This is not necessary for the purpose of this guide.

    hashtag
    template_multilayered.mesh

    A pre-configured mesh for a multilayered material. Uses the following files in the subfolder textures:

    • 6_layers.mlsetup: A with colour properties

    • 6_layers.mlmask: A , determining which parts of the mesh are affected by which layer of the mlsetup. In this case, it just contains six blank layers.

    You can learn more about multilayered materials . This is not necessary for the purpose of this guide.

    circle-check

    If you have downloaded the example Wolvenkit project, you can now install it and launch the game, seeing everything in action.

    hashtag
    Diagram

    Okay, now that we've gone through the theory, let's have a quick overview how everything hangs together:

    hashtag
    Without variants

    hashtag
    With variants

    hashtag
    Creating another prop

    circle-check

    This step is optional. If you just want to see how this works, you can pack your project with Wolvenkit and search AMM for "tutorial item". However, assuming that you actually want to make cool things, you will be doing this a lot.

    If you want to create another prop, here's the fastest non-script way to go about it (tried and tested by manavortex):

    1. In Windows Explorer, duplicate the template folder

    2. Rename the new folder (template - Copy) to the name of your prop (e.g. baseball)

    Now you can launch the game and check your prop. If everything went well, you should see something like this now:

    If not, it is time to hit up the .

    hashtag
    The final touches

    Before you can share your custom props, you have to change the folder structure and file paths. Otherwise, two people overwrite tutorial.lua, and one of the mods stops working.

    You can find a step-by-step guide on the process .

    hashtag
    Troubleshooting

    This section will only cover troubleshooting steps for this guide. For anything related to mesh imports, see . For general 3d model troubleshooting (including import errors), see .

    hashtag
    My prop doesn't even list in AMM!

    The problem is in your .lua file. Use to check the syntax and make sure that there are no errors - usually, it is missing/extra commas and/or missing/extra braces.

    If the syntax is okay and your prop still doesn't show up, double-check your category and make sure that it is one of the existing ones.

    hashtag
    My prop won't spawn!

    hashtag
    ... and I can't target it!

    AMM can't find your .ent file. Make sure that your .lua points to the correct path in your archive (right-click -> copy relative path and paste it to your lua file.

    circle-info

    Make sure that you don't delete any quotation marks or commas while you do that. If you're unsure, you can double-check .

    hashtag
    ... it all looks good, but there is no prop!

    Toy around with the scaling. Sometimes, your prop doesn't show because it's the size of Johnny's ego and hovers somewhere above your city block – or the opposite, it's microscopically tiny. Don't be afraid to change it by the factor 10 or even 100 and see if that does anything.

    If that's not it and if you have a customizable prop (with a root entity), try adding an appearance default to the mesh. The game will fall back to that one if there are issues with your custom appearances.

    hashtag
    My prop spawns, but something about it is weird!

    In general, your answer is probably in the guide on , section 2 () – check that guide's .

    Different equipment slots

    How to determine the item type

    hashtag
    Summary

    Created by @manavortex Published June 10 2023

    This page is a part of the Adding new items guide and contains the steps necessary to create different equipment types.

    For an overview of prefixes for the different component types, see here.

    hashtag
    Step 1: The .yaml

    You define the item slot in your .yaml file by specifying the root entry type via $base:

    You can use the following types:

    Base record
    circle-info

    You can absolutely set up a shirt and then put $base: Items.GenericHeadClothing - V is the only person I know of who can wear their undies on their head without impairing their functionality. However, before you start abusing the system that way, you might want to look into .

    hashtag
    Step 1.5: EquipmentEx

    psiberx's mod EquipmentEx ( | ) adds a whole new wardrobe system, providing extra slots that CDPR forgot to include with the basegame. This feature requires the mod to be installed — without it, only the $base types from step 1 will be considered.

    All you need to do is adding the last two lines to your .yaml:

    circle-info

    Find a full list of outfit slots in the .

    hashtag
    Step 2: the entity file

    Some item properties are defined in the file mesh_entity.ent via components. If you use the wrong kind of entity, you might end up with your shirt being a puddle around your feet, or . To get around that, you need to make sure to pick a file that correspond's to your item's body part.

    You can find all entity files under base\characters\garment\player_equipment:

    If you want to be super thorough, you can stick to the right gender

    circle-info

    If you want to know more about components, check the . This is completely unnecessary for the purpose of this guide!

    LUT Generator | Tools | Learn & Helpwww.arri.comchevron-right
    NVIDIA Texture Tools ExporterNVIDIA Developerchevron-right
    DaVinci Resolve | Blackmagic Designwww.blackmagicdesign.comchevron-right
    https://github.com/nullfrctl/Realcolorrgithub.comchevron-right
    GitHub - WolvenKit/WolvenKit-nightly-releases: Provides WolvenKit nightly releases.GitHubchevron-right
    Logo
    Component prefixes

    Items.GenericInnerChestClothing

    Torso (outer, jacket)

    Items.GenericOuterChestClothing

    Legs

    Items.GenericLegClothing Items.Skirt

    Shoes

    Items.GenericFootClothing

    Outfit (full body, e.g. diving suit)

    Items.Outfit

    Head slot

    Items.GenericHeadClothing

    Head slot (glasses slot)

    Items.Glasses Items.Visor

    Head slot (mask)

    Items.GenericFaceClothing

    EquipmentEx
    githubarrow-up-right
    nexusarrow-up-right
    github readmearrow-up-right
    string cheese
    wiki page
    Pick any file from inside the correct folder.

    Torso (inner, t-shirt)

    Items.my_custom_shirt:                      << name of your item (the spawn code)
      $base: Items.GenericInnerChestClothing
      
    Items.MyHelmet:
      $base: Items.GenericHeadClothing
    Items.MyNecklace:
      $base: Items.GenericHeadClothing
      placementSlots: 
        - !append OutfitSlots.NecklaceShort

    Recolouring: 5 minutes once you know how it works, < 1h to get there

  • Refits:

    • Import Export: 5 minutes once you know how it works, < 1h to get there

    • Actual refitting: as long as you fucking want >.<

  • Permissions and Credit
    header right next to the requirements.

    For refits: Cyberpunk Blender IO suite

    Optional, but recommended: the Blender plugin for integration with Wolvenkit

    Editing a colour variant of your choice in MLSB

  • Refitting the Netrunner suit to a different body

  • :
  • Yes: you need to configure MLSetupBuilder. Follow the steps on the linked list until you have a full depot, then proceed with Netrunner Suit Preview

    • If you can't set up a depot in MLSB (because computer go brr), you might want to hit up the Redmodding Discordarrow-up-right to find help with your problem, or file an issue on github (Wolvenkitarrow-up-right | MLSBarrow-up-right). You can still use the Netrunner Suit Preview.

  • No: You have to options now. Please pick one.

    • Partial preview: I've prepared a bunch of files for you. Netrunner Suit Preview will show you where to put them.

    • No preview at all: This will make it harder because you're recolouring blind, but if you're cool with that, you can proceed with R&R: Your own Wolvenkit project.

  • folder from inside the archive there. You can find the path in MLSB's settings:
    copy
    them to that folder. If you're asked to overwrite existing files, click
    Yes
    . I can't tell you exactly how to do that, because each program works slightly differently. I'll include instructions for 7zip, just in case:
    1. Make sure that either nothing or everything is selected

    2. Click the Extract button in the taskbar (it looks like a blue minus)

    3. Find the Copy To field and do either of these things:

      1. Paste the path to your Cyberpunk 2077 directory into the field

      2. Click the … button next to the field, navigate to your

    4. Click OK

    5. If you get a Confirm File Replace popup, click Yes to All.

  • Optional, but recommended: Launch the game and make sure that the mod works:

    • Equip a suit in the Atelier Store's preview OR

    • Spawn one via Cyber Engine Tweaks and equip it (e.g. Game.AddToInventory("Items.mana_netrunner_suit_nylon_black_gold"))

  • Wolvenkit (short: WKit)

    >= 8.9.1 (stablearrow-up-right | nightlyarrow-up-right)

    The Cyberpunk modding tool — this lets you browse files and pack your custom mod.

    For recolours: MLSetupBuilder (short: MLSB)

    >= 1.6.7 (most recent — see the wikiarrow-up-right)

    A plugin for Wolvenkit, installed from inside Wolvenkit. You need this to make recolours.

    For refits: Blender

    3.6arrow-up-right

    R&R: Emissive
    Netrunner Suits modarrow-up-right
    Redmodding Discordarrow-up-right
    Lord of the Ringsarrow-up-right
    Step 0: Setup
    necessary setup
    Wolvenkit project
    creating a Wolvenkit project
    thisarrow-up-right
    the next section
    Nexusarrow-up-right
    create a Wolvenkit project
    mana vortex
    Don't skim - think of the kitten!
    Find the uncook folder under MLSB's File -> Preferences
    Interface version MLSB 1.6.7 - 1.6.8 will look different. Select t0_005_pwa_body__t_bug.
    This shows the 7ziparrow-up-right interface. If you're using a different program, this won't look the same, but the general steps are the same.
    Source: Steve Gorton and Tim Ridley, Alexander Hafemann/Getty Images
    Overview
    Netrunner Suit Preview
    Netrunner Suit Preview
    Install the mod

    A fully-blown 3d editing software (free and open source). You only need this if you want to do refits.

  • Instead of overwriting the entire .anims file, Wolvenkit will splice the NLA tracks that you will create below into the container. For that reason, you can have as many .blend and .glb files as you want and import them in sequence, or have all your poses in a single .blend.

  • Tool usage

    • You can limit a tool's effect to an axis by pressing x, y or z. Press the key a second time to use the local axis rather than the global one, and a third time to remove the limitation.

    • Viewport zoom matters. Get closer for finer movements!

    pressing R to enter rotation mode, then moving the mouse to rotate the bone (read up on axis limitation in the expandable box above) or

  • selecting the Rotate tool from the toolbar on the left, then clicking and dragging along the coloured axes

  • When you're done with this bone, position the next one.

  • Press I to open the keyframe menu

  • Press W to insert the whole character

  • Press the right arrow to select the next keyframe

  • Press I and then W again

  • After you have done that, click on the Push Down Action button

  • Now that you're sure that you have the correct names, switch the viewport back to Object Mode (the same way you switched to pose mode). Your armature should still be selected. TODO: This step will be made optional when the Blender plugin update hits. Update guide when it does.

  • From the File -> Export menu, select Export Selection to GLB for Cyberpunk

  • When you're done, hit "Export for Cyberpunk".

  • to Anims:

    Press Ctrl+C to copy their positions

  • Create a new NLA strip by repeating Step 2 — but instead of posing the armature, you can simply press Ctrl+V to paste the bone positions from your previous animation.

  • Export the new NLA strip, then import it via Wolvenkit. This should work now.

  • Wolvenkit (stablearrow-up-right | nightlyarrow-up-right)

    >= 8.9.1

    Blenderarrow-up-right

    3.6.2 LTSarrow-up-right

    Cyberpunk Blender Add-Onarrow-up-right

    1.3.0 (Jun 20)

    female

    base\animations\ui\photomode\photomode__female__idle.anims

    male

    base\animations\ui\photomode\photomode__male__idle.anims

    Photo Mode
    Appearance Menu Mod
    Animations
    xbaebsae | Angyarrow-up-right
    original animation templatesarrow-up-right
    Angy's Google Drivearrow-up-right
    Zwei's editarrow-up-right
    draw the rest of the owlarrow-up-right
    here
    previous step
    this is important
    check the animation names
    previous step
    previous step
    This is what adding your .anims to your project may look like
    Your viewport directly after opening the file.
    "Pose Mode" dropdown looks like this
    Armature -> Animation Data panel looks like this
    Animation timeline
    Before
    After
    Permissions and Credit
    header right next to the requirements.

    Needs load order?

    No, replaces original mod

    yes, needs to load before original mod

    Your mod has to load before the original, so you need to fix load order. (This guide will tell you how)

  • Project Name: The name of your project, and subsequently, the name of your .archive file.

    • If you want to overwrite: Name it the same as the original mod's .archive (_ArchiveXL_Netrunner_Variants)

    • If you want to patch: It needs to come before the original in alphabetical/binary order. Pick one of the following:

      • _ArchiveXL__Netrunner_Variants

      • __ArchiveXL_Netrunner_Variants

      • _00_ArchiveXL_Netrunner_Variants

      My personal preference is the first, as the .archive files will show up

  • Once you have found the correct items (for recolour or refit), this is how you add them to the project:

    The texture files inside the folders are named like material_baseColor_accentColor. Base colour and accent colour should correspond with the in-game suit name.

  • If there is a subfolder inside the material folder, the mlsetups inside are using the secondary mlmask. That's not going to mean anything to you, but we'll get back to it on R&R: Colour Editing.

  • Needs original mod?

    no, is a full replacement

    yes

    Can update original mod?

    no, and doing so will nuke your changes

    yes

    suit

    manavortex\torso\netrunning_suit\meshes\pwa_netrunning_suit.mesh

    emissive

    manavortex\torso\netrunning_suit\meshes\pwa_emissive.mesh

    suit

    manavortex\torso\netrunning_suit\meshes\pma_netrunning_suit.mesh

    emissive

    manavortex\torso\netrunning_suit\meshes\pma_emissive.mesh

    MLSetupBuilder installed
    configured
    installed the mod
    next one
    create your Wolvenkit project
    Nexusarrow-up-right
    here
    R&R: Emissive
    R&R: Colour Editing
    R&R: Refitting (step by step)
    R&R: Colour Editing
    R&R: Emissive
    R&R: Refitting (step by step)
    Source: Steve Gorton and Tim Ridley, Alexander Hafemann/Getty Images
    How to export files
    How to export files
    Selected files: Recolour
    Selected files: Refit
    Look into the head/morphtargets folder
    1. Optional: Be confused and/or panic about why there are over 9000 files again.

  • Delete all those files that you aren't using (read on as for how)

  • folder and the
    .morphtarget
    file in the subfolder
    morphtargets
    . If you want to understand why, keep reading; otherwise, you can proceed to
    .

    ht_

    teeth

    hx_

    applied on top of h0:

    • cyberware

    • makeup

    • freckles

    l1_

    ear ring (01-04)

    female V, tattoo 09

    male V, no earring

    Files to delete (0* means "01 - 04"):

    Click "Export Selected"

    Export all your morphtargets. Mesh files will be auto-generated for you.

    h0_

    head (with ears)

    hb_

    male V only: beard

    heb_

    eyebrows

    he_

    eyes

    female V, cyberware 03

    male V, scars 01

    male V, big beard

    minimum number of files

    4

    maximum number of files

    13 (female body gender)

    14 (male body gender)

    Nexusarrow-up-right
    Blenderarrow-up-right
    NPV: Creating a custom NPC
    NoraLee's NPV pickerarrow-up-right
    here
    Deleting Files
    editing the player head
    the convenient option
    table above
    here
    hook up stuff for the game files
    Blenderarrow-up-right
    more recent versionarrow-up-right
    2023-04-29arrow-up-right
    Nexus linkarrow-up-right
    Looks scary, but you don't have to do anything here!
    select "01_apply_shapekeys.py" from the dropdown menu
    Select and run it
    Deleting Files

    Optional, but recommended if you want to create multiple props: Notepad++arrow-up-right

    template_01_n.xbm: A normal (bump) map, adding depth to the object.
    Rename all files inside of the folder: replace template with the name of your prop (e.g. baseball). Make sure that it is the same as the containing folder, or you'll have to clean up things by hand later.
  • Right-click on your folder and export the entire thing to json.

  • Switch to the raw tab in Wolvenkit and open your json files in Notepad++

  • Via Search and Replace in Files (Ctrl+Shift+F), replace template with the name of your new prop and folder (e.g. baseball). Replace it in all files, using Match case:

    Make sure to check "Match case", or you will be unable to re-import the .ent file!
  • Optional: If you have changed the folder structure (e.g. moved your folder from the subfolder stuff to the subfolder misc), run another Search and Replace in Files (Ctrl+Shift+F) to adjust your file paths.

  • In the project browser's raw section, right-click on the folder and select Convert from json. This will have updated the relationships between the files to your renamed files.

  • Delete the files / appearances that you don't need. Save and close the mesh file.

  • Import your meshes and textures over the ones from the template. For a guide on how to do that, check here.

  • Add another entry to the props array in your LUA file:

  • name

    what you search for in AMM

    category

    what AMM sorty by (you can only reuse exisitng categories)

    distanceFromGround

    how far away from the ground should your prop be? (This moves the origin in Blender's 3d viewport)

    appearances

    If you're using a root entity, these are the appearance names to switch through and the entries in AMM's "appearance" dropdown / spawn tab

    here
    here
    here
    WolvenKitarrow-up-right
    Appearance Menu Modarrow-up-right
    explanation
    diagram
    Nexusarrow-up-right
    megaarrow-up-right
    source folderarrow-up-right
    how to change your paths
    Creating another prop
    diagram
    added clothing items
    here
    multilayer setup
    multilayer mask
    here
    troubleshooting
    here
    here
    here
    this toolarrow-up-right
    this step
    Textured items and Cyberpunk materials
    processing the mesh
    troubleshooting section
    Mesh/Component entity, loading something directly. You can read more about the theory here — you don't need to know for the rest of this guide.
    Root entity, pointing towards an .app file. You can read more about the theory here — you don't need to know for the rest of this guide.
    No app file, directly pulling in a mesh with defined appearance
    The better option — not actually that much more complex, is it? :)
    Not a moon

    Transferring Compressed/Normal Animations Between Containersarrow-up-right

    Tutorial by Deceptious & Zwei

    Making custom poses and animations from scratcharrow-up-right

    Tutorial by xbaebsae (Angy)

    Importing poses into the same containerarrow-up-right

    Google Doc (who made this?)

    Modifying Textures with WKit 8.7arrow-up-right

    Youtube tutorial

    Modding a normal map of V's headarrow-up-right

    Google Doc by nanarc

    How to refit in Blender (video)arrow-up-right
    How to refit in Blender (video, 1.6)arrow-up-right
    Custom hair coloursarrow-up-right
    Custom loading screensarrow-up-right
    Creating custom tattoosarrow-up-right
    Replacing vanilla tattoosarrow-up-right
    Unique eye texturesarrow-up-right
    CDPR: Redmod Part 1arrow-up-right
    CDPR: Redmod Part 2 (youtube)arrow-up-right
    CDPR: Redmod Part 3 (youtube)arrow-up-right
    Creating custom microblendsarrow-up-right
    Photopeaarrow-up-right
    Adding pride make-up to NPCsarrow-up-right
    Adding decals to clothing meshesarrow-up-right
    Custom T-Shirt frameworkarrow-up-right
    Transferring and expanding skeletonsarrow-up-right
    Boneless MA to PWA Swap Tutorialarrow-up-right
    Rigging long hair for Cyberpunkarrow-up-right
    Extracting Scenerid animsarrow-up-right
    Custom Props Creation Kitarrow-up-right
    Creating custom poses (youtube)arrow-up-right
    Pose mods and reference screenshotsarrow-up-right
    Hair colours overviewarrow-up-right
    Cheat Sheet: Hair
    Skin Color Overview
    Narrative Modding & Designarrow-up-right
    Game Quest arrow-up-right
    Creating voice effectsarrow-up-right
    videoarrow-up-right
    Making own radio stationsarrow-up-right
    guidearrow-up-right
    Making own radio stations (guide)arrow-up-right
    Exporting Rigs and Animsarrow-up-right
    Resources and tutorialsarrow-up-right
    Tutorialsarrow-up-right
    Custom ads and loading screensarrow-up-right
    Logo
    Logo
    archive:ArchiveXL_Netrunner
    resources                       << you are here
      - manavortex
      - r6
        - scripts
          - manavortex
    archive:ArchiveXL_Netrunner > emissive > .mi
    archive:ArchiveXL_Netrunner > .mlsetup > material > colour
    
    e.g.
    archive:ArchiveXL_Netrunner > .mlsetup > snake > blue
    archive:ArchiveXL_Netrunner > .mlsetup > carbon > bronze
    archive:ArchiveXL_Netrunner > .mlsetup > carbon > white > bronze
    tutorial\npv\your_female_character\head\i1_000_pwa_c__basehead_earring_01.mesh
    tutorial\npv\your_female_character\head\i1_000_pwa_c__basehead_earring_02.mesh
    tutorial\npv\your_female_character\head\i1_000_pwa_c__basehead_earring_03.mesh
    tutorial\npv\your_female_character\head\i1_000_pwa_c__basehead_earring_04.mesh
    tutorial\npv\your_female_character\head\hx_000_pwa_c__basehead_cyberware_03.mesh
    tutorial\npv\your_female_character\head\morphtargets\hx_000_pwa__morphs_cyberware_03.morphtarget
    tutorial\npv\your_male_character\head\hx_000_pma_c__basehead_scars_01.mesh
    tutorial\npv\your_male_character\head\morphtargets\hx_000_pma__morphs_scars_01.morphtarget
    tutorial\npv\your_male_character\head\hx_000_pma_c__basehead_scars_01.mesh
    tutorial\npv\your_male_character\head\hb_000_pma_c__basehead_big_beard.mesh
    return {
      -- put your name. Unless that's what you're called, not judging.
      modder = "your_name_here",
      
      -- you're supposed to put your _OWN_ thing here
      unique_identifier = "amm_custom_props_tutorial",
    
      props = {
        {
          name = "Tutorial item (customizable)",
          path = "tutorial\\amm_props\\template\\template.ent",
          category = "Misc",
          distanceFromGround = 1,
          appearances = {
              "template_item_textured",
              "template_item_multilayered",
          }
        }, 
        {
          name = "Tutorial item",
          path = "tutorial\\amm_props\\template_no_variants\\template_no_variants.ent",
          category = "Misc",
          distanceFromGround = 1,
        },
      }
    }
        {
          name = "Baseball (customizable)",
          path = "tutorial\\amm_props\\baseball\\baseball.ent",
          category = "Misc",
          distanceFromGround = 1,
          appearances = {
              "baseball_textured",
              "baseball_multilayered",
          }
        }, 

    pimples

  • tattoos

  • scars

  • tutorial\npv\your_female_character\head\hx_000_pwa_c__basehead_tattoo_09.mesh
    tutorial\npv\your_female_character\head\morphtargets\hx_000_pwa__morphs_tattoo_09.morphtarget
    tutorial\npv\your_male_character\head\i1_000_pma_c__basehead_earring_0*.mesh
    tutorial\npv\your_male_character\head\morphtargets\i1_000_pma__morphs_earring_0*.morphtarget
    Cyberpunk 2077 directory
    and click OK
    1.4.0arrow-up-right
    Logo
    Logo

    Archive XL: Item structure explained

    More detailed explanations for the guide "Adding new items"

    hashtag
    Summary

    Created by @manavortex Updated June 10 2023

    This page is a part of the Adding new items guide and explains how the different files interact with each other.

    circle-check

    If you have come here from the main page because you want to change the existing files, search for Making changes in each section. To add new appearances, the following files are relevant:

    circle-info

    Unless stated otherwise, any linked resources are optional and might not even be related to this exact guide.

    hashtag
    Structural files: telling the game about your mod

    We need four files to tell the game about our new items:

    1. the .xl file, which tells ArchiveXL which files to register

    2. the .json file with the translations

    3. the factory.csv, telling the game about your custom files

    hashtag
    The .xl file

    This file will be in the same directory as your mod's .archive file. It lets ArchiveXL register the (my_shirt_factory.csv) and the (translation_strings.json).

    You usually touch this only once, unless you want to add more factories or translation files.

    hashtag
    .xl: Making changes

    You only need to change this file if you have changed the factory's file path (moved the file) or want to add a second factory file (there is no need to, though).

    hashtag
    The .json file (custom texts, i18n)

    This is the localization file for language-specific entries (green boxes on 's screenshot). If no entry for a language is defined, then the English one will be used.

    An entry will look like this:

    circle-info

    If you don't need a male-specific translation, you can leave it blank — by default, femaleVariant will be used.

    hashtag
    .json: Making changes

    You need to change this file every time you want to add a new text entry to your mod. The easiest way to do this is by duplicating an existing entry.

    hashtag
    The .csv file (the factory)

    The factory connects your .yaml to the corresponding rootEntity.ent via entity_name.

    When reading your .yaml file (e.g.tutorial_my_custom_tshirt.yaml, ), the game will find entries like this:

    The csv file is where ArchiveXL will find an entry with the yaml's entityName in the first field. It will then check the corresponding for an appearance with the name in appearanceName.

    hashtag
    Making changes

    You only need to change this file when

    • you move a root entity (update the path!)

    • you add a new entityName — for example, a second t-shirt that you want to have its own root entity.

    hashtag
    The control file: yourModName.yaml

    circle-exclamation

    When editing this file, please keep in mind that indent is important!

    The first line of each block must not have spaces, the blocks below must have the same amount of spaces. More spaces means more nesting.

    Making mistakes here might break your entire mod, so if in doubt, run your edited file through an .

    This file controls the adding of items to the game. An entry looks like this:

    circle-info

    The entry above will let you add the item via Game.AddToInventory('Items.my_custom_shirt_redwhite')

    Four mappings take place here:

    1. entityName: Points to the (see documentation there as for what it works)

    2. appearanceName: In the specified in the factory, it will look for an appearance by this name.

    circle-info

    The appearance name will only be considered up to the first . If you want to know what those pesky & things are doing, read up the corresponding documentation.

    You don't need to know this unless you want to add variants for different genders or camera perspectives: we're avoiding them by puttingappearanceSuffixes: [].

    1. displayName/localizedDescription : In the translation_strings.json, find an array where the value for [3] (the last entry) is identical to this key. Then, check which gender V has, and display either femaleVariant or maleVariant.

    2. icon:

    hashtag
    What is it, precious? The $base parameter

    $base defines which slot the item will use. For the full documentation, see "".

    circle-info

    The inherited properties can cause problems (see "" for more detail).

    You don't need to know this unless you want to add variants for different genders or camera perspectives: we're avoiding them by puttingappearanceSuffixes: [].

    hashtag
    .yaml: Making changes

    You need to touch this file every time you want to add a new item (or when you want to change an existing one). It is easiest to duplicate an existing entry.

    If you want more than just the base properties, check the documentation for .

    hashtag
    The game files

    Now that we're done with the base structure, we can take a look at the game files. Like for any of the vanilla game items, we have four of them. This guide will only hold information that's directly relevant to adding item, but in the individual sections below, you will find links to more documentation about the files.

    circle-check

    With ArchiveXL >= 1.5, there is a new way of making these connections, saving most of the work of making many variants. You can still complete this guide and then see the documentation for dynamic loading .

    If you want to do more than 5 variants (for both body genders and camera modes), that approach is strongly recommended. Since there isn't a detailed guide yet, you can find us on in the #archive-xl channel.

    • appearance.app

    • mesh_entity.ent

    hashtag
    Overview

    This is how the files connect to each other. If your head explodes now, don't worry: it's not as complicated as it looks, and the item addition guide will walk you through step by step.

    hashtag
    root_entity.ent

    circle-info

    Full documentation of the root_entity is on its own page.

    Understanding this is not necessary for the purpose of this guide.

    The entry point from your yaml, this file is a glorified lookup dictionary: for any appearanceName, it will specify an .app file and the name of an appearance in the .app file.

    An entry looks like this:

    circle-check

    If you don't know what this means, skip it and wait for the full step-by-step guide!

    For using , you only need one appearance here, which must match the field appearanceName in the .yaml up to the variant separator ! Make sure to add the DynamicAppearance tag here.

    hashtag
    Suffixes

    The root entity's name field is where you would put suffixes for different appearance variants.

    circle-exclamation

    You don't need to know unless you want to make variants for different genders or camera types. In fact, you will want to skip this until you have a confirmed and working mod!

    To disable them, each entry in your contains the following line: appearanceSuffixes: []

    hashtag
    Root Entity: Making Changes

    When you change the path of this file, you need to adjust the path inside the .

    Adding a new appearance:

    Expand the list appearances and duplicate your already working entry.

    Change the following fields: appearanceName => everything before the & must match appearanceName in your *.yaml name => must match the name you're going to put in your app.app

    Example:

    old (copy):

    new:

    circle-info

    You do not need to change the appearanceResource.

    hashtag
    mesh_entity.ent

    triangle-exclamation

    For experienced modders

    This file replaces the component array inside the .app!

    circle-check

    Check for how to find the right mesh entity for each equipment slot.

    This file holds a collection fo components that determine how our equipment item behaves and moves. Each kind of equipment has different types of components, which is why you need to pick the for each equipment slot.

    circle-info

    Would you like to know more?

    Full documentation of More intel on

    Understanding this is not necessary for the purpose of this guide!

    By bundling them in this file, we save ourselves a lot of copy-pasting inside the .app file. The only component we actually need to change is the one with "Mesh" in its name, typically entGarmentSkinnedMeshComponent:

    The component's name will be used in appearance.app's materialOverride array (see )

    triangle-exclamation

    When changing component names, you want to leave the (t1_) in place — the game needs them to calculate collisions!

    circle-check

    If the text in this box tells you nothing, just ignore it for now

    If you're using , you can use property interpolation in paths. For example, *p{gender}a will resolve to pwa or pma, based on V's body gender. Read more about this on .

    hashtag
    Mesh Entity: Making Changes

    When you move this file, you need to change the path inside every appearance inside the . file.

    Otherwise, you only need to touch this file if you move the .mesh file.

    hashtag
    appearance.app

    Contains a list of appearances as mapped by . Each of the appearances will load mesh_entity.ent via partsValues and specify

    triangle-exclamation

    For experienced modders

    The .app file's component array should be empty: this is not an NPC appearance! :)

    An entry will look as follows:

    partsValues will define what file(s) to load (as a list of components), while partsOverrides tells the which appearance to use.

    For ArchivXL >= , appearance overrides can understand the following variables for meshAppearance:

    circle-check

    If you don't know what this means, skip it and wait for the full step-by-step guide!

    For using , you only need one appearance here. In this case, components will be ignored — make sure to put them all into your mesh_entity!

    hashtag
    Appearance: Making changes

    When you move this file, remember to change the path inside the root_entity.ent

    You need to touch this file every time you add a new appearance:

    1. Open the .app file and expand the list appearances.

    2. Duplicate an item and select the new one.

    3. Change its name to the one you just defined in the .yaml (black_blue_appearance_name)

    circle-info

    You can leave partsValues alone - this just points at the file that loads the mesh, and you've already set it up above when setting up the file.

    hashtag
    Mesh

    The mesh file maps materials to appearances. To find out how exactly it does that, find the on the mesh wiki page.

    circle-info

    Would you like to know more?

    #appearan

    The documentation for .mesh files lives on their own page!

    For our purposes it's enough to say that you can define your individual appearances here.

    hashtag
    Mesh: Making changes

    1. Find the array appearances and open it.

      1. Duplicate any meshMeshAppearance.

    For further information and guides, check or see .

    hashtag
    The final result

    This is how everything plays together:

  • app

  • mesh

  • .json (translations)

  • You do not need to touch the mesh entity.

    the yaml, which tells TweakXL about your item's properties
    This hooks up your custom preview.
    the mesh file

    In the new appearance, find the array partsOverrides and expand it.

  • Select the item inside.

  • Find and expand the Array appearanceAppearancePartOverrides and expand it.

  • Select the first item.

  • Open the array componentsOverride and select the first item.

  • Change the value of meshAppearance to the name of your new appearance in the mesh:

  • Understanding this is not necessary for the purpose of this guide, but you might want to reference it once you run into trouble.
    Change the name to the one you've defined in the
    appearance.app
    above (in this case:
    mesh_black_blue
    ):
  • Select the array chunkMaterials and change the entries in the right-hand panel to the name of your new material (e.g. black_blue)

  • Find the array materials and open it.

    1. Duplicate the last entry. (Yes, use the last one, please, it's important for step 3).

    2. Select the new last entry

    3. Set the following values:

      If you duplicated the last material, you can just increase it by one.

  • Find the array localMaterialBuffer and open it

    1. Duplicate any entry with an mlsetup (You will see an entry MultilayerSetup under values)

    2. Drag it to the last position of the array (that's important, because the materials entries match by numeric index)

    3. Select the new item, open values, and select MultilayerSetup.

    4. Set baseMaterial/DepotPath to the .mlsetup file that you want.

  • {gender}

    m or w depending on V's body gender

    {skin_color}

    skin color appearance name

    {hair_color}

    hair color appearance name

    .yaml
    root entity
    factory
    localization file
    the xl file
    next section
    root entity
    online yaml validatorarrow-up-right
    factory.csv
    root entity
    suffix
    Different equipment slots
    Suffixes, and whether you need them
    TweakXL's creating recordsarrow-up-right
    on its own page
    Discordarrow-up-right
    root_entity.ent
    Would you like to know more?
    dynamic appearances
    what suffixes are
    .yaml
    factory.csv
    here
    right mesh entity file
    mesh_entity
    components
    below
    dynamic appearances
    ArchiveXL's githubarrow-up-right
    app
    rootentity.ent
    mesh_entity
    mesh
    1.4.0arrow-up-right
    dynamic appearances
    material section
    3d objects: .mesh files
    here
    3d objects: .mesh files
    The file structure as used in the Adding New Items guide. Some information has been omitted for brevity.
    Example .xl file. Note that anything with a - at the beginning of the line indicates a list; you can add more entries!
    The value under secondaryKey must match the entry in your .yaml file, or you will just see an empty string.
    When spawning an item, TweakXL knows which entity file to use by filtering entityName for a match in the first field
    The only component we actually need to change is the entGarmentSkinnedMeshComponent
    Appearance.app (annotated)
    Component prefixes
    Items.my_custom_shirt_redwhite:
      entityName: my_custom_shirt_factory_name             << this is for the factory.csv
      appearanceName: appearance_root_entity_white_red     << this is for the root_entity.ent
    	appearanceName: black_red_appearance_name
    	name: appearance_root_entity_black_red
    	appearanceName: black_blue_appearance_name
    	name: appearance_root_entity_black_blue
    componentName: t1_tutorial_custom_shirt_4711   << no need to change this  
    mesh_appearance: mesh_black_blue                << corresponds to meshMeshAppearance.name in my_mesh.mesh  
    name:  mesh_black_blue           <<< as defined in step 1 and used by meshMeshAppearance in appearances[]  
    index: <index of item in array>  
    Wolvenkit's search
    Troubleshooting
    how Wolvenkit knows
    a Wolvenkit project
    Wolvenkit search documentation
    installed
    create a new project
    Download and install Wolvenkit
    Configure Wolvenkit
    Create a project
    Search
    Export Tool
    Import Tool
    Wolvenkit installed
    install your mod
    Wolvenkit's search bar

    Textured items and Cyberpunk materials

    Importing textured items (and creating an AMM prop set in the process)

    hashtag
    Summary

    Created by @manavortex Published February 11 2023

    This guide will walk you through importing 3d objects into Cyberpunk 2077, which can then be spawned via Appearance Menu Modarrow-up-right.

    It uses the following versions:

    • Cyberpunk 2077 game version 1.6.1 (DLSS)

    • >= 8.8.1

    • (version 2.0.2, but pretty much any version will do)

    Level of difficulty: You know how to read.

    circle-check

    If you only want to know how to apply Cyberpunk materials to parts of your mesh, check "" below.

    For a guide about changing materials, check

    circle-info

    If you want to understand how material loading works, check the .

    You can find explanation and documentation about materials .

    hashtag
    Where to find models

    You can find many free 3d models across the web.

    For game design or rendering, usually textured:

    For 3d printing, usually not textured:

    You can also search Google for "thing_I_want free 3d model" or "thing_I_want free <format> file" (<format> = STL, OBJ, FBX), or check or the pages on .

    hashtag
    Setting up the project

    This section is already covered in the guide for , using the source folder variant, or directly download and extract it into your Wolvenkit project.

    Optional: Complete the section from the custom props guide, or alter one of the two existing template items.

    circle-check

    This guide will assume that you are editing template_no_variants.mesh, as our focus is on mesh import and material assignment. You can delete the folder amm_props\template, since we won't need it.

    Delete obsolete files (Windows Explorer or WKit):

    • amm_props\template

    • amm_props\template_no_variants\template_no_variants_multilayered.mesh

    • textures\6_layers.mlmask

    hashtag
    Importing a mesh

    hashtag
    Step 1: Exporting

    circle-check

    The first step to importing a mesh is exporting a mesh, since the import needs to overwrite already-existing files.

    In Wolvenkit, open the Export Tool (Tools -> Export), and export everything in your folder: the mesh(es) you want to use and the textures.

    This will create the following files under the project's raw section:

    hashtag
    Step 3: Importing

    Optional: Download - I have prepared it for import. It contains both the original glb from sketchfab and the version I prepared for import:

    After you have exported the files from Wolvenkit, use the Windows Explorer to overwrite them with the files that you want to bring into the game. They need to have the same names!

    Use baseball_02_d.png, as the other one doesn't have transparency.

    circle-info

    The import/export process has . There's also a if you're stuck.

    Now that all files are in place, open the Import Tool in Wolvenkit (Tools -> Import), and re-import the files. The Wolvenkit preview should show your new imported mesh.

    The next step is to to the object.

    hashtag
    Wait, where did Step 2 go?

    circle-check

    Good! You've been paying attention! Step 2 is to prepare the downloaded 3d asset to work with Cyberpunk. Depending on your target file, this can be any level of difficult, but the steps below should be enough for most meshes.

    hashtag
    Step 2: Processing the downloaded mesh

    circle-info

    All of these steps will be taking place in Blender.

    The files you download will have all sorts of structures. In the end, you want to end up with a flat hierarchy of object(s):

    LOD_1 indicates the level of detail, whereas the submeshes need to be numbered explicitly (or Wolvenkit will number them for you, which messes up the material assignments. You'll want to avoid this).

    circle-check

    The easiest way to get there is by running (source: manavortex's github) in Blender after import: - Switch to the "Scripting" perspective - Create a new file - Paste the contents of the script into the file - Hit the "play" button

    triangle-exclamation

    A mesh that I imported with 9 simultaneously visible submeshes made the game crash with a likelihood of ~ 80% when I spawned or de-spawned it (scaling was fine). You might want to create two separate files if you have too many objects.

    Since it clearly works for e.g. the body mesh, make of this what you will.

    hashtag
    Submesh by material

    Sketchfab meshes often use dozens of submeshes, but we want to split by cyberpunk's logic:

    circle-info

    Every submesh can have its own material assigned in the mesh, and can be hidden or displayed via chunkmask. This is how you assign Cyberpunk materials to parts of your imported asset.

    I've always found it easiest to join all meshes into a single one:

    • In Object Mode, select all meshes but one

    • Select the last mesh

    • Press Ctrl+J to merge everything into that last mesh

    This will let us assign one material per "section" of your mesh.

    circle-info

    Especially when exporting meshes from sketchfab, there are often duplicate materials. Feel free to fuse everything that you want to e.g. slap black plastic on.

    hashtag
    Splitting off submeshes (mildly advanced)

    I usually join everything into one object that'll have the same material in the game, unless I want to hide parts of it to make variants.

    But the opposite is also possible: You can split off parts from the original object, putting them into their own submeshes. I have done this in the : the seams will get a texture, and the rest of the mesh will be coloured with a cyberpunk material.

    You do that by changing into the edit mode, then selecting everything that you want to split off ("Select Linked" or "Select More" is your friend here), and splitting it (P -> Split Selection).

    circle-info

    You can duplicate your selection first (Shift+D, ESC)

    Now, switch back to Object mode and select your new mesh before going back to Edit Mode. Make sure to your new mesh, so that it is slightly above the surface of the old one - otherwise, you will have two things in the same place, which will look like shit.

    Make sure to , or run again.

    hashtag
    Unparent

    circle-check

    You can complete unparent + apply transformations via : Switch to the Blender "Scripting" perspective, create a new file, paste the code from mana's github, and click the play button.

    Select everything (click the viewport and press A), then unparent the objects by pressing Alt+P. Select "Clear and Keep Transformation".

    hashtag
    Applying transformations

    Since those are saved relatively and Wolvenkit will ignore them, your objects might end up larger or smaler than you expect them, or be in different places.

    Select your objects in the viewport, then press Ctrl+A and choose "All Transforms".

    hashtag
    Scale it

    Scale your 3d object in Blender until it has the size you expect it to be in-game.

    If you do this in the object mode, you need to afterwards. Alternatively, you can scale the vertices in edit mode.

    circle-info

    If your mesh still scales weirdly in Wolvenkit / the game, you can create a new mesh in Blender, delete its vertices in edit mode, and then join your original object on top of it.

    circle-check

    If you need a reference object, you can use this from my .

    hashtag
    Origin

    Keep in mind that your prop will rotate around the world origin, and position it accordingly.

    circle-check

    Once you are done, import the glb file over your original mesh (you can consult the below).

    Your import has been successful when the preview in Wolvenkit changes (you might have to select another file first).

    hashtag
    Material assignments

    circle-info

    For an overview of materials that you might want to use for something, check .

    You can check a material's properties by opening the file inside of Wolvenkit and checking the last entry of the "parameters" array, or search for "files using this" and looking at how they're doing things.

    hashtag
    Setting up our materials

    circle-info

    You can find explanation and documentation about materials .

    hashtag
    Add a new material entry

    1. Select the entry "texture" inside the array materialEntries

    2. Duplicate it

    3. Select the new entry

    hashtag
    Assign the submesh

    Open the array appearances, select the first appearance (default) and select the array chunkMaterials. Create a new entry, or duplicate the existing one. Make sure the list order shows

    hashtag
    Transfer the material

    1. Open baseball_textured.mesh

    2. Find the CMaterialInstance "texture" inside localMaterialBuffer.materials.

    3. Select it, then copy it via right-click (Copy (Selection) from Array/Buffer)

    hashtag
    Change the material parameters

    Let's update paths and values. Still inside of localMaterialBuffer.materials, change the following properties:

    Material
    name of KeyValuePair
    value

    For the leather texture, I've just picked a random mlsetup from the game files (which I found by searching Wolvenkit for leather > .mlsetup). If you want to make your own mlsetups, see .

    circle-check

    Save the mesh. You can check the "Mesh Preview" tab if the materials show up. If the mesh turns invisible, you'll want to double-check your paths, though!

    hashtag
    Let's set up our entity file

    1. Open the baseball's entity file (your_name\your_prop_pack\baseball\baseball.ent).

    2. Open the components array.

    3. Select the second component (amm_prop_slot1

    circle-exclamation

    If you have more than four mesh files assigned to your entity's components, the prop will no longer be scaleable (as of AMM 2.0.2). You can get around this limitation by making meshes with more submeshes instead of individual files.

    hashtag
    AMM: Let's set up our lua file

    Open the lua file under resources\bin\x64\plugins\cyber_engine_tweaks\mods\AppearanceMenuMod\Collabs\Custom Props\your_prop_pack.lua.

    Set modder to your name and unique_identifier to anything, e.g. your_name_your_props. Now, adjust the first entry in the "props" list to point to your entity file:

    circle-exclamation

    The "path" parameter is the relative path to your entity file, but every backslash has to be doubled.

    "name" is what you'll search for in AMM. "distanceFromGround" is pretty self-explanatory, but I prefer it if my objects are floating.

    circle-check

    Save the lua file, install your mod, and launch the game. Time to test!

    hashtag
    Material assignments

    For an explanation how materials are assigned to a mesh, check - this guide will just tell you what to do.

    circle-info

    You can copy entire materials between meshes: select one, right-click, and pick one of the "copy from…" entries.

    circle-check

    Open template_no_variants_textured.mesh in WKit. All of the following operations will take place in that file.

    hashtag
    Adjust your chunkMaterials

    Open appearances/default/chunkMaterials. You need to have one per submesh.

    For a more detailed explanation/guide, see the next section. If you don't care, you can skip straight to the next section and fix up the .

    hashtag
    Explanation:

    chunkMaterials are where you assign materials by submeshes. The identifier here is the name. Before changes, the first (and only) submesh will use the material mat_textured. Our newly imported mesh (the baseball) has two.

    Add a new chunkMaterial to the array by either

    • right-click the existing chunkMaterial and select duplicate

    • select the array chunkMaterials and then click the yellow (+) button int he side panel

    then change the name of the first entry to mat_ingame:

    circle-info

    You can name your materials whatever you like, as long as you stick to the following rules:

    • You need one chunk material per submesh

    • chunkMaterials needs to be

    hashtag
    Material entries

    1. Find the array materialEntries at the root level of the mesh and open it. It will have two entries:

    2. Select the second entry and change its name to the one from your chunkMaterial (mat_ingame). Numerical order does not matter here.

    hashtag
    Explanation:

    MaterialEntries are a lookup map between the material names in the chunkMaterials and the actual materials (see for an explanation). You can have local or external materials or a mix of both; check for an explanation.

    circle-check

    Now, we adjust the materials — we'll just change a few properties to show you how it works, and then you can go play.

    For another guide on how to edit materials in detail, check

    hashtag
    Setting up the materials

    Find the array localMaterialBuffer/materials and open it. It contains two materials. Wolvenkit will display the names corresponding to the so you can see which is which.

    circle-info

    For an explanation of material parameters, see .

    The first one, mat_textured, is the one that we will use for the seams. If you imported your textures by overwriting the original export, you shouldn't need to do anything here.

    Instead, we will change the second material, mat_ingame.

    hashtag
    Re-using an mlsetup

    If you rather want to make your own mlsetups, see .

    • Select mat_ingame

    • Expand the material and its values array

    • Delete the parameter MultilayerMask

    hashtag
    Make it gold, baby!

    • Select mat_ingame

    • Delete all parameters from the values array

    • Set the baseMaterial to base\environment\decoration\containers\cases\coffin\textures\m_z_gold.mi

    The possibilities are basically endless, so go and explore them already! For a nifty list with materials to get you started, check . For a guide on creating AMM props, see .

    hashtag
    Troubleshooting

    This section will only cover troubleshooting steps for this guide. For general 3d model troubleshooting (including import errors), see .

    hashtag
    My prop doesn't spawn and AMM won't target it!

    AMM can't find your .ent file. Check the paths in the lua.

    hashtag
    My prop is invisible (but AMM targets it)!

    This can be one of the following issues:

    • the path from .ent to .mesh is wrong

    • the mesh appearance in the .ent file can't be found (check spelling in both .ent and .mesh)

    • the mesh appearances's chunk materials can't be found (check spelling in the .mesh, both in the chunkMaterial assignments and the CMaterialInstance in localMaterialBuffer.materials)

    If that doesn't help as well, try assigning a default game material (search for anything ending in .mt and put the path in your material's baseMaterial.DepotPath).

    • Try assigning a default game material by searching for

    hashtag
    My prop is all over the place / too big / too small

    Check the in Blender and make sure that you have .

    hashtag
    I don't have a normal map texture, but my import looks shit without one

    Use engine\textures\editor\normal.xbm

    hashtag
    Some of my props are much "lighter" than others!

    These ones will have a blue normal map as opposed to a yellow one. Invert the blue normal texture before importing it..

    hashtag

    Exporting to Blender
    Exporting Streaming Sectors to Blenderarrow-up-right
  • textures\6_layers.mlsetup

  • Switch to Edit Mode
  • Select everything (Shortcut: A)

  • Separate (Shortcut: P) and select "By Material"

  • Optional, but recommended: run the script again to get properly numbered submeshes.

  • Change the name to mlsetup

  • Change the index to 1

  • Switch to baseball_tml.mesh

  • Select localMaterialBuffer.materials

  • Paste the textured material (Right click, Paste (Selection in) to Array/Buffer)

  • You can now delete the second mesh, as you don't need it anymore.

  • mlsetup

    GlobalNormal

    your_name\your_prop_pack\baseball\baseball_n01.xbm

    MultilayerMask

    delete it

    MultilayerSetup

    base\characters\garment\gang_nomad\legs\l1_021_pants__cargo_computer\textures\leather_red_basic.mlsetup

    )
  • Change the mesh -> depotPath to the path of your baseball mesh (your_name\your_prop_pack\baseball\baseball_ml.mesh).

  • Leave meshAppearance on default, unless your mesh has multiple appearances: This is where you select which entry in the mesh's appearance array will be used.

  • Delete the other amm_prop_slot components. (These are where you would add more mesh files to your prop - but keeping them makes your prop be full of glowing cubes).

  • Save the entity file.

  • in the same order
    as your submeshes — if you're uncertain, check the "Mesh Preview" tab
  • The names should be lower case without spaces and special characters. Numbers are fine!

  • GlobalNormal: Re-use the same as your textured material (by default: tutorial\amm_props\template\textures\template_01_n.xbm)

  • MultilayerSetup: Set it to base\characters\garment\gang_nomad\legs\l1_021_pants__cargo_computer\textures\leather_red_basic.mlsetup

  • Also not a moon

    Check your mesh's face orientation in Blender — inside-facing meshes are usually transparent.

  • Check your mesh's chunkmasks in the .ent file: maybe you have accidentally hidden a submesh?

  • textured

    Normal

    your_name\your_prop_pack\baseball\baseball_n01.xbm

    BaseColor

    your_name\your_prop_pack\baseball\baseball_d01.xbm

    WolvenKitarrow-up-right
    Appearance Menu Modarrow-up-right
    Splitting off submeshes
    here.
    mesh page
    here
    sketchfabarrow-up-right
    Turbosquidarrow-up-right
    CGTraderarrow-up-right
    thingyversearrow-up-right
    MyMiniFactoryarrow-up-right
    Pinshapearrow-up-right
    STLFinderarrow-up-right
    this listarrow-up-right
    custom props
    this archivearrow-up-right
    creating another prop
    this archivearrow-up-right
    its own guide
    troubleshooting page
    assign materials
    this python scriptarrow-up-right
    baseball examplearrow-up-right
    scale
    correctly name your new submesh
    the scriptarrow-up-right
    Blender scriptarrow-up-right
    apply transformations
    lightsaberarrow-up-right
    propsarrow-up-right
    troubleshooting section
    here
    here
    here
    this page
    material entries
    here
    this page
    here.
    material entries
    this page
    here
    here
    here
    here
    scaling
    applied transformations
    File content as archive, April 8 2023
    AMM will rotate your object around the point 0,0,0.
    Not a moon
    Not a moon
    Scene Collection
        ▽ submesh_00_LOD_1
        ▽ submesh_01_LOD_1
        ▽ submesh_02_LOD_1
        ▽ submesh_03_LOD_1
    0    mlsetup
    1    textured
    return {  
      modder = "your_name",
    
      unique_identifier = "your_prop_pack",
    
      props = {
        {
          name = "Baseball",
          path = "your_name\\your_prop_pack\\baseball\\baseball.ent",
          category = "Misc",
          distanceFromGround = 1,
        },
      }
    }
    
    Giving an NPC custom clothes

    Adding new items

    No more replacers! Add your own gear with TweakXL and ArchiveXL

    hashtag
    Summary

    Created by @manavortex Published November 04 2022

    This guide will walk you through adding your own items to Cyberpunk 2077, which can then be spawned via console.

    It uses the following versions:

    • Cyberpunk 2077 game version 1.6.2 Hotfix

    • >= 8.9.0

    • 1.1.4

    Assumed skill level: You should be able to find your way around WolvenKit, but I aim to keep this as noob-friendly as possible.

    triangle-exclamation

    For experienced modders

    I have repeatedly observed that newbies are fine with this guide, while people who know how to mod are not. Watch out for boxes like this one to avoid those pitfalls.

    The guide was created after reading and being left with a bunch of question marks. To get a deeper understanding, refer to the initial guide and follow the linked resources or consult ArchiveXL's .

    circle-info

    To troubleshoot your ArchiveXL mods, you can make use of the FileValidation in Wolvenkit >= 8.9.1. As of Jul 22nd that isn't yet released, but you can download a (for example , as it's pretty stable).

    circle-check

    There is a new way of connecting your files: . There is no detailed guide yet, but if you want to create lots of options, then you will definitely want to check out this approach, as it cuts down your file structure overhead by virtually eliminating the root entity and .app file.

    hashtag
    Grab the example files

    • Create a new Wolvenkit project

    • Download the prepared files from and extract them to the root of your new project (overwriting the "source" folder)

    circle-info

    If you would rather start from scratch: Check the detailed instructions .

    Understanding of the file structure is not required as long as you follow the guide to the letter, but if you want it anyway, see the sub-page.

    triangle-exclamation

    ⚠ Do not edit those files outside of WolvenKit, and whatever you do, do not let Microsoft Excel touch the clothing.csv! ⚠

    hashtag
    You should now have the following files:

    hashtag
    Start the game

    circle-info

    Wait, am I not supposed to do anything first??

    Actually, no! This is how you later debug your custom items — by packing your project and checking that everything works in-game. So we're starting with a dry run here.

    Press "Install and Launch" in WolvenKit. This will do the following things:

    1. Copy all supported file entries from source to their destination under packed, overwriting older files (but not removing files that you renamed!)

    2. Copy all files under packed into your game directory, again overwriting older files

    You should now see your the tutorial item. If not, consult the section below, or retrace your steps and make sure that everything works before proceeding to the step below.

    hashtag
    Great! You added items! Now what?

    You've successfully pushed a button and everything worked, but so far, you haven't done anything. If you're okay with this, then you're done now.

    circle-check

    To start changing the existing files, check the page for "Making Changes" headers.

    Otherwise, you will want to complete one or more of the following steps:

    • add than a torso item

    • Add more

    • Add for different genders or different camera modes

    hashtag
    Diagram

    This is how everything connects. Looks pretty scary, but is actually simple: whenever you want to rename or repath something, make sure that you catch both ends of the arrow.

    You can find a breakdown-by-entry on the .

    circle-check

    With ArchiveXL >= 1.5, there is a new way of making these connections, saving most of the work of making many variants. You can still complete this guide and then see the documentation for dynamic loading .

    If you want to do more than 5 variants (for both body genders and camera modes), that approach is strongly recommended. Since there isn't a detailed guide yet, you can find us on in the #archive-xl channel.

    hashtag
    Adding an appearance (example: blackblue)

    circle-exclamation

    Before you add an appearance, make sure that your item is loading up correctly and looking as expected. If you have to debug, you will have to look through every appearance you made!

    For experienced modders: This includes you! :)

    circle-info

    If you would rather have a step-by-step guide for a gendered variant, see .

    To add an appearance, you will have to touch the following files:

    1. *.yaml: Adding an entry

    2. appearance.app: Adding a mapping between rootentity and mesh's appearance

    3. rootentity.ent: Adding a mapping between yaml's appearance and app's appearance

    circle-info

    For a diagram of how everything connects, go . To follow the

    hashtag
    Step 1: Register it in your *.yaml

    1. Duplicate the entire appearance block for an already working item. ⚠Mind the indent!

    2. Change the first line to a unique name like Items.my_custom_shirt_blueblack

    3. Set the new appearance name for the rootentity.ent

    The total entry should look like this:

    hashtag
    Step 2: Add it to the rootentity.ent

    Find the step-by-step guide in the on the "" page.

    If you want to add a , make sure to add the DynamicAppearance tag here.

    hashtag
    Step 3: Add it to my_custom_shirt.app

    Find the step-by-step guide in the on the "" page

    hashtag
    Step 4: Add it to the .mesh

    This tutorial assumes you already know how to . Quick reminder about the mlsetup:

    1. Export it to json

    2. edit the mlsetup.json with the

    3. Import it back

    Find the step-by-step guide in the on the "" page

    hashtag
    Test it

    Now, log into the game and spawn the item variant. The name is the header you defined in the yaml file, in this case

    hashtag
    Adding a Male Instance

    triangle-exclamation

    This part of the tutorial isn't fully up-to-date with the overhauled file structure yet, so keep that in mind when studying the screenshots.

    circle-check

    Also, this part is super easy to follow and even if you make a mistake, fixing it won't be a problem. But hey, you've put in a lot of work and made great progress, so why not take a sec and back up your project files? Better safe than sorry, right?

    Before we proceed with the tutorial, it's important to address a common issue you might have encountered while creating your mod.

    If you've tested the mod on a Male V, you might have noticed some weird glitches like mesh clipping or wonky shapes.

    You see, we've been using a mesh designed specifically for Female V, and that's why we've been running into some roadblocks. But don't worry, we're here to help you overcome this challenge!

    hashtag
    Preparing the mesh file for the male variant

    To fix this issue, we'll need a mesh that's compatible with Male V.

    In the interest of keeping things simple, we've found just the mesh for you! It's called t1_024_ma_tshirt__sweater.mesh and it can be found in the base\characters\garment\citizen_casual\torso\t1_024_tshirt__sweater directory.

    circle-exclamation

    If you plan on using other meshes for your mod, ensure that it has ma or pma in its name.

    Keep in mind that some ma meshes may still have clipping issues when paired with certain types of clothing, while pma meshes are specifically designed for V and don't have this problem.

    Now, add the file to your project, move it to the tutorial\torso\my_custom_shirt\ folder and rename it from t1_024_ma_tshirt__sweater.mesh to my_mesh_m.mesh.

    Next, follow the steps you used for the original my_mesh.mesh by removing any unnecessary entries and adjusting the indices.

    triangle-exclamation

    To avoid any issues, it's crucial to pay close attention to this step and double-check that the correct materials are present in the localMaterialBuffer and materialEntries, and that the indices are adjusted correctly.

    This will ensure that your mod works as intended without any glitches or errors. If you need a refresher, to return to that section.

    hashtag
    Creating a .ent File for Your Custom Mesh

    It's time to set up the .ent file for our mesh. Don't worry, it's easy!

    Start by making a copy of the mesh_entity.ent file that you previously created for the female version by duplicating it, and rename it to mesh_entity_m.ent.

    Inside the mesh_entity_m.ent file, find the first component of the type entGarmentSkinnedMeshComponent. Set the following values:

    hashtag
    Edit the yourModName.yaml

    Inside the yourModName.yaml file set the appearanceSuffixes array to itemsFactoryAppearanceSuffix.Gender

    circle-info

    If you are unclear about why this step was taken, we recommend !

    hashtag
    Edit the rootentity.ent

    1. Find the array appearances.

    2. Expand the first entry.

      1. Append &Female to the name attribute. This will change the name from appearance_root_entity_white_red

    hashtag
    Edit the appearance.app

    1. Find the array appearances

    2. Duplicate the first entry to create a new one and expand it

    3. Set the name attribute to my_shirt_m

    hashtag
    Testing the mod

    To test your mod, it's important to ensure that it works correctly for both male and female V. This means you'll need to have two separate save files, one for male V and one for female V, unless you're using a mod that allows you to quickly switch between them.

    Test your mod independently for both cases by loading the appropriate save file and checking that the mod is working as intended. To spawn and equip your item, use the command specified in your YAML file.

    circle-check

    Consider reviewing the guide to ensure that all steps have been followed correctly and that the values have been set appropriately. Ensure that the mesh is compatible with the male variant of V. If errors persist, review the for further assistance.

    hashtag
    The final touches

    If everything is working: Congratulations! You have successfully made a mod!

    But before you can share it, you need to do one last thing, which is changing the file structure. Otherwise, everyone will overwrite the same tutorial files, and only one of those mods will work.

    You can find a full guide on how to do that .

    hashtag
    Troubleshooting

    circle-info

    The easiest way to spot what's wrong is to use Wolvenkit's new FileValidation feature, which will print warnings and errors to the log file for you, starting at version >= 8.9.1.

    First of all, check the logs for errors including the name of your mod:

    • red4ext/plugins/ArchiveXL/ArchiveXL.log

    • red4ext/plugins/TweakXL/TweakXL.log

    hashtag
    ArchiveXL added clipping!

    You have read right past those warning boxes telling you about . Make sure that you add them back.

    hashtag
    My item warps weirdly

    ... deforms incorrectly, or is a puddle on the floor?

    Most likely, you have ignored the when picking your mesh_entity.ent: Make sure that you're using an entity file that corresponds with the slot that you are trying to replace (e.g. if your item is a pair of shoes, you need an entity file from base\characters\garment\player_equipment\feet).

    circle-info

    If you are here because of a link from a different guide:

    You can find out which entity file your item uses by right-clicking on your mesh and selecting "find files using this". Add the .ent file to the list and open it in WolvenKit. Then, of the "components" array with those of an .ent file from the correct folder — don't forget to change the path to your mesh again!

    hashtag
    I spawn my item, but it's not added to my inventory!

    circle-exclamation

    Before you start digging into your file structure, check if there are any leftover yaml files from earlier versions/deploys in your tweaks directory. Do a full text search in e.g. Notepad++ in any files in the folder with the name of the item you want to spawn.

    If no additional yaml files are messing things up, then the error is somewhere in the first part of the chain and relatively easy to fix:

    Check the following places:

    • yourmodname.archive.xl:

      • Is the indentation correct, as shown in the picture?

      • Did you make any typos?

    hashtag
    My item shows empty text instead of name/description!

    Something went wrong with your json file:

    If there are no errors in any of the log files, check the following places:

    • yourmodname.archive.xl:

      • Does the key localization - onscreens - en-us exist?

    hashtag
    The item spawns, but…

    Congratulations, you've made it into the right half of the diagram! The error will be somewhere here:

    circle-check

    can help you catch the error.

    circle-info

    If you set your mesh_entity.ent to point at a vanilla mesh, you can rule out your custom mesh and .mlsetup as a source of errors. Original game meshes will always have a working default appearance and will thus always be displayed!

    hashtag
    The game crashes!

    That means the chain is working, but something isn't loaded correctly. That's good! Check the following files:

    • appearance.app: Check the partsValues and partsOverrides entries. They need to point at the mesh_entity.ent, not at the mesh.

    • mesh_entity.ent: Does the component

    If the default mesh is displayed correctly, then we have narrowed down the problem.

    If the default mesh is not displayed correctly, then there's an issue between the root_entity and your .app file, or in the .app file's internal logic.

    hashtag
    Troubleshooting a mesh

    For more detailed error handling, check the sections below, or check .

    ℹ In the "Mesh Preview" tab of your mesh, you can "Generate Materials for Appearance". If the correct colours show up, you can at least rule out that the error is in the .*mesh or its material.

    • Make sure that you have the same number of entries in materialEntries and localMaterialBuffer.materials .

    • Go through the CMaterialInstances in localMaterialBuffer.materials.

    If none of that helps, I suggest

    • doing a gdb export

    • throwing away your mesh (don't close the WKit tab yet), falling back to the original one

    • doing a gdb import

    hashtag
    My mesh is black and shiny!

    Congratulations, this is about the easiest-to-resolve error that you could've had. Your mesh is loaded correctly, there is only a problem with the rendered material.

    Check your mesh file:

    • Check the connection between appearance, materialEntry and localMaterial.CMaterialInstance. Are the names correct?

    • Go through the CMaterialInstances in localMaterialBuffer.materials.

    hashtag
    My mesh has the wrong appearance!

    Either an appearance is incorrectly selected, or it is incorrectly resolved. Check the following places for copy-paste/duplication mistakes:

    yourModName.yaml - is the appearanceName correct, or did you forget to change it? rootentity.ent - does the name corresponding to the field above point to the appearanceName with the right name in the right appearance file? appearance.app - does the appearance's partOverride set the correct appearance in the componentsOverride?

    Now, check the mesh file (close and re-open it to make everything refresh):

    appearance - does it use the correctly named material? materialEntries - is the index correct, or is it pointing at the index of the actually displayed material? localMaterialBuffer - does the CMaterialInstance use the correct .mlsetup file?

    Finally, check the .mlsetup: does it actually use different colours, or is it just a duplicate?

    hashtag
    My mesh is invisible!

    Here we go. This is the big one, and it's Not Fun. The error can be anywhere between the yaml and the mesh. You can rule out one of the files with the following question:

    Does the glitching stop after <10 seconds? If not: the appearance can't be resolved - ignore the .mesh If yes: the appearance is resolved, but can't be displayed - ignore the .yaml

    circle-info

    The fastest way to find your error is Wolvenkit's FileValidation (in version >= 8.9.1). Save the root_entity.ent, and the recursive valudation will check the whole chain for errors and print them to the log files for you.

    As of July 2023, you can download the right version from the page (for example , as it's pretty stable).

    ℹIf the appearance is resolved, but not displayed (short glitch), the first thing you should do is to change the path in the mesh_entity.ent to one of the game's default meshes. This will rule out errors on your part. (Yes, even if your mesh worked in another mod. No, I'm not speaking from experience, why do you ask?)

    If the hint above doesn't solve it, proceed to troubleshoot in the same way as "My mesh has the wrong appearance!" above.

    hashtag
    My garment tucks into/under other garments incorrectly

    That's due to - check the link to learn more.

    hashtag
    Visual tags aren't working!

    If you are hiding components via visual tags, these tags have to go into the appearance file rather than the root entity.

    hashtag
    I can't find anything, kill me now

    Time to restore your files one by one to the last working backup and restart from there. Don't delete them, keep them in a different folder - you will be able to copy a lot of stuff over.

    circle-info

    By right-clicking on a tab title, you can move it to a new document group for easier copying.

    Good luck, soldier.

    ArchiveXLarrow-up-right 1.4.3
  • Red4extarrow-up-right 1.12.0

  • Cyber Engine Tweaks arrow-up-right(optional, for spawning items)

  • Launch the game.
  • Spawn one of the tutorial items via Cyber Engine Tweaks: Game.AddToInventory("Items.my_custom_shirt_redwhite")

    Game.AddToInventory("Items.my_custom_shirt_redblack")

  • customize your preview images

  • Add an atelier store

  • *.mesh:

    1. Adding a MeshMaterialEntry

    2. Adding a MaterialInstance

    3. Adding a material

    4. Connecting those things

    appearanceName: appearance_root_entity_black_blue
  • For lookups in your translation file (translation_strings.json): Change the values of displayName and localizedDescription to the corresponding secondary keys in the json file. This is optional.

    ℹIf you make any mistakes here, the worst that happens is an empty string.

  • Now, add a new entrie to your .json file:

  • If you decide to create your own mesh, be sure to fix any potential issues before using it in your mod. Check out our 3D modeling guidearrow-up-right for helpful tips and resources.

    Remember, a little extra effort in the beginning can save you a lot of headaches down the line!

    to
    appearance_root_entity_white_red&Female
    .
  • Duplicate the first (and only) entry to create a new one.

  • Expand the newly create entry

    1. Set name : appearance_root_entity_white_red&Male.

    2. Set appearanceName : my_shirt_m.

  • (as defined in the root_entity)
  • Find the array partsValues

    1. Set the resource path to your new male mesh entity file: resource : tutorial\myshirt\mesh_entity_m.ent

  • Find the array partsOverrides

    1. Find the array componentOverrides

      1. Set componentName : my_shirt_m

    2. Set partResources : tutorial\torso\my_custom_shirt\mesh_entity_m.ent

  • my_tshirt_factory.csv:

    • Is there an entry where the first value matches the entityName from the yaml (my_tshirt in the picture above)?

      • Without leading or trailing spaces?

    • Does the second value of that entry have the correct root entity path? (tutorial\myshirt\rootentity.ent in the picture above) If you moved the root_entity.ent, you have to adjust this entry.

  • rootentity.ent:

    • Do you have an appearance matching your item by name?

      • Without leading or trailing spaces?

    • Are you using any ? Are you using the correct ones?

      • Try setting an empty suffix array in the .yaml, just to see if that works: appearanceSuffixes: [ ]

      • Try creating a fall-back entry without any suffixes in the root_entity.

  • Is the indentation correct, as shown in the picture?
  • Does it point at the correct file (tutorial\ops\translation_strings.json), or did you rename or move it?

  • Did you make any typos?

  • yourModName.yaml:

    • Is the spelling for the key you defined after displayName and localizedDescription identical to the one in the json file?

  • translation_strings.json:

    • Is the spelling of the key defined in yaml's displayName and localizedDescription identical?

    • Did you set the femaleVariant (default)?

    • Are you using quotation marks? If so, switch to singlequotes!

    • If the field for primary_key is not empty, then its value must be unique (probably on a per-file basis). Just number them.

  • entry point to a valid mesh? Try it with a default mesh as detailed above.

    Make sure that the files you're loading exist.

  • Make sure that you don't load a mlmask under a key for an mlsetup or vice versa.

  • replacing the arrays appearances, localMaterialBuffer.materials and materialEntries with those from your previous mesh.
  • Make sure that the files you're loading exist.

  • Make sure that you don't load a mlmask under a key for an mlsetup or vice versa.

  • WolvenKitarrow-up-right
    TweakXLarrow-up-right
    this onearrow-up-right
    documentationarrow-up-right
    Nightlyarrow-up-right
    this onearrow-up-right
    dynamic variants
    Nexusarrow-up-right
    here
    item structure explained
    Troubleshooting
    Item Structure Explained
    something other
    appearances
    variants
    corresponding wiki page
    on its own page
    Discordarrow-up-right
    the next section
    here
    root entity section
    Item structure explained
    dynamic appearance
    appearance section
    Item structure explained
    recolour an item
    MLSetupBuilderarrow-up-right
    mesh file section
    Item structure explained
    click here
    reading up on suffixes
    troubleshooting section
    here
    component name prefixes
    hint box
    replace the contents
    this page
    Nightlyarrow-up-right
    this onearrow-up-right
    garment support
    These files do not contain an Atelier store. If you want to add one, see here.
    Don't panic, we've got this.
    duplicating mesh_entity.ent and creating the new mesh_entity_m.ent for out new mesh
    All of the changes made to mesh_entity_m.ent file
    All of the changes made to rootentity.ent file
    All of the changes made to appearance.app file. Paths are not up-to-date!
    File validation
      displayName: my_shirt_localization_name_black_blue
      localizedDescription: my_shirt_localization_desc
    localizationPersistenceOnScreenEntry - []   
    	femaleVariant: my item - now in black and blue
    	maleVariant:  
    	secondaryKey:  my_shirt_localization_name_black_blue
    Items.my_custom_shirt_blueblack:
      $base: Items.GenericInnerChestClothing
      entityName: my_custom_shirt_factory_name
      appearanceName: appearance_root_entity_black_blue
      displayName: my_shirt_localization_name_black_blue
      localizedDescription: my_shirt_localization_desc
      quality: Quality.Legendary
      appearanceSuffixes: []
    Game.AddToInventory('Items.my_custom_shirt_blueblack')
    mesh:   DepotPath:   tutorial\torso\my_custom_shirt\my_mesh_m.mesh      << path to your mesh  
            Flags:       Default                               << leave this alone  
    name:   my_shirt_m    << this corresponds to the appearanceOverride in appearance.app  
    Items.my_custom_shirt_redwhite:
      $base: Items.GenericInnerChestClothing
      entityName: my_custom_shirt_factory_name
      appearanceName: appearance_root_entity_white_red
      displayName: my_shirt_localization_name_white_red
      localizedDescription: my_shirt_localization_desc
      quality: Quality.Legendary
      appearanceSuffixes: [ itemsFactoryAppearanceSuffix.Gender ]
      icon:
        atlasResourcePath: tutorial\torso\my_custom_shirt\ops\preview_icons.inkatlas
        atlasPartName: slot_01
    Game.AddToInventory("Items.my_custom_shirt_redwhite")
    suffixes