arrow-left

All pages
gitbookPowered by GitBook
1 of 1

Loading...

New Iconic Weapon: Step by Step

hashtag
Summary

Published: December 2023 by destinybu Last documented edit: Feb 07 2024 by

We'll be making a fully featured new Iconic weapon in this guide, which is designed for first-timers and goes into details into every aspect about weapon modding. (not appearances)

hashtag
Wait, this is not what I want!

  • You can find other guides about this topic under and

  • For an overview of weapon properties, check

  • For an overview of weapon audio profiles, check

hashtag
Prerequisites

Before beginning, ensure you have the following software installed and properly set up:

  1. WolvenKit (8.12+) -

  2. MLSB (MultiLayerSetupBuilder 1.6.7+) -

  3. A text editor: or, if you want to get fancy,

If you are stuck, refer to the at the end of the page.

hashtag
Step 1: Create a New Project in WolvenKit

Each Iconic weapon is a variant of a base weapon, with an hidden (from the player) mod. This "hidden" mod contains a statModifiers array (to list all the stat changes this Iconic will have from the base weapon) and an OnAttach array. The OnAttach array is where you'll want a GameplayLogicPackage to go. You may or may not need to define conditional effectors in there, but if you want your weapon to have the customary Iconic yellow description then be aware that there is where it's written (in the UIData of the GameplayLogicPackage).

hashtag
Step 0: Understanding the structure

The rest of this guide will hold your hand through a deep dive, step-by-step, of your first custom Iconic made from zero. If you get lost through it, or if you'd rather find your own flow, you'll be well served by returning to check the code of an Iconic weapon already in the game (as you'll be building up from a base weapon in the same way, and it's solid footing).

RedMod tweak files are much more legible than a "TweakXL override" from WolvenKit for this, as each step there inherits redundant stuff passively and won't clutter your screen. Plus you'll see inlines content directly without having to track down flats. Just use something to search the insides of the files for the definitions (VS can, or some free tools like )

hashtag
Step 1: Create a New Project in WolvenKit

  1. WolvenKit (8.12+):

  2. MLSB (MultiLayerSetupBuilder 1.6.7+): Installation & Setup Guide

  3. Text Editor: or

hashtag
Step 1: Create a New Project in WolvenKit

Open WolvenKit and create a new project. This will be the foundation for your new iconic weapon mod.

hashtag
Step 2: Choose the Base Weapon

Decide on the weapon you want to modify to make a new new iconic.

hashtag
Step 2: Choose the Base Weapon

Select a base weapon for your iconic weapon. For this tutorial, we'll use 'Unity' with item ID Items.Preset_Unity_Default.

circle-info

For this tutorial, we will use the gun 'Unity' as our base (Items.Preset_Unity_Default). If you want to use a different weapon, you can refer to or find a list of all in-game items .

To understand how the base gun works, open the in WolvenKit and search for Items.Preset_Unity_Default.

hashtag
Step 3: Create a TweakXL Override

In the tweak browser, find Items.Preset_Unity_Default, right-click it, and select "Add TweakXL Override". This step is crucial for customizing the weapon.

circle-info

To read more about Tweak modding, check . This isn't necessary for understanding this guide!

hashtag
Step 3: Editing and understanding your new tweak

circle-exclamation

Before you start with this section, make sure to read the block below!

.yaml files use indentation (the number of spaces at the beginning of a line) to organize entries in groups. This is easy to break!

If you run into problems, you can check your file on . If that doesn't help, see if red4ext/plugins/TweakXL/TweakXL.log has any hits for your mod.


Open the overridden tweak file in a code editor of your choice (such as or VS Code). You will be presented with a .yaml file containing roughly a million fields.

hashtag
Step 4: Open the Overridden Tweak

Open the overridden tweak file in a code editor like Notepad++ or VS Code. You'll see a .yaml file with various fields.

hashtag
How does it work?

circle-info

For first time modders, understanding all this in one go will be difficult. You can just keep these explanations handy and revisit them when required.

The .yaml file may seem complex at first glance, but the actual structure is extremely simple. Your weapon has properties – those stand on the left side of the :, such as ammo. The properties have different values, and those stand on the right side of the :, such as Ammo.RifleAmmo. Note: For first time modders, understanding all this in one go will be difficult, so keep these explanations handy and revisit them as and when required)

hashtag
Step 5: Understand the .yaml File

The .yaml file might seem complex. Here's a breakdown of key fields from another weapon tweak (Items.Preset_Sidewinder_Default). Keep these explanations handy for reference. (Thanks to BuffMcMuff)

chevron-rightAn annotated examplehashtag

Here's a breakdown of key fields in a different weapon (Items.Preset_Sidewinder_Default) : (Thanks to BuffMcMuff)

hashtag
Step 4: Making a new weapon

hashtag
4.1: New weapon, same as the old weapon

Making a new weapon is fairly simple. In your tweak file, change the Item ID in the very first line to "Items.Hand_Of_Midas" and save (Hotkey: Ctrl+S).

hashtag
Step 6: Create a New Weapon

Change the item ID at the top of your .yaml file from Items.Preset_Unity_Default to Items.Hand_Of_Midas. Save the file to create your new weapon.

That's it, you've created a new weapon now. This weapon will look & behave exactly like the Unity handgun, but trust me, it's new. To test it out, boot up your game and load any save.

At this stage your tweak file exists only in your mod's project folder. It can't do anything in game from there, so you will need to use the "Install" button to install your tweak file to the game directory. Then you can test it.

To test it out, boot up your game and load any save.

Now open up the CET :

Type in the command below and hit Enter.

You can now see your newly created weapon in your inventory.

Unfortunately, there is no way to tell it apart from the Unity handgun.

We'll get to fixing that, but first, a little cleanup: open up your WolvenKit & rename your overridden tweak file to "hand_of_midas.yaml". We will store all the edits that need to be done to our new weapon in this file.

hashtag
4.2: Changing the carbon copy

Let's change something that will differentiate our weapon from the default Unity.

To do this, open your renamed tweak file & find the crosshair tag (hotkey: Ctrl+F). Replace it as shown below, and save your file.

Now hot reload your game (Insert how to link here) or close it, reinstall your mod in WolvenKit & relaunch your game (From here on, this will be referred to as hot reload).

Spawn in both the Unity & Hand of Midas using the CET console:

