Only this pageAll pages
Powered by GitBook
1 of 25

Cyber Engine Tweaks

Loading...

Getting Started

Loading...

Loading...

Loading...

Loading...

Loading...

Overlay

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Modding

Loading...

Other

Loading...

Loading...

External docs

Other Wikis

Troubleshooting

If Cyber Engine Tweaks isn't working, here's what you can do

  • If you are on Linux/SteamDeck, make sure to follow to install the right .dll overrides before reading on.

  • You need VisualC >= 14.40.33810.0 . Download it from the official Microsoft website ()

General troubleshooting

Before trying anything else, please make sure that your Windows and your graphics driver are up-to-date – this actually helps in around 50% of all cases. If you need instructions, you can find them in the red box under the general troubleshooting guide's section.

Step 0: Go to your install directory

Go to your Cyberpunk 2077 game directory, since all paths given in this guide will be relative to that folder.

TL;DR:

CET is installed to bin\x64\plugins\cyber_engine_tweaks

The log file is bin\x64\plugins\cyber_engine_tweaks\cyber_engine_tweaks.log

Example:

For that reason, the Redmodding Discord can only support you the most recent version.

If there's a mismatch, then you can find a warning in the following file:

If you don't have that file, proceed to Step 2.

Go to your Cyberpunk 2077 and check the following subfolder:

It should have at least the following files:

If you do not have these folders, then CET isn't installed correctly. Head to and start with step 3.

If everything looks okay in step 1, check if you have a file cyber_engine_tweaks.log inside the cyber_engine_tweaks folder from the previous screenshot.

No log file means that CET isn't starting up.

  • The easiest fix is to .

  • If you did that and it didn't help, check your antivirus. Most likely, it is protecting you from scary things like Cyber Engine Tweaks. Disable it.

  • If that didn't help either, update everything - Windows, your drivers, etc. You can find links and instructions in the red box on the .

  • If you do have it, you can open it and try to make sense of the error message. You can find more information on that , or find help in the #cet-suppport channel on our .

  1. If you are using Vortex, turn it off (it will get angry otherwise)

  2. Complete either of the following steps inside your :

    • rename bin/x6/plugins to plugins_ or

  1. Find the file \bin\x64\plugins\cyber_engine_tweaks\bindings.json and delete it.

  2. Start the game.

  3. You should now see a popup asking you to bind a key. Otherwise, read on.

Click into the "Binding..." field.

If that doesn't help, make sure to turn off all your overlays (Discord, Steam, Microsoft Game Bar, Random Useless Bloatware) or start Cyberpunk in the Windowed Borderless mode.

If you're experiencing performance issues with CET, first make sure to as per the instructions to rule out side effects from old files.

If that doesn't make the problems go away, make sure to update Windows and your graphics driver as per the red box under Troubleshooting's section.

If that doesn't help, you can find us in #cet-support on the . Please note that people there will first suggest everything else from this guide, so you might as well get it out of the way first.

Make sure to update Windows and your graphics driver as per the red box under Troubleshooting's section, as this is the only chance you have of getting rid of your crashes.

This is a known issue with AMD cards, and it's not something the CET developers can fix. Everyone who could fix it is informed, but such things take time. If you're on an AMD card, you can try running your game in Windowed Borderless mode. Otherwise, you just have to live with the crashes.

Please ensure the following:

  1. If you have modified your game's .exe file yourself, the mod will not work - to undo this, delete the file and verify your game through GOG, Steam or Epic to download a fresh copy of the newest exe.

  2. Update your game. You are using a patch that is not supported. Only current versions are supported. (current version is 1.6)

  3. You used the old version of the mod and still have the old files installed. Delete bin/x64/plugins/ and reinstall the mod.

Install - if nothing happens, please make sure all of your overlays and monitoring programs are disabled. There is a list of known programs that cause issues below. If you find one not on the list, contact Arsenic_Touch via the discord.

Cyber Engine Tweaks no longer comes with a config file, one is generated when you first launch the mod.

When first launching cyber engine tweaks, it will prompt you to pick a keybind. Tilde is no longer the default. Keyboard input is blocked until a keybind is chosen. If you do not see the pop up, look below for further troubleshooting steps.

Certain programs conflict with the hook that Cyber Engine Tweaks use to display the console - to avoid this, disable any software with overlays that may impact the mod (some examples below). This includes crashing the game or not launching at all. OBS graphics-hook32.dll and graphics-hook64.dll can also interfere. Do a search of your windows files to see if you have a program running them. For rivatuner, you can also open the Global file with notepad++, which is located in RivaTuner Statistics Server\ProfileTemplates and add cyber_engine_tweaks.asi to the end of the decimal in the line: InjectionDelayTriggers

  1. Open Windows Security

  2. Go to Apps & Browser control on the left tabs

  3. Click Exploit protection settings Under the Exploit Protection section

Credit to discord user @rachmanov1c @OrBy

Please verify that:

  1. Your version of Cyberpunk is compatible with the newest release on GitHub or Nexus (this can be seen in the menu, underneath "Quit Game")

  2. You have the most recent version of the mod from or

  3. The has been followed correctly

  1. Make sure cyber engine tweaks and your mods are installed with hardlink If hardlink doesn't show up under vortex, make sure the Vortex Mods folder is on the same partition as the game mods folder. This explains it .

  2. Make sure you're using the most up to date vortex plugin for cyberpunk 2077. Check the channel on the discord for the latest information.

There are six possible solutions to this:

  1. Ensure your game is in - Cyberpunk will usually make itself the topmost application on your screen if in fullscreen.

  2. Ensure you don't have any or monitoring software running such as Rivatuner, Fraps, etc.

  3. Make sure your game is up to date and you are using the latest version of Cyber Engine Tweaks and that you installed it properly. (do a clean install by deleting the plugins folder, LICENSE, global.ini, version.dll files if you are running into a problem)

  1. Delete the bindings.json file located inbin/x64/plugins/cyber_engine_tweaks/ and start your game, the overlay will to choose a new keybind should come up. If it doesn't, check the known list of programs that can interfere.

If you see in your log that your game is freezing on CRender and you have problem like this you should try steps provided below.

1. If you are using mod manager disable CET temporarily, if you are not using mod manager then follow guide. 2. Launch the game without CET and disable FSR/DLSS 3. Install/Enable Cyber Engine Tweaks and launch the game, the problem should be gone.

Please ensure you attempt deleting and reinstalling the mod before submitting an issue! Alternatively, . Additionally, please check to ensure your issue has not already been reported!

If you cannot find your problem listed, with the following:

  • Your configuration file

  • Your Cyber Engine Tweaks version and your Cyberpunk 2077 version

  • Your log file

  • Your OS version

