> For the complete documentation index, see [llms.txt](https://docs.spoof.dev/asteroid/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.spoof.dev/asteroid/configuration/spoofing-limits.md).

# Spoofing Limits

This is the core of Asteroid. The `spoofing` section decides how many fake players are online and how they come and go.

```yaml
spoofing:
  multiplier: 1.2
  min: 2
  max: 5.0
  lifespan: '{random[3600,14400]}'
  joinDelay: '{random[30,90]}'
  disconnectDelay: '{random[300,900]}'
  has-played-before-chance: 90
```

## The target formula

Every cycle, Asteroid works out a target number of total players (real plus fake), then adds or removes fake players to move toward it.

```
target_total = real_players * multiplier
```

The number of fake players it wants is the target minus the real players, then clamped so it never goes below `min` or above `max`.

### Worked example

Settings: `multiplier: 2.0`, `min: 2`, `max: 20`.

* 5 real players online. Target is 5 times 2.0, which is 10. Asteroid aims for 5 fake players so the total shows 10.
* 0 real players online. The formula gives 0, but `min` is 2, so Asteroid keeps 2 fake players online. This stops the server from ever looking dead.
* 15 real players online. Target is 30, so it wants 15 fake players. If `max` were 10, it would stop at 10.

## The settings

| Setting                    | What it does                                                                     |
| -------------------------- | -------------------------------------------------------------------------------- |
| `multiplier`               | How aggressively to spoof. `real_players * multiplier` sets the target total.    |
| `min`                      | The lowest fake player count, even with zero real players.                       |
| `max`                      | The absolute cap. Asteroid never spawns more fake players than this.             |
| `lifespan`                 | How long each fake player stays online before leaving on its own, in seconds.    |
| `joinDelay`                | Wait time before spawning the next fake player.                                  |
| `disconnectDelay`          | Wait time between disconnecting fake players when there are too many.            |
| `has-played-before-chance` | Chance a fake player is flagged as a returning player rather than a first-timer. |

## Choosing a multiplier

| Multiplier | Feel                                                              |
| ---------- | ----------------------------------------------------------------- |
| 1.1 to 1.5 | Subtle and natural. Recommended for most servers.                 |
| 1.5 to 2.0 | Noticeable boost, still believable.                               |
| 2.0 and up | Aggressive. The player count looks inflated to observant players. |

The multiplier here is a fixed value. If you enable Fluctuation, the multiplier can change over time on its own.

## Lifespan and delays

These three settings are what make the activity look human. Randomize them with `{random[x,y]}`.

* **Lifespan** `'{random[3600,14400]}'`: each fake stays online for a random 1 to 4 hours, then leaves. Because each rolls its own lifespan, they leave at different times.
* **Join delay** `'{random[30,90]}'`: the wait before spawning the next fake. A staggered stream of joins looks natural.
* **Disconnect delay** `'{random[300,900]}'`: when there are too many fakes, they are removed one at a time with this gap, avoiding a mass logout.

## Has played before chance

Each time a fake spawns, this is the percent chance the server treats it as a returning player rather than new.

* `90` means about 9 in 10 fakes look like returners, and 1 in 10 looks new.
* `100` means fakes are never treated as new.
* Lower values add more first-time joins for variety.