You should now be able to see that both the Unity & Hand Of Midas, although otherwise identical, now have different crosshairs.

hashtag
How did we figure out the crosshair ID?

How do we know that it's called "Crosshairs.Tech_Round" ?

hashtag
Method 1: The REDmod DLC

If you have the REDmod DLC installed, you can use a text editor like Notepad++ to do a full-text search under Cyberpunk 2077/tools/REDmod. By searching for crosshair:, you can find all value assignments in the game files.

hashtag
Method 2: The

By searching for "Crosshairs." in the Tweak Browser. Most things we find inside the weapon tweak will be searchable within the Tweak Browser, and some within the Asset Browser.

Editing the Tweak will allow us to modify all of our gun's behaviors, and I encourage you to play around with these.

hashtag
Step 5: Removing redundant code

We're only changing a single property in the Hand of Midas. For that, we have a tweak file with more than 200 lines of code. Can't we do this in a better way?

We can, and we should!

circle-exclamation

In later steps of this guide, you'll need to look up properties. Either keep a copy of your full tweak file (e.g. on your desktop), or refer to above.

hashtag
Using $base instead of $type

As shown above, when using $type to define a tweak, we need to add all the required properties for the type, but when using $base to define one, we only need to add the properties we are changing, the rest are taken from the parent.

Now go ahead and change it so we use a $base & only define the crosshair. Your entire tweak should now look like this:

hashtag
Step 6: The personal touch

What good is a new gun without a new name? We need to tell our game about these.

  1. Open your WolvenKit project and navigate to the archive folder

  2. Create a new folder named after your mod, for example midas_collection

  3. Within this folder, make a subfolder named localization

hashtag
How does the game assign display names?

In your full tweak file, search for the field called displayName. You'll likely encounter something like displayName: LocKey#49794.

This connects the displayName property of your item with a locaization key, which is the mechanism that the game uses to support multiple languages. Think of the LocKey of a list entry, with different lists being used for different languages.

circle-info

If you want to take a look at these lists, use WolvenKit's or for onscreens.json.

hashtag
So we edit onscreens.json?

Good thinking, but no. In Cyberpunk, only one mod can edit any given file. That is why exists, and we'll use it to create a new translation entry for us.

Place a dedicated file in your midas_collection\localization folder. This is where we'll add our own translation entries – after that, we only need to tell ArchiveXL about the file and lean back.

hashtag
Setting up a localizationKey

Open the file in Wolvenkit and create a new entry in localizationPersistenceOnScreenEntry. It has the following properties:

Property name
your value
explanation
circle-exclamation

secondaryKeys must be globally unique, or they will overwrite each other.

Create another entry with the secondaryKey of MC_gun_description and write a little fluff text for the description.

circle-info

For more detailed guidance on these properties, check out the .

hashtag
Tell ArchiveXL about our new translation file.

In your WolvenKit project, go to the resources folder and create a plain text file with the following contents:

Rename this file to midas_collection.archive.xl.

circle-info

Wolvenkit will move the .xl file to the same directory as your mod's .archive file, where ArchiveXL will see and process it.

Next, revisit your "hand_of_midas" tweak file to establish the weapon's name and description in the game.

Add the following lines under the existing properties:

circle-exclamation

This localizedDescription: is not the yellow text you see on the weapon, but the red-colored description that is shown in the Inspect screen. The text that is shown (as yellow-colored) on the weapon is instead defined in the UIData of the Iconic Mod (at Step 12)

These lines set the display name and the description of your weapon using the keys defined in your localization file. The values on the right side of the : must match the secondaryKey values from your en-us.json file and be globally unique.

After completing these steps, install your mod and launch the game. Your new weapon, "Hand Of Midas", should now appear with its unique name and description, fully integrated into Cyberpunk 2077's multi-language environment.

hashtag
Step 7: Make it Iconic

To elevate the 'Hand of Midas' to its iconic status, we need to modify the .yaml again, where we set all of the gun's unique features:

The new things you're seeing are arrays, which is a technical term — you can think of them as lists, since they can hold multiple items.

circle-info

You can read more about how array operations work in .

statModifiers will hold all the stats for your gun. from recoil to damage. Since the $base: Items.Preset_Unity_Default already defines statModifiers, and we'd like to keep those. So we're adding an entry to the list, using!append-once followed by the new entry Quality.IconicItem.

This makes the weapon iconic, which means:

  • it has a fancy golden background

  • there's a dialogue box when you disassemble it

To prevent it from being disassembled, we also add IconicWeapon to its tags array.

hashtag
Go test

Once these modifications are in place, install your mod and enjoy the newfound Iconic status of the 'Hand of Midas' in the game.

Technically, you've already made a new Iconic weapon & I should call quits on this tutorial, but it's never as easy as that, is it? Give yourself a pat on the back & onto the next step.

hashtag
Step 8: Finishing up the Tweak

There are a lot of values to play around with in a tweak file. You are often better off leaving most of them alone. These are some properties you probably should look at when designing a gun.

  1. Blueprint (mandatory change for iconic weapons)

  2. Item Quality (optional)

  3. Buy & Sell Price (optional) (fixed value example)

hashtag
Step 9: Making an Iconic Mod (Special Ability & Stats)

The main thing that makes an iconic weapon so special is its iconic mod. These are like any other weapon mod, but hidden from the UI. They carry the Stat changes from the base model of the weapon, the golden text description on the UI Tooltip and any dedicated Effectors.

Before you start hacking up your own, it is very important you have a look at the existing Iconic Mods in game.

For now, let's look at Items.Preset_Lexington_Wilson (also known as "Dying Night").

circle-info

A big part of tweak modding is exploration — poking through tweaks until you find just the right thing to copy or change, or looking for something specific in hundreds of files.

hashtag
Wilson's iconic iron

circle-info

The example (together with instructions on finding your way around the TweakDB) has moved to ->

We'll end up with WilsonWeaponMod (slotted on the weapon) and WilsonWeaponModAbility (GameplayLogicPackage of the previous)

chevron-righticonic_mods.tweakhashtag
chevron-rightmods_abilities.tweakhashtag

For an explanation of what these do, please see ->

hashtag
Adding an iconic mod

We have found the iconic mod of Wilson's gun, so now let's see that we apply the same structure to the Hand of Midas.

