# Modifiers

Requirement modifiers are used to tweak some properties of a recipe requirement.

They are defined in json inside of the `modifiers` property of the machine upgrade item json.

### List of properties that can be modified

<table><thead><tr><th width="150">Requirement</th><th width="150" align="center">Target</th><th align="center">Modified property </th></tr></thead><tbody><tr><td><a href="../requirements/block">Block</a></td><td align="center">-</td><td align="center"><code>amount</code></td></tr><tr><td><a href="../requirements/block">Block</a></td><td align="center">"chance"</td><td align="center"><code>chance</code></td></tr><tr><td><a href="../requirements/command">Command</a></td><td align="center">"chance"</td><td align="center"><code>chance</code></td></tr><tr><td><a href="../requirements/drop">Drop</a></td><td align="center">-</td><td align="center"><code>amount</code></td></tr><tr><td><a href="../requirements/drop">Drop</a></td><td align="center">"radius"</td><td align="center"><code>radius</code></td></tr><tr><td><a href="../requirements/drop">Drop</a></td><td align="center">"chance"</td><td align="center"><code>chance</code></td></tr><tr><td><a href="../requirements/durability">Durability</a></td><td align="center">-</td><td align="center"><code>amount</code></td></tr><tr><td><a href="../requirements/durability">Durability</a></td><td align="center">"chance"</td><td align="center"><code>chance</code></td></tr><tr><td><a href="../requirements/effect">Effect</a></td><td align="center">"time"</td><td align="center"><code>time</code></td></tr><tr><td><a href="../requirements/effect">Effect</a></td><td align="center">"level"</td><td align="center"><code>level</code></td></tr><tr><td><a href="../requirements/effect">Effect</a></td><td align="center">"radius"</td><td align="center"> <code>radius</code></td></tr><tr><td><a href="../requirements/effect">Effect</a></td><td align="center">"chance"</td><td align="center"><code>chance</code></td></tr><tr><td><a href="../requirements/energy">Energy</a></td><td align="center">-</td><td align="center"><code>amount</code></td></tr><tr><td><a href="../requirements/energy">Energy</a></td><td align="center">"chance"</td><td align="center"><code>chance</code></td></tr><tr><td><a href="../requirements/energy-per-tick">Energy per tick</a></td><td align="center">-</td><td align="center"><code>amount</code></td></tr><tr><td><a href="../requirements/energy-per-tick">Energy per tick</a></td><td align="center">"chance"</td><td align="center"><code>chance</code></td></tr><tr><td><a href="../requirements/entity">Entity</a></td><td align="center">-</td><td align="center"><code>amount</code></td></tr><tr><td><a href="../requirements/entity">Entity</a></td><td align="center">"radius"</td><td align="center"><code>radius</code></td></tr><tr><td><a href="../requirements/entity">Entity</a></td><td align="center">"chance"</td><td align="center"><code>chance</code></td></tr><tr><td><a href="../requirements/fluid">Fluid</a></td><td align="center">-</td><td align="center"><code>amount</code></td></tr><tr><td><a href="../requirements/fluid">Fluid</a></td><td align="center">"chance"</td><td align="center"><code>chance</code></td></tr><tr><td><a href="../requirements/fluid-per-tick">Fluid per tick</a></td><td align="center">-</td><td align="center"><code>amount</code></td></tr><tr><td><a href="../requirements/fluid-per-tick">Fluid per tick</a></td><td align="center">"chance"</td><td align="center"><code>chance</code></td></tr><tr><td><a href="../requirements/item">Item</a></td><td align="center">-</td><td align="center"><code>amount</code></td></tr><tr><td><a href="../requirements/item">Item</a></td><td align="center">"chance"</td><td align="center"><code>chance</code></td></tr><tr><td><a href="../requirements/light">Light</a></td><td align="center">-</td><td align="center"><code>light</code></td></tr><tr><td><a href="../requirements/loot-table">Loot table</a></td><td align="center">"luck"</td><td align="center"><code>luck</code></td></tr><tr><td><a href="../requirements/redstone">Redstone</a></td><td align="center">"power"</td><td align="center"><code>power</code></td></tr><tr><td>Speed</td><td align="center">-</td><td align="center">The recipe's <code>time</code> property</td></tr><tr><td>Function</td><td align="center">"chance"</td><td align="center"><code>chance</code></td></tr></tbody></table>

### Properties

The requirement modifier has 4 mandatory properties and 2 optional property.

#### Mandatory properties

<details>

<summary>Requirement</summary>

#### Name : `requirement`

#### Description :&#x20;

The type of the requirement you want to apply the modifier to. This is the same type as the one you specify in the `type` property when defining the requirement in the recipe json.

#### Example :&#x20;

```json
"requirement": "custommachinery:energy"
```

This modifier will be applied to the energy requirement.

#### Note :&#x20;

The recipe duration can also be modified with this system.&#x20;

Use `custommachinery:speed` to target it.

Warning : Using this as a requirement will alter the recipe process duration, which is the opposite of the speed (the lower the duration the faster the speed).

