Tags
Creators
Details
Licensed MIT
Published 11 months ago
Updated 2 weeks ago
All versions
2.4.0
Release
Christmas Season 2.4.0last month 264
Compatibility
Minecraft: Java Edition
26.3
26.2
26.1.x
1.21.3–1.21.11
Platforms
Folia
Paper
Purpur
Changes
[2.4.0] - 2026-09-22
Reliability and feature release: major backup and biome-safety fixes, thread-safe biome tools, restart-safe tracking, a full English language pass, and several long-requested features.
Added
- Schedule (
schedule.*) - the event activates and deactivates itself by date; windows may span New Year (12-01→01-06); acts on transitions only so a manual/xmas offis respected until the next transition - Advent calendar -
/adventopens one door per player and day (advent.*): default items, a weighted random pool, per-day overrides, console commands, optional catch-up of missed days; claims indata/advent.yml, reset each year;AdventClaimEvent - Multiple snow worlds -
snowWorldslist next to the legacysnowWorld; all managers, cleanup, adoption and the snowstorm honour every listed world - Biome exclusion zones (
biome.exclude.*) - rectangles, WorldGuard region IDs (idorworld:id) or all GriefPrevention claims are skipped by the biome bubble and by convert-all /xmas biome convert-all [radius] [world] confirm- budgeted conversion of every generated chunk around spawn (for maps);cancelstops it; progress in/xmas status- Weighted loot entries - every loot list accepts
{material, amount: "1-3", weight, name, lore, enchantments, glow}besidesMATERIAL:amount; chest item counts and rare chances configurable (gifts.contents.*) - Gift opening - first opener is recorded (
data/stats.yml),/xmas stats [player], optionalgifts.broadcastOnOpen, sounds/particles on spawn and open (gifts.effects.*),GiftOpenEvent;GiftSpawnEventis cancellable - Runtime feature toggles -
/xmas feature <biome|snowstorm|decoration|gifts|wichtel|elves|snowmen|advent> on|off(persisted) - Per-player spawn caps -
wichtel/elves/snowmen.maxNearPlayerwithinspawning.nearRadius(0 = off, world caps unchanged) - Permissions -
xmas.advent(default true),xmas.bypass.snowmen; snowmen also ignore spectators - PlaceholderAPI expansion
%xmas_...%(active, snowstorm, days_until_start, days_left, gifts_opened, gifts_opened_total, advent_claimed, advent_today, tracked_mobs, tracked_gifts) - API events in
de.boondocksulfur.christmas.api:XmasStateChangeEvent,GiftSpawnEvent,GiftOpenEvent,AdventClaimEvent - Announcements on activation/deactivation (
announcements.*), richer/xmas status(worlds, tracked objects, snapshot chunks, restore/conversion progress, schedule, gifts opened) - Snowstorm mode
nonenow really leaves the weather alone (was documented but not implemented) biome.changeMinY/biome.changeMaxY- the Y range of biome changes is configurable (was fixed to 50-200); the snow/ice clean-up on restore is limited to the same range plus an 8-block margin, so natural altitude snow above it is left alone/xmas biome info- shows current and original biome, snapshot state and exclusion for the spot you stand onelves.lifetimeSeconds/elves.world(default to the wichtel values)- Custom or partial language files fall back to the bundled English texts instead of
[Missing: key]
Fixed
- CRITICAL: Backups were incomplete. The snapshot database runs in WAL mode; timestamp backups (
/xmas off), emergency backups (server stop) and SAFE backups taken while the event was running copied only the main file and silently lost every chunk still in the write-ahead log. All copies now force a WAL checkpoint first, and the emergency backup is written after the database has been closed. - CRITICAL: Custom biomes restored as PLAINS. Snapshots stored biome keys without their namespace, so Terralith/data-pack biomes could not be resolved on restore. New snapshots (format 0x3F) store the full key; old snapshots are still read as
minecraft:biomes. - CRITICAL:
/xmas biome compareandfix-diffaccessed the world from an async thread (IllegalStateException: Asynchronous chunk load!on Paper, region violations on Folia). The backup database is still read asynchronously, but every chunk comparison/restore now runs on the chunk's owning thread withbiome.restore.perTickchunks in flight. /xmas reload(and a second/xmas on) orphaned gift chests permanently - lifetime tasks were cancelled and the tracker cleared. Stopping a manager no longer drops its tracking.- Event objects were lost after a server restart - mobs, decorations and gift chests had no cap, no lifetime and were not removed by
/xmas off. They are now recognised by their tags/markers and adopted on startup and on chunk load;/xmas offadditionally sweeps all loaded chunks. - Emergency backups piled up - one full database copy per normal shutdown, never rotated. Only the newest three are kept.
ChunkLoadEventbypassed the per-tick budget - every loaded chunk was snapshotted and converted synchronously, including pre-generated chunks far from any player. Chunks are now only queued when a player is within the bubble radius (Folia: handled by the per-player timer).- Wichtel and elves deleted every dropped item in reach, including player death drops. They now only collect the plugin's decoration items (
wichtel.stealOnlyDecorations: true;falseallows other items but never player drops). Random hops no longer teleport mobs into blocks or off ledges. - Spawn helper no longer falls back to the player's own position; a candidate more than 24 blocks above the player is rejected instead of a fixed
Y > 100rule (worked badly on high worlds). - Gift chests are never placed next to another chest (no accidental double chests with player storage).
- On Folia, region tasks still in flight after
/xmas offcould re-convert chunks the restore had just reset (leftover snow); chunk processing now stops as soon as the event is off or a restore runs - Snow/ice removal on restore checks the surface of every column (WORLD_SURFACE heightmap) instead of every block between Y 50 and 200 - the whole world height is covered at a fraction of the cost;
fix-diffcleans snow/ice as well - Minecraft blurs biome borders by a few blocks, so snow also fell on the edges of chunks that were never converted and were therefore never cleaned; the restore now cleans a four-block strip of every untouched neighbouring chunk
- Snapshots are stored per 4x4 biome cell (format 0x41, 16 entries per layer instead of 256) - 16x less data to compress and write per chunk; all older formats are still read
- Snow layers and ice that already existed on the surface when a chunk was snapshotted (natural or player-placed) are recorded per column and kept on restore
- Snow layers and ice placed by players while the event is active are recorded in the database (
placed_columns) and kept on restore - also inside the cleaned border strips - Grass, podzol and mycelium under removed snow layers lost their white
snowytop only after a block update - the state is reset explicitly now - Folia: chunks around a fast-moving player no longer leave gaps - every chunk seen in the bubble radius stays in a per-player queue (nearest first) until it is converted, and chunks that were not loaded yet are retried instead of being marked as done
/xmas storm offis a hard override: it pauses the auto phases and resends clear weather even if the server flag was already off- Region plugins are now declared as
softdepend, so the WorldGuard/GriefPrevention hook is available on the first start. /xmas storm pulseuses the manager's pulse instead of a duplicated implementation.
Changed
api-versionraised to1.21.3- servers below the real minimum now refuse the plugin with a clear message instead of crashing later- Biome writes and samples work per 4x4x4 cell (16x fewer
setBiomecalls per chunk) - Chunks set with
/xmas biome setare protected from the automatic bubble until the next stop/restore - Update checker:
updateChecker.enabled/notifyOpsconfig keys, only Modrinth release versions count, notifications with clickable Modrinth/GitHub links - New config keys:
biome.restore.removeSnowLayers,biome.restore.removeIce,wichtel.stealOnlyDecorations,snowmen.lifetimeSeconds(default 600, 0 = never) - Default
languageis nowen - All source comments, Javadoc, debug output and hardcoded messages are English; every player/console message goes through the language files (both files reworked, unused keys removed)
- Database statistics report MB/KB with matching units
Removed
- Empty
GiftOpenListener;OrphanedMobCleanupListenerreplaced byTrackedObjectListener(adopt or remove)
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:Xwi3c4Ew:inoTdou6"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:Xwi3c4Ew:inoTdou6"
}

