Skip to content
ShadowMC

Configuration

ShadowGames

Thirty-two minigames on one engine, fourteen arenas playable tonight.

Premium v1.0.4

Where the files are

plugins/ShadowGames/

The plugin creates them on first start and updates them by itself on new versions, keeping your changes.

Applying changes

/sg reload [what]

Reloads the files without restarting the server.

What’s inside

138 files · 1,636 settings

Start with: config.yml

Settings

The files that decide how the plugin behaves. Start here.

config.yml

General settings
199 settings
plugins/ShadowGames/config.yml
File notes

Only the server-wide settings live here. Everything else has its own file:

games/<game>.yml         the rules of one game
arenas/<game>/<id>.yml   one map
kits/<game>/<id>.yml     one kit
shops/<game>.yml         one shop
lang/<locale>.yml        the translations
chatgames.yml            the chat games: questions, words, prizes
schematics/              your builds

THE THREE-LEVEL RULE

Almost every value can be written in three places, and the most specific one wins:

config.yml (here, under "defaults") ->  every game
games/<game>.yml                    ->  that game
arenas/<game>/<arena>.yml           ->  that map

A value left out does NOT mean zero: it means "inherit". /sg config <key> tells you where a value actually comes from.

COLOURS - written the Minecraft way, with &

&0-&9 &a-&f  colours    &l bold       &o italic  &n underline
&#ff8800     an exact colour           &r  back to normal
&&           a literal ampersand

The richer tags are still there for what & cannot do:

<gradient:#FFD700:#FFA500>GOLD</gradient>
<click:run_command:'/play skywars'>play</click>

UPDATES: when a new version changes this file, chatgames.yml, or one in lang/, games/, kits/, shops/, cosmetics/, achievements/, music/, import/ or parkour/, it is moved to the new version for you. Everything you changed or added is carried over; the settings you never touched take the new defaults. Your previous file is kept in backup/<date>/, and if something could not be carried over (an option that no longer exists, a value of a different kind) you find it in PORTING-<version>.txt, with what to do. Arena files are not updated: they stay as they are.

Full documentation: docs/

config-version1
core5 keys
server-id"games-1"

Identifies this server when several servers share one database.

server-ip""

Shown at the bottom of the sidebar through %server_ip%.

Empty on purpose. The alternative was shipping a made-up address and letting it be read by the players of everybody who installs this: a sidebar that advertises somebody else's server. While it is empty the line is not drawn at all, so nothing looks broken - write yours in and it appears.

language"en_US"

The language used when no better one is known. The plugin ships en_US and it_IT; add a file to lang/ for any other.

follow-client-localetrue

Every player sees their own client language, when that file exists.

update-checktrue

Storage

Nothing to do: on first start a local H2 database appears in data/shadowgames.mv.db. No user, no password, nothing to install.

If you have a MySQL and prefer it, set enabled: true and fill the fields. The tables create themselves on the first connection.

storage5 keys
storage.mysql7 keys
enabledfalse
host"127.0.0.1"
port3306
database"shadowgames"
username""
password""
storage.mysql.properties3 keys
useSSLfalse
characterEncoding"utf8mb4"
serverTimezone"UTC"
storage
table-prefix"sg_"

Table prefix. Useful when several servers share one database.

fallback-to-localtrue
true  -> if MySQL does not answer, fall back to H2 and say so in the console.
         A server that plays without saving beats a server that will not start.
false -> if MySQL does not answer, the plugin refuses to start.
use-suite-databasefalse

If ShadowEssentials is installed and uses a database, we can share it: one pool, one backup, and the prefix keeps the tables apart.

storage.pool6 keys
maximum-size10

Rule of thumb: (CPU cores * 2) + 1, never above 20.

minimum-idle2
connection-timeout10s
idle-timeout10m
max-lifetime30m
leak-detection0s

Above 0 it logs connections that never come back to the pool.

Lobby

lobby6 keys
location""

Where a player lands when they leave a match. Empty = the main world spawn. /sg lobby sets it where you stand.

use-shadowessentials-spawntrue

When ShadowEssentials is present we ask it for the spawn instead of repeating it here.

locations{ }

Several lobbies, each with a name. A server outgrows a single spawn point fast: one lobby with a parkour in it, a plain one for events, one per game so that leaving BedWars puts you back among the BedWars signs and not in the middle of the hub.

You set them by standing there: /sg lobby set <name> "main" is the one everything falls back to when nothing else is said.

per-game{ }

Which lobby someone leaving a given game returns to. With no line here, "main" is used.

lobby.parkour3 keys

The lobby parkour courses: something to do while the countdown runs. They are not matches, they are furniture -- always there, and stepping off one costs nothing.

You build them by walking them, not by typing coordinates:

/sg parkour set <id> start
/sg parkour set <id> checkpoint   (at every landing)
/sg parkour set <id> finish
enabledtrue
folder"parkour"
particlestrue
lobby.waiting-items4 keys

What a player holds while waiting for the start.

lobby.waiting-items.02 keys
materialCOMPASS
name"lang:lobby.item.team"
lobby.waiting-items.12 keys
materialCHEST
name"lang:lobby.item.kit"
lobby.waiting-items.72 keys
materialPAPER
name"lang:lobby.item.vote"
lobby.waiting-items.82 keys
materialRED_BED
name"lang:lobby.item.leave"

Values every game inherits

Every game and every arena can override them.

defaults11 keys
countdown30s
countdown-full10s

When the arena is full the countdown drops to this.

grace-period10s

No PvP for the first seconds: a bad spawn landing should not lose the game.

max-duration20m

A hard ceiling. A match that never ends is worse than one that ends badly.

end-duration10s

How long the end screen stays up.

allow-rejoin60s

Reconnect within this and you are back where you were.

respawn-delay3s
assist-window10s

For how many seconds after a hit a death still counts for whoever landed it. This is how "knocked into the void" becomes a kill.

friendly-firefalse
buildtrue
lives1

Match worlds

Every match gets its own world, created empty and filled from schematics. A reset is deleting a folder, not rolling anything back.

worlds10 keys
prefix"sg_"

Prefix for match worlds. Do not use it for worlds of your own.

max-concurrent-matches20

How many matches may run at once across the whole server.

max-instances-per-arena4

How many instances of the same arena may run at once.

preload-instances1

With 1, the world for the next match is ready in advance: nobody ever waits for a paste.

delete-on-closetrue
clean-orphans-on-starttrue

If the server crashed leaving sg_* worlds behind, delete them at startup.

difficultyNORMAL
view-distance8

An arena fits in a few hundred blocks: 12 chunks of view distance would be wasted.

simulation-distance5
worlds.gamerules9 keys

The gamerules of the match world.

Keep reading

In Minecraft 26.2 they were ALL renamed: doDaylightCycle became advance_time, doMobSpawning is spawn_mobs, announceAdvancements is show_advancement_messages, and so on. Here you may write the old name or the new one: the engine translates, and if it truly does not know a name it says so in the console instead of ignoring it in silence.

Silence would be the worst outcome: it would mean mobs spawning in the middle of a SkyWars and the sun moving, with no log line explaining why.

doDaylightCyclefalse
doWeatherCyclefalse
doMobSpawningfalse
doFireTickfalse
mobGriefingfalse
announceAdvancementsfalse
naturalRegenerationtrue
keepInventoryfalse
doImmediateRespawntrue

Schematics

schematics6 keys
folder"schematics"
paste-budget4000

Blocks placed per tick during a paste. Higher = faster and heavier. Look at /sg profile before pushing it above 8000.

slow-down-below-tps18.0

If the server drops below these TPS the budget halves itself, and goes back to normal once the server breathes again.

cachetrue

Schematics stay in memory once read: twenty matches, one read.

cache-size32
cache-ttl30m

In-game setup

setup2 keys
wandEND_ROD
particle-range48

How far the marker particles are visible. Only somebody in a setup session sees them, and only within this radius.

HUD

hud3 keys
hud.scoreboard3 keys
enabledtrue
only-in-matchestrue

A player has one sidebar. With true we only use it inside matches and leave the lobby to ShadowEssentials.

update-ticks10
hud.bossbar1 key
enabledtrue
hud.tablist5 keys
enabledtrue
header
["&b&lSHADOW&f&lGAMES", "&7%game_name% &8| &f%arena_name%"]+1
group-by-teamtrue
spectators-lasttrue

Queues and map choice

matchmaking4 keys
arena-selectionLEAST_PLAYED

WEIGHTED_RANDOM | LEAST_PLAYED | ROTATION | VOTE

LEAST_PLAYED is the one to pick: it is the only one that makes the work of your map builders visible. Weighted random will happily show the same three maps all evening.

prefer-emptyfalse

On a small server it pays to fill one match at a time.

min-fill-before-new-instance0.5

Do not open a new instance while one sits below this percentage.

merge-waitingtrue

Merges two waiting matches when they fit together.

vote3 keys
enabledtrue
candidates4
change-allowedtrue
queue3 keys
enabledtrue
show-progresstrue
max-wait10m
auto3 keys
rejoin-same-gametrue

When a match ends another starts on its own: that is what keeps a server alive.

rejoin-delay5s
back-to-lobby-on-quittrue

Parties

If the server already has a party plugin, AUTO uses that one.

party7 keys
providerAUTO
max-size8
invite-timeout60s
all-or-nothingtrue

A party joins as one block: everyone, or nobody.

keep-togethertrue

And stays on the same team, when it fits.

offline-grace2m

A client crash must not break the group up.

chat-prefix"&d[PARTY] "

Spectators

spectator5 keys
gamemodeSPECTATOR

SPECTATOR | ADVENTURE_INVISIBLE ADVENTURE_INVISIBLE is for servers where seeing through walls counts as too much of an advantage even for a dead player.

night-visiontrue
confinedtrue
max-distance300
spectator-chattrue

Rewards

Game coins are kept apart from the server economy, on purpose.

rewards8 keys
enabledtrue
economy-bridgefalse

With true, every game coin also mints real currency.

economy-bridge-rate0.1
currency"default"
vip-multiplier-perk"games.reward-multiplier"

Perk read from ShadowEssentials; without it, from the shadowgames.perk.* nodes

global-multiplier1.0

A permanent multiplier, for servers that want fast progression.

announce-multipliertrue
forfeit-on-quitfalse

Does leaving early lose what you earned? No: punishing somebody whose client crashed is unfair.

economy1 key
free-when-missingtrue

With no economy installed: true = paid kits become free, false = they stay locked.

progression3 keys
enabledtrue
xp-curve"500 * level ^ 1.15"

How much experience level N costs.

max-level200

Mobs and bosses in arenas

An arena can have creatures: place the MOB_SPAWN markers and write here, or in the game file, or in the arena file, what they are. The parameter written on the marker is the key.

Keep reading

The id can come from any installed plugin:

mythicmobs:SkeletalKnight     MythicMobs
elitemobs:BossName            EliteMobs
zombie                        vanilla

LevelledMobs, InfernalMobs and the like need no call: they listen for a vanilla mob spawn and dress it themselves. Spawning "zombie" is enough.

mobs2 keys
enabledtrue
spawns{ }

The real entries usually live in the game or the arena file. Below is a commented example of the shape.

guardian:
  id: "mythicmobs:SkeletalKnight"
  amount: 1
  level: 1
  name: "&cGuardian"
  glowing: true
  respawn: 30s        # 0 or absent = never comes back
  reward: { coins: 25, xp: 10, commands: [] }
boss:
  id: "mythicmobs:BlackDragon"
  name: "&4&lTHE DRAGON"
  glowing: true
  boss-bar: true
  boss-bar-color: PURPLE
  reward: { coins: 500, xp: 250 }

Music

Tracks live in music/<name>.yml. There are two kinds and they live together, because each solves what the other cannot:

Keep reading
- NOTE BLOCK MELODY: the notes written in the file, played with the
  sounds every client already has. No resource pack, nothing to
  download, works straight away for everyone.
- RESOURCE PACK SOUND: real audio, any length. But a plugin cannot
  send audio to a client: the file has to sit in a pack the server
  hands out. See music/custom-pack-example.yml.

Everything goes through the RECORDS channel, so somebody who turns the "music" slider down turns ours down and not the game sounds they need in order to play.

music2 keys
enabledtrue
folder"music"

Cosmetics

Effects you can see and nothing more. The rule is strict on purpose: a cosmetic cannot give damage, speed, invisibility or any advantage at all, and the parser gives it no way to even write one. They are files like kits, in cosmetics/<type>/, with the same unlock rule.

cosmetics3 keys
enabledtrue
folder"cosmetics"
trail-every-ticks2

How often a walking trail is drawn, in ticks. 2 is smooth, 4 is half the cost and nobody notices. A trail is never drawn for a player standing still.

Network (several servers)

Only needed to split the minigames across servers: SkyWars on one, BedWars on another, a lobby in front of them all.

Keep reading

The ONLY thing the servers share is the database. There is no master, no socket, nothing to keep in sync: every server writes what it is and what it is doing every few seconds, and reads what the others wrote. A server that dies stops writing and drops off the list, and nobody has to notice.

REQUIRED: a shared storage.mysql. H2 is a file opened by one process only: two servers pointing at it share nothing, they break it. Turn the network on with H2 and the plugin says so and turns it off.

The proxy (Velocity or BungeeCord) is only there to move players. Without one the network still works: stats, leaderboards and tournaments stay shared, but /play cannot send you elsewhere.

network7 keys
enabledfalse
roleGAMES
GAMES  = hosts matches (the default)
LOBBY  = selector, signs and NPCs only: every /play starts here
NONE   = shares the stats only
display-name"server-1"

What this server is called IN THE PROXY. It has to match the name written in velocity.toml or the Bungee config.yml, or the transfer arrives nowhere. The real id is core.server-id.

capacity0

0 = use the server's max-players

heartbeat5s
stale-after20s

how long a silent server waits before it counts as dead

ticket-life60s

how long a transfer "ticket" stays valid

Ranked

An Elo rating per game, with divisions and seasons. Turned on one game at a time (ranked.enabled inside games/<game>.yml), because it only makes sense where skill decides the result: a ranked Block Party is a lottery with a number attached.

ranked9 keys
enabledtrue
start-rating1000
k-factor24

How much one match weighs. Higher = you climb and fall quickly. For the first 10 matches it is tripled, so the initial placement is fast; above 1600 points it drops, because the population at the top is thin and the climb must not come down to luck.

min-players2
match-window150

How far apart two players may be and still share a match. The window widens by 50 points every 10 seconds of waiting: a perfect match that never starts is worse than a slightly uneven one.

match-window-max800
decay-grace14d

Decay for inactivity: without it the top of the leaderboard fills up with people who stopped playing.

