# Scoreboard Operations

Scoreboards can be used to perform complex operations, similar to Molang. Operations come in two flavors: mathematical, and logical.

## Overview

Operations are performed using the `/scoreboard players operation`

command. The full syntax is laid out below:

`/scoreboard players operation <targetScore> <objective> <operation> <sourceScore> <objective>`

The command consists of two score holders: The target score, and the source score. The target score is the value being operated on, and the source score is the value affecting the operation. The result of the operation is written into the target score, and the source score's value is not touched, save for one operation.

## Mathematical Operators

Mathematical operators use arithmetic to affect the target score. There are five mathematical operations available: addition, subtraction, multiplication, floor division, and floor modulo division.

For each of the following examples below, assume that score holder `A var`

equals 25, and `B var`

equals 10.

### Addition

Operator: **+=**

This operation adds the target score and source scores together, then stores the sum into the target score.

`/scoreboard players operation A var += B var`

`A = A + B`

, and as such `25 + 10 = 35`

.

### Subtraction

Operator: **-=**

This operation subtracts the target score by the source score, then stores the difference into the target score.

`/scoreboard players operation A var -= B var`

`A = A - B`

, and as such `25 - 10 = 15`

.

### Multiplication

Operator: ***=**

This operation multiplies the target score by the source score, then stores the product into the target score.

`/scoreboard players operation A var *= B var`

`A = A * B`

, and as such `25 * 10 = 250`

.

### Floored Division

Operator: **/=**

This operation divides the target score by the source score, then stores the quotient into the target score. Because score values can only be integers, the value is floored, or rounded down.

`/scoreboard players operation A var /= B var`

`A = floor(A / B)`

, and as such `floor(25 / 10) = 2`

.

### Floored Modulo Division

Operator: **%=**

This operation also divides the target score by the source score, but instead returns the remainder after the division into the target score. This is also floored.

`/scoreboard players operation A var %= B var`

`A = floor(mod(A, B))`

, and as such `floor(mod(25, 10)) = 5`

.

## Logical Operators

Logical operations use logic gates and assignments to affect the target score. There are four logical operations available: assignment, less than, greater than, and swap.

Similar to the above, assume that score holder `A var`

equals 25, and `B var`

equals 10.

### Assignment Operator

Operator: **=**

This operation sets the target score equal to the source score.

`/scoreboard players operation A var = B var`

`A = B`

, and as such the result is `10`

.

### Minimum Operator

Operator: **<**

This operation returns the smallest of the input scores, and stores it into the target score.

`/scoreboard players operation A var < B var`

`A = min(A, B)`

, and as such `min(25, 10) = 10`

.

### Maximum Operator

Operator: **>**

This operation returns the largest of the input scores, and stores it into the target score.

`/scoreboard players operation A var > B var`

`A = max(A, B)`

, and as such `max(25, 10) = 25`

.

### Swap Operator

Operator: **><**

This operation swaps the target score and source scores with each other. This is the only operation that affects the source score.

`/scoreboard players operation A var >< B var`

The above command would swap the values of A and B e.g.

Before: A = 10; B = 25;

After: A = 25; B = 10;

This can be seen as three operations: `temp = A; A = B; B = temp;`

, and as such `A var = 10`

and `B var = 25`

.

## Useful Creations

#### Check If Values are Equal

If you want to check in scoreboard, whether one value equals another value, you can copy first value to temporary value, subtract the other and compare temporary value to zero. Given values A and B:

```
scoreboard objectives add temp dummy
scoreboard players operation @e temp = @s A
scoreboard players operation @e temp -= @s B
execute as @e[scores={temp=0}] run say A equals B
scoreboard objectives remove temp
```

#### Scoreboard Initialization

If you want to initialize a scoreboard value to 0, but only if it doesn't exists, you can use `scoreboard players add <selector> <name> 0`

. It will set the value to 0, if it doesn't exist on the entity and do nothing, if it already exist.