Page cover image

VendorsXL: Custom Vendors

Custom in-world vendor support via simple TweakDB/TweakXL records, created by Deceptious

Published: February 2025 by Florence

What is VendorsXL

VendorsXL is a mod by deceptious. It lets you create your own vendors in night city by altering or creating vendor entities .

Custom vendors features:

  • Customisable workspot - the animation/idle that the vendor has

  • Customisable character/appearance - who the NPC is and what they look like

  • Customisable vendor name - what they appear as when scanned and on their prompt

  • Customisable stock - can either be a list of items (Vanilla or Modded), or a predefined Vendor.

  • Customisable position/rotation - where in the world the NPC will be found

  • Customisable map/minimap icon - 8 icons to choose from

Requirements:

Introduction:

Simply include with your mod a new tweak, based on the template, with a unique name and customised values This can even be included in existing .yaml files.

The name of the tweak must be unique, but all the other values can be shared (try not to put your vendors on top of each other, though...) Make sure your yaml file/folder is named such that it doesn't load before '##########VendorsXL' or your tweak won't load correctly.

Display Name can be any existing, or new, LocKey - but you would have to create the new LocKey yourself as part of your mod. Workspot can be any workspot, but it is your responsibility to pick one that your character/entity supports. It doesn't have to be standing, either. Entity and appearance can be any existing, or modded, entity and appearance - these values can be found in the same variables in existing Character records in the tweak database. (Mod is only assumed to work with humanoid characters, non humanoids may not work - I couldn't get base game Brendan to work...)

.YAML Template:

Character.<your unique atelier/mod/id name>:
  $base: Character.vendorsxl_base
  #Entity and appearance setup for your vendor/npc [default is the Kabuki Gun Vendor]:
  appearanceName: None
  entityTemplatePath: base\open_world\characters\vendors\wat_kab_gun_trainer_01.ent
  
  #Faction [default is Factions.Civilian]
  affiliation: Factions.Civilian
  
  #Naming [default is 'Vendor']:  
  displayName: LocKey#15525
  
  #Workspot file [default is standing using a tablet]:
  holocallInitializerPath: base\workspots\common\ground\generic__stand_ground_tablet__use__01.workspot
  
  #Location data [REQUIRED]
  bossHealthBarThresholds: [<x>, <y>, <z>, <i>, <j>, <k>, <r>]
    #Position data           x,   y,   z, 
    #and Rotation data (quaternions)        i,   j,   k ,  r
    #Example: [-1286.9, -1686.1, 44.2, 0.0, 0.0, -0.615, -0.787]
    #CET Command to get these values where V is standing:
    #   print(GetPlayer():GetWorldPosition()) print(GetPlayer():GetWorldOrientation())
  
  #Your vendors items, edit and expand:
  items:
    - Items.<first>
    - Items.<second>
    - Items.<third>
    #Example: - Items.CasualShoes_07_rich_02
  
  #Existing Vendor ID; change if you wish to use an existing game vendor inventory, NOT your own.
  #Do not edit if using custom stock/items above.
  vendorID: Vendors.vendorxl_custom
  
  #Mappin icon on maps, default: Clothing
  forcedTBHZOffset: 1
  # 0: No mappin /  hidden
  # 1: Clothing
  # 2: Guns
  # 3: Food
  # 4: Bar
  # 5: Melee
  # 6: Medical
  # 7: Junk
  # 8: Netrunner
  # 9: AutoFixer

Making Your Own NPC

Creating your own entity & appearance can take more work than using existing ones from the game, however it is a great way to add uniqueness and personality to your mods.

Check out this template created by Manavortex: Modders Resource - Custom NPC Template Other Resources: Appearance: .app files & Appearances: change NPC looks If using manavortex's template, you do not need to make the .ent specifically for AMM, but the concept is still the same & it will allow you to use your entity and appearances in the VendorsXL .YAML file.

Once you have completed editing in wolvenkit, make sure it is packed into an WolvenKit archive file. The "custom_vendor.archive" then goes in to the Cyberpunk 2077/archive/pc/mods folder.

Using An Existing NPC

To begin, you should have a text editor like Notepad++ or VSCode available on your computer. If you don't know what this is you can find options here: Text Editor Software Now that you have your editor open, copy and paste the VendorXL template into it.

If you want to use an existing vendor, you will need to find out their entity path. To do this, I personally like to use RedHotTools: World Inspector.

