
BS CustomJukebox
Fully-featured Paper 1.21+ jukebox plugin with custom music discs, disc fragments, GUI support, and WorldGuard/GriefPrevention integration.
BS CustomJukebox 3.0.0
release6 мая 2026 г.[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
BS CustomJukebox 2.2.1
release4 мая 2026 г.[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).
BS CustomJukebox 2.2.0
release2 мая 2026 г.[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
BS CustomJukebox 2.1.6
release1 мая 2026 г.[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
BS CustomJukebox 2.1.5
release18 апреля 2026 г.[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