Since our weapon demands perfection, we'll punish the player for not hitting headshots & reward them for hitting headshots. And because we want to make it hurt, we'll use HP reduction & Healing rewards.

circle-info

You can add the tweaks below to your weapon's yaml file or create a new one.

Will make it so the weapon has this iconic mod slotted in the appropriate modslot, on weapon acquisition.

hashtag
Defining the mod

This is the stage where we define how the stats of this weapon will differ from its base variant, plus add a reference to the "mod ability" record that holds the gold description and any desired Effectors

circle-check

You can find an overview of existing weapon stats under

circle-info

StatModifiers will stack with all other StatModifiers present on the weapon

hashtag
Defining the ability

In this section, we first define our special ability Items.Cranial_Cashback:

The ability contains

  • two , which we are yet to implement

  • the description for our iconic ability as a localizedDescription

Let's start by registering the description.

  1. Open the .json file that you've created when

  2. Add another entry (you can duplicate an existing entry)

  3. Set the secondaryKey to the value in your tweak file,

Now that we have an ability, we need to register it as a mod:

Everything hangs together now, let's see if it works.

chevron-rightFull mod addinghashtag

hashtag
Go test

Install your mod — if your gun shows the yellow iconic description on hover, you're good to go. If not, you may have to respawn it via CET.

hashtag
Designing effectors

Now that we have , we'll fill in the two , one to punish the player for missing, and the other to reward them for headshots.

hashtag
Heal on headshot

We'll heal for 80 HP every time the player pops somebody else's skull with the Hand of Midas. How do we do that?

Let's do what Edison did — we find something to be inspired by. A search for effector in the finds an awful lot of entries, so I've picked an example for us — a Netrunner item that restores memory:

The player's health is also a statPool item, it's called BaseStatPools.Health. We can copy this example and change it to meet our needs (for the final result, see ):

However, the prerequisite for this effector is Items.MemoryReplenishmentEffector_inline0, which doesn't sound helpful.

We could now try to find an existing preReq that checks for headshots, but we can also write our own.

hashtag
Creating a custom prereq

Now we have a custom preqrequisite, but we still have to fine-tune and link it:

hashtag
Creating a custom condition

circle-info

For more information on this, check ->

Conditions are at the heart of a prerequisite, and here we have four.

  1. Perks.IsHitTargetAlive_inline2 -> We don't want headshots on deadbodies to heal the player

  2. Perks.HitIsBodyPartHead_inline0 -> Actual condition to check for headshots

  3. Prereqs.Is_Attack_Ranged

hashtag
The final effector

Now let's change our effector to use this prerequisite.

Instead of punishing the player for just missing headshots, we can make our job easier by removing the HP every time they shoot, and compensating for the reduction in HP when hitting headshots by increasing our heal. Here's how we can do that:

hashtag
Test it!

Uncomment the effector in your weapon tweak and test your mod. You should now be healing every time you hit headshots.

chevron-rightThe full tweak filehashtag

hashtag
Bonus: Audio - Gun Go Boom

Firing sounds of guns are dictated by the value of their audioName flat. Swapping them to those of another gun is as easy as changing that value.

circle-check

For a list of soundsets already in the game, refer to

triangle-exclamation

Beware that firing sounds are, natively, separately set for each firing mode.

Meaning, for example, giving the audioName of a weapon that usually fires as Burst to a weapon that doesn't could result in missing sounds (or the other way around).

Having installed passively fixes this problem in the background, allowing for correct sounds on all firemode combinations. (refer to its own if interested about how to customize firemodes and attack types)

hashtag
Adding custom sounds

We can add custom sounds using RedMod but, due to how that works (as a replacer), we could end up influencing other guns and/or generating conflicts.

hashtag
Summary: The iconic weapon in action

Here's a demo for how iconic weapon should behave.

You are now a certified weapon modder. Pat your self on the back twice, you've done it. A special request from me (@DestinyBu). If you found this guide helpful, go ahead and document your own findings on the Wiki and maybe ping me if you ever get around to finishing your Mod. A big thanks to for (inspiring) forcing me to do this.

