26.1
The 26.1 Update
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-dirstartup argument to load an additional plugin directory- Along with a fix to a memory leak, we added
misc.max-tracking-combat-entriesto 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-tresholdto be properly disabled by setting it to-1 - Added
unsupported-settings.ticking.chunksandblockEntitiesto 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#locateNearestPoiandlocateAllPoiInRangeto find nearby points of interestWorldCreator#forcedSpawnPositionto skip spawn location search on world creationPositionedRayTraceConfigurationBuilder#blockCollisionModefor looking for block collisionsEntityLungeEvent,PlayerToggleEntityAgeLockEvent,PlayerSwapWithEquipmentSlotEvent,ItemCraftedEventPlayerPurchaseEvent#getMerchantFurnaceExtractEvent#getItemStackVehicleDamage/DestroyEvent#getDamageSourceRecipeChoice.ItemTypeChoiceMannequin.validPosesRaid#setTotalWavesGameRule#getDefaultValueDamageable#kill
Download Paper







