Skip to content
ShadowMC

Configuration

ShadowSpawners

Spawners you can pick up, stack, upgrade and sell.

Premium v1.0.4

Where the files are

plugins/ShadowSpawners/

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

Applying changes

/ssp reload

Reloads the files without restarting the server.

What’s inside

8 files · 140 settings

Start with: config.yml

Settings

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

config.yml

General settings
115 settings
plugins/ShadowSpawners/config.yml
File notes

This file explains the WHY of every option, not just the what. If a line does not convince you, the note above it should tell you what happens when you change it: if it does not, that is a defect of this file, not yours.

Two things are always true:

* A wrong value never stops the plugin. It is replaced with the default

and reported in the console with the exact path and what was expected.
You can get it wrong without fear.

* What you change stays yours. On update your files are moved to the new

version automatically: new options and comments arrive, every value you
changed is carried over, the old files are kept in backup/<date>/, and
if something needs your attention you will find PORTING-<version>.txt
in the plugin folder. There is no need to start over at every update.

The mob price list - prices and harvest chances, one row per type - lives in spawners.yml, not here: it is a table, and tables are better off alone.

Every key, section and comment in this file is in English on purpose: the plugin is sold worldwide. Only what a player reads is translated, and that lives in lang/ - English is simply the language selected below by default.

config-version1

General

general9 keys
languageen_US

The default language of the server. The plugin ships en_US and it_IT in lang/, and you can add more: a lang/fr_FR.yml file is picked up on its own.

follow-client-languagetrue

Every player reads the messages in the language of their own client, when that language exists. On by default because it costs nothing and because a server with players from two countries almost always wants it; turn it off if you would rather everyone read the same thing, for instance to keep the chat uniform.

accept-section-symboltrue

Also accept the section symbol in texts, on top of the ampersand. Only useful to those pasting texts from old configurations of other plugins.

update-filestrue

On update, moves this file, spawners.yml, lang/ and menus/ to the new version: what you changed is carried over, what you never touched takes the new default, the previous files go to backup/<date>/ and anything that could not be carried is listed in PORTING-<version>.txt. Turn it off only if you manage the files with a tool of your own: with it off your files are never rewritten, and a message missing from them is read from the copy inside the jar.

save-every60s

How often to write what changed to the database. Changes are never lost either way: on shutdown there is a blocking write that drains the queue. Raising it reduces writes on a server with a lot of spawner movement, lowering it reduces how much is lost in a crash.

confirmation-timeout30s

How long a confirmation request lives before it expires. Under ten seconds it becomes a race; over a minute, a player clicks CONFIRM on a question they no longer remember asking.

open-menu-with-full-handtrue

The menu of a spawner opens even with something in hand.

Keep reading

On by default, because it is what the player expects: nobody empties their hand before opening a chest, and a spawner is a block you adjust the same way. With it off an empty hand is required, which is the behaviour of many older plugins.

Two things do not change in either case, and they are worth knowing:

- with a SPAWNER in hand the menu never opens, because that gesture is
  the merging of two spawners into a stack;
- with SHIFT held the menu does not open and the block in your hand is
  placed: it is the same way out the game gives you on chests. Careful
  though - if shift-places-whole-stack is on, a SHIFT with spawners in
  hand places the entire pile.
teleport-only-to-owntrue

Teleporting from the list only works on your own spawners. Anyone with shadowspawners.admin can also go to other people's, because that is half the job of whoever answers "someone stole my spawner".

bstats-id0

The id of this plugin on bstats.org. It only tells how many servers use it and which version they are on; it sends no names, no addresses and no coordinates.

Keep reading

0 = use the id built into the plugin. A number above 0 written here takes its place. While both are 0 the metrics do NOT start at all, and that is fine: a wrong id does not produce "no data", it produces data landing on somebody else's page, and that is something you cannot undo.

To turn them off, see the "metrics" section right below.

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 worlds, no coordinates. Nothing is sent while the plugin waits for a licence.

Keep reading

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

Harvest

Breaking a spawner and getting it back in hand.

harvest8 keys
enabledtrue

Turn it off if harvesting is handled by another plugin on this server. With it off the break event is not even listened to: the cost is zero, not "almost zero".

require-silk-touchtrue

Silk touch is required to harvest.

Keeping it on is almost always right: without it a spawner is harvested bare-handed, and from that moment the dungeons of the world become a free shop. Turn it off only if you have a precise idea of your economy.

minimum-silk-touch-level1

The minimum silk touch level. A plain one is enough; raise it only if you have custom enchantments and want the good one to be required.

