
BS CustomJukebox
Fully-featured Paper 1.21+ jukebox plugin with custom music discs, disc fragments, GUI support, and WorldGuard/GriefPrevention integration.
[3.0.0] - 2026-05-02
Added
- Public API Events: New event system for companion plugins
DiscPlaybackStartEvent— Cancellable event fired when a disc starts playing. Exposes disc, location, and mutable listener set.DiscPlaybackStopEvent— Fired when playback stops, withStopReasonenum (MANUAL, DURATION_END, BLOCK_BREAK, PLUGIN).DiscRegisteredEvent— Fired when a new disc is created via GUI or config.DiscRemovedEvent— Fired when a disc is removed, includes a snapshot of the deleted disc.
- API method:
CustomJukeboxAPI.getPluginDataFolder()— Allows companion plugins to locate disc sound files.
Changed
- PlaybackManager: Now fires
DiscPlaybackStartEventbefore playing sounds (allows cancellation and listener modification) andDiscPlaybackStopEventon stop. - DiscManager: Now fires
DiscRegisteredEventon disc creation andDiscRemovedEventon disc deletion.
Technical
- New package:
de.boondocksulfur.customjukebox.api.eventswith 4 event classes - All events follow standard Bukkit event patterns (HandlerList, static getHandlerList)
- Zero behavior change for existing users — events are no-ops without listeners
- Foundation for the new BS-CustomJukebox Bedrock Extension
- Public API Events: New event system for companion plugins
[2.2.1] - 2026-05-03
Fixed
- UpdateChecker: Now filters by game version via Modrinth API so users only see updates compatible with their Minecraft version. Prevents cross-version update notifications (e.g., 26.1 updates shown to 1.21.x servers).
[2.2.0] - 2026-05-02
Added
- Public API Events: New event system for companion plugins
DiscPlaybackStartEvent— Cancellable event fired when a disc starts playing. Exposes disc, location, and mutable listener set.DiscPlaybackStopEvent— Fired when playback stops, withStopReasonenum (MANUAL, DURATION_END, BLOCK_BREAK, PLUGIN).DiscRegisteredEvent— Fired when a new disc is created via GUI or config.DiscRemovedEvent— Fired when a disc is removed, includes a snapshot of the deleted disc.
- API method:
CustomJukeboxAPI.getPluginDataFolder()— Allows companion plugins to locate disc sound files.
Changed
- PlaybackManager: Now fires
DiscPlaybackStartEventbefore playing sounds (allows cancellation and listener modification) andDiscPlaybackStopEventon stop. - DiscManager: Now fires
DiscRegisteredEventon disc creation andDiscRemovedEventon disc deletion.
Technical
- New package:
de.boondocksulfur.customjukebox.api.eventswith 4 event classes - All events follow standard Bukkit event patterns (HandlerList, static getHandlerList)
- Zero behavior change for existing users — events are no-ops without listeners
- Foundation for the new BS-CustomJukebox Bedrock Extension
- Public API Events: New event system for companion plugins
[2.1.6] - 2026-05-01
Fixed
-
Critical: sound/soundKey field mismatch — Discs created or edited via GUI wrote
"soundKey"to disc.json, but the loader only read"sound". After a reload, the custom sound was silently lost.saveDiscToConfig()andupdateDiscField()now consistently write"sound"(the official field name)parseDiscFromJson()now reads"sound"with"soundKey"as backward-compatible fallback- DiscEditorGUIv2 now passes
"sound"instead of"soundKey"toupdateDiscField() - Existing disc.json files with
"soundKey"entries will be read correctly (no manual migration needed)
-
ParrotDanceListener NPE: Added null-check for
getWorld()before callinggetNearbyEntities(). Prevents crash when jukebox is in an unloaded world. -
JukeboxPlayback thread-safety: Changed internal
listenersset fromHashSettoConcurrentHashMap.newKeySet(). Prevents potentialConcurrentModificationExceptionwhen players join/leave during playback. -
Config values without bounds validation: All numeric config getters now clamp to valid ranges:
volume: 0.0–4.0creeper-drop-chance/loot-chance: 0.0–1.0max-loot-discs/fragments-per-disc: 1–64jukebox-hearing-radius: 1–512dance-radius: 1–32
Removed
- ColorUtil class deleted: Deprecated since v2.1.0, internally fully replaced by
AdventureUtil. No remaining usages in plugin code. Removed unused import fromDiscEditorGUIv2.
Changed
- README overhauled: Resource Pack documentation
- Replaced misleading
pack_format: 34for "Minecraft 1.21.x" with accurate per-version format table - Added modern
min_format/max_formatexamples for Minecraft 1.21.9, 1.21.10, and 1.21.11 - Added GitHub URL warning (don't use
/blob/URLs for server resource packs) - Added ZIP structure documentation (correct vs incorrect root layout)
- Added troubleshooting checklist for "Resource Pack hash is outdated" error
- Replaced misleading
- Example resource pack updated:
pack.mcmetanow usesmin_format: [69, 0]/max_format: [75, 0](compatible with MC 1.21.9–1.21.11) - Example resource pack README fixed:
- Added note that template does not include real
.oggfiles - Replaced outdated
supported_formatsreference withmin_format/max_formatexplanation - Unified sound key examples to consistently use
music_disc.prefix - Fixed incorrect
config.ymlreference →server.propertiesasresource-pack-sha1
- Added note that template does not include real
-
[2.1.5] - 2026-04-18
Fixed
-
Permission system completely overhauled: Players were incorrectly blocked in areas without explicit WorldGuard flags
customjukebox.useis now actually checked (previously only defined but never used)- WorldGuard now only checks for explicit
use deny- Areas without the flag allow jukeboxes - Specific error messages instead of generic “no-permission” (Region/Claim/Permission separated)
- New permission
customjukebox.bypass.protectionto bypass WorldGuard/GriefPrevention (default: OP)
-
Various bug fixes: Fixed several potential crashes and race conditions
- Thread safety for the playlist queue (synchronized methods)
- Safer file saving with
Files.move()instead of delete+rename (prevents data loss on Windows) - Null checks for metadata access, WorldGuard locations, and Adventure API colors
- ArrayIndexOutOfBounds protection in the Disc Editor for corrupt states
- UpdateChecker: JSON null safety and resource leak fix
-
Minor improvements:
- Mute state is now persisted in config.json (survives server restart)
- Location-based HashMap key replaced with string key (more reliable cooldown)
- Tab completion now shows subcommands even with empty input
- Category validation in the Creation Wizard (warning for non-existent categories)
- More efficient item distribution (a stack instead of a loop)
- Plugin tasks are now properly terminated on onDisable
Changed
- Paper API 1.21.11: Plugin now compiles and runs against Paper 1.21.11
- Resource Pack updated:
pack_formatset to 75 (1.21.11), sound namespace corrected - Default Configs:
versionfield added to config.json and disc.json - README: Detailed permissions documentation with tables and descriptions
Added
- Permission
customjukebox.bypass.protection(default: OP, included incustomjukebox.admin) - New error messages in all 4 languages:
no-permission-jukebox,no-permission-region,no-permission-claim
-
[2.1.4] - 2026-04-14
Fixed
- False update notification: Fixed plugin incorrectly showing "Update to 2.1.3 available" despite already running 2.1.3
- Gradle's
processResourcesdid not track the project version as an explicit task input - Added
inputs.property("version", project.version)to ensure version changes always trigger resource re-processing
- Gradle's
- False update notification: Fixed plugin incorrectly showing "Update to 2.1.3 available" despite already running 2.1.3
[2.1.3] - 2026-04-11
Fixed
-
Message formatting: All chat messages now use MessageUtil with Adventure API
- Replaced all raw
sender.sendMessage(String)/player.sendMessage(String)calls - Replaced hardcoded section sign color codes with ampersand codes
- Affects all commands, listeners, and GUI components
- Replaced all raw
-
Error handling: Replaced all
printStackTrace()calls with properLogger.log()usage- CJBCommand, ConfigManager, DiscManager, IntegrationManager
-
Give/Fragment command bug: Fixed commands giving items even with invalid amount input
- Added missing
returnafter NumberFormatException in GiveSubcommand and FragmentSubcommand
- Added missing
-
Vanilla sound overlap: Fixed volume fluctuations during custom disc playback
- Added
jukebox.stopPlaying()to stop server-side vanilla playback - Prevents Jukebox block entity from periodically re-triggering vanilla sound
- Applied to both manual disc insertion and GUI-based insertion
- Added
-
[2.1.2] - 2026-03-29
Fixed
-
Message formatting: Fixed color codes showing as garbled text on Paper 1.21+ servers
-
Critical: Wrong disc playing after quick switch: Added comprehensive fix for race conditions
- Implemented 500ms cooldown between disc changes to prevent race conditions
- Added triple-verification system to ensure correct disc identification
- Re-identify disc after insertion to catch quick swaps
- Stop any existing playback immediately on new disc insertion
- Added final verification before playback starts
-
Critical: Playlist skip race condition: Fixed tracks being skipped in playlists
- Added
peekNext()method for safe preview without index advancement - Eliminated race conditions in playlist progression logic
- Ensured thread-safe playlist queue operations
- Added
-
Critical: Data loss on disc save: Implemented atomic file operations
- Write to temporary file first, then atomic rename
- Automatic backup restoration on save failure
- Added
getLatestBackup()recovery mechanism - Prevents disc.json corruption on write failures
-
Memory leak with player UUIDs: Fixed players remaining in listener lists
- Added
PlayerQuitEventhandler to clean up UUIDs - Implemented
removePlayerFromAllPlaybacks()method - Prevents memory accumulation over time
- Added
-
HTML entities in display texts: Fixed & showing instead of color codes
- Added
unescapeHtmlEntities()method in DiscManager - Properly decodes HTML entities when loading from JSON
- Backup decoder in JukeboxListener for compatibility
- Added
-
Vanilla sound stop mechanism: Improved reliability
- Increased attempts from 2 to 4 (at 1, 5, 10, 20 ticks)
- Optimized performance with squared distance calculations
- Added chunk-based pre-filtering for efficiency
-
Folia support issues: Fixed fallback problems
- Better error messages instead of silent fallback
- Improved API change detection
- Warns admins about compatibility issues
-
Mute state not persistent: Now saves across reloads
- Added
loadMuteState()andsaveMuteState()methods - Mute state stored in config.json
- Survives plugin reloads and server restarts
- Added
Security
-
Thread-safety improvements: Migrated to ConcurrentHashMap
- All GUI classes now use thread-safe collections
- Prevents ConcurrentModificationException
- Better multi-threaded performance
-
Permission checks in GUIs: Added runtime permission validation
- GUI handlers now verify permissions on every click
- Prevents exploitation when permissions change during use
- Immediate closure if permissions are revoked
Performance
-
Location cloning optimization: Reduced unnecessary object creation
- Added
getJukeboxLocationClone()for explicit cloning - Internal methods use reference for performance
- Documented when cloning is necessary
- Added
-
Input validation: Added comprehensive parameter checking
- CustomDisc constructor validates all inputs
- Throws IllegalArgumentException for invalid values
- Prevents creation of invalid disc objects
Technical
- Fixed missing imports in JukeboxListener
- Updated all GUI classes for thread-safety
- Enhanced debug logging for troubleshooting
- Improved error recovery mechanisms
-
Нет описания изменений
[2.1.0] - 2026-02-18
Added
- Adventure API Integration: Migrated to modern Paper Adventure API
- New
AdventureUtilclass for unified text component handling - Full support for HEX colors, gradients, and MiniMessage format
- Better performance and future-proofing for Paper 1.21+
- New
Changed
- Modernized Text Handling: Core components now use Adventure API
CustomDisc.createItemStack()usesdisplayName()andlore()methodsDiscFragment.createItemStack()uses Adventure ComponentsJukeboxListenertitles and action bars use Adventure API- Player.sendTitle() → Title.title() with proper durations
- Player.sendActionBar() → Adventure Component-based
Fixed
-
Critical Playlist Bug: Fixed playlists stopping after first song
stopPlayback()now hasclearPlaylistQueueparameter- Playlist queue is preserved during auto-progression to next track
- Playlist queue is cleared only when manually stopping playback
- This was a critical bug preventing playlists from working correctly!
-
Resource Leak in UpdateChecker: Properly closes HTTP connections
- Added try-finally blocks with explicit connection.disconnect()
- Added proper BufferedReader closing
- Prevents resource exhaustion on update checks
Deprecated
- ColorUtil class marked as @Deprecated (but still functional)
- Kept for backwards compatibility
- New code should use
AdventureUtilinstead - Legacy ChatColor/BungeeCord API calls will be phased out
Technical
- Deprecation Warning Reduction: 70 → 1 warning (98.6% reduction)
- Migrated all ColorUtil.colorize() calls to AdventureUtil
- Replaced 7 internal deprecated method calls
- Only remaining warning: GriefPrevention external API (cannot be fixed)
- Adventure API bundled in Paper 1.21+ (no extra dependency needed)
- Full backwards compatibility maintained
- All existing features continue to work unchanged
Migration Notes
- Plugin users: No action required - update is fully compatible
- Plugin developers using API: Consider migrating to AdventureUtil for new code
- All color codes (&a, &#RRGGBB, gradients) continue to work as before
- Adventure API Integration: Migrated to modern Paper Adventure API
[2.0.0] - 2026-01-06
Added
- Folia Support: Full compatibility with Folia (region-threaded) servers
- Added
folia-supported: trueflag in plugin.yml - New
SchedulerUtilclass for cross-platform scheduler abstraction - Automatic detection of Folia vs Paper/Spigot at runtime
- Uses reflection to call Folia API without compile-time dependency
- Region scheduler for location-based tasks
- Entity scheduler for player/entity-specific tasks
- Async scheduler for background operations
- All 26 scheduler calls migrated to use SchedulerUtil
- Added
Fixed
-
Folia Scheduler Bug: Fixed UnsupportedOperationException when running on Folia servers
- Corrected all reflection API calls to use proper Folia methods
runLater()now usesBukkit.getRegionScheduler().runDelayed()run()now usesBukkit.getRegionScheduler().run()runAsync()now usesBukkit.getAsyncScheduler().runNow()runAsyncLater()now usesBukkit.getAsyncScheduler().runDelayed()
-
Sound Key Validation: Removed strict validation that rejected valid sound keys
- Now accepts both
namespace:keyformat (e.g.,customjukebox:epic_journey) - AND legacy
music_disc.nameformat (e.g.,music_disc.traeumer) - Validation errors for 18 discs resolved
- Now accepts both
-
ConfigManager NullPointerException: Fixed initialization crash
- Removed
isDebug()check increateBackup()method during initialization - Plugin now starts without errors
- Removed
-
PlaybackManager NullPointerException: Fixed task storage crash on Folia
- Added null checks before storing tasks in ConcurrentHashMap
- Folia tasks return null (expected behavior) - now handled gracefully
- Fixed in both
scheduleAutoStop()andscheduleLoopTask()methods
Technical
- New
SchedulerUtilclass with Folia detection viaio.papermc.paper.threadedregions.RegionizedServer - Uses Java reflection to avoid compile-time Folia dependency
- Fallback to Paper scheduler if reflection fails
- All scheduler methods return nullable
BukkitTask(null on Folia) - Enhanced error logging for scheduler failures
- Full backwards compatibility with Paper/Spigot servers
Migration Notes
- Plugin now works on both Folia AND Paper/Spigot servers
- No configuration changes required
- Automatic server type detection
- Zero performance impact on Paper/Spigot servers
- Folia Support: Full compatibility with Folia (region-threaded) servers
[1.3.0] - 2025-12-31
Added
-
Public API for Plugin Developers: New
CustomJukeboxAPIclass allows other plugins to interact with CustomJukebox- Access to all discs, fragments, categories, and playlists
- Playback control methods
- Configuration access
- Integration checks (WorldGuard, GriefPrevention)
- Full JavaDoc documentation
-
Disc Categories System: Organize discs by theme or genre
- Define categories in
disc.jsonwith display name and description - Assign discs to categories using
"category"field - Filter discs by category via API
- Example categories: Ambient, Epic, Nature
- Define categories in
-
Playlist System: Group discs for sequential playback with automatic queue management
- Create playlists in
disc.jsonwith list of disc IDs OR in-game with commands/GUI - Commands:
/cjb playlist list|info|play|create|delete|add|remove|rename|editfor full control - In-Game Management: Create and edit playlists without touching config files
- GUI Editor: Visual playlist editor with click-to-add/remove interface
- Integrated into Admin GUI for centralized management
- Automatic progression: Plays next disc when current finishes
- Loop support: Endless playlist playback with
/cjb playlist play <name> loop - Queue management: Tracks current position and handles transitions
- Auto-save: All changes instantly saved to
disc.json - Perfect for events, ambient music, or themed collections
- Create playlists in
-
Admin GUI System: Comprehensive in-game administration interface
- Main Admin Panel: Accessible via
/cjb gui(Admin button at bottom for OPs) - Disc Creation Wizard: 7-step chat wizard for creating new discs
- Step-by-step guidance through all fields (ID, name, author, sound, duration, category, model data)
- Input validation at each step (ID format, sound key syntax, numeric values)
- Shows existing categories during creation
- Summary preview before final creation
- Auto-save to
disc.json
- Disc Editor: Hybrid GUI/Chat system for editing existing discs
- GUI Selectors for numeric values:
- Duration selector with presets (30s, 60s, 90s... up to 600s) + custom input
- Custom Model Data selector (1-20) + custom input
- Category selector showing all categories + create new option
- Chat Input for text fields (Display Name, Author, Sound Key)
- All changes auto-save immediately
- Delete confirmation dialog for safety
- GUI Selectors for numeric values:
- Playlist Management: Full playlist CRUD operations via GUI
- Create new playlists (chat-based for now)
- Edit playlists with visual disc selector (click to add/remove)
- Delete playlists with confirmation
- Live status indicators (✔ In playlist)
- Category Management: Organize discs by categories
- Category Creation Wizard: 3-step chat wizard for creating categories
- ID input with validation (lowercase, no spaces)
- Display Name with full color support (legacy, HEX, gradients)
- Optional description field
- Summary confirmation before creation
- Category Editor GUI: Visual editor for existing categories
- Edit display name with advanced color support
- Edit description with color codes
- Live preview of changes
- Auto-save to
disc.json
- Create and delete categories
- View disc count per category
- Easy category assignment via selector in disc editor
- Category Creation Wizard: 3-step chat wizard for creating categories
- No more manual JSON editing for most operations!
- Main Admin Panel: Accessible via
-
Advanced Color System: Full support for modern Minecraft color codes
- HEX Colors: Use
&#RRGGBBor#RRGGBBformat (e.g.,&#FF5555for red) - Gradient Support: Create color gradients with
<gradient:#START:#END>text</gradient>- Example:
<gradient:#FF0000:#0000FF>Epic Soundtrack</gradient>creates red-to-blue gradient - Automatically interpolates colors across each character
- Example:
- Legacy Codes: Still supports standard codes (
&a,&b,&c, etc.) - Formatting: Bold (
&l), italic (&o), underline (&n), strikethrough (&m) - Works Everywhere: Display names, authors, descriptions, categories, lore
- New
ColorUtilclass handles all color processing - Better user guidance in all wizards and editors
- HEX Colors: Use
-
bStats Metrics Integration: Anonymous plugin statistics
- Track plugin usage and feature adoption
- Custom charts for language, integrations, and feature usage
- Helps improve plugin development
- Fully privacy-respecting (configurable via bStats)
-
PlaceholderAPI Support: 15+ placeholders for use in other plugins
%customjukebox_version%- Plugin version%customjukebox_total_discs%- Total number of custom discs%customjukebox_hand_disc_name%- Name of disc in main hand%customjukebox_hand_disc_author%- Author of disc in hand%customjukebox_volume%- Current playback volume- And many more! See API documentation for full list
-
Configurable Jukebox Hearing Radius: New config option
playback.jukebox-hearing-radius- Default: 64 blocks
- Controls how far players can see disc title/actionbar when disc is inserted
- Separate from sound playback radius (controlled by volume)
Changed
-
Improved Tab-Completion: Commands now suggest disc display names in addition to IDs
- Works for
/cjb give,/cjb info,/cjb play,/cjb fragment - Automatically strips color codes for better matching
- More user-friendly for admins
- Works for
-
Enhanced CustomDisc Model: Added category field support
- Discs can now be assigned to categories
- Backwards compatible (category is optional)
-
Updated Dependencies:
- Added bStats 3.1.0
- Added PlaceholderAPI 2.11.6 (soft-dependency)
Fixed
-
Color Codes in Author Field: Author field now properly supports color codes
- Previously, color codes in author field were not processed
- Now supports legacy codes (
&a-&f), HEX colors (&#FF5555), and gradients - Resolves user report about non-working color codes in author field
-
Update Checker Version Comparison: Fixed false "update available" notifications
- Previously used string comparison instead of semantic versioning
- Would incorrectly show "1.0.1" as newer than "1.3.0"
- Now properly compares versions numerically (1.3.0 > 1.0.1)
- Added support for development versions (shows "development version" message)
- Handles version suffixes like "-SNAPSHOT" correctly
-
Category Management TODOs: Completed all category management features
- Category creation wizard now fully implemented (previously TODO)
- Category editor GUI now fully functional (previously TODO)
- All category operations work seamlessly through Admin GUI
Technical
- New model classes:
DiscCategory,DiscPlaylist - Extended DiscManager with full CRUD methods for discs, playlists, and categories
- Added PlaybackManager queue system for automatic disc progression
- New command:
PlaylistSubcommandwith 9 actions (list/info/play/create/delete/add/remove/rename/edit) - New GUIs:
AdminGUI- Main admin panel with navigation to all management functionsDiscCreationWizard- 7-step chat wizard for disc creation with validationDiscEditorGUIv2- Hybrid GUI/Chat editor with selector menus- Duration selector with preset values
- Custom Model Data selector (1-20)
- Category selector with create option
PlaylistEditorGUI- Visual playlist editor with click-to-add/remove interfaceCategoryCreationWizard- 3-step chat wizard for category creationCategoryEditorGUI- Visual category editor with chat input for text fields- Extended
GuiSubcommandwith admin button integration
- New Utilities:
ColorUtil- Advanced color processing with HEX and gradient support- Replaces basic
ChatColor.translateAlternateColorCodes()throughout plugin - Supports legacy codes, HEX colors, and gradients
- Used by all managers and GUIs for consistent color handling
- Replaces basic
- Enhanced UpdateChecker:
- Semantic versioning comparison with
compareVersions()method - Proper handling of version parts (major.minor.patch)
- Support for version suffixes (e.g., "-SNAPSHOT")
- Three-way comparison (older/equal/newer)
- Semantic versioning comparison with
- Auto-save system: All changes persist to disc.json immediately
- Wizard pattern for guided multi-step processes
- Selector pattern for numeric value selection with presets
- Added PlaceholderAPIExpansion for PAPI integration
- Improved modular architecture for future extensions
- All new features fully documented with JavaDoc
Commands Added
/cjb playlist list- List all available playlists/cjb playlist info <playlist>- Show playlist details and track list/cjb playlist play <playlist> [loop]- Play playlist with optional looping/cjb playlist create <id> [display name]- Create new playlist in-game/cjb playlist delete <playlist>- Delete existing playlist/cjb playlist add <playlist> <disc>- Add disc to playlist/cjb playlist remove <playlist> <disc>- Remove disc from playlist/cjb playlist rename <old-id> <new-id>- Rename playlist ID/cjb playlist edit <playlist>- Open GUI editor for playlist management
Permissions Added
customjukebox.playlist- Allows managing and playing playlists (default: op)
-
[1.2.4] - 2025-12-23
Fixed
-
Documentation: Corrected
sounds.jsonformat in README and example resource pack- Sound event keys now use proper format:
music_disc.<disc_id>(e.g.,music_disc.epic_journey) - Sound file paths now use relative paths without namespace (e.g.,
custom/music/epic_journey) - Updated all example configurations to match working server format
- Removed unnecessary subtitle fields from examples
- Sound event keys now use proper format:
-
Example Configuration: Updated default
disc.jsonwith correct sound key format- Changed from
customjukebox:*tominecraft:music_disc.*format - All three example discs now use consistent, working configuration
- Matches the format validated on production servers
- Changed from
Changed
- Resource Pack Documentation: Improved clarity in sounds.json setup instructions
- Added clear explanation of sound event key format
- Documented correct file path structure for .ogg files
- Updated Important Notes section with accurate format information
-
[1.2.3] - 2025-12-15
Fixed
-
Critical Loop-Task Bug: Fixed issue where music would spontaneously restart
- Loop tasks were not properly canceled before creating new playback sessions
- Multiple tasks could run simultaneously, causing unexpected music restarts
- Now properly cancels old tasks BEFORE removing playback and starting new loop
- Prevents task accumulation that led to random music playback
- Added proper cleanup sequence: cancel task → stop sound → remove playback → start new
-
Play Command Parameter Order: Fixed
/cjb playcommand parameter parsing issues- Parameters can now be provided in any order (e.g.,
/cjb play disc loop 100or/cjb play disc 100 loop) - Previously required specific order (loop had to come before range)
- Added duplicate parameter detection with debug logging
- Improved error messages for invalid parameters with helpful suggestions
- Enhanced tab-completion to only suggest unused parameters
- Parameters can now be provided in any order (e.g.,
Technical
- Improved task cancellation logic in
scheduleLoop()method - Better cleanup sequence prevents orphaned tasks
- Enhanced debugging output for loop operations
- Refactored PlaySubcommand parameter parsing with order-independent logic
- Added
playback-invalid-parameterlanguage key to all 4 language files
-
[1.2.2] - 2025-12-15
Added
-
Mute/Unmute Commands: New commands for quickly silencing and restoring playback
/cjb mute [restart]- Mutes all playback by setting volume to 0/cjb unmute [restart]- Restores previous volume before muting- Saves volume state before muting for seamless restoration
- Optional restart parameter to apply changes to active playbacks immediately
-
Volume Presets: Quick volume adjustment with preset names
silent/mute/off→ 0.0quiet/low/soft→ 0.5normal/default/medium→ 1.0loud/high→ 2.0max/maximum/full→ 4.0- Example:
/cjb volume quietor/cjb volume loud restart
Changed
- Improved Volume Control: Enhanced volume adjustment system
- Finer granularity: 41 volume levels (0.0 to 4.0 in 0.1 increments)
- Enhanced tab-completion with all numeric values and preset names
- Better precision display with 2 decimal places (e.g., 1.50)
- Improved error messages for invalid volume values
Technical
- Added mute state tracking in ConfigManager
- Volume presets support multiple aliases for user convenience
- Enhanced tab-completion system for better user experience
- All new features fully translated in 4 languages (EN, DE, ES, IT)
-
[1.2.1] - 2025-12-14
Fixed
- Critical Configuration Fix: Fixed inconsistency between
disc.jsonandsounds.jsondefault configurations- Updated example disc entries to use correct sound keys (
customjukebox:epic_journey, etc.) - Now includes three example discs: Epic Journey, Ocean Dreams, and Forest Walk
- All sound keys now properly match between disc.json and sounds.json
- Updated example disc entries to use correct sound keys (
Added
-
Startup Validation System: Plugin now validates all disc configurations on startup
- Checks for missing or invalid sound keys
- Verifies sound key format (namespace:sound_name)
- Warns about missing duration settings
- Provides clear error messages for configuration issues
- Helps identify why sounds might not play
-
Enhanced Error Handling: Significantly improved error feedback when sounds fail to play
- Detailed console logs with troubleshooting steps
- In-game notifications to players when sound playback fails
- Clear explanations of possible causes (missing resource pack, wrong sound key, etc.)
- Suggestions for how to fix common issues
Changed
- Documentation Update: Completely updated resource pack README.md
- All YAML references replaced with JSON (disc.json, config.json)
- Corrected configuration examples to use JSON syntax
- Updated command examples and troubleshooting guides
- Added information about server.properties resource pack configuration
- More detailed testing and debugging instructions
Technical
- Added
validateDiscs()method in DiscManager for configuration validation - Enhanced
playSound()method in PlaybackManager with comprehensive error reporting - Improved logging output for debugging sound playback issues
- Better player feedback when sound playback fails
- Critical Configuration Fix: Fixed inconsistency between
[1.2.0] - 2025-12-13
Added
-
Playback Range System: Control who hears custom music with range parameters
/cjb play <disc> [loop] [global|world|<radius>]- global: All players on the server hear the music
- world: Only players in the same world
- Custom radius: Specify exact block radius (e.g.,
50,100,200) - Perfect for server-wide events, world-specific ambiance, or localized music zones
-
Volume Restart Feature:
/cjb volume <value> restart- Apply volume changes to already playing songs instantly
- Automatically restarts all active playbacks with new volume
- No need to manually stop and restart songs anymore
-
PlaybackRange Model: New enum system for managing playback ranges
- Clean API for future range-based features
- Supports NORMAL, GLOBAL, WORLD, and CUSTOM_RADIUS types
- Automatic parsing from command parameters
Changed
- Extended PlaybackManager with range-aware sound distribution
- Enhanced JukeboxPlayback model to track playback range
- Loop functionality now preserves range settings across restarts
- Updated all command usages to include new parameters
Added (Features)
- Smart player detection based on range type
- Efficient range checking for different playback scopes
- Range information displayed in playback success messages
Updated (Translations)
- All 4 languages updated with new range-related messages (DE, EN, ES, IT)
- New messages:
playback-range-info,playback-invalid-range,volume-restarted - Updated command usage strings for all languages
Technical
- New
PlaybackRangeclass for type-safe range management - Added
restartAllPlaybacks()method to PlaybackManager - Extended
shouldPlayerHearPlayback()with range logic - Improved playback session management
-
[1.1.0] - 2025-12-13
Added
-
Direct Playback Command: New
/cjb play <disc> [loop]command allows OPs to play custom discs directly at their location- Supports optional
loopparameter to enable infinite playback - No need to place physical jukeboxes anymore
- Perfect for events and server-wide music
- Supports optional
-
Stop Command: New
/cjb stopcommand to stop all active playbacks- Instantly stops all looping and non-looping sounds
- Useful for ending events or silencing the server
-
Volume Control: New
/cjb volume <0.0-4.0>command for centralized volume management- Adjusts playback volume globally
- Range: 0.0 (silent) to 4.0 (maximum)
- Persists in config.json
- Without arguments, displays current volume
-
Loop Functionality: Songs can now be played in an infinite loop
- Automatically restarts when the song ends
- Configurable via command parameter
- Perfect for background music during events
-
Playback Configuration: New
playbacksection in config.jsonvolume: Global playback volume (default: 4.0)default-loop: Default loop behavior (default: false)
Changed
- Updated PlaybackManager to support dynamic volume control
- Extended JukeboxPlayback model with loop flag tracking
- Volume is now read from config instead of hardcoded constant
- PlaybackManager now schedules loop tasks instead of just stop tasks
Added (Permissions)
customjukebox.play- Allows playing discs directly (default: op)customjukebox.stop- Allows stopping all playbacks (default: op)customjukebox.volume- Allows changing volume (default: op)
Added (Translations)
- Added German translations for all new commands and messages
- Added English translations for all new commands and messages
- Added Spanish translations for all new commands and messages
- Added Italian translations for all new commands and messages
Updated (Documentation)
- Updated README.md with new commands and features
- Updated plugin.yml command usage
- Version bumped to 1.1.0
-
Нет описания изменений