If you want to learn more about RedHotTools, you can find out more here: RedHotTools Wiki Once you have RedHotTools Installed, In Cyberpunk 2077 visit the location of whichever vendor you want to edit. (For this example I will be editing the vendor at Avante Clothing Store). Look directly at your chosen vendor (NPC) and open the Cyber Engine Tweaks overlay. If its your first time using CET it should ask you to select a key-bind of your choice.

entityTemplatePath:

With CET open, you should now see a tab on your screen called 'World Inspector', In the settings tab of World Inspector, I recommend changing the 'Targeting Mode' to Game Physics, this will make it easier for the tool to identify the vendor entity. You should be seeing something like this:

Use the RHT World Editor to locate the .ent file

Looking at the third block of text in the World Inspector, we can see the entity template. In your .yaml file replace the existing entity path "base\open_world\characters\vendors\example_vendor.ent" with your desired entity path. It should look like this:

  entityTemplatePath: base\characters\entities\service\service__vendor_wa.ent

appearanceName:

Choose an appearance, you can either use the current NPC appearance or you can choose an existing appearance from the entity, to view alternative appearances I recommend using as it will allow you to preview the different appearances in your game. If you do not already have Appearance Menu Mod installed, you can download it on Nexus Mods. Links for all requirements can be found at the top of this page

Now that you have 'AMM' installed, launch your game & open it using the CET overlay.

Once again look directly at the NPC & you should see a list of appearances.

Cycle through the appearances and choose the one you want to use.

I will be using the first appearance on the list for this tutorial.

Use the AMM overlay to select an appearance.

Once you have decided on an appearance, you can now copy the appearanceName into your .yaml e.g.

  appearanceName: service__vendor_wa__bls_ina_se1_clothingshop_01

affiliation:

Deciding what affiliation we want our vendor to have, by default it is set to 'Civilian.' Affiliation is what is shown when scanning the NPC, e.g.

Appearance Has Been Changed To 'service__vendor_wa__bls_ina_se1_clothingshop_01'

Arasaka

KangTao

Militech

NCPD

TraumaTeam

NetWatch

Biotechnica

News54

Aldecaldos

Animals

Maelstrom

MaelstromAndroid

Scavengers

ScavengersAndroid

SixthStreet

SixthStreetAndroid

TheMox

TygerClaws

Valentinos

VoodooBoys

Wraiths

WraithsAndroid

Barghest

AfterlifeMercs

CityCouncil

SSI

Unknown

RecordingAgency

Unaffiliated

SouthCalifornia

UnaffiliatedCorpo

Zetatech

NUSA

Classified

OA

Corpbud

Crimson_Harvest

Private_Press

Growl

Highriders

If you want to change your affiliation to something different, take a look at the list of available options. Now that you know your vendors new affiliation, make sure that it looks like this in the .yaml. For this example I will change the affiliation to Zetatech:

  affiliation: Factions.Zetatech

displayName:

By default the name will be 'Vendor' although you can change this by finding or creating a new LocKey. If you want to find an existing LocKey you can use the LocKey Browser in WolvenKit or alternatively you can choose one from this selection of LocKeys that I've prepared:

LocKey Names List