base-chance1.0

The chance for mobs that have no row of their own in spawners.yml, from 0 to 1. One means always.

The default is 1 on purpose. A low "out of the box" chance is the quickest way to make somebody angry: a player who breaks their first spawner and gets nothing thinks the plugin is broken, not that they were unlucky. If you want certain mobs to be rare, use that type's row in spawners.yml: there it reads as a choice.

bonus-per-silk-level0.0

How much every silk touch level above the minimum adds. With 0.1, a silk touch III on a 50% chance brings it to 70%. It is for those who sell upgraded enchantments and want them to be felt.

creative-always-succeedstrue

In creative the harvest always succeeds, silk touch or not. It is what someone fixing up a map expects, and in creative the chance protects nothing from nobody.

drop-experiencefalse

A broken spawner also drops the experience, as it would in vanilla. Off by default: whoever harvests the spawner takes away the real value, and the extra experience is a gift nobody asked for.

tell-on-failuretrue

Say it in chat when the chance does not come through.

On by default, and it is worth explaining why: without a message, a player who breaks a spawner at 30% and gets nothing cannot tell whether they were unlucky or the plugin is not working. Silence, here, produces support tickets.

Stack

More spawners in the same block. This is a Premium feature.

stack6 keys
enabledtrue

Placing a spawner AGAINST another of the same type merges the two, and the block keeps a counter.

maximum32

How many can be stacked.

Thirty-two is a considered number: it is enough for a farm to make sense, and little enough that a player cannot fit the whole server inside one block. Raising it a lot moves the problem onto load, which is the reason extra-cycles-per-tick below exists.

On the free version this value does not count: without a licence the stack is always 1. What you had stacked before stays stacked and keeps producing, you simply cannot add to it.

shift-breaks-whole-stacktrue

Breaking with SHIFT takes the whole stack away in one go, instead of one spawner. With it off one spawner is always removed per break, which is safer and much slower.

shift-places-whole-stacktrue

Placing with SHIFT puts in the whole pile you have in hand, instead of one.

multiply-spawnstrue

A stack spawns more mobs than a single spawner.

With it off a stack is just tidy storage: it takes one block instead of thirty-two and does not produce more. Some people want it that way, to keep the load flat without giving up the tidiness.

extra-cycles-per-tick4

How many extra cycles to grant in total, per tick, across the whole server.

Keep reading

This is the number that keeps a server with many stacks standing, and it is worth understanding. A stack of 64 does not run 64 cycles at once: it runs one extra cycle per tick until the debt is paid, that is a little over three seconds. This number is how many spawners at most are restarted in one tick.

Four is cautious. If you have ShadowOptimizer installed, it is the one deciding how hard you can push based on the real load, and this becomes just the ceiling.

Eggs

Changing the mob of a spawner by putting an egg on it.

eggs5 keys
enabledtrue

In plain Minecraft an egg on a spawner changes its type, for free. From here on that change goes through us: it can be charged for, it can require a permission, and it can ask for confirmation.

Turning it off keeps the vanilla behaviour blocked anyway: that is the right call, because a plugin that sells blaze spawners and lets you turn a pig into a blaze for free has sold nothing.

cost25000

What a change costs, in the currency below. Zero means free. It is per spawner: a stack of 32 changes all 32 at once, and pays 32 times (the item cost below too).

The right value is "less than buying the spawner new, but not much less": if it is cheap the shop stops meaning anything, because people buy the cheapest mob and transform it.

currencymoney

What it is paid in: 'money' is the default currency of ShadowEconomy. You can put the id of another currency or of a token: to ShadowEconomy tokens are currencies, so they work here with nothing special.

A cost in ITEMS, instead of money or on top of it. Remove the hash to use it. It is for servers where money is not the interesting constraint: asking for four diamond blocks is something people feel.

item-cost:
  material: DIAMOND_BLOCK
  amount: 4
consume-eggtrue

The egg is consumed. In creative it never is, whatever this says.

confirmtrue

Ask for confirmation with the two chat buttons before changing.

On by default: it is an operation that costs money and that cannot be undone, and it is extremely easy to do by accident while holding an egg and clicking around. When the change is free confirmation is not asked anyway, because there would be nothing to confirm.

Upgrades

Bought from the menu of a spawner. These are a Premium feature.

Keep reading

The values end up inside the block and stay there: Minecraft keeps them in its own save, so there is no task running to "maintain" them. They survive restarts, backups, and even uninstalling the plugin.

