# Upgrades

Custom Machine upgrades can be made with KubeJS script.

Create a .js file in the `kubejs\server_scripts` folder (ex: custom\_machine\_upgrades.js) and look at the example below to see all the available methods to create a Custom Machine upgrade with KubeJS.

If you're not familiar about custom machine upgrades see [the wiki page](https://frinn.gitbook.io/custom-machinery-1.21/recipes/upgrades).

### Creating custom machine upgrade with KubeJS

{% hint style="info" %}
Find all requirement types and targets that can be modified [here](https://frinn.gitbook.io/custom-machinery-1.21/recipes/upgrades/modifiers#list-of-properties-that-can-be-modified).
{% endhint %}

```java
//Use the 'cm_upgrades' event to register custom machine upgrades.
CustomMachineryEvents.upgrades(event => {

//Create the upgrade builder and give it the item that will act as upgrade.
//Use Item.of("item_id") to create the item.
event.create(Item item)
//If maxAmount is not specified the default is 64.
event.create(Item item, int maxAmount)

//Add a machine or a list of machines that will accept this upgrade, 
//the machine ID must be "namespace:id" like "custommachinery:my_machine",
//if the json is located in (my_datapack)/data/custommachinery/machines/my_machine.json
.machine(String... machineID)

//You can add a custom tooltip to the machine upgrade item.
.tooltip(String... tooltips)
//Use Text.of("text here") for more formatting options,
//See https://kubejs.com/wiki/kubejs/Text/
.tooltip(Text... tooltips)

//Add a modifier to this upgrade.
//See below for modifier syntax.
.modifier(CMRecipeModifierBuilder modifier)
})
```

### Making a modifier

```java
//Create a modifier that add/multiply a value to any input/output requirement of the specified type.
//requirement must be specified using its id: "namespace:requirement"
//Value can be any numerical value.
//Pick one of the 6 methods below :
CMRecipeModifierBuilder.addInput(requirement, value)
CMRecipeModifierBuilder.mulInput(requirement, value)
CMRecipeModifierBuilder.expInput(requirement, value)
CMRecipeModifierBuilder.addOutput(requirement, value)
CMRecipeModifierBuilder.mulOutput(requirement, value)
CMRecipeModifierBuilder.expOutput(requirement, value)

//All methods below are optional

//Specify a target, in case the requirement have several values that can be modified.
//Only 1 target can be defined for a modifier, default is none.
.target(String target)

//Specify a chance for this modifier to be applied.
//Must be a value between 0 and 1, 0 is never applied and 1 is 100% chance to be applied.
//Default is 1.
.chance(double chance)

//Specify the maximum value that can be obtained after applying this modifier.
//It can be any numerical value.
//Default is POSITIVE_INFINITY.
.max(double max)

//Specify the minimum value that can be obtained after applying this modifier.
//It can be any numerical value.
//Default is NEGATIVE_INFINITY.
.min(double max)

//Change the tooltip displayed when holding shift while hovering the upgrade item.
//Default : a short string that describe the effect of this modifier.
.tooltip(String tooltip)
//Use Text.of("text here") for more formating options.
//See https://kubejs.com/wiki/kubejs/Text/
.tooltip(Text tooltip)
```

### Examples

A gold ingot put inside the Power Crusher will double it's energy consumption with a maximum of 1000FE but also half it's duration time with a minimum of 100 ticks.

```java
CustomMachineryEvents.upgrades(event => {
    event.create(Item.of('minecraft:gold_ingot'))
        .machine("custommachinery:power_crusher")
        .modifier(CMRecipeModifierBuilder.mulInput('custommachinery:energy', 2).max(1000))
        .modifier(CMRecipeModifierBuilder.mulInput('custommachinery:speed', 1.5).min(100))
})
```