delete the file bin/x6/plugins/cyber_engine_tweaks.asi

  • move the folder bin/x6/plugins/cyber_engine_tweaks out of plugins (e.g. your Desktop). Do not delete it yet.

  • Download the most recent CET from

  • Extract the downloaded archive to your game directory (the bin folder will merge with the one that is already there)

  • Start the game: CET should now ask you to bind a key. If it doesn't:

    1. (double-check if you're sure)

    2. Head to the and follow the steps in the red box at the top

  • Optional: Restore your mods and/or settings Now that CET works, find the old directory from step 2. Move the following files/folders:

    1. Mods: the directory mods from the old cyber_engine_tweaks folder

    2. Settings: The .json files directly inside cyber_engine_tweaks

  • Optional: delete the old folder (or leave it, it's your diskspace)

  • That's it! You're good to go!

  • Do a repair on your installation with no other mod files installed (redscript, cet, et cetera) then install CET as you normally would and check the log file. If it still isn't working, uninstall cyberpunk 2077 and do a complete wipe of the install folder.

  • In the
    Systems Settings
    tab locate
    Randomize memory allocations (Button-up ASLR)
    and
    High-entropy ASLR
    and change their settings to
    Use default (On)
    .
  • Restart your computer.

  • You have verified that the log found in bin/x64/plugins/cyber_engine_tweaks/cyber_engine_tweaks.log is 'last modified' at the same time and date as your most recent attempt to launch the game
  • Remove all previous mods in the mods folder and try to launch the game. If it works, add your mods back one by one until you find the one that breaks CET. Some mods can break CET completely or change the overlay colour if they are not up to date.

  • Run the game as administrator. (this works for some people where other methods have failed)

  • Check to make sure your antivirus software is not removing or blocking cyber engine tweaks.

  • Do a complete reinstall of cyberpunk 2077.

  • A description of your issue

    If your game is pirated, .
  • If you're experiencing performance issues, check

  • If you are experiencing crashes caused by CET, try running Cyberpunk in

  • If you can't open your overlay, check

  • If your CET just stopped working (without a game update) or if you've been sent here to do a clean install, see below how to

  • For any other issues, read .

  • Your keybind is stored in
    bin\x64\plugins\cyber_engine_tweaks\bindings.json

    Your install directory

    C:\GOG Games\Cyberpunk 2077\

    Path from the guide

    bin\x64\plugins\cyber_engine_tweaks

    Folder you go to

    C:\GOG Games\Cyberpunk 2077\bin\x64\plugins\cyber_engine_tweaks

    bin\x64\plugins\cyber_engine_tweaks\cyber_engine_tweaks.log
    bin\x64\plugins

    Step 0.5: Update your game and the mod

    Each version of CET is compatible with exactly one game version. Nobody keeps track of those other than "the most recent ones work together".

    Step 1: Check the install folder

    Step 2: Check for a log file

    You don't have a log file

    You have a log file

    Reinstall CET

    Uninstalling (the full game or just the mod via Vortex) can leave files behind, which will fuck things up for you after a reinstall. This section tells you how to avoid that.

    Reset your keybind

    I can't bind a key

    If you do not see the popup at all, or do a .

    Microstutters and Performance

    Crash to Desktop on Alt+Tab

    Frequent Issues and Solutions

    I receive an error saying 'Unknown Version'

    No log file appears in bin/x64/plugins/cyber_engine_tweaks/

    I don't have a config file in bin/x64/plugins/cyber_engine_tweaks/

    The CET window will not close.

    When I press the key to show the console, I only see the cursor!

    Cyberpunk crashes after the intro video when using CET 1.14

    The mod isn't working with my version of the game!

    If installed through vortex and your game won't launch.

    The prompt to choose a keybind doesn't appear and or pressing the chosen keybind does not bring up the mod.

    I forgot the keybind to bring up the overlay for CET.

    I can bring up the CET overlay but my image is frozen on intro videos

    Submitting an issue

    general troubleshooting page
    here
    Discord
    REDmodding Discord
    this
    AMD Radeon
    Discord
    Geforce Experience
    Steam
    GitHub
    Nexus.
    installation guide
    deployment
    more
    #vortex-support
    Windowed Borderless mode
    overlay
    uninstallation
    consider asking in the Discord server
    submit an issue on GitHub
    this guide
    direct link
    Reinstall CET
    Reinstall CET
    Reinstall CET
    Nexus
    Update both the game and the mod
    troubleshooting guide
    XBOX Game Bar
    MSI Afterburner
    Rivatuner
    GoG Galaxy
    Epic
    NZXT Cam
    Ubisoft Connect
    go here
    here
    compatibility mode
    check your CET install
    clean reinstall of CET
    Reset your keybind
    Reinstall CET
    General troubleshooting

    Notice

    The scripting sections for this wiki has moved!

    The various scripting wikis have been merged into a new wiki, please go there for scripting documentation about Redscript, CET, or general information of how to interact with the game systems through scripting:

    Old links for this wiki are kept alive as redirects to their location in the new wiki, however scripting aspects for CET will no longer be available in this wiki.

    Scripting Cyberpunk

    Console

    How to use the Cyber Engine Tweaks Console

    Console UI

    The console tab is where you type commands to use cheats and other useful functions.

    Console Buttons

    What the buttons and checkboxes do in the Console tab:

    BUTTON
    DESCRIPTION

    Clear Output

    Clear the output log displayed in the console.

    The console uses script language, you may want to look up how to use it before proceeding. There are some guides here to get you started:

    Auto-Scroll

    Will automatically scroll to the bottom when there is a new output log.

    Reload All Mods

    Reload all installed mods.

    Console Commands

    Lua
    Useful commands

    Useful commands

    A collection of commonly requested commands. How do I...

    First Launch

    After installing CET, you can open the console overlay with the corresponding key.

    If you have any problems getting to this stage, please check the page.

    The commands are case-sensitive!

    Many console commands have changed with 2.0. If something you try doesn't work, check the most up-to-date list under .

    Open the Console tab to run Lua scripts or engine functions. To find out what you can do here, keep reading.

    Spreadsheets

    To find all the codes you can enter, check

    • CET Console Commands for Patch 2.x (source: #cet-support on redmodding Discord)

    For the most common commands, see below.

    If you want to find a specific item, look for how to find the hash code for the .

    Use Game.AddToInventory

    Use Game.SetLevel

    Formerly Game.SetAttribute

    Formerly Game.GiveDevPoints

    All vehicle commands are documented on the VehicleSystem page linked below.

    You can print V's current coordinates to the CET console with the following command:

    You will need to know the coordinates of where you want to go in the game world, some popular . Replace X, Y, and Z with your coordinates. Coordinates can also be found in the nodeData of .streamingsector files.

    For a more cohesive list of quest facts, check the .

    Game.AddToInventory("Items.money", 10000) -- Gives 10,000 eurodollars
    Game.AddToInventory("Items.SQ031_Samurai_Jacket", 1) -- Gives you the Replica of Johnny's Samurai Jacket 
    Game.SetLevel("Level", 60, 1) -- Sets character level to 60
    PlayerDevelopmentSystem.GetInstance(Game.GetPlayer()):GetDevelopmentData(Game.GetPlayer()):SetAttribute("Strength", 15) -- Sets Body to 15
    PlayerDevelopmentSystem.GetInstance(Game.GetPlayer()):GetDevelopmentData(Game.GetPlayer()):AddDevelopmentPoints(5, gamedataDevelopmentPointType.Attribute) -- Attribute (skill) points
    PlayerDevelopmentSystem.GetInstance(Game.GetPlayer()):GetDevelopmentData(Game.GetPlayer()):AddDevelopmentPoints(3, gamedataDevelopmentPointType.Primary) -- Perk points
    print(Game.GetPlayer():GetWorldPosition())
    Game.GetTeleportationFacility():Teleport(GetPlayer(), ToVector4{x=X, y=Y, z=Z, w=1}, ToEulerAngles{roll=0, pitch=0, yaw=0})

    Items

    Frequently Required Items

    Ammunition

    Crafting Components

    Quickhacks

    Level

    Attributes

    Perk and Skill Points

    Vehicles

    Teleportation

    Get your coordinates

    Go somewhere else

    Facts

    At this time there is no way of triggering or "fixing" stuck quests with the console.

    Spoilers!
    CET Console Commands for Patch 1.x (Legacy)
    command below
    https://nativedb.red4ext.com/c/3328983970199042
    coordinates are available here
    troubleshooting
    Spreadsheets
    Game.AddToInventory("Ammo.HandgunAmmo", 500)
    Game.AddToInventory("Ammo.RifleAmmo", 700)
    Game.AddToInventory("Ammo.ShotgunAmmo", 100)
    Game.AddToInventory("Ammo.SniperRifleAmmo", 100)
    Game.AddToInventory("Items.CommonMaterial1", 1000)
    Game.AddToInventory("Items.UncommonMaterial1", 1000)
    Game.AddToInventory("Items.RareMaterial1", 1000)
    Game.AddToInventory("Items.EpicMaterial1", 1000)
    Game.AddToInventory("Items.LegendaryMaterial1", 1000)
    Game.AddToInventory("Items.QuickHackUncommonMaterial1", 1000)
    Game.AddToInventory("Items.QuickHackRareMaterial1", 1000)
    Game.AddToInventory("Items.QuickHackEpicMaterial1", 1000)
    Game.AddToInventory("Items.QuickHackLegendaryMaterial1", 1000)
    Game.GetQuestsSystem():SetFactStr("sq032_johnny_friend", 1)
    Game.GetQuestsSystem():SetFactStr("mq007_skippy_aim_at_head", 1)
    Game.GetQuestsSystem():SetFactStr("mq007_skippy_goes_emo", 0)
    Game.GetQuestsSystem():SetFactStr("q005_jackie_to_hospital", 0)
    Game.GetQuestsSystem():SetFactStr("q005_jackie_to_mama", 0)
    Game.GetQuestsSystem():SetFactStr("q005_jackie_stay_notell", 1)
    Game.GetQuestsSystem():SetFactStr("q112_takemura_dead", 1)

    Secret Ending

    Skippy - Mode

    Skippy - Relationship

    Change where Jackie was sent to in the prologue?

    Set Takemura's condition after the parade?

    Getting Started

    FAQ

    Frequently asked questions about Cyber Engine Tweaks based mods.

    1. "mod" or "mods" on this page refers to mods that are dependent on Cyber Engine Tweaks.

    2. Cyber Engine Tweaks will be referred to as CET from now on.

    I've installed this mod but nothing happens.

    1. Make sure that CET works fine without any mods installed.

    2. Make sure the mod that you are installing is compatible with the latest CET.

    I've made sure the above are true but the mod still won't function.

    You need to bind a hotkey in the Hotkeys tab of the CET overlay. Check how-to here.

    I've bound the hotkeys but the hotkeys do nothing when I press it.

    The hotkeys only work when the CET overlay is closed.

    I've bound the hotkey and I've closed the CET overlay but still, nothing happens.

    You need to press the hotkey combination in the right order. For example Ctrl + Shift + S is different from Shift + Ctrl + S

    You need to open the CET overlay to interact with anything using your mouse.

    You need to change the default font of CET in order for the characters to show properly. You can follow this guide .

    Click for the ultimate guide.

    I bound the hotkeys and the interface opens but I can't do anything there. There's no cursor in the window.

    This mod supports different languages, but when I change the language every character becomes a ? (question mark).

    How do I open .7z .rar .zip files?

    Clarification:

    here
    here

    Patch notes

    1.20.0 - 06/08/2022

    Support for patch 1.6

    Added

    • TweakDB.CreateRecord, TweakDB.CloneRecord, and TweakDB.DeleteRecord now support TweakDBID as a parameter type

    -- Get the sticky frag grenade record
    sticky_grenade = TweakDB:GetRecord("Items.GrenadeFragSticky")
    
    -- Create a clone of "Items.GrenadeFragSticky" with the name "Items.GrenadeFragStickyNew"
    TweakDB:CloneRecord(sticky_grenade:GetID() + "New", sticky_grenade:GetID())
    
    -- Get the new record
    sticky_grenade_new = TweakDB:GetRecord("Items.GrenadeFragStickyNew")
    -- or
    sticky_grenade_new = TweakDB:GetRecord(sticky_grenade:GetID() + "New")
    
    -- manipulate the new record as needed
    
    -- delete record many different ways
    TweakDB:DeleteRecord(sticky_grenade_new:GetID())
    TweakDB:DeleteRecord(sticky_grenade:GetID() + "New")
    TweakDB:DeleteRecord("Items.GrenadeFragStickyNew")

    Changes and fixes

    • Updated usedhashes.kark to the new URL

    • Moved to OpenResty Lua JIT

    Support for patch 1.52.1 (made up name, they didn't bother to name it AGAIN)

    Support for patch 1.52

    • Fix crash on Windows 7.

    • Fix LoadTexture overwriting the previously loaded texture.

    Support for patch 1.5 hotfix 2

    • ImGui.LoadTexture(string path) returns a texture loaded from an image on disk in the mods' directory.

    • ImGui.Image(texture) displays a texture loaded with the LoadTexture function.

      Full Api is as follows, note that you may omit parameters after texture and default values will be used (Texture texture, ImVec2 size, ImVec2 uv0, ImVec2 uv1, ImVec4 tintColor, borderColor)

    • Added stb to load images.

    • Fixed bad screen skip fix.

    Support for patch 1.5 v2

    • Changed the archive hashes to use the wolvenkit KARK files for TweakDB editing

    • red4ext updated to 1.3.1

    Support for patch 1.5

    • red4ext updated to 1.3.0

    • mimalloc updated to 2.0.3

    • sqlite3 updated to 3.37.0+200

    Special thanks to WopsS, psiberx and Sombra for their help with this patch!

    • exEntitySpawner does not work.

    • No pedestrian patch is not tested.

    • Fix cursor not getting locked to the game.

    • Fix skip start screen patch not working.

    Support for patch 1.5

    • exEntitySpawner does not work.

    • No pedestrian patch is not tested.

    • Feel free to tell us any other issue that may arise on github/discord.

    • mimalloc updated to 2.0.3

    • sqlite3 updated to 3.37.0+200

    • Improve the d3d12 hook to fix a crash when using ReShade < 5.

    • Improve the d3d12 hook to avoid conflicts with other overlays.

    Contains: and

    • Fixed random crashes when overridden method has a script reference parameter.

    • Fixed random crashes when working with game structs.

    • Fixed random crashes for very frequently called overrides (such as GameObject.OnGameAttached and GameObject.OnDetach on game reload).

    • Added the ability to add new free flats to TweakDB.

    Contains: , , and

    • Fix bad allocation causing crashes when using some RTTI types

    • When using Override() the handler receives the original function (or next in the override chain) as the last parameter

    • The wrapped function can be called multiple times

    • If any of the overrides fail then the entire override chain also fails

    • Observers can be called before and after the target function using ObserveBefore() and ObserveAfter()

    • Observe() is an alias for ObserveBefore()

    • All observers are guaranteed to be called even if overrides and other observers fail

    • It's possible to observe and override static class methods

    • Full name should be used when overriding a scripted static method

    • Use weak handle for self in overrides. This should decrease the number of unreleased references and make CET less dependent on garbage collection.

    • Reuse overridden functions on mods reload. This fixes a potential issue with the native function registry, which has a hard limit on the number of registered functions.

    • Support out params in overrides.To properly handle out params in overrides:

    • Added support for mods deployed as a symlink for the mod directory

    • Added Lua function to check if the mod archive is installed:

    • Use FromVariant(variant) to extract the value

    • Use ToVariant(value) to pack the value when the type is unambiguous

    • Use ToVariant(value, type) when the type is ambiguous or you wanna force the type

    • The type of the array is resolved from the first element when possible

    • Added event for early TweakDB changes:

    Contains: , , and

    • Fixed directx12 hooking not working when overlays were present.

    • Fixed symlink deployment with Vortex.

    • Drop second implementation of Scripting::ToRED() which was very outdated. This was limiting what overridden functions can return.

    Will output

    • Stricter check of the passed context when calling the RTTI function. Prevents unwanted crashes when invalid value passed as self / this. In particular, it prevents crashes when a dot is accidentally used instead of a colon.

    • Support for ISerializable strong and weak references. This opens access to some new classes, but not all of them.

    • Workaround for parameterized struct constructor. Previously, fields of a reference type could be corrupted right after construction.

    • Support of nulls for strong and weak references.

    Assignment example:

    Parameter example:

    • IsDefined helper function as in redscript. Checks if reference is not null and valid. Can be used on game object's field and lua variable.

    • EnumInt helper function as in redscript.

    • Support for CRUID type.

    • Support for gamedataLocKeyWrapper type.

    Support for patch 1.31

    Contains:

    • Updated to Imgui 1.84.2

    Support for patch 1.30 second edition.

    Contains:

    • Fix disappearing footsteps (1.16.1 regression).

    • Alternative syntax for CName and TweakDBID conversions without .new()

    • Direct access to global functions.

    • Throw Lua errors from RTTI calls as the Lua script will do.

    Will print the full callstack in the log:

    • Fix channel logs not printing the message.

    • Added a new channel "DEBUG" that always prints even when game logs are disabled.

    • Re-added TweakDB printing.

    • Register global PlayerPuppet.OnAction

    Support for patch 1.30 - huge thanks to everyone who helped with this and all testers!

    Contains: , , , and

    • Fix crash when calling functions that have optional parameters not defaulted.

    • Fix crash when using RegisterInputListener from an observer.

    Contains: , , , , , , and

    • Whitelisted collectgarbage to let scripts force release game references.

    • Added exEntitySpawner to spawn entities easily

    • Fixed a crash that would occur on machines without ASLR enabled by enabling LuaJIT's GC64 option.

    • Fixed nested RTTI calls that would crash the game due to memory release of the previous call's memory.

    • Fix the disable anti AA and async compute patches.

    • Fix for TweakDB default values.

    Contains: , , , , ,

    • All game classes are directly accessible by name. For example, entEntityId, PlayerPuppet.

    • All game enums are directly accessible by name. For example, gamedataStatType.BaseDamage, gameGameVersion.Current.

    • Added WorldFunctionalTests

    • Added Imgui.GetStyle()

    • Added support for ResourceAsyncReference. Allows editing of TweakDB props of that type by the mods.

    • Fixed disappearing footsteps issue.

      • The issue still can occur if the mods do not properly release the player reference.

    • The GetMod() is only available after onInit as there is no guarantee that the required mod will be loaded before this event.

    • Global fallback table is used now for all mod environments. No need to whitelist what's defined there.

    • Aliases like Game['GetPlayer'] = Game['GetPlayer;GameInstance'] aren't needed in autoexec.lua. All global and class functions are automatically resolved by short name now.

    • Added implicit class to strong reference conversion.

    • Patch for the Minimap flicker

    Support for patch 1.22

    Fixed

    • Crash when using TweakDB:Update in an Observe/Override callback

    • Direct3d12 command queue could be null sometimes

    • Error logging from Observe/Override callbacks

    • Redundant Lua environment passing

    Added

    • Strings can now be implicitly cast to a TweakDBID when the scripting framework expects a TweakDBID

    Support for patch 1.21

    Fixed

    • Lua scripting errors with functions returning some values with out params

    • GameOptions.Toggle() now works

    • Fix falsy "Unknown error" when calling a global that returns nil

    Added

    • Equality comparison to some types (Vector3, Enum, TweakDBID,...)

    • Concatenation for TweakDBID

    Fixed

    • Regressions with GameOptions

    • Wrong version info returned back by GetVersion()

    • Problems with Console widget history

    • 3rd party licences missing

    Added

    • Modal popups for unsaved changes into Bindings and Settings widget

    • Modal popup on first launch asking user explicitly to bind some hotkey for toggling Overlay

    • Option to enable removing of dead binds (default is on)

    • Option to enable ImGui assertions to make sure mods are not breaking something (default is off)

    Changed

    • Nicer formatting of headings inside Bindings widget (replace characters that are not alphanumeric by space and autocapitalize each word)

    • Reworked Settings menu (options are now split into two categories - Patches and Dev)

    • Reworked Bindings menu (separated hotkeys and inputs into two categories)

    Added support for patch 1.2.

    Fixed

    • os.remove and os.rename were not working properly.

    • The debug menu patch would not show the menus.

    • Fixed dofile, loadfile and loadstring.

    • Lua environment would not be applied correctly to some callbacks.

    Changed

    • Key bindings were improved.

      • Support for scroll wheel.

      • registerInput for single inputs. This handler is similar to registerHotkey, but function now takes one boolean argument denoting if input was pressed/released.

    Added

    • Re-added the SMT patch for AMD CPUs that did not get a performance boost after CDPR's patch.

    • Added Lua's bit32 library.

    • TweakDB additions:

    Fixed

    • Fix memory allocation errors due to missing argument.

    • Fix Observe/Override sometimes affecting scripts when they shouldn't.

    • Fix crash when using multiple mods.

    Fixed

    • Crash on game exit when a reference had not been garbage collected by the lua vm.

    • Missing enum value CellPadding in Imgui Lua (Pull Request: ).

    • Crash when using Override/Observe on pure script functions.

    • Crash when reloading mods using Override/Observe.

    Changed

    • Memory optimization for calls.

    • Replaced the hacky thread safety used for the Lua VM with TiltedCore's Lockable<T>.

    Added

    • API changes to support Imgui 1.81 and added missing ColorButton overloads.

    • Override has now 2 overloads to simplify usage, this will completely remove the original function or add one if it doesn't exist:

      • Override(typeName, fullFunctionName, shortFunctionName, function)

    Changed

    • Upgrade Imgui 1.80 to .

    • Fixed Override so that it can override at runtime after scripts have been loaded.

    • Revert Lua caching of functions as the new override method will work regardless.

    Fixed

    • Fix game crash when a script used "require" on a malformed file.

    Added

    • Override function to either listen to a function or to replace a game function. Despite its name it can also be used to extend a type by adding a new function. Usage is as such:

    The first parameter is the class type, second the full name of the function, the third is the short name (usually they are the same), the fourth boolean is used to specify if this is a replacement of the function or not, if set to true it will replace entirely the original function, if set to false, your function will be called before the original function is called. The last parameter is your handler function, note that the parameters are passed according to the RED script definition.

    Removed

    • Telemetry, the experiment gave us the data we wanted, obviously a lot of people use the mod and we are very happy about that! We are sorry this caused so much drama, it wasn't the intention and quite frankly we still don't really understand why.

    Changed

    • Calling RED functions used to be cached, given that functions can be overridden at any time the cache has been removed, it's a bit slower but shouldn't be visible in the real world.

    • Using the up and down arrows in the console now retrieves the command history

    • Added Telemetry so we know how many people use CET (can be disabled in settings), note that we do not store any information we just count the number of players

    • Fix TweakDBID issues with large arrays

    • Fix TweakDBID crash when using specific functions

    Changed

    • Updated to game version 1.12

    • Updated RED4ext.sdk to the latest

    Proper sandboxing ():

    • Each mod is (right now) assigned sqlite3 database implicitly, accessible through db lua object (will be changed later to on-demand through info in metadata file)

    • Introduced proper sandbox with LuaSandbox helper class

    • Bytecode cannot be loaded now (native modules included)

    More ImGui stuff(, , , ):

    • Enabled ImGui keyboard navigation. (ctrl + tab to switch window, arrow keys to navigate)

    • Removed the deprecated power argument in Drag and Slider widgets, replace it with the newer ImGuiSliderFlag (breaking change)

    • Made the argument open

    TweakDB binding ()

    • TweakDB:GetFlat(...)

    • TweakDB:SetFlat(...)

    • TweakDB:GetRecord(...)

    • TweakDB:Query(...)

    Changed

    • Major vulnerability in the game's save loader fixed

    Changed

    • Updated to game version 1.11

    • Updated RED4ext.sdk to the latest

    • Updated to spdlog 1.8.2

    • Replaced pattern search with much faster library

    • Fix issue when resizing game window (eg. resolution change in Options)

    • Fix issue causing game window to stop rendering and freeze on last frame

    • Fix ImGui.CalcTextSize overloads (now, second parameter is removed from all, as it did not make sense for Lua anyway)

    • Fix Windows 7 flatlining

    • Added jsonsupport to Lua

    • Added support for the latest patch 1.10

    • UI with settings will now ask you for a console key on first launch, you can edit it later

    • Mods can now request hotkeys via registerHotkey, the user can pick what key they want to use in the menu

    • Scripting is now handling memory correctly, calling Game.GetPlayer() every frame is fine now

    • Game doesn't crash when exiting anymore

    • dofile is now deprecated, use only mods please, it will be removed entirely in the next update

    How do I _____?

    How to do things with CET

    You can find a .

    For a list of console commands for beginners, check out the page:

    Checkout the for your first steps:

    Check or , for example

    Fixed random crashes for hotkeys and inputs (for example, binding the mouse wheel had a very high chance of causing crashes).

  • Fixed potential issues when CET mods that modify TweakDB are used with TweakDBext mods at the same time.

  • Accept all params in the handler

  • Don't pass out params to the wrapped function

  • Return all results from the handler

  • Fix gamedataTDBIDHelper helper that behaves the same as gamedataTweakDBInterface.
  • Sanitize type names to be a valid Lua identifier. This makes namespaced types added by redscript accessible in Lua.

  • Force garbage collection for overridden functions of inkGameController and it's descendants. In some cases, there seem to be issues with unreleased instances of inkGameController leading to crashes. This was introduced when we started to properly wrap the context in Handle<>.

  • Changed the behavior of observers so that all observers will be called even if an override is defined.

  • Function to add new
    CName
    s to the pool
    handler as for pre patch 1.3.
  • Override function by full name. Allows to observe/override all variants of overloaded function.

  • Fix tooltips that contained C format characters and would crash the game.

  • Improved update hook.

  • xmake install will now install in the game's directory to make it easier for those installing from source.

  • Classes can also be accessed by their aliases from redscript. For example, WeaponObject instead of gameweaponObject.
  • Classes have the conventional .new() constructor. For example, MappinData.new().

  • A constructor can take an array of properties to create and initialize an object in a single statement. For example, EntityID.new({ hash = 12345 }).

  • Static methods are accessible from classes using the dot. For example, ScriptedPuppet.IsDefeated(npc).

  • A static method can be called from an instance if the first parameter is of the same type. For example, vec4:Length() instead of Vector4.Length(vec4).

  • The overloaded function is resolved based on passed parameters when called by its short name. For example, StatusEffectHelper.HasStatusEffect(target, gamedataStatusEffectType.Overheat).

  • Partial Variant type support. ToVariant() and FromVariant() are only applicable to classes.

  • Observe() and Override() now accept both native and scripted type names.

  • Added Game.GetSystemRequestsHandler() as an alternative to GetSingleton("inkMenuScenario"):GetSystemRequestsHandler().

  • Added TweakDB:SetFlats

  • Types and functions that rely on RTTI are only available after onInit event to prevent some unwanted crashes and unexpected behavior.

  • Improved detection of whether the game is running. Prevents more crashes when exiting the game.

  • Implemented optional parameters support. Prevents some unexpected crashes.

  • Fixed DumpType("Type") returning empty result.

  • Fixed crash when accessing properties of invalid Enum, eg. Enum.new('', '').value.

  • Fixed crash when setting an incompatible value for an object property.

  • Fixed crash when calling function with out parameters of Enum, CName or TweakDBID type.

  • Fixed memory leaks when passing strong or weak references to the function.

  • Fixed memory leaks when invalid parameters passed to the function.

  • Fixed memory leaks for function results and out parameters of certain types.

  • Fixed memory leaks when creating new objects.

  • Fixed memory leaks when setting object properties.

  • Fixed memory leak for arrays with elements of certain types passed as an argument.

  • Fixed a crash when passing an incompatible array as an argument. For example, an array of numbers instead of an array of handles.

  • Fixed memory leak when passing an object instead of an array as an argument. This resulted in a silent crash without calling ResetAllocator.

  • Fixed inconsistent self and random crashes in Observe and Override.

  • Reverted Override() to the previous behavior so when the handler fails, the original game function is not called.

  • Added implicit conversion from Int64/UInt64 to other arithmetic types.

  • Added type safety checks for Int64/UInt64.

  • Added recursive freeing of arrays.

  • Added logging for errors occurred in the module loaded with require(). Should make the transition to the new version less painful.

  • Updated RED4ext to latest version.

    • This fixes the error when trying to use a CName that is None

    64bits numbers are now correctly interpreted as numbers by Lua

    Return out params from global function the same way as for instance methods
  • EulerAngles::ToString returning swapped roll and yaw values

  • SQLite3 database not closing on mod reload

  • ImGui.TreePop unavailable in Lua

  • Multiple registerInput handlers unable to be invoked at same time

  • Conversion of 64-bit integral values from object properties

  • Scroll wheel failling to register properly

  • Option to toggle ImGui Diagnostic window (default is off, this option is not preserved after restart!)

  • onDraw is not called for mods while CET modal dialog is active (including first launch)
  • First time launch (it should now be more streamlined)

  • Decoupled config.json from bindings.json (overlay key is now located only inside bindings.json and is left out of config.json)

  • Overlay key was moved to Bindings menu

  • Updated TiltedCore to 0.2.2

  • Lua to RED engine converter now works correctly with nil values and double.

  • Security issue where scripts could override another script's functions, calling another script is now read only.

  • IsBound and GetBind added to check if action is bound and retrieve string representation of it.
  • TweakDB experienced many changes:

    • All TweakDB functions can now be called with strings instead of TweakDBID. TweakDBID is still accepted.

    • TweakDB:SetFlat now updates records if it already exists (see SetFlatNoUpdate)

    • Performance improved.

  • Lua version changed to 5.1 this can break your mod if you were using post 5.1 language features such as bit operators. This change was done to fix environment issues, we also got a performance boost by switching to LuaJIT instead of the default Lua implementation.

  • Updated Imgui to version 1.82.

  • Updated spdlog to version 1.8.5.

  • Updated sqlite3 to version 3.35.0.

  • CloneRecord, CreateRecord and DeleteRecord.
  • GetRecords, obtain a list of records associated with a type.

  • SetFlatNoUpdate, faster way to set without checking if there is an old record to update. Requires call to TweakDB:Update afterwards to apply changes!

  • TweakDB editor in the UI.

  • Supports loading archivehashes.txt.

  • Can now search through record flats.

  • Crash when a malformed lua file was loaded with "require".

  • Lua execution error when a callback used a global variable because environments were not applied.

  • Fix memory leaks when reloading mods using Observe/Override.

  • Override(typeName, functionName, function) - both full and short names are set to functionName
  • Observe has now 2 overloads to simplify usage, this will not remove the original function but will add one if it doesn't exist:

    • Observe(typeName, fullFunctionName, shortFunctionName, function)

    • Observe(typeName, functionName, function) - both full and short names are set to functionName

  • require cache is reset on Reload all mods now
  • require does not support '.' instead of '/' now (only breaking change, functions the same otherwise)

  • All pathing is now relative to mod (breaking change, includes all io functions, dofile() and such included)

  • stripped ImGui, json, io and dofile and such from console sandbox (only needed things left for it in)

  • Added dir() command for mods to list directory contents

  • Errors that happen in Game, game class methods,... should now log into proper environment (to console when executed from console, to mod log when executed from mod)

  • optional in
    ImGui.Begin()
    ,
    ImGui.BeginModal()
    ,
    ImGui.BeginTabItem()
    , so the close button can be hidden when setting flags.
  • Added for the new tables widget in ImGui 1.8.0

  • selected mouse utilities back

  • Added bindings for

  • TweakDB:Update(...)

    You can now instantiate game objects with NewObject('class name'), do not expect this to work with every class without any issues
  • SQLite3 support was added, you can use the entire API at the moment, we are going to remove all open functions in the near future and replace it with a open that can only open a single database linked to your mod

  • Mods will now log to their own log files, you can also use spdlogto print in your log

  • Override('PlayerPuppet', 'SetWarningMessage', function(_, message, wrappedMethod)
        wrappedMethod('[Overridden] ' .. message)
    end)
    Override('PlayerPuppet', 'GetGunshotRange', function(_, originalRangeFunc)
        return originalRangeFunc() + originalRangeFunc()
    end)
    ObserveBefore('PlayerPuppet', 'GetGunshotRange', function()
        print('PlayerPuppet::GetGunshotRange::Before')
    end)
    ObserveAfter('PlayerPuppet', 'GetGunshotRange', function()
        print('PlayerPuppet::GetGunshotRange::After')
    end)
    Override('RPGManager', 'GetFloatItemQuality', function(value)
        print('RPGManager.GetFloatItemQuality(' .. value .. ')')
        return gamedataQuality.Legendary
    end)
    Observe('PlayerPuppet', 'IsSwimming;PlayerPuppet', function(player)
        print('PlayerPuppet.IsSwimming(player)')
    end)
    registerForEvent('onInit', function()
        Override('SpatialQueriesSystem', 'SyncRaycastByCollisionGroup', function(_, a1, a2, a3, a4, a5, a6, wrapped)
            -- Skip a4 here because it's an out param
            local success, result = wrapped(a1, a2, a3, a5, a6)
            print(success, GameDump(result))
    
            -- Return all results
            return success, result
        end)
    end)
    
    registerHotkey('SyncRaycastByCollisionGroup', 'SyncRaycastByCollisionGroup', function()
        local from, forward = Game.GetTargetingSystem():GetCrosshairData(GetPlayer())
        local to = Vector4.new(from.x + forward.x * 100, from.y + forward.y * 100, from.z + forward.z * 100, from.w)
    
        local success, result = Game.GetSpatialQueriesSystem():SyncRaycastByCollisionGroup(from, to, 'Static', false, false)
        print(success, GameDump(result))
    end)
    if not ModArchiveExists("my_mod.archive") then
        print("This mod requires my_mod.archive to be installed")
    end
    ToVariant(Vector4.new(1, 2, 3))
    ToVariant(gamedataQuality.Epic)
    ToVariant("Nam libero tempore")
    ToVariant(16570246047455160070ULL)
    ToVariant(true)
    ToVariant(TweakDBID("Items.money"))
    ToVariant(CName("deflect"))
    ToVariant(LocKey(12345))
    ToVariant(CRUID(1337))
    ToVariant(1, "Int32") -- Same numeric value can be a signed integer
    ToVariant(1, "Uint32") -- or unsigned integer
    ToVariant(1, "Float") -- or float
    ToVariant(nil, "handle:PlayerPuppet") -- Null requires a concrete type
    ToVariant({ "a", "b", "c" }) -- Auto resolved as "array:String"
    ToVariant({ 1, 2, 3 }, "array:Uint32") -- Ambiguous type
    registerForEvent('onTweak', function()
    	TweakDB:SetFlat('PreventionSystem.setup.totalEntitiesLimit', 20)
    end)
    Observe('PlayerPuppet', 'IsPlayer', function() print('Observer 1') end)
    Override('PlayerPuppet', 'IsPlayer', function() print('Override 1') end)
    Override('PlayerPuppet', 'IsPlayer', function() print('Override 2') end)
    Observe('PlayerPuppet', 'IsPlayer', function() print('Observer 2') end)
    Observer 1
    Observer 2
    Override 1
    print(CName("CET").value) -- Empty string
    CName.add("CET")
    print(CName("CET").value) -- CET
    -- Set reference to null
    self.resetConfirmationToken = nil
    -- Omit optional task data
    Game.GetDelaySystem():QueueTask(this, nil, "ResolveGameplayStateTask", gameScriptTaskExecutionStage.PostPhysics)
    print(EnumInt(GameplayTier.Tier2_StagedGameplay)) -- 2ULL
    local dialogLine = scnDialogLineData.new()
    dialogLine.id = CRUID(12345)
    TweakDB:SetFlat("Items.Preset_Overture_Kerry.displayName", LocKey(40475))
    print(TweakDBID("Items.money"))
    print(CName(0))
    print(CName("DEBUG"))
    print(GetPlayer()) -- Equivalent to print(Game.GetPlayer())
    registerForEvent('onInit', function()
        Observe('TimeSystem', 'SetTimeDilation', function(self, reason)
            if reason.value == 'consoleCommand' then
                Game.FloorF('XXX')
            end
        end)
    end)
    registerHotkey('TestError', 'TestError', function()
        Game.GetTimeSystem():SetTimeDilation('consoleCommand', 0.25, 1.0, 'Linear')
    end)
    [error] ...x64\plugins\cyber_engine_tweaks\mods\test-error\init.lua:4: Function 'FloorF' parameter 1 must be Float.
    stack traceback:
        [C]: in function 'FloorF'
        ...x64\plugins\cyber_engine_tweaks\mods\test-error\init.lua:4: in function <...x64\plugins\cyber_engine_tweaks\mods\test-error\init.lua:2>
        [C]: in function 'SetTimeDilation'
        ...x64\plugins\cyber_engine_tweaks\mods\test-error\init.lua:10: in function <...x64\plugins\cyber_engine_tweaks\mods\test-error\init.lua:9>
    spawnPosition = Game.GetPlayer():GetWorldTransform()
    
    -- [Simple]
    -- Spawn 'Character.Judy' just like prevention system
    -- Optionally set appearance to 'judy_diving_suit'
    judyEntityID = exEntitySpawner.SpawnRecord('Character.Judy', spawnPosition)
    judyEntityID = exEntitySpawner.SpawnRecord('Character.Judy', spawnPosition, 'judy_diving_suit')
    
    -- [Advanced]
    -- Spawn base\quest\secondary_characters\judy.ent
    -- Optionally set appearance to 'default'
    -- Optionally set TweakDB record to 'Character.Judy' (VO/Name/Equipment/etc)
    judyEntityID = exEntitySpawner.Spawn([[base\quest\secondary_characters\judy.ent]], spawnPosition)
    judyEntityID = exEntitySpawner.Spawn([[base\quest\secondary_characters\judy.ent]], spawnPosition, 'default')
    judyEntityID = exEntitySpawner.Spawn([[base\quest\secondary_characters\judy.ent]], spawnPosition, 'default', 'Character.Judy')
    
    -- Some time later...
    -- entities are not spawned instantly, FindEntityByID may return nil
    judy = Game.FindEntityByID(judyEntityID)
    
    exEntitySpawner.Despawn(judy)
    TweakDB:SetFlats('Character.Judy', {
      level = 99,
      tags = { 'Immortal' }
    });
    transform = Game.GetPlayer():GetWorldTransform()
    entityID = WorldFunctionalTests.SpawnEntity('base\\quest\\secondary_characters\\judy.ent', transform, '')
    entity = Game.FindEntityByID(entityID)
    WorldFunctionalTests.DespawnEntity(entity)
    Override("PlayerPuppet", "IsA", "IsA", true, function(self, className) print(className); return true end)

    1.19.5 - 05/04/2022

    1.19.4 - 22/03/2022

    1.19.3 - 02/03/2022

    Changes and fixes

    1.19.2 - 28/02/2022

    Added

    Changes and fixes

    1.19.1 - 19/02/2022

    Changes and fixes

    1.19.0 - 16/02/2022

    Changes and fixes

    1.19.0-rc2 - 16/02/2022

    Known issues

    Changes and fixes

    1.19.0-rc - 16/02/2022

    Known issues

    Changes and fixes

    1.18.3 - 10/02/2022

    Changes and fixes

    1.18.2 - 09/02/2022

    Changes and fixes

    1.18.1 - 15/12/2021

    Changes and fixes

    Added

    1.18.0 - 4/12/2021

    Changes and fixes

    Added

    1.17.0 - 2/10/2021

    Changes and fixes

    Added

    1.16.4 - 14/09/2021

    Changes and fixes

    1.16.3 - Don't remember when

    1.16.2 - 27/8/2021

    Changes and fixes

    1.16.1 - 23/8/2021

    Changes and fixes

    1.16.0 - 20/8/2021

    Changes and fixes

    1.15.0 - 8/8/2021

    Script API

    Changes and fixes

    1.14.0 - 17/06/2021

    Script API

    Changes and fixes

    Internals

    Added

    1.13.0 - 28/04/2021

    1.12.2 - 14/04/2021

    1.12.1 - 04/04/2021

    1.12.0 - 29/03/2021

    1.11.4 - 18/02/2021

    1.11.3 - 17/02/2021

    1.11.2 - 17/02/2021

    1.11.1 - 15/02/2021

    1.11.0 - 13/02/2021

    1.10.3 - 12/02/2021

    1.10.2 - 07/02/2021

    1.10.1 - 06/02/2021

    1.10 - 05/02/2021

    1.9.6 - 30/01/2021

    1.9.5 - 28/01/2021

    1.9.4 - 26/01/2021

    Changed

    Fixed

    1.9.2 - 23/01/2021

    Added

    1.9.1 - 23/01/2021

    Added

    Fixed

    Removed

    634
    635
    623
    625
    628
    629
    617
    618
    619
    620
    611
    603
    581
    582
    583
    585
    589
    568
    572
    573
    574
    575
    577
    578
    579
    551
    552
    553
    557
    558
    559
    496
    1.81
    #454
    #452
    #453
    #457
    #460
    #461
  • Install CET Mods?

    You can find additional guides on how to install mods in the users section of the Cyberpunk 2077 modding wiki, including:

    • A for first-time users

    ... add perk points, level up, add money...?

    ... create my own mod?

    You can find the api documentation under .

    ... do $thing in code?

    very detailed step-by-step guide here
    Useful Commands
    Useful commands
    CET scripting wiki page
    Cyber Engine Tweaks
    Snippets & Examples
    Language Reference
    Logs & Debug
    bindings
    Added
    ImDrawlist
    Add Native Settings
    nativedb.red4ext.com
    Hooks
    Observe, Override, NewProxy

    Bindings

    How to use Cyber Engine Tweaks Bindings

    Hotkeys

    The Hotkeys tab is where you manage all the hotkeys of the mods you installed.

    CET does not allow mods to define default hotkeys. Thus, every time you install a new mod, you need to bind a hotkey for it, if it requires one.

    • Binding hotkeys for a mod is the same as how you bind the hotkey for the CET Overlay.

    • You can unbind a hotkey by pressing the UNBIND button behind it.

    • To save the changes, press the Save button.

    • Undefined hotkeys appear in red text. Unsaved changes appear in yellow text.

    Uninstall

    How to remove Cyber Engine Tweaks

    Remove the following folders/files:

    • <cyberpunk install path>/bin/x64/plugins/

    • <cyberpunk install path>/bin/x64/global.ini

    • <cyberpunk install path>/bin/x64/LICENSE

    • <cyberpunk install path>/bin/x64/version.dll

    • Removing Cyber Engine Tweaks will not undo any edits made to your character and your save files.

    • If you have added items to your inventory, you will not be able to remove them once you have removed this mod. Please ensure you have done so using the first.

    • Saves made with the patch should be completely fine without it, thought that might change once proper mods start coming out

    Usage

    How to use the Cyber Engine Tweaks Overlay

    The Cyber Engine Tweaks Overlay is the interface that is used to display and set various settings, and configure mods hotkeys.

    Additionally, the most advanced mods will also display their own settings window in this overlay. It contains different tabs:

    Settings

    How to use Cyber Engine Tweaks Settings

    The Settings tab is where you change the Overlay open/close hotkey, and toggle the tweaks to Cyberpunk2077's game engine.

    See the following section for more information about the configuration file generated using this UI.

    Notes

    appropriate commands

  • Upon the installation of CET, the overlay will appear automatically when you launch the game. You need to assign a hotkey to it before you can move on:

    1. Press the Hotkey button next to the Overlay Key.

    2. Press a key or a key combination on your keyboard after the button becomes BINDING... to bind it.

    3. Now the hotkey has been bound, you can press that key anytime to open/close the Overlay.

    What is the Overlay?

    Console
    Bindings

    If you have encountered troubles when using a mod, please read this FAQ page:

    FAQ
    Bind/unbind hotkeys for mods

    Settings UI

    Note: The "Skip Start Menu", "Suppress Intro Movies", and "Fix MiniMap Flicker" mods shown in this image have been deprecated. See the following comment for more information:

    Generated Config file

    Config file

    How to open the Overlay?

    Settings
    TweakDB
    Game Log
    Asign a key for opening/closing the Overlay
    https://discord.com/channels/717692382849663036/795037292955172895/1332405506769158236

    Linux (Proton)

    Using Cyber Engine Tweaks on Linux

    For a step-by-step guide on installing the basic dependencies to make Cyberpunk run under Linux, see .

    This is a basic guide to using the mod within Proton (aka Linux).

    Please make sure your game works in proton first, before installing this mod.

    Enabling proton Experimental (Optional)

    While this isn't a required step, it's useful for performance.

    Right click the game in Steam and select 'Properties'. Go to the 'Compatibility' tab and tick 'Force the use of a specific Steam Play compatibility tool'.

    In the dropdown, select 'Proton Experimental'.

    Setting up the mod with ProtonTricks

    Please note - this method requires the use of Steam. For other options, see below.

    First, follow the steps to install the mod. These are in the wiki.

    Run protontricks 1091500 --gui, you may get an error saying "You are using a 64 bit WINEPREFIX", you can ignore this. Press 'Ok' when this error appears.

    Choose the option 'Select the default wineprefix', then 'Run winecfg'. In the window that opens, select the 'Libraries' tab. In the dropdown on 'New override for library', select version. Click Add, then Apply and Ok.

    You can now exit out of Protontricks and start your game. Check to see if the log exists after you run the game. If it's there, you've successfully installed the mod.

    If you have issues with the mod still not working or the game just crashing, you can try this: re-open Protontricks like you did before, choose the option 'Select the default wineprefix', then 'Install a Windows DLL or component'. Tick vcrun2022 and press Ok. If a window pops up, then go through the steps to install that runtime (just click next really), otherwise just wait until the Protontricks screen comes back. Now exit out of Protontricks and try launching the game. DON'T do this without first checking if the mod works without this step, since installing vcrun2022 has been observed breaking game installs before, preventing the game from ever launching again and requiring a re-install.

    NOTES: You will also need to install d3dcompiler_47 with winetricks to get it to work now, contribution on how to do this would be much appreciated!

    If vcrun2019 breaks your install, it's been reported it can be fixed without reinstalling by deleting the contents of/steamapps/compatdata/1091500.

    Please note, this method still requires the use of Steam. You must install Cyberpunk 2077 and then add it to your Steam library by following the .

    Search for the game APPID with: $ protontricks -s name_of_the_game_on_your_steam_lib

    like:

    $ protontricks -s Cyberpunk 2077

    copy the APPID from the terminal then run:

    $ protontricks "APPID" --gui

    From now on, you can follow the Setting up the mod with ProtonTricks instructions.

    For users running on the GOG version of the game, via launcher like , or , those running from the direct GOG Galaxy Windows application through Wine, or those directly using the Game libraries, Protontricks won´t be helpful in your case, as Protontricks will notice that you don´t have the game on Steam.

    Instead, use Winetricks in which Protontricks is derivated from. Please note that you may need to install first, either through the official website or through your distribution's app store.

    Lutris users may perform the following steps to activate the mod:

    Authenticate with GOG Galaxy by clicking on the small profile icon to the right of the GOG entry. You will then be presented with a list of your owned games. Select Cyberpunk and install it - this will install the base version of the game with no other options selected. You may right click on the game icon after installation and choose the option to install the Phantom Liberty DLC if desired. Once installation is complete, select Cyberpunk 2077 and click on the Winetricks 'wine flute' icon along the bottom of the Lutris window. In the expanded menu, select 'Winetricks'.

    Choose the option 'Select the default wineprefix', then 'Run winecfg'. In the window that opens, select the 'Libraries' tab. In the dropdown on 'New override for library', select version. Click Add, then Apply and Ok.

    Alternatively, you may run Winetricks in itself if you use your default prefix, or from your custom prefix via: WINEPREFIX=<Location of your WinePrefix directory> winetricks --gui via the terminal.

    From now on, you can follow the Setting up the mod with ProtonTricks instructions. If you want to verify in Winetricks has correctly taken in account your custom Wine directory, click on Browse files to see if it brings you to the designated folder.

    Game Log

    How to use the Cyber Engine Tweaks Game Log

    • This window shows any output done using Redscript's Log/LogChannel function, either coming from the games scripts themselves or from a Redscript mod.

    Game Log UI

    Writing Logs

    // my_script.reds
    LogChannel(n"DEBUG", "My Custom Log");

    Setting up the mod with proton as non-Steam Game

    Setting up the mod without Steam by using Winetricks

    Thanks to

    official instructions
    Lutris
    Minigalaxy
    GameHub
    Winetricks
    @bundyo
    @okamidash (Author)

    TweakDB Editor

    How to modify the TweakDB via CET

    Summary

    This page documents CET's in-game Tweak Editor.

    Wait, this is not what I want!

    • To learn what the TweakDB is, read the page on Cyberpunk 2077 Modding

    • For an introduction on TweakDB modding with CET, check the Simple Gameplay Mod guide

    • For further information, refer to the section on the scripting wiki

    After opening CET with the key that you bound during the , you can find it in the "TweakDB Editor" tab. Here you can browse and update the TweakDatabase in real time.

    Welcome

    Welcome to Cyber Engine Tweaks official Wiki!

    Cyber Engine Tweaks is a framework that allows modders to interact with the game's internal functions using Lua. It also provides a user-interface with a console and additional tools to assist developers.

    GETTING STARTED

    For information on how to install Cyber Engine Tweaks, check out the link below.

    💿Installation❔How do I _____?

    USAGE

    Learn how to use each Cyber Engine Tweaks tabs.

    MODDING

    Everything you need to know to create your own mod for Cyber Engine Tweaks.

    If you wish to contribute to the main repo, try to follow the coding style in the code, otherwise not much to say, don't use code that is not yours unless the license is compatible with MIT.

    Installation

    Guide to installing the Cyber Engine Tweaks into the game

    This page tells you how to install Cyber Engine Tweaks - or you can check the .

    1. Make sure Cyberpunk 2077 is updated to the latest version

    2. Make sure you installed the latest

    3. Make sure you run the game in Windowed Borderless

  • Ensure all apps overlays are disabled as the console may not open: Steam, Discord, GOG, Geforce Experience, Windows 10 Game Bar, Rivatuner, Fraps, Afterburner etc...

    1. Download the latest cet_x_xx_x.zip file. (Do not download the source code)

      • If using Windows, you should right click on the zip file, and check under Properties for a security notice saying "This file came from another computer and might be blocked to help protect this computer" - if that security notice is present, click the checkbox to unblock the contents of the zip file.

    2. You can now either

      • Unzip the download directly into your Cyberpunk 2077 game directory or

      • Unzip to anywhere on your desktop. After unzipping the file, you will see a bin folder.

        • Drag the bin folder to your Cyberpunk 2077 game directory

    3. If installed properly, the Cyber Engine Tweaks files will be in the <cyberpunk install path>/bin/x64 folder. As follow:

    When you first start the game, a window will appear prompting you to choose a keybind to bring up the Overlay. Pick any key and save it. It will open with that key from now on.

    • (Optional) To check that everything works you can look at the logs in <cyberpunk install path>/bin/x64/plugins/cyber_engine_tweaks/cyber_engine_tweaks.log

    • (Optional) When installing through Nexus Vortex, make sure to use hardlink deployment.

    Summary

    🔒 Prerequisites

    Microsoft Visual C++ Redistributable
    📺 Video Guide
    Cyberpunk 2077/
    ├─ bin/
    │  ├─ x64/
    │  │  ├─ global.ini
    │  │  ├─ LICENSE
    │  │  ├─ version.dll
    │  │  ├─ plugins/
    │  │  │  ├─ cyber_engine_tweaks.asi
    │  │  │  ├─ cyber_engine_tweaks/
    │  │  │  │  ├─ fonts/
    │  │  │  │  ├─ scripts/
    │  │  │  │  ├─ tweakdb/
    │  │  │  │  ├─ ThirdParty_LICENSES

    📋 Installation

    🎮 Launch the Game

    📺 Video Guide

    What's next?

    🚨Troubleshooting
    🐧Linux (Proton)
    ❔How do I _____?

    🖥️

    Overlay

    🎹

    Console

    🖱️

    Bindings

    🛠️

    Settings

    🗄️

    TweakDB Editor

    ⌛

    Game Log

    CONTRIBUTING

    📖

    Introduction

    🎯

    First Steps

    💎

    Resources

    📘

    CET Functions

    📒

    Game Functions

    ✏️

    Snippets & Examples

    What is the TweakDB editor?

    Note that changes you made in the editor do not persist across game restarts.

    installation
    TweakDB

    Upgrade Guide

    General Instructions

    Key notes on upgrading existing mod for the CET 1.14+:

    • Don't use Game object and any game types before onInit.

    • Don't use GetMod() before onInit.

    • Don't pass excessive params to game functions. If the max number of params is 3, then passing 4 params will result in an error.

    • Update Observe() / Override() handlers so they accept self as the first param. Previously, some observers lacked the self param:

    • If your mod stores player reference then unset it when game session ends.

      • An unreleased reference can lead to bugs such as disappearing footsteps.

      • Accessing Game.GetPlayer() in onUpdate will not cause the issue.

    • Use corresponding getters for game systems instead of GetSingleton(). For example, Game.GetTeleportationFacility() instead of GetSingleton('gameTeleportationFacility').

    New scripting capabilities were introduced in CET 1.14 to make it more convenient and simple:

    • All game classes are directly accessible by name. For example, entEntityId, PlayerPuppet.

    • All game enums are directly accessible by name. For example, gamedataStatType.BaseDamage, gameGameVersion.Current.

    All new scripting features are optional. You're not required to rewrite an existing mod using these features.

    The new API allows code that is also valid redscript or very close to its redscript counterpart. Thus, it simplifies the research and the transition to / from the redscript.

    For example, this line looks exactly the same in Lua and in the redscript:

    Constructing objects

    Old API:

    New API:

    Constructor with initialization

    Old API:

    New API:

    Scripted static call

    Old API:

    New API:

    Shorthand static call

    Old API:

    New API:

    Working with enums

    Old API:

    New API:

    Variants

    This can be achieved using next snippet or with GameSession / GameUI libs:

    Classes can also be accessed by their aliases from redscript. For example, WeaponObject instead of gameweaponObject.
  • Classes have the conventional .new() constructor. For example, MappinData.new().

  • A constructor can take an array of properties to create and initialize an object in a single statement. For example, EntityID.new({ hash = 12345 }).

  • Static methods are accessible from classes using the dot. For example, ScriptedPuppet.IsDefeated(npc).

  • A static method can be called from an instance if the first parameter is of the same type. For example, vec4:Length() instead of Vector4.Length(vec4).

  • The overloaded function is resolved based on passed parameters when called by its short name. For example, StatusEffectHelper.HasStatusEffect(target, gamedataStatusEffectType.Overheat).

  • Partial Variant type support. ToVariant() and FromVariant() are only applicable to classes.

  • New Script API

    Backward Compatibility

    Redscript Similarity

    Examples

    Observe("PlayerPuppet", "OnAction", function(self, action)
        -- First param self is required now
    end)
    Observe("QuestTrackerGameController", "OnUninitialize", function()
        if Game.GetPlayer() == nil then
            Mod.Player = nil -- var containing a reference to the player 
        end
    end)
    RPGManager.CreateStatModifier(gamedataStatType.BaseDamage, gameStatModifierType.Additive, 50)
    local mappinData = NewObject("gamemappinsMappinData")
    mappinData.mappinType = TweakDBID.new("Mappins.DefaultStaticMappin")
    mappinData.variant = Enum.new("gamedataMappinVariant", "FastTravelVariant")
    mappinData.visibleThroughWalls = true
    local mappinData = MappinData.new()
    mappinData.mappinType = "Mappins.DefaultStaticMappin"
    mappinData.variant = gamedataMappinVariant.FastTravelVariant
    mappinData.visibleThroughWalls = true
    function getStash()
        local stashId = NewObject("entEntityID")
        stashId.hash = 16570246047455160070ULL
    
        return Game.FindEntityByID(stashId)
    end
    function getStash()
        return Game.FindEntityByID(EntityID.new({ hash = 16570246047455160070ULL }))
    end
    Game["PreventionSystem::ShowMessage;GameInstanceStringFloat"]("Message", 5.0)
    PreventionSystem.ShowMessage("Message", 5.0)
    Observe("PlayerPuppet", "OnAction", function(action)
        -- Option 1 --
        print(GetSingleton("gameinputScriptListenerAction"):GetName(action))
        -- Option 2 --
        print(action:GetName(action))   
    end)
    Observe("PlayerPuppet", "OnAction", function(action)
        -- Option 1 --
        print(ListenerAction.GetName(action))
        -- Option 2 --
        print(action:GetName())   
    end)
    print(Enum.new('gameGameVersion', 'Current') == Enum.new('gameGameVersion', 'CP77_GoldMaster'))
    print(Enum.new('gameGameVersion', 'Current') == Enum.new('gameGameVersion', 'CP77_Patch_1_2_Hotfix2'))
    print(gameGameVersion.Current == gameGameVersion.CP77_GoldMaster)
    print(gameGameVersion.Current == gameGameVersion.CP77_Patch_1_2_Hotfix2)
    local message = SimpleScreenMessage.new()
    message.message = "Test"
    message.isShown = true
    
    local blackboardDefs = Game.GetAllBlackboardDefs()
    local blackboardUI = Game.GetBlackboardSystem():Get(blackboardDefs.UI_Notifications)
    blackboardUI:SetVariant(
        blackboardDefs.UI_Notifications.OnscreenMessage, 
        ToVariant(message), 
        true
    )

    Change font & language setting

    A guide on how to change the font and font size for Cyber Engine Tweaks and mods based on Cyber Engine Tweaks. And how to display non-English characters.

    Use a text editor to open the config file at <cet install path>/config.json to adjust the settings.

    In this page, we use this example JSON snippet to guide you through adjusting the settings:

    {
        // other lines
        "font": {
            "base_size": 16.0,
            "language": "Default",
            "oversample_horizontal": 3,
            "oversample_vertical": 1,
            "path": ""
        },
        // other lines
    }

    Change font

    Locate this line under the "font" curly brace:

    "path": ""

    Add the path of the font you want to change to between the double-quotes. For example, if you want to change the font to Comic Sans, just change this line into:

    Note: You should use slash (/) instead of backslash (\) for the path.

    Some mods may have implemented multilingual support. But the non-English characters will display as a question mark "?". This is because the default font only contains .

    To display a language that only uses ASCII characters (such as French, German), all you need to do is to change the font to one with a wider range (Literally any font).

    To display a language that uses non-ASCII characters (such as Chinese, Russian), besides changing the font, you also need to change this line in the config file under the "font" curly brace:

    Here is a table of the "language" options and their descriptions.

    options
    Descriptions

    For example, to display Chinese all you need to do is:

    The result (using the Sim Hei / 黑体 font):

    "path": "C:/Windows/Fonts/comic.ttf"
    "language": "",

    Cyrillic

    Supports languages that use (e.g. Russian, Bulgarian..)

    ChineseFull

    Supports traditional Chinese, simplified Chinese, and Japanese display

    {
        // other lines
        "font": {
            "base_size": 16.0,
            "language": "ChineseFull",
            "oversample_horizontal": 3,
            "oversample_vertical": 1,
            "path": "C:/Windows/Fonts/simhei.ttf"
        },
        // other lines
    }

    How to display non-English characters

    ASCII printable characters

    ChineseSimplifiedCommon

    Only supports simplified Chinese display

    Japanese

    Only supports Japanese display

    Korean

    For Korean

    Thai

    For Thai

    Vietnamese

    For Vietnamese

    Cyrillic scripts

    Config file

    Description of all the configuration variables available

    The config file is generated automatically and manual edits are not recommended. To modify configurations, use the in the CET overlay.

    For adjustments to fonts and other stuffs not available in the CET overlay, manual editing may be considered.

    The config file can be found in: <cet install path>/config.json

    The config file is structured with two JSON layers, we use the format <first level>.<second level> to represent the key.

    Consider the example JSON snippet below, the key for the base size of the font is noted as font.base_size, which carries a value of 16.0.

    KEY
    TYPE
    DEFAULT
    DESCRIPTION
    KEY
    TYPE
    DEFAULT
    DESCRIPTION
    KEY
    TYPE
    DEFAULT
    DESCRIPTION

    These are the 0old Cyber Engine Tweaks config file patches for reference.

    ARGUMENT
    VALUE
    DEFAULT
    DESCRIPTION

    A guide on how to change the font and font size for Cyber Engine Tweaks and mods based on Cyber Engine Tweaks. And how to display non-English characters.

    {
        // other lines
        "font": {
            "base_size": 16.0,
            "language": "Default",
            "oversample_horizontal": 3,
            "oversample_vertical": 1,
            "path": ""
        },
        // other lines
    }

    developer.dump_game_options

    boolean

    false

    font.base_size

    number

    18.0

    patches.disable_antialiasing

    boolean

    false

    disable_antialiasing

    bool

    Developer

    Font

    Patches

    Deprecated Patches

    Change font & language setting

    Change font & language setting
    Settings tab

    If true, CET will dump all options and their default values in the log file.

    developer.enable_imgui_assertions

    boolean

    false

    WIP

    developer.max_lines_console_history

    number

    1000

    CET stores a history of console commands, allowing users to easily access previous commands by pressing the up arrow key. This setting determines the number of commands that CET retains in its history.

    developer.persistent_console

    boolean

    true

    When true, CET saves your console command history on your disk, so you can access it in future. When false, the history is only kept in memory while the game is running and disappears once you exit the game.

    developer.remove_dead_bindings

    boolean

    true

    WIP

    Set the font size of the overlay and mods.

    font.language

    string

    "Default"

    Check for details.

    font.oversample_horizontal

    number

    3

    WIP

    font.oversample_vertical

    number

    1

    WIP

    font.path

    string

    ""

    (empty)

    Check for details.

    Setting this to true will disable antialiasing (TAA), which can increase performance on older hardware but looks horrible.

    patches.disable_async_compute

    boolean

    false

    Setting this to true will disable async compute, which can increase performance on older hardware.

    patches.disable_boundary_teleport

    boolean

    false

    Remove the teleport caused by going beyond the boundary in the game.

    patches.disable_vignette

    boolean

    false

    Disable the vignette effect while crouching.

    patches.disable_win7_vsync

    boolean

    false

    Disable V-sync for Windows7

    false

    Setting this to true will disable antialiasing (TAA), which can increase performance on older hardware but looks horrible.

    disable_async_compute

    bool

    false

    Setting this to true will disable async compute, which can increase performance on older hardware.

    disable_boundary_teleport

    bool

    false

    Remove the teleport caused by going beyond the boundary in the game.

    disable_intro_movies

    bool

    true

    Disable the first movies that play at each launch.

    disable_vignette

    bool

    false

    Disable the vignette effect while crouching.

    disable_win7_vsync

    bool

    false

    Disable V-sync for Windows7

    dump_game_options

    bool

    false

    Will dump all options and their default values in the log file.

    enable_debug

    bool

    false

    Unlocks the debug menu, use at your own risk!

    font_glyph_ranges

    string

    Check for details.

    font_path

    string

    Check for details.

    font_size

    integer

    13

    Set the font size of the overlay and mods.

    overlay_key

    integer

    Key to open the console.

    remove_pedestrians

    bool

    false

    Removes most of the pedestrians and traffic from the game. Be careful using this, a save made with this activated will NEVER have pedestrians/traffic anymore!

    skip_start_menu

    bool

    true

    Skips the menu asking you to press the space bar to continue (Breaching...)

    patches.disable_intro_movies

    boolean

    false

    Disable the first movies that play at each launch.

    patches.skip_start_menu

    boolean

    false

    Skips the menu asking you to press the space bar to continue (Breaching...)

    patches.minimap_flicke

    boolean

    false

    f you're experiencing flicker with the minimap in the top-right corner of the game, set true. Only change this setting if you are indeed noticing the flicker issue.

    here
    here
    here
    here
    here
    yellow wiki
    very detailed step-by-step guide
    General instructions what goes where
    here
    TweakDB
    game directory
    game directory
    Troubleshooting