Sueta

Christmas Season

2.4.0

Lightweight Christmas event plugin for Paper and Spigot with biome snow, global snowstorms, decoration drops, gifts, elves and snowmen, controlled via the /xmas command.

·Plugin
  1. 2.4.0latestChristmas Season 2.4.0Sep 23, 2026

    [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 off is respected until the next transition - Advent calendar - /advent opens 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 in data/advent.yml, reset each year; AdventClaimEvent - Multiple snow worlds - snowWorlds list next to the legacy snowWorld; all managers, cleanup, adoption and the snowstorm honour every listed world - Biome exclusion zones (biome.exclude.*) - rectangles, WorldGuard region IDs (id or world: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); cancel stops it; progress in /xmas status - Weighted loot entries - every loot list accepts {material, amount: "1-3", weight, name, lore, enchantments, glow} besides MATERIAL:amount; chest item counts and rare chances configurable (gifts.contents.*) - Gift opening - first opener is recorded (data/stats.yml), /xmas stats [player], optional gifts.broadcastOnOpen, sounds/particles on spawn and open (gifts.effects.*), GiftOpenEvent; GiftSpawnEvent is cancellable - Runtime feature toggles - /xmas feature <biome|snowstorm|decoration|gifts|wichtel|elves|snowmen|advent> on|off (persisted) - Per-player spawn caps - wichtel/elves/snowmen.maxNearPlayer within spawning.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 none now 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 on - elves.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 compare` and `fix-diff` accessed 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 with biome.restore.perTick chunks 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 off additionally sweeps all loaded chunks. - Emergency backups piled up - one full database copy per normal shutdown, never rotated. Only the newest three are kept. - `ChunkLoadEvent` bypassed 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; false allows 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 > 100 rule (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 off could 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-diff cleans 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 snowy top 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 off is 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 pulse uses the manager's pulse instead of a duplicated implementation.
    Changed
    - api-version raised to 1.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 setBiome calls per chunk) - Chunks set with /xmas biome set are protected from the automatic bubble until the next stop/restore - Update checker: updateChecker.enabled/notifyOps config keys, only Modrint
    160 downloads
  2. 2.3.0Christmas Season 2.3.0Jul 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 off are 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 /xmas now includes biome names from the registry
    Changed
    - Full Adventure API migration - Component-based entity/item/chest names and broadcasts, RegistryAccess instead of Registry.BIOME, zero deprecated API usage in the build - Reliable `/xmas off` restore - 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 on during 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 reload restarts 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
    267 downloads
  3. 2.2.0Christmas Season 2.2.0Apr 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 compare and /xmas biome fix-diff for 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 - clearsnap blocked 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 regionIntegration config section - Intelligent backup rotation (largest backup never deleted)
    98 downloads
  4. 2.1.0Christmas Season 2.1.0Dec 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 perTickBudget respect - 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 - Client-side biome caching after `/xmas off` - Fixed default value for biome.playerBubble.refreshClient from false to true - 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) - CRITICAL: Biome snapshot bug in `/xmas biome set` command - Fixed chunks not being restored correctly after manual biome changes - Root cause: setBiomeAroundPlayer() added chunks to knownSnapshotChunks cache BEFORE calling snapshotIfAbsent() - 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 set were not restored to original biomes - CRITICAL: Chunks not loaded during `/xmas on` were 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 chunkRetryCount tracking 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 language setting in config.yml - Verified: Zero hardcoded German strings remaining in user-facing logs - CRITICAL: Folia thread safety violations in biome restore - Fixed IllegalStateException crash during /xmas off biome 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 - CRITICAL: Folia thread safety violations in cleanup methods - Fixed IllegalStateException crash when running /xmas off on Folia servers - Root cause: Using world.getEntitiesByClass() and direct entity.remove() calls access entities from other regions, violating Folia's thread ownership model - DecorationManager.java: Replaced unsafe entity iteration with UUID tracking - Added trackedDecorations ConcurrentHashMap for thread-safe entity tracking - Track decorations when spawned, untrack when lifetime expires - cleanup() now uses Bukkit.getEntity(uuid) + scheduler.runForEntity() pattern - SnowmanManager.java: Replaced unsafe entity iteration and counting - Added trackedSnowmen ConcurrentHashMap for thread-safe entity tracking - Replaced getEntitiesByClass() loop with trackedSnowmen.size() for counting - cleanup() now schedules removal on each entity's owning region thread - Properly cancels attack tasks before entity removal - 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)
    Changed
    - Enhanced Language Files - Added 70+ new translation keys to messages_de.yml: - log.biome.* - 35+ keys for biome restore operations, errors, and status - log.database.* - 35+ keys for database operations, compression, errors - log.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 - 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 - LanguageManager now 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 .yml and .yaml files are properly packaged in JAR - Language files (messages_de.yml, messages_en.yml) now correctly included
    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.xml with 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
    543 downloads
  5. 2.0.0Christmas Season 2.0.0Dec 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 lifetimes - GiftManager: Location scheduler for chest placement/removal - SnowstormManager: Global scheduler for weather control - WichtelManager: Entity scheduler for mob management - SnowmanManager: Entity scheduler for snowman behavior - XmasCommand: Global scheduler for delayed operations - New Scheduler Helper - Created FoliaSchedulerHelper utility class - Platform-agnostic API for scheduling tasks - Automatic platform detection (isFolia() method) - Supports all scheduler types: Global, Region, Entity, Location, Async - Task Types Updated - Replaced BukkitTask with WrappedTask (FoliaLib wrapper) - Replaced BukkitRunnable with lambda expressions - All scheduler calls now go through FoliaSchedulerHelper - Performance Improvements - perTickBudget increased from 6 → 12 (2x faster biome updates) - Cache management optimized (processedChunks, knownSnapshotChunks) - Chunk queue prevents processing duplicates
    Fixed
    - CRITICAL: Multi-Platform Teleport Incompatibility - Fixed NoSuchMethodError on Spigot (teleportAsync doesn't exist) - Fixed UnsupportedOperationException on Folia (must use teleportAsync) - Platform-dependent teleport: teleportAsync() on Folia, teleport() on Spigot/Paper/Purpur - Wichtel can now teleport correctly on all platforms - 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-api to paper-api (1.21.3-R0.1-SNAPSHOT) - Added FoliaLib 0.4.3 (com.tcoded:FoliaLib) - Added tcoded-releases repository (https://repo.tcoded.com/releases) - FoliaLib is shaded and relocated to avoid conflicts - 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: true flag 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+
    274 downloads
  6. 1.4.1Christmas Season 1.4.1Dec 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 clearsnap to delete corrupted database - Detection of stream misalignment with detailed logging
    436 downloads
  7. 1.4.0Christmas Season 1.4.0Dec 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 format 0x3D (ordinal-based) still readable - Fixed Y-level misalignment in biome restoration - Restore now uses the correct yStep value from the snapshot instead of config - Prevents biomes from being restored at wrong vertical positions
    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) to name() (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
    16 downloads
  8. 1.3.0Christmas Season 1.3.0Dec 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 of w.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 migrate migrates 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 off until 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 debug` Command: 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 processedChunks Set 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 restore - restoreALLAsync(): 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: 1. Stop Server
       stop
       
    2. Replace Plugin JAR - Delete old ChristmasSeason-1.2.x.jar - Copy new ChristmasSeason-1.3.0.jar to plugins/ 3. Start Server
       # Plugin automatically creates biome-snapshot.db
       
    4. Optional: 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 5. Done! - SQLite system runs automatically - Unlimited chunks possible - Better performance Config Changes (optional): ```yaml biome: # Old config options can be removed: # restoreOnEvict: true ← DEPRECATED, no longer needed! # enableSnapshot rem
    408 downloads
  9. 1.2.5Christmas Season 1.2.5Nov 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 continue statement 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 ✅
    131 downloads
  10. 1.2.4Christmas Season 1.2.4Nov 28, 2025
    Version 1.2.4 (2025-11-28)
    Language system update with full multi-language support and important stability improvements. #### 🌍 New Features Complete Multi-Language System - 🎯 LanguageManager: New system for managing translations - 🇩🇪 German (de): Full German localization (default) - 🇬🇧 English (en): Full English translation - 📝 All texts translated: Commands, messages, entity names, broadcasts, error messages, console logs - 🎭 Translated entity names: Wichtel, Elves, Snowmen, Gifts, Decorations - all names are now multilingual - 🔧 Config option: language: en (or de) in config.yml - 🔄 Live reload: Language switching with /xmas reload without server restart - 📦 Language files: messages_de.yml and messages_en.yml in plugin folder - 💾 Performance cache: Loaded translations are cached - 🎨 Placeholder support: Dynamic values in messages (e.g., chunk count, biome names, coordinates) Documentation - 📖 README_EN.md: Complete English documentation added - 🔗 Language links: Both READMEs link to each other - ✨ Enhanced changelog structure: Detailed descriptions of all changes #### 🔧 Technical Improvements Language System - Modular design: LanguageManager as standalone utility class - Fallback system: Missing translations are logged and displayed - YAML-based: Easy customization and extension through YAML format - Color code support: Automatic conversion from & to § - Config cleanup: Removed decoration.name from config.yml (now handled by language system) Stability & Performance - 🛑 `/xmas biome restore` disabled: Command has been disabled as it synchronously loads reference world chunks, causing server freezes (30+ seconds) - ✅ Alternative usage: Use /xmas off for safe, asynchronous biome reset - 🔒 YAML Boolean fix: Keys like on, off are now quoted ("on":, "off":) to prevent YAML boolean interpretation #### 🐛 Fixed Bugs - 🔴 Translation keys not found: YAML was interpreting on/off as booleans (true/false) - fixed by quoting - 🔴 Server freeze on biome restore: /xmas biome restore blocked main thread - command disabled with warning - ⚪ Hardcoded entity names: All managers now use LanguageManager instead of hardcoded strings
    32 downloads
  11. 1.2.3Christmas Season 1.2.3Nov 28, 2025
    Version 1.2.3 (2025-11-28) A comprehensive update for a complete, intelligent event reset without damaging natural terrain. 🎁 New Features Full Entity & Loot Cleanup When resetting the event (/xmas off), all spawned event entities and items are now removed automatically: - 🎨 Decoration items (items with custom display name) - 🎁 Gift chests (chests named "Weihnachts-Geschenk") - 👤 Elves & helpers (tracked via the internal tracker system) - ⛄ Snowmen (tracked via ScoreboardTags) Details: - Cleanup now runs before stopFeatures(), so all trackers are still populated - Console log shows exactly how many entities/items were removed ⚡ Improvements Smarter Biome-Specific Reset Snow removal: - Snow is only removed in biomes that naturally do not have snow (e.g. PLAINS, FOREST, DESERT) - In natural snow biomes (SNOWY_PLAINS, SNOWY_TAIGA, GROVE, etc.) snow is preserved ✅ - Improved logic: snow above water is now detected and removed as well (fixed break condition on fluids) Ice handling: - Ice is only turned back into water in biomes that naturally don’t have ice (e.g. PLAINS, FOREST) - In icy/cold biomes, ice is preserved ✅ - Supported examples: FROZEN_OCEAN, FROZEN_RIVER, ICE_SPIKES, SNOWY_PLAINS, SNOWY_TAIGA, GROVE, JAGGED_PEAKS, etc. Technical improvements: - 🔧 Chunks are automatically loaded if they aren’t loaded during reset - 📊 Detailed debug output for easier troubleshooting - 🎯 Optimized order: Cleanup → StopFeatures → BiomeReset 🐛 Bug Fixes Critical fixes: - 🔴 Elves & helpers were not removed reliably → fixed by running cleanup before stopFeatures() - 🔴 Ice in SNOWY_PLAINS was removed → isNaturallyIcyBiome() extended to include all relevant snowy biomes - 🔴 Snow above water stayed behind → loop logic corrected, break now only on solid blocks Additional fixes: - Ice is no longer left behind in non-icy biomes (e.g. PLAINS, FOREST) - Natural snow in snow biomes is now correctly preserved - Event entities and items are removed completely during reset - Biome reset now works correctly even with previously unloaded chunks
    Known issues
    - ⚠️ Currently, even manually placed regular ice (not packed or blue ice) in non-icy biomes will also be turned back into water during the reset. I’ll try to improve this behavior in a future update, but the logic to reliably distinguish natural from player-placed ice is quite complex.
    23 downloads
  12. 1.2.2Christmas Season 1.2.2Nov 23, 2025
    88 downloads

Similar projects

Plugin →