decay-per-day2
ranked.divisions8 keys
bronze
{ display-name: "lang:content.division.bronze", minimum: 0, icon: COPPER_INGOT, color: "&8" }+3
silver
{ display-name: "lang:content.division.silver", minimum: 900, icon: IRON_INGOT, color: "&7" }+3
gold
{ display-name: "lang:content.division.gold", minimum: 1100, icon: GOLD_INGOT, color: "&6" }+3
platinum
{ display-name: "lang:content.division.platinum", minimum: 1300, icon: DIAMOND, color: "&b" }+3
diamond
{ display-name: "lang:content.division.diamond", minimum: 1500, icon: DIAMOND_BLOCK, color: "&3" }+3
master
{ display-name: "lang:content.division.master", minimum: 1750, icon: NETHERITE_INGOT, color: "&5" }+3
champion
{ display-name: "lang:content.division.champion", minimum: 2000, icon: NETHERITE_BLOCK, color: "&c" }+3
legend
{ display-name: "lang:content.division.legend", minimum: 2300, icon: NETHER_STAR, color: "&e" }+3

Tournaments

A tournament match is an ordinary match: same arenas, same games, same rules. The tournament only decides who is in it and what to do with the result -- which is why all 32 games can be played as a tournament without any of them knowing what a tournament is.

tournaments4 keys
enabledtrue
min-entrants4
between-rounds30s
tournaments.reward3 keys
coins5000
xp2000
commands[ ]

Achievements

Thresholds on stats that already exist. Files in achievements/<game>/, or achievements/global/ for the ones that count across every game.

achievements3 keys
enabledtrue
folder"achievements"
broadcasttrue

Announces to the whole server the final tier of an achievement with broadcast: true. The tiers in between are never announced.

Import

The reader maps for other plugins live in import/. They are ordinary files: fix them, add to them, delete them.

import1 key
folder"import"

Stats

The thresholds below exist for one reason: without them two players can farm wins by starting and abandoning a match every twenty seconds, and every leaderboard on the server becomes meaningless.

stats3 keys
min-duration30s
min-players2
autosave5m

Periodic save: a long match that crashes must not wipe out an hour of play.

leaderboards4 keys
refresh5m
hologram-refresh1m

How often the /sg holo holograms are rewritten. They read the cache above, not the database: ten leaderboards cost ten strings.

cache-size64
ignore-inactive-after90d

Protection

Inside a match world there is nothing to configure: these are engine rules, not region flags.

protection4 keys
deny-outsiderstrue

Anyone not in the match touches nothing inside a match world.

original-blocks-unbreakabletrue

The arena's original blocks cannot be broken, the ones players placed can. The engine knows because it records what was placed.

block-external-teleporttrue

A player in a match takes no teleport from other plugins.

allowed-commands
[/leave, /esci, /games, /giochi, /gstats, /gtop, /party, /p, /pc, /msg, /r, /tell, /spectate, /spec, /gkit, /shop]+13

Every other command is blocked during a match. A whitelist on purpose: there is no way to list every command of every plugin that might heal, hand out items or teleport.

Join signs

A sign with [SG] on the first line and the game name on the second.

signs4 keys
enabledtrue

When off they do not update and right-clicking does not join.

update1s

How often they are rewritten. A sign is only rewritten when something changed, so even 10t on a wall of signs costs nothing.

signs.lines6 keys

The four lines, one list per match state. A sign line holds about fifteen characters: these fit.

Keep reading
%game_name%   game name               %players%     players in it right now
%game_short%  short game name         %max%         total slots
%game_id%     id (skywars, oitc)      %min%         how many to start
%arena_name%  arena name              %free%        free slots
%state%       state (WAITING, ...)    %alive%       still alive
%state_name%  state in words          %spectators%  who is watching
%countdown%   seconds to the start    %time_left%   time left to the end
%time%        seconds to the start if starting, play time if running

The full name of some games does not fit ("One in the Chamber" is wider than a line): signs use %game_short%, menus use the whole name.

WAITING
["lang:content.sign.waiting.top", "&f%game_short%", "&7%arena_name%", "lang:content.sign.waiting.bottom"]+3
COUNTDOWN
["lang:content.sign.countdown.top", "&f%game_short%", "lang:content.sign.countdown.seconds", "lang:content.sign.countdown.bottom"]+3
PREPARING
["lang:content.sign.running.top", "&f%game_short%", "&7%arena_name%", "lang:content.sign.preparing.bottom"]+3
RUNNING
["lang:content.sign.running.top", "&f%game_short%", "lang:content.sign.running.time", "lang:content.sign.running.bottom"]+3
ENDING
["lang:content.sign.ending.top", "&f%game_short%", "&7%arena_name%", "lang:content.sign.ending.bottom"]+3
RESETTING
["lang:content.sign.resetting.top", "&f%game_short%", "&7%arena_name%", "lang:content.sign.resetting.bottom"]+3
signs.block-behind6 keys
WAITINGLIME_CONCRETE
COUNTDOWNYELLOW_CONCRETE
PREPARINGRED_CONCRETE
RUNNINGRED_CONCRETE
ENDINGGRAY_CONCRETE
RESETTINGGRAY_CONCRETE

Performance

The guards below protect the server from itself. See docs/22-PERFORMANCE.md

performance3 keys
profilertrue
performance.entities4 keys
item-despawn60s

More aggressive than vanilla, on purpose.

arrow-despawn10s
max-per-match400
remove-below-y-32
performance.guards3 keys
slow-tps18.0

Below these TPS the engine defends itself.

critical-tps15.0
slow-hook-millis50

A game hook slower than this gets logged.

bStats (anonymous usage statistics, https://bStats.org)

What is sent, every 30 minutes: a random server id (serverUuid, not derived from anything), the plugin version, the Minecraft/Paper and Java versions, the operating system and core count, the online mode, how many players are online (a number only) and the licence tier (free/premium/creator). NO player data: no names, no UUIDs, no addresses, no stats. Nothing is sent while the plugin waits for a licence. false switches off this plugin only. enabled: false in plugins/bStats/config.yml switches off every bStats plugin on the server at once.

metrics1 key
enabledtrue

Licence

With no key the plugin runs the free edition: the whole engine, five games, size limits. A signed key unlocks everything. The key does NOT go here: it goes in license.yml, which appears on first start, so a config shared for support does not carry it along.

license3 keys

THE KEY LIVES IN license.yml (same folder as this file), or in the central plugins/ShadowControl/licenses.yml for the whole suite. The 'key' below is only a fallback for deploy systems that generate config.yml: leave it empty.

The key does NOT live here: it lives in license.yml, in this folder, written at first start (or in plugins/ShadowControl/licenses.yml for the whole suite). Only if you would rather keep it in the config than in license.yml. The SHADOWGAMES_LICENSE environment variable and the system property -Dshadowgames.license=... work as well.

grace-days7

Days of grace before falling back to free when a subscription expires or when the server address does not match the licence.

resolve-public-iptrue

One call, at startup, to the licence service (activation-url + /ip) to learn this server's public address: behind NAT it is the only way to recognise it. If you turn it off and the licence is bound to a domain, lean on the grace period. Only when a licence is installed: a server without a key asks nobody. false = never ask.

activation-url'https://shadow-licences.riccardobotins.workers.dev'

Activation service, optional. This is the BASE address: the plugin appends /claim and /check itself.

Keep reading

Leave it empty and the check is fully offline, with the key pasted in by hand. If you set it:

/sg license claim <code>     the server asks for the licence itself,
                             already bound to its own addresses
every 15 minutes             re-checks that it was not withdrawn

It is also the only way to count seats and to revoke a key the same day. See docs/38-LICENZA-E-VERSIONI.md

chatgames.yml

Chatgames
60 settings
plugins/ShadowGames/chatgames.yml
File notes

Chat games: every few minutes the chat gets a small contest and the first player to type the right answer wins.

trivia         a question, one or more accepted answers
math           a sum to work out: + - x /, always a whole result
unscramble     a word with its letters shuffled
type-fast      a word or a code to copy, first one wins
reverse        a word to write backwards
fill-in        a word with some letters hidden
guess-number   a secret number; each guess is told, privately,
               "higher" or "lower"

WHAT PLAYERS READ lives in lang/<locale>.yml under "chatgames": the start lines, the winner line, the title and the sound. Empty a key to turn that part off, as with every other message of the plugin.

ONE TEXT, SEVERAL LANGUAGES. A question, an answer or a word can be written once:

question: "Which mob explodes?"

or once per language:

question: { it: "Quale mob esplode?", en: "Which mob explodes?" }

Each player reads the language of their client (or the server's), and may answer in ANY of the languages written. A language missing from a text falls back to the server language, then to English.

ANSWERS are compared without caring about capitals, accents, apostrophes, double spaces and a final full stop: "Citta'", "citta" and the accented one are the same answer.

REWARDS are written exactly like the rewards of a game (games/<game>.yml):

rewards:
  coins: 25              ShadowGames coins
  xp: 50                 ShadowGames experience
  money: 100             server money: ShadowEconomy or Vault.
                         Without an economy it is skipped (the
                         console says so once), the rest is paid.
  tokens:                ShadowEconomy currencies by id, the event
    event_token: 2       token included. Needs ShadowEconomy.
  items:                 the item syntax of kits and shops;
    - "DIAMOND:2"        custom items too: "itemsadder:ruby",
    - { material: "oraxen:ruby", name: "&cRuby" }
                         "nexo:...", "oraxen:...",
                         "shadowcustomizer:<id>", ...
                         A full inventory drops them at the feet.
  commands:              run by the console, %player% = winner
    - "say %player% is quick!"
  message: "&aExtra line for the winner"
  sound: "entity.player.levelup"

The most specific block wins, and replaces the others (no mixing):

a trivia question / a math level  >  the type  >  this file.

"rewards: {}" means "nothing" on purpose; no "rewards" key means "inherit".

Commands:
    /chatgames                  the current game again, or when the
                                next one comes
    /chatgames toggle|on|off    hide or show chat games (saved)
    /sg chatgame start [type]   start one now (also /chatgames start)
    /sg chatgame stop|list|reload
Permissions: shadowgames.chatgames.play (everybody),
             shadowgames.chatgames.admin (op).
Wins: /gtop chatgames chat_wins, %shadowgames_chatgames_wins%,
      %shadowgames_chatgames_wins_<type>%.
config-version1
enabledtrue

The whole feature. False: no game starts, not even by command.

When

schedule5 keys
enabledtrue

False: games start only with /sg chatgame start.

interval10m

One game every interval, give or take the jitter (10m +/- 2m means anywhere between 8 and 12 minutes). Counted from the end of the previous game.

jitter2m
first-delay3m

The first game after a start or a reload.

min-players2

Fewer players than this who can take part: that game is skipped and the next one is tried an interval later. A command start ignores it.

Who takes part

Online, with shadowgames.chatgames.play, not hiding chat games, and in one of these worlds (empty list: every world).

worlds[ ]
exclude-in-matchfalse

True: players inside a ShadowGames match (playing or watching) are not shown chat games and cannot answer. False by default: the chat is shared anyway, and the start has no title, so a fight is not covered by it. Turn it on if your matches are long and busy.

How

answer-time30s

Time to answer, unless the type says otherwise with its own "time".

cancel-winning-messagetrue

The line with the right answer is taken out of the chat, so nobody else can copy it. Wrong answers stay visible.

apply-multiplierstrue

The global, event, VIP and booster multipliers of ShadowGames apply to the coins, xp and money of a chat game, as they do to a match.

log-to-consoletrue

One line in the console when a game starts (with the answer) and ends.

rewards2 keys

The reward of every type that does not write its own.

coins25
xp50

The types

Each one: enabled, weight (how often it is picked: 30 is three times as likely as 10), time (optional), rewards (optional).

types7 keys
types.trivia4 keys
enabledtrue
weight30
time30s
questions
[{ question: {…}, answers: […] }, { question: {…}, answers: […] }, { question: {…}, answers: […] }, { question: {…}, answers: […] }, { question: {…}, answers: […] }, { question: {…}, answers: […] }, { question: {…}, ans …+26
question

A question can carry its own reward: it replaces the reward of the type for this question only.

types.math5 keys
enabledtrue
weight25
time25s
allow-negativefalse

False: a subtraction never has a negative result.

types.math.difficulties3 keys

numbers: the range of the two numbers of a + or a -.

factors: the range of the two numbers of a x, and of the divisor and
         the result of a / (the division always comes out whole).

operations: any of "+", "-", "*", "/". A level can have its own "rewards".

types.math.difficulties.easy3 keys
weight50
operations[+, "-"]
numbers[1, 30]
types.math.difficulties.medium4 keys
weight35
operations[+, "-", "*"]
numbers[10, 99]
factors[2, 12]
types.math.difficulties.hard5 keys
weight15
operations[+, "-", "*", /]
numbers[100, 999]
factors[3, 20]
types.math.difficulties.hard.rewards2 keys
coins50
xp100
types.unscramble4 keys
enabledtrue
weight20
time40s
hinttrue

At half time, the first letter of the word.

Its own list of words; without this line, the "words" at the bottom. words: [ ... ]

types.type-fast5 keys
enabledtrue
weight15
time20s
sourceboth
words: a word from the list at the bottom, in the reader's language.
code:  a random code like K7PX2M.
both:  one or the other, at random.
code-length8
types.reverse3 keys

A word is shown and has to be written backwards: DIAMOND -> dnomaid.

enabledtrue
weight10
time30s
types.fill-in4 keys
enabledtrue
weight15
time40s
hidden0.4

How many of the letters are hidden: 0.4 = about four in ten, always at least one hidden and one shown.

types.guess-number7 keys
enabledtrue
weight10
time60s
min1
max100
max-guesses5

Guesses per player; 0 = no limit.

hide-guessesfalse

True: every guess leaves the chat, not only the right one.

Words

Used by unscramble, type-fast, reverse and fill-in (a type can have its own "words" list instead). One word per line: a plain word when it is the same in every language, { it: ..., en: ... } otherwise. A word that does not suit a type is left out of that type only: one with a single repeated letter cannot be shuffled, one that reads the same backwards is no game for reverse.

words
[{ it: diamante, en: diamond }, { it: smeraldo, en: emerald }, { it: ossidiana, en: obsidian }, creeper, enderman, netherite, ghast, blaze, slime, cactus, { it: scheletro, en: skeleton }, { it: ragno, en: spider }, { it …+45

games/battleroyale.yml

Minigame: Battle Royale
41 settings
plugins/ShadowGames/games/battleroyale.yml
enabledtrue
countdown45s
max-duration25m
lives1
buildtrue
drop5 keys
enabledtrue
height200
elytratrue
remove-elytra-on-landtrue
free-jumptrue
zone3 keys

The pause between one shrink and the next is what lets you plan a route; the announced circle is what turns running away into a decision.

particlestrue
show-nexttrue
phases
[{ wait: 3m, shrink: 2m, to: 400, damage: 1 }, { wait: 2m, shrink: 2m, to: 250, damage: 2 }, { wait: 90s, shrink: 90s, to: 150, damage: 4 }, { wait: 60s, shrink: 60s, to: 60, damage: 6 }, { wait: 45s, shrink: 45s, to: 2 …+5
markers4 keys
BEACON"CENTER"
CHEST"LOOT_CHEST:common"
TRAPPED_CHEST"LOOT_CHEST:rare"
GOLD_BLOCK"DROP_ZONE"
events
[{ at: 5m, type: SUPPLY, count: 2 }, { at: 10m, type: SUPPLY, count: 2 }, { at: 15m, type: SUPPLY, count: 3 }]+2
loot2 keys
loot.common3 keys
min-stacks3
max-stacks6
entries
[{ item: {…}, weight: 22 }, { item: {…}, weight: 8 }, { item: {…}, weight: 14 }, { item: {…}, weight: 20, amount-range: […] }, { item: {…}, weight: 20 }, { item: {…}, weight: 10 }, { item: {…}, weight: 22, amount-range: …+7
loot.rare3 keys
min-stacks5
max-stacks8
entries
[{ item: {…}, weight: 8, unique: true }, { item: {…}, weight: 6, unique: true }, { item: {…}, weight: 12 }, { item: {…}, weight: 20, amount-range: […] }, { item: {…}, weight: 3, unique: true }, { item: {…}, weight: 10, …+6
downed3 keys
enabledtrue
time45s
revive-time6s
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&6&lBATTLE ROYALE"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.battleroyale.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "", "lang:content.board.next-event", "&7%next_event_time%", "&8 …+11
ENDING
["&8&m ", "lang:content.board.battleroyale.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "% …+8
rewards4 keys
win{ coins: 300, xp: 700 }
lose{ coins: 20, xp: 40 }
kill{ coins: 20, xp: 45 }
play{ coins: 8, xp: 15 }

Ranked

Plenty of variance, but the average placement says something. The general settings (starting rating, divisions, decay) live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"entity.wither.spawn"
kill"entity.player.levelup"

games/bedwars.yml

Minigame: BedWars
89 settings
plugins/ShadowGames/games/bedwars.yml
File notes

Defend your bed, break the others, buy everything else. Full reference: docs/giochi/bedwars.md

enabledtrue
countdown30s
countdown-full10s
grace-period0s
max-duration45m
end-duration12s
respawn-delay5s
friendly-firefalse
buildtrue

Beds

beds3 keys
require-toolfalse

A bed breaks bare-handed: demanding a tool only stretches the window in which a defender can arrive, and that is not what makes defence interesting.

own-bed-protectedtrue
broadcasttrue

Final kill

Dying with no bed puts you out. It is worth more than a normal kill, and it shows.

final-kill1 key
reward-multiplier2.5

Generators

team    -> the ones inside the bases, one per team, upgraded at the
           upgrade villager
neutral -> the ones in the middle, the same for everyone, levelling
           up over time

max-nearby is the rule that keeps the server standing: without it an abandoned base piles up thousands of ingots on the floor.

generators2 keys
generators.team3 keys
generators.team.iron6 keys
resourceIRON_INGOT
interval1.2s
amount1
max-nearby48
share-with-teamtrue
generators.team.iron.tiers4 keys
1{ interval: 1.2s }
2{ interval: 0.8s }
3{ interval: 0.5s, amount: 2 }
4{ interval: 0.4s, amount: 2 }
generators.team.gold6 keys
resourceGOLD_INGOT
interval6s
amount1
max-nearby16
share-with-teamtrue
generators.team.gold.tiers4 keys
1{ interval: 6s }
2{ interval: 4s }
3{ interval: 3s }
4{ interval: 2.5s }
generators.team.emerald5 keys
resourceEMERALD
interval0s

0 = off until the forge reaches the level that turns it on.

max-nearby8
share-with-teamtrue
generators.team.emerald.tiers4 keys
1{ interval: 0s }
2{ interval: 0s }
3{ interval: 45s }
4{ interval: 35s }
generators.neutral2 keys
generators.neutral.diamond7 keys
resourceDIAMOND
interval30s
max-nearby8
hologramtrue
hologram-lines
["lang:content.generator.diamond", "lang:hologram.generator.tier", "lang:hologram.generator.in-seconds"]+2
generators.neutral.diamond.spawn-effect2 keys
particleHAPPY_VILLAGER
sound"block.note_block.pling"
generators.neutral.diamond.tiers3 keys
1{ interval: 30s }
2{ interval: 23s }
3{ interval: 12s }
generators.neutral.emerald6 keys
resourceEMERALD
interval65s
max-nearby4
hologramtrue
hologram-lines
["lang:content.generator.emerald", "lang:hologram.generator.tier", "lang:hologram.generator.in-seconds"]+2
generators.neutral.emerald.tiers3 keys
1{ interval: 65s }
2{ interval: 50s }
3{ interval: 30s }

Shop

The layout lives in shops/bedwars.yml

shop2 keys
file"shops/bedwars.yml"
shop.npc2 keys
enabledtrue
typeVILLAGER

Markers

One base schematic is enough for every team: the engine recolours wool, glass, terracotta, bed and banner with the colour of the team assigned to that position.

markers8 keys
RED_WOOL"TEAM_SPAWN"
RED_BED"BED"
IRON_BLOCK"GENERATOR:team"
DIAMOND_BLOCK"GENERATOR:diamond"
EMERALD_BLOCK"GENERATOR:emerald"
GOLD_BLOCK"SHOP_NPC"
LAPIS_BLOCK"UPGRADE_NPC"
BARRIER"NO_BUILD"
protection3 keys
original-blocks-unbreakabletrue
generator-radius4

Put NO_BUILD around the middle generators: without it the first thing players do is wall them in.

build-height-limit25
events
[{ at: 6m, type: GENERATOR_UPGRADE, kind: diamond, tier: 2 }, { at: 6m, type: GENERATOR_UPGRADE, kind: emerald, tier: 2 }, { at: 12m, type: GENERATOR_UPGRADE, kind: diamond, tier: 3 }, { at: 12m, type: GENERATOR_UPGRADE …+6
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&c&lBEDWARS"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.bedwars.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "%repeat_teams%%team_color%%team_name% &8» &f%team_status%", "", "lang:content.board.kills", "", "lang:content.board.next-e …+11
ENDING
["&8&m ", "lang:content.board.bedwars.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%serve …+8
rewards7 keys
win{ coins: 200, xp: 400 }
lose{ coins: 20, xp: 40 }
kill{ coins: 10, xp: 20 }
final-kill{ coins: 25, xp: 50 }
bed-broken{ coins: 50, xp: 100 }
play{ coins: 5, xp: 10 }
per-minute{ coins: 2, xp: 4 }
sounds3 keys
join"entity.experience_orb.pickup"
start"entity.ender_dragon.growl"
kill"entity.player.levelup"

Ranked

Long team matches: the result is far more skill than luck. The general settings (starting rating, divisions, decay) live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

games/bingo.yml

Minigame: Bingo
32 settings
plugins/ShadowGames/games/bingo.yml
enabledtrue
countdown30s
max-duration45m
respawn-delay5s
buildtrue
board4 keys
size5
win-conditionLINE

LINE | FULL | MOST

shared-boardtrue

The same card for everyone is what makes the game competitive: everyone hunts the same things and meets in the same places.

seed0

A fixed seed makes a match repeatable: tournaments need that.

difficulty3 keys
easy10
medium10
hard5
items3 keys
easy
[OAK_LOG, COBBLESTONE, WHEAT, LEATHER, COAL, SAND, CLAY_BALL, EGG, APPLE, RED_MUSHROOM]+7
medium
[IRON_INGOT, GOLD_INGOT, BOOK, BUCKET, COOKED_BEEF, BOW, SLIME_BALL, GLASS, PAPER, REDSTONE]+7
hard
[DIAMOND, ENDER_PEARL, BLAZE_ROD, GOLDEN_APPLE, OBSIDIAN, NAME_TAG, CAKE, SADDLE]+5
rules3 keys
auto-completetrue
pvpfalse
show-otherstrue
markers2 keys
QUARTZ_BLOCK"PLAYER_SPAWN"
BEACON"CENTER"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&a&lBINGO"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.bingo.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "%repeat_teams%%team_color%%team_name% &8» &f%team_status%", "", "lang:content.board.kills", "lang:content.board.completed" …+12
ENDING
["&8&m ", "lang:content.board.bingo.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%server_ …+8
rewards3 keys
win{ coins: 200, xp: 450 }
lose{ coins: 20, xp: 40 }
play{ coins: 8, xp: 16 }

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds2 keys
join"entity.experience_orb.pickup"
start"block.beacon.activate"

Ranked

Too much depends on what turns up: not a leaderboard of skill.

Starting rating, divisions and decay live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledfalse

games/blockparty.yml

Minigame: Block Party
32 settings
plugins/ShadowGames/games/blockparty.yml
enabledtrue
countdown15s
max-duration10m
lives1
buildfalse
rounds5 keys

A round has three beats, and the middle one is the whole game:

1. DANCE    - the music plays and the floor keeps changing
2. STOP     - the music stops, the floor freezes, and the colour
              appears in your hand
3. COLLAPSE - everything that is not that colour disappears
dance-time5

How long the dance lasts before the music stops.

start-time6

How long you have to reach the colour, in the first round.

decrease0.4

How much shorter each round gets, and the floor it never goes below.

min-time1.5
clear-time2
music3 keys
playlist[party, chase]

The tracks to pick from. Empty = a random one out of everything in music/. The files live in music/<name>.yml and can be note block melodies (no resource pack) or sounds from a pack of your own.

stop-instrumentPLING

The sharp note the instant the music stops: the silence has to be an event, not an absence.

victoryvictory
floor5 keys
materials
[RED_WOOL, ORANGE_WOOL, YELLOW_WOOL, LIME_WOOL, LIGHT_BLUE_WOOL, BLUE_WOOL, MAGENTA_WOOL, PINK_WOOL]+5

The called colour also appears as a block in hand, not only as a word: somebody who struggles with colours should not have to guess.

shuffle-each-roundtrue

Without reshuffling, after three rounds everybody knows where to go.

live-shuffletrue

The floor moves DURING the dance too: a few tiles repainted at random now and then, so the ground is never still under your feet and no square is safe for longer than a moment.

It stops dead when the music stops: a tile changing under somebody who already reached their colour would be the game cheating.

shuffle-every4

How many ticks apart, and how many tiles each time. A few at a time: repainting everything at intervals would make the floor flash, and a flashing floor cannot be read.

shuffle-blocks12
markers2 keys
QUARTZ_BLOCK"PLAYER_SPAWN"
WHITE_WOOL"PARTY_FLOOR"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&d&lBLOCK PARTY"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.blockparty.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "lang:content.board.round", "lang:content.board.colour", "lang: …+14
ENDING
["&8&m ", "lang:content.board.blockparty.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%se …+8
rewards3 keys
win{ coins: 60, xp: 140 }
lose{ coins: 8, xp: 16 }
play{ coins: 5, xp: 10 }

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds2 keys
join"entity.experience_orb.pickup"
start"block.note_block.pling"

Ranked

A game of luck and reflexes, not of measurable skill.

Starting rating, divisions and decay live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledfalse

games/bridge.yml

Minigame: The Bridge
31 settings
plugins/ShadowGames/games/bridge.yml
enabledtrue
countdown15s
grace-period0s
max-duration20m
respawn-delay2s
goals-to-win5
friendly-firefalse
buildtrue
kit3 keys

The kit is fixed on purpose: The Bridge is a game of skill, not of gear.

fixed"bridge/default"
infinite-blockstrue
arrow-regen3s
goal2 keys
own-goal-blockedtrue
celebration3s
void1 key
kill-below40

Falling is not a real death: it costs the run and nothing else. That is what keeps the game quick instead of punishing.

markers3 keys
RED_WOOL"TEAM_SPAWN"
END_PORTAL_FRAME"GOAL"
BEACON"CENTER"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&9&lTHE BRIDGE"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.bridge.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "%repeat_teams%%team_color%%team_name% &8» &f%team_status%", "", "lang:content.board.kills", "", "lang:content.board.next-e …+11
ENDING
["&8&m ", "lang:content.board.bridge.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%server …+8
rewards4 keys
win{ coins: 80, xp: 200 }
lose{ coins: 15, xp: 30 }
kill{ coins: 8, xp: 15 }
play{ coins: 5, xp: 10 }

Ranked

Half fighting skill and half movement, but always 1v1 or 2v2. The general settings (starting rating, divisions, decay) live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"entity.ender_dragon.growl"
kill"entity.player.levelup"

games/buildbattle.yml

Minigame: Build Battle
35 settings
plugins/ShadowGames/games/buildbattle.yml
enabledtrue
countdown30s
max-duration20m
build-time6m
vote-time20s
modes3 keys
defaultsolo
solo{ players-per-plot: 1 }
teams{ players-per-plot: 2 }
themes4 keys
difficultymedium
easy
["lang:content.game.buildbattle.theme.house", "lang:content.game.buildbattle.theme.tree", "lang:content.game.buildbattle.theme.boat", "lang:content.game.buildbattle.theme.lighthouse", "lang:content.game.buildbattle.them …+7
medium
["lang:content.game.buildbattle.theme.castle", "lang:content.game.buildbattle.theme.pirate-ship", "lang:content.game.buildbattle.theme.volcano", "lang:content.game.buildbattle.theme.space-station", "lang:content.game.bu …+7
hard
["lang:content.game.buildbattle.theme.industrial-revolution", "lang:content.game.buildbattle.theme.passing-time", "lang:content.game.buildbattle.theme.sea-bed", "lang:content.game.buildbattle.theme.dream", "lang:content …+5
plot4 keys
blocksALL
flytrue
isolatedtrue

If players can see each other, they copy.

options-menutrue
voting5 keys
scale5
anonymoustrue
self-votefalse
shuffletrue
reveal-at-endtrue

A visible total turns the last plots into a popularity contest.

markers2 keys
LIME_WOOL"PLOT"
BEACON"CENTER"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&b&lBUILD BATTLE"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.buildbattle.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "", "lang:content.board.next-event", "&7%next_event_time%", "&8 …+11
ENDING
["&8&m ", "lang:content.board.buildbattle.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%s …+8
rewards3 keys
win{ coins: 300, xp: 600 }
lose{ coins: 40, xp: 80 }
play{ coins: 10, xp: 20 }

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds2 keys
join"entity.experience_orb.pickup"
start"block.beacon.activate"

Ranked

Players do the voting: that is not a rating to rank.

Starting rating, divisions and decay live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledfalse

games/ctf.yml

Minigame: Capture the Flag
32 settings
plugins/ShadowGames/games/ctf.yml
enabledtrue
countdown30s
max-duration20m
respawn-delay5s
captures-to-win3
friendly-firefalse
buildfalse
flag6 keys
wear-on-headtrue
glow-carriertrue
require-own-flag-hometrue

You need your own flag at base to score: that is what makes it a tactical game instead of a race.

ally-touch-returnstrue
return-after30s
carrier-effects[{ type: SLOWNESS, amplifier: 0 }]
markers3 keys
RED_WOOL"TEAM_SPAWN"
RED_BANNER"FLAG"
BEACON"CENTER"
kits2 keys
enabledtrue
folder"ctf"

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&c&lCAPTURE THE FLAG"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "", "lang:content.board.kit", "&8&m …+9
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.ctf.starting", "", "lang:content.board.kit", "&8&m ", "%server_ip%"]+8
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "%repeat_teams%%team_color%%team_name% &8» &f%team_status%", "", "lang:content.board.kills", "", "lang:content.board.next-e …+11
ENDING
["&8&m ", "lang:content.board.ctf.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%server_ip …+8
rewards5 keys
win{ coins: 150, xp: 300 }
lose{ coins: 25, xp: 50 }
kill{ coins: 8, xp: 15 }
capture{ coins: 60, xp: 120 }
play{ coins: 5, xp: 10 }

Ranked

Balanced teams, a clear objective. The general settings (starting rating, divisions, decay) live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"entity.ender_dragon.growl"
kill"entity.player.levelup"

games/dropper.yml

Minigame: Dropper
26 settings
plugins/ShadowGames/games/dropper.yml
enabledtrue
countdown10s
max-duration15m
buildfalse
levels3 keys
auto-detecttrue
modeSEQUENTIAL
time-limit2m
rules4 keys
fall-damagefalse
touch-killstrue
no-elytratrue
no-slow-falltrue
markers3 keys
EMERALD_BLOCK"START"
GOLD_BLOCK"FINISH"
BEACON"CENTER"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&9&lDROPPER"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.dropper.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "", "lang:content.board.next-event", "&7%next_event_time%", "&8 …+11
ENDING
["&8&m ", "lang:content.board.dropper.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%serve …+8
rewards3 keys
lose{ coins: 5, xp: 10 }
win{ coins: 70, xp: 160 }
play{ coins: 5, xp: 10 }

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds2 keys
join"entity.experience_orb.pickup"
start"entity.bat.takeoff"

Ranked

The course never changes: whoever runs it better wins, every time.

Starting rating, divisions and decay live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

games/duels.yml

Minigame: Duels
34 settings
plugins/ShadowGames/games/duels.yml
File notes

Every mode is a kit plus two switches: eight modes cost eight blocks of YAML, not eight classes.

enabledtrue
countdown5s
max-duration10m
rounds1
buildfalse
modes9 keys
defaultclassic
classic
{ kit: "duels/classic", build: false, natural-regen: true }+1
sumo
{ kit: "duels/sumo", build: false, natural-regen: true }+1
bow
{ kit: "duels/bow", build: false, natural-regen: true }+1
uhc
{ kit: "duels/uhc", build: true, natural-regen: false }+1
nodebuff
{ kit: "duels/nodebuff", build: false, natural-regen: true }+1
boxing
{ kit: "duels/boxing", build: false, hits-to-win: 100 }+1
bridge{ kit: "duels/bridge", build: true }
combo{ kit: "duels/combo", build: false }
challenge4 keys
enabledtrue
timeout60s
bettingtrue

Bets use game coins, never the real economy.

max-bet10000
markers2 keys
QUARTZ_BLOCK"TEAM_SPAWN"
BEACON"CENTER"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&e&lDUELS"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.duels.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "", "lang:content.board.next-event", "&7%next_event_time%", "&8 …+11
ENDING
["&8&m ", "lang:content.board.duels.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%server_ …+8
rewards4 keys
kill{ coins: 15, xp: 30 }
win{ coins: 60, xp: 140 }
lose{ coins: 10, xp: 20 }
play{ coins: 5, xp: 10 }

Ranked

A one-on-one: the case where Elo tells the exact truth. The general settings (starting rating, divisions, decay) live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"block.note_block.pling"
kill"entity.player.levelup"

games/eggwars.yml

Minigame: EggWars
59 settings
plugins/ShadowGames/games/eggwars.yml
enabledtrue
countdown30s
max-duration40m
respawn-delay5s
friendly-firefalse
buildtrue
eggs2 keys
own-egg-protectedtrue
broadcasttrue
generators2 keys

The generators sit on the island and upgrade when you click them with resources in hand: that is what forces you home, and it is the real difference between EggWars and BedWars.

generators.tiers3 keys
generators.tiers.iron5 keys
resourceIRON_INGOT
interval4s
max-nearby48
hologramtrue
generators.tiers.iron.tiers3 keys
1{ interval: 4s }
2{ interval: 2s }
3{ interval: 1s, amount: 2 }
generators.tiers.gold5 keys
resourceGOLD_INGOT
interval12s
max-nearby24
hologramtrue
generators.tiers.gold.tiers3 keys
1{ interval: 12s }
2{ interval: 8s }
3{ interval: 5s }
generators.tiers.diamond5 keys
resourceDIAMOND
interval60s
max-nearby8
hologramtrue
generators.tiers.diamond.tiers2 keys
1{ interval: 60s }
2{ interval: 40s }
generators.upgrades3 keys

What a level costs when you click the generator.

generators.upgrades.iron2 keys
2{ cost: { IRON_INGOT: 8 } }
3{ cost: { GOLD_INGOT: 12 } }
generators.upgrades.gold2 keys
2{ cost: { GOLD_INGOT: 8 } }
3{ cost: { DIAMOND: 4 } }
generators.upgrades.diamond1 key
2{ cost: { DIAMOND: 6 } }
shop2 keys
file"shops/eggwars.yml"
shop.npc2 keys
enabledtrue
typeVILLAGER
markers6 keys
RED_WOOL"TEAM_SPAWN"
DRAGON_EGG"EGG"
IRON_BLOCK"GENERATOR:iron"
GOLD_BLOCK"GENERATOR:gold"
DIAMOND_BLOCK"GENERATOR:diamond"
EMERALD_BLOCK"SHOP_NPC"
events
[{ at: 25m, type: BROADCAST, message: "lang:content.event.sudden-death-soon" }, { at: 30m, type: SUDDEN_DEATH }, { at: 40m, type: END, outcome: DRAW }]+2
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&e&lEGGWARS"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.eggwars.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "%repeat_teams%%team_color%%team_name% &8» &f%team_status%", "", "lang:content.board.kills", "", "lang:content.board.next-e …+11
ENDING
["&8&m ", "lang:content.board.eggwars.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%serve …+8
rewards6 keys
win{ coins: 200, xp: 400 }
lose{ coins: 20, xp: 40 }
kill{ coins: 10, xp: 20 }
final-kill{ coins: 25, xp: 50 }
egg-broken{ coins: 50, xp: 100 }
play{ coins: 5, xp: 10 }

Ranked

Same as BedWars. The general settings (starting rating, divisions, decay) live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"entity.ender_dragon.growl"
kill"entity.player.levelup"

games/gungame.yml

Minigame: Gun Game
29 settings
plugins/ShadowGames/games/gungame.yml
enabledtrue
countdown15s
max-duration20m
respawn-delay2s
buildfalse
rules5 keys
demote-on-deathfalse

Dropping a level on death drags matches out and frustrates: leave it off unless somebody asks for it.

any-weapon-countstrue
final-level-winstrue
heal-on-level-uptrue

Without it the leader is also the most battered: the game punishes whoever is winning it.

announce-level-uptrue
ladder
[{ item: {…}, name: "lang:content.game.gungame.wooden-sword" }, { item: {…}, name: "lang:content.game.gungame.stone-sword" }, { item: {…}, name: "lang:content.game.gungame.iron-sword" }, { item: {…}, name: "lang:content …+9

The hard levels go last: finishing bare-handed is the tradition, and it is what makes a comeback possible.

spawn2 keys
safe-distance10
protection2s
markers2 keys
QUARTZ_BLOCK"PLAYER_SPAWN"
BEACON"CENTER"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&f&lGUN GAME"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.gungame.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "lang:content.board.level", "lang:content.board.weapon", "", "l …+13
ENDING
["&8&m ", "lang:content.board.gungame.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%serve …+8
rewards4 keys
lose{ coins: 10, xp: 20 }
win{ coins: 120, xp: 260 }
kill{ coins: 6, xp: 12 }
play{ coins: 5, xp: 10 }

Ranked

The same progression for everyone. The general settings (starting rating, divisions, decay) live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"block.note_block.pling"
kill"entity.player.levelup"

games/hideandseek.yml

Minigame: Hide and Seek
38 settings
plugins/ShadowGames/games/hideandseek.yml
enabledtrue
countdown20s
max-duration10m
buildfalse
hide7 keys
time45s
blind-seekerstrue
disguiseBLOCK
blocks[ ]

Empty = the engine samples the map: a garden offers bushes, a castle offers bricks, and nobody ends up the only cactus indoors.

allow-changetrue
change-cooldown10s
snap-to-gridtrue
seekers6 keys
ratio0.2
minimum1
kit"hideandseek/seeker"
respawn-delay5s
radartrue
radar-range20
anticamp4 keys

Not optional: without it a match ends with three people inside a wall and twenty minutes of nobody finding them.

enabledtrue
idle-time45s
sound"block.note_block.pling"
reveal-after90s
markers3 keys
LIME_WOOL"TEAM_SPAWN:HIDERS"
RED_WOOL"TEAM_SPAWN:SEEKERS"
BEACON"CENTER"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"lang:content.board.hideandseek.title"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.hideandseek.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "%repeat_teams%%team_color%%team_name% &8» &f%team_status%", "", "lang:content.board.kills", "", "lang:content.board.next-e …+11
ENDING
["&8&m ", "lang:content.board.hideandseek.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%s …+8
rewards4 keys
kill{ coins: 12, xp: 25 }
win{ coins: 90, xp: 200 }
lose{ coins: 12, xp: 24 }
play{ coins: 5, xp: 10 }

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"block.note_block.bell"
kill"entity.player.levelup"

Ranked

It leans too much on the map and on how many are playing.

Starting rating, divisions and decay live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledfalse

games/hungergames.yml

Minigame: HungerGames
40 settings
plugins/ShadowGames/games/hungergames.yml
enabledtrue
countdown60s
max-duration30m
lives1
buildtrue
start3 keys
freeze30s

Thirty seconds standing on a pedestal staring at the cornucopia: that is where all the tension of the match comes from.

invulnerable-during-freezetrue
remove-pedestalstrue
chests2 keys
fill-on-starttrue
one-timetrue
markers5 keys
QUARTZ_BLOCK"PLAYER_SPAWN"
BEACON"CENTER"
CHEST"LOOT_CHEST:tier1"
TRAPPED_CHEST"LOOT_CHEST:tier2"
RED_WOOL"SPECTATOR_SPAWN"
events
[{ at: 8m, type: CHEST_REFILL }, { at: 12m, type: FEAST, chests: 4 }, { at: 16m, type: CHEST_REFILL }, { at: 18m, type: BORDER_SHRINK, to: 120, over: 5m }, { at: 24m, type: BROADCAST, message: "lang:content.event.deathm …+6
loot3 keys
loot.tier13 keys
min-stacks2
max-stacks5
entries
[{ item: {…}, weight: 20 }, { item: {…}, weight: 24 }, { item: {…}, weight: 10 }, { item: {…}, weight: 18, amount-range: […] }, { item: {…}, weight: 18 }, { item: {…}, weight: 18 }, { item: {…}, weight: 26, amount-range …+10
loot.tier23 keys
min-stacks4
max-stacks7
entries
[{ item: {…}, weight: 18 }, { item: {…}, weight: 4, unique: true }, { item: {…}, weight: 12 }, { item: {…}, weight: 20, amount-range: […] }, { item: {…}, weight: 12 }, { item: {…}, weight: 3, unique: true }, { item: {…} …+8
loot.feast3 keys
min-stacks6
max-stacks9
inherittier2
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&6&lHUNGER GAMES"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.hungergames.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "", "lang:content.board.next-event", "&7%next_event_time%", "&8 …+11
ENDING
["&8&m ", "lang:content.board.hungergames.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%s …+8
rewards5 keys
win{ coins: 200, xp: 450 }
lose{ coins: 15, xp: 30 }
kill{ coins: 15, xp: 35 }
play{ coins: 5, xp: 10 }
per-minute{ coins: 2, xp: 5 }

Ranked

Loot matters, but placement over many matches is honest. The general settings (starting rating, divisions, decay) live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"entity.wither.spawn"
kill"entity.player.levelup"

games/infection.yml

Minigame: Infection
37 settings
plugins/ShadowGames/games/infection.yml
enabledtrue
countdown20s
max-duration8m
respawn-delay3s
buildtrue
infection4 keys
delay20s
initial-ratio0.15

0.15 out of twenty players makes three zombies: the amount that makes tense without being lost already.

minimum-initial1
patient-zero-buff
[{ type: SPEED, amplifier: 1 }, { type: STRENGTH, amplifier: 0 }]+1

Without this bonus the first zombie never catches anyone.

zombies4 keys
respawn-delay3s
kit"infection/zombie"
glowtrue
effects[{ type: SPEED, amplifier: 0 }]
survivors3 keys
kit"infection/survivor"
buildtrue
build-blocks[OAK_PLANKS, IRON_BARS]
last-survivor3 keys
glow-alltrue
broadcasttrue
buff
[{ type: SPEED, amplifier: 1 }, { type: REGENERATION, amplifier: 0 }]+1
markers3 keys
LIME_WOOL"TEAM_SPAWN:SURVIVORS"
GREEN_WOOL"TEAM_SPAWN:ZOMBIES"
BEACON"CENTER"
kits2 keys
enabledtrue
folder"infection"

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&2&lINFECTION"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "", "lang:content.board.kit", "&8&m …+9
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.infection.starting", "", "lang:content.board.kit", "&8&m ", "%server_ip …+8
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "%repeat_teams%%team_color%%team_name% &8» &f%team_status%", "", "lang:content.board.kills", "", "lang:content.board.next-e …+11
ENDING
["&8&m ", "lang:content.board.infection.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%ser …+8
rewards4 keys
win{ coins: 100, xp: 220 }
lose{ coins: 20, xp: 40 }
kill{ coins: 10, xp: 20 }
play{ coins: 5, xp: 10 }

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"entity.zombie.ambient"
kill"entity.player.levelup"

Ranked

Surviving is skill, and the matches run long enough.

Starting rating, divisions and decay live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

games/kitpvp.yml

Minigame: KitPvP
38 settings
plugins/ShadowGames/games/kitpvp.yml
enabledtrue
countdown10s
max-duration10m
respawn-delay2s
kills-to-win0
buildfalse
friendly-firetrue
spawn4 keys
smarttrue

Without this the game turns into spawn camping in two minutes.

safe-distance12
protection3s
break-on-attacktrue
streaks3 keys
enabledtrue
shutdown-bonus2.0

Ending a long streak is worth more than the kill: it is what turns "that player is winning" into "let us go and get them".

streaks.rewards3 keys
streaks.rewards.31 key
effects[{ type: SPEED, amplifier: 0, duration: 30s }]
streaks.rewards.52 keys
broadcasttrue
effects[{ type: REGENERATION, amplifier: 0, duration:…]
streaks.rewards.103 keys
broadcasttrue
glowtrue
items[{ material: GOLDEN_APPLE, amount: 2 }]
markers3 keys
QUARTZ_BLOCK"PLAYER_SPAWN"
BARRIER"NO_BUILD"
BEACON"CENTER"
kits3 keys
enabledtrue
folder"kitpvp"
default"warrior"

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&c&lKITPVP"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "", "lang:content.board.kit", "&8&m …+9
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.kitpvp.starting", "", "lang:content.board.kit", "&8&m ", "%server_ip%"]+8
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "lang:content.board.streak", "", "lang:content.board.next-event …+12
ENDING
["&8&m ", "lang:content.board.kitpvp.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%server …+8
rewards4 keys
lose{ coins: 10, xp: 20 }
win{ coins: 80, xp: 180 }
kill{ coins: 6, xp: 12 }
play{ coins: 5, xp: 10 }

Ranked

The same kits for everyone. The general settings (starting rating, divisions, decay) live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"block.note_block.pling"
kill"entity.player.levelup"

games/koth.yml

Minigame: King of the Hill
30 settings
plugins/ShadowGames/games/koth.yml
enabledtrue
countdown20s
max-duration15m
respawn-delay5s
points-to-win300
buildfalse
hill7 keys
radius8
height6
capture-time10s
points-per-second1
contest-modePAUSE

Contesting pauses the capture instead of resetting it: resetting punishes the attacker twice and makes a defended hill untakeable.

multiplefalse
particlestrue
markers2 keys
RED_WOOL"TEAM_SPAWN"
BEACON"CAPTURE_POINT"
kits2 keys
enabledtrue
folder"koth"

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&6&lKING OF THE HILL"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "", "lang:content.board.kit", "&8&m …+9
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.koth.starting", "", "lang:content.board.kit", "&8&m ", "%server_ip%"]+8
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "%repeat_teams%%team_color%%team_name% &8» &f%team_status%", "", "lang:content.board.kills", "lang:content.board.hill", "la …+13
ENDING
["&8&m ", "lang:content.board.koth.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%server_i …+8
rewards4 keys
win{ coins: 130, xp: 280 }
lose{ coins: 20, xp: 40 }
kill{ coins: 6, xp: 12 }
play{ coins: 5, xp: 10 }

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"block.beacon.activate"
kill"entity.player.levelup"

Ranked

Holding a hill against others is pure skill.

Starting rating, divisions and decay live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

games/luckywars.yml

Minigame: LuckyWars
31 settings
plugins/ShadowGames/games/luckywars.yml
File notes

SkyWars where every block can save you or kill you.

enabledtrue
countdown20s
grace-period10s
max-duration20m
lives1
buildtrue
void1 key
kill-below0
markers4 keys
BLUE_WOOL"TEAM_SPAWN"
BEACON"CENTER"
CHEST"LOOT_CHEST:island"
RED_WOOL"SPECTATOR_SPAWN"

Lucky blocks

Balance rule: the bad outcomes have to stay under 25% of the total weight. Above that players stop breaking them and the game stops existing.

lucky2 keys
blockYELLOW_TERRACOTTA
outcomes
[{ weight: 20, type: ITEMS, items: […] }, { weight: 18, type: ITEMS, items: […] }, { weight: 16, type: ITEMS, items: […] }, { weight: 14, type: ITEMS, items: […] }, { weight: 12, type: MOB, mob: ZOMBIE, amount: 3 }, { w …+13
loot1 key
loot.island3 keys
min-stacks2
max-stacks4
entries
[{ item: {…}, weight: 20 }, { item: {…}, weight: 20, amount-range: […] }, { item: {…}, weight: 20, amount-range: […] }]+2
events
[{ at: 10m, type: BORDER_SHRINK, to: 100, over: 60s }, { at: 20m, type: END, outcome: DRAW }]+1
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&a&lLUCKYWARS"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.luckywars.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "%repeat_teams%%team_color%%team_name% &8» &f%team_status%", "", "lang:content.board.kills", "", "lang:content.board.next-e …+11
ENDING
["&8&m ", "lang:content.board.luckywars.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%ser …+8
rewards4 keys
lose{ coins: 10, xp: 20 }
win{ coins: 100, xp: 250 }
kill{ coins: 10, xp: 25 }
play{ coins: 5, xp: 10 }

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"entity.ender_dragon.growl"
kill"entity.player.levelup"

Ranked

Lucky blocks are half the match: it would be a leaderboard of luck.

Starting rating, divisions and decay live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledfalse

games/manhunt.yml

Minigame: Manhunt
32 settings
plugins/ShadowGames/games/manhunt.yml
enabledtrue
countdown20s
max-duration60m
buildtrue
objectiveSURVIVE
head-start3m
hunters3 keys
respawn-delay10s
kit"manhunt/hunter"
hunters.compass5 keys
enabledtrue
update5s

The two dials that decide whether the runner has a chance. Rare updates and low accuracy = an interesting hunt.

inaccuracy0
cross-dimensiontrue
proximity-soundtrue
runner3 keys
kit"manhunt/runner"
max-health24
radartrue
markers2 keys
LIME_WOOL"TEAM_SPAWN:RUNNER"
RED_WOOL"TEAM_SPAWN:HUNTERS"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&5&lMANHUNT"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.manhunt.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "%repeat_teams%%team_color%%team_name% &8» &f%team_status%", "", "lang:content.board.kills", "", "lang:content.board.next-e …+11
ENDING
["&8&m ", "lang:content.board.manhunt.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%serve …+8
rewards4 keys
win{ coins: 250, xp: 500 }
lose{ coins: 30, xp: 60 }
kill{ coins: 20, xp: 40 }
play{ coins: 10, xp: 20 }

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"entity.ender_dragon.growl"
kill"entity.player.levelup"

Ranked

True for the runner and for the hunters alike.

Starting rating, divisions and decay live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

games/murdermystery.yml

Minigame: Murder Mystery
35 settings
plugins/ShadowGames/games/murdermystery.yml
enabledtrue
countdown20s
max-duration8m
lives1
buildfalse
roles3 keys
murderers1
detectives1
roles.scale2 keys

One murderer in sixteen never catches anybody; two in six close the round in thirty seconds.

12{ murderers: 2, detectives: 1 }
16{ murderers: 2, detectives: 2 }
murderer2 keys
throwabletrue
throw-cooldown5s
detective1 key
drop-on-deathtrue
innocent1 key
gold-needed10
gold2 keys
spawn-interval10s
max-on-ground20
rules3 keys
friendly-fire-penaltytrue

With no penalty the armed innocent shoots everyone until they hit the murderer, and the guessing game evaporates.

penaltyBOW_LOST
murder-trail5s
markers3 keys
QUARTZ_BLOCK"PLAYER_SPAWN"
GOLD_BLOCK"GOLD_SPAWN"
BEACON"CENTER"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&5&lMURDER MYSTERY"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.murdermystery.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "lang:content.board.role", "", "lang:content.board.next-event", …+12
ENDING
["&8&m ", "lang:content.board.murdermystery.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", " …+8
rewards4 keys
win{ coins: 90, xp: 200 }
lose{ coins: 10, xp: 20 }
kill{ coins: 15, xp: 30 }
play{ coins: 5, xp: 10 }

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"ambient.cave"
kill"entity.player.levelup"

Ranked

Chance hands out the role, and the role changes everything.

Starting rating, divisions and decay live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledfalse

games/oitc.yml

Minigame: One in the Chamber
29 settings
plugins/ShadowGames/games/oitc.yml
enabledtrue
countdown15s
max-duration10m
respawn-delay3s
lives3
buildfalse
rules5 keys
one-hit-killtrue
sword-instant-killtrue
pickup-arrowstrue
arrows-per-kill1
arrow-despawn5s

Without this, after three minutes the floor is full of arrows and whoever picks them up becomes unbeatable.

spawn2 keys
safe-distance10
protection2s
markers2 keys
QUARTZ_BLOCK"PLAYER_SPAWN"
BEACON"CENTER"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&6&lONE IN THE CHAMBER"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.oitc.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "", "lang:content.board.next-event", "&7%next_event_time%", "&8 …+11
ENDING
["&8&m ", "lang:content.board.oitc.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%server_i …+8
rewards4 keys
lose{ coins: 10, xp: 20 }
win{ coins: 90, xp: 200 }
kill{ coins: 8, xp: 16 }
play{ coins: 5, xp: 10 }

Ranked

One arrow, one hit: luck counts for little. The general settings (starting rating, divisions, decay) live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"block.note_block.pling"
kill"entity.player.levelup"

games/paintball.yml

Minigame: Paintball
59 settings
plugins/ShadowGames/games/paintball.yml
enabledtrue
countdown20s
max-duration10m
respawn-delay5s
buildfalse
friendly-firefalse
modeKILLS

How you win.

KILLS    - first team to 'kills-to-win' hits
COVERAGE - most floor painted wins. It changes what people do:
           a shot at a wall is worth something, and hiding in a
           corner is worth nothing.
kills-to-win50
coverage-to-win70

COVERAGE only: the share of paint that ends the match early, and how many blocks have to be painted before it counts (so nobody wins on the first shot of the round).

coverage-minimum200
streak-announce5

How many kills in a row before the streak is announced.

The guns

The difference between paintball and a snowball fight is right here, and it is four numbers: how many pellets leave the barrel, how far they spread, how long before you can fire again, and how big the splat is. The rest is decoration.

Keep reading

Everyone gets EVERY gun they may use and switches with the wheel: it is an arcade game, and swapping guns mid-fight is half the fun.

The cooldown is per PLAYER, not per gun: swapping guns to dodge the wait is the first thing everybody tries, and it would make every gun as fast as the fastest one.

weapons4 keys
weapons.rifle11 keys
display-name"lang:content.game.paintball.rifle.name"
description["lang:content.game.paintball.rifle.lore"]
itemSNOWBALL
slot0
pellets1
spread0.0
speed1.8
cooldown-ticks6
ammo-cost1
splat-radius1
sound"entity.snowball.throw"
2 more entries shaped like rifle: shotgun, sniper
weapons.grenade11 keys
display-name"lang:content.game.paintball.grenade.name"
description["lang:content.game.paintball.grenade.lore"]
itemFIRE_CHARGE
slot3
pellets1
spread0.0
speed1.1
cooldown-ticks60
ammo-cost6
splat-radius4
sound"entity.witch.throw"

Reserve it for VIPs by uncommenting: permission: "shadowgames.paintball.grenade"

gun7 keys
ammo16

The ammo you start a round with, and the ceiling.

max-ammo32
regen2s

Slow regeneration everywhere, so you are never dry forever.

trailstrue

The coloured trail of a pellet in flight: you can see where a shot came from, and that is what makes a firefight readable.

splattrue

Splats are cosmetic in KILLS and are the score in COVERAGE.

splat-duration30s
splat-radius1
ammo-stations2 keys

Refill stations are marker blocks you place on the map yourself. Where you put them is a design choice: a safe station is a station nobody fights over.

radius3
per-tick4
markers3 keys
RED_WOOL"TEAM_SPAWN"
DISPENSER"AMMO_STATION"
BEACON"CENTER"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&d&lPAINTBALL"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.paintball.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "%repeat_teams%%team_color%%team_name% &8» &f%team_status%", "", "lang:content.board.kills", "lang:content.board.ammo", "la …+13
ENDING
["&8&m ", "lang:content.board.paintball.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%ser …+8
rewards4 keys
lose{ coins: 12, xp: 24 }
win{ coins: 100, xp: 220 }
kill{ coins: 5, xp: 10 }
play{ coins: 5, xp: 10 }

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"block.note_block.pling"
kill"entity.slime.squish"

Ranked

Aim and movement, nothing else.

Starting rating, divisions and decay live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

games/parkour.yml

Minigame: Parkour
37 settings
plugins/ShadowGames/games/parkour.yml
enabledtrue
countdown5s
max-duration30m
buildfalse
modeFREE
FREE = the arena stays open and the leaderboard is the race.
RACE = everyone starts together and first across wins.
checkpoints4 keys
radius2
strict-ordertrue

Blocks the shortcuts: almost always what you want.

sound"entity.experience_orb.pickup"
beam-nexttrue
rules5 keys
invulnerabletrue
fall-damagefalse
reset-below0
no-flytrue
no-collisiontrue

With more than two players it is essential: without it people shove each other off on the first jump.

records3 keys
enabledtrue
show-on-finishtrue
records.medals3 keys
gold45s
silver60s
bronze90s
markers3 keys
EMERALD_BLOCK"START"
LIGHT_BLUE_WOOL"CHECKPOINT"
GOLD_BLOCK"FINISH"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&a&lPARKOUR"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.parkour.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "lang:content.board.checkpoint", "", "lang:content.board.next-e …+12
ENDING
["&8&m ", "lang:content.board.parkour.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%serve …+8
rewards6 keys
lose{ coins: 5, xp: 10 }
win{ coins: 50, xp: 120 }
finish{ coins: 50, xp: 100 }
personal-best{ coins: 100, xp: 200 }
map-record{ coins: 500, xp: 1000 }
play{ coins: 5, xp: 10 }

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds2 keys
join"entity.experience_orb.pickup"
start"entity.firework_rocket.launch"

Ranked

A time on a fixed course is the definition of skill.

Starting rating, divisions and decay live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

games/quake.yml

Minigame: Quake
32 settings
plugins/ShadowGames/games/quake.yml
enabledtrue
countdown15s
max-duration10m
respawn-delay1s
kills-to-win25
buildfalse
railgun6 keys
reload1.2s
piercingtrue

The beam goes through players: lining two of them up and taking both is the best moment of the match.

max-range100
sound-fire"entity.firework_rocket.blast"
sound-hit"entity.player.levelup"
knockback0.4
movement1 key
speed0.16

Quake is a game of movement, not of fighting.

powerups2 keys
enabledtrue
respawn30s
markers3 keys
QUARTZ_BLOCK"PLAYER_SPAWN"
GOLD_BLOCK"POWERUP"
BEACON"CENTER"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&b&lQUAKE"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.quake.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "lang:content.board.kills-to-win", "lang:content.board.reload", …+13
ENDING
["&8&m ", "lang:content.board.quake.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%server_ …+8
rewards4 keys
lose{ coins: 10, xp: 20 }
win{ coins: 100, xp: 220 }
kill{ coins: 5, xp: 10 }
play{ coins: 5, xp: 10 }

Ranked

Pure aim. The general settings (starting rating, divisions, decay) live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"entity.blaze.shoot"
kill"entity.firework_rocket.blast"

games/race.yml

Minigame: Race
32 settings
plugins/ShadowGames/games/race.yml
enabledtrue
countdown20s
max-duration10m
laps3
buildfalse
modeFOOT

FOOT | BOAT | ELYTRA | HORSE

vehicle4 keys
boat-typeOAK
horse-speed0.35
rocket-regen3s
rocket-max8
checkpoints4 keys
radius4
strict-ordertrue

Without strict order every course has a shortcut, and the shortcut is always more efficient than the course.

sound"entity.experience_orb.pickup"
beam-nexttrue
rules3 keys
pvpfalse
off-track-respawntrue
record-timestrue
markers3 keys
EMERALD_BLOCK"START"
LIGHT_BLUE_WOOL"CHECKPOINT"
GOLD_BLOCK"FINISH"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&e&lRACE"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.race.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "lang:content.board.lap", "lang:content.board.position", "", "l …+13
ENDING
["&8&m ", "lang:content.board.race.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%server_i …+8
rewards3 keys
win{ coins: 90, xp: 200 }
lose{ coins: 12, xp: 24 }
play{ coins: 5, xp: 10 }

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds2 keys
join"entity.experience_orb.pickup"
start"entity.firework_rocket.launch"

Ranked

The same track for everyone.

Starting rating, divisions and decay live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

games/skywars.yml

Minigame: SkyWars
50 settings
plugins/ShadowGames/games/skywars.yml
File notes

Islands in the void, chests to loot, last one standing wins. Full reference: docs/giochi/skywars.md

Every value here applies to EVERY SkyWars arena. To change one on a single map, write it again in that arena's file.

enabledtrue
countdown20s
countdown-full10s
grace-period10s
max-duration20m
end-duration10s
lives1

No respawns: whoever dies becomes a spectator.

friendly-firefalse
buildtrue

Cages

A glass cube around each spawn during the countdown. Not decoration: without it half the lobby walks off the island while the other half waits, and that half takes a free kill.

cages3 keys
enabledtrue
material"%team%_STAINED_GLASS"

%team% becomes the team colour: one cage per colour.

remove-on-starttrue

The void

void1 key
kill-below0

Below this height you die.

assist-window10s

Whoever landed a hit in the last N seconds takes the kill even when the void did the killing. In SkyWars those are most of the kills: crediting them to nobody would make the stat useless.

Markers

Which block means what. Place them in the schematic as you build: the engine reads them, records the position and removes them. /sg marker list skywars shows them in game.

markers5 keys
BLUE_WOOL"TEAM_SPAWN"
BEACON"CENTER"
CHEST"LOOT_CHEST:island"
TRAPPED_CHEST"LOOT_CHEST:middle"
RED_WOOL"SPECTATOR_SPAWN"

Scheduled events

They are what gives a match its shape. Changing them here changes the pace of every map; changing them in an arena file changes only that one.

events
[{ at: 5m, type: CHEST_REFILL }, { at: 10m, type: CHEST_REFILL }, { at: 12m, type: BORDER_SHRINK, to: 120, over: 60s }, { at: 16m, type: SUDDEN_DEATH }, { at: 20m, type: END, outcome: DRAW }]+4

Loot

A weighted table. "unique" stops one chest from holding three diamond swords.

loot3 keys
loot.island4 keys
min-stacks4
max-stacks7
clear-firsttrue
entries
[{ item: {…}, weight: 30 }, { item: {…}, weight: 8 }, { item: {…}, weight: 1, unique: true }, { item: {…}, weight: 12 }, { item: {…}, weight: 20, amount-range: […] }, { item: {…}, weight: 20 }, { item: {…}, weight: 10 } …+19
loot.middle4 keys
min-stacks6
max-stacks10
clear-firsttrue
entries
[{ item: {…}, weight: 20 }, { item: {…}, weight: 6, unique: true }, { item: {…}, weight: 12 }, { item: {…}, weight: 20, amount-range: […] }, { item: {…}, weight: 14 }, { item: {…}, weight: 3, unique: true }, { item: {…} …+13
loot.refill2 keys

The refill uses the middle table again, without repeating it.

inheritmiddle
clear-firsttrue

Kits

They live in kits/skywars/. With enabled: false everyone starts the same, which is the classic version of the game.

kits5 keys
enabledtrue
folder"skywars"
include-commontrue
default"warrior"
remember-last-choicetrue

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&b&lSKYWARS"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "", "lang:content.board.kit", "&8&m …+9
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.skywars.starting", "", "lang:content.board.kit", "&8&m ", "%server_ip%"]+8
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "lang:content.board.chests", "", "lang:content.board.next-event …+12
ENDING
["&8&m ", "lang:content.board.skywars.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%serve …+8

Rewards

rewards5 keys
win{ coins: 100, xp: 250 }
lose{ coins: 10, xp: 25 }
kill{ coins: 10, xp: 25 }
play{ coins: 5, xp: 10 }
per-minute{ coins: 2, xp: 4 }

Sounds

Empty a value to turn it off.

sounds3 keys
join"entity.experience_orb.pickup"
start"entity.ender_dragon.growl"
kill"entity.player.levelup"
protection1 key
original-blocks-unbreakabletrue

Ranked

Loot adds variance, but across a hundred matches skill wins out. The general settings (starting rating, divisions, decay) live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

games/speedbuilders.yml

Minigame: Speed Builders
32 settings
plugins/ShadowGames/games/speedbuilders.yml
enabledtrue
countdown20s
max-duration20m
rounds8
lives5
round4 keys
preview-time10s
build-time60s
time-decrease5s
min-time20s
builds4 keys
folder"speedbuilders"
orderBY_SIZE
exact-materialstrue
decoys2

The blocks that do nothing are what makes the game hard without stretching the time.

scoring4 keys
correct1
wrong-1
pass-threshold0.9
perfect-bonus50
markers3 keys
LIME_WOOL"PLOT"
WHITE_WOOL"PREVIEW"
BEACON"CENTER"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&e&lSPEED BUILDERS"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.speedbuilders.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "", "lang:content.board.next-event", "&7%next_event_time%", "&8 …+11
ENDING
["&8&m ", "lang:content.board.speedbuilders.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", " …+8
rewards3 keys
win{ coins: 200, xp: 420 }
lose{ coins: 25, xp: 50 }
play{ coins: 8, xp: 16 }

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds2 keys
join"entity.experience_orb.pickup"
start"block.beacon.activate"

Ranked

Speed and memory, both measurable.

Starting rating, divisions and decay live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

games/spleef.yml

Minigame: Spleef
30 settings
plugins/ShadowGames/games/spleef.yml
enabledtrue
countdown15s
max-duration8m
lives1
buildfalse
floor3 keys
materialSNOW_BLOCK
instant-breaktrue
dropsfalse
modes5 keys
defaultclassic
classic{ kit: "spleef/shovel" }
bow{ kit: "spleef/bow", arrows-break-floor: true }
ender{ kit: "spleef/ender", pearl-breaks-floor: true }
splegg{ kit: "spleef/splegg", egg-breaks-floor: true }
rules3 keys
pvpfalse
kill-below0
only-floor-materialtrue

Stops people digging the arena walls, which is the most common mistake when building a new map.

markers2 keys
QUARTZ_BLOCK"PLAYER_SPAWN"
BEACON"CENTER"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&f&lSPLEEF"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.spleef.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "", "lang:content.board.next-event", "&7%next_event_time%", "&8 …+11
ENDING
["&8&m ", "lang:content.board.spleef.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%server …+8
rewards3 keys
win{ coins: 60, xp: 140 }
lose{ coins: 8, xp: 16 }
play{ coins: 5, xp: 10 }

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds2 keys
join"entity.experience_orb.pickup"
start"block.snow.break"

Ranked

No items, no chance: movement only.

Starting rating, divisions and decay live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

games/sumo.yml

Minigame: Sumo
28 settings
plugins/ShadowGames/games/sumo.yml
enabledtrue
countdown5s
max-duration5m
rounds3
round-duration90s
buildfalse
rules3 keys
knockback-multiplier1.4

The only real dial: 1.0 makes very long matches, 2.0 makes three-minute ones. 1.4 is where the game works.

kill-below0
kit"sumo/default"
shrink3 keys
enabledtrue
start-at30s
every15s
markers2 keys
QUARTZ_BLOCK"TEAM_SPAWN"
BEACON"CENTER"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&e&lSUMO"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.sumo.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "", "lang:content.board.next-event", "&7%next_event_time%", "&8 …+11
ENDING
["&8&m ", "lang:content.board.sumo.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%server_i …+8
rewards4 keys
kill{ coins: 15, xp: 30 }
win{ coins: 50, xp: 120 }
lose{ coins: 10, xp: 20 }
play{ coins: 5, xp: 10 }

Ranked

No gear, no randomness: just who pushes better. The general settings (starting rating, divisions, decay) live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"block.note_block.bell"
kill"entity.player.levelup"

games/tdm.yml

Minigame: Team Deathmatch
30 settings
plugins/ShadowGames/games/tdm.yml
enabledtrue
countdown20s
max-duration12m
respawn-delay3s
kills-to-win50
buildfalse
friendly-firefalse
rules2 keys
spawn-camp-penaltytrue
spawn-camp-radius15
spawn3 keys
smarttrue

The difference between a playable game and one where you die every three seconds right after respawning.

protection3s
break-on-attacktrue
markers3 keys
RED_WOOL"TEAM_SPAWN"
BARRIER"NO_BUILD"
BEACON"CENTER"
kits2 keys
enabledtrue
folder"tdm"

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&c&lTEAM DEATHMATCH"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "", "lang:content.board.kit", "&8&m …+9
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.tdm.starting", "", "lang:content.board.kit", "&8&m ", "%server_ip%"]+8
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "%repeat_teams%%team_color%%team_name% &8» &f%team_status%", "", "lang:content.board.kills", "", "lang:content.board.next-e …+11
ENDING
["&8&m ", "lang:content.board.tdm.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%server_ip …+8
rewards4 keys
win{ coins: 120, xp: 250 }
lose{ coins: 20, xp: 40 }
kill{ coins: 6, xp: 12 }
play{ coins: 5, xp: 10 }

Ranked

Balanced teams, a clear objective. The general settings (starting rating, divisions, decay) live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"entity.ender_dragon.growl"
kill"entity.player.levelup"

games/tntrun.yml

Minigame: TNT Run
24 settings
plugins/ShadowGames/games/tntrun.yml
enabledtrue
countdown15s
max-duration8m
lives1
buildfalse
floor2 keys
fall-delay0.5s

Half a second: instant would mean dying on the first step.

sound"block.sand.break"
rules3 keys
pvpfalse
kill-below0
double-jumpfalse
markers2 keys
QUARTZ_BLOCK"PLAYER_SPAWN"
BEACON"CENTER"
kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&c&lTNT RUN"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.tntrun.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "", "lang:content.board.next-event", "&7%next_event_time%", "&8 …+11
ENDING
["&8&m ", "lang:content.board.tntrun.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%server …+8
rewards3 keys
win{ coins: 60, xp: 140 }
lose{ coins: 8, xp: 16 }
play{ coins: 5, xp: 10 }

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds2 keys
join"entity.experience_orb.pickup"
start"entity.tnt.primed"

Ranked

No items, no chance: movement only.

Starting rating, divisions and decay live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

games/uhc.yml

Minigame: UHC
45 settings
plugins/ShadowGames/games/uhc.yml
enabledtrue
countdown60s
max-duration120m
lives1
buildtrue
pvp-at20m
scatter4 keys
radius800
min-distance150
safe-surfacetrue

Never inside rock, never in a lake, never above lava.

team-togethertrue
rules7 keys
natural-regenerationfalse
golden-apple-heal4
enchanted-applesfalse
nethertrue
strength-nerftrue
extra-dropstrue
apple-drop-chance0.05
scenarios10 keys

The classic scenarios. Each one is a switch, not a class.

cutcleanfalse
timberfalse
bleedingfalse
firelessfalse
rodlessfalse
goldlessfalse
bowlessfalse
vanilla-plustrue
hastey-boysfalse
diamondlessfalse
markers2 keys
BEACON"CENTER"
RED_WOOL"SPECTATOR_SPAWN"
events
[{ at: 0m, type: BROADCAST, message: "lang:content.event.uhc-pvp-in-20" }, { at: 20m, type: PVP_ON }, { at: 40m, type: BORDER_SHRINK, to: 400, over: 10m }, { at: 60m, type: BORDER_SHRINK, to: 150, over: 10m }, { at: 80m …+6

The timeline is what makes one UHC match different from another: changing it does more than changing the map.

kits1 key
enabledfalse

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&4&lUHC"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "&8&m ", "%server_ip%"]+7
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.uhc.starting", "&8&m ", "%server_ip%"]+6
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "lang:content.board.alive", "", "lang:content.board.kills", "", "lang:content.board.next-event", "&7%next_event_time%", "&8 …+11
ENDING
["&8&m ", "lang:content.board.uhc.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%server_ip …+8
rewards5 keys
win{ coins: 400, xp: 900 }
lose{ coins: 25, xp: 50 }
kill{ coins: 30, xp: 70 }
play{ coins: 10, xp: 20 }
per-minute{ coins: 3, xp: 6 }

Ranked

Long and hard, but decided by choices. The general settings (starting rating, divisions, decay) live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"entity.wither.spawn"
kill"entity.player.levelup"

games/woolwars.yml

Minigame: Wool Wars
29 settings
plugins/ShadowGames/games/woolwars.yml
enabledtrue
countdown20s
max-duration15m
respawn-delay5s
rounds3
friendly-firefalse
buildtrue
wool3 keys
infinitetrue
break-enemytrue
break-ownfalse

You cannot break your own wool: nobody can undo their own work by accident, and what is yours stays yours until somebody comes to take it.

markers3 keys
RED_WOOL"TEAM_SPAWN"
WHITE_WOOL"WOOL_AREA"
BEACON"CENTER"
kits3 keys
enabledtrue
folder"woolwars"
default"warrior"

Sidebar

Ready as it is. Change it freely: what you write here beats the game's built-in layout, and deleting a section brings that back. The full placeholder list is in docs/11-HUD.md A line lang:<key> is read from lang/, in the language of each player.

scoreboard2 keys
title"&d&lWOOL WARS"
scoreboard.lines4 keys
WAITING
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.waiting", "lang:content.board.needed", "", "lang:content.board.kit", "&8&m …+9
COUNTDOWN
["&8&m ", "lang:content.board.map", "lang:content.board.players", "", "lang:content.board.woolwars.starting", "", "lang:content.board.kit", "&8&m ", "%server_ip% …+8
RUNNING
["&8&m ", "lang:content.board.map", "lang:content.board.time", "", "%repeat_teams%%team_color%%team_name% &8» &f%team_extra% &8(&f%team_score%&8)", "", "lang:content.board.kills", "", "lang: …+11
ENDING
["&8&m ", "lang:content.board.woolwars.winner", "", "lang:content.board.your-kills", "lang:content.board.place", "", "lang:content.board.thanks", "&8&m ", "%serv …+8
rewards4 keys
win{ coins: 120, xp: 260 }
lose{ coins: 20, xp: 40 }
kill{ coins: 6, xp: 12 }
play{ coins: 5, xp: 10 }

Ranked

Teams, an objective, no random loot. The general settings (starting rating, divisions, decay) live in config.yml under 'ranked'. All that is decided here is whether this game hands out a rating.

ranked1 key
enabledtrue

Sounds

Three moments only. Empty a value to turn it off, or point it at a sound from your own resource pack.

sounds3 keys
join"entity.experience_orb.pickup"
start"block.note_block.pling"
kill"entity.player.levelup"

Languages

The texts the plugin shows to players, one file per language.

lang/

Texts and messages
2 files
plugins/ShadowGames/lang/
File notes

ShadowGames - English Every key can have four independent variants:

key              -> chat
key@title        -> title
key@subtitle     -> subtitle
key@actionbar    -> action bar
key@sound        -> sound

Emptying one turns it off. That is how you silence a message without touching any code: match.player-joined: ""

Colours use the familiar ampersand codes. The richer tags still work:

<gradient:#FFD700:#FFA500>GOLD</gradient>

A key missing here is read from the copy of this language inside the plugin jar, then from the default language, then from English; only a key missing everywhere shows in braces, so the gap is obvious.

Every message the plugin shows to players, one file per language. The keys are not listed one by one: here are the files, how many texts they hold and the placeholders they use.

FileLanguageTexts
lang/en_US.yml reference — 1,847
lang/it_IT.yml — 1,847

Most used placeholders

The plugin replaces them with the right value: leave them written as they are.

  • %prefix%
  • %count%
  • %player%
  • %time%
  • %id%
  • %game%
  • %winner%
  • %countdown%
  • %arena%
  • %name%
  • %total%
  • %team%
  • %max%
  • %type%

Message groups

  • prefix 1
  • command 21
  • play 16
  • match 52
  • death 11
  • hud 93
  • kit 11
  • shop 4
  • spectator 6
  • party 19
  • queue 6
  • vote 2
  • reward 21
  • progression 2
  • top 3
  • stats 1
  • stat 134
  • gui 115
  • lobby 4
  • sign 10
  • setup 31
  • arena 86
  • admin 292
  • games 7
  • category 5
  • game 195
  • cosmetic 24
  • common 4
  • state 6
  • leaderboard 1
  • ranked 10
  • achievement 5
  • tournament 38
  • network 14
  • parkour 43
  • license 49
  • locked 4
  • hologram 5
  • chatgames 73
  • content 423

Other

Ready-made content, examples, imports: the files you copy and edit as a model.

import/bedwars1058.yml

Import from: bedwars1058
21 settings
plugins/ShadowGames/import/bedwars1058.yml
File notes

An import is not a perfect conversion and cannot be: every plugin saves different things and none of them saves what our marker system needs. What this file does is say EXACTLY where we read from: if a new version renames a key, you fix it here instead of waiting for a plugin update.

Every imported arena arrives DISABLED, with a list of what could not be carried over. Check it with /sg check and turn it on with /sg enable.

Usage:  /sg import bedwars1058 "plugins/BedWars1058"
formatbedwars1058
gamebedwars
description"lang:content.import.bedwars1058"
detect[Arenas, arenas]

If one of these exists inside the given folder, the format is recognised on its own by /sg import auto <folder>.

source"Arenas/*.yml"

The files to read, relative to the folder given.

fields7 keys

Where each value sits in the source file.

id"name"
world"worldName"
min-players"minPlayers"
max-players"maxPlayers"
team-size"maxInTeam"
lobby"waitingLocation"
spectator"spectatorLocation"
teams7 keys
path"Team"

The section whose keys are the team names.

color"Color"
spawn"Spawn"
bed"Bed"
shop"Shop"
upgrade"Upgrade"
teams.generators2 keys

Team generators: resource name -> key in the source file.

IRON"Iron"
GOLD"Gold"
generators1 key

Shared generators: every key is a resource, every value a list of positions.

path"generator"

import/bedwars2023.yml

Import from: bedwars2023
21 settings
plugins/ShadowGames/import/bedwars2023.yml
File notes

An import is not a perfect conversion and cannot be: every plugin saves different things and none of them saves what our marker system needs. What this file does is say EXACTLY where we read from: if a new version renames a key, you fix it here instead of waiting for a plugin update.

Every imported arena arrives DISABLED, with a list of what could not be carried over. Check it with /sg check and turn it on with /sg enable.

Usage:  /sg import bedwars2023 "plugins/BedWars2023"
formatbedwars2023
gamebedwars
description"lang:content.import.bedwars2023"
detect[Arenas, arenas]

If one of these exists inside the given folder, the format is recognised on its own by /sg import auto <folder>.

source"Arenas/*.yml"

The files to read, relative to the folder given.

fields7 keys

Where each value sits in the source file.

id"name"
world"worldName"
min-players"minPlayers"
max-players"maxPlayers"
team-size"maxInTeam"
lobby"waitingLocation"
spectator"spectatorLocation"
teams7 keys
path"Team"

The section whose keys are the team names.

color"Color"
spawn"Spawn"
bed"Bed"
shop"Shop"
upgrade"Upgrade"
teams.generators2 keys

Team generators: resource name -> key in the source file.

IRON"Iron"
GOLD"Gold"
generators1 key

Shared generators: every key is a resource, every value a list of positions.

path"generator"

import/mbedwars.yml

Import from: mbedwars
21 settings
plugins/ShadowGames/import/mbedwars.yml
File notes

MBedwars keeps its arenas in plugins/MBedwars/arenas/<name>.yml with a flatter structure than 1058. The keys below are the 5.x ones: if your version uses others, open them and fix them, the rest of the mechanism does not change.

Usage:  /sg import mbedwars "plugins/MBedwars"
formatmbedwars
gamebedwars
description"lang:content.import.mbedwars"
detect[arenas, arena]
source"arenas/*.yml"
fields7 keys
id"name"
world"world"
min-players"min-players"
max-players"max-players"
team-size"players-per-team"
lobby"lobby"
spectator"spectator-spawn"
teams7 keys
path"teams"
color"color"
spawn"spawn"
bed"bed"
shop"shop-villager"
upgrade"upgrade-villager"
teams.generators2 keys
IRON"iron-spawner"
GOLD"gold-spawner"
generators1 key
path"spawners"

import/skywarsreloaded.yml

Import from: skywarsreloaded
16 settings
plugins/ShadowGames/import/skywarsreloaded.yml
File notes

SkyWars is both the easiest and the most incomplete case: the island spawns carry over well, the chests do not, because in the source format they are blocks in the world and not coordinates in a file.

The right way to finish an arena imported from here is to open the world with /sg setup <id> and place the LOOT_CHEST markers with the wand; if instead you want the real advantage of schematics (different islands every match) it pays to cut an island with /sg schem save and rebuild the arena with /sg build.

Usage:  /sg import skywarsreloaded "plugins/SkyWarsReloaded"
formatskywarsreloaded
gameskywars
description"lang:content.import.skywarsreloaded"
detect[maps, arenas]
source"maps/*.yml"
fields8 keys
id"displayname"
world"world"
min-players"minplayers"
max-players"maxplayers"
team-size"teamsize"
lobby"waitingroom"
spectator"spectatorspawn"
center"center"
teams3 keys
path"spawns"
color"color"
spawn"spawn"

achievements/

Achievements
15 files
plugins/ShadowGames/achievements/

15 files with the same structure. Below, the most commented one in full, as a model; the others are listed by name.

  • bedwars/bed-breaker.yml
  • bedwars/finisher.yml
  • bridge/scorer.yml
  • global/champion.yml
  • global/marksman.yml
  • global/persistent.yml
  • global/rich.yml
  • global/slayer.yml
  • global/streaker.yml
  • global/veteran.yml
  • murdermystery/detective.yml
  • parkour/runner.yml
  • skywars/island-hopper.yml
  • skywars/void-hunter.yml
  • tntrun/survivor.yml

Example achievements/global/veteran.yml

File notes

An achievement is a threshold on a stat that already exists: that is the whole idea, and it is what makes them nearly free. Nothing new is counted, nothing new is saved, and any stat the engine already keeps can become a milestone in eight lines of YAML.

The folder is the game. "global" counts across every game at once.

The names say lang:<key>: the text is in lang/, in the language of each player. Your own text instead is shown as it is, to everybody.

idveteran
display-name"lang:content.achievement.veteran.name"
description["lang:content.achievement.veteran.lore"]
iconCLOCK
statplayed
broadcasttrue
tiers
[{ target: 10, name: "lang:content.achievement.veteran.tier-1", coins: 100, xp: 50 }, { target: 100, name: "lang:content.achievement.veteran.tier-2", coins: 500, xp: 250 }, { target: 500, name: "lang:content.achievement …+3

arenas/

The shipped arenas
14 files
plugins/ShadowGames/arenas/

14 files with the same structure. Below, 2 of them in full, one for each different shape; the others are listed by name.

  • battleroyale/highlands.yml
  • bedwars/fortini.yml
  • bingo/outback.yml
  • duels/piazzale.yml
  • gungame/chiostro.yml
  • kitpvp/cortile.yml
  • oitc/loggia.yml
  • parkour/scala.yml
  • quake/atrio.yml
  • skywars/orbita.yml
  • spleef/disco.yml
  • sumo/pedana.yml
  • tntrun/torre.yml
  • uhc/wildlands.yml
The folder’s README

Arenas live here, one folder per game:

arenas/skywars/ruins.yml
arenas/bedwars/castle.yml

The file name is the arena's id. Deleting the file deletes the arena; copying it to another server, together with its schematics, recreates it exactly. Keeping it in git is the right way to work on it with someone else.

You do not need to write these files by hand:

/sg create <game> <id>

opens a setup session that writes them for you, with comments. They are still normal YAML files, and editing them by hand is expected: after a change, /sg reload arenas is all it takes.

See docs/24-PRIMO-AVVIO.md to create your first arena in ten minutes.

THE FOURTEEN ARENAS THAT ARE ALREADY HERE

Right after installation this folder is not empty. Fourteen of the thirty-two games can be played without building anything, and they get here in two different ways.

Three do not need any map, because they have the server generate their world:

arenas/uhc/wildlands.yml
arenas/bingo/outback.yml
arenas/battleroyale/highlands.yml

UHC scatters the players on its own, Battle Royale drops them in on elytra, Bingo goes hunting in normal terrain.

The other eleven do have a floor, and it comes with them as a schematic inside schematics/:

arenas/skywars/orbita.yml      four islands and a centre
arenas/bedwars/fortini.yml     four bases with beds
arenas/sumo/pedana.yml         quartz disc that shrinks
arenas/spleef/disco.yml        snow disc
arenas/tntrun/torre.yml        three floors of sand and TNT
arenas/parkour/scala.yml       spiral of thirty jumps
arenas/duels/piazzale.yml      \
arenas/kitpvp/cortile.yml       |  the same courtyard under five names:
arenas/oitc/loggia.yml          |  all five read the same block
arenas/gungame/chiostro.yml     |  as a spawn point
arenas/quake/atrio.yml         /

Nobody built those schematics in creative: they are computed by tools/genera_schematic.py, which writes the .schem files directly. An island is a cone of dirt with a marker on top, and four cones in a circle make a SkyWars. You can tell they came out of a calculation, and that is fine: they are there so you can play on day one, not to show off. Open them with /sg schem paste, look at them, then redo them your own way.

That leaves eighteen games that want a map built by hand, and there is no honest way around it: CTF wants two bases with flags, Murder Mystery wants a mansion with blind corners. For those, /play does not leave you stranded, it tells you what to type:

/sg create <game> <name>      opens the setup session
/sg wand                      the wand for the markers
/sg finish                    checks the arena and switches it on

The fourteen are normal files and they are yours: open them, change the numbers, rename them. Deleting them is not enough to remove them - like the shipped kits and shops they come back at the next restart - so to switch one off, set enabled: false in it.

THE WORLD SEED (world.seed)

Only applies to arenas that have the server generate their world:

world:
  mode: GENERATED
  generator: NORMAL      # or the name of a world generator plugin
  seed: 0
seed: 0  (or no line)       a new world for every match.
seed: 1234567890            always that same world.

Zero is not the seed zero: it means "no seed", and it is the default because a UHC or a Bingo lives on having a different map every time. With a fixed seed the second match is identical to the first, same village and same caves, and whoever has already played it goes straight there.

A number written there pins the map down: that is for a tournament, where every group has to play the same terrain, and for someone who is measuring a border and wants to find yesterday's spot again.

On world.generator: VOID there is nothing to generate and the seed is not looked at; on FLAT the world is flat anyway.

Example arenas/battleroyale/highlands.yml

Battle Royale - Highlands

File notes

Arena shipped with the plugin. There is nothing to build: the server generates the world, players come down from above on elytra and land wherever they like, and the shrinking zone brings them back together on its own. It is the only one of the thirty-two games that places its players by itself, from the air, and that is why it can ship without a map.

It is a normal YAML file: change it, then /sg reload arenas.

idhighlands
gamebattleroyale
display-name"lang:content.arena.battleroyale.highlands.name"
description"lang:content.arena.battleroyale.highlands.description"
author"ShadowMC"
enabledtrue
iconELYTRA
players3 keys
min4
max20
team-size1
world6 keys
modeGENERATED
environmentNORMAL
generatorNORMAL

NORMAL, not VOID: people land here. There has to be ground below, and there has to be wood and stone, because this map has no placed chests (the reason is explained below).

No world.seed, and on purpose: without that line the engine rolls a new one for every match, so the ground under the drop is never the same. A number there pins it down, for a tournament.

border500

The zone starts from here: BattleRoyaleMatch reads world.border and falls back to 500 only if it is zero. The phases in games/battleroyale.yml go down 400 -> 250 -> 150 -> 60 -> 20 -> 0, so starting from 500 gives a first squeeze you can feel without it being a massacre.

time6000

Fixed noon: in match worlds the daylight cycle is off (worlds.gamerules in config.yml). In daylight you can see who is coming down.

weather-stormfalse

No LOOT_CHEST points and no DROP_ZONE, and that is not an oversight. They are fixed coordinates, and here the generator decides the ground: a chest written by hand ends up buried inside a hill or hanging in the air over a lake, and either way the player never finds it. Without DROP_ZONE, BattleRoyaleMatch.dropSupplies() goes to its fallback, which works out the ground height on the spot with getHighestBlockYAt(): the supply chests - 5, 10 and 15 minutes, already in the game file - always land on the ground. Here the fallback is better than the marker. On a built map, on the other hand, markers are the right choice.

points2 keys
CENTER[{ at: […] }]

Required: BattleRoyaleGame asks for exactly one CENTER, and it is the centre of the zone. Its height is never used to stand anyone on - the drop takes everyone to 200 and the chests settle on the ground - so 64 is as good as any other: it is written like this so that it reads as "sea level, 0 0".

SPECTATOR_SPAWN[{ at: […] }]

Spectators stay in the air above the zone (the engine adds 8 blocks by itself). They are in SPECTATOR gamemode: they are fine in the air, and on the ground, on terrain nobody built, they would end up inside a hill.

Example arenas/sumo/pedana.yml

Sumo - Pedana

File notes

A quartz disc above the void, two places, three rounds.

Two things in here are not obvious and are worth explaining.

1. world.region. SumoMatch reads the edge of the platform from

there, and without that block the shrinking never starts: the
round reaches 90 seconds and ends in a draw even between two
players who have no intention whatsoever of falling.

2. markers. For Sumo QUARTZ_BLOCK means TEAM_SPAWN, but the

platform IS made of quartz_block, because at the end of a round
SumoMatch puts back the blocks eaten by the shrinking with
setType(QUARTZ_BLOCK), and with any other material the platform
would change its look from the second round on. Leaving the rule
as it is, the 123 blocks of the platform would be 123 spawn
points and the paste would remove them all: only the void would
be left. So the rule is emptied and the spawn moves to
DIAMOND_BLOCK.
idpedana
gamesumo
display-name"lang:content.arena.sumo.pedana.name"
description"lang:content.arena.sumo.pedana.description"
author"ShadowMC"
enabledtrue
iconSLIME_BLOCK
players3 keys
min2
max2
team-size1
world8 keys
modeGENERATED
environmentNORMAL
generatorVOID
spawn-height100
border100
time6000
weather-stormfalse
world.region2 keys
min[-6, 100, -6]
max[6, 100, 6]
build1 key
components[{ id: pedana, layout: {…}, schematic: {…} }]
markers2 keys
QUARTZ_BLOCK""
DIAMOND_BLOCK"TEAM_SPAWN"
rules1 key
kill-below90

cosmetics/

Cosmetics
29 files
plugins/ShadowGames/cosmetics/

29 files with the same structure. Below, 2 of them in full, one for each different shape; the others are listed by name.

  • cage/emerald.yml
  • cage/glass.yml
  • cage/gold.yml
  • cage/ice.yml
  • cage/obsidian.yml
  • death-effect/ashes.yml
  • death-effect/farewell.yml
  • death-effect/smoke.yml
  • kill-effect/blood.yml
  • kill-effect/confetti.yml
  • kill-effect/explosion.yml
  • kill-effect/lightning.yml
  • kill-effect/souls.yml
  • projectile-trail/arcane.yml
  • projectile-trail/smoke.yml
  • projectile-trail/sparks.yml
  • trail/dripping.yml
  • trail/ender.yml
  • trail/flame.yml
  • trail/hearts.yml
  • trail/magic.yml
  • trail/notes.yml
  • trail/snow.yml
  • victory-dance/flames.yml
  • victory-dance/hearts.yml
  • victory-dance/spiral.yml
  • win-effect/fireworks.yml
  • win-effect/thunder.yml
  • win-effect/totem.yml

Example cosmetics/kill-effect/lightning.yml

File notes

A cosmetic is a file like a kit: id, name, icon, unlock rule. The effects go through the same engine as class abilities, so anything a class can do a cosmetic can do too -- except change a match: there is no way here to give damage, speed or any advantage.

display-name and description say lang:<key>: the text is in lang/, in the language of each player. Your own text instead is shown as it is.

idlightning
display-name"lang:content.cosmetic.kill-effect.lightning.name"
description["lang:content.cosmetic.kill-effect.lightning.…]
iconLIGHTNING_ROD
unlock1 key
cost10000
effect
[{ type: LIGHTNING, target: VICTIM }, { type: SOUND, value: ENTITY_LIGHTNING_BOLT_THUNDER, target: VICTIM }]+1

Example cosmetics/trail/ender.yml

idender
display-name"lang:content.cosmetic.trail.ender.name"
description["lang:content.cosmetic.trail.ender.lore"]
iconENDER_PEARL
particlePORTAL
count6
unlock1 key
level20

kits/

Kits, one per file
30 files
plugins/ShadowGames/kits/

30 files with the same structure. Below, 2 of them in full, one for each different shape; the others are listed by name.

  • bedwars/default.yml
  • bridge/default.yml
  • common/default.yml
  • ctf/defender.yml
  • ctf/runner.yml
  • ctf/support.yml
  • duels/classic.yml
  • duels/sumo.yml
  • hideandseek/seeker.yml
  • infection/survivor.yml
  • infection/zombie.yml
  • kitpvp/archer.yml
  • kitpvp/warrior.yml
  • koth/guardian.yml
  • koth/raider.yml
  • koth/sniper.yml
  • manhunt/hunter.yml
  • manhunt/runner.yml
  • skywars/archer.yml
  • skywars/builder.yml
  • skywars/warrior.yml
  • spleef/bow.yml
  • spleef/shovel.yml
  • sumo/default.yml
  • tdm/assault.yml
  • tdm/sniper.yml
  • tdm/soldier.yml
  • woolwars/builder.yml
  • woolwars/swift.yml
  • woolwars/warrior.yml

Example kits/common/default.yml

Default kit

File notes

It lives in kits/common/, so every game that allows kits offers it.

The item syntax is the same everywhere in the plugin: kits, shops, loot, rewards and menu icons. See docs/09-TEAM-KIT-CLASSI.md

display-name and description say lang:<key>: the text is in lang/, in the language of each player. Write your own text instead and that one is shown, the same for everybody.

iddefault
display-name"lang:content.kit.common.default.name"
description["lang:content.kit.common.default.lore"]
iconSTONE_SWORD
slot10
unlock1 key
defaulttrue
items2 keys
0{ material: STONE_SWORD }
1{ material: COOKED_BEEF, amount: 4 }
armor2 keys
chestplate
{ material: LEATHER_CHESTPLATE, unbreakable: true }+1

Leather with no explicit colour takes the team's: that is how a four-team map needs only one kit.

boots{ material: LEATHER_BOOTS, unbreakable: true }

Example kits/bridge/default.yml

File notes

The kit is fixed: The Bridge is a game of skill, not of gear. The blocks and the arrows regenerate on their own.

iddefault
display-name"lang:content.kit.bridge.default.name"
iconIRON_SWORD
unlock{ default: true }
items5 keys
0{ material: IRON_SWORD, unbreakable: true }
1
{ material: BOW, enchants: { infinity: 1 }, unbreakable: true }+1
2
{ material: DIAMOND_PICKAXE, enchants: { efficiency: 2 }, unbreakable: true }+2
3{ material: GOLDEN_APPLE, amount: 8 }
8{ material: ARROW }
armor4 keys
helmet{ material: LEATHER_HELMET, unbreakable: true }
chestplate
{ material: LEATHER_CHESTPLATE, unbreakable: true }+1
leggings{ material: LEATHER_LEGGINGS, unbreakable: true }
boots{ material: LEATHER_BOOTS, unbreakable: true }

music/

Music
5 files
plugins/ShadowGames/music/

5 files with the same structure. Below, the most commented one in full, as a model; the others are listed by name.

  • chase.yml
  • custom-pack-example.yml
  • party.yml
  • tension.yml
  • victory.yml

Example music/custom-pack-example.yml

Your own music, the real thing

File notes

A plugin cannot send an audio file to a client: the client has to already have it. So this is the route, and it is three steps:

1. Put your .ogg in a resource pack, under

assets/<yournamespace>/sounds/music/party.ogg

2. Declare it in the pack's sounds.json:

  {
    "music.party": {
      "category": "record",
      "sounds": [ { "name": "<yournamespace>:music/party",
                    "stream": true } ]
    }
  }
"stream": true matters for long tracks: without it the client
loads it all into memory.

3. Write the key below, and make sure the server hands out the pack

(server.properties -> resource-pack).

A player who refuses the pack hears nothing: that is why the other example tracks use note block melodies, which work for everyone, always.

This file is off on purpose: uncomment 'sound' once you really have the pack, or whoever unpacks it ends up with a silent track in the playlist.

idpack_example
display-name"lang:content.music.pack_example.name"

sound: "shadowgames:music.party"

length2m30s

How long the track lasts. The engine needs it to know when the track ended by itself, since the server cannot tell otherwise.

volume1.0
pitch1.0
melody4 keys

A fallback that plays for everyone even without the pack: if 'sound' is missing or the player has no pack, this is what they hear.

tempo5
instrumentHARP
looptrue
notes"C4 E4 G4 E4 F4 A4 C5 A4 G4 B4 D5 B4 C5 . . ."

parkour/

Parkour courses
3 files
plugins/ShadowGames/parkour/

3 files with the same structure. Below, the most commented one in full, as a model; the others are listed by name.

  • easy.yml
  • hard.yml
  • marathon.yml

Example parkour/easy.yml

A lobby parkour course

File notes

Not a match: furniture. Always there, anybody can jump on it at any moment, and stepping off costs nothing. It is what people do while waiting for a game to start.

This file is the PROFILE of a course -- name, difficulty, mode, time limit, reward. The route is not in it and cannot be: a route is coordinates in a lobby we have never seen, and a guessed coordinate is a course that drops the player into the void.

So until somebody walks it this course does NOT appear in /parkour, nor in the menu, nor in the tab completion. A course a player can pick that teleports him nowhere is worse than a course that is not there. It does appear in /sg parkour, with the command that finishes it, which is the one place where an unfinished thing is useful.

You do not write the route by hand: you walk it.

/sg parkour set easy start        <- where you stand now
/sg parkour set easy checkpoint   <- at every landing
/sg parkour set easy finish       <- at the end

Those three write into THIS file: the file is named after the id, so easy.yml is the course "easy". Name, difficulty, level, time and reward you can still change by hand.

ideasy
enabledtrue

enabled: false switches it off completely: it disappears from /sg parkour too and is never seen again. Use it if you do not want this course: deleting the file is not enough, at the next restart it comes back from the jar like the shipped kits and shops.

display-name"lang:content.parkour.easy.name"
description["lang:content.parkour.easy.lore"]
difficulty"easy"
level1
modeCHECKPOINT

How the course behaves:

CHECKPOINT  the checkpoints catch you, the attempt restarts when you
            leave the course. This one.
PERSISTENT  as above, but progress survives: you leave at checkpoint
            7, come back tomorrow, restart from 7.
ONESHOT     no safety net: one fall and you are back at the start.
time-limit0

How long you have to finish it.

0 (or no line) = UNLIMITED. The default, and what nearly every lobby
course wants: a pastime, not a test.
A value (5m, 90s, 1h) turns it into a timed challenge: warnings at
one minute, thirty and ten seconds, then back to the start.

You can change it in game too: /sg parkour time easy 5m

/sg parkour time easy 0

The route -- start, finish, checkpoints -- is written by /sg parkour set. You do not find it here as an empty line to fill in: an empty field reads like something somebody forgot, and this one is waiting for a walk instead.

Positions are "world,x,y,z[,yaw,pitch]", should you want to touch them up:

start: "lobby,10,70,10,90,0"
finish: "lobby,60,80,10,90,0"
checkpoints:
  - "lobby,20,72,10"
radius1.5

How close you have to pass a checkpoint for it to count. 1.5 is generous; below 1.0 it gets frustrating.

Below this height you have fallen and go back to the last checkpoint. Remove the line and "10 blocks below the start" is used. fall-y: 60

effects{ }

Effects active while you run: it is what makes one course feel different from another without needing a different engine. The number is the level (1 = I).

checkpoint-commands[ ]

Commands run at EVERY checkpoint reached. Placeholders: %player% %course% %checkpoint%

reward3 keys

The reward pays EVERY TIME you finish, not just the first. A course that pays once is a course you run once, and the point of a lobby course is that it gets run for months.

coins50
xp25
commands[ ]

To reserve it: the node needed to run it. permission: "shadowgames.parkour.facile"

shops/

Shops, one per file
2 files
plugins/ShadowGames/shops/

2 files with the same structure. Below, the most commented one in full, as a model; the others are listed by name.

  • bedwars.yml
  • eggwars.yml

Example shops/bedwars.yml

BedWars shop

File notes

Two screens: the items (here) and the team upgrades (at the bottom).

TWO PROPERTIES THAT CHANGE EVERYTHING

tier-group + tier

Buying the next tier removes the previous one from the shop and
from the inventory. Nobody carries three swords, and the shop does
not fill up with useless entries halfway through.

permanent

The item comes back after death. True for armour and tools, not for
blocks: dying should cost resources, not the set.

%team% inside a material becomes the team colour, so RED_WOOL, BLUE_WOOL and so on without writing them all out.

title"lang:content.shop.title"
rows6
categories
[{ id: blocks, slot: 1, icon: TERRACOTTA, name: "lang:content.shop.category.blocks" }, { id: melee, slot: 2, icon: GOLDEN_SWORD, name: "lang:content.shop.category.melee" }, { id: armor, slot: 3, icon: CHAINMAIL_BOOTS, n …+6
items7 keys
blocks
[{ slot: 19, cost: {…}, give: {…} }, { slot: 20, cost: {…}, give: {…} }, { slot: 21, cost: {…}, give: {…} }, { slot: 22, cost: {…}, give: {…}, lore-extra: […] }, { slot: 23, cost: {…}, give: {…} }, { slot: 24, cost: {…} …+5
melee
[{ slot: 19, cost: {…}, give: {…}, tier-group: sword, tier: 1 }, { slot: 20, cost: {…}, give: {…}, tier-group: sword, tier: 2 }, { slot: 21, cost: {…}, give: {…}, tier-group: sword, tier: 3 }, { slot: 22, cost: {…}, giv …+3
armor
[{ slot: 19, cost: {…}, give-armor: CHAINMAIL, permanent: true, tier-group: armor, tier: 1, lore-extra: […] }, { slot: 20, cost: {…}, give-armor: IRON, permanent: true, tier-group: armor, tier: 2 }, { slot: 21, cost: {… …+2
tools
[{ slot: 19, cost: {…}, give: {…}, permanent: true, tier-group: pickaxe, tier: 1 }, { slot: 20, cost: {…}, give: {…}, permanent: true, tier-group: pickaxe, tier: 2 }, { slot: 21, cost: {…}, give: {…}, permanent: true, t …+5
ranged
[{ slot: 19, cost: {…}, give: {…} }, { slot: 20, cost: {…}, give: {…} }, { slot: 21, cost: {…}, give: {…} }, { slot: 22, cost: {…}, give: {…} }]+3
potions
[{ slot: 19, cost: {…}, give: {…} }, { slot: 20, cost: {…}, give: {…} }, { slot: 21, cost: {…}, give: {…} }]+2
utility
[{ slot: 19, cost: {…}, give: {…} }, { slot: 20, cost: {…}, give: {…} }, { slot: 21, cost: {…}, give: {…} }, { slot: 22, cost: {…}, give: {…} }, { slot: 23, cost: {…}, give: {…} }, { slot: 24, cost: {…}, give: {…}, lore …+5
Team upgrades

An upgrade is not an item: it is a property of the team, and it also covers items bought later and players who respawn. Somebody who buys Sharpness and then a new sword expects the sword to be sharp: it is the most reported bug of every BedWars ever written.

upgrades3 keys
title"lang:content.shop.upgrades-title"
rows4
items
[{ id: sharpness, slot: 10, icon: DIAMOND_SWORD, name: "lang:content.shop.upgrade.sharpness.name", max-level: 1, levels: {…} }, { id: protection, slot: 11, icon: IRON_CHESTPLATE, name: "lang:content.shop.upgrade.protect …+5

All the documentation