- Type
- Question
For technical devs
For: plugin developers and server admins← Back to the overview
What changed under our plugins, from Paper 1.21.4 to 26.2 (build 126) and from Velocity 3.4 to 4. Five changes matter most: Java 25, an unobfuscated Minecraft without Paper's plugin remapper, Adventure 5.2.0 on Paper and Velocity, Guice 7 on the proxy, and new major versions of our libraries on our own Maven repository. Admins: your sections are at the end.
Dev: Java 25 and bytecode targets
- Runtime: Paper 26.1+ and Velocity 4 need Java 25 (Paper 1.21.x needed 21, Velocity 3.4 needed 17). The whole network runs Java 25.
- Compiling: paper-api 26.2, velocity-api 4, mcme-base 2.0 and PluginUtils 2.0 are Java 25 class files, so you need JDK 25.
- Java 21 output still works: javac 25.0.2 with
--release 21builds against paper-api 26.2 without a single warning under-Xlint:all. Correction to older notes: the claim that release mode can't read Java 25 class files didn't reproduce. Targeting 21 only helps jars that must also load on 1.21.x. - Shading: maven-shade-plugin before 3.6.1 can't read Java 25 classes, which is why Connect and PvP (on shade 3.5.3) emit Java 21.
- Brigadier: exclude
com.mojang:brigadierand never shade it. The server provides 1.3.10, and MCME-CommandParser's pinned 1.0.17 would clash. - Annotation processors: since JDK 23, javac only runs processors that are configured explicitly (or with
-proc:full). Otherwise Velocity's@Pluginprocessor silently stops writingvelocity-plugin.json(this hit Connect and mcme-base), and Lombok stops running (MCME-PvP). In Maven, list them inannotationProcessorPaths; Gradle'sannotationProcessorconfiguration should be unaffected (not tested). - Gradle: paper-api and velocity-api declare JVM 25 in their module metadata. Per Gradle's docs (not reproduced by us), a build targeting 21 then fails to resolve them unless it calls
java { disableAutoTargetJvm() }.
XML:
<configuration> <!-- maven-compiler-plugin -->
<release>21</release>
<annotationProcessorPaths>
<path>
<groupId>com.velocitypowered</groupId>
<artifactId>velocity-api</artifactId>
<version>4.2.0</version>
</path>
<!-- lombok etc. too -->
</annotationProcessorPaths>
</configuration>
Dev: an unobfuscated Minecraft
Mojang stopped obfuscating Java Edition: 26.1 (24/03/2026) was the first release without an obfuscated variant, with Mojang's own names down to parameters and local variables.- Paper has run Mojang-mapped, without CraftBukkit package relocation, since 1.20.5, so Mojang-mapped NMS plugins already worked on our 1.21.4.
- REMOVED Paper's plugin remapper (26.1). Jars with obfuscated or Spigot names (
EntityHuman,PacketPlayIn…) no longer work, on Paper or Spigot.LibraryLoader.REMAPPERis gone, and thepaperweight-mappings-namespacemanifest entry no longer matters. - REMOVED Reobfuscation:
reobfJaronly applies to 1.21.11 and older, and reobfuscated jars fail on 26.1+. Deploy the plain jar. - Reflection sees Mojang names at runtime. Internals stay unsupported and version-locked: PluginUtils 2.0.1, built against 26.1.2, breaks on 26.2.
- Index-based packet code breaks where Mojang restructured a packet. The 26.1 time packet now carries a map of world clocks, so Environment's ProtocolLib
UPDATE_TIMEtrick threwFieldAccessException; Environment 3.4 uses Paper's per-player time instead.
Code:
// build.gradle.kts
plugins { id("io.papermc.paperweight.userdev") version "2.0.0-beta.23" }
dependencies { paperweight.paperDevBundle("26.2.build.+") }
java { toolchain.languageVersion.set(JavaLanguageVersion.of(25)) }
// no reobfJar on 26.1+: deploy the normal jar
Dev: Paper 1.21.4 to 26.2 API changes
Paper hard-forked from Spigot with 1.21.4, so build against paper-api: Spigot API added since then doesn't exist on Paper. The details are in Paper's posts for 1.21.7, 1.21.9/10, 1.21.11, 26.1 and 26.2.Old
plugin.yml jars survive more than you'd expect: Paper's load-time rewriter fixes many renamed classes and constants, based on the jar's api-version (opt out with -Dpaper.disableOldApiSupport=true), so most removals below break compilation rather than old jars. Assume paper-plugin.yml plugins aren't rewritten (unverified: we found no sign that they are).Dev: Paper versions and version strings
- Versioning (26.1): no more
-R0.1-SNAPSHOT. The dependency is nowio.papermc.paper:paper-api:26.2.build.126-stable; ranges are26.2.build.+(Gradle) or[26.2.build,)(Maven). Keep thebuildpart, or26.1.+can pull in a breaking 26.1.1. We pin one build, after an open range in Connect started resolving to 26.3 pre-releases. - Version strings:
getBukkitVersion()returns26.2.build.126-stable(was1.21.4-R0.1-SNAPSHOT),getMinecraftVersion()returns26.2, andgetVersion()ends in(MC: 26.2). Code that expects a leading1.breaks. - PaperLib is archived, and its regex wants one digit before the first dot, so on 26.2 it should report version 0 (read from the source, not run). WorldEdit 7.4.5 replaced it for compatibility with newer versions.
- paper-api no longer declares json-simple (since 1.21.5), so declare it yourself if you use it.
api-versionaccepts 1.13 to 26.2.
Dev: Adventure 5.2.0 arrives with Paper 26.2
paper-api 1.21.4 ended on Adventure 4.20.0 and Paper 26.1 shipped 4.26.1: 5.2.0 came with 26.2, not 26.1, and Velocity 4 ships it too. See the migration guide.- REMOVED
MessageTypeand everysendMessageoverload that takes anIdentity, such assendMessage(Identity, Component, MessageType). UsesendMessage(Component). - REMOVED
BookMetano longer extendsBookand lost its builder; use its own page methods.PaperComponents.plainSerializer()and theUnsafeValuesserializer getters are gone; use Adventure's serializers. - CHANGED Most
@NonExtendabletypes are sealed,ClickEvent.Actionis no longer an enum, and nullness is JSpecify (non-null by default). Also gone:ClickEvent#value()(usepayload),Style.of,TranslationRegistry(useTranslationStore) andPlainComponentSerializer(usePlainTextComponentSerializer). - Binary compatibility: 5.2.0 restored
BuildableComponentas a bridge, so jars built against 4.x mostly still run; a removed method only fails when it's called, withNoSuchMethodError. Recompile to find them. - Don't shade Adventure or adventure-platform. Correction: the dialog click event is
ClickEvent.showDialog, not theopenDialogin Paper's 1.21.7 post.
Dev: removed Paper API
REMOVED since 1.21.4 (the renames are rewritten for old jars):- Bukkit's DataPack API (use
Bukkit.getDatapackManager()), and spawn chunks (GameRule.SPAWN_CHUNK_RADIUS,WorldCreator#keepSpawnInMemory). - Tooltip components:
HIDE_TOOLTIPandHIDE_ADDITIONAL_TOOLTIPbecameTOOLTIP_DISPLAY, andUNBREAKABLEtakes no value. - Cube mobs (26.2): the Slime methods moved to
AbstractCubeMob, andMagmaCubeis no longer aSlime. - Renamed:
CHAIN→IRON_CHAIN,EntityType.POTION→SPLASH_POTION/LINGERING_POTION,ItemFlag.HIDE_ITEM_SPECIFICS→HIDE_ADDITIONAL_TOOLTIP,PinkPetals→FlowerBed,PointedDripstone→Speleothem. - Also:
TimeSkipEvent.SkipReason(now onClockTimeSkipEvent),RegistryFreezeEvent(useRegistryComposeEvent),isEnabledByFeature, manyVanillaGoalkeys, some sounds and tags, and 29 event constructors (which matters for tests).
Dev: deprecated Paper API that MCME code still uses
CHANGED Still working, but on the way out:- Conversation API, deprecated for removal: unmaintained, no text components, and expected to break eventually. Architect's resource-pack region and inventory editors still use
ConversationFactoryand haven't moved to Dialogs yet. - Integer CustomModelData (
setCustomModelData(Integer)and friends, since 1.21.5): usesetCustomModelDataComponent(...)or theCUSTOM_MODEL_DATAcomponent. Architect's special blocks and custom inventories still use the int form. - GameRule constants, deprecated for removal now that gamerules are a registry (see below). Use the new
GameRulesclass, e.g.GameRules.ADVANCE_TIME. PvP usesDO_IMMEDIATE_RESPAWN; Architect usesDO_FIRE_TICK, whose vanilla rule is gone (we haven't checked what that constant does now). - BungeeCord chat still ships as Paper's deprecated fork, and
player.spigot().sendMessage(ChatMessageType, …)still works; PvP, CommandParser and Environment use md_5 types. Correction to older notes: the md_5 classes were never inside the paper-api jar. Both 1.21.4 and 26.2 only declare the dependency. - Also deprecated: the Metadata API (use PDC),
PlayerLoginEvent(its replacement,PlayerConnectionValidateLoginEvent, fires twice and has noPlayer),PlayerSpawnLocationEvent(use the async one), the millisecondWorldBordermethods,World#setPVP,org.bukkit.block.Bedand/reload.plugin.ymlcommands andBukkitSchedulerare not deprecated.
Dev: new Paper API worth a look
NEW and no longer experimental in 26.2: Dialogs (Dialog.create(...), Audience#showDialog, PlayerCustomClickEvent; see the Paper docs), Brigadier commands through LifecycleEvents.COMMANDS, and data components (ItemStack#getData/setData). Also new since 1.21.4: configuration-phase events and connections, 31 new events, and the GAME_RULE and DIALOG registries.Dev: Paper behavior changes that still compile
- World storage (26.1) follows vanilla. We verified that plugin worlds now sit inside the main world folder, at
world/dimensions/minecraft/<name>, sogetWorldContainer()+ name no longer finds a world: useWorld#getWorldFolder().new WorldCreator(name)gives the keyminecraft:<lowercased name>, and custom keys throw. - World clocks (26.1): each world has its own clock (
time.affects-all-worldsmakes them share one).getTime()andgetFullTime()return 0 in a world without a clock, such as the Nether, wheresetFullTimethrows. There's no clock API yet. - Per-player time:
setPlayerTime(time, tickTime)now syncs immediately, andfalsestill freezes the player's clock. Corrections to older notes: that freeze isn't new (1.21.4 did it too, so the old ProtocolLib "negate dayTime" hack was never needed), andgetGameTime()is unchanged: ticks since world creation, untouched by/time set. - Also: teleporting a vehicle keeps its passengers (1.21.10);
PlayerGameModeChangeEventhas a new cause,GAMEMODE_SWITCHER(F3+F4); beds (26.2) are plain blocks and lose their PDC;MushroomCowno longer extendsCow; name tags only render the 16 legacy colors. - Old command syntax fails harder: PvP 1.1.2 set team colors with a pre-1.13 console command that older servers silently ignored. On 26.2 it aborts startup; PvP 2.0.0 fixes it.
Java:
// Broken on 26.1+: no longer a world folder
new File(Bukkit.getWorldContainer(), world.getName());
// Use:
world.getWorldFolder();
Dev: Velocity 3.4 to 4.2
Our proxy went from 3.4.0-SNAPSHOT to 4.2.1-SNAPSHOT (build 31). Velocity 4.0.0 came out on 14/07/2026; 4.2.0 (14/09/2026) adds 26.3.- Java 25 to run, and to compile against velocity-api 4.
- Adventure 5.2.0 (was 4.26.1): see above.
- Guice 7 drops
javax.inject. A constructor annotated@javax.inject.Injectno longer compiles, and old jars fail withGuice/MissingConstructor, as MCME-Introduction's proxy half did until 1.2.0. Usecom.google.inject.Inject. Correction to older notes: Guice 7 came with the 3.5.0 line (first shipped in 3.5.1), not with 4.0; we only meet it now because we jumped from 3.4.0 straight to 4.x. - Newer libraries on the API classpath, also since 3.5: Guava 33, SnakeYAML 2 (was 1.33), Gson 2.14, Configurate 4.2.0 and jspecify 1.0.
- Velocity's own API removed nothing from 3.4.0 to 4.2.0. New:
@Plugin(provides = …),PlayerClientLoadedWorldEvent(beta) andProtocolVersion.MINECRAFT_26_2.velocity-proxyisn't published on repo.papermc.io, so take internals from the proxy jar.
Java:
import com.google.inject.Inject; // not javax.inject.Inject
@Plugin(id = "myplugin", version = "1.0.0",
dependencies = {@Dependency(id = "mcme-base")})
public final class MyPlugin {
@Inject
public MyPlugin(ProxyServer server) { }
}
velocity-plugin.json is still generated from @Plugin. A hand-written one isn't overwritten, which is how stale versions end up in jars.Dev: MCME libraries and the Maven repository
Our three core libraries took new major versions for the platform move. All are public on GitHub, and none may be shaded: declare them as runtime dependencies instead.Dev: mcme-base 2.0
MCME-Base is the platform-neutral layer under MCME-Connect. 2.0.1 (13/09/2026) is the first release published by CI, anddevelopment publishes snapshots automatically.- REMOVED BungeeCord/Waterfall:
BungeeBasePlugin, the 20 classes incom.mcmiddleearth.base.bungee, andwaterfall-api. - CHANGED Adventure is no longer shaded. Don't pin Adventure yourself: that downgrades it and breaks compilation.
BukkitMcmeLoggernow implementsMcmeLoggerdirectly. - FIXED
YamlConfiguration(File)leaked a file handle on every config read (2.0.1). - Quirk: Velocity lists mcme-base as 1.0-SNAPSHOT whatever the real version, because a stale hand-written
velocity-plugin.jsonships in the jar (the processor doesn't run on JDK 25 without explicit configuration). Paper's/versionis right.
com.mcmiddleearth:mcme-base:2.0.1 (the old MCME-Base artifactId is dead), with depend: [MCME-Base] on Paper and @Dependency(id = "mcme-base") on Velocity.Dev: PluginUtils 2.0
PluginUtils, which about 15 of our plugins hard-depend on, lives on thepluginutils-26.2 branch, with bare X.Y.Z tags and a changelog.- CHANGED Gradle and paperweight-userdev instead of Maven with a hand-placed server jar (PR #23), so it builds anywhere.
- CHANGED Paper 26.2 only: the NMS helpers were ported to 26.x internals. Anything built against a version before 2.0.2 hits
NoSuchMethodErroron 26.2. - FIXED
/dev(2.0.3):plugin.ymlsaidpermission:instead ofpermissions:, sopluginutil.developerwas never registered and LuckPerms refused everyone, ops included. - NEW
FancyMessage.setCopyToClipboard(). 2.0.4 declares json-simple, so MockBukkit tests no longer need their own copy. - REMOVED The dead
NMSUtilhelper.
com.mcmiddleearth:PluginUtils:2.0.4 (compileOnly plus testImplementation in Gradle) with depend: [PluginUtils]. Pin 2.0.2 or later: 2.0.0 was withdrawn (unfilled plugin.yml tokens), 2.0.1 was a JitPack-only 26.1.2 build, and 2.0.2 to 2.0.4 have identical classes. Avoid JitPack's com.github.MCME:PluginUtils: another groupId is another library to Maven and Gradle, so you can end up with two copies.Dev: MCME-Connect 3.0 API notes
MCME-Connect 3.0.3 (23/09/2026) is one jar for the proxy and every backend; 3.0.1 was the first version ever published.- REMOVED The Bungee half (
connect.bungee,connect.proxy.bungee). - Unchanged API:
PlayerConnectEventandConnectUtil.sendMessage(...). A move started by another plugin now reportsConnectReason.PLUGINinstead ofUNKNOWN. - CHANGED Needs mcme-base 2.0.1+ on the proxy and every backend. Built against Multiverse-Core 5.
- Contributing: bump
@Plugin(version)together with the pom (a test enforces it), and add aCHANGELOG.mdsection before tagging.
com.mcmiddleearth:MCME-Connect:3.0.3. Older pins such as 1.4.5 or 1.5.1 exist in no repository.Dev: repo.mcmiddleearth.com
Since 13/09/2026 we have our own Maven repository. Reads are anonymous; publishing needs a token, and releases come from CI. JitPack is no longer used for MCME's own libraries, and builds no longer depend on jars installed by hand.https://repo.mcmiddleearth.com/releases: MCME releases plus a few vendored third-party jars. Immutable: a version can never be redeployed.https://repo.mcmiddleearth.com/snapshots:-SNAPSHOTbuilds from development branches.https://repo.mcmiddleearth.com/mirror: a caching proxy of PaperMC, Maven Central, JitPack, OnARandomBox (Multiverse), Scarsz, EssentialsX and Mojang's libraries. List it before upstream repositories, so builds survive their outages.
XML:
<repositories>
<repository>
<id>mcme-releases</id>
<url>https://repo.mcmiddleearth.com/releases</url>
<snapshots><enabled>false</enabled></snapshots>
</repository>
<repository>
<id>mcme-mirror</id>
<url>https://repo.mcmiddleearth.com/mirror</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.mcmiddleearth</groupId>
<artifactId>mcme-base</artifactId> <!-- or PluginUtils 2.0.4, MCME-Connect 3.0.3 -->
<version>2.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
Code:
// build.gradle.kts
repositories {
maven("https://repo.mcmiddleearth.com/releases")
maven("https://repo.mcmiddleearth.com/mirror")
}
dependencies {
compileOnly("com.mcmiddleearth:PluginUtils:2.0.4")
testImplementation("com.mcmiddleearth:PluginUtils:2.0.4")
}
Dev: build, CI and jar naming
Jar names follow{Name}-{A.B.C}-{TYPE}-{commit}.jar (TYPE is RELEASE, DEV or SNAPSHOT), e.g. MCME-Connect-3.0.3-RELEASE-7d5f18e.jar, in Connect, Introduction, PvP and Architect 3.0.0; the libraries keep plain names. Why: different builds kept shipping under one version. Two production Connect jars both said 2.0.1 (one of them stole /warp), two different source trees both called themselves Architect 2.10.6, and PluginUtils 2.0.2 existed twice with different checksums. Admins: identify jars by checksum, and remove the old jar when you install a new one.It's
git-commit-id-maven-plugin 9.0.1 plus a build.type property in <finalName> (see Connect's pom). Never declare git.commit.id.abbrev in <properties>, build after committing, and in a linked git worktree pass -Dgit.commit.id.abbrev=$(git rev-parse --short=7 HEAD), because the plugin stamps the main checkout's HEAD there.CI (GitHub Actions, JDK 25) builds and tests every push and pull request. Releases are only published from a tag (
vX.Y.Z, bare X.Y.Z for PluginUtils) or a manual run, so a normal push or merge never publishes one; mcme-base also publishes snapshots from development. Connect's release job checks the tag against the pom and the changelog before it deploys, then attaches the jar and a .sha256 to a GitHub release. Versions are never reused: unpublished ones are skipped (Connect 3.0.0 and 3.0.2), and the releases repository refuses redeploys.Dev: third-party plugin APIs
- Multiverse-Core 5 (
org.mvplugins.multiverse.core:multiverse-core, currently 5.8.1): start fromMultiverseCoreApi.get()(see the API starter). The API uses vavrOptiontypes, and vavr is relocated inside the Multiverse jar, so don't addio.vavr. The MV4com.onarandomboxAPI is gone (Connect's old spawn lookup flooded the log withNoClassDefFoundErroruntil 3.0.1), and placeholders moved to%multiverse-core_…%. - ProtocolLib has no stable 26.x release, only the rolling GitHub
dev-build(5.5.0-SNAPSHOT), whose main jar is now a Paper plugin (listed under Paper plugins at startup). Since 5.4.0 the coordinate isnet.dmulloy2:ProtocolLibon Maven Central (wascom.comphenix.protocol). Our servers run 5.5.0-SNAPSHOT-67ce937. - adventure-platform is archived (last release 4.4.1). Use native Adventure on Paper and Velocity.
- DiscordSRV 1.30.5 is still on JDA 4 with its own Adventure 4, so JDA-4 code such as TheGaffer's Discord embed keeps working. DiscordSRV v3 (testing builds only) moves to JDA 6 and Adventure 5 and will break it.
- Dynmap has no official 26.x build (3.8 stops at 1.21.11); we run a community build for 26.1 to 26.3 that enables cleanly on 7 servers. An official build loaded on 26.2 fails to enable while
getPlugin("dynmap")still returns it, so checkisPluginEnabled("dynmap"), as the new Warps and Architect code does. - WorldEdit supports 26.2 from 7.4.4, and FastAsyncWorldEdit from 2.15.3.
Admin: gamerules renamed in 1.21.11
Gamerules became a registry in 1.21.11, with snake_case IDs (keepInventory is now keep_inventory); 26.x changed nothing further. Two things are unverified, so test them: whether the old camelCase names still work in /gamerule, and whether existing worlds kept their values through the rename.⚠ ACTION REQUIRED for new worldsdoFireTickis gone. Its replacement,fire_spread_radius_around_player, defaults to 128 (0 = no spread, -1 = unlimited). Our existing worlds came through fine: all 35 dimensions on our 10 servers read 0 (checked 23/09/2026). Any new build world needs it set:
Multiverse 5'sCode:/gamerule fire_spread_radius_around_player 0/mv gamerule set fire_spread_radius_around_player 0 *should cover all worlds at once (syntax from its docs, untested with this rule). In 26.x the rules are stored per dimension indata/minecraft/game_rules.dat, no longer inlevel.dat.
Three rules are inverted:
disableRaids → raids, disableElytraMovementCheck → elytra_movement_check and disablePlayerMovementCheck → player_movement_check, so an old disableRaids true is now raids false. Every do… rule got a new name: doDaylightCycle is now advance_time, doTileDrops is block_drops, and so on. Update command blocks, scripts and configs that name gamerules.| Up to 1.21.10 | 1.21.11 and later |
|---|---|
| allowEnteringNetherUsingPortals | allow_entering_nether_using_portals (added 1.21.9) |
| allowFireTicksAwayFromPlayer | removed: fire_spread_radius_around_player -1 |
| announceAdvancements | show_advancement_messages |
| blockExplosionDropDecay | block_explosion_drop_decay |
| commandBlockOutput | command_block_output |
| commandBlocksEnabled | command_blocks_work (added 1.21.9) |
| commandModificationBlockLimit | max_block_modifications |
| disableElytraMovementCheck | elytra_movement_check (inverted) |
| disablePlayerMovementCheck | player_movement_check (inverted) |
| disableRaids | raids (inverted) |
| doDaylightCycle | advance_time |
| doEntityDrops | entity_drops |
| doFireTick | removed: fire_spread_radius_around_player (default 128, 0 = off) |
| doImmediateRespawn | immediate_respawn |
| doInsomnia | spawn_phantoms |
| doLimitedCrafting | limited_crafting |
| doMobLoot | mob_drops |
| doMobSpawning | spawn_mobs |
| doPatrolSpawning | spawn_patrols |
| doTileDrops | block_drops |
| doTraderSpawning | spawn_wandering_traders |
| doVinesSpread | spread_vines |
| doWardenSpawning | spawn_wardens |
| doWeatherCycle | advance_weather |
| drowningDamage | drowning_damage |
| enderPearlsVanishOnDeath | ender_pearls_vanish_on_death |
| fallDamage | fall_damage |
| fireDamage | fire_damage |
| forgiveDeadPlayers | forgive_dead_players |
| freezeDamage | freeze_damage |
| globalSoundEvents | global_sound_events |
| keepInventory | keep_inventory |
| lavaSourceConversion | lava_source_conversion |
| locatorBar | locator_bar |
| logAdminCommands | log_admin_commands |
| maxCommandChainLength | max_command_sequence_length |
| maxCommandForkCount | max_command_forks |
| maxEntityCramming | max_entity_cramming |
| minecartMaxSpeed (experimental) | max_minecart_speed (unverified) |
| mobExplosionDropDecay | mob_explosion_drop_decay |
| mobGriefing | mob_griefing |
| naturalRegeneration | natural_health_regeneration |
| playersNetherPortalCreativeDelay | players_nether_portal_creative_delay |
| playersNetherPortalDefaultDelay | players_nether_portal_default_delay |
| playersSleepingPercentage | players_sleeping_percentage |
| projectilesCanBreakBlocks | projectiles_can_break_blocks |
| pvp | pvp (added 1.21.9, was server.properties) |
| randomTickSpeed | random_tick_speed |
| reducedDebugInfo | reduced_debug_info |
| sendCommandFeedback | send_command_feedback |
| showDeathMessages | show_death_messages |
| snowAccumulationHeight | max_snow_accumulation_height |
| spawnMonsters | spawn_monsters (added 1.21.9) |
| spawnRadius | respawn_radius |
| spawnerBlocksEnabled | spawner_blocks_work (added 1.21.9) |
| spectatorsGenerateChunks | spectators_generate_chunks |
| tntExplodes | tnt_explodes |
| tntExplosionDropDecay | tnt_explosion_drop_decay |
| universalAnger | universal_anger |
| waterSourceConversion | water_source_conversion |
spawnChunkRadius was already removed in 1.21.9.Admin: server settings and world storage
- CHANGED Four
server.propertieskeys are gamerules now (1.21.9), so they're per world and can change live:allow-nether→allow_entering_nether_using_portals,enable-command-block→command_blocks_work,pvp→pvpandspawn-monsters→spawn_monsters. Whether old values were migrated is unverified, so check them per world. - REMOVED Spawn chunks (1.21.9). A dimension only ticks while a player, a force-loaded chunk, an active portal or a flying ender pearl keeps it active; use
/forceload. Multiverse'skeep-spawn-in-memoryno longer does anything. - CHANGED World folders (26.1) are migrated on first load, with no way back. The Overworld moves to
dimensions/minecraft/overworld/(the Nether and End sit next to it), Paper's plugin worlds toworld/dimensions/minecraft/<name>/, player data toplayers/and much oflevel.dattodata/minecraft/. Backup scripts, stats scanners and map renderers need the new paths. Unverified: vanilla's upgrade screen refuses worlds containing symlinks (seen only in the singleplayer client), so check a world folder for symlinks before its first 26.x load. - CHANGED Time (26.1), for command blocks and scripts:
/time query daytimeis gone,/time query daynow seems to mean ticks into the day (days elapsed is/time query day repetition; inferred, so test it), and in the Nether use/time of minecraft:overworld …. - NEW Separate spam limits (26.2):
chat-spam-threshold-secondsandcommand-spam-threshold-seconds, default 10, 0 = off. Chat and commands used to share one counter, so builders firing many commands could be kicked (MC-302268). The default kicks at about 11 messages in a second, or 21 in 10 seconds. Paper has no chat or command spam settings of its own (its spam-limiter covers tab-complete and recipe spam only), so these keys are the ones that count. All our servers use the default 10. - CHANGED
/worldborderdurations are in ticks (1.21.11); addsfor seconds ordfor days. An old/worldborder set 5000 60now takes 3 seconds. Each dimension has its own border since 1.21.9. - CHANGED
/setworldspawnand/spawnpoint(1.21.9) take yaw and pitch instead of a single angle, and/setworldspawnworks in any dimension. The wiki still shows the old syntax, so test it. - NEW
management-server-*keys (1.21.9) for the Server Management Protocol, a WebSocket API that's off by default (whether Paper exposes it is unverified). Console commands now run in the respawn dimension, not always the Overworld.
Admin: plugin configuration after the update
- ⚠ ACTION REQUIRED MCME-Architect only writes
protocolVersions.ymlwhen it's missing, so existing copies never learn new client versions. Ours is one file shared by every server and already has'26_1': 775and'26_2': 776(1.21.5 to 1.21.11 are protocols 770 to 774). Every version key used in the resource-pack sections of Architect'sconfig.ymlmust exist in this file, or that pack resolves to nothing. Still open: no ServerResourcePacks entry has a26_2key yet, so 26.2 players get the 1.21.4 builds. Add them in all three configs (shared, rpserver, eventserver) once the 26.2 packs are published. - MCME-Environment 3.4 now reliably owns
/ptimeand/pweather(itsloadbeforenamed EssentialsX, whose plugin name isEssentials; EssentialsX's versions stay reachable as/essentials:ptime).env.ptimeandenv.pweatherdefault to op, so grant them to the ranks that should have them (ours come from the default group); the tab list's tips advertise both. Environment isn't installed on moria and terrain, so there EssentialsX answers these commands. Keep ProtocolLib installed, since Environment's startup still calls it. - Multiverse-Core 5, teleports:
teleport.use-finer-teleport-permissionsdefaults to true and survives the migration, so/mvtpchecksmultiverse.teleport.<self|other>.<type>.<target>(e.g.multiverse.teleport.self.w.<world>) and/mvspawnchecksmultiverse.core.spawn.<self|other>.<world>. MV4 nodes alone aren't enough: check the setting and your LuckPerms grants. (Cross-server/mvtpis Connect's.) - Multiverse-Core 5, entity sweep (5.7.3+): every chunk load removes entities whose type the world's spawn settings disallow, except those spawned by command, plugin, breeding or spawn egg (5.8.1). MV4's
spawn: falsefor animals or monsters migrates straight across, so old decorative mobs in such a world can vanish. On our networkworld.auto-purge-entitiesis true on all 10 servers, and most build worlds have both animal and monster spawning off. We're leaving it on for now; if decorative mobs start disappearing, setting it to false on that server stops the purge. - MCME-Connect 3.0:
/restorestatsstays disabled, with a warning, until you set the new proxy keyrestorestatsBasePathto the network's root folder. Nothing else needs migrating; the oldtabListkeys andannouncements.ymlare ignored and can go. Install mcme-base 2.0.1+ everywhere first. - PluginUtils 2.0: replace the jar in place and never keep two copies. Grant
pluginutil.developerto non-op staff who need/dev. - EssentialsX 2.22.0 logs "unsupported server version" at SEVERE level on every start on 26.2, since it officially stops at 26.1.2. It's only a label and nothing is disabled; 2.22.1 dev builds list 26.2. Also in 2.22.0:
auto-afk-kickbecameafk-timeout-commands. - CoreProtect 24 adds an
error-reportingsetting, on by default, that sends error reports to the plugin author. For privacy, consider switching it off.
Unload, remove, delete and regen now fail while players are in the world, unless you add
--remove-players. The config is migrated in place without a backup, and there's no downgrade. enforce-flight is on, so non-creative players lose flight where allow-flight is false; we haven't checked whether that affects builders. The command changes are in the builders' chapter.Found something we missed? See Known issues and what's next.
Last edited: