> For the complete documentation index, see [llms.txt](https://atiysus-organization.gitbook.io/aty-scripts/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://atiysus-organization.gitbook.io/aty-scripts/weapon-editor/guide/shooting-range.md).

# Shooting range

## Shooting range

The range measures what a weapon actually does, under conditions you can rebuild exactly. It needs the `range` scope.

```
/gunsmithrange
```

### Why scenarios

Setting distance and target by hand makes every session slightly different, and the numbers stop being comparable. A scenario rebuilds the same conditions every time — which is the precondition for comparing anything at all.

| Scenario        | Distance | Target           | Notes                                                                       |
| --------------- | -------- | ---------------- | --------------------------------------------------------------------------- |
| Close quarters  | 5 m      | Patrol           |                                                                             |
| Mid range       | 25 m     | Static           |                                                                             |
| Long range      | 80 m     | Static           |                                                                             |
| Armoured target | 15 m     | Armoured         |                                                                             |
| Under pressure  | 10 m     | Full combat      |                                                                             |
| Bench           | 15 m     | Static, immortal | Damage, spread and RPM only — nothing dies, so TTK and STK are not measured |
| Distance curve  | from 5 m | Static, immortal | The target steps further away stage by stage                                |

The **distance curve** collects a set number of countable hits at each stage before the target moves back on its own. The target must be immortal for this: a death would cut the curve in half, and a killing blow is excluded from the measurement anyway.

Scenarios live in `Config.RangeScenarios`. Their `id` is written into every session record and later used to compare sessions of the same scenario, so changing an id breaks comparison against older records.

### What it records

| Metric             | Meaning                        |
| ------------------ | ------------------------------ |
| TTK                | Time to kill                   |
| STK                | Shots to kill                  |
| DPS                | Damage per second              |
| Accuracy           | Hits over shots                |
| Avg / total damage | Per hit, and cumulative        |
| RPM                | Measured rate of fire          |
| Zone split         | Head / torso / limb hit counts |

Sessions are stored in `aty_gunsmith_range` **with the balance version they were recorded under**. Without that, comparing two sessions across a deploy would be meaningless.

Only sessions with three or more hits are recorded.

### Comparing

The comparison panel needs at least two recorded sessions. It shows the difference **without a verdict**: a lower TTK means faster, which is good on one weapon and bad on another. The call is yours.

Where sessions come from different balance versions, the panel says so — and reminds you that meta fields only took effect after a restart, so a session recorded before that restart was measured on the old values.

Class averages shown next to a result are computed from your own recorded sessions. They are also what the balance lab linter compares against.

### Falloff

Falloff fields — start range, end range, damage modifier — are meta class. A change only reaches the curve after a server restart. The range says so on the curve panel rather than letting you measure a value that is not live yet.

### Where it is

The default range zone is defined in `Config.Zones`:

```lua
shooting_range = { coords = vector3(13.0, -1097.0, 29.8), radius = 2.0, label = 'range' },
```

and referenced from `Config.Access.range.zones`. Move it, or add more, to suit your map.

### See also

* Balance lab
* Permissions