hashtag
Troubleshooting (Check this when you're stuck)

You've created/modified a tweak but it doesn't show effect in game, what next?

  • Open the CET Console in game search for your Tweak in the . If your tweak doesn't show, there's a validation error in the tweak.

  • Validate your .yaml tweaks to check for errors.

  • Open Cyberpunk 2077\red4ext\plugins\TweakXL\TweakXL.log

Cyberpunk 2077 - 😑

  • Core mods: ArchiveXLarrow-up-right, TweakXLarrow-up-right, Red4Extarrow-up-right

  • Optional: RedHotToolsarrow-up-right, RedMod

  • Cyberpunk 2077

  • Core Mods: ArchiveXLarrow-up-right, TweakXLarrow-up-right, Red4Extarrow-up-right

  • Optional: RedHotToolsarrow-up-right

  • MC_gun_iconic_description
  • Set femaleVariant to your text — this will be showin on the tooltip in yellow.

  • . Make sure that it has the correct secondary key , and enter your fluff text as femaleVariant.

  • -> (Custom) We don't want quick melee attacks to heal
  • Prereqs.Is_Weapon_Ranged -> (Custom) We don't want grenades to be counted for this check.

  • and look for any error messages
    towards the end, this can help when TweakXL has issues loading a tweak.
  • Check for other mods with same Tweak/Archive names.

    Tweak Folder - Cyberpunk 2077\r6\tweaks

    Archive Folder - Cyberpunk 2077\archive\pc\mod

  • Look at WolvenKit logs located towards the bottom. Yellow or Red text means there's warnings/errors in your file that need addressing.

  • femaleVariant

    Hand Of Midas

    the default translationse

    maleVariant

    only set this if you want to show a different translation when your item is equipped by a person of the male body gender

    primaryKey

    0

    The actual entry in the translation list, make sure to set this to 0 so that it's autogenerated

    secondaryKey

    MC_gun_name

    ItemAdditions: Weapons
    Standalone Weapon Appearance
    Cheat Sheet: Weapon BaseStats
    Cheat Sheet: Weapon Audio
    Installed & Setup
    Notepad++arrow-up-right
    Agent Ransackarrow-up-right
    Notepad++arrow-up-right
    Spawn Codes (BaseIDs/Hashes)
    herearrow-up-right
    TweakDB: Game database
    yamllint.comarrow-up-right
    Notepad++arrow-up-right
    ArchiveXL
    en-us.jsonarrow-up-right
    ArchiveXL Wikiarrow-up-right
    TweakXLarrow-up-right
    Browsing the tweak database
    Types of tweak records
    Cheat Sheet: Weapon BaseStats
    effectors
    effectors
    Types of tweak records
    Cheat Sheet: Weapon Audio
    Trigger Mode Controlarrow-up-right
    documentationarrow-up-right
    here arrow-up-right
    $base: Items.IconicWeaponModAbilityBase == $type: GameplayLogicPackage
    Create a new WolvenKit project as shown here
    A clean project should look like this (as of Wolvenkit 8.12, your interface may look different)
    Open the & search "Items.Preset_Unity_Default"
    Red arrow = Tweak Name, where you can override it. Blue Box= Details about selected tweak. White arrow = Overridden (New) Tweak
    "Items.Preset_Unit
    Red arrow = Open CET Console. Green arrow = Command to spawn in the newly created gun
    Your newly created weapon is now in game.
    Default Unity crosshair
    Hand of Midas crosshair
    List of crosshairs obtained with a Tweak Browser search
    mod name folder & localization folder
    LocKey Browser search for LocKey#49794
    Red arrow = localization json added correctly. Green arrow = add new element in the json. Yellow arrow = key fields in new entry
    Name & Description of the gun are now taken from "en-us.json" that we've created
    Setting "Quality.IconicItem" will give it a special background in the inventory & also specify that the item is Iconic.
    Iconic description is visible when hovering over gun
    An explanation for how audio works internally, should you decide to go the RedMod route.
    Heal on headshot demo
    Damage player on miss demo
    Troubleshooting (Check this when you're stuck)
    An annotated example
    Setting up a localizationKey
    New Iconic Weapon: Step by Step
    The final effector

    The key used in tweak files to identify this translation string

    Items.Preset_Sidewinder_Default: # item "code" for your weapon. use this when giving item.
      $type: gamedataWeaponItem_Record # the type of record. (records need to be defined with either a $type or a $base)
      ammo: Ammo.RifleAmmo # ammo type used (Fun Fact: Dex's Gun has ammo type - Items.Money)
      baseEmptyReloadTime: 1.54999995 # base reload time when mag empty NOTE: DO NOT EDIT RELOAD SPEED HERE see statModifierGroups: Items.Base_Sidewinder_Handling_Stats
      baseReloadTime: 1.54999995 # base reload time when mag is not empty NOTE: DO NOT EDIT RELOAD SPEED HERE see statModifierGroups: Items.Base_Sidewinder_Handling_Stats
      damageType: DamageTypes.Physical # damage type
      effectiveRangeFalloffCurve: StandardFalloff # damage fall of curve
      evolution: WeaponEvolution.Smart # what type of weapon none, power, tech and smart for ranged weps
      forcedMinHitReaction: -1
      fxPackage: WeaponFxPackage.SmartRifle # visual effects used for bullets. trail, bullet hole, impact, etc
      fxPackageQuickMelee: WeaponFxPackage.QuickMeleeFxPackage
      hudIcon: HUDWeaponIcons.Sidewinder # hud icon used
      IsIKEnabled: False # are inverse kinematics enabled.
      manufacturer: WeaponManufacturer.Corporation # weapon manufacturer type. not sure if used ingame.
      primaryTriggerMode: TriggerMode.FullAuto # trigger mode when hip firing and aiming if secondaryTriggerMode is not set.
      projectileEaseOutCurveName: ProjectileEaseOut
      rangedAttacks: Attacks.SmartBulletLowPackage # what type of bullet to fire. explosive, smart, projectile, standard hitscan, etc
      triggerEffectName: te_wea_aim_mid
      uninterruptibleEmptyReloadStart: 0.5 # point after which reload cannot be cancelled by other animations such as running. with empty mag
      uninterruptibleReloadStart: 0.5 # point after which reload cannot be cancelled by other animations such as running. with non empty mag
      useForcedTBHZOffset: False # Time before hit offset? used by npc
      UseShootVFXOnlyOnFirstShot: False # if bullet vfx is used again when firing in non semi-auto
      animFeatureName: WeaponData
      animName: ui_garment_pose
      animSetResource: ''
      appearanceResourceName: Preset_Sidewinder_Default # used to set .app file used by weapon
      audioName: wea_set_sidewinder # used to set weapon sounds not related to reloading and and first equip anim.
      blueprint: Items.Base_Smart_AR_SMG_LMG_NoAttachments_Blueprint # "blueprint" used to create the gun. different versions for guns with no barrel or scope attachments. also generic ones for iconics
      crosshair: Crosshairs.SmartGun # what crosshairs to use
      deprecated: False # TODO. used with items from before v2.0?
      dropObject: defaultItemDrop
      enableNpcRPGData: True # if npc should use npcRPGData found below
      entityName: weapon_root
      equipArea: EquipmentArea.Weapon # equip area. see equipment.EX
      friendlyName: w_rifle_assault_nokota_sidewinder # used to set player arm animations in first person see player_ma_fpp.ent and player_wa_fpp.ent. reload and first equip sounds are set in .anims files also. see weapon anim files beginning with pwa_ and pma_
      garmentOffset: 0
      icon: UIIcon.ItemIcon # Used when setting inventory icon
      iconPath: '' # Used when setting inventory icon
      isCached: False
      isCoreCW: False
      isCustomizable: False
      isGarment: False
      isPart: False # this is set to true in weapon parts such as scopes
      isSingleInstance: False
      itemCategory: ItemCategory.Weapon # item category used for inventory
      itemSecondaryAction: ItemAction.Equip # second action shown when looking at weapon on the ground for example.
      itemType: ItemType.Wea_Rifle # what type of item. used in inventory and perks i think? maybe affects animations?
      localizedName: '' 
      mass: 20 # weight of weapon.
      minigameInstance: minigame_v2.DefaultItemMinigame
      npcRPGData: Items.Base_Sidewinder_inline1 # stats used when the weapon is equipped by an NPC
      parentAttachmentType: ParentAttachmentType.Slot # used for weapon attachments such as scopes and muzzles
      powerLevelDeterminedByParent: False # TODO. not used since 2.0?
      quality: Quality.Random # default quality for weapon. CET ignores Quality.Random and always gives normal. Other quality settings work fine in CET and random works normally when found normally ingame.
      qualityRestrictedByParent: False
      replicateWhenNotActive: False
      stateMachineName: Weapon # used by game logic.
      upgradeCostMult: 1
      useHeadgearGarmentAggregator: False # TODO. probably not used by weapons?
      useNewSpawnMethod: False
      usesVariants: False
      savable: False
      attacks: # used to set different types of projectiles that can be shot by the gun. not used in 2.0?
        - Attacks.Bullet_GameEffect
           ...
        - Attacks.ChimeraPowerMod_ExplosiveBulletEffect
      gameplayDescription: LocKey(92674) # used to set the description when inspecting weapon.
      ikOffset: {x: 0, y: 0, z: 0}
      shootingPatternPackages: [] # used by npc
      triggerModes: # trigger modes available to weapon. should have primary and secondary trigger modes here also
        - TriggerMode.FullAuto
      animationParameters: []
      appearanceSuffixes: [] 
      appearanceSuffixesOwnerOverride: []
      attachmentSlots: [] # TODO. used by attachments such as scopes and muzzles
      buyPrice: # price multipliers used when buying weapon.
        - Price.BaseWeaponPrice
        - Price.ItemQualityMultiplier
        - Price.PlusTierMultiplier
        - Price.BrokenItemPriceMult
        - Price.IconicMultiplier
        - Price.BuyPrice_StreetCred_Discount
        - Price.AssaultRifleMultiplier
        - Price.SmartWeapon
      cameraForward: {x: 0, y: 0, z: 0}
      cameraUp: {x: 0, y: 0, z: 0}
      connections: []
      displayName: LocKey(3599) # name of weapon
      equipAreas: []
      equipPrereqs: [] # TODO. used by game logic packages(GLP)?
      gameplayRestrictions: # restrict weapon usage in certain situations.
        - GameplayRestriction.VehicleCombatNoInterruptions
      hairSkinnedMeshComponents: []
      localizedDescription: LocKey(3600) # white text description when hovering over an item.
      OnAttach: # used to apply effects to player and weapon whean equipping weapon. stamina regen speed, stagger when shooting, etc
        - Items.Base_Assault_Rifle_inline0
        - EquipmentGLP.MediumStaminaRegen
        - EquipmentGLP.LightStaminaDelay
        - Items.SmartWeaponTargetsPriorityQueues
      OnEquip: [] 
      OnLooted: [] 
      parts: []
      placementSlots: # slots in Which this item can be placed in. see equipmentEX?
        - AttachmentSlots.WeaponRight
        - AttachmentSlots.WeaponLeft
        - AttachmentSlots.ItemSlotSniperRifle
        - AttachmentSlots.ItemSlotSMG
        - AttachmentSlots.ItemSlotTechRifle
        - AttachmentSlots.ItemSlotHandgunLeftJackie
        - AttachmentSlots.ItemSlotHandgunRightJackie
        - AttachmentSlots.ItemSlotGenericMelee
        - AttachmentSlots.ItemSlotHammer
        - AttachmentSlots.ItemSlotKatana
        - AttachmentSlots.ItemSlotKnifeRight
        - AttachmentSlots.ItemSlotKnifeLeft
        - AttachmentSlots.ItemSlotGenericRanged
        - AttachmentSlots.ItemSlotHandgunRight
        - AttachmentSlots.ItemSlotHandgunLeft
        - AttachmentSlots.ItemSlotTechRifle
        - AttachmentSlots.ItemSlotSMG
      previewBBoxOverride: []
      requiredSlots: []
      sellPrice:
        - Price.BaseWeaponPrice
        - Price.ItemQualityMultiplier
        - Price.PlusTierMultiplier
        - Price.WeaponSellMultiplier
        - Price.BrokenItemPriceMult
        - Price.IconicMultiplier
        - Price.AssaultRifleMultiplier
        - Price.SmartWeapon
      slotPartList: # what models to load when weapon has attachments and when it has mag inserted(or not)
        - Items.Base_Sidewinder_inline2
        - Items.Base_Sidewinder_inline4
        - Items.Base_Sidewinder_inline6
        - Items.Base_Sidewinder_inline8
      slotPartListPreset: # same as above but specific to the preset of the weapon, also used to set attachment and mod slots
        - Items.Preset_Sidewinder_Default_inline0
          …
        - Items.Preset_Sidewinder_Default_inline5
      tags: # tags signalling the game about weapon being smart, melee, ranged, etc....
        - Weapon
        - RangedWeapon
        - inventoryDoubleSlot
        - Preload
        - Weapon
        - Rifle Assault
        - Smart
        - SmartWeapon
        - Preload
        - Weapon
        - Rifle Assault
      variants: []
      visualTags: # visual tags used to set what look to use from the app file set in appearanceResoureName
        - Default
      effectors: []
      objectActions:
        - ItemAction.Drop
        - ItemAction.Disassemble
        - ItemAction.WeaponDisassemble
      statModifierGroups: # this section is for actually modifying weapon stats
        - Items.Base_Smart_Stats
        - Items.Base_Smart_Assault_Rifle_No_Sway_Stats
        - Items.Base_Assault_Rifle_RPG_Stats
        - Items.Base_Assault_Rifle_Misc_Stats
        - Items.Base_PlayerState_Spread_Stats
        - Items.Base_Weapon_Damage_Type_Min_Max
        - Items.Base_Weapon_Damage_Type_Physical
        - Items.QualityRandomization
        - Items.ItemPlusRandomizer_MaxQuality
        - Items.ItemPlusRandomizer_Below_MaxQuality
        - Items.WeaponModsWeights_On_Tier2Plus
        - Items.WeaponModsWeights_On_Tier3Plus
        - Items.WeaponModsWeights_On_Tier4Plus
        - Items.WeaponModsWeights_On_Tier5Plus
        - Items.WeaponModsWeights_On_Tier5PlusPlus
        - Items.Base_Smart_Assault_Rifle_Mult_Stats
        - Items.Base_Sidewinder_Technical_Stats # used to set: bullet amount fired, projectiles fired per bullet, smart weapon accuracy, fire 
    rate(cycle time), mag size, smart range
        - Items.Base_Sidewinder_Handling_Stats # used to set: reload speed, weapon zoom, speed of first equip anim.
        - Items.Base_Sidewinder_Recoil_Stats # used to set: recoil stats
        - Items.Base_Sidewinder_SmartGun_Stats # used to set: smartgun accuracy, projectile stats(speed), lock on stats
        - Items.Base_Sidewinder_SmartGun_SmartLink_Stats # used to set: smartlink requirement and how stats in Base_Sidewinder_SmartGun_Stats are affected by link
        - Items.Base_Sidewinder_SmartGun_Projectile_Stats # used to set: projectile miss conditions and other stuff like spirals
        - Items.Base_Sidewinder_Spread_Stats
        - Items.Base_Sidewinder_Flags # unknown
        - Items.Base_Sidewinder_Aim_Stats
        - Items.Base_Sidewinder_Constant_Stats # more spread stats, firepower, effective range
        - Items.Base_Sidewinder_Damage_Stats # used to set: DPS
      statModifiers: # this section is primarily used to set stuff intrinsic to all weapons
        - Items.Base_Weapon_inline0
          …
        - Items.Base_Weapon_inline149
      statPools: [] # used to set stat pools like tech weapon charge and overheating
      weakspots: []
      position: {x: '0,000500000024', y: 0, z: '0,0900000036'}
      price: Items.Base_Sidewinder_inline0
      weaponVignetteRadius: 0.648199975
      weaponEdgesSharpness: 0.495799989
      weaponFarPlane_aim: 23.7000008
      weaponFarPlane: 29.5
      weaponEdgesSharpness_aim: 0.495799989
      weaponVignetteCircular_aim: 0.174500003
      offset: -0.100000001
      safeActionDuration: 2
      weaponVignetteIntensity_aim: 0.135700002
      weaponNearPlane_aim: 12.4700003
      weaponVignetteRadius_aim: 0.681400001
      weaponNearPlane: 8.31000042
      weaponVignetteIntensity: 0.135700002
      weaponBlurIntensity_aim: 1
      weaponVignetteCircular: 0
      weaponBlurIntensity: 1
      hide_nametag: True
    Items.Preset_Unity_Default: -> Remove this
    Items.Hand_Of_Midas: -> Add this
     Game.AddToInventory("Items.Hand_Of_Midas",1)
      crosshair: Crosshairs.Simple # -> remove this
      crosshair: Crosshairs.Tech_Round # <- add this
    Game.AddToInventory("Items.Hand_Of_Midas",1)
    Game.AddToInventory("Items.Preset_Unity_Default",1)
    Items.Hand_Of_Midas:
      $base: Items.Preset_Unity_Default
      # Just the properties we want to edit...
    
    # OR
    
    Items.Hand_Of_Midas:
      $type: WeaponItem
      # Every single property of the weapon...
    Items.Hand_Of_Midas:
      $base: Items.Preset_Unity_Default
      crosshair: Crosshairs.Tech_Round
    localization:
      onscreens:
        en-us: midas_collection\localization\en-us.json
    Items.Hand_Of_Midas:
      $base: Items.Preset_Unity_Default
      crosshair: Crosshairs.Tech_Round
      displayName: LocKey("MC_gun_name")
      localizedDescription: LocKey("MC_gun_description")
    # Hand of Midas weapon tweak
    Items.Hand_Of_Midas:
      $base: Items.Preset_Unity_Default # $base makes it so all the properties are taken from the specified tweak (in this case, "Items.Preset_Unity_Default") and the properties specified in this tweak overwrite the parent.
      crosshair: Crosshairs.Tech_Round # other crosshairs can be found by looking for "Crosshairs." in Tweak Browser
      displayName: LocKey("MC_gun_name") # name of the gun (will be fetched from "LocKey#MC_gun_name" secondary key in "en-us.json")
      localizedDescription: LocKey("MC_gun_description") # description of the gun (can be seen when previewing the gun from inventory with "V" key)
      tags:
        - !append IconicWeapon # prevent the gun from being dissassembled
      statModifiers:
        - !append Quality.IconicItem # makes the weapon iconic
      statModifierGroups:
        - !append Items.IconicQualityRandomization # necessary for ingame upgrade
        - !remove Items.QualityRandomization # to prevent stacking with the previous
    Items.Hand_Of_Midas:
      #...
      blueprint: Items.Iconic_Ranged_Weapon_Blueprint # blueprint decides what kind of attachments/mods are allowed on a weapon
    Items.Hand_Of_Midas:
      #...  
      quality: Quality.Rare # minimum item quality
    Items.Hand_Of_Midas:
      #...
      buyPrice:
        - Price.Hand_Of_Midas
        - Price.BuyPrice_StreetCred_Discount
      sellPrice:
        - Price.Hand_Of_Midas
        - Price.WeaponSellMultiplier
    
    # Static price for Hand of Midas
    Price.Hand_Of_Midas:
      $type: ConstantStatModifier
      value: 100000
      modifierType: Additive
      statType: BaseStats.Price
    WilsonWeaponMod : IconicWeaponModBase
    {
        OnAttach = 
        [
           "Items.WilsonWeaponModAbility"
        ];
        statModifiers += 
        [
           {
              statType = "BaseStats.ReloadTimeBonus";
              modifierType = "Additive";
              value = -0.1f;
           } : ConstantStatModifier 
        ];
    }
    WilsonWeaponModAbility : IconicWeaponModAbilityBase
    {
        UIData = 
        {
           iconPath = "ability_offensive";
           localizedDescription = "LocKey#50743";
        };
        effectors = 
        [
           {
              prereqRecord = "Prereqs.ProcessHitTriggered";
              percentMult = 0.25f;
              unitThreshold = 10f;
           } : MultiplyDamageWithVelocity, 
           {
              prereqRecord = "Perks.IsHitQuickMelee";
              value = 1.5f;
           } : MultiplyDamage
        ];
    }
    # Hand of Midas weapon tweak
    Items.Hand_Of_Midas:
      # your other properties - cut out for readability
      slotPartListPreset: # attachments & mods 
        - !append
          $type: SlotItemPartPreset
          itemPartPreset: Items.Cranial_Cashback_Mod # iconic mod
          slot: AttachmentSlots.IconicWeaponModLegendary 
    # Hand of Midas Iconic mod
    Items.Cranial_Cashback_Mod:
      $base: Items.IconicWeaponModBase
      OnAttach: 
        - Items.Cranial_Cashback
      statModifiers:
        - !append
          $type: ConstantStatModifier
          statType: BaseStats.ReloadTimeBonus # modifies reload time (without influence to DamagePerHit)
          modifierType: Additive
          value: -0.20
        - !append
          $type: ConstantStatModifier
          statType: BaseStats.MagazineCapacityBonus # multiplier on total mag size (without influence to DamagePerHit)
          modifierType: Additive
          value: 0.34
        - !append
          $type: ConstantStatModifier
          statType: BaseStats.DamagePerHit # Direct change to damage per hit
          modifierType: Multiplier
          value: 1.1
    # Hand of Midas Iconic mod ability
    Items.Cranial_Cashback:
      $base: Items.IconicWeaponModAbilityBase
      # effectors:
      #   - Effectors.Punish_Miss
      #   - Effectors.Heal_On_Headshot
      UIData:
        $type: GameplayLogicPackageUIData
        localizedDescription: LocKey("MC_gun_iconic_description") # iconic description shown in yellow text when hovering over a weapon
    # Hand of Midas weapon tweak
    Items.Hand_Of_Midas:
      #...
      slotPartListPreset: # attachments & mods 
        - !append-once
          $type: SlotItemPartPreset
          itemPartPreset: Items.Cranial_Cashback_Mod # iconic mod
          slot: AttachmentSlots.IconicWeaponModLegendary 
    
    # Hand of Midas Iconic mod
    Items.Cranial_Cashback_Mod:
      $base: Items.IconicWeaponModBase
      OnAttach: 
        - Items.Cranial_Cashback
      statModifiers:
        - $type: ConstantStatModifier
          statType: BaseStats.ReloadTimeBonus # modifies reload time (without influence to DamagePerHit)
          modifierType: Additive
          value: -0.20
        - $type: ConstantStatModifier
          statType: BaseStats.MagazineCapacityBonus # multiplier on mag size (without influence to DamagePerHit)
          modifierType: Additive
          value: 0.34
        - $type: ConstantStatModifier
          statType: BaseStats.DamagePerHit # Direct change to damage per hit
          modifierType: Multiplier
          value: 1.1
    
    # Hand of Midas Iconic mod ability
    Items.Cranial_Cashback:
      $base: Items.IconicWeaponModAbilityBase
      # effectors:
      #   - Effectors.Punish_Miss
      #   - Effectors.Heal_On_Headshot
      UIData:
        $type: GameplayLogicPackageUIData
        localizedDescription: LocKey("MC_gun_iconic_description") # iconic description shown in yellow text when hovering over a weapon
    Items.MemoryReplenishmentEffector:
      $type: ModifyStatPoolValueEffector
      setValue: False
      usePercent: True
      effectorClassName: ModifyStatPoolValueEffector
      prereqRecord: Items.MemoryReplenishmentEffector_inline0
      removeAfterActionCall: False
      removeAfterPrereqCheck: False
      statPoolUpdates:
        - Items.MemoryReplenishmentEffector_inline4
      statModifierGroups: []
    Effectors.Heal_On_Headshot:
      $type: ModifyStatPoolValueEffector
      setValue: False
      usePercent: True
      effectorClassName: ModifyStatPoolValueEffector
      prereqRecord: Items.MemoryReplenishmentEffector_inline0
      removeAfterActionCall: False
      removeAfterPrereqCheck: False
      statPoolUpdates: 
        - $type: StatPoolUpdate
          statPoolType: BaseStatPools.Health
          statPoolValue: 80
      statModifierGroups: []
    # Prereq to check if headshot & target is alive and hit with a ranged weapon
    Prereqs.Is_Target_Alive_And_Headshot:
      $type: HitPrereq
      callbackType: HitTriggered
      ignoreSelfInflictedPressureWave: True
      isSynchronous: True
      pipelineStage: Process
      pipelineType: Damage
      prereqClassName: HitTriggeredPrereq # how to refer to it later - Prereqs.HitTriggeredPrereq
      conditions:
        - Perks.IsHitTargetAlive_inline2 # hit target is alive (health != 0)
        - Perks.HitIsBodyPartHead_inline0 # headshot condition
        - Prereqs.Is_Attack_Ranged # condition to check if it's the bullet hitting the target and not a quick melee
        - Prereqs.Is_Weapon_Ranged # condition to check that the gun is source of damage and not a grenade
      processMiss: False # process shots that hit npcs only
    # Condition to check if attack type is ranged
    Prereqs.Is_Attack_Ranged:
      $type: HitPrereqCondition
      invert: False
      onlyOncePerShot: True
      type: Prereqs.AttackType
      attackType: Ranged
    
    # Condition to check if weapon type is ranged
    Prereqs.Is_Weapon_Ranged:
      $type: HitPrereqCondition
      invert: False
      onlyOncePerShot: True
      type: Prereqs.WeaponType
      weaponType: Ranged
    # Effector to heal player if they hit a headshot
    Effectors.Heal_On_Headshot:
      $type: ModifyStatPoolValueEffector
      prereqRecord: Prereqs.Is_Target_Alive_And_Headshot
      usePercent: False
      statPoolUpdates: 
        - $type: StatPoolUpdate
          statPoolType: BaseStatPools.Health
          statPoolValue: 80
    # Effector to inflict damage on player when they shoot
    Effectors.Punish_Miss:
      $type: ModifyStatPoolValueEffector
      prereqRecord: Prereqs.Has_Player_Shot
      usePercent: False
      statPoolUpdates: 
        - $type: StatPoolUpdate
          statPoolType: BaseStatPools.Health
          statPoolValue: -20
    
    # Prereq to check if the player has shot (bug - currently detects if a player has hit anything, not if shot)
    Prereqs.Has_Player_Shot:
      $type: HitPrereq
      callbackType: HitTriggered
      ignoreSelfInflictedPressureWave: True
      isSynchronous: True
      pipelineStage: PreProcess
      pipelineType: All
      prereqClassName: HitOrMissTriggeredPrereq
      processMiss: True # process shots that miss npcs
      conditions:
        - Prereqs.Is_Attack_Ranged # condition to check if it's the bullet hitting the target and not a quick melee
        - Prereqs.Is_Weapon_Ranged # condition to check that the gun is source of damage and not a grenade
    # Hand of Midas weapon tweak
    Items.Hand_Of_Midas:
      $base: Items.Preset_Unity_Default # $base makes it so all the properties are taken from the specified tweak (in this case, "Items.Preset_Unity_Default") and the properties specified in this tweak overwrite the parent.
      blueprint: Items.Iconic_Ranged_Weapon_Blueprint # blueprint decides what kind of attachments/mods are allowed on a weapon
      crosshair: Crosshairs.Tech_Round # other crosshairs can be found by looking for "Crosshairs." in Tweak Browser
      displayName: LocKey("MC_gun_name") # name of the gun (will be fetched from "LocKey#MC_gun_name" secondary key in "en-us.json")
      localizedDescription: LocKey("MC_gun_description") # description of the gun (can be seen when previewing the gun from inventory with "V" key)
      quality: Quality.Rare # minimum item quality
      tags:
        - !append IconicWeapon # prevent the gun from being dissassembled
      statModifiers: # stats for a weapon - reload time/aim speed/magazine size/recoil kick/damage per second/etc.
        - !append Quality.IconicItem # makes the weapon iconic
      statModifierGroups: # stats for a weapon also, but grouped (generally by category)
        - !append Items.IconicQualityRandomization # necessary for ingame upgrade
        - !remove Items.QualityRandomization # to prevent stacking with the previous
      slotPartListPreset: # attachments & mods 
        - !append
          $type: SlotItemPartPreset
          itemPartPreset: Items.Cranial_Cashback_Mod # iconic mod
          slot: AttachmentSlots.IconicWeaponModLegendary
      buyPrice:
        - Price.Hand_Of_Midas
        - Price.BuyPrice_StreetCred_Discount
      sellPrice:
        - Price.Hand_Of_Midas
        - Price.WeaponSellMultiplier
        
    Price.Hand_Of_Midas:
      $type: ConstantStatModifier
      value: 100000
      modifierType: Additive
      statType: BaseStats.Price
    
    Items.Cranial_Cashback_Mod:
      $base: Items.IconicWeaponModBase
      OnAttach: 
        - Items.Cranial_Cashback
      statModifiers:
        - !append
          $type: ConstantStatModifier
          statType: BaseStats.ReloadTimeBonus # modifies reload time (without influence to DamagePerHit)
          modifierType: Additive
          value: -0.20
        - !append
          $type: ConstantStatModifier
          statType: BaseStats.MagazineCapacityBonus # multiplier on mag size (without influence to DamagePerHit)
          modifierType: Additive
          value: 0.34
        - !append
          $type: ConstantStatModifier
          statType: BaseStats.DamagePerHit # Direct change to damage per hit
          modifierType: Multiplier
          value: 1.1
    
    Items.Cranial_Cashback:
      $base: Items.IconicWeaponModAbilityBase
      effectors:
        - Effectors.Punish_Miss
        - Effectors.Heal_On_Headshot
      UIData:
        $type: GameplayLogicPackageUIData
        localizedDescription: LocKey("MC_gun_iconic_description") # iconic description shown in yellow text when hovering over a weapon
    
    # -------------------------------------------------------------------------------------------------------------------------
    
    # Effector to inflict damage on player when they shoot
    Effectors.Punish_Miss:
      $type: ModifyStatPoolValueEffector
      prereqRecord: Prereqs.Has_Player_Shot
      usePercent: False
      statPoolUpdates: 
        - $type: StatPoolUpdate
          statPoolType: BaseStatPools.Health
          statPoolValue: -20
    
    # Effector to heal player if they hit a headshot
    Effectors.Heal_On_Headshot:
      $type: ModifyStatPoolValueEffector
      prereqRecord: Prereqs.Is_Target_Alive_And_Headshot
      usePercent: False
      statPoolUpdates: 
        - $type: StatPoolUpdate
          statPoolType: BaseStatPools.Health
          statPoolValue: 80
    
    # -------------------------------------------------------------------------------------------------------------------------
    
    # Prereq to check if the player has shot (bug - currently detects if a player has hit anything, not if shot)
    Prereqs.Has_Player_Shot:
      $type: HitPrereq
      callbackType: HitTriggered
      ignoreSelfInflictedPressureWave: True
      isSynchronous: True
      pipelineStage: PreProcess
      pipelineType: All
      prereqClassName: HitOrMissTriggeredPrereq
      processMiss: True # process shots that miss npcs
      conditions:
        - Prereqs.Is_Attack_Ranged # condition to check if it's the bullet hitting the target and not a quick melee
        - Prereqs.Is_Weapon_Ranged # condition to check that the gun is source of damage and not a grenade
    
    # Prereq to check if headshot & target is alive and hit with a ranged weapon
    Prereqs.Is_Target_Alive_And_Headshot:
      $type: HitPrereq
      callbackType: HitTriggered
      ignoreSelfInflictedPressureWave: True
      isSynchronous: True
      pipelineStage: Process
      pipelineType: Damage
      prereqClassName: HitTriggeredPrereq
      conditions:
        - Perks.IsHitTargetAlive_inline2 # hit target is alive (health != 0)
        - Perks.HitIsBodyPartHead_inline0 # headshot condition
        - Prereqs.Is_Attack_Ranged # condition to check if it's the bullet hitting the target and not a quick melee
        - Prereqs.Is_Weapon_Ranged # condition to check that the gun is source of damage and not a grenade
      processMiss: False # process shots that hit npcs only
    
    # -------------------------------------------------------------------------------------------------------------------------
    
    # Condition to check if attack type is ranged
    Prereqs.Is_Attack_Ranged:
      $type: HitPrereqCondition
      invert: False
      onlyOncePerShot: True
      type: Prereqs.AttackType
      attackType: Ranged
    
    # Condition to check if weapon type is ranged
    Prereqs.Is_Weapon_Ranged:
      $type: HitPrereqCondition
      invert: False
      onlyOncePerShot: True
      type: Prereqs.WeaponType
      weaponType: Ranged
    # Hand of Midas weapon tweak
    Items.Hand_Of_Midas:
      # ...
      audioName: wea_set_liberty_dex
      # ...
    mana vortex
    mana vortex
    Effector
    Condition
    Example: browsing .tweak files
    Console
    Tweak Browser
    Visual Studio Code
    Visual Studio Code
    Installed & Setup
    Installation & Setup Guide
    Tweak Browser
    Wolvenkit Tweak Browser
    LocKey browser
    search
    Tweak Browser
    Tweak Browser