THERE IS A FLIP SIDE, AND IT IS FAIR TO KNOW IT UP FRONT: if you change the numbers below, already upgraded spawners do NOT change by themselves. They carry on with the values they had when the upgrade was bought, and they pick up the new ones only at the next thing that touches them (another level bought, a mob change, a merge). It is the direct consequence of keeping nothing running per tick, and it is the right trade: no cost while the server runs, in exchange for a tweak that is not retroactive.

upgrades4 keys
upgrades.base-values5 keys

Where a spawner with no upgrades starts from. These are Minecraft's own values: changing them changes EVERY spawner on the server, including the natural ones in dungeons, the next time they are touched.

minimum-delay200

ticks between one cycle and the next, minimum

maximum-delay800

and maximum: the real one is random between them

amount4

how many mobs it tries to spawn per cycle

maximum-nearby6

how many mobs around before it stops

range16

how far away a player still counts

speed: less waiting between one cycle and the next

upgrades.speed2 keys
iconCLOCK
upgrades.speed.levels3 keys
upgrades.speed.levels.14 keys
cost50000
currencymoney
minimum-delay160
maximum-delay600
upgrades.speed.levels.24 keys
cost150000
currencymoney
minimum-delay120
maximum-delay400
upgrades.speed.levels.34 keys
cost400000
currencymoney
minimum-delay80
maximum-delay240

amount: more mobs per cycle

upgrades.amount2 keys

When raising the amount it is worth raising maximum-nearby too, or the spawner stops before it has spawned what it could: that is the ceiling of mobs already standing around, and with a high amount you hit it at once.

iconEXPERIENCE_BOTTLE
upgrades.amount.levels3 keys
upgrades.amount.levels.14 keys
cost60000
currencymoney
amount6
maximum-nearby10
upgrades.amount.levels.24 keys
cost180000
currencymoney
amount8
maximum-nearby14
upgrades.amount.levels.34 keys
cost450000
currencymoney
amount12
maximum-nearby20

range: the spawner switches on from further away

upgrades.range2 keys

This is the upgrade people underrate and the one that changes how a farm is built the most: with 32 the player can sit in the next room instead of right on top of it.

iconENDER_EYE
upgrades.range.levels3 keys
upgrades.range.levels.13 keys
cost30000
currencymoney
range24
upgrades.range.levels.23 keys
cost90000
currencymoney
range32
upgrades.range.levels.33 keys
cost250000
currencymoney
range48

Shop

The per-type prices live in spawners.yml. Here is how it works.

Without ShadowEconomy the shop does not open and says so in the console. It is not a possible degradation: a shop with no money is not a shop with fewer features, it is a way of giving spawners away.

shop4 keys
enabledtrue
default-currencymoney

The currency used by price rows that do not declare one of their own.

maximum-per-purchase64

How many spawners at most in a single purchase. It stops a shift-click gone wrong from emptying an account.

dynamic pricingPremium

shop.dynamic-pricing5 keys

The price goes up with how many spawners of that type are already running on the server, and the sell-back price goes down at the same rate.

Keep reading

What it is really for: a fixed-price shop on a server that lasts more than three months always ends the same way. Somebody works out that a blaze spawner pays for itself in two days, buys forty, and from that moment blaze is worth nothing. Dynamic pricing does not prevent that: it makes it expensive. The fortieth costs a lot more than the first, and the moment it stops being worth it arrives on its own instead of having to be guessed now.

enabledfalse
factor0.01

How much every spawner already in circulation adds. 0.01 means 1% each: with fifty blazes around, the fifty-first costs 50% more. It is linear and not exponential on purpose - an exponential curve on a successful server produces numbers that do not fit in a lore line.

minimum-multiplier0.5

The floor and the ceiling of the multiplier. The floor is there so a price never reaches zero; the ceiling so it never becomes unreadable.

maximum-multiplier5.0
exempt-amount5

How many spawners do not count. The first ones are the ones that get the game going, and charging more for them is the way to not get it going at all.

Protection

protection4 keys
owner-onlyfalse

Only whoever placed a spawner may break or modify it.

Keep reading

Off by default, and it is not an oversight: on most servers whoever can build in a place can do what they like with that place, and the real protection is done by regions. Turn it on if your players build farms in shared areas.

Either way, if ShadowRegions (or WorldGuard) is present the region decides first: a spawner plugin that let you break inside spawn because "the spawner is mine" would have just punched a hole in the server's protection.

creative-bypassestrue

Whoever is in creative bypasses the owner check and the region check. It is what someone fixing up a map expects.

