# wild-presets.yml

## Configuring `wild-presets.yml`

`wild-presets.yml` is where every wild-spawner preset is defined. It lives in `plugins/TCP-WildSpawners/wild-presets.yml`. The format is YAML — same indentation rules as every other plugin file. **Use spaces, never tabs** — a single tab anywhere in the file will silently break parsing.

You can edit this file at runtime and apply changes with `/tcpws reload` — no server restart needed.

### Top-level shape

```yaml
presets:
  <preset-id>:
    display-name: "..."
    provider: vanilla | mythicmobs | elitemobs | ecomobs | levelledmobs | infernalmobs | citizens
    normal-mobs: [...]
    ominous-mobs: [...]
    enabled: true
    allow-empty: false
    cycle-cage-mobs: true
    griefing-protection: false
    hologram-overrides: { ... }
    key-drops: [ ... ]
```

Every key under `presets:` is a **preset id** — lowercase letters, digits, `_`, and `-` only. The id appears in commands (`/tcpws give <preset>`), in shop plugins, and in spawner item PDC tags. **Renaming a preset id is a breaking change** for any existing distributions — spawners already issued under the old name won't recognise the new config.

### Display name

```yaml
display-name: "<gold>⚔ Example Spawner</gold>"
```

Raw [MiniMessage](https://docs.advntr.dev/minimessage/format.html). Shown in the hologram, the spawner item lore, and the GUI tile.

### Provider

```yaml
provider: vanilla
```

Which mob-source plugin handles this preset's mobs. Valid values:

| Value          | Plugin required | Mob ids look like                                  |
| -------------- | --------------- | -------------------------------------------------- |
| `vanilla`      | none            | `minecraft:zombie`, `minecraft:skeleton`           |
| `mythicmobs`   | MythicMobs      | `Goblin`, `EliteWarrior` (the mob's MythicMobs id) |
| `elitemobs`    | EliteMobs       | `Boss_DesertGuard` (the EliteMobs preset id)       |
| `ecomobs`      | EcoMobs         | (the EcoMobs config id)                            |
| `levelledmobs` | LevelledMobs    | (LevelledMobs entity id)                           |
| `infernalmobs` | InfernalMobs    | (InfernalMobs config id)                           |
| `citizens`     | Citizens        | (Citizens NPC id)                                  |

Pick the provider matching where your mobs are defined. The plugin queries that provider's API at spawn time to spawn the right mob.

If a provider isn't loaded but a preset references it, the preset loads but spawn attempts log a warning and fall back to a placeholder.

For non-vanilla providers, install both the provider plugin and a recent version compatible with Paper 1.21.x.

### Mob lists

```yaml
normal-mobs:
  - minecraft:zombie
  - minecraft:skeleton
ominous-mobs:
  - minecraft:wither_skeleton
```

Two parallel lists — one for normal trial spawner waves, one for ominous (when an ominous bottle is active).

The vanilla wave system picks one entry per spawn slot, cycling through the list. List order doesn't fix the spawn order; vanilla picks effectively randomly within each wave.

For vanilla provider: always include the `minecraft:` prefix (`minecraft:cow`, never bare `cow`). For non-vanilla providers: omit the prefix and use the bare mob id — the provider's API expects ids without it.

Empty lists are allowed only if `allow-empty: true` is also set (see below).

### `enabled`

```yaml
enabled: true
```

When `false`, `/tcpws give` rejects this preset, the GUI shows it greyed out, and any already-placed spawners log a one-time warning on next activation. Useful for disabling a preset mid-sale without losing its configuration.

### `allow-empty`

```yaml
allow-empty: false
```

When `false` (default), `/tcpws give` rejects the preset if both mob lists are empty. Set to `true` for decorative spawners that intentionally spawn nothing — useful for "show off the mob" displays that you don't want fighting players.

### `cycle-cage-mobs`

```yaml
cycle-cage-mobs: true
```

When `true` AND the provider is `vanilla`, the placed spawner's `spawn_potentials` is built from this preset's mob lists, so the cage's mini-entity display cycles through the actual mobs. **Looks exactly like a real trial chamber spawner.**

For non-vanilla providers, this falls back to a zombie placeholder regardless — Minecraft's cage rendering can't display custom entities without a hard dependency on each provider's bukkit-side rendering code.

Default: `true` for vanilla, `false` for everything else (saves you from having to set it explicitly per preset).

### `griefing-protection`

```yaml
griefing-protection: false
```

When `true`, the placed spawner can ONLY be mined by its original placer. Nobody else — not even ops — can mine it, unless they have the `tcpws.mine.bypass-owner` permission. The hologram also gains an `Owner: <name>` line so observers can see who owns it.

Designed for **premium / sold spawners** — server owners enable this on the presets they hand out to paying players, and leave it off for free presets that anyone can mine and relocate.

### Hologram overrides

```yaml
hologram-overrides:
  owner: false
  state: false
```

Override the global `holograms.lines.*` toggles for this specific preset. Useful when most presets use full holograms but one specific preset wants to hide certain lines.

Valid keys: `title`, `owner`, `state`, `provider`. Absent keys fall through to the global config.

### Key drops (TCP-VaultCrates integration)

```yaml
key-drops:
  - { crate: "common",    tier: "normal",  chance: 0.25 }
  - { crate: "legendary", tier: "ominous", chance: 0.02 }
```

When **TCP-VaultCrates** is also installed, mobs spawned by this preset can drop crate keys on death. Each entry rolls **independently** — a single kill can drop multiple keys, or none.

| Field    | Meaning                                 |
| -------- | --------------------------------------- |
| `crate`  | Crate id from VaultCrates' `crates.yml` |
| `tier`   | `normal` or `ominous`                   |
| `chance` | Probability per kill, 0.0..1.0          |

Soft-depend — drops silently no-op when VaultCrates isn't loaded. The first kill after server start logs a one-time INFO line so admins notice if their key drops aren't firing.

See VaultCrates integration → for the full setup.

### A complete worked example

```yaml
presets:

  goblin_camp:
    display-name: "<dark_green>Goblin Camp</dark_green>"
    provider: mythicmobs
    enabled: true
    allow-empty: false
    cycle-cage-mobs: false      # MythicMobs can't render in the cage
    griefing-protection: false  # everyone can mine + relocate
    normal-mobs:
      - Goblin
      - GoblinArcher
    ominous-mobs:
      - GoblinChief
      - GoblinShaman
    key-drops:
      - { crate: "common", tier: "normal", chance: 0.15 }

  legendary_dragon_lair:
    display-name: "<gradient:red:gold><b>Dragon's Lair</b></gradient>"
    provider: vanilla
    enabled: true
    allow-empty: false
    cycle-cage-mobs: true
    griefing-protection: true   # premium — only original placer can mine
    normal-mobs:
      - minecraft:vex
      - minecraft:phantom
    ominous-mobs:
      - minecraft:wither
    key-drops:
      - { crate: "legendary", tier: "ominous", chance: 0.10 }
```

### Validation

The loader is **lenient** — a single bad entry logs a warning with the offending preset path and skips that preset. The rest of the file still loads. Fix the typo and `/tcpws reload`.

```
[WARNING] wild-presets.yml: preset 'goblin_camp' has unknown provider 'mythic' — skipped. Valid: vanilla, mythicmobs, elitemobs, ecomobs, levelledmobs, infernalmobs, citizens
```

***

Next: **Custom mobs →** · **The admin GUI →**


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://darkstarworks.gitbook.io/plugins/mc/tcp-documentation/tcp-wildspawners/installation/wild-presets.yml.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
