Compatibility
Minecraft: Java Edition
1.21.5–1.21.8
Platforms
Creators
Details
Changelog
📦 Bookshelf - 3.0.0
🚂 The Pipeline Update!
This release overhauls the project structure with Beet, focusing on modularity and isolation of each module. It also introduces a new version loader that resolves conflicts between multiple versions.
⚠️ BREAKING CHANGES: This new version has a few breaking changes!
Bookshelf is now based on Minecraft 1.21.5. Each module of Bookshelf is now shipped as a separate datapack for people wanting to use only a single module. Introduced bundles to better group modules, replacing Bookshelf and Bookshelf Dev datapacks: Bookshelf Runtime, Bookshelf Dev, Bookshelf Prefabs, and Bookshelf Suite.
- ⚠️ #281 - Merged the
bs.biomeandbs.weathermodules into a singlebs.environmentmodule. - 📦 #323 - Introduced bundles to better group modules, replacing Bookshelf and Bookshelf Dev datapacks: Bookshelf Runtime, Bookshelf Dev, Bookshelf Prefabs, and Bookshelf Suite.
- 🎉 #272 - Added an automatically generated
bs.loadmodule, removing the need for manualloadandunloadtags. Bookshelf now also uses LanternLoad. - ⚡ #285 - Removed the need for
__help__functions andhelptags. These are now generated. - 📝 #285 - Migrated the documentation to mcbookshelf.dev and reworked the contribution guide to explain the new Beet pipeline.
- ⚙️ #285 - Created a GitHub organization and transitioned from the Jupyter Notebook to Beet. Updated the metadata format, added new issue templates, and introduced workflows for automatic deployment to Modrinth and Smithed. Modules now also require a
README.mdand apack.png. - 📥 #333 - Bookshelf now has its own download manager, allowing users to select modules along with their dependencies and create custom bundles.
- 📥 #336 - Bookshelf is now available on PyPI for use with the Beet toolchain.
🧱 bs.block
- ⚠️ #375 - Changed
get_blockandget_typeto only return existing data. Empty strings for state or NBT are no longer possible; if absent, the field is omitted instead. - ✨ #279 - Introduced
play_block_sound, a function for playing block sounds. - 🐛 #320 - Fixed functions that were previously unusable outside the Overworld.
- ⚡ #375 - Added default values to
emit_block_particleand new parameters (mode,viewers). - ⚡ #363 - Enhanced
fill_block,fill_type,fill_random,set_block, andset_typeto acceptstrictas amodeparameter, allowing control over whether the operation triggers block updates. - ⚡ #349 - Added the
on_finishedargument to fill operations. If specified, the provided command runs automatically when the operation completes. - ⚡ #287 - Updated
replace_typeto return whether a type was found and replaced.
🧱 bs.environment
- 🐛 #320 - Fixed functions that were previously unusable outside the Overworld.
🌱 bs.generation
- ⚠️ #296 - Renamed the
bs.generatemodule tobs.generation. - ⚠️ #282 - Renamed scores used in callbacks to use the new
bs.lambdaobjective. - ⚠️ #296 - Renamed the
bs.generate:fractal_shape_2dfunction tobs.generation:gen_fractal_shape_2d. - ⚠️ #296 - Renamed the
bs.generate:shape_2dfunction tobs.generation:gen_shape_2d. - ⚠️ #296 - Renamed the
bs.generate:simplex_shape_2dfunction tobs.generation:gen_simplex_shape_2d.
❤️ bs.health
- ⚠️ #396 - Updated the
get_max_healthfunction to only return the base value, excluding all modifiers. - 🐛 #348 - Fixed an issue where running the heal command in a tick loop caused empty hearts to visually disappear.
🎯 bs.hitbox
- ⚠️ #318 - Introduced
collision_shapefor block hitboxes and renamedshapetointeraction_shape. - ⚠️ #318 - Removed
is_in_blockandis_entity_in_block(s)functions in favor ofis_in_block_<collision|interaction>andis_entity_in_block(s)_<collision|interaction>. - ⚠️ #297 - Replaced the
is_compositeblock tag withis_full_cubefor better clarity. - ✨ #299 - Moved the
#bs.hitbox:can_pass_throughblock tag from the move module and documented it. - ✨ #285 - Introduced the
#bs.hitbox:is_sizedtag for better hitbox management. - 🐛 #320 - Fixed functions that were previously unusable outside the Overworld.
🖱️ bs.interaction
- ✨ #300 - Added
bs.interaction.hoveredtag to check if an interaction is currently hovered.
📄 bs.log
- ⚠️ #369 - Migrated the
bs.logmodule to use SNBT instead of JSON for log messages.
🏃 bs.move
- ⚠️ #282 - Updated
on_collisoncallback: scores now use thebs.lambdaobjective, and the input requires a full command instead of a function path. Additionally,on_collision/*functions have been renamed tocallback/*. - ✨ #318 - Added optional
hitbox_shapeparameter toapply_velfunctions, selecting betweencollisionandinteractionhitboxes. - ✨ #298 - Predicate
bs.move:has_velis now properly documented. hitbox_shape - 🐛 #316 - Fixed entities clipping into blocks during collision resolution.
🔦 bs.raycast
- ⚡ #358 - Added additional lambda values to callbacks.
- ⚡ #318 - Added the
hitbox_shapeargument torun, allowing selection betweencollisionandinteractionshapes.
⏲️ bs.schedule
- ⚠️ #282 - Changed the
schedulefunction signature for better consistency with others that use callbacks.
📰 bs.sidebar
- ⚡ #367 - Optimized the module for the 1.21.5 version of Minecraft.
- 🐛 #301 - Fixed the issue where
bs.sidebar:createwas not functioning correctly.
🔠 bs.string
- 🎉 #283 - Added a new
bs.stringmodule for managing strings.
🧣 bs.spline
- 🎉 #241 - Added a new
bs.splinemodule for working with splines.
⌚ bs.time
- 🐛 #379 - Fixed get time for the 1.21.5 version of Minecraft.



