Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
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 !
ArchiveXL >= 1.8.0
If you want to do it in Blender: Wolvenkit Blender IO Suite >= 1.5.0
Otherwise: RedHotTools >= 0.5.2
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 (Link on GitHub, also has documentation there)
Generating the .xl file via Blender (see Blender and ArchiveXL
It is extremely recommended to use Removal Editor (linked above) to remove nodes from the world as it is easier to use, easier to update and maintain and faster than doing it manually.
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!
Find the node information in the Inspect tab of RedHotTools (see Finding Locationsfor a detailed guide)
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
).
You can edit this file in Wolvenkit or in a text editor like Notepad++
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)
Optional, but recommended: Run your XL file through yamllint
Save the .xl file
If everything worked, your object should now be gone.
Otherwise, check the Troubleshooting section.
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.
Hit up Editing locations in Blender and follow the instructions to import your sectors into Blender.
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.
This step will be made obsolete in a future update of the Wolvenkit Blender IO Suite (currently 1.5.0). The guide will tell you at which point you can skip ahead if that's the case.
In the Scene Collection (usually at the top right of your Blender viewport), select a sector collection.
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 Generating an .xl file.
If you don't have one, keep reading.
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.
Open this link (mana's github) and copy the contents into Blender's editor.
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.
You now have an .xl file. If you put it into archive/pc/mod
, the game should load it. Otherwise, check the Troubleshooting section of this guide.
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!
Open the generated .xl file in a text editor such as Notepad++.
Search for worldEntityNode
&#xNAN;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 can convert node removal scripts from ArchiveXL 1.8 format to 1.9 format by running this Python script on the file.
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
!)
Check if the syntax is valid by running it through yamllint
Make sure that ArchiveXL is up-to-date and working
Check the expectedNodes
entry inside your .xl
file against the sector files inside Wolvenkit as per Adjust the sector collections' properties.
This page briefly explains how to place and preview AISpot Nodes, using Object Spawner
This guide only explains how to place AISpot Nodes, for them to be actually be used by NPCs, you will need to
AISpot Nodes define workspots that NPCs created via communities can use
A workspot is simply a location at which a NPC will play a set of animations
(v.0.91 or newer)
(1.15.0 or newer)
(With latest version of Object Spawner import script)
You need to have a basic understanding of:
Working with WolvenKit
Using Object Spawner (Spawning things and into WolvenKit)
You must assign a unique NodeRef to each AISpot, in order for it to be usable
In order to spawn a new AISpot, select the corresponding spawn category in Object Spawner:
AI -> AI Spot
When you spawn an AISpot, it will by default use Judy to preview the animation
This may not always work (Judy will just stand there), since not all workspots support all body rigs
For more information on this, see below
To know what rigs a workspot supports, take a look at the AI Spot -> Previewing Options -> Supported Rigs
header
Here you can also change whether you want a NPC to preview the spot, and also which NPC should do so
A list of all NPC records can be found in Object Spawner Entity -> Record
(Search for Character.
)
Additionally, you can change the speed of the animation during the preview
This is helpful since each time you move the spot, the animation will restart
Is Infinite
: If set to false, the NPC will try and go to the next AISpot defined in its community entry, once it is done with the current one
As mentioned above, you must assign a unique NodeRef to your AISpot, in order for it to be useable
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 .
This guide was initially written with game version 1.6 of Cyberpunk 2077.
>= 8.8.1 or the latest
or newer
To export a location, you need to know its files — you can either pick them from or (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 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.
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
and launch the game.
If you have been a good bean and stuck to the instructions, you only need to and can skip the rest of this section.
Markings: For information on markings, check the guide
Import your streamingsector with the Cyberpunk Blender IO Suite. For full instructions, check the - the documentation below might be outdated.
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 objects in sectors.
Download this script () from
Run the script by clicking the ▷ button If the script throws errors and you can't resolve them on your own or with the help of ChatGPT, find us on !
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.
As of February 2025, Cyberpunk's world editor (mod) is in development. You can check out World Editor: entSpawner to learn more about it.
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.
VolumetricSelection2077 (GitHub): Quickly and easily remove parts of the world using an in game selection box.
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.
This guide will describe the steps necessary to add new native fast travel points, using Object Spawner
Object Spawner (v.0.8. or newer)
Codeware (1.14.1 or newer)
WolvenKit (With latest version of Object Spawner import script)
You need to have a basic understanding of:
Working with WolvenKit
Creating tweaks using TweakXL (.yaml
files)
Using Object Spawner (Spawning things and importing into WolvenKit)
Any NodeRef names, and custom TweakDB record names in this guide are examples, do not use the same ones as in the guide.
In order to define the name and the district of your fast travel point, it needs to point to a FastTravelPoints
record
This means you will need to create a custom record using TweakXL
The below snippet contains the definition for a new one:
Place it in a new .yaml
file inside Cyberpunk 2077\r6\tweaks
Modify the snippet for your custom FT point (Especially change the name of the record to something unique, e.g. FastTravelPoints.NAMEOFTHELOCATION
)
In order to have a working FT point you need two nodes:
worldEntityNode
, the terminal itself
worldStaticMarkerNode
, location where the player gets teleported to (Any other type of node technically works too)
We will use base\gameplay\devices\fast_travel\data_term_1.ent
, you can find it under Entity -> Entity Template
in Object Spawner
Optionally choose a appearance
Spawn a static marker, you can find it under Meta -> Static Marker
in Object Spawner
Place it in a fitting spot in front of the terminal
Assign a custom NodeRef to the static marker:
In the properties section, inside the World Node
header
Make sure the NodeRef is unique
E.g. $/ft/custom/marker
In order to tell the FT Point what marker to use, and what record to use, we will use entity instance data
Open the Entity Instance Data
header of the FT Terminal
Expand the entry DataTerm | Entity
Locate and expand the linkedFastTravelPoint
header
Set markerRef
to the NodeRef of the marker ($/ft/custom/marker
)
Set pointRecord
to the custom FastTravelPoints
record (FastTravelPoints.customPoint
)
You should now have the following:
A .yaml
tweak file containing the custom FastTravelPoints
record
An Object Spawner group containing:
The fast travel terminal entity node, with entity instance data linking it to the marker and the custom record
The marker node, with a custom NodeRef assigned
Make sure that the category of the sector containing the marker and terminal is set to AlwaysLoaded
during export from Object Spawner
Now simply export your group from Object Spawner, and import into WKit using the Object Spawner import .wscript
If you make any changes to the FT point, after having already loaded the game with your custom point installed, make sure to use a fresh save (A save without the custom point saved)
This guide will describe the steps necessary to add new native elevator, using Object Spawner
Object Spawner (v.0.8. or newer)
ArchiveXL (1.20 or newer)
Codeware (1.14.1 or newer)
WolvenKit (With latest version of Object Spawner import script)
You need to have a basic understanding of:
Working with WolvenKit
Using Object Spawner (Spawning things and importing into WolvenKit)
In this guide, we will build a simple elevator with 2 floors
For this we will need 3 device nodes:
An elevator object
Two elevator terminals
Additionally, we will need two markers:
One per floor
These determine the position to which the elevator drives
Make sure to spawn the elevator and floor terminals as Device
(Entity -> Device
in Object Spawner)
For the elevator, we will use base\gameplay\devices\elevators\megabuilding_elevator\megabuilding_lift_1.ent
Spawn it as Device
, and place it somewhere
For the terminals we will use base\gameplay\devices\elevators\terminals\elevator_floor_terminal_1.ent
Spawn two of them as Device
, and place one per stop
For the markers, select Meta -> Static Marker
in Object Spawner
Spawn two markers
In order to properly position them, do as follows for each marker / floor:
Move the elevator device spawned earlier to the position you want it to stop in
Right-Click the position (Under the Transform header) of the elevator device, and select Copy position and rotation
Select one marker, right click its position field, and select `Paste position and rotation`
Now you will have moved the marker into the same spot as the elevator
Repeat for each marker / floor
In order to link and reference all the spawned object, each one will need its own, unique NodeRef
Expand the World Node
header and fill the NodeRef field with a unique string
In the end, we will have assigned 5 NodeRef's
For example:
$/terminal_top
, $/terminal_bottom
, $/marker_top
, $/marker_bottom
, $/elevator
Do not use the same NodeRef names as used in this guide, but choose your own unique ones instead.
Next we need to tell the elevator which floors it can use
To do this, we will go to the Device -> Device Connections
header of the elevator
Add one entry for each floor / terminal
Fill the device class name field (On the left), with the device class name of the terminal
In our case this would be ElevatorFloorTerminalControllerPS
, which can also be found under the device header of the terminals
Fill the NodeRef field with the NodeRef of the terminal that you are linking
Keep in mind that the elevator will see the floors in the order in which you add them, so the first one in the list should be the lowest floor
In order for the elevator to be fully functional, the terminals must be set to be persistent
Do this by checking the Persistent
checkbox of each terminal
In order for each terminal to know which floor marker to use, and what its name is supposed to be, we will use entity instance data
For each terminal, navigate to:
Entity Instance Data / ElevatorFloorTerminalController / persistentState / elevatorFloorSetup
In there, set floorDisplayName
to the LocKey that you want to be used as name (E.g. LocKey#49237
Set floorMarker
to the NodeRef of the floor's static marker (E.g. $/marker_bottom
)
Optionally, use the checkboxes under doorShouldOpenFrontLeftRight
to determine which doors of the elevator should open on this floor
Optionally change the elevator speed and inital starting floor by modifying:
Entity Instance Data / LiftController / persistentState / liftSetup
Let's recap what you should have now:
A elevator, spawned as Device
, with its own NodeRef, and linked to both terminals (Make sure you use the terminals NodeRefs, not the markers)
Two terminals, spawned as Device
, set to be persistent, with their own NodeRefs, and properly setup instance data (Linking them to the floor markers and with names)
Two static markers, each with their own NodeRef, positioned correctly
Once you have all this, you are ready to export
Import into WKit using the Object Spawner import script
You must import the result into WolvenKit in order for the elevator to be functional
If you make changes to the elevator, make sure to use a fresh save game (One where the old elevator was not saved in) after having imported it into WolvenKit
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
[!NOTE] This section, but especially the optimization part needs further testing and documentation.
They are a performance optimization method that selectively blocks geometry that is 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.
Cyberpunk 2077's world editor
Created: Feb 04 2025 by Last documented edit: Feb 04 2025 by
This page tells you about Cyberpunk 2077 world editor mod.
As entSpawner is currently (Feb 2025) under active development, information on this page may be outdated. In this case, you're welcome to and update it!
For more information on , check the wiki's page tree or use the "next" and "previous" buttons at the end of the page.
Because the ways of the CDPR are inscrutable. Keep in mind that the modding tools dropped 10 years after the initial release of Witcher 3.
Although we don't have access to privileged information, it is the general consensus in the modding community that we will see official modding tools for Cyberpunk2077 by 2030. It is a running joke that we will not need them by then.
EntSpawner (developed by ) is the continuation of the discontinued mod .
As of February 2025, it is still in open beta and thus not published on Nexus. You can download the latest release .
Can be activated using the "3-D" icon in the toolbar
Snaps the main window to the right, width is changeable by dragging the left edge
Enables multiple things:
Viewport camera controls:
All the controls are available by hovering the I
-Icon in the toolbar, here the most basic ones
MMB (Mouse wheel button) + Drag
: Rotate camera around pivot
MMB + Drag + Shift
: Move camera
MMB + Ctrl
: Up / Down -> Zooms in / out
Tab
: Center camera on selected
LMB
: Selectes the item under the mouse cursor
RMB
: Opens the context menu (Same as before, but now also avaiable while hovering the viewport)
Objects can be moved by dragging the axis arrows
Additionally hotkeys are available:
G/R/S + X/Y/Z
: Enables movement/rotation/scaling along the specified axis
LMB / RMB
: Confirm / cancle edit
Holding Shift
while pressing the axis key will lock the editing on the specified axis. E.g. G + Shift + Z
will enable movement locked to the horizontal plane
Numeric input: After enabling editing (Rotate / Scale), input numeric values (Supports decimal and negative) to rotate / scale by that amount (Scale is applied as multiplier, rotation is relative)
E.g. R + Z + 90 + LMB / Enter
will rotate the object by 90 on the Z
axis and confirm the edit
Shift-A
spawn menu:Can be used while edit mode is active
Will spawn the selected object under the mouse cursor, unless specified otherwise
Additionally, it is possible to drag and drop an item from the regular "Spawn new" tab into the scene, to spawn them in a specific place
Shift-D
depth select popup:For the rare case that clicking on an object selects the wrong object, this popup can be used instead
Available while in edit mode and hovering the viewport
Gives a list of all the objects under the cursor, sorted by distance
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!
Created by Misoru
This guide will teach you how to turn a world object into a lootable container.
Working .streamingsector with the object you want to make lootable (if you haven't done this yet, )
Before making your object lootable, we first need to create the lootTable
that we'll later reference in our .streamingsector
, and add it to our Tweak .yaml
. Below is an example:
Search "LootTables" in Tweak Browser for more examples and methods.
Open the .ent
for the object you want to make lootable and verify its components
include entries like gameInventory
, gameinteractionsComponent
, and GameplayRoleComponent
. These components
are all commonly included in .ent
files for base game containers and
Open the .streamingsector
containing your object and find its nodes
entry.
Under instanceData
, create handles for LootContainerObjectAnimatedByTransform
, then add the lootTable
we created in Step 1 and define the persistentState
to LootContainerObjectAnimatedByTransformPS
. Leave everything else default.
Notice that lootTables
is an array, so you can add multiple lootTables
if needed!
Your object should now be a lootable container. Load up your mod and test it out. If it's not working, verify you defined your lootTable
correctly (or use a base game lootTable
for testing) and edited the correct .streamingsector
nodes
.
This guide explains how to go from an Object Spawner build to a native world edit
Usage
When building something using Object Spawner, it will use an intermediary format optimized for editing
In order to go from that editing focused format to the final native world edit, Object Spawner provides a workflow to make this as easy as possible
If you just want to quickly convert your project to a native edit, jump to the section. It is highly recommended to read the previous sections on the theory tho.
(1.15.0 or newer)
(With latest version of Object Spawner import script)
You need to have a basic understanding of:
Working with WolvenKit
Common sense
While building in Object Spawner, you are able to save things on a root-group level
This means you can save any group that is not contained within another group
The game operates on sectors, which objects are assigned to what sector is an automatic process there
For the Object Spawner workflow, each group you saved can get turned into a sector
A finished mod can consist of multiple root-groups / sectors
There are different streaming ranges, determining when objects and sectors get streamed in / out
Object Based Range:
These determine when each individual object gets streamed in / out
It is usually dependent on the size of the object
Can be found under each object's "World Node" header
Sector Range:
This determines when then entire sector gets streamed in / out
This over-rules the object based ranges, meaning when the sector streams out all objects within also stream out, even if their individual range is larger
Can be found in the export tab, under each groups header
Why this matters:
You should keep this in mind while building, and make sure that if you have sub-builds which are far apart, that those are in their own root-groups (Thus becoming their own sectors)
That way you make sure that only the parts of your build that are currently close will be streamed in (Thanks to having separated it into multiple sectors, with their own ranges)
Start by going to the "Saved" tab, and adding all the groups you want to be part of your finished mod, by using the "Add to export" button of those groups
Next, head over to the "Export" tab
Enter a project name, this will be used for the folder and file names in WolvenKit
Now you can specify sector specific settings:
Sector Category, usually just use interior or exterior
Hit "Export"
Open your WolvenKit project (Make a new one if you do not have one yet)
In the top menu bar, navigate to
File -> Import -> Object Spawner .json
In the file dialog, choose the previously exported file, named projectName_exported.json
Multiple files should have been generated (At least one .streamingsector
, and one .streamingblock
)
Click the "Install" button, in the top menu bar
This guide describes what communities are, what they are used for, and how to set them up using Object Spawner
Communities are used to spawn almost all NPCs that aren't crowd NPCs
As the name suggests, communities can be used to add large amounts of NPCs to the world while retaining a lot of control over:
What NPCs to spawn
Where those NPCs should be, what workspots they should use
What they should do during what time of day
(v.0.91 or newer)
(1.15.0 or newer)
(With latest version of Object Spawner import script)
You need to have a basic understanding of:
Working with WolvenKit
Using Object Spawner (Spawning things and into WolvenKit)
Know how to place AISpot
's, see the
Each community can serve a large area
How many NPCs and how much of an area you serve with a single community is up to you, but it is generally recommended to have one community per location
Start by spawning a community, found under AI -> Community
The community should be placed in the rough area of where the AISpots that you want to use are
Make sure to assign a unique NodeRef to the community (Is the same as the Community ID
)
In general, a community consists of the following hierarchical data:
Entries:
Each entry corresponds to one NPC template, e.g. Judy or some generic NPC
Phases:
Phases are used by quests, to switch between different setups
They are not of interest if you just want to place some NPCs without quests involved
Periods:
Periods define how many NPCs should be placed where, per time period
To delete an entry, phase or period, simply right click its header
Let's start by making our community spawn a NPC, do this by adding a new entry under the Entries
header
Here you can define a name for the entry, make sure it is unique
Here you can also define what NPC template should be used
Initial Phase Name and Active On Start are only of interest for quest modding, so ignore those for now
For our example, we will only need one phase, named default
As before, use the + [Phase]
button to create a new phase for our entry
Here you can also define what appearances the NPCs of that entry should use
Do this by adding more names under the appearances header
This is totally optional, and the default will do
This defines how many of the specified NPC should be spawned, where they should be spawned, and when they should be spawned
As before, use the + [Period]
button to create a new period for our phase
For this example, let's create two periods
Each period has the following options:
Hour: This controls when the period is active
E.g. If you have two periods, 8:00 PM
and Day
, then from 8:00 PM until 9:00 AM (That's the start of Day
), the 8:00 PM
period will be active, from 9:00 AM until 8:00 PM, the Day
period will be active
Is Sequence: Only relevant if the AISpots are not set to be infinite. If checked, the NPCs will cycle through the specified spots in the same order as they are listed
Quantity: How many of the specified NPC should be spawned
Markings and Spot NodeRefs: This is where you actually define what AISpot's should be used, will be explained in the following section
This list defines what AISpot's the NPCs from that time period can use
Make sure that you have enough spots for the amount of NPCs
Simply add the NodeRefs of the AISpots that you want to be used during this time period
Markings allow you to simply tell the NPCs "Use any of the AISpots that have this marking"
You can think of a marking as a Tag that you assign to AISpots
This makes it very easy to assign many NPCs to a large amount of AISpots, randomly
This is a full example of having either one or two Judy's spawn in specified spots, depending on the time
Using markings is especially worth it for larger amounts of NPCs and spots
Lastly, if none of these worked you can join the where we can troubleshoot the issue together.
For help or further information, please check the #
on the REDmodding discord.
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
If you're having difficulty determining which nodes
entry corresponds to the object you want to make lootable, use to identify.
, used for determining when to stream the whole sector in / out
This guide explains how to add variants to your sectors, using Object Spawner
Sector variants allow you to assign different parts of a sector to a variant
You can then toggle those variants on / off, while the game is running
This can be used to e.g. offer different variations of a build, within a single mod download, and allow the user to toggle different parts / layers at will
Unlike the name "Variants" may suggest, you can have multiple ones active at the same time, allowing you to mix and match
You need to have a basic understanding of:
Working with WolvenKit
Using Object Spawner (Spawning things and importing into WolvenKit)
Variants are something you should keep in mind during the building process, if you want to use them
You will be able to assign each group, which sits directly within in main group, to a variant
In the above example, you will be able to assign each of the three groups to a variant
All objects placed directly within the root group (The group that you saved and export), will be part of the default variant
Once you have added your group(s) to the export, you can start assigning variants
Variant settings can be found under the same named header (One per group)
By default, each group will be assigned to the default
variant, meaning they will be always active
Variant Node Ref:
This MUST be set to some unique NodeRef, in order for the variants to be controllable
Below you can assign a variant to each group
You can assign multiple groups to the same variant
Optionally change whether the variant should be active by default
In order to quickly toggle variants on and off, during development and testing, you can use the following commands in the CET-Console:
In order for mod users to quickly and conveniently toggle variants, one could e.g. hook up the above code to some UI
To make it easier, below there will be a ready to use Native Settings UI based menu, that allows toggling variants
In order to configure it, simply change the values at the top of the init.lua
file:
settingsMainName/settingsSubName
: Controls the names displayed for the category, in Native Settings UI
defaultMutuallyExclusiveVariants
: Here you define string selectors for variants which should be mutually exclusive (Only one active at a time)
ref
: This is the variant node ref
displayName
: This is a more human-readable string, gets actually shown in the UI
currentIndex
: This is the default state (Will override what is defined during export)
variants
: This array contains the variants which should be mutually exclusive, with a display name
defaultAdditiveVariants
: Here you define simple switches for variants which can be mixed and matched
ref
: This is the variant node ref
variant
: The name of the variant, as defined during export
displayName
: This is a more human-readable string, gets actually shown in the UI
defaultState
: The default state of the variant (Overrides what is set during export)
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 Adding Objects to the World.
As of today (Jan 20 2024), you need a collision-enabled mesh for this. We can create our own collisions with the Wolvenkit Blender IO Suite, but the tutorial for this isn't ready yet.
If you want to create AMM: Custom Props for AMM, check the corresponding guide. Note that this mechanism applies for them as well!
Object Spawner 1.5 (screenshots say 1.4, but it's the mod title that wasn't updated in 1.5 )
You know how to Archived: Merging World Additions via ArchiveXL
allmeshes.archive and updated allpaths 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.
Open the .ent file and look for the mesh component in its components array.
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.
This information is not well-researched as of Jan 2024 - if you know anything more about this, please get in touch via Discord or update the wiki!
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
.
I strongly suggest you to change the .ent name and folder to a custom one, so it doesn't interfere with the rest of the game.
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.
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 8.7
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)
This page will gather knowledge and guides about scripted interactions in Lua.
Published: Feb 24, 2025 by Last update: Feb 24, 2025 by Credits: @keanuWheeze for creating 90% of the scripts shared in this pages.
This page and its subpages contain ressources to guides about making scriped interactions for the player, for Cyberpunk 2077.
For the following, we can distinguish 2 types of interactions : devices and workspots.
Device like interaction will trigger a more-or-less simple code, eg : Open the wardrobe menu, Toggle a streamingsector variant, Open the Appearance menu, etc...
Workspot interaction involve animations and/or props, eg : Sleep on a bed, Sit on a chair, Smoke a cigarette, Drink a beer, etc...
You want to add workspots for NPCs ? Check this guide : Placing AISpot Nodes
You want to change V's animations ? Check this section : Animations -> Editing V's Actual In Game Animations
The next tutorials will show you how to get interactions to work without Lua or CET knowledge, but if you want to understand more about it, you can find a dedicated wiki about Cyber Engine Teaks here.
If you're using Visual Studio Code, you can get proper information on the games / CETs functions and methods using the CET Lua Lib.
For the following tutorials, you will need this template. It provides a bunch of utilities to make diverses things, beyond just interaction scripts. You will probably not use all those files, but they can be usefull depending on your needs.
Thanks to @keanuWheeze for making most of the scripts.
Here is a breakdown of the its content:
Device interactions :
Apprearance
Mesh swap (template)
Custom door
Workspot interactions :
Sit (template)
Bench
Couch
Lean (rail)
Sleep
Coffee
Drink
Shower
Lua kit for CET : Cron, GameUI and more by @psiberx
Tween library for smooth transitions by @kikito
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
How to use streamingSectorPrefabVariant
This page contains the theory of sector variants, for creating sectors with variants, head over to the guide
Published: Jan 07 2025 by Last documented edit: Jan 08 2025 by
This page will show you how to switch sector states.
To learn more about .streamingsector
files, check
To learn about .streamingblocks
, check
For a list of node types, check
check -> if that's what you'd rather do
Here is an overview of file relations between .streamingsector
and -block
:
The game contains only 3 streamingblocks that gather more than 26300 sectors.
We will focus on the main one and take a look at the first sector inside (exterior_-18_3_-12_0
).
When creating a mod with sectors, you will need to create your own block that will list your new sectors.
This sector has 10 variants, in this case, each one is related to a quest state.
numNodeRanges
indicate the number of node ranges the sector contains; it always corresponds to the number of variant + sector's default range (so here 10 variants + 1 default).
When opening a variant definition, we can find the range index (to find the right range inside the sector file). rangeIndex
cannot be 0, 0 is used as sector's default range.
Variant's name is only used to identify the variant within the streamingblock.
To trigger a switch between sector states, you can use
.questphase files
This guide will describe the steps necessary to setup an area outline, and link it to an area node, using Object Spawner
Area nodes are used for a wide variety of things, for example:
Soundscapes (E.g. Muffling of outdoor sounds while indoor)
Locations (For location notifications)
Vehicle Forbidden (Prevents you from driving cars into the area)
Prevention (E.g. Removing wanted level)
Interior (E.g. For applying gameplay restrictions like no weapons)
Death areas
Quest Notifiers
And more...
(v.0.9. or newer)
(1.14.1 or newer)
(With latest version of Object Spawner import script)
You need to have a basic understanding of:
Working with WolvenKit
In order to have an area node that functions, you need:
An area node
An outline, defined as a group containing multiple outline markers
It is generally recommended to create a new group for each outline, which only contains the markers for that specific outline
Additionally, it is good practice to have one group containing all the outline groups
An outline consists of a group containing at least 3 Outline Markers
Ideally, the group contains only the markers and nothing else
The outline is only useable within the same root group
Select Area -> Outline Marker
in Object Spawner, as the spawn category
Spawn the markers, one by one (Make sure you put them in the correct group, e.g. by selecting the group in the "Spawn New" tab)
The markers will connect in the order in which they are within the group
To insert a marker in the middle, simply duplicate the closest marker (CTRL-D
)
In order to make an area node use the outline, select the path of the outline group from the Outline Path
dropdown of the area node
Note that only groups containing at least 3 markers, and located within the same root group (In our case the common root group is Some Mod
) are valid outlines
Since the outlines get linked via their path, if you change the name of the outline group, or any parent group (Thus changing its path), the link will break.
Thus it is recommended to keep the outlines in their own group which's name and path will not get changed
Now simply export your group from Object Spawner, and import into WKit using the Object Spawner import .wscript
Back in WolvenKit, create or open
Open the , turn on the option, paste the path and add the ent to your project.
Have you found it ? Amazing ! It means the mesh has a native collision that we can toggle on. Let's do this now.
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.
deletus
The link between quests and sectors' variants is not well-researched as of Jan 2024 - if you know anything more about this, please get in touch via or update the wiki!
In the , add a new entry in each of these lists:
via redscript/CET
Using Object Spawner (Spawning things and into WolvenKit)
Add an "Open wardrobe" interaction.
Published: Feb 24, 2025 by Last update: Feb 24, 2025 by Credits: @keanuWheeze for creating 90% of the scripts shared in this pages.
This page is a subsection of the Scripted interactions guide. It will teach you how to add an interaction to open the wardrobe menu.
The logic shown here also applies to other device like interactions.
≥ 8.16.1 for Cyberpunk 2.21
Most recent from Feb 09, 2025
Visual Studio Code or any IDE to edit lua files
Knowledges required :
You know how to create a mod using Wolvenkit.
You know how to spawn objects using entSpawner
You downloaded the template that contains all the necessary files
Find the place where you want to add the interaction, this can be anything, an existing wardrobe, a new mesh you add, a secret compartment in the wall, or even in the middle of nowhere.
Using entSpawner, add and position a Meta > Static Marker where the Wardrobe icon will be displayed.
Copy the X Y Z position of the marker
(Optional) You can save the marker in a group to more easily change the position later if you're not happy with where the icon appears. But we won't need to export it.
In the interactions.lua
file, add your new device interaction inside the interactions.setupInteractions()
function :
The require contains the path to the device.
Its instantiation takes 2 parameters: an ID which must be unique, and the location.
Paste the X Y Z copied before into the Vector4
, the fourth parameter must be ignored and set to 0.0
.
If you're working with hot reload, you can change the interactions.lua
file from within your game folder and then directly press Reload all mods in the CET menu to see the result, without having to restart your game. Otherwise, redeploy you mod.
Not happy with the interaction range? or the icon visibility range? or the text label? Each interaction device comes with options that you can change to your will.
Default wardrobe parameters :
To change these, you can set their value before initializing the interaction, like so :
You want to regroup your localizations? Use the utils/localizedText.lua
to give your localizations more meaningful names.
Wolvenkit ( | )
Object Spawner ()
For localizations -> Open the LocKey browser inside Wolvenkit.
You want to add you own translations? Use the utils/lang.lua
file and take the time to translate your action in the other languages, all players will appriciate it!
For icons -> Open the Asset browser inside Wolvenkit and search for the mappin_icons.inkatlas
. The Part Mapping tab will help you choose the appropriate icon, then simply adapt the icon name as such : hide_weapon -> HideWeaponIcon. (You have a doubt on the name ? Search for it in the Tweak browser)
For sounds -> You can search for it in the SoundDB, or by using entSpawner Deco > Static Audio Emitter.
floorMarker
NodeRef gets turned into hash)weapon_case_medium.ent
).streamingsector
lootTable
and persistentState