
Christmas Season
Lightweight Christmas event plugin for Paper and Spigot 1.21 with biome snow, global snowstorms, decoration drops, gifts, elves and snowmen, controlled via the /xmas command, requires Java 21.
- Загрузки
- 2K
- Подписчики
- 4
- Обновлён
- 3 июля 2026 г.
- Лицензия
- MIT
Опубликован 23 ноября 2025 г.
Christmas Season
Christmas Season is a feature-rich Christmas event plugin for Paper, Purpur and Folia (Minecraft 1.21.3+ and 26.x).
It transforms your world into a winter wonderland – snow biomes that follow your players, snowstorms, gift chests, elves, decoration drops and snowball-throwing snowmen – all controlled through a single /xmas command and fully reverted with /xmas off.
⚠️ Requirements
- Minecraft: 1.21.3 – 1.21.11 or 26.x (1.21.1/1.21.2 are NOT supported)
- Server: Paper, Purpur or Folia (plain Spigot is not supported – the plugin uses Paper's Adventure API)
- Java: 21+ (26.x servers require Java 25+)
One JAR covers all supported versions – live-tested on Paper 26.2, Paper 1.21.11 and Folia 1.21.11.
Features
❄ Dynamic snow biomes
- Snow biomes follow your players in a configurable bubble (
biome.playerBubble) - Full 3D biome changes (1.18+ multi-Y-level), Nether/End/cave biomes are never touched
- Original biomes are stored in a compressed SQLite snapshot database –
/xmas offrestores everything, chunk by chunk, with per-chunk completion tracking and automatic retries - Performance-friendly: tick budgets (
perTickBudget), chunk queues, no TPS spikes
- Snow biomes follow your players in a configurable bubble (
🌨️ Snowstorms
- Weather control with
automode (configurable on/off cycles), manual mode or none /xmas storm <on|off|toggle|status|pulse>
- Weather control with
🎁 Gifts
- Gift chests spawn near players with three loot tables:
common,extra,rare - Configurable lifetime, spawn chance and optional broadcast on spawn
- Protected against hoppers and explosions – and the cleanup can never delete player-placed chests (PDC-marker check)
- Manual spawn via
/xmasgift
- Gift chests spawn near players with three loot tables:
🎄 Decoration drops
- Periodic glowing decoration items around players (
decoration.drops, fully configurable) - Spawn interval, chance, lifetime and glow are configurable
- Periodic glowing decoration items around players (
🧝 Wichtel & Elves
- Mischievous Wichtel that steal dropped items and teleport around (
wichtel.*) - Friendly Elves (Allays) that wander around (
elves.*) - Max count per world, spawn intervals and lifetime are configurable
- Mischievous Wichtel that steal dropped items and teleport around (
☃️ Snowmen
- Aggressive snow golems that throw (harmless) snowballs at players
- Configurable max count, spawn interval, attack range and attack chance
- Never spawn in or near water (they would melt)
🛡️ Region protection (soft dependency)
- No spawns inside WorldGuard regions or GriefPrevention claims
- Works without those plugins installed; configurable via
regionIntegration.*
💾 Backup system
- Automatic SAFE backup on
/xmas on, timestamp backup on/xmas offand an emergency backup if the server stops while the event is running - Startup safety checks: database integrity check and crash detection
- Compare and repair restores with
/xmas biome compareand/xmas biome fix-diff
- Automatic SAFE backup on
🔧 Quality of life
- Full tab completion for all commands (including biome names)
- Update checker (
/xmas update check+ admin notifications) - Two languages included: German and English (
language: de|en) - Config validation with clear warnings on startup
- bStats metrics
- Folia-ready: regionalized schedulers, thread-safe throughout
Commands
/xmas on Start the event (creates a SAFE backup first)
/xmas off Stop the event and restore all biomes
/xmas status Show event, storm and region-protection status
/xmas reload Reload the configuration (all modules)
/xmas biome set <biome> [radius] Manually set biomes around you
/xmas biome status Snapshot database statistics
/xmas biome clearsnap Delete the snapshot database (guarded)
/xmas biome compare <backup> Compare current biomes with a backup
/xmas biome fix-diff <backup> confirm Restore differing chunks from a backup
/xmas storm <on|off|toggle|status|pulse> Control the snowstorm
/xmas backup <list|restore|create|clear> Manage biome database backups
/xmas update check Check Modrinth/GitHub for updates
/xmasgift Spawn a gift chest at your position
Permission: xmas.admin (default: OP)
Links
- 📦 Source & full changelog: https://github.com/BoondockSulfur/ChristmasSeason
- 🐛 Issues & feature requests welcome!
Ченджлог
2.3.0Релиз26.1.1, 26.1.2, 26.2 · 3 июля 2026 г.
[2.3.0] - 2026-07-03
Major Update: Minecraft 26.x support, full Adventure API migration, and a deep thread-safety/reliability overhaul of the entire 2.2.0 feature set.
Upgrade Priority: HIGH - contains critical Folia fixes and data-safety hardening
Added
- Minecraft 26.x support - one JAR covers 1.21.3-1.21.11 (Java 21) AND the year-based 26.x versions (Java 25); compiled against Paper API
26.1.2.build.72-stable,api-version: "1.21"remains the minimum - Gift chest protection - hoppers and explosions can no longer empty/destroy gift chests; gift chests carry a PersistentDataContainer marker so cleanup can never delete player chests (configurable via
gifts.protectChests) - Orphaned mob cleanup - event mobs whose chunks were unloaded during
/xmas offare removed automatically when their chunks load while the event is inactive - Config validation on startup/reload - warns about unknown materials in loot tables and an invalid
biome.target - Tab completion for
/xmasnow includes biome names from the registry
Changed
- Full Adventure API migration - Component-based entity/item/chest names and broadcasts,
RegistryAccessinstead ofRegistry.BIOME, zero deprecated API usage in the build - Reliable
/xmas offrestore - completion is tracked per chunk (atomic counters); failed chunks keep their snapshots and are retried on the next run; accurate final statistics; reentrancy guard against double/xmas off;/xmas onduring a running restore can no longer leak the database - Folia hardening of the 2.2.0 feature line - all entity-scheduler tasks use retired-callbacks (killed event mobs no longer clog the spawn caps), one shared FoliaLib instance, spawn limits re-checked inside region tasks
- JAR size reduced from ~13.6 MB to ~5 MB (excluded unused SQLite natives)
/xmas reloadrestarts ALL managers, so new config values apply immediately- Language files normalized to
&color codes; literal&("Wichtel & Elfen") no longer mangled; console logs free of raw color codes - Removed ~200 lines of dead code (legacy 2D snapshot format, disabled seed-restore machinery)
Compatibility
- Paper/Purpur/Folia only - plain Spigot is no longer supported (Adventure API required)
- Minimum is Minecraft 1.21.3 - on 1.21.1/1.21.2 the plugin fails with
IncompatibleClassChangeError(Biome changed from enum to interface in 1.21.3)
Verified
- Live function tests on Paper 26.2 (Java 25), Paper 1.21.11 and Folia 1.21.11 with bot-driven end-to-end runs: biome bubble, 180-208-chunk restores without errors, backup commands, kill-wave spawn-cap test - zero exceptions
2.2.0Релиз1.21.9, 1.21.10, 1.21.11 · 25 апреля 2026 г.
[2.2.0] - 2026-04-25
Major Update: Region protection, backup system, update checker, bug fixes, data safety, tab completion, and bStats.
Upgrade Priority: HIGH - Critical thread-safety and data integrity fixes
Added
- WorldGuard & GriefPrevention - No spawns in protected regions/claims (soft dependency, configurable)
- Automatic Backup System - SAFE/Timestamp/Emergency backups in
world/christmas_backups/ - Update Checker - Modrinth + GitHub fallback, OP notifications on join
- Biome Compare & Fix -
/xmas biome compareand/xmas biome fix-difffor recovery - Full Tab Completion - Context-aware suggestions for all commands
- bStats Metrics (Plugin ID: 30930)
- Startup Safety Checks - DB integrity check, crash detection, missing-DB warnings
- Data Loss Protection -
clearsnapblocked when active, backup failure warnings, smart rotation - Entity spawn fixes: No more spawns on roofs, in trees, or in water
Fixed (17 Bugs)
- CRITICAL: Backup system non-functional (wrong DB filename)
- CRITICAL: Folia crash on start/join (
Bukkit.getScheduler()→FoliaSchedulerHelper) - HIGH: 6 thread-safety issues (restore counters, restore guard, HashSets, SQLite, LanguageManager)
- HIGH: Restore permanently blocked after empty snapshot or null DB
- MEDIUM: Cave biomes overwritten during seed-restore (Y=64 only → per Y-level)
- MEDIUM: NPE in
stopFeatures()on failed startup - MEDIUM: SnowstormManager orphaned tasks after
stop() - LOW: DB header EOF check, version parse fix, SnowmanDamageListener cleanup
Changed
softdepend: [WorldGuard, GriefPrevention]in plugin.yml- New
regionIntegrationconfig section - Intelligent backup rotation (largest backup never deleted)
2.1.0Релиз1.21.9, 1.21.10, 1.21.11 · 25 декабря 2025 г.
[2.1.0] - 2025-12-25
Minor Update: Critical Folia compatibility fixes and complete internationalization overhaul.
This release fixes multiple critical thread-safety violations on Folia servers and completes the internationalization system. The biome restore mechanism has been completely rewritten to work correctly with Folia's regionalized threading model.
Upgrade Priority: HIGH - Recommended for all Folia servers experiencing crashes during /xmas off
Fixed
CRITICAL: Folia performance issue - TPS drops to 16 during biome changes
- Fixed
ensureAroundPlayerFolia()scheduling all chunks around player simultaneously - Root cause: With radius=2, all 25 chunks were scheduled in parallel every tick (no budget limit)
- Result: Massive TPS spike when processing 25 chunks × 9,728 biomes each = 240k+ biome changes
- Solution: Added
perTickBudgetrespect - only schedules max 12 chunks per player tick - Chunks now distributed across multiple ticks (e.g., 25 chunks over 3 ticks instead of instant)
- Performance now matches Paper/Spigot budget-based system
- Fixed
Client-side biome caching after
/xmas off- Fixed default value for
biome.playerBubble.refreshClientfromfalsetotrue - Clients now correctly see restored biomes without needing to move away and return
- Chunk refresh packets now sent by default (can be disabled in config for performance)
- Fixed default value for
CRITICAL: Biome snapshot bug in
/xmas biome setcommand- Fixed chunks not being restored correctly after manual biome changes
- Root cause:
setBiomeAroundPlayer()added chunks toknownSnapshotChunkscache BEFORE callingsnapshotIfAbsent() - Result: No snapshot was created for manually changed chunks → wrong biome restored on
/xmas off - Solution: Removed premature cache addition, let
snapshotIfAbsent()manage the cache correctly - Fixes issue where chunks changed with
/xmas biome setwere not restored to original biomes
CRITICAL: Chunks not loaded during
/xmas onwere never processed- Implemented automatic retry mechanism for chunks that fail to load
- Chunks are now retried up to 3 times before being skipped
- Prevents "missing chunks" issue where distant/unloaded chunks stay unchanged
- Added
chunkRetryCounttracking map with automatic cleanup to prevent memory leaks - Debug logging for chunks that are skipped after max retries
CRITICAL: Complete internationalization of all console logs
- Fixed English language module not being loaded correctly from JAR
- Replaced ALL 68 hardcoded German strings with LanguageManager calls:
- BiomeSnapshotDatabase.java: 34 strings replaced
- BiomeSnowManager.java: 33 strings replaced
- SnowmanManager.java: 1 string replaced
- All console log messages now properly respect the
languagesetting in config.yml - Verified: Zero hardcoded German strings remaining in user-facing logs
CRITICAL: Folia thread safety violations in biome restore
- Fixed
IllegalStateExceptioncrash during/xmas offbiome restoration on Folia servers - Root cause: Batch processing accessed chunks from different regions in single Location Scheduler task
- Error: "Thread failed main thread check: Async chunk retrieval"
- Solution: Each chunk now processed on its own Location Scheduler task (prevents cross-region access)
- Removed batch optimization that violated Folia's region threading model
- Improved chunk loading: Now uses blocking load (
generate=true) for higher success rate - Added double-check verification to ensure chunks are actually loaded before restore
- Fixed error counting to accurately track failed chunk restores
- Fixed
CRITICAL: Folia thread safety violations in cleanup methods
- Fixed
IllegalStateExceptioncrash when running/xmas offon Folia servers - Root cause: Using
world.getEntitiesByClass()and directentity.remove()calls access entities from other regions, violating Folia's thread ownership model - DecorationManager.java: Replaced unsafe entity iteration with UUID tracking
- Added
trackedDecorationsConcurrentHashMap for thread-safe entity tracking - Track decorations when spawned, untrack when lifetime expires
- cleanup() now uses
Bukkit.getEntity(uuid)+scheduler.runForEntity()pattern
- Added
- SnowmanManager.java: Replaced unsafe entity iteration and counting
- Added
trackedSnowmenConcurrentHashMap for thread-safe entity tracking - Replaced
getEntitiesByClass()loop withtrackedSnowmen.size()for counting - cleanup() now schedules removal on each entity's owning region thread
- Properly cancels attack tasks before entity removal
- Added
- WichtelManager.java: Fixed direct entity.remove() calls in cleanup()
- cleanup() now schedules Wichtel/Elfen removal on each entity's owning region thread
- Properly cancels steal tasks before entity removal
- Uses same UUID tracking + entity scheduler pattern
- All entity removals now scheduled on correct region threads (Folia-safe)
- GiftManager: Already Folia-safe (uses Location Scheduler for block operations)
- Fixed
Changed
Enhanced Language Files
- Added 70+ new translation keys to
messages_de.yml:log.biome.*- 35+ keys for biome restore operations, errors, and statuslog.database.*- 35+ keys for database operations, compression, errorslog.cleanup.snowman-world-not-found- Snowman cleanup error
- Added matching English translations to
messages_en.yml - All formatting codes (§6, §7, §a, §c, §f, etc.) preserved in translations
- Added 70+ new translation keys to
Improved Translation Coverage
- Database operations (open, close, clear, compression, decompression)
- Biome restore operations (start, progress, completion, errors)
- Error messages and warnings with detailed context
- Statistics and progress information
- Chunk loading/restoration errors with coordinates
Improved Language Loading Diagnostics
LanguageManagernow logs:- Current language being loaded
- Absolute file path of language file
- File existence status and size in bytes
- Source of language data (disk vs JAR)
- Number of keys loaded successfully
- Better error messages when resources are missing from JAR
- Added resource enumeration in severe error cases for debugging
Build Configuration
- Added explicit Maven resources configuration in
pom.xml - Ensures all
.ymland.yamlfiles are properly packaged in JAR - Language files (
messages_de.yml,messages_en.yml) now correctly included
- Added explicit Maven resources configuration in
Technical
- All log messages now use
plugin.getLanguageManager().getMessage()or.get() - Proper placeholder support with {0}, {1}, {2} format for dynamic values
- Technical/internal logs (resource loading, language manager) intentionally kept in English
- Updated
pom.xmlwith explicit<resources>section - Added better exception handling in
ChristmasSeason.saveResourceIfAbsent() - Enhanced logging shows resource extraction status with file sizes
- Maintains backward compatibility with existing configurations
2.0.0Релиз1.21.8, 1.21.9, 1.21.10 · 19 декабря 2025 г.
[2.0.0] - 2025-12-19
Added
🎄 Multi-Platform Support - Plugin now runs on Spigot, Paper, Purpur AND Folia!
- Automatic platform detection at runtime
- Single JAR works on all server types (no separate builds needed)
- Zero configuration required - works out of the box
- Smart Scheduler Strategy:
- Paper/Spigot/Purpur: Global timer (preserves v1.4.1 architecture & performance)
- Folia: Player-based Entity Scheduler (regionalized threading)
FoliaLib Integration
- Added FoliaLib 0.4.3 dependency (shaded & relocated)
- Seamless multi-platform scheduler abstraction
- Automatic fallback to Bukkit scheduler on non-Folia servers
Folia-Specific Optimizations
- Region-based scheduling for biome processing (uses Global/Region Scheduler)
- Entity-based scheduling for mobs (Wichtel, Elfen, Schneemänner)
- Location-based scheduling for blocks (Gifts, Decorations)
- Full support for Folia's regionalized multithreading
Chunk Queue System (NEW!)
- Budget-based chunk processing prevents TPS spikes
- Config option:
perTickBudget(default: 12 chunks/tick) - Prevents lag when players move quickly into new areas
- Queue distributes chunk updates across multiple ticks
Manual Biome Correction Command
/xmas biome set <biome> [radius]- Manually fix biome issues- Only works when ChristmasSeason is active (prevents permanent changes)
- Includes automatic snapshot creation
- Protection against global timer conflicts
Changed
Complete Scheduler Migration
- All managers migrated from Bukkit scheduler to FoliaLib
BiomeSnowManager: Multi-platform scheduler strategy (Global on Paper, Entity on Folia)DecorationManager: Entity scheduler for item lifetimesGiftManager: Location scheduler for chest placement/removalSnowstormManager: Global scheduler for weather controlWichtelManager: Entity scheduler for mob managementSnowmanManager: Entity scheduler for snowman behaviorXmasCommand: Global scheduler for delayed operations
New Scheduler Helper
- Created
FoliaSchedulerHelperutility class - Platform-agnostic API for scheduling tasks
- Automatic platform detection (isFolia() method)
- Supports all scheduler types: Global, Region, Entity, Location, Async
- Created
Task Types Updated
- Replaced
BukkitTaskwithWrappedTask(FoliaLib wrapper) - Replaced
BukkitRunnablewith lambda expressions - All scheduler calls now go through FoliaSchedulerHelper
- Replaced
Performance Improvements
perTickBudgetincreased from 6 → 12 (2x faster biome updates)- Cache management optimized (processedChunks, knownSnapshotChunks)
- Chunk queue prevents processing duplicates
Fixed
CRITICAL: Multi-Platform Teleport Incompatibility
- Fixed
NoSuchMethodErroron Spigot (teleportAsync doesn't exist) - Fixed
UnsupportedOperationExceptionon Folia (must use teleportAsync) - Platform-dependent teleport:
teleportAsync()on Folia,teleport()on Spigot/Paper/Purpur - Wichtel can now teleport correctly on all platforms
- Fixed
CRITICAL: Race Condition in
/xmas biome set- Fixed global timer overwriting manual biome changes
- Chunks are now marked as processed BEFORE async tasks start
- Manual changes are now persistent until
/xmas off
CRITICAL: Chunk Stripes Not Restored
- Fixed chunks being deleted from database even when restore failed
- Chunks now only deleted after successful restoration
- Failed chunks remain in DB for retry on next
/xmas off - Added logging for failed chunk loads
Database Management
- Improved cache clearing before/after restore operations
- Better error handling for chunk loading failures
- Success-only database cleanup prevents data loss
Technical
Dependencies
- Updated from
spigot-apitopaper-api(1.21.3-R0.1-SNAPSHOT) - Added
FoliaLib0.4.3 (com.tcoded:FoliaLib) - Added tcoded-releases repository (https://repo.tcoded.com/releases)
- FoliaLib is shaded and relocated to avoid conflicts
- Updated from
Build Configuration
- Updated Maven Shade plugin to include FoliaLib
- Relocation:
com.tcoded.folialib→de.boondocksulfur.christmas.libs.folialib - SQLite JDBC driver still bundled (3.45.0.0)
Version Bump
- Major version bump to 2.0.0 (breaking changes in internal APIs)
- Updated version in pom.xml, plugin.yml, and READMEs
- Platform description updated to "Spigot/Paper/Purpur/Folia"
- Added
folia-supported: trueflag to plugin.yml (required for Folia)
Migration Notes
- No action required for server admins - plugin auto-detects platform
- For developers: Internal scheduler API changed (use FoliaSchedulerHelper)
- Compatible with existing configs - no configuration changes needed
- Works on Folia 1.20+ and all Paper/Spigot versions supporting 1.21+
1.4.1Релиз1.21.8, 1.21.9, 1.21.10 · 12 декабря 2025 г.
[1.4.1] - 2025-12-12
Fixed
CRITICAL: Fixed database corruption during biome snapshot save/load
- Fixed stream misalignment causing garbled biome names (e.g., "MEADOWMEADOWMEADOW", "SNOWY_SLOPESFROZEN_PEAKS")
- Fixed MEADOW biomes being incorrectly restored as PLAINS
- Root cause:
InputStream.read()can return fewer bytes than requested (partial reads) - Solution: Read in loop until all bytes are received to maintain stream alignment
- Added validation for biome name length (max 50 bytes) to detect corruption early
Fixed "Unerwartetes Ende in 3D Biome-Daten!" errors
- Stream now properly handles partial reads without losing alignment
- One corrupted biome no longer corrupts all following biomes (no more domino effect)
Changed
- Improved error messages for database corruption
- Clear instructions:
/xmas biome clearsnapto delete corrupted database - Detection of stream misalignment with detailed logging
- Clear instructions:
1.4.0Релиз1.21.8, 1.21.9, 1.21.10 · 12 декабря 2025 г.
[1.4.0] - 2025-12-12
Fixed
CRITICAL: Fixed biome restoration corruption - Biomes are now correctly restored after
/xmas off- Changed biome serialization from ordinal-based (unstable) to name-based (stable)
- Fixes issue where biomes were completely scrambled (e.g., JUNGLE became BIRCH_FOREST, OCEAN became FROZEN_PEAKS)
- Old snapshots using ordinal format are still supported for backwards compatibility
- Database format updated: New snapshots use magic byte
0x3E(name-based), old format0x3D(ordinal-based) still readable
Fixed Y-level misalignment in biome restoration
- Restore now uses the correct
yStepvalue from the snapshot instead of config - Prevents biomes from being restored at wrong vertical positions
- Restore now uses the correct
Added
- Extensive debug logging for biome snapshot/restore operations
- Shows which biomes are stored in snapshots
- Shows which biomes are restored from snapshots
- Helps diagnose biome-related issues
Technical Details
- Biome storage format changed from
ordinal()(2 bytes) toname()(length-prefixed UTF-8 string) - Rationale:
Biome.values()order is not guaranteed to be stable across server restarts/reloads - New format ensures biome names like "JUNGLE", "OCEAN" are stored exactly as they are
- Database automatically migrates old snapshots when loading
1.3.0Релиз1.21.8, 1.21.9, 1.21.10 · 2 декабря 2025 г.
Version 1.3.0 (2025-12-02)
🚀 Massive Performance Update! - Fixed critical performance issues + SQLite database system for unlimited chunks!
⚡ Performance Optimizations
Chunk Processing Optimized (99% less re-processing)
- ✅ Chunk Processing Cache: Chunks are now processed only once, not repeatedly every tick
- ✅ Smart Sample Check: 4-point sampling skips already correct chunks (~95% faster)
- ✅ Removed Double Processing:
tick()method no longer processes player bubbles twice - 📊 Effect: From 24,576 API calls per chunk → 4-100 calls (-99%)
Event Listeners Throttled (-90% Events)
- ✅ PlayerMove Cooldown: 3-second cooldown per player instead of every chunk change
- ✅ ChunkLoad Caching: Already processed chunks are skipped
- 📊 Effect: ~90% fewer event triggers for moving players
Entity Optimizations
- ✅ SnowmanManager: Uses
getEntitiesByClass()instead ofw.getEntities()(~10x faster) - ✅ DecorationManager Cleanup: Iterates only over items instead of all entities
- ✅ GiftManager Tracking: New location tracking instead of chunk iteration (~100x faster)
- ✅ Wichtel/Elf Lifetime: Automatic removal after 240 seconds (configurable)
- 📊 Effect: Cleanup reduced from seconds to milliseconds
Scheduler Optimizations
- ✅ SnowstormManager Auto-Mode: Changed from runTaskTimer (every tick) to runTaskLater
- 📊 Effect: From 20 TPS overhead to 0 TPS (only runs every 45-150 seconds)
Chunk Reload Removed
- ✅ refreshChunkSafe(): Removed expensive chunk unload/reload
- 📊 Effect: ~50% less CPU load during biome changes
🗄️ SQLite Database System (BREAKING: replaces YAML)
Completely New Snapshot System
- ✅ SQLite instead of YAML: Biome snapshots stored in
biome-snapshot.db - ✅ GZIP Compression: Biome data is compressed
- ✅ Unlimited Chunks: No more 2,000-chunk limit!
- ✅ Minimal Storage: 10,000 chunks = ~5-10 MB (instead of 156 MB with YAML)
- ✅ Millisecond Performance: Load/save in <10ms per chunk
- ✅ No Memory Overhead: Data not held in RAM
- ✅ WAL Mode: Write-Ahead Logging for better concurrent performance
- 📊 Effect: -94% storage space, unlimited scaling
YAML to SQLite Migration
- ✅ Automatic Migration:
/xmas biome migratemigrates old YAML snapshots - ✅ Backup Creation: Old YAML saved as
.backup-<timestamp> - ✅ Backwards Compatible: Old configs continue to work
- 📊 Effect: Seamless upgrade from v1.2.x to v1.3.0
Biome Restore Completely Reworked
- 🔴 Critical Bug Fixed: Database was closed BEFORE restore, restore found no data
- ✅ New Timing Logic: DB stays open during
/xmas offuntil restore finishes - ✅ Detailed Logging: Progress every 50 chunks, error tracking
- ✅ Intelligent Block Removal: Only removes snow/ice in non-winter biomes
- ✅ Chunk Loading: Chunks loaded on-demand for restore
- ✅ Auto-Cleanup: DB cleared and closed after successful restore
- 📊 Effect: Restore now works reliably!
Debug Mode Added
- ✅
/xmas debugCommand: Enables verbose debug logs - ✅ Snapshot Tracking: See which chunks are being snapshotted
- ✅ Restore Details: Shows biome data and block removal statistics
- ✅ DB Status: Shows database open/close and chunk counts
- ✅ Performance Info: Time measurements and chunk processing
- 📊 Effect: Easier debugging and troubleshooting
📊 Compatibility
Server Software
- ✅ Spigot 1.21+: Fully compatible
- ✅ Paper 1.21+: Fully compatible (recommended for best performance)
- ✅ Purpur 1.21+: Fully compatible
- ⚠️ Folia: Partially compatible (possible threading issues)
Dependencies
- ✅ SQLite JDBC 3.45.0.0: Automatically included in JAR (Maven Shade)
- ✅ No Other Dependencies: Plug & Play
🎯 New Commands
/xmas debug- Enable/disable debug mode/xmas biome migrate- Migrate YAML snapshots to SQLite/xmas biome status- Now shows DB statistics (chunks, size)
📊 Performance Improvements (Measurements)
| Metric | Before (v1.2.5) | After (v1.3.0) | Improvement |
|---|---|---|---|
| CPU Load at 1000 Chunks | ~80% | ~10-15% | -85% |
| RAM Usage (Snapshot) | 156 MB (YAML) | 5-10 MB (SQLite) | -94% |
| Non-Heap Usage | 432/456 MB (95%) | ~200/456 MB (44%) | -54% |
| Chunk Limit | 2,000 (YAML) | Unlimited (SQLite) | ∞ |
| Chunk Processing Calls | 24,576/chunk | 4-100/chunk | -99% |
| PlayerMove Events | Every chunk change | Every 3 seconds | -90% |
| Entity Cleanup Time | 5-10 seconds | <100ms | -98% |
| TPS During Long Runtime | 10-15 TPS | 19-20 TPS | Stable! |
| Startup Time (with Snapshot) | 30-60 seconds (YAML) | <1 second (SQLite) | -98% |
| Snapshot Load/Save | Seconds | Milliseconds | 1000x faster |
🐛 Fixed Bugs
- 🔴 Critical: Biome Restore Didn't Work: DB was closed BEFORE restore started
- 🔴 Critical: YAML System Didn't Scale: 10,000+ chunks = 156+ MB, server crashes
- 🔴 Critical: Chunk Limit Too Low: 2,000 chunks reached quickly on large servers
- 🔴 Chunk Re-Processing Loop: Chunks were processed repeatedly instead of once
- 🔴 Double Player-Bubble Processing: tick() and playerBubbleTask did the same work
- 🔴 PlayerMove Event Spam: Hundreds of events per second when moving fast
- 🔴 SnowstormManager Auto-Mode: Ran every tick (20x/second) instead of only on toggle
- 🔴 Inefficient Entity Iteration: w.getEntities() instead of getEntitiesByClass()
- 🔴 Wichtel/Elves Never Despawn: setRemoveWhenFarAway(false) without lifetime enforcement
- 🔴 YAML Startup Time: Loading large snapshot files took 30-60 seconds
⚙️ Technical Details
Chunk Processing Cache:
- New
processedChunksSet with max 5,000 entries - Chunks are only processed if not in cache
- Cache size is automatically limited (oldest 20% removed)
SQLite Database Schema:
CREATE TABLE chunks (
world TEXT NOT NULL,
x INTEGER NOT NULL,
z INTEGER NOT NULL,
biomes BLOB NOT NULL, -- GZIP-compressed biome data (256 bytes → ~50-100 bytes)
timestamp INTEGER NOT NULL,
PRIMARY KEY (world, x, z)
);
CREATE INDEX idx_timestamp ON chunks(timestamp);
GZIP Compression:
- Original: 256 biomes as enum ordinals (1 byte per biome)
- Compressed: ~50-100 bytes (compression rate 50-60%)
- Effect: 10,000 chunks = ~5-10 MB instead of 156 MB (YAML)
SQLite Optimizations:
- WAL mode (Write-Ahead Logging): Better concurrent performance
- PRAGMA synchronous = NORMAL: Faster writes
- PRAGMA cache_size = 10000: 10 MB cache
- PRAGMA temp_store = MEMORY: Temp data in RAM
PlayerMove Event Throttling:
- HashMap with LastUpdate timestamps per player
- 3-second cooldown between updates
- Prevents spam during fast chunk changes
Biome Restore Timing Fix:
stopFeatures(false): DB stays open for restorerestoreALLAsync(): Iterates through DB, restores chunks- At the end: DB is cleared and closed
- Progress logging every 50 chunks
🎓 Migration Guide (v1.2.x → v1.3.0)
Upgrade Steps:
Stop Server
stopReplace Plugin JAR
- Delete old
ChristmasSeason-1.2.x.jar - Copy new
ChristmasSeason-1.3.0.jartoplugins/
- Delete old
Start Server
# Plugin automatically creates biome-snapshot.dbOptional: Migrate Old YAML Snapshots
/xmas biome migrate- Migrates
biome-snapshot.yml→biome-snapshot.db - Creates backup:
biome-snapshot.yml.backup-<timestamp> - Deletes old YAML file after successful migration
- Migrates
Done!
- SQLite system runs automatically
- Unlimited chunks possible
- Better performance
Config Changes (optional):
biome:
# Old config options can be removed:
# restoreOnEvict: true ← DEPRECATED, no longer needed!
# enableSnapshot remains the same:
enableSnapshot: true # true = SQLite DB, false = no restore
⚠️ Breaking Changes
Minimal Breaking Changes:
- ✅ YAML Format: Old
biome-snapshot.ymlis no longer automatically loaded- Solution: Use
/xmas biome migrate
- Solution: Use
- ✅ Config Option:
restoreOnEvictis ignored (no longer needed)- No adjustment needed - simply ignored
- ✅ All Other Configs: 100% compatible!
1.2.5Релиз1.21.8, 1.21.9, 1.21.10 · 28 ноября 2025 г.
Version 1.2.5 (2025-11-29)
Critical bugfix for ice reset when deactivating the event.
🐛 Fixed Bugs
Ice reset did not work correctly
- 🔴 Problem: Frozen lakes remained frozen after
/xmas off, even though they should turn to water - 🔍 Cause: Missing
continuestatement in the loop after converting ice to water - ✅ Solution: Loop now explicitly searches from top to bottom through the entire block column
- 🌊 Effect: All ice layers in a lake are now correctly converted to water (not just the top layer)
Technical Details:
- The loop now converts all ice blocks in a column (multiple layers)
- Stops only at the first solid block (Stone, Dirt, Sand, etc.)
- Natural ice biomes (FROZEN_OCEAN, SNOWY_PLAINS, etc.) remain protected ✅
Комментарии
Загружаем…