Doyle • 76916 Stokes • 76915 Fitzgerald • 76914 Gross • 76913 Tyler • 76912 Gibbs • 76911 Sandoval • 76910 Estrada • 76909 Lindsey • 76908 Guerrero • 76907 McCarthy • 76906 Paul • 76905 Osborne • 76904 Floyd • 76903 Honkler • 76902 Pope • 76901 Maxwell • 76900 Blake • 76899 Quinn • 76898 Moody • 76897 Cobb • 76896 Flowers • 76895 Hammond • 76894 Malone • 76893 Norman • 76892 Webster • 76891 Adkins • 76890 Conner • 76889 Rios • 76888 Hodges • 76887 Erickson • 76886 Becker • 76885 Yates • 76884 Maldonado • 76883 Darkholme • 76882 Goodman • 76881 Francis • 76880 Joseph • 76879 Swanson • 76878 Patton • 76877 Ortega • 76876 Hampton • 76875 Rowe • 76874 Walton • 76873 Goodwin • 76872 Potter • 76871 Townsend • 76870 Strickland • 76869 Cannon • 76868 Reese • 76867 Ingram • 76866 Higgins • 76865 Blair • 76864 Todd • 76864 Newton • 76862 Robbins • 76861 Rodgers • 76860 Harmon • 76859 Cohen • 76858 Manning • 76857 Glover • 76856 Vega • 76855 Aguilar • 76854 Delgado • 76853 Farmer • 76852 McGee • 76851 Dennis • 76850 Thornton • 76849 Moss • 76848 Mack • 76847 Mann • 76846 Garner • 76845 Cross • 76844 Tate • 76843 Santos • 76842 Burgess • 76841 Stevenson • 76840 Warner • 76839 Reeves • 76838 Salazar • 76837 Hubbard • 76836 Valdez • 76835 Griffith • 76834 Baldwin • 76833 Hines • 76832 Cummings • 76831 Barber • 76830 Daniel • 76829 Bowen • 76828 Sharp • 76827 Benson • 76826 Mullins • 76825 Schneider • 76824 Wolfe • 76823 Ramsey • 76822 Lyons • 76821 Walsh • 76820 Leonard • 76819 Weber • 76818 Chandler • 76817 Keller • 76816 Ball • 76815 Munoz • 76814 Page • 76813 Guzman • 76812 Barker • 76811 Schultz • 76810 Powers • 76809 Curry • 76808 Steele • 76807 Love • 76806 Hardy • 76805 Norris • 76804 Santiago • 76803 Dawson • 76802 Parks • 76801 Vaughn • 76800 FYI: This list barely scratches the surface of names available in the LocKey browser.

If you want to use WolvenKit to find a LocKey open or create a new project then navigate to the 'View' tab and select LocKey Browser. Once open you can either scroll through the list of available LocKeys or you can use the search function to find something specific. For this example I will search for 'Florence',

If you are unable to find the name you want, there is always the option to create your own.

Now that I have found the name that I want to use "Florence" I will copy & paste the Primary Key "66861" into my .yaml file.

  displayName: LocKey#66861

holocallInitializerPath:

Deciding what pose you want your vendor to have, the pose is applied via .workspot, if you are unhappy with the default '.workspot' you can search in WolvenKit to find alternatives. Open a WolvenKit project and navigate to the Asset Browser, You can type different things to find '.workspots, some useful examples are, 'stand', 'lean', 'sit', 'kneel', 'dirt', 'ground' etc. For this example I found a workspot by searching 'stand ground':

bodyguard__stand_ground__2h_back__01.workspot

Once you've found a '.workspot' that sounds suitable, update your .yaml with the '.workspot' path. For this tutorial we are going to use the default '.workspot' however you can change it for your vendor. You can get the '.workspot' path by right clicking the file in WolvenKit and clicking 'Copy Relative Path'

  holocallInitializerPath: base\workspots\common\ground\generic__stand_ground_tablet__use__01.workspot

bossHealthBarThresholds:

This is arguably one of the most imprtant steps as this data provides the location for which your vendor will appear, any mistakes here could make it difficult to find your vendor, so make sure to accuratley record the location data. To record the location data of where you want your vendor to be, you will need to stand in the location & face the direction that you would want the vendor to be doing. If you are unable to access the location that you want your vendor to be in, FreeFly (Noclip) can help!

Open the CET overlay, open the console & paste this command prompt into the console:

print(GetPlayer():GetWorldPosition()) print(GetPlayer():GetWorldOrientation())

You should see a result that looks similar to this in the console:

ToVector4{ x = -237.9411, y = -37.574867, z = 1.1647644, w = 1 }
ToQuaternion{ i = 0, j = 0, k = -0.6527144, r = 0.7576041 }

Now transfer this data from the console to your .yaml. Once completed it should look like this:

  bossHealthBarThresholds: [237.9411, -37.574867, 1.1647644, 0, 0, -0.6527144, 0.7576041]

Note: x, y, and z are proper world coordinates for where our object will be placed. i = Entity rotation on relative y-axis (ranges from -0.999 to +1.000) j = Entity tilt on relative x-axis (ranges from -0.999 to +1.000)

items:

Adding items to your vendors catalogue is simple, you just update the .yaml with an items Base ID. To find Base ID's for vanilla items you can refer to the Equipment Databases page. For this tutorial I will be using the Cyberpunk 2077 Item Hash List to find the items I want.

