Skip to content

zones.yml

zones.yml is where your zones live. A zone declared here can be started with /sh start <id> and stopped with /sh stop <id>, by a player or from the console, which is what lets schedulers and event plugins drive it.

After editing by hand, run /sh reload, then /sh info <id> to see what SomaHider actually read.

Four fields. Everything else is optional.

zones.yml
zones:
arena:
world: events
center:
x: 1500
z: 1500
radius: 150
zones.yml
zones:
kothjapon:
world: events
center:
x: 1500
z: 1500
radius: 150
duration: 30m
max_duration: 1h
schedule:
- days: [friday, saturday]
start: '21:00'
stop: '22:30'
triggers:
start_on_chat: '&6&lKoTH &f* The &7Japan &fKoTH has begun!'
stop_on_chat: '&6&lKoTH &f* The &7Japan &fKoTH is over\.'
reveal:
- type: same_placeholder
placeholder: "%factionsuuid_faction_name%"
disguise:
name: {value: '%factionsuuid_faction_name%'}
skin: '%factionsuuid_faction_leader%'
disguise:
show_armor: false

The key of the section is the zone id, and it is what every command takes.

RuleDetail
Charactersa-z, 0-9, _ and -. Uppercase is lowered for you.
Length1 to 32 characters.
Not allowedAn id made only of digits, or one already used by another zone.

A rejected id means the whole zone is skipped, and the reason is logged.

KeyRequiredValue
worldYesName of the world. The zone will not start while that world is unloaded.
center.xYesBlock coordinate of the centre.
center.zYesBlock coordinate of the centre.
radiusYes1 to 512 blocks.

There is no y and no height limit. The zone is a circle on x and z, so it covers every height at once.

KeyValue
durationHow long a run lasts by default. Omit it to run until stopped.
max_durationCeiling for this zone, whatever duration is asked for. none removes the ceiling.

Durations are written like 20m, 1h30m or 2h.

Three values decide when a run ends: what was asked for (from /sh start <id> <duration>, or the zone’s own duration), the zone’s max_duration, and default_max_duration from config.yml when the zone sets no ceiling. The run lasts the shorter of the requested duration and the ceiling that applies.

That last part catches people out: a zone with no duration and no max_duration still stops after two hours, because default_max_duration ships at 2h.

always_on: true

The zone starts with the server and stays up. SomaHider ignores duration, max_duration, schedule and triggers on such a zone, and logs that it did.

A list of weekly slots, checked against the server clock. See running a zone on a weekly schedule.

FieldRequiredValue
daysYesList of day names, or daily. Three-letter forms accepted.
startYesTime of day, quoted, like '21:00'.
stopNoTime of day. A stop earlier than start means the next day.

A slot whose stop equals its start is rejected. Slots missed while the server was down are not replayed on boot.

Regular expressions matched against outgoing chat messages. See starting a zone from a chat message.

FieldValue
start_on_chatPattern that starts the zone.
stop_on_chatPattern that stops it.

At least one of the two is needed, or the block is ignored. Colour codes are written with &. A pattern with no colour code can be typed by a player in chat, and SomaHider warns about it on load.

A list of exceptions to the disguise, tried in order until one matches. See letting some players recognise each other.

FieldApplies toValue
typeAllpermission, same_placeholder, match or relational.
nodepermissionThe permission node the viewer must hold.
placeholderThe other threeA placeholder written %expansion_params%.
equalsmatch, relationalOne value or a list. Values written %...% are resolved globally. Case is ignored.
disguiseAllOptional. A disguise shown instead of the real player when the rule matches.

A relational placeholder must start with %rel_.

Overrides the disguise from config.yml for this zone. Only the keys you write are overridden, the rest is inherited. Same keys as the global section, described in changing how hidden players look.

A bad zone is skipped and the rest of the file still loads, so one typo does not take down your other zones. SomaHider logs one line per problem, on startup and on every /sh reload, naming the zone and the field:

zones.yml: zones.arena: radius must be between 1 and 512
zones.yml: zones.arena: reveal[0] relational placeholders start with %rel_
zones.yml: zones.kothjapon: duplicate id

/sh reload reports the same problems in chat, and /sh info <id> marks a zone as broken when it could not be read at all.

Two mistakes account for most of these:

SymptomCause
A schedule slot is silently missingThe time was not quoted, so YAML read 21:00 as a number.
The zone loads but never triggersThe pattern lost its colour codes, or a . was left unescaped in a place that matters.