</details>

<details>

<summary>Mode</summary>

#### Name : `mode`

#### Description :&#x20;

The mode of the requirement you want to apply the modifier to. It can be either `input` or `output` but not both.

#### Example :&#x20;

```json
"mode": "input"
```

This modifier will be applied only on input requirements.

</details>

<details>

<summary>Operation</summary>

#### Name : `operation`

#### Description :&#x20;

The mathematical operation that will be applied to the targeted requirement property by the modifier. The available operations are :

* `addition` : The resulting value will be the sum of the base requirement value and the modifier value multiplied by the amount of upgrades.\
  `final_value = base_value + upgrade_modifier * upgrade_amount`<br>
* `multiplication` : The resulting value will be the multiplication of the base requirement value and the modifier value multiplied by the amount of upgrades.\
  `final_value = base_value * upgrade_modifier * upgrade_amount`<br>
* exponential : The resulting value will be the multiplication of the base requirement value and the modifier value powered to the amount of upgrades.\
  `final_value = base_value * upgrade_modifier ^ upgrade_amount`

#### Example :&#x20;

```json
"operation": "multiplication"
```

The base requirement value (defined in the recipe) will be multiplicated by the value defined in this modifier.

</details>

<details>

<summary>Modifier</summary>

#### Name : `modifier`

#### Description :&#x20;

The value (double) to add or multiply to the base requirement value. It can be positive or negative and support decimal numbers.

#### Example :&#x20;

```json
"modifier": 0.5
```

</details>

#### Optional properties

<details>

<summary>Target</summary>

#### Name : `target`

#### Description :&#x20;

Some requirement have more than one value that can be modified.&#x20;

In that case the `target` property can be used to define which one of the requirement property you want to modify.&#x20;

For example some requirement have a `chance` property that can be modified by the upgrade, simply use `"target": "chance"` to target the chance property instead of the default one.

#### Default : `empty`&#x20;

The modifier will be applied to the default property of the defined requirement.

#### Example :&#x20;

In case of the [Entity Requirement](https://github.com/Frinn38/Custom-Machinery/wiki/Entity-Requirement) the default property is `amount` so if you want to modify the `radius` property you can do :&#x20;

```json
"target": "radius"
```

</details>

<details>

<summary>Chance</summary>

#### Name : `chance`

#### Description :&#x20;

The chance the modifier will be applied to the requirement, this have nothing to do with the `chance` property some requirement have and will be applied independently.&#x20;

This value must be between 0 and 1 where 0 is 0% chance to be applied and 1 is 100% chance.

#### Default : 1&#x20;

The modifier have 100% chance to be applied on the requirement.

#### Example :&#x20;

```json
"chance": 0.4
```

The modifier have 40% chance to be applied on the requirement.

</details>

<details>

<summary>Max</summary>

#### Name : `max`

#### Description :&#x20;

A positive integer that define the maximum value obtained after applying this upgrade.

Fox example if the modifier multiply all energy output by 2 and the max is set to 1000, the maximum energy output by the recipe will be 1000FE, even if it should be greater after the multiplication.

#### Default : `POSITIVE_INFINITY`

#### Example :&#x20;

```json
"max": 42
```

Whatever the modifier does, the resulting value won't be greater than 42.

</details>

<details>

<summary>Min</summary>

#### Name : `min`

#### Description :&#x20;

A positive integer that define the minimum value obtained after applying this upgrade.

Fox example if the modifier divide all items consumed by 2 and the min is set to 1, the recipe will always consume 1 item.

#### Default : `NEGATIVE_INFINITY`

#### Example :&#x20;

```json
"min": 42
```

Whatever the modifier does, the resulting value won't be lower than 42.

</details>

<details>

<summary>Tooltip</summary>

#### Name : `tooltip`

#### Description :&#x20;

The tooltip that will render when a player hover any machine upgrade item in a gui while holding shift.\
This is a [text component](https://frinn.gitbook.io/custom-machinery-1.19/misc/text-component).

#### Default :&#x20;

A short string that describe what the modifier does : `-50% Energy input`

#### Example :&#x20;

```json
"tooltip": {
    "text": "Overclock: Recipe time divided by 2",
    "color": "orange"
}
```

The tooltip will be "Overclock: Recipe time divided by 2" in orange.

</details>

### Example

A modifier that half the time needed to process a recipe :&#x20;

```json
{
    "requirement": "custommachinery:speed",
    "mode": "input",
    "operation": "multiplication",
    "modifier": 0.5
}
```

A modifier that double the energy per tick consumed by a recipe :&#x20;

```json
{
    "requirement": "custommachinery:energy_per_tick",
    "mode": "input",
    "operation": "multiplication",
    "modifier": 2.0
}
```

A modifier that has 50% chance to add 1 item produced by a recipe :&#x20;

```json
{
    "requirement": "custommachinery:item",
    "mode": "output",
    "operation": "addition",
    "modifier": 1,
    "chance": 0.5
}
```
