Repository navigation
FAQ
This page is organized by the symptom people actually report. Each answer tries to give the code-level cause instead of “try restarting”.
Paper 26.3. plugin.yml declares api-version: 26.3; older servers refuse to load it. Building requires JDK 25.
Neither is required.
- WorldGuard is a
softdepend: when present, the plugin reads the region’sPVP/MOB_SPAWNINGflags; when absent, both are treated as allowed. - Without a permissions plugin, Bukkit’s SuperPerms still applies the
defaultvalues declared inplugin.yml.
Because supernatural.admin.infinitepower defaults to op, and its effect is: every negative power change is silently refused.
While testing as an OP:
- a demon outside lava does not lose power;
- spells do not cost power;
-
Not enough powernever appears; - death does not cost power.
Since 1.5.0, the first time it applies the player gets a private message:
Your power never goes down: you hold supernatural.admin.infinitepower, which is given to operators by default.
To test the real economy, remove the node with your permissions plugin (for example lp user <name> permission unset supernatural.admin.infinitepower) or use a non-OP account.
First confirm you edited plugins/mmSupernaturals/config.yml, not the defaults in the source. Then:
-
/sn reload configre-runs loading but does not write missing keys. - Restarting the server is the reliable check.
The plugin writes defaults only when config.yml does not exist. An existing file is never extended or migrated.
New keys are read from their built-in defaults (for example EnderBorn.Convert.Chance defaults to 0.1). To make them appear, delete config.yml, let it regenerate, then reapply your values.
Check in this order:
-
Zero surrounding blocks:
useAltarInfectreturns immediately whencount == 0, with no message. Confirm there is obsidian/glowstone within radius 7. - Not enough blocks: prints “doesn't seem to be enough …”.
- Missing permission: prints “You cannot use vampire altars.”.
- Already supernatural: prints “This is of no use to you…”.
-
Priest altar: it must be within 10 blocks of a registered church; otherwise
isChurch()returns false and it returns silently.
All three conditions are required:
- The killer must be
human(isHuman()). - The 3
superTypes must be distinct. - You must not die in between — a human death clears the recorded types.
When they are met, the invitation is scheduled 200 ticks (10 seconds) later.
This is a consequence of the current rules, not an operation mistake:
-
isSuper()returnsfalsefor an angel. - The priest’s Exorcise/Purify and the angel’s Purify all require a supernatural target.
- So there is no in-game way to purify an angel.
Only an admin’s /sn cure <player> can do it.
EnderBornManager.deathTimesMap is an in-memory HashMap; it is never written to data.yml or storage.dat. Relogging or restarting clears it.
Their conversion paths call convert without a starting power; the other races explicitly pass 5,000 or 10,000. They have to earn it (an angel swims, an enderborn trades pearls for power).
By design: the attack bonus, wolf summoning, dash and regeneration all check worldTimeIsNight. The plugin’s definition of night is world time > 12,400. Using those items by day prints Cannot use this ability during the day. and costs nothing.
Check three things:
-
Is the weapon banned for your race?
damagerEventsets the damage to zero and prints “xxx cannot use this weapon!”. Defaults:- ghoul 44 items, witch hunter 42, enderborn 18;
- werewolf only at night;
- vampire/priest/demon default to
[none], i.e. no restriction.
- Is the target immune? A ghoul takes 0 from any diamond- or netherite-tier tool or weapon — the sword, but also the axe, pickaxe, shovel, hoe and spear.
-
Is this a non-PvP area? When WorldGuard’s
PVPflag is deny, some spells and special arrows are refused.
- No arrows in the inventory: since 1.5.0 this prints
You have no arrows to shoot.. - Outside a PvP area: prints
You cannot use special arrows in non-PvP areas.. - Not enough power: prints a message and switches back to normal arrows.
- Power arrow still cooling down: prints
You are still recovering from Power Shot (Ns). Switch arrow type to shoot something else.— note the second sentence. Since 1.5.1 only the power arrow is blocked by that cooldown; fire, triple, grapple and normal fire normally. Before that, one power shot locked all five.
That was the bug 1.5.1 fixed. The pull used to set the player’s velocity, and a player’s position is the client’s to report, so the server’s speed was overwritten before it could mean anything. It also ran its whole chain inside one tick, so when it did move anybody it arrived as a teleport.
Now it is a teleport of one block per tick, stopping 3 blocks short, with fall distance held at zero until you land. And it will not keep power for a ride it did not give — this is refunded:
| Why nothing happened | What you see |
|---|---|
| The arrow never left the block it was fired into | Nothing to pull you to (the arrow never left the block it was fired into) - 500 power returned. |
| What it caught is under 3 blocks away | Nothing to pull you to (it caught something only 2 blocks away) - 500 power returned. |
| The pull ran out of time | …(it ran out of time)… |
| The move was refused by a region plugin or the world border | …(the move was refused)… |
| Player and target in different worlds | …(what it caught is in another world)… |
| A later shot took the pull over | …(a later shot took over the pull)… |
If you hold supernatural.admin.infinitepower, nothing was charged, so nothing is returned — the refund is the amount actually taken, not the setting.
It should not, since 1.5.1. Every affordability check now goes through SuperNManager.canPay, which asks power >= cost; before that, each ability asked power > cost, so a bar of exactly 5,000 could not pay a 5,000-power ability — the one number it could not buy was its own. PowerCostTest pins the boundary now: 5,000 pays 5,000, 4,999.99 does not.
If you still see something refused at an exact amount, check what is being compared. The only strict comparisons left are reward gates, not costs: a kill pays out only when the victim held more than N power — 500 for a vampire, 1,000 for a ghoul, 2,000 for a witch hunter, 100 for a werewolf or demon. A victim sitting exactly on the threshold pays nothing, which is a payout rule and not a price.
- The target is not supernatural (priest, witch hunter and angel do not count).
- You are not in a PvP area.
-
No banish point is set: since 1.5.0 it refuses to cast, costs nothing, and tells the admin to run
/sn setBanish. - Less than 4,000 power.
- It only works on a non-supernatural target.
- A priest can guard only one person at a time; guarding another removes the old one.
- It only triggers on a lethal hit; the check is
health - damage <= 0after damage calculation. - On trigger the target returns to 20 HP and the guard is consumed.
A non-priest supernatural who right-clicks the diamond-block altar is killed by holy light. It is an explicit branch in the implementation:
The holy power of the Church tears you asunder!
A ghoul has a 25% chance to be cleansed; every other race simply dies. The church is not a safe zone.
Each race has its own sources:
| Race | Source |
|---|---|
| Vampire | +45 every 3 seconds (passive) |
| Werewolf | +100 per food item (bread excluded) |
| Ghoul | Kills |
| Demon | +40 per lava tick |
| Priest | Church donations |
| WitchHunter | Player kills and completed bounties |
| EnderBorn | +100 per pearl right-click, plus kills |
| Angel | +50 per 10 seconds in water, plus monster kills |
If none of these apply, power is not supposed to go up.
- Demon outside the Nether and not standing in fire/lava: −20 every 5 seconds.
- Vampire regeneration: −60 every 3 seconds.
- Ghoul maintaining an Unholy Bond: −50 per transferred hit.
- EnderBorn pearl guard: −500 per hit.
- Death: each race has a fixed penalty (vampire and demon lose 10,000).
Not through configuration. SuperNPlayer.MAX_POWER = 10000 is a hard-coded constant; setPower clamps anything to 0–10000. Setting *.Power.Start to 20000 still yields 10000.
Because when the target holds supernatural.admin.infinitepower, alterPower returns immediately for every negative delta. Remove the permission first.
Since 1.5.0, SNPlayerHandler.load writes the loaded power back through the setter once, clamping it to 0–10000 and logging:
Power for <name> was <x> in the save file, which is not a power between 0.0 and 10000.0; it is <y> now.
NaN becomes 0: otherwise it compares false against every number, making every cost permanently free with no way back.
No. none is not a valid material and resolves to null; the list contains null, so contains(item.getType()) is always false — there is effectively no restriction.
Vampire, priest and demon all default to [none]. Only ghoul, witch hunter, enderborn (and the werewolf at night) have real weapon-ban lists.
Because a weapon list is read as materials, not as items (since 1.5.1). The reader splits a material name into a tier (before the first underscore) and a kind (after the last one), then expands:
- any tiered entry → that tier in all six kinds (sword, axe, pickaxe, shovel, hoe, spear);
-
DIAMOND↔NETHERITEare paired, in both directions.
So DIAMOND_SWORD means twelve items: six kinds of diamond and six of netherite. DIAMOND means the same twelve. Entries with no tier, such as BOW and STICK, stay single. Armour lists work the other way round — they only pair the tier and never invent a kind, because an allow-list that invents a kind hands out a slot nobody granted.
Nothing in the file changes when this happens: widening is done in memory on load, so an old config.yml is quietly corrected rather than migrated.
Once, on purpose. The default grew from 6 creatures to 19, and a default is only written when config.yml is created — so an existing server would never see it. On startup the plugin checks whether your list still holds exactly the old six (ZOMBIE, ZOMBIE_VILLAGER, DROWNED, HUSK, ZOMBIFIED_PIGLIN, GIANT); if it does, it writes the nineteen and logs:
Ghoul.Truce.Creatures was still the old six-mob default; it now names 19 grave mobs. Edit config.yml to taste.
If you had edited the list, it is left alone and the log says Ghoul.Truce.Creatures is a list of its own (N entries) - leaving it as it is. The upgrade cannot run twice, because the widened list no longer equals the old one.
Bukkit materials are an enum, and names change between versions. At startup the plugin scans every key containing material:
<key> is set to "<name>", which is not a material in this version - the ability that uses it cannot be used.
Seeing that line means the name does not exist in this version. Use a valid name, or delete config.yml and let it regenerate.
They are matched positionally.
- The vampire/priest recipes throw
IndexOutOfBoundsExceptionand log it when the quantity list is too short, then fall back to 1; - Wolfbane tolerates a short list (missing entries become 1);
- The priest donation
Rewardslist also throws when too short.
Change both tables together.
/sn setChurch means “there is one church, and it is here”: it calls clearChurches() and then addChurch().
For several:
/sn church add # run once at each church location
/sn church list
The church radius is hard-coded at 10 blocks and cannot be configured.
The enderborn uses a separate key, EnderBorn.Convert.Chance (default 0.1). SpreadChance only affects vampire, ghoul and werewolf.
It covers some command messages and the login broadcast; it is not a full localization.
| File | Contents |
|---|---|
plugins/mmSupernaturals/data.yml |
Race, old race, power, truce state |
plugins/mmSupernaturals/storage.dat |
Vampire teleport points, guardian angels, hunter applications |
plugins/mmSupernaturals/config.yml |
All configuration |
plugins/mmSupernaturals/whitelistYaml.yml |
Sign-up list |
Backing up the whole plugins/mmSupernaturals/ directory is enough.
Power changes are not written immediately. data.yml is written only:
- on a conversion / cure / revert;
- when the truce countdown changes;
- on
/sn save; - on a normal shutdown.
storage.dat is written only on a normal shutdown. An abnormal crash can lose recent teleport points, guardian angels and power changes.
Yes. It is ordinary YAML with !player tags. A minimal working entry:
- !player {name: Steve, playername: Steve, superType: vampire, power: 10000.0, superPower: 10000.0}The same concept can appear under both a field name and a property name (playername/name, superType/type, superPower/power); if they disagree, the last one written wins, and 1.5.0 clamps the result on load.
Notes:
- Stop the server first, or the in-memory copy will overwrite your edit.
-
superPoweris clamped to 0–10000. -
superTypemust be one ofSupernatural.Types. - Do not break the
!playertag or the indentation.
No, it is Java-serialized binary. To reset teleport points/guardian angels, stop the server and delete it (which also loses hunter applications).
Every second the timer:
- schedules one synchronous task per online player (
advanceTime); - runs a four-piece armor legality check per player.
That is O(online players) synchronous work per second. Dozens of players are fine; at hundreds this is the main cost. Everything runs on the main thread through the Bukkit API and cannot be moved to async.
- Set
MultiWorld: true; - Revoke
supernatural.world.enabledin that world with a permissions plugin.
The permission defaults to true, so without revoking it everything is enabled. The plugin does not decide by world name.
- This plugin handles damage at
NORMALand observes deaths atMONITOR; if the damage event is already cancelled by another plugin, it returns immediately. - Its only WorldGuard interaction is the
PVPandMOB_SPAWNINGflags. - It is not hard-bound to any permissions plugin; it only logs “found xxx”.
- When two plugins both modify damage, the final value depends on priority order; move one before or after the other and test.
Defaults are game port 25565 and control port 25566. If another server is already running:
mvn -Pit package exec:java -Dit.gamePort=25570 -Dit.controlPort=25571For mvn verify -Pit, pass the ports to the forked JVM:
mvn verify -Pit -DargLine="-Dit.gamePort=25572 -Dit.controlPort=25573"The first run downloads Paper and server dependencies, so slow is normal. On failure, read:
target/it/server/console.log
Common causes:
- the JDK is not 25;
- the network cannot reach the Paper download site;
- 25565/25566 are occupied;
-
exec:javawas run without packaging first (The plugin under test has not been built.).
- Only specific boards are triggers; decorative and explanatory boards do nothing.
- You are too far away (roughly beyond 4 blocks).
- The red wool on the west wall is the exit button, not a board.
- The guide NPC needs a right-click and can be clicked repeatedly.
The test server copies target/mmSupernaturals.jar, and that jar is produced by mvn package. Restarting without repackaging always loads the old plugin.
rm -f target/mmSupernaturals.jar
mvn -Pit package
mvn -Pit package exec:javaThese are behaviours the current version either keeps on purpose or has not covered yet. Know them before deploying:
-
An angel has no in-game cure. Only
/sn cureworks. - The enderborn death counter is in memory. Relogging resets it.
-
[none]means “no weapon restriction”. That is the default for vampire, priest and demon. -
The sign-up system is not strict admission control. With
EnableJoinCommandon,/sn joinwrites the name into the in-memorywhitelistYaml.ymlconfiguration object but never calls save, so entries that were never saved are lost on restart. The conversion check also only blocks “a non-human converting again”, not a human’s first conversion. Use a permissions plugin if you need strict control. -
Configuration is not migrated. New keys are read from built-in defaults and never written into an old
config.yml. -
Power and teleport points are not written in real time. A crash can roll them back; run
/sn saveafter important changes. - The power cap is hard-coded at 10,000. Configuration can change starting values, not the cap.
- The church altar is lethal to non-priest supernaturals. That is the implementation; the church is not a safe zone.
-
Supernatural.SpreadChancedoes not cover the enderborn. It usesEnderBorn.Convert.Chance. -
/sn killlistis not class-locked. A non-hunter only gets a warning; the list is printed anyway. - A weapon ban cannot be narrowed to one item. Since 1.5.1 a tiered name means its whole tier and its paired tier, in every kind — twelve items. Banning exactly one sword would need a code change.
-
A new tier is not covered automatically. A new kind is (the lists are generated from
MaterialTiersand a tier the game extends is picked up), but a new tier — the next material above netherite — only enters the defaults when somebody names it. -
The angel’s armour and animal rules are hard-coded.
GOLDEN/DIAMOND/NETHERITEand “no paired weapon on animals” live inAngelManager, not inconfig.yml.