📦 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.biome and bs.weather modules into a single bs.environment module.

  • 📦 #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.load module, removing the need for manual load and unload tags. Bookshelf now also uses LanternLoad.

  • #285 - Removed the need for __help__ functions and help tags. 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.md and a pack.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_block and get_type to 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_particle and new parameters (mode, viewers).

  • #363 - Enhanced fill_block, fill_type, fill_random, set_block, and set_type to accept strict as a mode parameter, allowing control over whether the operation triggers block updates.

  • #349 - Added the on_finished argument to fill operations. If specified, the provided command runs automatically when the operation completes.

  • #287 - Updated replace_type to 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.generate module to bs.generation.

  • ⚠️ #282 - Renamed scores used in callbacks to use the new bs.lambda objective.

  • ⚠️ #296 - Renamed the bs.generate:fractal_shape_2d function to bs.generation:gen_fractal_shape_2d.

  • ⚠️ #296 - Renamed the bs.generate:shape_2d function to bs.generation:gen_shape_2d.

  • ⚠️ #296 - Renamed the bs.generate:simplex_shape_2d function to bs.generation:gen_simplex_shape_2d.

❤️ bs.health#

  • ⚠️ #396 - Updated the get_max_health function 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_shape for block hitboxes and renamed shape to interaction_shape.

  • ⚠️ #318 - Removed is_in_block and is_entity_in_block(s) functions in favor of is_in_block_<collision|interaction> and is_entity_in_block(s)_<collision|interaction>.

  • ⚠️ #297 - Replaced the is_composite block tag with is_full_cube for better clarity.

  • #299 - Moved the #bs.hitbox:can_pass_through block tag from the move module and documented it.

  • #285 - Introduced the #bs.hitbox:is_sized tag for better hitbox management.

  • 🐛 #320 - Fixed functions that were previously unusable outside the Overworld.

🖱️ bs.interaction#

  • #300 - Added bs.interaction.hovered tag to check if an interaction is currently hovered.

📄 bs.log#

  • ⚠️ #369 - Migrated the bs.log module to use SNBT instead of JSON for log messages.

🏃 bs.move#

  • ⚠️ #282 - Updated on_collison callback: scores now use the bs.lambda objective, and the input requires a full command instead of a function path. Additionally, on_collision/* functions have been renamed to callback/*.

  • #318 - Added optional hitbox_shape parameter to apply_vel functions, selecting between collision and interaction hitboxes.

  • #298 - Predicate bs.move:has_vel is 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_shape argument to run, allowing selection between collision and interaction shapes.

⏲️ bs.schedule#

  • ⚠️ #282 - Changed the schedule function 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:create was not functioning correctly.

🔠 bs.string#

  • 🎉 #283 - Added a new bs.string module for managing strings.

🧣 bs.spline#

  • 🎉 #241 - Added a new bs.spline module for working with splines.

bs.time#

  • 🐛 #379 - Fixed get time for the 1.21.5 version of Minecraft.

👀 bs.view#

  • #318 - Added the hitbox_shape argument to raycast related functions, allowing selection between collision and interaction shapes.

  • #299 - Block tag can_see_through is now properly documented.

  • 🐛 #319 - Fixed can_see_ata max distance computation.