< Back to news index

26.1

3 min read 777 words
Paper Team

The 26.1 Update

As always, backups are absolutely mandatory. After upgrading your world to 26.1, you cannot downgrade back to a lower version!

We would like to thank everyone that worked on this update:

If you’d like to support PaperMC as a whole, you can find more information at https://papermc.io/sponsors.

Changes for server owners

World storage changes

Vanilla changed the way world data and dimensions are stored. Paper previously inherited the decade-old Bukkit way of storing world data, which we finally changed to become closer to Vanilla (without losing features like per-world gamerules, spawn points, or other custom settings). This means the structure will look as follows now:

world/
├── data/
│   └── minecraft/
│       ...
├── datapacks/
├── dimensions/
│   └── minecraft/
│       ├── overworld/
│       │   ├── data/
│       │   │   ├── minecraft/
│       │   │   │   ├── weather.dat
│       │   │   │   ├── ...
│       │   │   │   └── world_gen_settings.dat
│       │   │   └── paper/
│       │   │       ├── level_overrides.dat
│       │   │       ├── metadata.dat
│       │   │       └── persistent_data_container.dat
│       │   ├── entities/
│       │   ├── poi/
│       │   ├── region/
│       │   └── paper-world.yml
│       ├── the_nether/
│       │   ├── data/...
│       │   ├── entities/
│       │   ├── poi/
│       │   ├── region/
│       │   └── paper-world.yml
│       └── the_end/
│           ├── data/...
│           ├── entities/
│           ├── poi/
│           ├── region/
│           └── paper-world.yml
├── players/
│   ├── advancements/
│   ├── data/
│   └── stats/
└── level.dat

Instead of being in separate folders in the server root directory, dimensions are split into separate folders in the world/dimensions/ directory. Paper-specific data and overrides are stored properly in their own data directories. Per-world paper-world.yml files have been moved to the dimension folders, too.

Per-world time

One notable exception to getting closer to Vanilla is per-world time. Due to clocks being registry-driven, which cannot be modified after startup, we make all clocks per-world by default to allow dynamic world creation with their own time as before. You can toggle this behavior via the new time.affects-all-worlds config option.

Compression format

Paper’s unsupported-settings.compression-format setting has been merged into Vanilla’s server.properties region-file-compression entry, which has been modified to allow gzip.


For developers

Paper & Minecraft versioning changes

Mojang has changed their versioning scheme. Versions start with the current year, then the drop number within that year, possibly followed by patch and hotfix numbers; hence we got 26.1.2.

We are also finally breaking with the long-lived tradition of having never-increasing -R0.1-SNAPSHOT versions and are moving to the following: <mcversion>.build.<build>-<status>, e.g.: 26.1.2.build.23-alpha. This much more clearly indicates the status of the build as well as an increasing build number.

To get similar behavior to SNAPSHOT versions in your build configuration files, you can use 26.1.2.build.+ to have Gradle automatically resolve the latest build for that version. Please make sure to keep the build in there, otherwise a version like 26.1.+ would resolve to a possibly breaking version like 26.1.1.

World keys

With the world storage changes, we started moving away from World names internally. WorldInfo#getName and related API has been marked as obsolete and may be deprecated in the future. Where possible, you should use its getKey methods instead.

ClockTimeSkipEvent

With the time.affects-all-worlds config option comes a new parent event to the existing TimeSkipEvent. As of now, there is no API for getting clocks, but that’s where it will be put at some point. Note that when the option is toggled to follow Vanilla behavior of clocks being server-wide, only the new parent event is called for most command and API actions.

Unobfuscated server jars

This section only affects plugin devs using server internals, whether directly or through reflection.

Mojang is no longer providing obfuscated server jars and instead have them contain all class, method, field names, etc. Due to this, we have fully dropped the internal remapper - obfuscated names no longer exist in the server jar.


Other changes and additions

Here is a selection of other notable additions since the last major update post:

Configuration

  • add-plugin-dir startup argument to load an additional plugin directory
  • Along with a fix to a memory leak, we added misc.max-tracking-combat-entries to increase or reduce the number of combat tracker entries before they are discarded
  • Made the arrow despawn rate override configurable via entities.spawning.max-arrow-despawn-invulnerability
  • Allow spam-limiter.incoming-packet-treshold to be properly disabled by setting it to -1
  • Added unsupported-settings.ticking.chunks and blockEntities to allow disabling chunk and block entity ticking. This is useful for lobby servers that don’t need chunk ticking (mob spawning, random block ticking, thunder, ice and snow) or block entity ticking (functionality of hoppers, furnaces, etc.)

API

  • World#locateNearestPoi and locateAllPoiInRange to find nearby points of interest
  • WorldCreator#forcedSpawnPosition to skip spawn location search on world creation
  • PositionedRayTraceConfigurationBuilder#blockCollisionMode for looking for block collisions
  • EntityLungeEvent, PlayerToggleEntityAgeLockEvent, PlayerSwapWithEquipmentSlotEvent, ItemCraftedEvent
  • PlayerPurchaseEvent#getMerchant
  • FurnaceExtractEvent#getItemStack
  • VehicleDamage/DestroyEvent#getDamageSource
  • RecipeChoice.ItemTypeChoice
  • Mannequin.validPoses
  • Raid#setTotalWaves
  • GameRule#getDefaultValue
  • Damageable#kill

Download Paper