resist-explosionstrue

Registered spawners resist explosions.

On by default because a spawner bought for a hundred thousand coins that disappears to a creeper is a refund request, and on a server with a spawner shop it is THE refund request. With it off the vanilla behaviour applies: the spawner blows up and its row is removed from the database, leaving no ghosts behind.

resist-pistonstrue

Pistons cannot move a spawner.

In plain Minecraft they already cannot, because it is a block with an entity inside. The check is here anyway because that rule has changed at least once in the history of the game and datapacks exist that remove it: a spawner moved without us knowing would become a ghost row in the database. Turn it off only if you have a redstone machine that needs it.

Blocked types

Mobs that cannot end up inside a spawner on this server, neither by buying them nor with an egg.

The ones below are the cases where the call is easy: a warden in a farm is something nobody really wants, and an ender dragon inside a spawner does not even work.

blocked-types[WARDEN, ENDER_DRAGON, WITHER]

Integrations

Each one is optional. Turning one off here means not looking for it at all.

integrations6 keys
shadoweconomytrue

Money. ShadowEconomy if it is there - several currencies, its tokens and prices that follow the market. Otherwise any economy plugin that registers with Vault (EssentialsX, CMI, ...), with the one currency of the server. With neither, the shop does not open and paid upgrades cannot be bought; everything else in the plugin works exactly as before.

vaulttrue
integrations.external-tokens6 keys

Tokens from another plugin (BeastTokens, TokenManager, ...), for servers that do not use the tokens of ShadowEconomy. Optional.

The balance is read from a PlaceholderAPI placeholder, and tokens are taken and given with that plugin's own console commands - the ones its documentation lists. {player} is the name, {uuid} the id, {amount} how many. Then write the name below in any 'currency:' row to price it in tokens.

enabledfalse
currencytokens
balance-placeholder""
take-command""
give-command""
name"token"
integrations
shadowregionstrue

Permission to break follows the rules of the region. If ShadowRegions is not there WorldGuard is tried, and if that is not there either the other protection plugins installed decide - they see the event before we do.

shadowcustomizertrue

A spawner can spawn a custom mob, by writing the type as custom:<id>. ShadowCustomizer does not exist yet: when it arrives it will hook itself up at the first start, without touching anything here.

shadowoptimizertrue

How many extra cycles to grant stacks is decided by it, based on the real load of the server, instead of the fixed ceiling above. Here is the policy, there is the throughput.

Storage

By default an H2 file inside the plugin folder: nothing to install, no user to create, no password.

Shared MySQL is a Premium feature. On a free server, setting enabled: true below is not an error: the plugin stays on the local file and says so in the console, with all of its data intact.

storage6 keys
table-prefixssp_

The table prefix. Change it only if you share a database with something else. Only letters, digits and underscores are kept: a table name cannot be bound as a parameter, so it ends up concatenated into the SQL, and "an administrator writes it" is not a reason to leave a concatenation open.

log-queriesfalse

Writes every query to the console. Only to understand a problem: on a live server it fills the log in minutes.

storage.mysql7 keys
enabledfalse
host127.0.0.1
port3306
databaseshadowspawners
usernameroot
password''
parameters'useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&characterEncoding=utf8'
storage
fallback-to-localtrue

If MySQL does not answer at startup, start on the local file instead of not starting. On by default: a server that will not come up because of an unreachable database is a much bigger problem than one that comes up with old data. Set it to false only if you would rather find out immediately.

storage.h21 key
automatic-serverfalse

Lets another process open the same H2 file while the server runs. Only needed if you want to look inside it with an external tool.

storage.pool5 keys
maximum10
minimum-idle2
connection-timeout-ms10000
maximum-idle-ms600000
maximum-lifetime-ms1800000

Licence

The names in this section are the same in every plugin of the suite, and the activation service expects them exactly like this.

Keep reading

The key does NOT go here. The activation command writes it by itself into license.yml, which is a separate file on purpose: a support request saying "send me your config" must not arrive with your licence inside it.

/ssp license claim <code>       asks the service for the licence
/ssp license activate <key>     activates a key you already have
/ssp license refresh            re-reads and re-checks
license4 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).

Leave it empty. It is here for those running twenty servers off the same config who would rather set it once.

grace-days7

How many days of grace before falling back to the free version when something does not add up: a subscription that just expired (the renewal is almost always already on its way) or an address that does not match (far more often a NAT or a proxy than a thief).

server-ip''

The address your players know the server by. Only needed behind a proxy, where the machine never sees its own public address.

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

The base address of the activation service. The plugin appends /claim and /check by itself. Empty means automatic activation is off and the key must be pasted by hand.

resolve-public-iptrue

Asks the activation service above (activation-url + /ip) how this server looks from the outside: it answers with the address it sees, and nothing about the server is sent. It is the only reliable way of knowing your own public address from behind a NAT, and it is the reason a licence sold on a domain works on a machine whose local addresses are all 10.x. A failure is silent: the grace period exists exactly so that a server with no outbound internet keeps running. Only when a licence is installed: a server without a key asks nobody. false = never ask.

spawners.yml

Spawner types and prices
11 settings
plugins/ShadowSpawners/spawners.yml

One row per mob

There are two things in here that look different and are the same table seen from two sides:

Keep reading
harvest-chance   how likely you are to get it back by breaking it
buy / sell       what it costs and what it is worth in the shop

They live together because they are the same decision. A blaze that is rare to harvest and expensive to buy is coherent; one that is rare to harvest and given away in the shop means nobody will ever harvest one again.

A type with no row here is not for sale

That is the right way round: a mob added by Minecraft in a new version does not show up in the shop on its own at a made-up price. It can still be harvested, with the base chance written in config.yml.

Fields of a row, all optional except the name

harvest-chance   from 0 to 1. 1 means always.
  buy              what one costs to buy. 0 = not for sale.
  sell             what the shop pays. 0 = it does not buy it back.
  currency         'money', or the id of a ShadowEconomy currency or token.
  asset            ties the price to the quote of an asset on the
                   ShadowEconomy market: the number in 'buy' becomes "how
                   many units it is worth", and the price in money is set
                   by the market. It is still paid in the normal currency.
  permission       a permission required to buy it. Anyone without it does
                   not even see it in the shop, instead of seeing it greyed
                   out.
Keep reading

The prices below are tuned for an economy where an active player earns a few thousand coins an hour. They are not the truth: they are a starting point that is coherent with itself, and that is what you need so you do not have to invent twenty numbers from scratch.

config-version1
types16 keys

the common ones: the backbone of every farm

Easy to find, easy to harvest, cheap. These are the ones that show a new player how the system works.

types.ZOMBIE3 keys
harvest-chance1.0
buy15000
sell6000
13 more entries shaped like ZOMBIE: SKELETON, SPIDER, CAVE_SPIDER, SILVERFISH, CREEPER, ENDERMAN, WITHER_SKELETON, COW, PIG, SHEEP, CHICKEN, RABBIT, GUARDIAN

the useful ones: the reason a real farm gets built

types.BLAZE3 keys

The blaze is the mob this whole category of plugin exists for: its farm alone holds up half a server's economy. A low chance and a high price are the same choice said twice.

harvest-chance0.35
buy150000
sell55000

the animals: worth little and needed often

A server with food farms wants them cheap: they are convenience, not wealth.

the rare ones: the ones kept back for ranks

types.IRON_GOLEM4 keys

Requires a permission: anyone without it does not see it in the shop at all. It is how you sell a rank without inventing a new currency.

harvest-chance0.15
buy500000
sell150000
permissionshadowspawners.shop.rare

an example of a market-tied price

Remove the hash to try it. The number in 'buy' becomes "how many units of that asset it is worth", and the price in money is set by today's quote in ShadowEconomy. It is for a server where the market is a living thing and spawners should follow it instead of ignoring it.

'shc' is ShadowCoin, the crypto ShadowEconomy defines out of the box in finance.yml: it starts at 30 coins, so 3000 units are ninety thousand coins today, and another number tomorrow. Without ShadowEconomy, or with an asset that does not exist, the price goes back to being the plain number written here.

PIGLIN:
  harvest-chance: 0.4
  buy: 3000
  sell: 1000
  asset: shc

Languages

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

lang/

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

ShadowSpawners - English

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 English 210
lang/it_IT.yml Italiano 210

Most used placeholders

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

  • <prefix>
  • <mob>
  • <label>
  • <max>
  • <price>
  • <amount>
  • <stack>
  • <level>
  • <reason>
  • <kind>
  • <player>
  • <position>
  • <sell>
  • <total>

Message groups

  • prefix 1
  • common 10
  • command 12
  • confirm 6
  • mining 4
  • place 4
  • stack 5
  • protection 2
  • egg 10
  • upgrade 25
  • shop 15
  • info 6
  • stats 19
  • mine 2
  • item 3
  • gui 34
  • license 32
  • locked 4
  • mob 16

All the documentation