Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Editing the world of Cyberpunk
This page will introduce you to the very basic structure of the world and the necessary tools to effectively modify the surroundings to your liking.
The world of Cyberpunk2077 consists of nodes, which can represent pretty much anything from visible meshes, collision, lights, effects to sounds, areas dictating where NPCs can spawn and more. These are grouped together into streamingsectors which are packed inside the archive files of the game - meaning not directly editable without creating massive conflicts due to how mods modifying the same resources get handled.
More detailed information can be found here:
Instructions on how to find locations using RHT can be found here.
entSpawner (GitHub): Handles the spawning of objects that can then be converted into standalone streamingsectors. It has access to all game assets and AMM prop packs installed.
removalEditor (GitHub): Integrates with RedHotTools to allow easily creating node removal files for ArchiveXL.
Wolvenkit (GitHub|Wiki): Comprehensive mod creator, allows finding more detailed information about nodes e.g. finding their actors. Includes scripts to remove occlusion nodes, adding custom streamingsectors from entSpawner, adding resources like custom meshes and much more.
All mods that these mods require to function.
It is highly recommended to join the redmodding discord to stay up to date on new techniques and tools.
Exporting locations to Blender
Created by @Simarilius Updated 19 March 2023 ~ Updated 7 May 2023 ~ Script updated 1 June 2023 ~
The original exporter was based on some posts by @123321 in the Discord #mapeditor channel back in May, so all credit to him for working it out in the first place.
Theres a video which outlines this process Here.
This guide was initially written with game version 1.6 of Cyberpunk 2077.
Blender 3.3 or newer
To export a location, you need to know its files — you can either pick them from our list or go and find them (and add them to the list, please).
Add all sector files that you want to edit to your project by and double-clicking them.
Open the
Open Export_Sector.wscript
by double-clicking on the file name
You may get a pop-up: "Trying to open a system file. Should a local copy be created?" If so, click Yes.
Optional: Check #what-else-the-script-can-do-for-you below if you want to get fancy.
Click "Run" (it's on the top left of the script editor)
This will export all your .streamingsector files to glb/json for the later import into Blender.
Depending on your computer and the number of sectors, this script takes time. Wolvenkit will be mostly unresponsive while it's exporting.
Don't worry, it's normal.
You might see a bunch of error messages about files that couldn't be found in the Wolvenkit log. Those usually only affect materials, your mesh should still show up in Blender.
The script will find and import all streamingsector .json files under your project's raw
directory. Make sure to delete those that you don't want, or change their extension from .streamingsector.json
to .bkp.
Depending on your hardware, the script can take a long time – from minutes to hours. During this time, Blender will be unresponsive. If you can't cope with that, check Step 2 in the list below.
Import your streamingsector with the Cyberpunk Blender IO Suite. For full instructions, check the corresponding wiki page - the documentation below might be outdated.
Open Blender
Optional: Turn on the Blender console so you can watch the pot boil (unnecessary, but psychologically reassuring). It's under Window -> Toggle System Console
Select File
-> Import
-> Cyberpunk Streaming Sector
Open the .cdmodproj
file in the root of your Wolvenkit project directory
Optional: Check the "With Materials" box in the side panel This will make the process take four times longer!
Wait (see the orange warning box below)
Optional: As the meshes will be scaled and positioned according to the map coordinates, they're probably off-screen. You can center the camera by completing the following steps:
One or more meshes should still be selected. If not, do that now.
Move the cursor to your selection (Hotkey: SHIFT+S
)
Select View → Align View → Center View to Cursor
With ArchiveXL >= 1.8.0, this process is outdated. Check the other guides in this section for how to generate .xl files to add, edit or delete objects in sectors.
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
This guide is outdated and should not be used anymore. For more recent information, see the Object Spawner GitHub page (Until the wiki article is updated)
Valid as of March 21 2023
Requirements
Wolvenkit 8.8.1 (bugs in nightlys and stable version 8.9.0 prevent adding new nodes to a streaming sector)
The latest stable release of ArchiveXL (thanks Psiberx!)
Resources
Example mod project, including template .XL file, .streamingsector and .streamingblock - this adds a low poly house exterior mesh to the center of the glass dome in corpo plaza (near the giant holo fish)
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)
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 update the index of your node to 0 if it is not already.
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
Author: spirit
Last update: September 24th 2024
If you ever tried to build a structure outside of the usual game bounds and encountered textures popping in and out seemingly at random you have encountered occlusion mesh nodes. This article will explain how to find and remove them, touch on their purpose and provide starting points for optimization.
Occlusion Mesh Example:
Navigate to the location where you want to remove the occlusion mesh nodes
Open the CET Menu and find World Inspector
Switch to the Scan Tab
Click on Scan world nodes
Make sure the Group is set to All, Distance to 50m or more depending on your area, and Filter to "Occl"
Expand each item in the list to reveal the detailed information
[!NOTE] World Inspector cannot find all occlusion mesh nodes, so trying to remove them using Removal Editor will not remove all actual occlusion mesh nodes from the area.
Create and open a new project in Wolvenkit
Search and Right Click > Add selected items to project
for each world sector you found in the World Inspector to your project in Wolvenkit
Click on Tools > Script Manager
at the top
Find the "RemoveOcclusionFromSectors" script and run it
An .xl file that removes the occlusion mesh nodes has now been created in your "resources" folder in Wolvenkit
Open the resources directory in file explorer
Move the file to {GameDirectory}\archive\pc\mod
In the "Hot Reload" tool go to the Archives tab and click on reload extensions, now you need load a game save and the occlusion mesh nodes should be removed.
If you followed the steps but not all of the occlusion has been removed you can try:
restarting your game fully
increasing the "Distance" in "World Inspector" and redo the steps from that point on
adding world sectors that World Inspector doesn't find occlusion mesh nodes in
Lastly if none of these worked you can join the Discord where we can troubleshoot the issue together.
[!NOTE] This section, but especially the optimization part needs further testing and documentation.
They are a performance optimization method that selectively blocks textures that are behind it from being rendered therefore improving fps. But since most other objects also do that the performance loss from removing them in a select few world sectors is almost negligible (assuming there are no holes in the world or they are filled with other props).
The simple approach to optimize performance is to add each world sector separately and test which ones remove only the occlusion that is in your way. Another more advanced option is to add new occlusion mesh nodes that consider your structure.
How to make your own custom ads
Published: February 04 by Last documented edit: February 04 by
You can also check out .
Create a for your mod.
Download the Wolvenkit template project from . Download the zip file to your computer:
The zip file you downloaded contains a folder named source
. Extract it into the root directopry of your Wolvenkit project from step 1 so that it merges with the existing folder.
.png
filesThat's probably a lot more files than you wanted, but the first version of this guide only has the all-in-one package. Maybe we'll split off additional templates later. For now, leave everything as it is because we'll delete the non-modified files in step 2.
If you want to post your mod on Nexus, you might want to do two things:
link back to this guide
Happy modding, choom!
Attempt at pulling together the various bits of info in the discord history about
NodeRefs are kinda like bookmarks for nodes their defined in a section of the streaming sector and used to point things at each other. So for instance an elevator control panel uses a nodeRef to point to the elevator itself.
Following is pretty much a straight copy and paste of some of Psiberxs posts from the discord explaining stuff
at runtime NodeRef is a compound hash calculated from a path.
Ffirst you have to register NodeRef using an absolute path that starts with $/
you should've seen such path in sectors, something like $/03_night_city/c_watson/little_china/loc_megabuilding_a_prefab4KCU2IQ/loc_megabuilding_a_env_prefab7JTEUXY/megabuilding_a_environment_main_vs_mb_prefabZZTIINY/vs_apartment_floor_prefabW6EJ43Y/deco_prefabFKU4HJQ/megabuilding_vs_apartment1_prefab4ZYKDLY/mb_vs_apartment_env_arch_prefabT73KCQY/ceiling_fan_a_spinning_prefabIQCQMLQ
the hash is calculated for every part of the path and registered in the lookup table, it's not just a single hash function call you can always use the absolute path as a reference, but there's a more convenient way using # you can register a global alias, that can be used as a reference without knowing the original path for example, if you register $/03_night_city/c_watson/little_china/#my_new_node
, then you can use just #my_new_node
alias to refer this node the hash of the alias depends on the original path for example, $/aaa/#my_new_node
and $/bbb/#my_new_node
will register different hashes if you'll use the same global alias twice, the later instance will take precedence, i.e. will overwrite the previous alias in the lookup table so it's impossible to calculate NodeRef just from alias like #my_new_node
, it can be done only knowing the absolute path used for registration
every time engine parses any absolute path it registers a NodeRef in the lookup table on this screenshot entry 6 will create a new NodeRef that can be used later entry 7 won't do anything
first of all you have to register NodeRef by adding it to nodeRefs
then you have to fill the hash in QuestPrefabRefHash
property, which is actually globalNodeId
containing NodeRef hash (surprisingly it can be found in metadata.json
from redmod, but not in runtime RTTI)
THIS GUIDE IS ARCHIVED! DO NOT USE IT
This guide is archived and will lead to wide-ranging compatibility issues. Do not use it for your world edits - please look up the ArchiveXL guides instead!
Created by @Krat0es Published October 10 2022
This guide aims to teach you moving and deleting objects from the world.
the most recent Wolvenkit (stable | Nightly), at least
Add your sector file to the Wolvenkit project
Open it by double-clicking
Click on Sector Preview
again
Click into the preview to highlight an object. This will print the object's node name and -index to the log.
In the list on the right, find the object that you want to delete. You can toggle the red checkmark(s) to show/hide objects in the preview
Go back to the WorldStreamingSector tab
Click on expand nodeData to find the object in the list. It is easiest to go by index, which should have been printed to the log when you selected the object in step 4.
Expand the node and find Position
, Orientation
and Scale
:
You can now
change the object's coordinates or scale
delete the object from the world by right-clicking the node and deleting it (see screenshot deletus
)
Remember to save the file after making changes!
That means that it has a proxy mesh, which you also need to delete.
Search the game for your sector file's name without the last digit
Example:
You're editing interior_-23_15_0_1
You're searching interior_-23_15_0_
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)
Activate an existing collisions in a mesh
Published: January 20, 2024 by Last documented update: January 25, 2024 by
This guide shows you how to enable an object's embedded collision for entities without (items that you can walk through).
It's a direct follow-up to .
As of today (Jan 20 2024), you need a collision-enabled mesh for this. We can create our own collisions with the , but the tutorial for this isn't ready yet.
If you want to create for AMM, check the corresponding guide. Note that this mechanism applies for them as well!
(screenshots say 1.4, but it's the mod title that wasn't updated in 1.5 )
You know how to
and updated file created by KeanuWheeze - this will help us to edit new ent files with embedded collisions.
You need a
Not every object contains an embedded collision, so we first need to check if your desired mesh has one.
Once in-game, search for the item you want to spawn; I'll be using base\meshes\base_environment_decoration_furniture_industrial_industrial_table_industrial_table_g.ent
In the Spawned
menu, click on Copy Path to clipboard
to get the current .ent
path.
After you added it, turn off the Mod Browser option; otherwise, you won't be able to get the mesh file in the next step.
If the selected entity is from allmeshes (starts with base\meshes\
), then there is probably only 1 entPhysicalMeshComponent called custom_mesh
If not, it means your entity is from the vanilla game; in this case, search for the component that has Mesh in its type (entPhysicalMeshComponent, entMeshComponent, etc...)
In the mesh, click on the blue arrow to open the mesh in a new tab (we don't need to add the file)
Decisive moment: Open parameters and look for a meshMeshParamPhysics
What if there is no meshMeshParamPhysics parameter in the mesh ?
It means that there is no collision with it. But other solutions exist for you:
You can create your own collision through Blender (no modding ressource is available at this time)
You can fake the collision by using another small entity which already has collision embedded, and hide the small entity inside your item (this technique is a work-around, that does not always fit or give satisfaction, but most of the time it does the job)
You can try to find another similar item that has embedded collisions (and go back to the first step of this page)
Turning it on is pretty simple; we only have 2 things to change, all in the .ent file previously added:
Update the filterData
and change the values like in the screenshot. Those values determine which entities can collide with, and how to simulate the collision.
Change the navigationImpact
setting to Blocking
. (Other values exist; they haven't been documented, but you may have fun with them.)
Optional: depending on the item, you may want to enable (or not) lighting-based shadows. You can do so by setting these 3 properties to Always
.
In our test case, I renamed the file as mod\embedded_collision_test\decoration\industrial_table_g.ent
.
If the path of your ent changed, don't forget to add it to the allPaths.txt file used by Object Spawner.
How to remove items from the world with ArchiveXL
Created by @manavortex Published in October 2023 Last (documented) update: December 2023
This guide will show you how to remove items from the world via ArchiveXL.
Difficulty: You know how to read. Everything else will hopefully become clear !
>= 1.8.0
If you want to do it in Blender: >= 1.5.0
Otherwise:
This section will walk you through the process of creating an .xl file to remove objects from the game world.
This guide will feature the manual process, which can get tedious if you want to remove at scale. There are two ways to automate the process:
Wheeze's Removal Editor ()
Generating the .xl file via Blender (see
Although you can also work directly in your archive/pc/mod
directory, you should , so that you can easily pack your mod for Nexus deployment.
Visual learners, celebrate: OUiJIXOU and Proxima Dust made video guides for this!
Create an .xl
file in your Wolvenkit Project's resources
folder and name it after your world deletion (e.g. delete_pacifica_fast_travel_terminal.xl
).
We'll fill in the information in Step 3, this is how it will look:
Paste the following code into your .xl file:
Adjust the .xl file. Mind the leading spaces!
for path
, put the full path to your world sector as seen in RedHotTools (1., yellow on screenshot - base\worlds\03_night_city_compiled\default\exterior_-35_-35_0_0.streamingsector
)
for expectedNodes
, put the number of nodes in this sector (2., pink, 503 in the screenshot)
For each node that you want to delete, add an entry under nodeDeletions
:
- index
(the - is important): the node index (3., violet in the screenshot)
type
: the type of the node (4., turquoise in the screenshot)
Save the .xl file
If everything worked, your object should now be gone.
If you have been working directly in your archive/pc/mod
directory, do not right-click on your .xl file and pack it. You have to create the following folder structure and then pack the archive
folder:
If you don't do that, you will drown in comments from confused users who don't know how to install your mod.
Optiona, but recommended: Save the blend file. There's no real way to undo stuff right now other than deleting them from the list by hand, and re-importing is tedious. If you save the file, you can use File -> Revert to undo all your changes.
Select and delete the objects that you want to get rid of.
Now it's time to get exporting.
In the Scene Collection (usually at the top right of your Blender viewport), select a sector collection.
First, you need to find out the number of nodes in your sector. We will do that in Wolvenkit.
Find the correct sector file and open it in Wolvenkit. (You can copy the name from the filepath
field in Custom Properties — the file should be in your project from your earlier export.)
In the CR2W editor, find the nodes
property and look at the count. That number needs to go into your new property in Blender.
Click New
to add a new property. It will be called prop and have a value of 1.000
.
Click the gear and add the property's properties:
Type
should be Integer
Property Name
shoudld be expectedNodes
Default Value
, Min
, and Max
should be the number of nodes from your sector file.
After you have made those changes, click OK.\
The value of your new property will probably still be 1 until you click in the field - then it will be updated with the only value possible.
Repeat this step for every sector file.
Switch to Blender's Scripting
perspective and create a new file.
Edit the value of output_filename
— it has to be a valid path (and can even be your Cyberpunk mod directory).
Running the script will overwrite existing files. That's not a problem, but you need to take care of backups yourself.
When you're done, click the ▶ button in the toolbar to run the script.
This step is optional, but recommended, as the script might add nodes to the deletion list that you want to keep.
This is also how you can edit other people's sector presets. Want to keep your candles? Search for "candle" and remove them from the deletion list!
Search for worldEntityNode
Keyboard shortcuts to find all in document in Notepad++: Ctrl+F
- Alt+D
Check the comment on top of a block to find out what it is.
If you want to keep something, remove the entire block from the .xl file (see screenshot).
Put the .xl file into archive/pc/mod
and start the game. (Don't put your Wolvenkit project, you don't need all that sector garbage!)
That's it! You changed the world - literally! Happy modding, choomba!
Do not pack the Wolvenkit project you used for Blender import - you don't need an .archive file
To add the .xl file to a Wolvenkit project, simply put it into the source/resources
folder and pack. Your mod will include only text files and be really tiny - ArchiveXL does all the heavy lifting.
If your zip for Nexus contains an .archive file, you've done something wrong here!
You need:
a Wolvenkit project with the sectors exported to .json
an .xl file
Change the following lines in the script:
While you can write directly to your output file, you really should not.
After running the conversion script, search your new .xl file for INVALID_NODE
to filter out any entries that could not be resolved.
Check the ArchiveXL log (you can find it in Cyberpunk 2077\red4ext\plugins\ArchiveXL\ArchiveXL.log
). For every block in your .xl file, you should see an entry like this:
Make sure that your file
has the extension .xl
is located in archive/pc/mod
or loaded as part of a REDmod (why are you doing this to yourself? You're testing. Put it in archive/pc/mod
!)
Make sure that ArchiveXL is up-to-date and working
Published: Nov 10 by Last documented update: Nov 24 by
This page will explain the actual names and details of worldNodeDataBuffer
in .streamingsector
files
If you want to learn about , please check the corresponding section.
explained.
You can find some info in <Cyberpunk 2077>\tools\redmod\metadata.json
The actual class name of worldNodeData
is worldCompiledNodeInstanceSetupInfo
The actual fields names are:
QuestPrefabRefHash
is globalNodeId
(it can be created in nodeRefs block or reused already existing)
MaxStreamingDistance
is secondaryRefPointDistance
UkFloat1
is streamingDistance
Pivot
is secondaryRefPointPosition
Bounds.Min
is streamingRefPoint
Bounds.Max
is not listed, looks like there's no Box/Bounds, but two different vectors
(c) psiberx
In your project's , you will find 200+ .png
files — pretty much every ad in the game.
Use your image editor of choice (or ) to edit the files that you want to see in the game.
When editing textures, please keep in mind that you need to export transparency as an alpha mask. See for details.
After you are done editing, use the to import all the files.
In your Wolvenkit project's , delete those files that you don't want to include in your mod. This step is important, because files can only changed by one mod at a time, and you don't want to piss in the public water supply by simply leaving them in.
When you have done the clean-up, you can now and start the game to see your new ads in-game.
Add as a requirement
Back in WolvenKit, create or open
Open the , turn on the option, paste the path and add the ent to your project.
Open the and look for the mesh component in its components array.
Have you found it ? Amazing ! It means the mesh has a native collision that we can toggle on.
This information is not well-researched as of Jan 2024 - if you know anything more about this, please get in touch via or update the wiki!
I strongly suggest you to change the .ent name and folder to , so it doesn't interfere with the rest of the game.
That's it! All you have to do now is to .
Once in-game, open and load the new entity with the new path and verify that collision is enabled.
Find the node information in the Inspect tab of RedHotTools (see for a detailed guide)
You can edit this file in Wolvenkit or in a text editor like
Optional, but recommended: Run your XL file through
and launch the game.
Otherwise, check the section.
If you have been a good bean and stuck to the instructions, you only need to and can skip the rest of this section.
Hit up and follow the instructions to import your sectors into Blender.
This step will be made obsolete in a future update of the (currently 1.5.0). The guide will tell you at which point you can skip ahead if that's the case.
Below the viewport in the right side panel, switch to the Collections
tab and expand the Custom Properties
header. You need a property with the name of expectedNodes
(green box).
If you have one, you can proceed to .
If you don't have one, keep reading.
Open (mana's github) and copy the contents into Blender's editor.
You now have an .xl file. If you put it into archive/pc/mod
, the game should load it. Otherwise, check the section of this guide.
Open the generated .xl file in a text editor such as .
You can convert node removal scripts from ArchiveXL 1.8 format to 1.9 format by running on the file.
Check if the syntax is valid by running it through
Check the expectedNodes
entry inside your .xl
file against the sector files inside Wolvenkit as per .
will share info on how to add objects like door, loot, walls etc
This guide is outdated and should not be used anymore. For more recent information, see the Object Spawner GitHub page (Until the wiki article is updated)
Created by @Krat0es Last documented update: March 21, 2023 by Doctor Presto
This guide aims to teach you adding objects to the world.
If you want to learn how to How to open garage doors, please check the corresponding guide.
allmeshes.archive and updated allpaths 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
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.
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.
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, fake them, or enable 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. You can use Object Spawner's export function to create a .JSON file which you can use to add these objects permanently to the world. (The Export button can be enabled in Object Spawner's 'Settings' tab)
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.