26.2 Changelog 6/7: For technical devs

Status
Not open for further replies.

q220

Founder
Staff member
Supporter
Credits
10
XP
96
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 21 builds 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:brigadier and 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 @Plugin processor silently stops writing velocity-plugin.json (this hit Connect and mcme-base), and Lombok stops running (MCME-PvP). In Maven, list them in annotationProcessorPaths; Gradle's annotationProcessor configuration 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.REMAPPER is gone, and the paperweight-mappings-namespace manifest entry no longer matters.
  • REMOVED Reobfuscation: reobfJar only 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_TIME trick threw FieldAccessException; Environment 3.4 uses Paper's per-player time instead.
paperweight-userdev is Gradle-only, and only its latest version is supported. A grep of our main plugin repos found NMS imports only in PluginUtils.
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 now io.papermc.paper:paper-api:26.2.build.126-stable; ranges are 26.2.build.+ (Gradle) or [26.2.build,) (Maven). Keep the build part, or 26.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() returns 26.2.build.126-stable (was 1.21.4-R0.1-SNAPSHOT), getMinecraftVersion() returns 26.2, and getVersion() ends in (MC: 26.2). Code that expects a leading 1. 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-version accepts 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 MessageType and every sendMessage overload that takes an Identity, such as sendMessage(Identity, Component, MessageType). Use sendMessage(Component).
  • REMOVED BookMeta no longer extends Book and lost its builder; use its own page methods. PaperComponents.plainSerializer() and the UnsafeValues serializer getters are gone; use Adventure's serializers.
  • CHANGED Most @NonExtendable types are sealed, ClickEvent.Action is no longer an enum, and nullness is JSpecify (non-null by default). Also gone: ClickEvent#value() (use payload), Style.of, TranslationRegistry (use TranslationStore) and PlainComponentSerializer (use PlainTextComponentSerializer).
  • Binary compatibility: 5.2.0 restored BuildableComponent as a bridge, so jars built against 4.x mostly still run; a removed method only fails when it's called, with NoSuchMethodError. Recompile to find them.
  • Don't shade Adventure or adventure-platform. Correction: the dialog click event is ClickEvent.showDialog, not the openDialog in 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_TOOLTIP and HIDE_ADDITIONAL_TOOLTIP became TOOLTIP_DISPLAY, and UNBREAKABLE takes no value.
  • Cube mobs (26.2): the Slime methods moved to AbstractCubeMob, and MagmaCube is no longer a Slime.
  • Renamed: CHAINIRON_CHAIN, EntityType.POTIONSPLASH_POTION / LINGERING_POTION, ItemFlag.HIDE_ITEM_SPECIFICSHIDE_ADDITIONAL_TOOLTIP, PinkPetalsFlowerBed, PointedDripstoneSpeleothem.
  • Also: TimeSkipEvent.SkipReason (now on ClockTimeSkipEvent), RegistryFreezeEvent (use RegistryComposeEvent), isEnabledByFeature, many VanillaGoal keys, 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 ConversationFactory and haven't moved to Dialogs yet.
  • Integer CustomModelData (setCustomModelData(Integer) and friends, since 1.21.5): use setCustomModelDataComponent(...) or the CUSTOM_MODEL_DATA component. 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 GameRules class, e.g. GameRules.ADVANCE_TIME. PvP uses DO_IMMEDIATE_RESPAWN; Architect uses DO_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 no Player), PlayerSpawnLocationEvent (use the async one), the millisecond WorldBorder methods, World#setPVP, org.bukkit.block.Bed and /reload. plugin.yml commands and BukkitScheduler are 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>, so getWorldContainer() + name no longer finds a world: use World#getWorldFolder(). new WorldCreator(name) gives the key minecraft:<lowercased name>, and custom keys throw.
  • World clocks (26.1): each world has its own clock (time.affects-all-worlds makes them share one). getTime() and getFullTime() return 0 in a world without a clock, such as the Nether, where setFullTime throws. There's no clock API yet.
  • Per-player time: setPlayerTime(time, tickTime) now syncs immediately, and false still 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), and getGameTime() is unchanged: ticks since world creation, untouched by /time set.
  • Also: teleporting a vehicle keeps its passengers (1.21.10); PlayerGameModeChangeEvent has a new cause, GAMEMODE_SWITCHER (F3+F4); beds (26.2) are plain blocks and lose their PDC; MushroomCow no longer extends Cow; 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.
  1. Java 25 to run, and to compile against velocity-api 4.
  2. Adventure 5.2.0 (was 4.26.1): see above.
  3. Guice 7 drops javax.inject. A constructor annotated @javax.inject.Inject no longer compiles, and old jars fail with Guice/MissingConstructor, as MCME-Introduction's proxy half did until 1.2.0. Use com.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.
  4. 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.
  5. Velocity's own API removed nothing from 3.4.0 to 4.2.0. New: @Plugin(provides = …), PlayerClientLoadedWorldEvent (beta) and ProtocolVersion.MINECRAFT_26_2. velocity-proxy isn'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, and development publishes snapshots automatically.
  • REMOVED BungeeCord/Waterfall: BungeeBasePlugin, the 20 classes in com.mcmiddleearth.base.bungee, and waterfall-api.
  • CHANGED Adventure is no longer shaded. Don't pin Adventure yourself: that downgrades it and breaks compilation. BukkitMcmeLogger now implements McmeLogger directly.
  • 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.json ships in the jar (the processor doesn't run on JDK 25 without explicit configuration). Paper's /version is right.
Use 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 the pluginutils-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 NoSuchMethodError on 26.2.
  • FIXED /dev (2.0.3): plugin.yml said permission: instead of permissions:, so pluginutil.developer was 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 NMSUtil helper.
Use 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: PlayerConnectEvent and ConnectUtil.sendMessage(...). A move started by another plugin now reports ConnectReason.PLUGIN instead of UNKNOWN.
  • 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 a CHANGELOG.md section before tagging.
Use 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: -SNAPSHOT builds 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 from MultiverseCoreApi.get() (see the API starter). The API uses vavr Option types, and vavr is relocated inside the Multiverse jar, so don't add io.vavr. The MV4 com.onarandombox API is gone (Connect's old spawn lookup flooded the log with NoClassDefFoundError until 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 is net.dmulloy2:ProtocolLib on Maven Central (was com.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 check isPluginEnabled("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 worlds doFireTick is 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:
Code:
/gamerule fire_spread_radius_around_player 0
Multiverse 5's /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 in data/minecraft/game_rules.dat, no longer in level.dat.

Three rules are inverted: disableRaidsraids, disableElytraMovementCheckelytra_movement_check and disablePlayerMovementCheckplayer_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.101.21.11 and later
allowEnteringNetherUsingPortalsallow_entering_nether_using_portals (added 1.21.9)
allowFireTicksAwayFromPlayerremoved: fire_spread_radius_around_player -1
announceAdvancementsshow_advancement_messages
blockExplosionDropDecayblock_explosion_drop_decay
commandBlockOutputcommand_block_output
commandBlocksEnabledcommand_blocks_work (added 1.21.9)
commandModificationBlockLimitmax_block_modifications
disableElytraMovementCheckelytra_movement_check (inverted)
disablePlayerMovementCheckplayer_movement_check (inverted)
disableRaidsraids (inverted)
doDaylightCycleadvance_time
doEntityDropsentity_drops
doFireTickremoved: fire_spread_radius_around_player (default 128, 0 = off)
doImmediateRespawnimmediate_respawn
doInsomniaspawn_phantoms
doLimitedCraftinglimited_crafting
doMobLootmob_drops
doMobSpawningspawn_mobs
doPatrolSpawningspawn_patrols
doTileDropsblock_drops
doTraderSpawningspawn_wandering_traders
doVinesSpreadspread_vines
doWardenSpawningspawn_wardens
doWeatherCycleadvance_weather
drowningDamagedrowning_damage
enderPearlsVanishOnDeathender_pearls_vanish_on_death
fallDamagefall_damage
fireDamagefire_damage
forgiveDeadPlayersforgive_dead_players
freezeDamagefreeze_damage
globalSoundEventsglobal_sound_events
keepInventorykeep_inventory
lavaSourceConversionlava_source_conversion
locatorBarlocator_bar
logAdminCommandslog_admin_commands
maxCommandChainLengthmax_command_sequence_length
maxCommandForkCountmax_command_forks
maxEntityCrammingmax_entity_cramming
minecartMaxSpeed (experimental)max_minecart_speed (unverified)
mobExplosionDropDecaymob_explosion_drop_decay
mobGriefingmob_griefing
naturalRegenerationnatural_health_regeneration
playersNetherPortalCreativeDelayplayers_nether_portal_creative_delay
playersNetherPortalDefaultDelayplayers_nether_portal_default_delay
playersSleepingPercentageplayers_sleeping_percentage
projectilesCanBreakBlocksprojectiles_can_break_blocks
pvppvp (added 1.21.9, was server.properties)
randomTickSpeedrandom_tick_speed
reducedDebugInforeduced_debug_info
sendCommandFeedbacksend_command_feedback
showDeathMessagesshow_death_messages
snowAccumulationHeightmax_snow_accumulation_height
spawnMonstersspawn_monsters (added 1.21.9)
spawnRadiusrespawn_radius
spawnerBlocksEnabledspawner_blocks_work (added 1.21.9)
spectatorsGenerateChunksspectators_generate_chunks
tntExplodestnt_explodes
tntExplosionDropDecaytnt_explosion_drop_decay
universalAngeruniversal_anger
waterSourceConversionwater_source_conversion
Bold = more than the plain snake_case conversion. spawnChunkRadius was already removed in 1.21.9.


Admin: server settings and world storage​

  • CHANGED Four server.properties keys are gamerules now (1.21.9), so they're per world and can change live: allow-netherallow_entering_nether_using_portals, enable-command-blockcommand_blocks_work, pvppvp and spawn-monstersspawn_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's keep-spawn-in-memory no 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 to world/dimensions/minecraft/<name>/, player data to players/ and much of level.dat to data/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 daytime is gone, /time query day now 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-seconds and command-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 /worldborder durations are in ticks (1.21.11); add s for seconds or d for days. An old /worldborder set 5000 60 now takes 3 seconds. Each dimension has its own border since 1.21.9.
  • CHANGED /setworldspawn and /spawnpoint (1.21.9) take yaw and pitch instead of a single angle, and /setworldspawn works 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.yml when it's missing, so existing copies never learn new client versions. Ours is one file shared by every server and already has '26_1': 775 and '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's config.yml must exist in this file, or that pack resolves to nothing. Still open: no ServerResourcePacks entry has a 26_2 key 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 /ptime and /pweather (its loadbefore named EssentialsX, whose plugin name is Essentials; EssentialsX's versions stay reachable as /essentials:ptime). env.ptime and env.pweather default 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-permissions defaults to true and survives the migration, so /mvtp checks multiverse.teleport.<self|other>.<type>.<target> (e.g. multiverse.teleport.self.w.<world>) and /mvspawn checks multiverse.core.spawn.<self|other>.<world>. MV4 nodes alone aren't enough: check the setting and your LuckPerms grants. (Cross-server /mvtp is 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: false for animals or monsters migrates straight across, so old decorative mobs in such a world can vanish. On our network world.auto-purge-entities is 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: /restorestats stays disabled, with a warning, until you set the new proxy key restorestatsBasePath to the network's root folder. Nothing else needs migrating; the old tabList keys and announcements.yml are 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.developer to 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-kick became afk-timeout-commands.
  • CoreProtect 24 adds an error-reporting setting, 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:
Status
Not open for further replies.
Back
Top