Configuration
ShadowSpawners
Spawners you can pick up, stack, upgrade and sell.
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.
No setting found
Try another word, or search every plugin.
Settings
The files that decide how the plugin behaves. Start here.
config.yml
General settings 115 settings
config.ymlplugins/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-version1General
general9 keyslanguageen_USThe 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-languagetrueEvery 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-symboltrueAlso accept the section symbol in texts, on top of the ampersand. Only useful to those pasting texts from old configurations of other plugins.
update-filestrueOn 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-every60sHow 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-timeout30sHow 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.
teleport-only-to-owntrueTeleporting 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-id0The 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 keyenabledtrueHarvest
Breaking a spawner and getting it back in hand.
harvest8 keysenabledtrueTurn 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-touchtrueSilk 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-level1The 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.0The 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.0How 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-succeedstrueIn 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-experiencefalseA 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-failuretrueSay 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 keysenabledtruePlacing a spawner AGAINST another of the same type merges the two, and the block keeps a counter.
maximum32How 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-stacktrueBreaking 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-stacktruePlacing with SHIFT puts in the whole pile you have in hand, instead of one.
multiply-spawnstrueA 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-tick4How 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 keysenabledtrueIn 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.
cost25000What 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.
currencymoneyWhat 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-eggtrueThe egg is consumed. In creative it never is, whatever this says.
confirmtrueAsk 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 keysupgrades.base-values5 keysWhere 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-delay200ticks between one cycle and the next, minimum
maximum-delay800and maximum: the real one is random between them
amount4how many mobs it tries to spawn per cycle
maximum-nearby6how many mobs around before it stops
range16how far away a player still counts
speed: less waiting between one cycle and the next
upgrades.speed2 keysiconCLOCKupgrades.speed.levels3 keysupgrades.speed.levels.14 keyscost50000currencymoneyminimum-delay160maximum-delay600upgrades.speed.levels.24 keyscost150000currencymoneyminimum-delay120maximum-delay400upgrades.speed.levels.34 keyscost400000currencymoneyminimum-delay80maximum-delay240amount: more mobs per cycle
upgrades.amount2 keysWhen 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_BOTTLEupgrades.amount.levels3 keysupgrades.amount.levels.14 keyscost60000currencymoneyamount6maximum-nearby10upgrades.amount.levels.24 keyscost180000currencymoneyamount8maximum-nearby14upgrades.amount.levels.34 keyscost450000currencymoneyamount12maximum-nearby20range: the spawner switches on from further away
upgrades.range2 keysThis 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_EYEupgrades.range.levels3 keysupgrades.range.levels.13 keyscost30000currencymoneyrange24upgrades.range.levels.23 keyscost90000currencymoneyrange32upgrades.range.levels.33 keyscost250000currencymoneyrange48Shop
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 keysenabledtruedefault-currencymoneyThe currency used by price rows that do not declare one of their own.
maximum-per-purchase64How many spawners at most in a single purchase. It stops a shift-click gone wrong from emptying an account.
Protection
protection4 keysowner-onlyfalseOnly 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-bypassestrueWhoever is in creative bypasses the owner check and the region check. It is what someone fixing up a map expects.
resist-explosionstrueRegistered 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-pistonstruePistons 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 keysshadoweconomytrueMoney. 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.
vaulttrueintegrations.external-tokens6 keysTokens 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.
enabledfalsecurrencytokensbalance-placeholder""take-command""give-command""name"token"integrationsshadowregionstruePermission 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.
shadowcustomizertrueA 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.
shadowoptimizertrueHow 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 keystable-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-queriesfalseWrites every query to the console. Only to understand a problem: on a live server it fills the log in minutes.
storage.mysql7 keysenabledfalsehost127.0.0.1port3306databaseshadowspawnersusernamerootpassword''parameters'useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&characterEncoding=utf8'storagefallback-to-localtrueIf 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 keyautomatic-serverfalseLets 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 keysmaximum10minimum-idle2connection-timeout-ms10000maximum-idle-ms600000maximum-lifetime-ms1800000Licence
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 keysTHE 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-days7How 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-iptrueAsks 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
spawners.ymlplugins/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-version1types16 keysthe 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 keysharvest-chance1.0buy15000sell6000ZOMBIE:
SKELETON, SPIDER, CAVE_SPIDER, SILVERFISH, CREEPER, ENDERMAN, WITHER_SKELETON, COW, PIG, SHEEP, CHICKEN, RABBIT, GUARDIANthe useful ones: the reason a real farm gets built
types.BLAZE3 keysThe 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.35buy150000sell55000the 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 keysRequires 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.15buy500000sell150000permissionshadowspawners.shop.rarean 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
lang/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.
| File | Language | Texts |
|---|---|---|
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
prefix1common10command12confirm6mining4place4stack5protection2egg10upgrade25shop15info6stats19mine2item3gui34license32locked4mob16