I have chosen to add 'Erebus', 'Errata' & 'Fang' to my vendors catalogue. Filter your search in the Cyberpunk 2077 Item Hash List to find the items you're looking for. Keep in mind that there are tabs for different categories, so you may need to switch tabs.

Press [Ctrl] + [F] in the Cyberpunk 2077 Item Hash List to filter your search.
You only need to copy the text inside the quotation e.g. Items.Preset_Borg4a_HauntedGun

Once you have found the item/s that you want, copy the BaseID's from the spreadsheet.

Updating the .yaml with the BaseID's should now look like this:

  items:
    - Items.Preset_Borg4a_HauntedGun
    - Items.Preset_Katana_E3
    - Items.Preset_Knife_Kurtz_1

Once your .yaml is updated, the items will be availible in the vendors catalogue:

If you want to learn more about Spawn Codes (BaseIDs/Hashes) [ Click Here ]

vendorID:

Before starting the game to view the '.workspot' ( Appearance / Pose ), The VendorID needs to be updated as the .ent in this example is using an existing vendor & their inventory. If you are using a custom '.ent' you can skip this step. To find a specific VendorID you can use cheat sheet made by manavortex: Cheat Sheet: Vendor ID's Find out what location the vendor is from, you can either do this by looking at the map, or you can refer back to the World Inspector overview to see what district & area the vendor is from. In this example, we can see that the Avante Clothing Store vendor is located in Westbrook, Charter Hill

Community Entry Name: wbr_hil_clothingshop_01

Now that we know the location, refer to the Vendor ID's Cheat Sheet to confirm the Community Entry Name matches the VendorID, Once confirmed you can update the .yaml with the known VendorID:

  vendorID: Vendors.wbr_hil_clothingshop_01

forcedTBHZOffset:

The final step, and a simple one. You can now choose from 10 options as to how you'd like your vendor to appear on the world map. Currently the Icons available are limited to those used by existing vendors.

  # 0: No mappin /  hidden
  # 1: Clothing
  # 2: Guns
  # 3: Food
  # 4: Bar
  # 5: Melee
  # 6: Medical
  # 7: Junk
  # 8: Netrunner
  # 9: AutoFixer

Choose an Icon for your vendor and update the .yaml with the corresponding number. e.g.

  forcedTBHZOffset: 5

✨ You're Finished! Congrats on creating your first custom vendor! ✨

.YAML Example

Character.Example_VendorsXL:
  $base: Character.vendorsxl_base
  #Entity and appearance setup for your vendor/npc [default is the Kabuki Gun Vendor]:
  appearanceName: service__vendor_wa__bls_ina_se1_clothingshop_01
  entityTemplatePath: base\characters\entities\service\service__vendor_wa.ent
  
  #Faction [default is Factions.Civilian]
  affiliation: Factions.Zetatech
  
  #Naming [default is 'Vendor']:  
  displayName: LocKey#66861
  
  #Workspot file [default is standing using a tablet]:
  holocallInitializerPath: base\workspots\common\ground\bodyguard__stand_ground__2h_back__01.workspot
  
  #Location data [REQUIRED]
  bossHealthBarThresholds: [-238.17978, -37.657776, 1.2408142, 0, 0, -0.65037763, 0.75961107]
    #Position data           x,   y,   z, 
    #and Rotation data (quaternions)        i,   j,   k ,  r
    #Example: [-1286.9, -1686.1, 44.2, 0.0, 0.0, -0.615, -0.787]
    #CET Command to get these values where V is standing:
    #   print(GetPlayer():GetWorldPosition()) print(GetPlayer():GetWorldOrientation())
  
  #Your vendors items, edit and expand:
  items:
    - Items.Preset_Borg4a_HauntedGun
    - Items.Preset_Katana_E3
    - Items.Preset_Knife_Kurtz_1
    #Example: - Items.CasualShoes_07_rich_02
  
  #Existing Vendor ID; change if you wish to use an existing game vendor inventory, NOT your own.
  #Do not edit if using custom stock/items above.
  vendorID: Vendors.vendorxl_custom
  
  #Mappin icon on maps, default: Clothing
  forcedTBHZOffset: 5
  # 0: No mappin /  hidden
  # 1: Clothing
  # 2: Guns
  # 3: Food
  # 4: Bar
  # 5: Melee
  # 6: Medical
  # 7: Junk
  # 8: Netrunner
  # 9: AutoFixer

Last updated

Was this helpful?