diff --git a/.env.yml b/.env.yml
deleted file mode 100644
index be39760fec..0000000000
--- a/.env.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-mc_version: "1.21.4"
-
-documentation_url: "https://bookshelf.docs.gunivers.net/"
-
-metadata_folder: "metadata"
-feature_tag_namespace: "__bookshelf__"
-
-build_path: "./build"
-datapacks_path: "./datapacks"
-generated_path: "./generated"
-
-bookshelf_libs:
- - "Bookshelf"
- - "Bookshelf Dev"
diff --git a/.gitattributes b/.gitattributes
index 47402dcc21..a066745cfc 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,9 +1,8 @@
* text=auto
-*.ipynb filter=strip-notebook-output
/.github export-ignore
+/.vscode export-ignore
.editorconfig export-ignore
.gitattributes export-ignore
.gitignore export-ignore
-.mcwpack.yml export-ignore
.readthedocs.yml export-ignore
diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000000..5382cb52b6
--- /dev/null
+++ b/.github/CODE_OF_CONDUCT.md
@@ -0,0 +1,132 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, caste, color, religion, or sexual
+identity and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+ and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the overall
+ community
+
+Examples of unacceptable behavior include:
+
+* The use of sexualized language or imagery, and sexual attention or advances of
+ any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or email address,
+ without their explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Enforcement Responsibilities
+
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official email address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement at
+[contact@gunivers.net](mailto:contact@gunivers.net).
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series of
+actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or permanent
+ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within the
+community.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.1, available at
+[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
+
+Community Impact Guidelines were inspired by
+[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
+
+For answers to common questions about this code of conduct, see the FAQ at
+[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
+[https://www.contributor-covenant.org/translations][translations].
+
+[homepage]: https://www.contributor-covenant.org
+[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
+[Mozilla CoC]: https://github.com/mozilla/diversity
+[FAQ]: https://www.contributor-covenant.org/faq
+[translations]: https://www.contributor-covenant.org/translations
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
new file mode 100644
index 0000000000..0ad2581087
--- /dev/null
+++ b/.github/CONTRIBUTING.md
@@ -0,0 +1,5 @@
+# Contributing to Bookshelf 🎉
+
+Thank you for your interest in contributing to Bookshelf! Please refer to our [contribution documentation](https://docs.mcbookshelf.dev/en/latest/contribute/index.html) for detailed guidelines on how to contribute.
+
+Your contributions make Bookshelf better, and we're excited to work together! 😊
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index 7d7ef4a854..45fb4887bd 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1 +1 @@
-custom: ["helloasso.com/associations/altearn/formulaires/3/en"]
+custom: ["https://www.helloasso.com/associations/altearn/formulaires/6/en"]
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml
new file mode 100644
index 0000000000..c32e4b18e7
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug-report.yml
@@ -0,0 +1,80 @@
+name: "🐛 Bug report"
+description: Report a reproducible bug for investigation.
+labels:
+ - '🐛 Bug'
+body:
+ - type: input
+ attributes:
+ label: Module
+ description: Specify the module where the bug occurred (e.g., block, health, ...).
+ validations:
+ required: true
+
+ - type: input
+ attributes:
+ label: Feature
+ description: Specify the feature related to the bug (e.g., get_block, set_max_health, ...).
+ validations:
+ required: true
+
+ - type: input
+ attributes:
+ label: Version
+ description: Specify the version of Bookshelf you are using.
+ validations:
+ required: true
+
+ - type: textarea
+ attributes:
+ label: Expected Behavior
+ description: |
+ Describe what should happen under normal conditions:
+ - What is the expected output or behavior?
+ placeholder: |
+ Example:
+ - The command returns the correct result.
+ - The system behaves as described in the documentation.
+ validations:
+ required: true
+
+ - type: textarea
+ attributes:
+ label: Actual Behavior
+ description: |
+ Describe what happens instead of the expected behavior:
+ - Is there an error message or a malfunction?
+ - How does it differ from what is expected?
+ placeholder: |
+ Example:
+ - The command throws an unexpected error.
+ - The system behaves incorrectly or inconsistently.
+ validations:
+ required: true
+
+ - type: textarea
+ attributes:
+ label: Possible Fix
+ description: |
+ If you have a suggestion for a fix or a reason for the bug, please provide it here.
+ placeholder: |
+ Example:
+ - The issue may be caused by a missing dependency.
+ - Updating a block tag could resolve this.
+ validations:
+ required: false
+
+ - type: textarea
+ attributes:
+ label: Steps to Reproduce
+ description: |
+ Provide a step-by-step guide to help us replicate the issue:
+ 1.
+ 2.
+ 3.
+ 4.
+ placeholder: |
+ Example:
+ 1. Call feature A with parameter X.
+ 2. Call feature B and observe behavior Y.
+ validations:
+ required: false
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
deleted file mode 100644
index 520d34f34c..0000000000
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ /dev/null
@@ -1,35 +0,0 @@
----
-name: "🐛 Bug report"
-about: Report a reproducible bug.
-labels: '🐛 Bug'
-
----
-
-
-
-Bookshelf version:
-Feature path:
-
-## Steps To Reproduce
-
-1.
-2.
-
-
-
-Code example:
-
-
-
-## The current behavior
-
-
-## The expected behavior
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index 5c67c4af04..816780baa5 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -1,5 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: ❓ Question
- url: https://github.com/Gunivers/Bookshelf/discussions
+ url: https://github.com/mcbookshelf/Bookshelf/discussions
about: Please ask questions here.
diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml
new file mode 100644
index 0000000000..effaa15306
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature-request.yml
@@ -0,0 +1,40 @@
+name: "✨ Feature request"
+description: Suggest a new feature or improvement.
+labels:
+ - '✨ Feature'
+body:
+ - type: input
+ attributes:
+ label: Feature Name
+ description: Choose a short and descriptive name for the feature.
+ validations:
+ required: true
+
+ - type: input
+ attributes:
+ label: Target Module
+ description: Specify the module where this feature should be added.
+ placeholder: block, health, ...
+ validations:
+ required: true
+
+ - type: textarea
+ attributes:
+ label: Feature Description
+ description: |
+ Provide a clear description of the feature:
+ - What functionality does it offer?
+ - Why is this feature important or useful?
+ placeholder: |
+ Example:
+ - Adds functionality for managing block states.
+ - Enhances performance for specific tasks.
+ validations:
+ required: true
+
+ - type: textarea
+ attributes:
+ label: Additional Context
+ description: Provide any extra information, references, or examples to clarify your request.
+ validations:
+ required: false
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
deleted file mode 100644
index 84e1cc36c4..0000000000
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-name: ✨ Feature request
-about: Suggest a new feature and/or a new module.
----
-
-
diff --git a/.github/ISSUE_TEMPLATE/module-request.yml b/.github/ISSUE_TEMPLATE/module-request.yml
new file mode 100644
index 0000000000..d809b8242a
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/module-request.yml
@@ -0,0 +1,33 @@
+name: "✨ Module request"
+description: Suggest a new module.
+labels:
+ - '✨ Module'
+body:
+ - type: input
+ attributes:
+ label: Module Name
+ description: Choose a short and descriptive name for the module.
+ placeholder: block, health, ...
+ validations:
+ required: true
+
+ - type: textarea
+ attributes:
+ label: Description
+ description: |
+ Provide a detailed description of what this module would do:
+ - What problem does it solve?
+ - What key features and functionalities would it include?
+ placeholder: |
+ Example:
+ - A module to handle physics calculations and complex movements.
+ - A collection of small medieval house structures for building.
+ validations:
+ required: true
+
+ - type: textarea
+ attributes:
+ label: Additional Context
+ description: Provide any extra information, references, or examples to clarify your request.
+ validations:
+ required: false
diff --git a/.github/ISSUE_TEMPLATE/other.md b/.github/ISSUE_TEMPLATE/other.md
deleted file mode 100644
index bd8a9e428d..0000000000
--- a/.github/ISSUE_TEMPLATE/other.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-name: 📝 Other
-about: For other suggestions such as asking to add new related tools into the documentation, etc.
----
-
-
diff --git a/.github/ISSUE_TEMPLATE/other.yml b/.github/ISSUE_TEMPLATE/other.yml
new file mode 100644
index 0000000000..a86be66510
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/other.yml
@@ -0,0 +1,16 @@
+name: "📝 Other"
+description: Submit any other suggestions, such as adding related tools to the documentation.
+body:
+ - type: textarea
+ attributes:
+ label: Suggestion or Inquiry
+ description: |
+ Please describe your suggestion, request, or inquiry:
+ - What would you like to see added, improved, or clarified?
+ - Include any relevant tools, examples, or links if applicable.
+ placeholder: |
+ Example:
+ - Suggest adding a related tool to the documentation.
+ - Request an update for clearer documentation on a specific feature.
+ validations:
+ required: true
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000000..ac134f3de3
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,17 @@
+### Description
+
+
+### Related Issues
+
+
+### Additional Notes
+
+
+## Tasks to complete before merging
+
+- [ ] I agree to release my contribution under the [MPL v2 License](http://mozilla.org/MPL/2.0/).
+- [ ] My pull request is associated with an existing issue.
+- [ ] I have updated the [changelog](https://github.com/mcbookshelf/Bookshelf/blob/master/docs/CHANGELOG.md) to reflect my contribution.
+- [ ] If this pull request adds or modifies a feature:
+ - [ ] I have documented my changes in the `/docs` folder.
+ - [ ] I have thoroughly tested my changes. See [testing guidelines](https://docs.mcbookshelf.dev/en/latest/contribute/debug.html#unit-tests).
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
deleted file mode 100644
index ddd6ca9572..0000000000
--- a/.github/pull_request_template.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# Tasks to do before merging
-- [ ] I accept to publish my contribution under [MPL v2](http://mozilla.org/MPL/2.0/) License
-- [ ] My pull request is linked to an existing issue
-- [ ] I have added my contribution to the [changelog](https://github.com/Gunivers/Bookshelf/blob/master/docs/CHANGELOG.md)
-- If my pull request is a new or modify an existing feature:
- - [ ] I have documented my contribution (`/docs`)
- - [ ] I have added or updated the [header](https://bookshelf.docs.gunivers.net/en/latest/contribute/file-format.html) of the features' root function I contribute
- - [ ] I have [tested](https://bookshelf.docs.gunivers.net/en/latest/contribute/debug.html#unit-tests) my contribution
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
deleted file mode 100644
index 498ae9e676..0000000000
--- a/.github/workflows/deploy.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-name: 🚀 Deploy on server
-
-on:
- push:
- branches: [master]
- workflow_dispatch:
- inputs:
- sync:
- description: "File synchronization"
- required: true
- default: "delta"
-jobs:
- deploy:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- with:
- fetch-depth: 0
- - name: Deploy files
- uses: milanmk/actions-file-deployer@master
- with:
- remote-protocol: "sftp"
- remote-host: ${{ secrets.SFTP_IP }}
- remote-port: ${{ secrets.SFTP_PORT }}
- remote-user: ${{ secrets.SFTP_SANDBOX_USER }}
- remote-password: ${{ secrets.SFTP_PASSWORD }}
- remote-path: /bookshelf-world/
- ftp-mirror-options: "--include-glob=**/*.mca --include-glob=datapacks/** --include-glob=level.dat --include-glob=icon.png"
- - name: Restart server
- env:
- SERVER_RESTART_ENDPOINT: ${{ secrets.SERVER_RESTART_ENDPOINT }}
- SERVER_RESTART_BEARER: ${{ secrets.SERVER_RESTART_BEARER }}
- run: |
- server_full_status=$(curl "$SERVER_RESTART_ENDPOINT/resources" -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization: Bearer $SERVER_RESTART_BEARER" -X GET)
- server_power_status=$(jq -r '.attributes.current_state' <<<"$server_full_status")
- if [ $server_power_status = 'running' ]; then
- echo "Bookshelf's test server is online, restarting it to apply updates"
- curl "$SERVER_RESTART_ENDPOINT/power" -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization: Bearer $SERVER_RESTART_BEARER" -X POST -d '{"signal": "restart"}'
- else
- echo "Bookshelf's test server is offline, it will not be started"
- fi
diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml
deleted file mode 100644
index 9b98e85c91..0000000000
--- a/.github/workflows/pull-request.yml
+++ /dev/null
@@ -1,47 +0,0 @@
-name: 🔍 Pull Request Checks
-
-on:
- pull_request:
- paths:
- - "datapacks/**"
- types:
- [
- opened,
- synchronize,
- reopened,
- labeled,
- unlabeled
- ]
-
-env:
- GITHUB_EVENT: ${{ toJSON(github.event) }}
-
-jobs:
- review-metadata:
- name: 🔍 Metadata Review
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v4
- with:
- fetch-depth: 0
-
- - name: Set up Python
- uses: actions/setup-python@v5
- with:
- python-version: '3.12'
-
- - name: Install dependencies
- run: pip install -e ./scripts
-
- - name: Check function headers
- run: python scripts/workflows/check_function_headers.py
-
- - name: Check feature tag
- run: python scripts/workflows/check_feature_tag.py
-
- - name: Check module metadata file
- run: python scripts/workflows/check_module_metadata_file.py
-
- - name: Check generated metadata
- run: python scripts/workflows/check_generated_metadata.py
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index ab32571bd2..96cd2cb40c 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,48 +1,80 @@
-name: 🔖 Upload build assets
+name: 🔖 Release Modules
on:
push:
- tags: [ 'v*.*.*' ]
+ branches:
+ - '**'
+
+permissions:
+ contents: write
jobs:
- release:
+ update-metadata:
+ name: 📝 Update Metadata Files
runs-on: ubuntu-latest
- permissions:
- id-token: write
- contents: write
steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Set up Python
- uses: actions/setup-python@v5
+ - uses: actions/checkout@v4
with:
- python-version: '3.12'
-
- - name: Install dependencies
- run: pip install -e ./scripts
+ fetch-tags: true
+ ref: ${{ github.ref }}
+ - uses: fregante/setup-git-user@v2
+ - uses: pdm-project/setup-pdm@v4
+ with:
+ cache: true
+ - name: Install Dependencies
+ run: pdm install
+ - name: Update Metadata
+ run: pdm run meta update
+ - name: Commit Changes
+ run: |
+ git add .
+ git commit -m "🔖 Update generated metadata" || echo "No changes to commit"
+ git push origin HEAD:${{ github.ref }}
- - name: Set environment variables
+ check-versions:
+ name: 🔍 Check Release Necessity
+ needs: update-metadata
+ runs-on: ubuntu-latest
+ if: github.ref == 'refs/heads/master'
+ outputs:
+ release_tag: ${{ steps.check-versions.outputs.release_tag }}
+ release_name: ${{ steps.check-versions.outputs.release_name }}
+ version_exists: ${{ steps.check-versions.outputs.version_exists }}
+ steps:
+ - name: Check Versions
+ id: check-versions
run: |
- TAG=${{ github.ref_name }}
- echo "VERSION=${TAG#v}" >> $GITHUB_ENV
- echo "MC_VERSION=$(python -c 'import definitions; print(definitions.MC_VERSION)')" >> $GITHUB_ENV
- echo "BUILD_PATH=$(python -c 'import definitions; print(definitions.BUILD_PATH)')" >> $GITHUB_ENV
+ VERSION=$(python core/definitions.py VERSION)
+ MINECRAFT_VERSIONS=$(python core/definitions.py MINECRAFT_VERSIONS)
- - name: Package datapacks
- run: python scripts/workflows/distribute_release.py -v ${{ env.MC_VERSION }}-${{ env.VERSION }}
+ game_versions=$(echo $MINECRAFT_VERSIONS | sed 's/ /,/g')
+ echo "release_tag=v$VERSION" >> $GITHUB_OUTPUT
+ echo "release_name=v$VERSION - MC $game_versions" >> $GITHUB_OUTPUT
- - name: Package world
- uses: aksiome/minecraft-package@master
- with:
- config: .mcwpack.yml
- source: .
- target: ${{ env.BUILD_PATH }}/bookshelf-world-${{ env.MC_VERSION }}-${{ env.VERSION }}.zip
+ if [ -n "$(git tag -l "v$VERSION")" ]; then
+ echo "version_exists=true" >> $GITHUB_OUTPUT
+ else
+ echo "version_exists=false" >> $GITHUB_OUTPUT
+ fi
- - name: Upload artifacts
- uses: softprops/action-gh-release@v2
+ create-release:
+ name: 📦 Create Release
+ needs: check-versions
+ runs-on: ubuntu-latest
+ if: ${{ needs.check-versions.outputs.version_exists == 'false' }}
+ steps:
+ - uses: fregante/setup-git-user@v2
+ - uses: pdm-project/setup-pdm@v4
with:
- files: ${{ env.BUILD_PATH }}/*.zip
-
- - name: Update latest tag
- uses: EndBug/latest-tag@latest
+ cache: true
+ - name: Install Dependencies
+ run: pdm install
+ - name: Build Release Files
+ run: pdm run modules release
+ - uses: softprops/action-gh-release@v2
+ with:
+ body_path: docs/_templates/changelog/${{ needs.check-versions.outputs.release_tag }}.md
+ name: ${{ needs.check-versions.outputs.release_name }}
+ tag_name: ${{ needs.check-versions.outputs.release_tag }}
+ make_latest: true
+ files: release/*.zip
diff --git a/.github/workflows/review.yml b/.github/workflows/review.yml
new file mode 100644
index 0000000000..cb8fa077f7
--- /dev/null
+++ b/.github/workflows/review.yml
@@ -0,0 +1,38 @@
+name: 📋 Review Modules
+
+on:
+ push:
+ branches: ["master"]
+ pull_request:
+ workflow_dispatch:
+
+jobs:
+ check:
+ name: 🔍 Check Modules
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: pdm-project/setup-pdm@v4
+ with:
+ cache: true
+ - name: Install Dependencies
+ run: pdm install
+ - name: Check Modules
+ run: pdm run modules check
+
+ test:
+ name: 🧪 Test Modules
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: pdm-project/setup-pdm@v4
+ with:
+ cache: true
+ - uses: actions/setup-java@v4
+ with:
+ distribution: 'temurin'
+ java-version: '21'
+ - name: Install Dependencies
+ run: pdm install
+ - name: Test Modules
+ run: pdm run modules test
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
deleted file mode 100644
index a79e426001..0000000000
--- a/.github/workflows/test.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-name: 🧪 Test datapacks
-on: [push, pull_request, workflow_dispatch]
-
-jobs:
- test:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Set up Java
- uses: actions/setup-java@v4
- with:
- distribution: 'temurin'
- java-version: '21'
-
- - name: Set up Python
- uses: actions/setup-python@v5
- with:
- python-version: '3.12'
-
- - name: Install dependencies
- run: pip install -e ./scripts
-
- - name: Test datapacks
- run: python scripts/workflows/test_datapacks.py
diff --git a/.gitignore b/.gitignore
index 7669167e60..4cb26d09f0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,18 +1,25 @@
-**/.DS_Store
-**/__pycache__/
-/advancements/
-/build/
-/data/
-/DIM-1/
-/DIM1/
-/entities/
-/playerdata/
-/poi/
-/region/
-/stats/
-/level.dat
-/level.dat_old
-/session.lock
-/uid.dat
-/venv/
-/scripts/src/bookshelf_scripts.egg-info/
+__pycache__/
+.AppleDouble
+.beet_cache/
+.DS_Store
+.env
+.ipynb_checkpoints
+.LSOverride
+.mypy_cache/
+.pdm-build/
+.pdm-python
+.pdm.toml
+.ruff_cache/
+.venv
+*.egg
+*.egg-info/
+*.py[cod]
+*$py.class
+build/
+docs/_build/
+env.bak/
+env/
+ENV/
+release/
+venv.bak/
+venv/
diff --git a/.mcwpack.yml b/.mcwpack.yml
deleted file mode 100644
index d310dcd21f..0000000000
--- a/.mcwpack.yml
+++ /dev/null
@@ -1,33 +0,0 @@
-#### MCWPACK CONFIG FILE ####
-
-# Level name (supports minecraft color codes)
-name: Bookshelf World
-# Directory where the world is packed
-dirname: Bookshelf World
-# Additional entries (files or directories) to pack
-extra_entries:
- - README.md
- - LICENSE.md
-# Resourcepack directory (or zip archive)
-resourcepack: null
-# Reset player data in level.dat
-reset_player: true
-# Archive all non-archived datapacks
-zip_datapacks: true
-# Remove empty chunks from the world
-clean_chunks: true
-# Ignored blocks when cleaning chunks (default: minecraft:air)
-# The following will delete chunks that only contain air or stone
-# ignored_blocks:
-# - minecraft:air
-# - minecraft:stone
-# Filter accepted scores (using glob patterns)
-# accepted_scores:
-# Filter accepted objectives (using glob patterns)
-# accepted_objectives:
-# Filter accepted file entries (using glob patterns)
-accepted_entries:
- - datapacks/*
- - region/*.mca
- - icon.png
- - level.dat
diff --git a/.readthedocs.yml b/.readthedocs.yml
index f719370b83..690a6af865 100644
--- a/.readthedocs.yml
+++ b/.readthedocs.yml
@@ -4,10 +4,11 @@ build:
os: ubuntu-22.04
tools:
python: "3.12"
+ commands:
+ - python -m pip install pdm
+ - pdm install -G docs
+ - cat docs/conf.py
+ - pdm run docs build $READTHEDOCS_OUTPUT/html
sphinx:
- configuration: docs/conf.py
-
-python:
- install:
- - requirements: docs/requirements.txt
+ configuration: docs/conf.py
diff --git a/commands.json b/.spyglasscmds.json
similarity index 100%
rename from commands.json
rename to .spyglasscmds.json
diff --git a/.spyglassrc.json b/.spyglassrc.json
index 66bb3eead1..1d80619c44 100644
--- a/.spyglassrc.json
+++ b/.spyglassrc.json
@@ -3,16 +3,13 @@
"exclude": [
".github/",
".vscode/",
- "build/",
"docs/",
- "generated/",
- "region/",
"scripts/",
"@gitignore"
],
"mcmetaSummaryOverrides": {
"commands": {
- "path": "./commands.json",
+ "path": ".spyglasscmds.json",
"replace": false
}
}
diff --git a/README.md b/README.md
index 74e6be5977..4eaa7a6bbc 100644
--- a/README.md
+++ b/README.md
@@ -1,60 +1,97 @@
-
-
+
+
-
-
-
-
-
-# 🕵️♂️ What is Bookshelf?
+
+
+
+
+
+
-Bookshelf (formerly known as Gunivers Libs) is a user-friendly modular library datapack, crafted to assist mapmakers in effortlessly implementing intricate systems within their maps.
+
+
-Bookshelf is split into several modules. You can download a zip from the Github packages page with each module zipped with its dependencies to pick the module(s) you need.
-## 🛠️ Key features
+# 🕵️♂️ What is Bookshelf?
-📄 **Bookshelf Dev:** an optional datapack for development time that includes utilities such as logs and variable dump.
+Bookshelf (formerly known as Gunivers Libs) is a modular library datapack designed to simplify complex systems in Minecraft maps. Ideal for mapmakers looking for easy-to-implement tools.
-🧮 **Mathematical functions:** sin, cos, exp, log, sqrt...
+
-🖥️ **Bitwise functions:** and, or, xor, not, msb...
-🏷️ **ID system:** easily identify entities.
+# 🌟 Featured Modules
-🔗 **Link entities:** link positions and rotations between entities and create coherent structures!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-🏃 **Move and vectors:** give customized trajectories to entities, which can bounce on blocks and more...
+
-❤️ **Health management:** easily modify player health!
-🧱 **Block management:** get and manipulate blocks (supports BlockStates and NBT)!
+# 🔥 Motivation
-
-And much more...
+As developers, we understand the value of libraries: they save time, streamline workflows, and eliminate the need to reinvent the wheel. However, we’ve noticed that many mapmakers in the Minecraft community are less familiar with this concept.
-# 🔥 Motivation
+That’s why we started this project, to provide a variety of reusable tools and encourage mapmakers to embrace the use of libraries.
-As developers, we recognize the importance of using libraries to save time and avoid reinventing the wheel. Unfortunately, we've noticed that mapmakers within the Minecraft community are often unfamiliar with this concept.
+While we strive to keep our modules as optimized as possible, our top priority is accessibility. We focus on creating features that are easy to use and simple to install, ensuring they’re practical for everyone.
-That's why we started this project, to introduce a variety of reusable tools and try to convince mapmakers to embrace the use of libraries.
+> “I have seen further than others because I have stood on the shoulders of giants.”
+>
+> -- Isaac Newton
-While we strive to keep these modules as much optimized and accurate as possible, our main goal is to offer a wide range of features and provide tools that are both easy to use and install. Therefore, we will always prioritize accessibility above everything else.
# 🤝 Contribution
-[👉 Please refer to the contribution docs for more information](https://bookshelf.docs.gunivers.net/en/latest/contribute/index.html)
-
-Anyone can contribute to this repository. Please do so by posting issues when you've found something that is unexpected or sending a pull request for improvements. If you have any doubts related to the project or want to discuss something, then join our Discord server.
+If you have any doubts related to the project or want to discuss something, join [our Discord](https://discord.gg/MkXytNjmBt) server.
+If you want to contribute, please refer to the [contribution docs](https://docs.mcbookshelf.dev/en/latest/contribute/index.html) for more information.
diff --git a/core/cli/docs.py b/core/cli/docs.py
new file mode 100644
index 0000000000..bd3c1a0733
--- /dev/null
+++ b/core/cli/docs.py
@@ -0,0 +1,47 @@
+import shutil
+import subprocess
+
+import click
+
+from core.definitions import DOC_DIR
+
+
+@click.group()
+def docs() -> None:
+ """Documentation-related commands."""
+
+
+@docs.command()
+@click.argument("output", required=False)
+def build(output: str | None = None) -> None:
+ """Build static HTML documentation."""
+ sphinx = shutil.which("sphinx-build")
+ if not sphinx:
+ error_msg = "The 'sphinx-build' command was not found."
+ raise FileNotFoundError(error_msg)
+
+ subprocess.run(
+ [sphinx, ".", output if output else "_build"],
+ check=True,
+ cwd=DOC_DIR,
+ )
+
+
+@docs.command()
+@click.argument("output", required=False)
+def watch(output: str | None = None) -> None:
+ """Build and serve live documentation."""
+ try:
+ sphinx = shutil.which("sphinx-autobuild")
+ if not sphinx:
+ error_msg = "The 'sphinx-autobuild' command was not found."
+ raise FileNotFoundError(error_msg)
+
+ subprocess.run(
+ [sphinx, ".", output if output else "_build"],
+ check=True,
+ cwd=DOC_DIR,
+ )
+
+ except KeyboardInterrupt:
+ click.echo("\nExiting sphinx-autobuild…")
diff --git a/core/cli/meta.py b/core/cli/meta.py
new file mode 100644
index 0000000000..8cbf4dd9ee
--- /dev/null
+++ b/core/cli/meta.py
@@ -0,0 +1,115 @@
+import json
+import sys
+from pathlib import Path
+
+import click
+
+from core.common.logger import log_step
+from core.common.metadata import build_manifest, get_feature_meta, get_module_meta
+from core.definitions import (
+ DOC_SWITCHER,
+ GITHUB_REPO,
+ META_MANIFEST,
+ META_VERSIONS,
+ MINECRAFT_VERSIONS,
+ MODULES,
+ MODULES_DIR,
+ ROOT_DIR,
+ VERSION,
+)
+
+
+@click.group()
+def meta() -> None:
+ """Metadata-related commands."""
+
+
+@meta.command()
+def check() -> None:
+ """Check modules metadata files."""
+ success = check_modules()
+ success &= check_features()
+ sys.exit(not success)
+
+
+@meta.command()
+def update() -> None:
+ """Update metadata changes."""
+ if not update_manifest():
+ sys.exit(1)
+
+ update_switcher()
+ update_versions()
+
+
+def check_modules() -> bool:
+ """Check metadata for all module files."""
+ with log_step("⏳ Checking module metadata files…") as logger:
+ for module in MODULES:
+ get_module_meta(MODULES_DIR / module / "module.json", logger)
+
+ return not logger.errors
+
+
+def check_features() -> bool:
+ """Check metadata for all feature files."""
+ with log_step("⏳ Checking feature metadata files…") as logger:
+ for feature in MODULES_DIR.rglob("*/data/**/*.json"):
+ get_feature_meta(feature, logger)
+
+ return not logger.errors
+
+
+def update_manifest() -> bool:
+ """Generate and update the manifest file."""
+ with log_step("⚙️ Generating manifest file…") as logger:
+ if manifest := build_manifest(logger):
+ with Path(ROOT_DIR / META_MANIFEST).open("w", newline="\n") as file:
+ json.dump(manifest, file, indent=2)
+
+ return not logger.errors
+
+
+def update_switcher() -> None:
+ """Generate and update the switcher file."""
+ with log_step("⚙️ Generating switcher file…") as logger:
+ switcher_path = ROOT_DIR / DOC_SWITCHER
+ switcher: list[dict] = json.loads(switcher_path.read_text("utf-8"))
+
+ if any(entry["version"][1:] == VERSION for entry in switcher):
+ logger.debug("Version %s already exists. No update needed.", VERSION)
+ return
+
+ entry = {
+ "name": VERSION,
+ "version": f"v{VERSION}",
+ "url": f"https://docs.mcbookshelf.dev/en/v{VERSION}/",
+ }
+
+ for i in range(len(switcher)):
+ if switcher[i]["version"][1:].split(".")[:2] == VERSION.split(".")[:2]:
+ switcher[i] = entry
+ break
+ else:
+ switcher.insert(2, entry)
+
+ switcher_path.write_text(json.dumps(switcher, indent=2), "utf-8")
+
+
+def update_versions() -> None:
+ """Generate and update the versions file."""
+ with log_step("⚙️ Generating versions file…") as logger:
+ versions_path = ROOT_DIR / META_VERSIONS
+ versions: list[dict] = json.loads(versions_path.read_text("utf-8"))
+
+ if any(entry["version"] == VERSION for entry in versions):
+ logger.debug("Version %s already exists. No update needed.", VERSION)
+ return
+
+ versions.insert(0, {
+ "version": VERSION,
+ "minecraft_versions": MINECRAFT_VERSIONS,
+ "manifest": f"https://raw.githubusercontent.com/{GITHUB_REPO}/refs/tags/v{VERSION}/{META_MANIFEST}",
+ })
+
+ versions_path.write_text(json.dumps(versions, indent=2), "utf-8")
diff --git a/core/cli/modules.py b/core/cli/modules.py
new file mode 100644
index 0000000000..9b39d04d87
--- /dev/null
+++ b/core/cli/modules.py
@@ -0,0 +1,224 @@
+import sys
+import time
+from pathlib import Path
+from tempfile import TemporaryDirectory
+
+import click
+from beet import PackConfig, Project, ProjectConfig
+from beet.toolchain.cli import error_handler
+
+from core.cli.meta import check_features, check_modules
+from core.common.helpers import render_template
+from core.common.logger import log_step
+from core.common.packtest import Assets, Runner
+from core.definitions import (
+ BUILD_DIR,
+ MINECRAFT_VERSIONS,
+ MODULES,
+ MODULES_DIR,
+ ROOT_DIR,
+)
+
+
+@click.group()
+def modules() -> None:
+ """Modules-related commands."""
+
+
+@modules.command()
+@click.argument("modules", nargs=-1)
+def build(modules: tuple[str, ...]) -> None:
+ """Build the specified modules."""
+ with log_step("🔨 Building project…"):
+ create_project(create_config(
+ modules,
+ output=BUILD_DIR,
+ require=["core.plugins.setup_tests"],
+ )).build()
+
+
+@modules.command()
+def check() -> None:
+ """Check modules for conventions."""
+ success = check_headers()
+ success &= check_requirements()
+ success &= check_modules()
+ success &= check_features()
+ sys.exit(not success)
+
+
+@modules.command()
+@click.argument("world", required=False)
+@click.option(
+ "--minecraft",
+ metavar="DIRECTORY",
+ help="Path to the .minecraft directory.",
+)
+@click.option(
+ "--data-pack",
+ metavar="DIRECTORY",
+ help="Path to the data packs directory.",
+)
+@click.option(
+ "--resource-pack",
+ metavar="DIRECTORY",
+ help="Path to the resource packs directory.",
+)
+def link(
+ world: str | None,
+ minecraft: str | None,
+ data_pack: str | None,
+ resource_pack: str | None,
+) -> None:
+ """Link the generated resource pack and data pack to Minecraft."""
+ project = create_project(create_config())
+ with log_step("🔗 Linking project…"):
+ click.echo(project.link(
+ world,
+ minecraft,
+ data_pack,
+ resource_pack,
+ ))
+
+
+@modules.command()
+def release() -> None:
+ """Build zipped modules for a release."""
+ with log_step("🔨 Building project…") as logger:
+ pack_config = PackConfig(
+ compression="bzip2",
+ compression_level=9,
+ zipped=True,
+ )
+ create_project(create_config(
+ ("bookshelf", *MODULES),
+ data_pack=pack_config,
+ resource_pack=pack_config,
+ meta={"autosave":{"link":False}},
+ require=["core.plugins.release_pack"],
+ )).build()
+
+ sys.exit(logger.errors)
+
+
+@modules.command()
+@click.argument("modules", nargs=-1)
+def test(modules: tuple[str, ...]) -> None:
+ """Build and test the specified modules."""
+ with TemporaryDirectory(prefix="mcbs-") as tmpdir:
+ with log_step("🔨 Building project…"):
+ create_project(create_config(
+ modules,
+ output=Path(tmpdir) / "world/datapacks",
+ meta={"autosave":{"link":False}},
+ require=["core.plugins.setup_tests"],
+ )).build()
+
+ runner = Runner(Assets(MINECRAFT_VERSIONS[-1]))
+ code = runner.run(Path(tmpdir))
+
+ sys.exit(code)
+
+
+@modules.command()
+@click.argument("modules", nargs=-1)
+def watch(modules: tuple[str, ...]) -> None:
+ """Watch for changes in specified modules and rebuild them."""
+ with log_step("🔨 Watching project…") as logger:
+ config = create_config(
+ modules,
+ require=["beet.contrib.livereload","core.plugins.setup_tests"],
+ output=BUILD_DIR,
+ )
+ project = create_project(config.copy())
+
+ for changes in project.watch(0.5):
+ filename, action = next(iter(changes.items()))
+
+ logger.info("%s %s", click.style(
+ time.strftime("%H:%M:%S"),
+ fg="green",
+ bold=True,
+ ), (
+ f"{action.capitalize()}: {filename}"
+ if changes == {filename: action} else
+ f"{len(changes)} changes detected…"
+ ))
+
+ with error_handler(format_padding=1):
+ project.resolved_config = config.resolve(ROOT_DIR)
+ project.build()
+
+ logger.info("%s Finished build!", click.style(
+ time.strftime("%H:%M:%S"),
+ fg="green",
+ bold=True,
+ ))
+
+
+def create_config(
+ modules: tuple[str, ...] | None = None,
+ **kwargs: object,
+) -> ProjectConfig:
+ """Create a configuration for the project."""
+ modules = modules if modules else tuple(MODULES)
+ require = kwargs.get("require", [])
+
+ kwargs["extend"] = "module.json"
+ kwargs["broadcast"] = [f"modules/{mod}" for mod in modules]
+ kwargs["require"] = [
+ "core.plugins.log_build",
+ *(require if isinstance(require, list) else [require]),
+ ]
+
+ return ProjectConfig(**kwargs) # type: ignore[arg-type]
+
+
+def create_project(config: ProjectConfig) -> Project:
+ """Create a project based on the provided configuration."""
+ return Project(config.resolve(ROOT_DIR))
+
+
+def check_headers() -> bool:
+ """Check that all mcfunction files have the correct header."""
+ template = render_template(ROOT_DIR / "core/templates/header.jinja")
+
+ with log_step("⏳ Checking function file headers…") as logger:
+ for file_path in MODULES_DIR.rglob("*/data/**/*.mcfunction"):
+ lines = file_path.read_text("utf-8").splitlines()
+ header = "\n".join(lines[:len(template.splitlines())])
+
+ if header.strip() != template.strip():
+ relative_path = file_path.relative_to(ROOT_DIR)
+ logger.error(
+ "Found invalid header in file: %s",
+ relative_path,
+ extra={
+ "title": "Missing header",
+ "file": relative_path,
+ },
+ )
+
+ return not logger.errors
+
+
+def check_requirements() -> bool:
+ """Check that all modules have the required files."""
+ with log_step("⏳ Checking required module files…") as logger:
+ for module in MODULES:
+ for file in [
+ MODULES_DIR / module / "module.json",
+ MODULES_DIR / module / "README.md",
+ MODULES_DIR / module / "pack.png",
+ MODULES_DIR / module / f"data/{module}/function/__load__.mcfunction",
+ MODULES_DIR / module / f"data/{module}/function/__unload__.mcfunction",
+ ]:
+ if not file.exists():
+ logger.error(
+ "File '%s' is missing from module '%s'.",
+ file.name,
+ module,
+ extra={"title": "Missing required file", "file": file},
+ )
+
+ return not logger.errors
diff --git a/core/common/helpers.py b/core/common/helpers.py
new file mode 100644
index 0000000000..3d6580758d
--- /dev/null
+++ b/core/common/helpers.py
@@ -0,0 +1,146 @@
+import json
+import os
+from collections.abc import Callable, Iterable
+from datetime import datetime
+from functools import wraps
+from itertools import takewhile
+from pathlib import Path
+from typing import TypeVar
+
+from beet import Cache
+from jinja2 import Template
+from pydantic import BaseModel
+
+from core.definitions import MODULES_DIR
+
+T = TypeVar("T")
+
+Fn = Callable[..., dict | list]
+EFmt = Callable[[T], dict]
+CFmt = Callable[[list[T]], list]
+
+
+class SecureString(str):
+ """A string wrapper that prevents the accidental exposure of sensitive data."""
+
+ __slots__ = ()
+
+ def __new__(cls, value: str) -> "SecureString":
+ """Create a new SecureString instance."""
+ return super().__new__(cls, value)
+
+ def __repr__(self) -> str:
+ """Return the string representation, hiding the sensitive data."""
+ return ""
+
+
+def cache_result(cache: Cache, key: str) -> Callable[[Fn], Fn]:
+ """Cache the result of a function into a JSON file."""
+ def decorator(func: Fn) -> Fn:
+ @wraps(func)
+ def wrapper(*args: list, **kwargs: dict) -> dict | list:
+ cache_path = cache.get_path(key)
+ if cache_path.is_file():
+ return json.loads(cache_path.read_text("utf-8"))
+ result = func(*args, **kwargs)
+ with Path(cache_path).open("w") as file:
+ json.dump(result, file, indent=None)
+ return result
+ return wrapper
+ return decorator
+
+
+def download_and_parse_json(cache: Cache, url: str) -> dict|list:
+ """Get cached downloaded JSON data."""
+ file = cache.download(url)
+ return json.loads(file.read_text("utf-8"))
+
+
+def extract_feature_id(file: Path) -> str | None:
+ """Derive the feature ID from the file path."""
+ try:
+ meta = json.loads(file.read_text("utf-8")).get("__bookshelf__", {})
+ parts = file.relative_to(MODULES_DIR).parts
+
+ if not meta.get("feature"):
+ return None
+
+ is_tag = parts[3] == "tags"
+ feature_path = "/".join(parts[5 if is_tag else 4:]).replace(".json", "")
+ return f"{'#' if is_tag else ''}{parts[2]}:{feature_path}"
+
+ except (KeyError, IndexError, ValueError):
+ return None
+
+
+def gen_loot_table_tree(items: list[T], entry: EFmt, conditions: CFmt) -> dict:
+ """Generate a tree loot table for the given items."""
+ def subtree(items: list[T]) -> dict:
+ if len(items) == 1:
+ return entry(items[0])
+
+ mid = len(items) // 2
+ left, right = items[:mid], items[mid:]
+
+ left_tree = subtree(left)
+ right_tree = subtree(right)
+ left_tree["conditions"] = conditions(left)
+
+ return {"type":"alternatives","children":[left_tree, right_tree]}
+
+ return {"pools":[{"rolls":1,"entries":[subtree(items)]}]}
+
+
+def getenv_secure(key: str, default: str | None = None) -> SecureString | None:
+ """Get an environment variable by key and return it as a SecureString."""
+ if value := os.getenv(key):
+ return SecureString(value)
+ return SecureString(default) if default else None
+
+
+def matching_len(a: Iterable, b: Iterable) -> int:
+ """Return the length of the longest matching prefix between two sequences."""
+ return len(list(takewhile(
+ lambda x: x[0] == x[1],
+ zip(a, b, strict=False),
+ )))
+
+
+def parse_version(version_str: str) -> dict:
+ """Parse the version string into a dictionary with major, minor, and patch."""
+ major, minor, patch = map(int, version_str.split("."))
+ return {"major": major, "minor": minor, "patch": patch}
+
+
+def render_snbt(obj: object) -> str:
+ """Render a Python object to SNBT."""
+ def quote_key(k: str) -> str:
+ return f'"{k}"' if ":" in k else k
+ if isinstance(obj, BaseModel):
+ return render_snbt(obj.model_dump())
+ if isinstance(obj, dict):
+ items = ",".join(
+ f"{quote_key(str(k))}:{render_snbt(v)}"
+ for k, v in obj.items()
+ if v is not None
+ )
+ return f"{{{items}}}"
+ if isinstance(obj, list):
+ values = ",".join([render_snbt(v) for v in obj])
+ return f"[{values}]"
+ if isinstance(obj, str):
+ return f'"{obj}"'
+ if isinstance(obj, bool):
+ return "1b" if obj else "0b"
+ return str(obj)
+
+
+def render_template(file: Path, **kwargs: dict[str, object]) -> str:
+ """Load and render a Jinja2 template from a file."""
+ template = Template(file.read_text(encoding="utf-8"))
+ return template.render(now=datetime.now, **kwargs)
+
+
+def with_prefix(value: str, prefix: str = "minecraft:") -> str:
+ """Ensure a string starts with the specified prefix."""
+ return value if value.startswith(prefix) else f"{prefix}{value}"
diff --git a/core/common/logger.py b/core/common/logger.py
new file mode 100644
index 0000000000..4b2eaa4584
--- /dev/null
+++ b/core/common/logger.py
@@ -0,0 +1,191 @@
+import logging
+import os
+from collections.abc import Generator
+from contextlib import contextmanager
+from types import MappingProxyType
+from typing import ClassVar
+
+from colorama import Fore, Style
+
+
+class CustomLogRecord(logging.LogRecord):
+ """Custom log record."""
+
+ title: str = ""
+ file: str = ""
+ line: int = 0
+ depth: int = 0
+ step: bool = False
+ end_step: bool = False
+
+
+class BaseFormatter(logging.Formatter):
+ """Base class for shared formatting logic."""
+
+ COLORS = MappingProxyType({
+ logging.DEBUG: Fore.LIGHTBLACK_EX,
+ logging.INFO: Fore.WHITE,
+ logging.WARNING: Fore.YELLOW,
+ logging.ERROR: Fore.RED,
+ logging.CRITICAL: Fore.LIGHTRED_EX,
+ })
+
+ def adjust_depth(self, record: CustomLogRecord) -> int:
+ """Adjust the depth for hierarchical indentation."""
+ return record.depth - int(record.step) - int(record.end_step)
+
+ def get_prefix(self, record: CustomLogRecord) -> str:
+ """Get the prefix for the log message."""
+ color = self.COLORS.get(record.levelno, "")
+ return color + (f"{record.title}: " if record.title else "")
+
+ def ensure_custom_record(self, record: logging.LogRecord) -> CustomLogRecord:
+ """Ensure the record is a CustomLogRecord."""
+ if isinstance(record, CustomLogRecord):
+ return record
+
+ return CustomLogRecord(
+ record.name,
+ record.levelno,
+ record.pathname,
+ record.lineno,
+ record.msg,
+ record.args,
+ record.exc_info,
+ record.funcName,
+ record.stack_info,
+ )
+
+
+class ConsoleFormatter(BaseFormatter):
+ """Formatter for console logs with color and indentation support."""
+
+ def format(self, record: logging.LogRecord) -> str:
+ """Format the log record for console output."""
+ message = super().format(record)
+ record = self.ensure_custom_record(record)
+ indent = " " * self.adjust_depth(record)
+ return f"{indent}{self.get_prefix(record)}{message}{Style.RESET_ALL}"
+
+
+class GithubFormatter(BaseFormatter):
+ """Formatter for GitHub Actions logs with annotation support."""
+
+ ANNOTATIONS = MappingProxyType({
+ logging.WARNING: "warning",
+ logging.ERROR: "error",
+ logging.CRITICAL: "error",
+ })
+
+ def format(self, record: logging.LogRecord) -> str:
+ """Format the log record for GitHub Actions output."""
+ message = super().format(record)
+ record = self.ensure_custom_record(record)
+ if record.step:
+ return f"::group::{message}"
+ if record.end_step:
+ return f"{message}\n::endgroup::"
+
+ if annotation := self.ANNOTATIONS.get(record.levelno):
+ return f"::{annotation} {",".join(filter(None, [
+ f"title={record.title}" if record.title else "",
+ f"file={record.file}" if record.file else "",
+ f"line={record.line}" if record.line else "",
+ ]))}::{message}"
+
+ return f"{self.get_prefix(record)}{message}{Style.RESET_ALL}"
+
+
+# mypy: ignore-errors
+class StepLogger(logging.LoggerAdapter):
+ """Tracks warnings and errors during a logging step."""
+
+ contexts: ClassVar[list["StepLogger"]] = []
+
+ def __init__(
+ self,
+ logger: logging.Logger,
+ ) -> None:
+ """Initialize a new StepLogger."""
+ self.errors = 0
+ self.warnings = 0
+ StepLogger.contexts.append(self)
+ super().__init__(logger, {"depth": len(StepLogger.contexts)})
+
+ def log(
+ self,
+ level: int,
+ msg: object,
+ *args: object,
+ **kwargs: object,
+ ) -> None:
+ """Log a message and track warning/error counts."""
+ if level >= logging.ERROR:
+ self.errors += 1
+ elif level >= logging.WARNING:
+ self.warnings += 1
+ super().log(level, msg, *args, **kwargs)
+
+ def process(
+ self,
+ msg: object,
+ kwargs: dict[str, object],
+ ) -> tuple[object, dict[str, object]]:
+ """Merge the log message with extra context."""
+ extra = self.extra.copy()
+ extra.update(kwargs.get("extra", {}))
+ kwargs["extra"] = extra
+ return msg, kwargs
+
+ def close(self) -> None:
+ """Close the context and log a summary message if there are no more parent."""
+ StepLogger.contexts.pop()
+
+ if StepLogger.contexts:
+ StepLogger.contexts[-1].errors += self.errors
+ StepLogger.contexts[-1].warnings += self.warnings
+ return
+
+ kwargs = {"extra": {"end_step": True}}
+ match self.errors, self.warnings:
+ case 0, 0:
+ self.info("✅ Done!", **kwargs)
+ case 0, w:
+ self.info(f"🔔 Done with {w} warning(s).", **kwargs)
+ case e, 0:
+ self.info(f"🚨 Done with {e} error(s).", **kwargs)
+ case e, w:
+ self.info(f"🚨 Done with {e} error(s) and {w} warning(s).", **kwargs)
+
+
+@contextmanager
+def log_step(message: str | None = None) -> Generator[StepLogger, None, None]:
+ """Create a new logging context with optional step message."""
+ logger = logging.getLogger("bookshelf")
+ step = StepLogger(logger)
+ if message:
+ step.info(message, extra={"step": True})
+ try:
+ yield step
+ finally:
+ step.close()
+
+
+def get_step_logger() -> StepLogger:
+ """Get the current StepLogger or create a new one."""
+ return StepLogger.contexts[-1] if len(StepLogger.contexts) else StepLogger(logger)
+
+
+# Set up custom log record factory
+logging.setLogRecordFactory(lambda *args, **kwargs: CustomLogRecord(*args, **kwargs))
+
+# Configure logger
+logger = logging.getLogger("bookshelf")
+handler = logging.StreamHandler()
+handler.setFormatter(
+ GithubFormatter()
+ if os.getenv("GITHUB_WORKSPACE") else
+ ConsoleFormatter(),
+)
+logger.addHandler(handler)
+logger.setLevel(logging.DEBUG)
diff --git a/core/common/metadata.py b/core/common/metadata.py
new file mode 100644
index 0000000000..c232cc461a
--- /dev/null
+++ b/core/common/metadata.py
@@ -0,0 +1,150 @@
+import json
+import re
+from bisect import insort
+from pathlib import Path
+from typing import Literal
+
+from pydantic import BaseModel, Field, ValidationError
+
+from core.common.helpers import extract_feature_id
+from core.common.logger import StepLogger
+from core.definitions import DOC_URL, MASTER_URL, MODULES, MODULES_DIR, ROOT_DIR
+
+
+class Updated(BaseModel):
+ """Represents metadata about when a feature or module was last updated."""
+
+ date: str = Field(pattern=r"^\d{4}/(0[1-9]|1[0-2])/(0[1-9]|[1-2]\d|3[0-1])$")
+ minecraft_version: str
+
+class FeatureMeta(BaseModel):
+ """Represents metadata for a feature within the library."""
+
+ id: str
+ documentation: str = Field(pattern=rf"^{re.escape(DOC_URL)}/en/latest/modules/.+$")
+ authors: list[str]
+ contributors: list[str] = []
+ created: Updated
+ updated: Updated
+
+class ModuleMeta(BaseModel):
+ """Represents metadata for a module within the library."""
+
+ id: str = Field(pattern=r"^bs\..+$")
+ name: str
+ slug: str
+ icon: str | None = None
+ banner: str | None = None
+ readme: str | None = None
+ description: str
+ documentation: str = Field(pattern=rf"^{re.escape(DOC_URL)}/en/latest/modules/.+$")
+
+ kind: Literal["data_pack", "resource_pack"]
+ tags: list[str] = []
+ authors: list[str] = []
+ contributors: list[str] = []
+ dependencies: list[str] = []
+ weak_dependencies: list[str] = []
+
+
+def get_feature_meta(file: Path, logger: StepLogger) -> FeatureMeta | None:
+ """Retrieve feature metadata from a JSON file."""
+ relative_path = file.relative_to(ROOT_DIR)
+ feature_id = extract_feature_id(file)
+ if not feature_id:
+ return None
+
+ try:
+ meta = json.loads(file.read_text("utf-8")).get("__bookshelf__", {})
+ return FeatureMeta(id=feature_id, **meta)
+
+ except ValidationError:
+ logger.exception("Found errors in feature '%s'.", feature_id, extra={
+ "title": "Validation Error",
+ "file": relative_path,
+ })
+
+ except json.JSONDecodeError as e:
+ logger.exception("File '%s' has invalid JSON.", relative_path, extra={
+ "title": "Malformed Json",
+ "file": relative_path,
+ "line": e.lineno,
+ })
+
+ return None
+
+
+def get_module_meta(file: Path, logger: StepLogger) -> ModuleMeta | None:
+ """Retrieve module metadata from a JSON file."""
+ relative_path = file.relative_to(ROOT_DIR)
+ module_id = file.parent.name
+
+ try:
+ data = json.loads(file.read_text("utf-8"))
+ meta = data.get("meta", {})
+
+ if "data_pack" in data and "resource_pack" in data:
+ error_msg = "A module cannot have both 'data_pack' and 'resource_pack'."
+ raise ValueError(error_msg)
+ if "data_pack" in data:
+ meta["kind"] = "data_pack"
+ if "resource_pack" in data:
+ meta["kind"] = "resource_pack"
+
+ for key in ["tags"]:
+ if key not in meta:
+ logger.warning(
+ "Metadata file for module '%s' is missing optional key '%s'. "
+ "You should consider adding it.",
+ module_id,
+ key,
+ )
+
+ for key, value in [
+ ("icon", "pack.png"),
+ ("readme", "README.md"),
+ ("banner", "banner.png"),
+ ]:
+ if (file.parent / value).exists():
+ meta[key] = MASTER_URL.format(
+ (relative_path.parent / value).as_posix(),
+ )
+
+ return ModuleMeta(id=module_id, **meta)
+
+ except ValidationError:
+ logger.exception("Found errors in module '%s'.", module_id, extra={
+ "title": "Validation Error",
+ "file": relative_path,
+ })
+
+ except json.JSONDecodeError as e:
+ logger.exception("File '%s' has invalid JSON.", relative_path, extra={
+ "title": "Malformed Json",
+ "file": relative_path,
+ "line": e.lineno,
+ })
+
+ return None
+
+
+def build_manifest(logger: StepLogger) -> dict | None:
+ """Build the manifest by gathering metadata for all modules and their features."""
+ manifest: dict[str, list[dict]] = {"modules":[]}
+ for module in MODULES:
+ if module_meta := get_module_meta(MODULES_DIR / module / "module.json", logger):
+ module_dict = module_meta.model_dump(
+ exclude_defaults=True,
+ exclude_none=True,
+ )
+ module_dict["features"] = []
+ for file_path in (MODULES_DIR / module / "data") .rglob("*.json"):
+ if feature_meta := get_feature_meta(file_path, logger):
+ feature_dict = feature_meta.model_dump(
+ exclude_defaults=True,
+ exclude_none=True,
+ )
+ insort(module_dict["features"], feature_dict, key=lambda x: x["id"])
+ insort(manifest["modules"], module_dict, key=lambda x: x["id"])
+
+ return manifest if not logger.errors else None
diff --git a/core/common/packtest.py b/core/common/packtest.py
new file mode 100644
index 0000000000..7fa57c870a
--- /dev/null
+++ b/core/common/packtest.py
@@ -0,0 +1,160 @@
+import re
+import shutil
+import subprocess
+from dataclasses import dataclass
+from pathlib import Path
+from types import MappingProxyType
+
+import requests
+
+from core.common.logger import StepLogger, log_step
+
+
+class Assets:
+ """Utility for managing assets required to run Minecraft Unit Tests."""
+
+ def __init__(self, mc_version: str) -> None:
+ """Initialize the Assets utility."""
+ self.mc_version = mc_version
+ self.fabric_server_url = self._get_fabric_url(mc_version)
+ self.fabric_api_url = self._get_modrinth_url("fabric-api", mc_version)
+ self.packtest_url = self._get_modrinth_url("packtest", mc_version)
+
+ def download(self, out: Path) -> None:
+ """Download required assets to the specified output directory."""
+ with log_step("🚀 Downloading assets…") as logger:
+ for url, file_path in [
+ (self.fabric_server_url, out / "server.jar"),
+ (self.fabric_api_url, out / "mods/fabric-api.jar"),
+ (self.packtest_url, out / "mods/packtest.jar"),
+ ]:
+ self._download_asset(url, file_path, logger)
+
+ def _download_asset(self, url: str, file_path: Path, logger: StepLogger) -> None:
+ """Download an asset from a URL to the specified file path."""
+ if not file_path.exists():
+ logger.debug("Fetching %s", url)
+ try:
+ response = requests.get(url, timeout=5)
+ response.raise_for_status()
+ file_path.parent.mkdir(parents=True, exist_ok=True)
+ file_path.write_bytes(response.content)
+ except requests.RequestException:
+ logger.exception("Error downloading %s", url)
+ raise
+
+ def _get_fabric_url(self, mc_version: str) -> str:
+ """Get the URL for downloading the Fabric server."""
+ response = requests.get(
+ f"https://meta.fabricmc.net/v2/versions/loader/{mc_version}",
+ timeout=5,
+ )
+ response.raise_for_status()
+ versions = response.json()
+ return f"https://meta.fabricmc.net/v2/versions/loader/{mc_version}/{versions[0]["loader"]["version"]}/1.0.1/server/jar"
+
+ def _get_modrinth_url(self, project_id: str, mc_version: str) -> str:
+ """Get the URL for downloading a Modrinth project."""
+ response = requests.get(
+ f"https://api.modrinth.com/v2/project/{project_id}/version",
+ timeout=5,
+ )
+ response.raise_for_status()
+ versions = response.json()
+ if versions := [
+ version
+ for version in versions
+ if any(v.startswith(mc_version) for v in version["game_versions"])
+ ]:
+ return versions[0]["files"][0]["url"]
+
+ error_msg = (
+ f"Could not find a version for {project_id} "
+ "that matches the MC version: {mc_version}"
+ )
+ raise RuntimeError(error_msg)
+
+
+@dataclass
+class Runner:
+ """Utility for setting up and running Minecraft Unit Tests."""
+
+ assets: Assets
+
+ PATTERNS = MappingProxyType({
+ "any_error": re.compile(r"::error title=(?P.*?)::(?P.*)"),
+ "test_error": re.compile(
+ r"::error title=Test (?P.*?) "
+ r"failed on line (?P\d+)!::(?P.*)",
+ ),
+ "test_batch": re.compile(
+ r"Running test batch '(?P.*?):0' "
+ r"\((?P\d+) tests\)",
+ ),
+ })
+
+ def run(self, rundir: Path) -> int:
+ """Run Packtest in the specified directory."""
+ self.assets.download(rundir)
+ with log_step("🧪 Running test server…") as logger:
+ java = shutil.which("java")
+ if not java:
+ error_msg = "The 'java' command was not found."
+ raise FileNotFoundError(error_msg)
+
+ cmd = [
+ java,
+ "-Xmx2G",
+ "-Dpacktest.auto",
+ "-Dpacktest.auto.annotations",
+ "-jar",
+ "server.jar",
+ "nogui",
+ ]
+ process = subprocess.Popen(
+ cmd,
+ cwd=rundir,
+ encoding="utf-8",
+ errors="replace",
+ text=True,
+ stdout=subprocess.PIPE,
+ universal_newlines=True,
+ )
+ self._monitor_process(process, logger)
+ return process.wait()
+
+ def _handle_any_error(self, match: re.Match, logger: StepLogger) -> None:
+ """Handle generic errors detected in the process output."""
+ logger.error(match["message"], extra={"title": match["title"]})
+
+ def _handle_test_batch(self, match: re.Match, logger: StepLogger) -> None:
+ """Handle test batch start logs."""
+ logger.debug(
+ "Test '%s' module (%s tests)",
+ match["name"],
+ int(match["count"]) - 1,
+ )
+
+ def _handle_test_error(self, match: re.Match, logger: StepLogger) -> None:
+ """Handle individual test error logs."""
+ name = match["name"]
+ i = name.rfind(".", 0, name.find("/"))
+ logger.error(match["message"], extra={
+ "title": f"Test '{name}' failed",
+ "file": f"modules/{name[:i]}/data/{name[:i]}/test/{name[i+1:]}.mcfunction",
+ "line": int(match["line"]) - 1,
+ })
+
+ def _monitor_process(self, process: subprocess.Popen, logger: StepLogger) -> None:
+ """Monitor and process the output of the test server."""
+ if not process.stdout:
+ return
+ for line in iter(process.stdout.readline, ""):
+ for pattern, callback in (
+ (self.PATTERNS["test_error"], self._handle_test_error),
+ (self.PATTERNS["test_batch"], self._handle_test_batch),
+ (self.PATTERNS["any_error"], self._handle_any_error),
+ ):
+ if match := pattern.search(line):
+ callback(match, logger)
+ break
diff --git a/core/definitions.py b/core/definitions.py
new file mode 100644
index 0000000000..940499b622
--- /dev/null
+++ b/core/definitions.py
@@ -0,0 +1,122 @@
+import os
+import sys
+from pathlib import Path
+
+VERSION = "2.2.2"
+MINECRAFT_VERSIONS = ["1.21.2", "1.21.3", "1.21.4"]
+
+DOC_URL = "https://docs.mcbookshelf.dev"
+DOC_SWITCHER = "docs/_static/switcher.json"
+GITHUB_REPO = "mcbookshelf/Bookshelf"
+META_MANIFEST = "meta/manifest.json"
+META_VERSIONS = "meta/versions.json"
+MODRINTH_API = "https://api.modrinth.com/v3"
+SMITHED_API = "https://api.smithed.dev/v2"
+
+ROOT_DIR = Path(__file__).resolve().parents[1]
+BUILD_DIR = ROOT_DIR / "build"
+DOC_DIR = ROOT_DIR / "docs"
+MODULES_DIR = ROOT_DIR / "modules"
+RELEASE_DIR = ROOT_DIR / "release"
+
+MODULES = sorted([
+ mod
+ for mod in os.listdir(MODULES_DIR)
+ if (MODULES_DIR / mod).is_dir() and mod.startswith("bs.")
+])
+
+MASTER_URL = f"https://raw.githubusercontent.com/{GITHUB_REPO}/refs/heads/master/{{}}"
+BIOMES_URL = "https://raw.githubusercontent.com/misode/mcmeta/{}-summary/data/worldgen/biome/data.min.json"
+BLOCKS_URL = "https://raw.githubusercontent.com/misode/mcmeta/{}-summary/blocks/data.min.json"
+ITEMS_URL = "https://raw.githubusercontent.com/misode/mcmeta/{}-registries/item/data.min.json"
+SHAPES_URL = "https://raw.githubusercontent.com/mcbookshelf/Bookshelf-McData/refs/tags/{}/blocks/shapes.min.json"
+VERSION_URL = "https://raw.githubusercontent.com/misode/mcmeta/refs/tags/{}-summary/version.json"
+
+SPECIAL_ITEMS = {
+ "minecraft:acacia_wall_hanging_sign": "minecraft:acacia_hanging_sign",
+ "minecraft:acacia_wall_sign": "minecraft:acacia_sign",
+ "minecraft:attached_melon_stem": "minecraft:melon_seeds",
+ "minecraft:attached_pumpkin_stem": "minecraft:melon_seeds",
+ "minecraft:bamboo_wall_hanging_sign": "minecraft:bamboo_hanging_sign",
+ "minecraft:bamboo_wall_sign": "minecraft:bamboo_sign",
+ "minecraft:beetroots": "minecraft:beetroot_seeds",
+ "minecraft:big_dripleaf_stem": "minecraft:big_dripleaf",
+ "minecraft:birch_wall_hanging_sign": "minecraft:birch_hanging_sign",
+ "minecraft:birch_wall_sign": "minecraft:birch_sign",
+ "minecraft:black_wall_banner": "minecraft:black_banner",
+ "minecraft:blue_wall_banner": "minecraft:blue_banner",
+ "minecraft:brain_coral_wall_fan": "minecraft:brain_coral_fan",
+ "minecraft:brown_wall_banner": "minecraft:brown_banner",
+ "minecraft:bubble_coral_wall_fan": "minecraft:bubble_coral_fan",
+ "minecraft:carrots": "minecraft:carrot",
+ "minecraft:cave_vines_plant": "minecraft:glow_berries",
+ "minecraft:cave_vines": "minecraft:glow_berries",
+ "minecraft:cherry_wall_hanging_sign": "minecraft:cherry_hanging_sign",
+ "minecraft:cherry_wall_sign": "minecraft:cherry_sign",
+ "minecraft:cocoa": "minecraft:cocoa_beans",
+ "minecraft:creeper_wall_head": "minecraft:creeper_head",
+ "minecraft:crimson_wall_hanging_sign": "minecraft:crimson_hanging_sign",
+ "minecraft:crimson_wall_sign": "minecraft:crimson_sign",
+ "minecraft:cyan_wall_banner": "minecraft:cyan_banner",
+ "minecraft:dark_oak_wall_hanging_sign": "minecraft:dark_oak_hanging_sign",
+ "minecraft:dark_oak_wall_sign": "minecraft:dark_oak_sign",
+ "minecraft:dead_brain_coral_wall_fan": "minecraft:dead_brain_coral_fan",
+ "minecraft:dead_bubble_coral_wall_fan": "minecraft:dead_bubble_coral_fan",
+ "minecraft:dead_fire_coral_wall_fan": "minecraft:dead_fire_coral_fan",
+ "minecraft:dead_horn_coral_wall_fan": "minecraft:dead_horn_coral_fan",
+ "minecraft:dead_tube_coral_wall_fan": "minecraft:dead_tube_coral_fan",
+ "minecraft:dragon_wall_head": "minecraft:dragon_head",
+ "minecraft:fire_coral_wall_fan": "minecraft:fire_coral_fan",
+ "minecraft:gray_wall_banner": "minecraft:gray_banner",
+ "minecraft:green_wall_banner": "minecraft:green_banner",
+ "minecraft:horn_coral_wall_fan": "minecraft:horn_coral_fan",
+ "minecraft:jungle_wall_hanging_sign": "minecraft:jungle_hanging_sign",
+ "minecraft:jungle_wall_sign": "minecraft:jungle_sign",
+ "minecraft:lava_cauldron": "minecraft:cauldron",
+ "minecraft:lava": "minecraft:lava_bucket",
+ "minecraft:light_blue_wall_banner": "minecraft:light_blue_banner",
+ "minecraft:light_gray_wall_banner": "minecraft:light_gray_banner",
+ "minecraft:lime_wall_banner": "minecraft:lime_banner",
+ "minecraft:magenta_wall_banner": "minecraft:magenta_banner",
+ "minecraft:mangrove_wall_hanging_sign": "minecraft:mangrove_hanging_sign",
+ "minecraft:mangrove_wall_sign": "minecraft:mangrove_sign",
+ "minecraft:melon_stem": "minecraft:pumpkin_seeds",
+ "minecraft:oak_wall_hanging_sign": "minecraft:oak_hanging_sign",
+ "minecraft:oak_wall_sign": "minecraft:oak_sign",
+ "minecraft:orange_wall_banner": "minecraft:orange_banner",
+ "minecraft:piglin_wall_head": "minecraft:piglin_head",
+ "minecraft:pink_wall_banner": "minecraft:pink_banner",
+ "minecraft:pitcher_crop": "minecraft:pitcher_pod",
+ "minecraft:player_wall_head": "minecraft:player_head",
+ "minecraft:potatoes": "minecraft:potato",
+ "minecraft:powder_snow_cauldron": "minecraft:cauldron",
+ "minecraft:powder_snow": "minecraft:powder_snow_bucket",
+ "minecraft:pumpkin_stem": "minecraft:pumpkin_seeds",
+ "minecraft:purple_wall_banner": "minecraft:purple_banner",
+ "minecraft:red_wall_banner": "minecraft:red_banner",
+ "minecraft:redstone_wall_torch": "minecraft:redstone_torch",
+ "minecraft:redstone_wire": "minecraft:redstone",
+ "minecraft:skeleton_wall_skull": "minecraft:skeleton_skull",
+ "minecraft:soul_wall_torch": "minecraft:soul_torch",
+ "minecraft:spruce_wall_hanging_sign": "minecraft:spruce_hanging_sign",
+ "minecraft:spruce_wall_sign": "minecraft:spruce_sign",
+ "minecraft:sweet_berry_bush": "minecraft:sweet_berries",
+ "minecraft:torchflower_crop": "minecraft:torchflower_seeds",
+ "minecraft:tripwire": "minecraft:string",
+ "minecraft:tube_coral_wall_fan": "minecraft:tube_coral_fan",
+ "minecraft:wall_torch": "minecraft:torch",
+ "minecraft:warped_wall_hanging_sign": "minecraft:warped_hanging_sign",
+ "minecraft:warped_wall_sign": "minecraft:warped_sign",
+ "minecraft:water_cauldron": "minecraft:cauldron",
+ "minecraft:water": "minecraft:water_bucket",
+ "minecraft:wheat": "minecraft:wheat_seeds",
+ "minecraft:white_wall_banner": "minecraft:white_banner",
+ "minecraft:wither_skeleton_wall_skull": "minecraft:wither_skeleton_skull",
+ "minecraft:yellow_wall_banner": "minecraft:yellow_banner",
+ "minecraft:zombie_wall_head": "minecraft:zombie_head",
+}
+
+if __name__ == "__main__":
+ if len(sys.argv) > 1:
+ value = globals().get(sys.argv[1], None)
+ print(str(value)) # noqa: T201
diff --git a/core/plugins/auto_import.py b/core/plugins/auto_import.py
new file mode 100644
index 0000000000..13c06b44bb
--- /dev/null
+++ b/core/plugins/auto_import.py
@@ -0,0 +1,11 @@
+from collections.abc import Generator
+
+from beet import Context
+
+
+def beet_default(ctx: Context) -> Generator:
+ """Add commands to import functions from the import folder."""
+ yield
+ if imports := ctx.data.functions.match(f"{ctx.data.name}:import/*"):
+ load = ctx.data.functions[f"{ctx.data.name}:__load__"]
+ load.append(("", *(f"function {name}" for name in imports)))
diff --git a/core/plugins/bundle_packs.py b/core/plugins/bundle_packs.py
new file mode 100644
index 0000000000..3b393407a2
--- /dev/null
+++ b/core/plugins/bundle_packs.py
@@ -0,0 +1,20 @@
+import json
+from collections.abc import Callable
+from functools import cache
+
+from beet import Context, subproject
+
+from core.definitions import MODULES, MODULES_DIR
+
+__path__ = ""
+
+@cache
+def __getattr__(tag: str) -> Callable[[Context], None]:
+ def plugin(ctx: Context) -> None:
+ """Include modules that have the given tag."""
+ for mod in MODULES or []:
+ meta = json.loads((MODULES_DIR / mod / "module.json").read_text("utf-8"))
+ if tag in meta.get("meta", {}).get("tags", []):
+ config = {"directory": f"../{mod}", "extend": "module.json"}
+ ctx.require(subproject(config))
+ return plugin
diff --git a/core/plugins/dependencies.py b/core/plugins/dependencies.py
new file mode 100644
index 0000000000..ef027029f6
--- /dev/null
+++ b/core/plugins/dependencies.py
@@ -0,0 +1,8 @@
+from beet import Context, subproject
+
+
+def beet_default(ctx: Context) -> None:
+ """Include dependencies in the current module."""
+ for dep in ctx.meta.get("dependencies", []) or []:
+ config = {"directory": f"../{dep}", "extend": "module.json"}
+ ctx.require(subproject(config))
diff --git a/core/plugins/gen_help.py b/core/plugins/gen_help.py
new file mode 100644
index 0000000000..f3f45aef9e
--- /dev/null
+++ b/core/plugins/gen_help.py
@@ -0,0 +1,12 @@
+from beet import Context, Function, FunctionTag
+
+
+def beet_default(ctx: Context) -> None:
+ """Generate a help function for the current module."""
+ with ctx.override(generate_namespace=ctx.directory.name):
+ function = ctx.generate("__help__",
+ documentation=ctx.meta.get("documentation"),
+ module_name=ctx.meta.get("name"),
+ render=Function(source_path="core/help.jinja"),
+ )
+ ctx.generate("help", FunctionTag({"values":[function]}))
diff --git a/core/plugins/gen_load.py b/core/plugins/gen_load.py
new file mode 100644
index 0000000000..0d34008673
--- /dev/null
+++ b/core/plugins/gen_load.py
@@ -0,0 +1,83 @@
+from beet import Context, Function, FunctionTag
+
+from core.common.helpers import parse_version
+from core.definitions import MODULES, VERSION
+
+
+def beet_default(ctx: Context) -> None:
+ """Generate load related functions for the current module."""
+ version = parse_version(VERSION)
+
+ ctx.require("beet.contrib.lantern_load.base_data_pack")
+ ctx.data["load:load"] = FunctionTag({"values": ["#bs.load:load"]})
+
+ for file, template in [
+ ("exclusive", "exclusive"),
+ ("validate", "validate"),
+ (f"resolve/{ctx.directory.name}", "steps/resolve"),
+ (f"v{VERSION}/bundle/append", "bundle/append"),
+ (f"v{VERSION}/bundle/concat", "bundle/concat"),
+ (f"v{VERSION}/cleanup", "steps/cleanup"),
+ (f"v{VERSION}/errors/{ctx.directory.name}", "errors"),
+ (f"v{VERSION}/enumerate/{ctx.directory.name}", "steps/enumerate"),
+ ]:
+ ctx.generate(
+ f"bs.load:{file}",
+ **version,
+ module=ctx.directory.name,
+ modules=MODULES,
+ render=Function(source_path=f"core/load/{template}.jinja"),
+ )
+
+ ctx.data["bs.load:load"] = gen_load_tag(MODULES)
+ ctx.data["bs.load:unload"] = gen_unload_tag(MODULES)
+ ctx.data[f"bs.load:module/{ctx.data.name}"] = gen_module_load_tag(
+ ctx.directory.name,
+ ctx.meta.get("dependencies", []) or [],
+ ctx.meta.get("weak_dependencies", []) or [],
+ )
+
+
+def gen_module_load_tag(
+ module: str,
+ dependencies: list[str],
+ weak_dependencies: list[str],
+) -> FunctionTag:
+ """Generate a tag to load a module and its dependencies."""
+ return FunctionTag({
+ "replace": True,
+ "values": [
+ f"#bs.load:module/{dep}"
+ for dep in dependencies
+ ] + [
+ {"id": f"#bs.load:module/{dep}", "required": False}
+ for dep in weak_dependencies
+ ] + [
+ f"{module}:__load__",
+ ],
+ })
+
+
+def gen_unload_tag(modules: list[str]) -> FunctionTag:
+ """Generate a tag to unload all modules."""
+ return FunctionTag({
+ "values": [
+ {"id": f"{mod}:__unload__", "required": False}
+ for mod in modules
+ ],
+ })
+
+
+def gen_load_tag(modules: list[str]) -> FunctionTag:
+ """Generate a tag to load all modules."""
+ return FunctionTag({
+ "values": [
+ "#bs.load:steps/cleanup",
+ "#bs.load:steps/enumerate",
+ "#bs.load:steps/resolve",
+ "bs.load:validate",
+ ] + [
+ {"id": f"#bs.load:module/{mod}", "required": False}
+ for mod in modules
+ ],
+ })
diff --git a/core/plugins/log_build.py b/core/plugins/log_build.py
new file mode 100644
index 0000000000..454ece4e2f
--- /dev/null
+++ b/core/plugins/log_build.py
@@ -0,0 +1,8 @@
+from beet import Context
+
+from core.common.logger import get_step_logger
+
+
+def beet_default(ctx: Context) -> None:
+ """Log the module build process with a debug message."""
+ get_step_logger().debug("Build module '%s'", ctx.directory.name)
diff --git a/core/plugins/release_pack.py b/core/plugins/release_pack.py
new file mode 100644
index 0000000000..e8e5a85b72
--- /dev/null
+++ b/core/plugins/release_pack.py
@@ -0,0 +1,292 @@
+import json
+import re
+from collections.abc import Generator
+from pathlib import Path
+
+import requests
+from beet import Context, PluginOptions, configurable
+
+from core.common.helpers import getenv_secure
+from core.common.logger import get_step_logger
+from core.definitions import (
+ DOC_DIR,
+ GITHUB_REPO,
+ MASTER_URL,
+ MINECRAFT_VERSIONS,
+ MODRINTH_API,
+ RELEASE_DIR,
+ ROOT_DIR,
+ SMITHED_API,
+ VERSION,
+)
+
+MODRINTH_TOKEN = getenv_secure("MODRINTH_TOKEN")
+SMITHED_TOKEN = getenv_secure("SMITHED_TOKEN")
+
+
+class PublishOptions(PluginOptions):
+ """Options required to publish on platforms."""
+
+ file: Path
+ changelog: str
+ module_name: str
+ module_slug: str
+ module_description: str
+ module_documentation: str
+ module_icon: Path
+ module_readme: Path
+ version_name: str
+
+
+def beet_default(ctx: Context) -> Generator:
+ """Build pack to output then attempt to publish them to platforms."""
+ yield
+ for pack in list(filter(None, ctx.packs)):
+ pack.name = f"{pack.name}-{MINECRAFT_VERSIONS[-1]}-v{VERSION}" # type: ignore[attr-defined]
+ file = pack.save(RELEASE_DIR, overwrite=True) # type: ignore[attr-defined]
+
+ if module_slug := ctx.meta.get("slug"):
+ ctx.require(publish_pack(
+ file=file,
+ changelog=create_specialized_changelog(ctx.directory.name),
+ module_name=f"Bookshelf {ctx.meta.get('name', '')}".strip(),
+ module_slug=module_slug,
+ module_description=ctx.meta.get("description", ""),
+ module_documentation=ctx.meta.get("documentation", ""),
+ module_icon=ctx.directory / "pack.png",
+ module_readme=ctx.directory / "README.md",
+ version_name=f"{ctx.directory.name} v{VERSION}",
+ ))
+ else:
+ get_step_logger().warning(
+ "Metadata file for module '%s' is missing optional key 'slug'. "
+ "A slug is required for publishing to platforms.",
+ ctx.directory.name,
+ )
+
+
+@configurable(validator=PublishOptions)
+def publish_pack(_: Context, opts: PublishOptions) -> None:
+ """Attempt to publish pack to platforms."""
+ if MODRINTH_TOKEN and (
+ update_modrinth_project(opts)
+ or create_modrinth_project(opts)
+ ):
+ create_modrinth_version(opts)
+
+ if SMITHED_TOKEN and (
+ update_smithed_project(opts)
+ or create_smithed_project(opts)
+ ):
+ create_smithed_version(opts)
+
+
+def create_specialized_changelog(module: str) -> str:
+ """Create a changelog specific to the given module."""
+ changelog = (DOC_DIR / f"_templates/changelog/v{VERSION}.md").read_text("utf-8")
+ sections = re.split(r"(###.*?)$", changelog, flags=re.MULTILINE)
+ return sections.pop(0) + "".join(
+ "".join(sections[i:i+2])
+ for i in range(0, len(sections) - 1, 2)
+ if module in sections[i]
+ ) if module.startswith("bs.") else changelog
+
+
+def get_modrinth_project_id(slug: str) -> str | None:
+ """Attempt to get the Modrinth project id."""
+ response = requests.get(f"{MODRINTH_API}/project/{slug}/check", timeout=5, headers={
+ "Authorization": MODRINTH_TOKEN,
+ "User-Agent": "mcbookshelf/Bookshelf/release (contact@gunivers.net)",
+ })
+
+ return response.json()["id"] if response.status_code == requests.codes.ok else None
+
+
+def create_modrinth_project(opts: PublishOptions) -> bool:
+ """Attempt to create a new Modrinth project."""
+ return handle_response_error(requests.post(
+ f"{MODRINTH_API}/project",
+ timeout=5,
+ headers={
+ "Authorization": MODRINTH_TOKEN,
+ "User-Agent": "mcbookshelf/Bookshelf/release (contact@gunivers.net)",
+ },
+ files={"icon": opts.module_icon.read_bytes(), "data":json.dumps({
+ "name": opts.module_name,
+ "slug": opts.module_slug,
+ "summary": opts.module_description,
+ "description": opts.module_readme.read_text("utf-8"),
+ "is_draft": True,
+ "initial_versions": [],
+ "categories": ["library"],
+ "additional_categories": ["game-mechanics"],
+ "organization_id": "CeDKAOAS",
+ "license_id": "MPL-2.0",
+ "license_url": f"https://github.com/{GITHUB_REPO}/blob/master/LICENSE",
+ "link_urls": {
+ "issues": f"https://github.com/{GITHUB_REPO}/issues",
+ "source": f"https://github.com/{GITHUB_REPO}",
+ "wiki": opts.module_documentation,
+ "discord": "https://discord.gg/aV5SF3JsAZ",
+ "other": "https://www.helloasso.com/associations/altearn/formulaires/3/en",
+ }}),
+ },
+ ), f"Failed to create project '{opts.module_name}' on Modrinth.")
+
+
+def update_modrinth_project(opts: PublishOptions) -> bool:
+ """Attempt to update a Modrinth project."""
+ response = requests.patch(
+ f"{MODRINTH_API}/project/{opts.module_slug}",
+ timeout=5,
+ headers={
+ "Authorization": MODRINTH_TOKEN,
+ "User-Agent": "mcbookshelf/Bookshelf/release (contact@gunivers.net)",
+ },
+ json={
+ "summary": opts.module_description,
+ "description": opts.module_readme.read_text("utf-8"),
+ "link_urls": {"wiki": opts.module_documentation},
+ },
+ )
+
+ return handle_response_error(
+ response,
+ f"Failed to update project '{opts.module_name}' on Modrinth.",
+ ) if response.status_code != requests.codes.not_found else False
+
+
+def create_modrinth_version(opts: PublishOptions) -> bool:
+ """Attempt to create a new Modrinth version."""
+ if requests.get(
+ f"{MODRINTH_API}/project/{opts.module_slug}/version/{VERSION}",
+ timeout=5,
+ headers={
+ "Authorization": MODRINTH_TOKEN,
+ "User-Agent": "mcbookshelf/Bookshelf/release (contact@gunivers.net)",
+ },
+ ).status_code == requests.codes.ok:
+ get_step_logger().warning(
+ "The version '%s' for the module '%s' already exists on Modrinth. "
+ "This version will not be published again to avoid duplication.",
+ VERSION,
+ opts.module_name,
+ )
+ return False
+
+ return handle_response_error(requests.post(
+ f"{MODRINTH_API}/version",
+ timeout=5,
+ headers={
+ "Authorization": MODRINTH_TOKEN,
+ "User-Agent": "mcbookshelf/Bookshelf/release (contact@gunivers.net)",
+ },
+ files={"data": json.dumps({
+ "project_id": get_modrinth_project_id(opts.module_slug),
+ "file_parts": [opts.file.name],
+ "version_number": VERSION,
+ "version_title": opts.module_name,
+ "version_body": opts.changelog,
+ "dependencies": [],
+ "release_channel": "release",
+ "game_versions": MINECRAFT_VERSIONS,
+ "loaders": ["datapack"],
+ "featured": True,
+ }), opts.file.name: opts.file.read_bytes()}, # type: ignore[arg-type]
+ ), f"Failed to create version '{VERSION}' on Modrinth.")
+
+
+def create_smithed_project(opts: PublishOptions) -> bool:
+ """Attempt to create a new Smithed project."""
+ return handle_response_error(requests.post(
+ f"{SMITHED_API}/packs",
+ timeout=5,
+ headers={"Content-Type": "application/json"},
+ params={"token": SMITHED_TOKEN, "id": opts.module_slug},
+ json={"data": {
+ "categories": ["Library"],
+ "display": {
+ "name": opts.module_name,
+ "description": opts.module_description,
+ "icon": MASTER_URL.format(
+ opts.module_icon.relative_to(ROOT_DIR).as_posix(),
+ ),
+ "webPage": MASTER_URL.format(
+ opts.module_readme.relative_to(ROOT_DIR).as_posix(),
+ ),
+ "urls": {
+ "discord": "https://discord.gg/aV5SF3JsAZ",
+ "source": f"https://github.com/{GITHUB_REPO}",
+ "homepage": opts.module_documentation,
+ },
+ },
+ }},
+ ), f"Failed to create project '{opts.module_name}' on Smithed.")
+
+
+def update_smithed_project(opts: PublishOptions) -> bool:
+ """Attempt to update a Smithed project."""
+ response = requests.patch(
+ f"{SMITHED_API}/packs/{opts.module_slug}",
+ timeout=5,
+ headers={"Content-Type": "application/json"},
+ params={"token": SMITHED_TOKEN},
+ json={"data": {
+ "display": {
+ "description": opts.module_description,
+ "urls": {"homepage": opts.module_documentation},
+ },
+ }},
+ )
+
+ return handle_response_error(
+ response,
+ f"Failed to update project '{opts.module_name}' on Smithed.",
+ ) if response.status_code != requests.codes.not_found else False
+
+
+def create_smithed_version(opts: PublishOptions) -> bool:
+ """Attempt to create a new Smithed version."""
+ if not handle_response_error(response := requests.get(
+ f"{SMITHED_API}/packs/{opts.module_slug}/versions",
+ timeout=5,
+ ), "Failed to get versions on Smithed."):
+ return False
+
+ if any(version["name"] == VERSION for version in response.json()):
+ get_step_logger().warning(
+ "The version '%s' for the module '%s' already exists on Smithed. "
+ "This version will not be published again to avoid duplication.",
+ VERSION,
+ opts.module_name,
+ )
+ return False
+
+ if not handle_response_error(response := requests.get(
+ f"{MODRINTH_API}/project/{opts.module_slug}/version/{VERSION}",
+ timeout=5,
+ ), f"Failed to get version '{VERSION}' on Modrinth."):
+ return False
+
+ data = response.json()
+ return handle_response_error(requests.post(
+ f"{SMITHED_API}/packs/{opts.module_slug}/versions",
+ timeout=5,
+ headers={"Content-Type": "application/json"},
+ params={"token": SMITHED_TOKEN, "version": VERSION},
+ json={"data": {
+ "name": VERSION,
+ "supports": MINECRAFT_VERSIONS,
+ "downloads": {
+ data["project_types"][0]: data["files"][0]["url"],
+ },
+ }},
+ ), f"Failed to create version '{VERSION}' on Smithed.")
+
+
+def handle_response_error(response: requests.Response, err_message: str) -> bool:
+ """Check for success and log errors."""
+ if response.status_code != requests.codes.ok:
+ get_step_logger().error("%s %s", err_message, response.json())
+
+ return response.status_code == requests.codes.ok
diff --git a/core/plugins/setup_jinja.py b/core/plugins/setup_jinja.py
new file mode 100644
index 0000000000..a849860663
--- /dev/null
+++ b/core/plugins/setup_jinja.py
@@ -0,0 +1,10 @@
+from datetime import datetime
+
+from beet import Context
+
+
+def beet_default(ctx: Context) -> None:
+ """Configure the Jinja template engine with necessary functions."""
+ ctx.require("beet.contrib.inline_function_tag")
+ ctx.template.add_package("core")
+ ctx.template.expose("now", datetime.now)
diff --git a/core/plugins/setup_pack.py b/core/plugins/setup_pack.py
new file mode 100644
index 0000000000..4340e01ca5
--- /dev/null
+++ b/core/plugins/setup_pack.py
@@ -0,0 +1,44 @@
+import json
+from collections.abc import Generator
+
+from beet import Context
+
+from core.definitions import MINECRAFT_VERSIONS, VERSION_URL
+
+
+def beet_default(ctx: Context) -> Generator:
+ """Set the pack format for the module based on supported Minecraft versions."""
+ yield
+ formats = get_supported_formats(ctx, MINECRAFT_VERSIONS)
+
+ ctx.assets.pack_format = formats["assets"]["max_inclusive"]
+ ctx.assets.supported_formats = formats["assets"]
+
+ ctx.data.pack_format = formats["data"]["max_inclusive"]
+ ctx.data.supported_formats = formats["data"]
+ ctx.data.mcmeta.set_content({
+ "id": ctx.directory.name,
+ **ctx.data.mcmeta.data,
+ })
+
+
+def get_supported_formats(ctx: Context, versions: list) -> dict:
+ """Retrieve the supported formats for the given Minecraft versions."""
+ cache = ctx.cache[f"version/{versions[0]}"]
+ file = cache.download(VERSION_URL.format(versions[0]))
+ min_version = json.loads(file.read_text("utf-8"))
+
+ cache = ctx.cache[f"version/{versions[-1]}"]
+ file = cache.download(VERSION_URL.format(versions[-1]))
+ max_version = json.loads(file.read_text("utf-8"))
+
+ return {
+ "data": {
+ "min_inclusive": min_version["data_pack_version"],
+ "max_inclusive": max_version["data_pack_version"],
+ },
+ "assets": {
+ "min_inclusive": min_version["resource_pack_version"],
+ "max_inclusive": max_version["resource_pack_version"],
+ },
+ }
diff --git a/core/plugins/setup_tags.py b/core/plugins/setup_tags.py
new file mode 100644
index 0000000000..adb6abc6cb
--- /dev/null
+++ b/core/plugins/setup_tags.py
@@ -0,0 +1,13 @@
+from collections.abc import Generator
+
+from beet import Context, TagFile
+
+
+def beet_default(ctx: Context) -> Generator:
+ """Set the replace flag to True for all tags."""
+ yield
+ for _, file in ctx.data.all(f"{ctx.directory.name}:*", extend=TagFile): # type: ignore[type-var]
+ pos = list(file.data.keys()).index("values")
+ items = list(file.data.items())
+ items.insert(pos, ("replace", True))
+ file.set_content(dict(items))
diff --git a/core/plugins/setup_tests.py b/core/plugins/setup_tests.py
new file mode 100644
index 0000000000..62b7fbb899
--- /dev/null
+++ b/core/plugins/setup_tests.py
@@ -0,0 +1,30 @@
+from collections.abc import Generator
+from typing import ClassVar
+
+from beet import Context, NamespaceFileScope, TextFile
+
+
+class TestFunction(TextFile):
+ """Represents a PackTest Minecraft function file."""
+
+ scope: ClassVar[NamespaceFileScope] = ("test",)
+ extension: ClassVar[str] = ".mcfunction"
+
+
+def beet_default(ctx: Context) -> Generator:
+ """Include test functions from the test folder."""
+ ctx.data.extend_namespace.append(TestFunction)
+ yield
+ batch = f"# @batch {ctx.directory.name}\n"
+ header = ctx.template.render("core/header.jinja")
+ offset = len(header)
+
+ for _, file in ctx.data.all(extend=TestFunction):
+ file.set_content(f"{file.text[:offset]}{batch}{file.text[offset:]}")
+
+ with ctx.override(generate_namespace=ctx.directory.name):
+ ctx.generate("__setup__", TestFunction(
+ f"{header}{batch}"
+ f"# @beforebatch "
+ f'function #bs.load:exclusive {{module:"{ctx.directory.name}"}}',
+ ))
diff --git a/scripts/templates/header.jinja b/core/templates/header.jinja
similarity index 87%
rename from scripts/templates/header.jinja
rename to core/templates/header.jinja
index 22dcc7153e..782e6f32b6 100644
--- a/scripts/templates/header.jinja
+++ b/core/templates/header.jinja
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) {{ now().year }} Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,4 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-{%- if is_feature %}
-#
-# Documentation of the feature: {{ doc }}
-{%- endif %}
# ------------------------------------------------------------------------------------------------------------
diff --git a/core/templates/help.jinja b/core/templates/help.jinja
new file mode 100644
index 0000000000..1d8d948242
--- /dev/null
+++ b/core/templates/help.jinja
@@ -0,0 +1,2 @@
+{% include 'core/header.jinja' %}
+tellraw @s [{"text": "[{{ module_name }} documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "{{ documentation }}"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/core/templates/load/bundle/append.jinja b/core/templates/load/bundle/append.jinja
new file mode 100644
index 0000000000..c0892d1c0a
--- /dev/null
+++ b/core/templates/load/bundle/append.jinja
@@ -0,0 +1,13 @@
+{% include 'core/header.jinja' %}
+execute unless data storage bs:data load.bundle run data modify storage bs:data load.bundle set value { \
+ link: "https://api.mcbookshelf.dev/download?version={{ major }}.{{ minor }}.{{ patch }},modules=", \
+ message: {text:"[bundle]",clickEvent:{action:"open_url"},hoverEvent:{action:"show_text",value:"Click to open URL"}}, \
+}
+
+$data modify storage bs:data load.bundle._module set value "$(module)"
+$execute store result storage bs:data load.bundle._major int 1 run scoreboard players get $$(module).major load.status
+$execute store result storage bs:data load.bundle._minor int 1 run scoreboard players get $$(module).minor load.status
+$execute store result storage bs:data load.bundle._patch int 1 run scoreboard players get $$(module).patch load.status
+function bs.load:v{{ major }}.{{ minor }}.{{ patch }}/bundle/concat with storage bs:data load.bundle
+
+data modify storage bs:data load.bundle.message.clickEvent.value set string storage bs:data load.bundle.link 0 -1
diff --git a/core/templates/load/bundle/concat.jinja b/core/templates/load/bundle/concat.jinja
new file mode 100644
index 0000000000..f005744af8
--- /dev/null
+++ b/core/templates/load/bundle/concat.jinja
@@ -0,0 +1,2 @@
+{% include 'core/header.jinja' %}
+$data modify storage bs:data load.bundle.link set value "$(link)$(_module):$(_major).$(_minor).$(_patch),"
diff --git a/core/templates/load/errors.jinja b/core/templates/load/errors.jinja
new file mode 100644
index 0000000000..552ad55109
--- /dev/null
+++ b/core/templates/load/errors.jinja
@@ -0,0 +1,17 @@
+#!tag "bs.load:errors/" + module
+
+{% include 'core/header.jinja' %}
+# Return early to ensure code runs only on the latest available version
+execute unless score ${{ module }}.major load.status matches {{ major }} run return 0
+execute unless score ${{ module }}.minor load.status matches {{ minor }} run return 0
+execute unless score ${{ module }}.patch load.status matches {{ patch }} run return 0
+
+# Format an error message for conflicting versions
+data modify storage bs:data load.errors append value {major:1b,message:{text:"[{{ module }}]",hoverEvent:{action:"show_text",value:[{text:"[v",color:"#CCCCCC"},{type:"nbt",storage:"bs:data",nbt:"load.modules[{module:'{{ module }}',enabled:1b}].version"},{text:" ("},{text:"✔ enabled","color":"#26BD26"},{text:"), v"},{type:"nbt",storage:"bs:data",nbt:"load.modules[{module:'{{ module }}',enabled:0b}].version","separator":", v"},{text:"]"}]}}}
+
+# Return early if major version conflicts exist
+execute if score #{{ module }}.major_versions load.status matches 2.. run return 0
+
+# Mark the error as non major and create a downloadable bundle to resolve the issue
+data modify storage bs:data load.errors[-1].major set value 0b
+function bs.load:v{{ major }}.{{ minor }}.{{ patch }}/bundle/append {module:"{{ module }}"}
diff --git a/core/templates/load/exclusive.jinja b/core/templates/load/exclusive.jinja
new file mode 100644
index 0000000000..a567e03fa7
--- /dev/null
+++ b/core/templates/load/exclusive.jinja
@@ -0,0 +1,5 @@
+#!tag "bs.load:exclusive"
+
+{% include 'core/header.jinja' %}
+function #bs.load:unload
+$function #bs.load:module/$(module)
diff --git a/core/templates/load/steps/cleanup.jinja b/core/templates/load/steps/cleanup.jinja
new file mode 100644
index 0000000000..47908f1817
--- /dev/null
+++ b/core/templates/load/steps/cleanup.jinja
@@ -0,0 +1,4 @@
+#!tag "bs.load:steps/cleanup"
+
+{% include 'core/header.jinja' %}
+data remove storage bs:data load
diff --git a/core/templates/load/steps/enumerate.jinja b/core/templates/load/steps/enumerate.jinja
new file mode 100644
index 0000000000..5707d842a2
--- /dev/null
+++ b/core/templates/load/steps/enumerate.jinja
@@ -0,0 +1,19 @@
+#!tag "bs.load:steps/enumerate"
+
+{% include 'core/header.jinja' %}
+# Add the version of the module to the list of available modules
+data modify storage bs:data load.modules append value {module:"{{ module }}",version:"{{ major }}.{{ minor }}.{{ patch }}",enabled:0b}
+scoreboard players add ${{ module }}.major load.status 0
+scoreboard players add ${{ module }}.minor load.status 0
+scoreboard players add ${{ module }}.patch load.status 0
+
+# Count the number of major versions
+execute unless score ${{ module }}.major load.status matches {{ major }} run scoreboard players add #{{ module }}.major_versions load.status 1
+
+# Set the latest available version for the module
+execute unless score ${{ module }}.major load.status matches ..{{ major }} run return 0
+execute if score ${{ module }}.major load.status matches {{ major }} unless score ${{ module }}.minor load.status matches ..{{ minor }} run return 0
+execute if score ${{ module }}.major load.status matches {{ major }} if score ${{ module }}.minor load.status matches {{ minor }} unless score ${{ module }}.patch load.status matches ..{{ patch }} run return 0
+scoreboard players set ${{ module }}.major load.status {{ major }}
+scoreboard players set ${{ module }}.minor load.status {{ minor }}
+scoreboard players set ${{ module }}.patch load.status {{ patch }}
diff --git a/core/templates/load/steps/resolve.jinja b/core/templates/load/steps/resolve.jinja
new file mode 100644
index 0000000000..c04135d84d
--- /dev/null
+++ b/core/templates/load/steps/resolve.jinja
@@ -0,0 +1,16 @@
+#!tag "bs.load:steps/resolve"
+
+{% include 'core/header.jinja' %}
+# Identify the enabled version (the last one in the datapack list) and mark it as active
+data modify storage bs:data load.modules[{module:"{{ module }}",version:"{{ major }}.{{ minor }}.{{ patch }}"}].enabled set value 1b
+
+# Return early if all versions have the same major version and the most recent one is enabled
+execute unless score #{{ module }}.major_versions load.status matches 2.. \
+ if score ${{ module }}.major load.status matches {{ major }} \
+ if score ${{ module }}.minor load.status matches {{ minor }} \
+ if score ${{ module }}.patch load.status matches {{ patch }} \
+ run return 1
+
+# Format module specific errors
+function #bs.load:errors/{{ module }}
+return fail
diff --git a/core/templates/load/validate.jinja b/core/templates/load/validate.jinja
new file mode 100644
index 0000000000..1bb5e1551e
--- /dev/null
+++ b/core/templates/load/validate.jinja
@@ -0,0 +1,17 @@
+{% include 'core/header.jinja' %}
+# Return early if no loading errors are found
+execute unless data storage bs:data load.errors run return 0
+
+# Retry sending error messages if no players are present
+execute unless entity @p run return run schedule function bs.load:validate 5t
+
+# Display error messages for major and minor version conflicts
+tellraw @a [{"text":"\n⚠ ","color":"#E84635","underlined":true},{"text":"BOOKSHELF","bold":true},{"text":" • Version Conflict Detected\n"}]
+execute if data storage bs:data load.errors[{major:1b}] run tellraw @a [{"text":"◇ Major Conflict: ","color":"#F3B512"},{"type":"nbt","storage":"bs:data","nbt":"load.errors[{major:1b}].message","color":"#CCCCCC","interpret":true}]
+execute if data storage bs:data load.errors[{major:0b}] run tellraw @a [{"text":"◇ Minor/Patch Conflict: ","color":"#F3B512"},{"type":"nbt","storage":"bs:data","nbt":"load.errors[{major:0b}].message","color":"#CCCCCC","interpret":true}]
+
+# Provide resolution steps for minor version errors, or explain that there are no resolution steps for major errors
+execute unless data storage bs:data load.errors[{major:1b}] run tellraw @a [{"text":"\nℹ Download and place this ","color":"#43A8EC","italic":true},{"type":"nbt","storage":"bs:data","nbt":"load.bundle.message","color":"#26BD26","interpret":true}," at the end of your datapack list.\n"]
+execute if data storage bs:data load.errors[{major:1b}] run tellraw @a {"text":"\n❌ Cannot be resolved. Please use the same major version across all datapacks or use them at your own risk.\n","color":"#E84635","italic":true}
+
+return fail
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/.metadata/generated/features.json b/datapacks/Bookshelf Dev/data/bs.dump/.metadata/generated/features.json
deleted file mode 100644
index c5b10fc925..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/.metadata/generated/features.json
+++ /dev/null
@@ -1,17 +0,0 @@
-[
- {
- "name": "var",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/dump.html#dump-var",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/03/02",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/03/02",
- "version": "1.20.4"
- }
- }
-]
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/.metadata/generated/module.json b/datapacks/Bookshelf Dev/data/bs.dump/.metadata/generated/module.json
deleted file mode 100644
index dee4fb92da..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/.metadata/generated/module.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "name": "bs.dump",
- "display_name": "Dump",
- "description": "Dump the content of given variables to the chat.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/dump.html",
- "authors": [
- "Aksiome"
- ],
- "features": [
- "bs.dump:var"
- ]
-}
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/.metadata/module.json b/datapacks/Bookshelf Dev/data/bs.dump/.metadata/module.json
deleted file mode 100644
index d2421799e6..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.dump",
- "display_name": "Dump",
- "description": "Dump the content of given variables to the chat.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/dump.html"
-}
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/__help__.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/__help__.mcfunction
deleted file mode 100644
index d2c05e4354..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/dump.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.dump documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/dump.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/__load__.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/__load__.mcfunction
deleted file mode 100644
index 55c6c0111f..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/__load__.mcfunction
+++ /dev/null
@@ -1,34 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/dump.html
-# ------------------------------------------------------------------------------------------------------------
-
-forceload add -30000000 1600
-execute unless entity B5-0-0-0-2 run summon minecraft:text_display -30000000 0 1600 {UUID:[I;181,0,0,2],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],view_range:0f}
-
-scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
-scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
-
-scoreboard players set 3 bs.const 3
-
-data modify storage bs:const dump set value { \
- key: "#3CE9F2", \
- type: "#FB7F4A", \
- string: "#6ED856", \
- number: "#FFAA32", \
- bracket_1: "#0099FF", \
- bracket_2: "#FFD700", \
- bracket_3: "#FF60FC", \
-}
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/__unload__.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/__unload__.mcfunction
deleted file mode 100644
index db23e9cc4a..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/__unload__.mcfunction
+++ /dev/null
@@ -1,26 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/dump.html
-# ------------------------------------------------------------------------------------------------------------
-
-kill B5-0-0-0-2
-forceload remove -30000000 1600
-
-scoreboard objectives remove bs.const
-scoreboard objectives remove bs.data
-
-data remove storage bs:const dump
-data remove storage bs:data dump
-data remove storage bs:out dump
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/any.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/any.mcfunction
deleted file mode 100644
index f2a21a8fe1..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/any.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute if data storage bs:data dump[-1].var[] run return run function bs.dump:format/array/array
-execute if data storage bs:data dump[-1].var{} run return run function bs.dump:format/compound/compound
-
-data modify storage bs:ctx _ set value [[0b],[0s],[0],[0l],[0f],[0d],[""]]
-execute store success score #dump.success bs.data run data modify storage bs:ctx _[] append from storage bs:data dump[-1].var
-execute if score #dump.success bs.data matches 1 unless data storage bs:ctx _[-1][1] run return run function bs.dump:format/number with storage bs:const dump
-execute if score #dump.success bs.data matches 1 run function bs.dump:format/string/string with storage bs:const dump
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/array.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/array.mcfunction
deleted file mode 100644
index 521cc81f01..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/array.mcfunction
+++ /dev/null
@@ -1,32 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #dump.count bs.data if data storage bs:data dump[-1].var[]
-execute store result score #dump.expand bs.data run data get storage bs:data dump[-1].expand
-
-execute if score #dump.count bs.data matches 0 run return run function bs.dump:format/array/empty
-execute if score #dump.count bs.data matches ..3 \
- unless data storage bs:data dump[-1].var[][] \
- unless data storage bs:data dump[-1].var[{}] \
- run return run function bs.dump:format/array/compact/compact
-
-execute if score #dump.expand bs.data matches 0 run return run function bs.dump:format/array/collapse
-
-function bs.dump:format/bracket/open with storage bs:const dump
-function bs.dump:format/array/loop
-data modify storage bs:out dump append value '"\\n"'
-data modify storage bs:out dump append from storage bs:data dump[].indent
-data remove storage bs:out dump[-1]
-function bs.dump:format/bracket/close with storage bs:const dump
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/collapse.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/collapse.mcfunction
deleted file mode 100644
index 500449c08f..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/collapse.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-function bs.dump:format/bracket/open with storage bs:const dump
-function bs.dump:format/collapse/collapse
-function bs.dump:format/bracket/close with storage bs:const dump
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/compact/compact.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/compact/compact.mcfunction
deleted file mode 100644
index d7cc9017d3..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/compact/compact.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-function bs.dump:format/bracket/open with storage bs:const dump
-function bs.dump:format/array/compact/loop
-function bs.dump:format/bracket/close with storage bs:const dump
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/compact/loop.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/compact/loop.mcfunction
deleted file mode 100644
index e786b868a5..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/compact/loop.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data dump append from storage bs:data dump[-1]
-data modify storage bs:data dump[-1].var set from storage bs:data dump[-1].var[0]
-function bs.dump:format/any
-data remove storage bs:data dump[-1]
-data remove storage bs:data dump[-1].var[0]
-
-execute if data storage bs:data dump[-1].var[0] run data modify storage bs:out dump append value '", "'
-execute if data storage bs:data dump[-1].var[0] run function bs.dump:format/array/compact/loop
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/empty.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/empty.mcfunction
deleted file mode 100644
index 78c44a487d..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/empty.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-function bs.dump:format/bracket/open with storage bs:const dump
-function bs.dump:format/bracket/close with storage bs:const dump
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/loop.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/loop.mcfunction
deleted file mode 100644
index fefd758fef..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/array/loop.mcfunction
+++ /dev/null
@@ -1,27 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:out dump append value '"\\n"'
-data modify storage bs:out dump append from storage bs:data dump[].indent
-
-data modify storage bs:data dump append from storage bs:data dump[-1]
-data modify storage bs:data dump[-1].var set from storage bs:data dump[-1].var[0]
-execute store result storage bs:data dump[-1].expand int .99999999 run data get storage bs:data dump[-1].expand
-function bs.dump:format/any
-data remove storage bs:data dump[-1]
-data remove storage bs:data dump[-1].var[0]
-
-execute if data storage bs:data dump[-1].var[0] run data modify storage bs:out dump append value '", "'
-execute if data storage bs:data dump[-1].var[0] run function bs.dump:format/array/loop
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/brace/close.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/brace/close.mcfunction
deleted file mode 100644
index a35232eb28..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/brace/close.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #dump.depth bs.data if data storage bs:data dump[]
-scoreboard players operation #dump.depth bs.data %= 3 bs.const
-
-$execute if score #dump.depth bs.data matches 0 run data modify storage bs:out dump append value '{"text":"}","color":"$(bracket_1)"}'
-$execute if score #dump.depth bs.data matches 1 run data modify storage bs:out dump append value '{"text":"}","color":"$(bracket_2)"}'
-$execute if score #dump.depth bs.data matches 2 run data modify storage bs:out dump append value '{"text":"}","color":"$(bracket_3)"}'
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/brace/open.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/brace/open.mcfunction
deleted file mode 100644
index 98b9a1b5da..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/brace/open.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #dump.depth bs.data if data storage bs:data dump[]
-scoreboard players operation #dump.depth bs.data %= 3 bs.const
-
-$execute if score #dump.depth bs.data matches 0 run data modify storage bs:out dump append value '{"text":"{","color":"$(bracket_1)"}'
-$execute if score #dump.depth bs.data matches 1 run data modify storage bs:out dump append value '{"text":"{","color":"$(bracket_2)"}'
-$execute if score #dump.depth bs.data matches 2 run data modify storage bs:out dump append value '{"text":"{","color":"$(bracket_3)"}'
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/bracket/close.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/bracket/close.mcfunction
deleted file mode 100644
index 2d4db365f8..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/bracket/close.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #dump.depth bs.data if data storage bs:data dump[]
-scoreboard players operation #dump.depth bs.data %= 3 bs.const
-
-$execute if score #dump.depth bs.data matches 0 run data modify storage bs:out dump append value '{"text":"]","color":"$(bracket_1)"}'
-$execute if score #dump.depth bs.data matches 1 run data modify storage bs:out dump append value '{"text":"]","color":"$(bracket_2)"}'
-$execute if score #dump.depth bs.data matches 2 run data modify storage bs:out dump append value '{"text":"]","color":"$(bracket_3)"}'
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/bracket/open.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/bracket/open.mcfunction
deleted file mode 100644
index 18f6c4a104..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/bracket/open.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #dump.depth bs.data if data storage bs:data dump[]
-scoreboard players operation #dump.depth bs.data %= 3 bs.const
-
-$execute if score #dump.depth bs.data matches 0 run data modify storage bs:out dump append value '{"text":"[","color":"$(bracket_1)"}'
-$execute if score #dump.depth bs.data matches 1 run data modify storage bs:out dump append value '{"text":"[","color":"$(bracket_2)"}'
-$execute if score #dump.depth bs.data matches 2 run data modify storage bs:out dump append value '{"text":"[","color":"$(bracket_3)"}'
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/collapse/collapse.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/collapse/collapse.mcfunction
deleted file mode 100644
index be9c3d1440..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/collapse/collapse.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify entity B5-0-0-0-2 text set value '{"storage":"bs:data","nbt":"dump[-1].var"}'
-data modify entity B5-0-0-0-2 text set value '{"entity":"B5-0-0-0-2","nbt":"text"}'
-data modify storage bs:data dump[-1].var set from entity B5-0-0-0-2 text
-data modify storage bs:data dump[-1].var set string storage bs:data dump[-1].var 3 -3
-function bs.dump:format/collapse/event with storage bs:data dump[-1]
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/compound/collapse.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/compound/collapse.mcfunction
deleted file mode 100644
index e3d6b2a380..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/compound/collapse.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-function bs.dump:format/brace/open with storage bs:const dump
-function bs.dump:format/collapse/collapse
-function bs.dump:format/brace/close with storage bs:const dump
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/compound/compound.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/compound/compound.mcfunction
deleted file mode 100644
index 55cd5fd630..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/compound/compound.mcfunction
+++ /dev/null
@@ -1,28 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #dump.count bs.data run data get storage bs:data dump[-1].var
-execute store result score #dump.expand bs.data run data get storage bs:data dump[-1].expand
-
-execute if score #dump.count bs.data matches 0 run return run function bs.dump:format/compound/empty
-execute if score #dump.expand bs.data matches 0 run return run function bs.dump:format/compound/collapse
-
-function bs.dump:format/brace/open with storage bs:const dump
-function bs.dump:key/get
-function bs.dump:format/compound/loop with storage bs:data dump[-1]
-data modify storage bs:out dump append value '"\\n"'
-data modify storage bs:out dump append from storage bs:data dump[].indent
-data remove storage bs:out dump[-1]
-function bs.dump:format/brace/close with storage bs:const dump
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/compound/empty.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/compound/empty.mcfunction
deleted file mode 100644
index 4564d3da94..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/compound/empty.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-function bs.dump:format/brace/open with storage bs:const dump
-function bs.dump:format/brace/close with storage bs:const dump
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/compound/loop.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/compound/loop.mcfunction
deleted file mode 100644
index c76ae426f4..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/compound/loop.mcfunction
+++ /dev/null
@@ -1,30 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:out dump append value '"\\n"'
-data modify storage bs:out dump append from storage bs:data dump[].indent
-
-data modify storage bs:data dump append from storage bs:data dump[-1]
-$data modify storage bs:data dump[-1].var set from storage bs:data dump[-1].var.$(key)
-execute store result storage bs:data dump[-1].expand int .99999999 run data get storage bs:data dump[-1].expand
-function bs.dump:format/compound/key with storage bs:const dump
-function bs.dump:format/any
-data remove storage bs:data dump[-1]
-$data remove storage bs:data dump[-1].var.$(key)
-
-execute store result score #dump.count bs.data run data get storage bs:data dump[-1].var
-execute if score #dump.count bs.data matches 1.. run data modify storage bs:out dump append value '", "'
-execute if score #dump.count bs.data matches 1.. run function bs.dump:key/get
-execute if score #dump.count bs.data matches 1.. run function bs.dump:format/compound/loop with storage bs:data dump[-1]
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/score.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/score.mcfunction
deleted file mode 100644
index 55c66545fc..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/score.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify entity B5-0-0-0-2 text set value '{"score":{"name":"#dump.var","objective":"bs.data"},"color":"$(number)"}'
-data modify storage bs:out dump append from entity B5-0-0-0-2 text
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/string/unquote.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/format/string/unquote.mcfunction
deleted file mode 100644
index 185b5d8a86..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/string/unquote.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:data dump[-1].var set value $(var)
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/any.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/any.mcfunction
deleted file mode 100644
index 5d04fee1b0..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/any.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute if data storage bs:data dump[-1].var[] run return run function bs.dump:interpret/array/array
-execute if data storage bs:data dump[-1].var{} run return run function bs.dump:interpret/compound/compound
-
-execute store success score #dump.success bs.data run function bs.dump:interpret/path/path with storage bs:data dump[-1]
-execute if score #dump.success bs.data matches 0 run function bs.dump:interpret/score with storage bs:data dump[-1]
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/array/array.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/array/array.mcfunction
deleted file mode 100644
index 1e7aed0756..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/array/array.mcfunction
+++ /dev/null
@@ -1,29 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #dump.count bs.data if data storage bs:data dump[-1].var[]
-
-execute if score #dump.count bs.data matches 0 run return run function bs.dump:format/array/empty
-execute if score #dump.count bs.data matches ..3 \
- unless data storage bs:data dump[-1].var[][] \
- unless data storage bs:data dump[-1].var[{}] \
- run return run function bs.dump:interpret/array/compact/compact
-
-function bs.dump:format/bracket/open with storage bs:const dump
-function bs.dump:interpret/array/loop
-data modify storage bs:out dump append value '"\\n"'
-data modify storage bs:out dump append from storage bs:data dump[].indent
-data remove storage bs:out dump[-1]
-function bs.dump:format/bracket/close with storage bs:const dump
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/array/compact/compact.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/array/compact/compact.mcfunction
deleted file mode 100644
index 7ee14aa09d..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/array/compact/compact.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-function bs.dump:format/bracket/open with storage bs:const dump
-execute if score #dump.count bs.data matches 1.. run function bs.dump:interpret/array/compact/loop
-function bs.dump:format/bracket/close with storage bs:const dump
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/array/compact/loop.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/array/compact/loop.mcfunction
deleted file mode 100644
index 8b66f5929e..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/array/compact/loop.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data dump append from storage bs:data dump[-1]
-data modify storage bs:data dump[-1].var set from storage bs:data dump[-1].var[0]
-function bs.dump:interpret/any
-data remove storage bs:data dump[-1]
-data remove storage bs:data dump[-1].var[0]
-
-execute if data storage bs:data dump[-1].var[0] run data modify storage bs:out dump append value '", "'
-execute if data storage bs:data dump[-1].var[0] run function bs.dump:interpret/array/compact/loop
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/array/loop.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/array/loop.mcfunction
deleted file mode 100644
index 93e9cc4b20..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/array/loop.mcfunction
+++ /dev/null
@@ -1,26 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:out dump append value '"\\n"'
-data modify storage bs:out dump append from storage bs:data dump[].indent
-
-data modify storage bs:data dump append from storage bs:data dump[-1]
-data modify storage bs:data dump[-1].var set from storage bs:data dump[-1].var[0]
-function bs.dump:interpret/any
-data remove storage bs:data dump[-1]
-data remove storage bs:data dump[-1].var[0]
-
-execute if data storage bs:data dump[-1].var[0] run data modify storage bs:out dump append value '", "'
-execute if data storage bs:data dump[-1].var[0] run function bs.dump:interpret/array/loop
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/compound/compound.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/compound/compound.mcfunction
deleted file mode 100644
index d819c2a392..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/compound/compound.mcfunction
+++ /dev/null
@@ -1,25 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #dump.count bs.data run data get storage bs:data dump[-1].var
-execute if score #dump.count bs.data matches 0 run return run function bs.dump:format/compound/empty
-
-function bs.dump:format/brace/open with storage bs:const dump
-function bs.dump:key/get
-function bs.dump:interpret/compound/loop with storage bs:data dump[-1]
-data modify storage bs:out dump append value '"\\n"'
-data modify storage bs:out dump append from storage bs:data dump[].indent
-data remove storage bs:out dump[-1]
-function bs.dump:format/brace/close with storage bs:const dump
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/compound/loop.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/compound/loop.mcfunction
deleted file mode 100644
index f1af735cdf..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/compound/loop.mcfunction
+++ /dev/null
@@ -1,29 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:out dump append value '"\\n"'
-data modify storage bs:out dump append from storage bs:data dump[].indent
-
-data modify storage bs:data dump append from storage bs:data dump[-1]
-$data modify storage bs:data dump[-1].var set from storage bs:data dump[-1].var.$(key)
-function bs.dump:format/compound/key with storage bs:const dump
-function bs.dump:interpret/any
-data remove storage bs:data dump[-1]
-$data remove storage bs:data dump[-1].var.$(key)
-
-execute store result score #dump.count bs.data run data get storage bs:data dump[-1].var
-execute if score #dump.count bs.data matches 1.. run data modify storage bs:out dump append value '", "'
-execute if score #dump.count bs.data matches 1.. run function bs.dump:key/get
-execute if score #dump.count bs.data matches 1.. run function bs.dump:interpret/compound/loop with storage bs:data dump[-1]
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/expand/cast.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/expand/cast.mcfunction
deleted file mode 100644
index 158cd4f3cc..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/expand/cast.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:data dump[-1].expand set value $(_)
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/expand/parse/init.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/expand/parse/init.mcfunction
deleted file mode 100644
index 901c8bfd7c..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/expand/parse/init.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result storage bs:ctx x int 1 run scoreboard players set #dump.cursor bs.data -2
-execute store result storage bs:ctx y int 1 run scoreboard players set #dump.cursor bs.data -1
-function bs.dump:interpret/path/expand/parse/next with storage bs:ctx
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/expand/parse/next.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/expand/parse/next.mcfunction
deleted file mode 100644
index ecf45fed49..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/expand/parse/next.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:ctx _ set string storage bs:data dump[-1].var $(x) $(y)
-execute if data storage bs:ctx {_:" "} run return run function bs.dump:interpret/path/expand/parse/terminate with storage bs:ctx
-execute store result storage bs:ctx y int 1 run scoreboard players get #dump.cursor bs.data
-execute store result storage bs:ctx x int 1 run scoreboard players remove #dump.cursor bs.data 1
-function bs.dump:interpret/path/expand/parse/next with storage bs:ctx
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/expand/parse/terminate.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/expand/parse/terminate.mcfunction
deleted file mode 100644
index b58d4fb799..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/expand/parse/terminate.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:ctx _ set string storage bs:data dump[-1].var $(y)
-$data modify storage bs:data dump[-1].var set string storage bs:data dump[-1].var 0 $(x)
-function bs.dump:interpret/path/expand/cast with storage bs:ctx
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/score.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/score.mcfunction
deleted file mode 100644
index cff45241b7..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/score.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store success score #dump.success bs.data run scoreboard players get $(var)
-execute if score #dump.success bs.data matches 0 run return run function bs.dump:format/undefined with storage bs:const dump
-$scoreboard players operation #dump.var bs.data = $(var)
-function bs.dump:format/score with storage bs:const dump
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/key/get.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/key/get.mcfunction
deleted file mode 100644
index 12b34f2d1c..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/key/get.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify entity B5-0-0-0-2 text set value '{"storage":"bs:data","nbt":"dump[-1].var"}'
-function bs.dump:key/unquote with entity B5-0-0-0-2
-
-data modify storage bs:ctx _ set string storage bs:data dump[-1].key 1 2
-execute store result storage bs:ctx x int 1 run scoreboard players set #dump.cursor bs.data 2
-execute store result storage bs:ctx y int 1 run scoreboard players add #dump.cursor bs.data 1
-execute if data storage bs:ctx {_:'"'} run return run function bs.dump:key/parse/quoted/double with storage bs:ctx
-execute if data storage bs:ctx {_:"'"} run return run function bs.dump:key/parse/quoted/single with storage bs:ctx
-function bs.dump:key/parse/unquoted with storage bs:ctx
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/key/parse/terminate.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/key/parse/terminate.mcfunction
deleted file mode 100644
index c016578f2e..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/key/parse/terminate.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:data dump[-1].key set string storage bs:data dump[-1].key 1 $(x)
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/key/unquote.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/key/unquote.mcfunction
deleted file mode 100644
index 32d0857480..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/key/unquote.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:data dump[-1].key set value $(text)
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/var.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/function/var.mcfunction
deleted file mode 100644
index 4ca6ee115f..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/var.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/dump.html#dump-var
-# ------------------------------------------------------------------------------------------------------------
-
-# Note: Thanks to tryashtar and PiggyPig for inspiring the idea behind this module.
-
-data modify storage bs:out dump set value ['[{"text":"[","color":"#cccccc"},{"selector":"@s"},"] ⇒ "]']
-$data modify storage bs:data dump set value [{var:$(var),indent:'"\\u2000"'}]
-function bs.dump:interpret/any
-tellraw @a {"type":"nbt","storage":"bs:out","nbt":"dump[]","separator":"","interpret":true}
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/tags/function/exclusive_load.json b/datapacks/Bookshelf Dev/data/bs.dump/tags/function/exclusive_load.json
deleted file mode 100644
index 2ae30f7462..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.dump:load"
- ]
-}
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/tags/function/help.json b/datapacks/Bookshelf Dev/data/bs.dump/tags/function/help.json
deleted file mode 100644
index dc627dd767..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.dump:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/tags/function/load.json b/datapacks/Bookshelf Dev/data/bs.dump/tags/function/load.json
deleted file mode 100644
index 8a9a1489f9..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/tags/function/load.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.dump:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/tags/function/unload.json b/datapacks/Bookshelf Dev/data/bs.dump/tags/function/unload.json
deleted file mode 100644
index 183b1ca344..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.dump:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/test/__boot__.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/test/__boot__.mcfunction
deleted file mode 100644
index 63910fa6d9..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.dump
-# @beforebatch function #bs.dump:exclusive_load
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/test/var.mcfunction b/datapacks/Bookshelf Dev/data/bs.dump/test/var.mcfunction
deleted file mode 100644
index 0fb786fc86..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.dump/test/var.mcfunction
+++ /dev/null
@@ -1,14 +0,0 @@
-# Dumping var works as expected
-# @batch bs.dump
-# @dummy
-
-await entity B5-0-0-0-2
-
-data modify storage bs:data packtest set value {foo:"bar"}
-function #bs.dump:var { var: { storage: "storage bs:data packtest", entity:"entity @s {} 0", score: ["3 bs.const", "-_- bs.const"] }}
-
-assert chat '.*?\\{[\\s\\S]*storage: \\{[\\s\\S]*foo: \\"bar\\"[\\s\\S]*\\}[\\s\\S]*\\}'
-assert chat '.*?\\{[\\s\\S]*entity: \\{ [0-9]+ entries .*? \\}[\\s\\S]*\\}'
-assert chat '.*?\\{[\\s\\S]*score: \\[3, undefined\\][\\s\\S]*\\}'
-
-data remove storage bs:data packtest
diff --git a/datapacks/Bookshelf Dev/data/bs.log/.metadata/generated/features.json b/datapacks/Bookshelf Dev/data/bs.log/.metadata/generated/features.json
deleted file mode 100644
index 9bee1d0f1e..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/.metadata/generated/features.json
+++ /dev/null
@@ -1,92 +0,0 @@
-[
- {
- "name": "clear_history",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#history",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/06",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/06",
- "version": "1.21"
- }
- },
- {
- "name": "debug",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#debug",
- "authors": [
- "theogiraudet"
- ],
- "created": {
- "date": "2023/08/05",
- "version": "23w31a"
- },
- "updated": {
- "date": "2024/09/06",
- "version": "1.21"
- }
- },
- {
- "name": "error",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#error",
- "authors": [
- "theogiraudet"
- ],
- "created": {
- "date": "2023/08/05",
- "version": "23w31a"
- },
- "updated": {
- "date": "2024/09/06",
- "version": "1.21"
- }
- },
- {
- "name": "history",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#history",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/06",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/06",
- "version": "1.21"
- }
- },
- {
- "name": "info",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#info",
- "authors": [
- "theogiraudet"
- ],
- "created": {
- "date": "2023/08/05",
- "version": "23w31a"
- },
- "updated": {
- "date": "2024/09/06",
- "version": "1.21"
- }
- },
- {
- "name": "warn",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#warn",
- "authors": [
- "theogiraudet"
- ],
- "created": {
- "date": "2023/08/05",
- "version": "23w31a"
- },
- "updated": {
- "date": "2024/09/06",
- "version": "1.21"
- }
- }
-]
diff --git a/datapacks/Bookshelf Dev/data/bs.log/.metadata/generated/module.json b/datapacks/Bookshelf Dev/data/bs.log/.metadata/generated/module.json
deleted file mode 100644
index 453413e825..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/.metadata/generated/module.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "name": "bs.log",
- "display_name": "Log",
- "description": "Log messages in the chat with varying levels of severity.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "features": [
- "bs.log:clear_history",
- "bs.log:debug",
- "bs.log:error",
- "bs.log:history",
- "bs.log:info",
- "bs.log:warn"
- ]
-}
diff --git a/datapacks/Bookshelf Dev/data/bs.log/.metadata/module.json b/datapacks/Bookshelf Dev/data/bs.log/.metadata/module.json
deleted file mode 100644
index f4bf53a34b..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.log",
- "display_name": "Log",
- "description": "Log messages in the chat with varying levels of severity.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html"
-}
diff --git a/datapacks/Bookshelf Dev/data/bs.log/function/__help__.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/function/__help__.mcfunction
deleted file mode 100644
index 679804a812..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/log.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.log documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf Dev/data/bs.log/function/__load__.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/function/__load__.mcfunction
deleted file mode 100644
index 76846c8bcb..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/function/__load__.mcfunction
+++ /dev/null
@@ -1,43 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/log.html
-# ------------------------------------------------------------------------------------------------------------
-
-forceload add -30000000 1600
-execute unless entity B5-0-0-0-2 run summon minecraft:text_display -30000000 0 1600 {UUID:[I;181,0,0,2],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],view_range:0f}
-setblock -30000000 0 1605 minecraft:repeating_command_block[facing=up]{auto:1b,Command:"help me",TrackOutput:1b}
-
-scoreboard objectives add bs.in dummy [{"text":"BS ","color":"dark_gray"},{"text":"Input","color":"aqua"}]
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
-
-execute unless score #log.gametime bs.data matches -2147483648..2147483647 store result score #log.gametime bs.data run time query gametime
-
-data modify storage bs:const log.time_hms set value '[{"nbt": "log.hours", "storage": "bs:in"}, {"text": ":"}, {"nbt": "log.minutes", "storage": "bs:in"}, {"text": ":"}, {"nbt": "log.seconds", "storage": "bs:in"}]'
-data modify storage bs:const log.time_hmst set value '[{"nbt": "log.time_hms", "storage": "bs:const", "interpret": true}, {"text": "."}, {"nbt": "log.ticks", "storage": "bs:in"}, "t"]'
-
-data modify storage bs:const log.messages[{default: true}].format set value { \
- debug: '["",{"text":"🧪 ","color":"#BA76D6","extra":["[",{"storage":"bs:in","nbt":"log.namespace"},"] ",{"storage":"bs:in","nbt":"log.tag","color":"gray"}],"hoverEvent":{"action":"show_text","contents":["",{"text":"🧪 [DEBUG]\\n","color":"#BA76D6"},{"text":"Timestamp: ","color":"gray"},{"storage":"bs:const","nbt":"log.time_hmst","interpret":true},"\\n",{"text":"Function: ","color":"gray"},{"nbt":"log.path","storage":"bs:in"}]}},{"text":" > ","color":"gray"},{"storage":"bs:in","nbt":"log.message","interpret":true}]', \
- info: '["",{"text":"ℹ ","color":"#43A8EC","extra":["[",{"storage":"bs:in","nbt":"log.namespace"},"] ",{"storage":"bs:in","nbt":"log.tag","color":"gray"}],"hoverEvent":{"action":"show_text","contents":["",{"text":"ℹ [INFO]\\n","color":"#43A8EC"},{"text":"Timestamp: ","color":"gray"},{"storage":"bs:const","nbt":"log.time_hmst","interpret":true},"\\n",{"text":"Function: ","color":"gray"},{"nbt":"log.path","storage":"bs:in"}]}},{"text":" > ","color":"gray"},{"storage":"bs:in","nbt":"log.message","interpret":true}]', \
- warn: '["",{"text":"⚠ ","color":"#F3B512","extra":["[",{"storage":"bs:in","nbt":"log.namespace"},"] ",{"storage":"bs:in","nbt":"log.tag","color":"gray"}],"hoverEvent":{"action":"show_text","contents":["",{"text":"⚠ [WARN]\\n","color":"#F3B512"},{"text":"Timestamp: ","color":"gray"},{"storage":"bs:const","nbt":"log.time_hmst","interpret":true},"\\n",{"text":"Function: ","color":"gray"},{"nbt":"log.path","storage":"bs:in"}]}},{"text":" > ","color":"gray"},{"storage":"bs:in","nbt":"log.message","interpret":true}]', \
- error: '["",{"text":"❌ ","color":"#E84635","extra":["[",{"storage":"bs:in","nbt":"log.namespace"},"] ",{"storage":"bs:in","nbt":"log.tag","color":"gray"}],"hoverEvent":{"action":"show_text","contents":["",{"text":"❌ [ERROR]\\n","color":"#E84635"},{"text":"Timestamp: ","color":"gray"},{"storage":"bs:const","nbt":"log.time_hmst","interpret":true},"\\n",{"text":"Function: ","color":"gray"},{"nbt":"log.path","storage":"bs:in"}]}},{"text":" > ","color":"gray"},{"storage":"bs:in","nbt":"log.message","interpret":true}]', \
-}
-
-data modify storage bs:const log.messages[{namespaces: ["bs"]}].format set value { \
- debug: '["",{"text":"🧪 ","color":"#BA76D6","extra":["[",{"storage":"bs:in","nbt":"log.namespace"},"] ",{"storage":"bs:in","nbt":"log.tag","color":"gray"}],"hoverEvent":{"action":"show_text","contents":["",{"text":"🧪 [DEBUG] \\n","color":"#BA76D6"},{"text":"Timestamp: ","color":"gray"},{"storage":"bs:const","nbt":"log.time_hmst","interpret":true},"\\n",{"text":"Function: ","color":"gray"},{"nbt":"log.path","storage":"bs:in"}]}},{"text":" > ","color":"gray"},{"storage":"bs:in","nbt":"log.message","interpret":true}]', \
- info: '["",{"text":"ℹ ","color":"#43A8EC","extra":["[",{"storage":"bs:in","nbt":"log.namespace"},"] ",{"storage":"bs:in","nbt":"log.tag","color":"gray"}],"hoverEvent":{"action":"show_text","contents":["",{"text":"ℹ [INFO] \\n","color":"#43A8EC"},{"text":"Timestamp: ","color":"gray"},{"storage":"bs:const","nbt":"log.time_hmst","interpret":true},"\\n",{"text":"Function: ","color":"gray"},{"nbt":"log.path","storage":"bs:in"}]}},{"text":" > ","color":"gray"},{"storage":"bs:in","nbt":"log.message","interpret":true}]', \
- warn: '["",{"text":"⚠ ","color":"#F3B512","extra":["[",{"storage":"bs:in","nbt":"log.namespace"},"] ",{"storage":"bs:in","nbt":"log.tag","color":"gray"}],"hoverEvent":{"action":"show_text","contents":["",{"text":"⚠ [WARN] \\n","color":"#F3B512"},{"text":"Timestamp: ","color":"gray"},{"storage":"bs:const","nbt":"log.time_hmst","interpret":true},"\\n",{"text":"Function: ","color":"gray"},{"nbt":"log.path","storage":"bs:in"}]}},{"text":" > ","color":"gray"},{"storage":"bs:in","nbt":"log.message","interpret":true}]', \
- error: '["",{"text":"❌ ","color":"#E84635","extra":["[",{"storage":"bs:in","nbt":"log.namespace"},"] ",{"storage":"bs:in","nbt":"log.tag","color":"gray"}],"hoverEvent":{"action":"show_text","contents":["",{"text":"❌ [ERROR] \\n","color":"#E84635"},{"text":"Timestamp: ","color":"gray"},{"storage":"bs:const","nbt":"log.time_hmst","interpret":true},"\\n",{"text":"Function: ","color":"gray"},{"nbt":"log.path","storage":"bs:in"}]}},{"text":" > ","color":"gray"},{"storage":"bs:in","nbt":"log.message","interpret":true}]', \
-}
diff --git a/datapacks/Bookshelf Dev/data/bs.log/function/__unload__.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/function/__unload__.mcfunction
deleted file mode 100644
index d9cdaa1c43..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/function/__unload__.mcfunction
+++ /dev/null
@@ -1,28 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/log.html
-# ------------------------------------------------------------------------------------------------------------
-
-kill B5-0-0-0-2
-setblock -30000000 0 1605 minecraft:air
-forceload remove -30000000 1600
-
-scoreboard objectives remove bs.in
-scoreboard objectives remove bs.ctx
-scoreboard objectives remove bs.data
-
-data remove storage bs:in log
-data remove storage bs:data log
-data remove storage bs:const log
diff --git a/datapacks/Bookshelf Dev/data/bs.log/function/history/clear.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/function/history/clear.mcfunction
deleted file mode 100644
index a4d0cbd3fb..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/function/history/clear.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#history
-# ------------------------------------------------------------------------------------------------------------
-
-$data remove storage bs:data log.history[$(with)]
diff --git a/datapacks/Bookshelf Dev/data/bs.log/function/history/show.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/function/history/show.mcfunction
deleted file mode 100644
index 2a7703f545..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/function/history/show.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#history
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data log.messages set value []
-$data modify storage bs:data log.messages append from storage bs:data log.history[$(with)].message
-execute if data storage bs:data log.messages[0] run tellraw @s {"storage": "bs:data", "nbt": "log.messages[]", "separator": "\n", "interpret": true}
-execute unless data storage bs:data log.messages[0] run tellraw @s {"text": "No log entries to show…","color":"gray"}
diff --git a/datapacks/Bookshelf Dev/data/bs.log/function/severity/error.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/function/severity/error.mcfunction
deleted file mode 100644
index 5c19c7260c..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/function/severity/error.mcfunction
+++ /dev/null
@@ -1,44 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#error
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:in log merge value {severity: "error", namespace: "$(namespace)", tag: "$(tag)", path: "$(path)", message: '$(message)'}
-
-data modify storage bs:data log.message set from storage bs:const log.messages[{default: true}].format.error
-$data modify storage bs:data log.message set from storage bs:const log.messages[{namespaces: ["$(namespace)"]}].format.error
-
-$execute as @a unless entity @s[ \
- tag=!$(namespace).log.$(tag).debug, \
- tag=!$(namespace).log.$(tag).info, \
- tag=!$(namespace).log.$(tag).warn, \
- tag=!$(namespace).log.$(tag).error, \
- tag=!$(namespace).log._.debug, \
- tag=!$(namespace).log._.info, \
- tag=!$(namespace).log._.warn, \
- tag=!$(namespace).log._.error, \
- tag=!$(namespace).log._._, \
- tag=!$(namespace).log.$(tag)._, \
- tag=!_.log.$(tag).debug, \
- tag=!_.log.$(tag).info, \
- tag=!_.log.$(tag).warn, \
- tag=!_.log.$(tag).error, \
- tag=!_.log._.debug, \
- tag=!_.log._.info, \
- tag=!_.log._.warn, \
- tag=!_.log._.error, \
- tag=!_.log.$(tag)._, \
- tag=!_.log._._ \
-] run tellraw @s {"storage": "bs:data", "nbt": "log.message", "interpret": true}
diff --git a/datapacks/Bookshelf Dev/data/bs.log/function/time/get.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/function/time/get.mcfunction
deleted file mode 100644
index e92f46a7de..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/function/time/get.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:in log.hours set string storage bs:data log.time 0 2
-data modify storage bs:in log.minutes set string storage bs:data log.time 3 5
-data modify storage bs:in log.seconds set string storage bs:data log.time 6 8
-
-execute store result storage bs:in log.gametime int 1 store result score #t bs.ctx run time query gametime
-execute store result storage bs:in log.ticks int .99999999999 run scoreboard players operation #t bs.ctx -= #log.gametime bs.data
-execute if score #t bs.ctx matches ..10 run function bs.log:time/ticks/format with storage bs:in log
-execute if score #t bs.ctx matches 11.. run function bs.log:time/ticks/stringify with storage bs:in log
diff --git a/datapacks/Bookshelf Dev/data/bs.log/function/time/ticks/format.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/function/time/ticks/format.mcfunction
deleted file mode 100644
index 100d41e6fd..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/function/time/ticks/format.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:in log.ticks set value "0$(ticks)"
diff --git a/datapacks/Bookshelf Dev/data/bs.log/tags/function/exclusive_load.json b/datapacks/Bookshelf Dev/data/bs.log/tags/function/exclusive_load.json
deleted file mode 100644
index 893559d2c4..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.log:load"
- ]
-}
diff --git a/datapacks/Bookshelf Dev/data/bs.log/tags/function/help.json b/datapacks/Bookshelf Dev/data/bs.log/tags/function/help.json
deleted file mode 100644
index d508707b0a..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.log:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf Dev/data/bs.log/tags/function/load.json b/datapacks/Bookshelf Dev/data/bs.log/tags/function/load.json
deleted file mode 100644
index a893c8962a..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/tags/function/load.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.log:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf Dev/data/bs.log/tags/function/tick.json b/datapacks/Bookshelf Dev/data/bs.log/tags/function/tick.json
deleted file mode 100644
index 1e9f725e78..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/tags/function/tick.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.log:__tick__"
- ]
-}
diff --git a/datapacks/Bookshelf Dev/data/bs.log/tags/function/unload.json b/datapacks/Bookshelf Dev/data/bs.log/tags/function/unload.json
deleted file mode 100644
index 781e033810..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.log:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf Dev/data/bs.log/test/__boot__.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/test/__boot__.mcfunction
deleted file mode 100644
index 36d656d14d..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.log
-# @beforebatch function #bs.log:exclusive_load
diff --git a/datapacks/Bookshelf Dev/data/bs.log/test/debug/hidden.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/test/debug/hidden.mcfunction
deleted file mode 100644
index 10f900eaf1..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/test/debug/hidden.mcfunction
+++ /dev/null
@@ -1,6 +0,0 @@
-# Debug logs are not shown when missing tag
-# @batch bs.log
-# @dummy
-
-function #bs.log:debug { namespace: "bs.foo", path: "bs.foo:bar", feature: "bar", message: '"Hidden debug log message"' }
-assert not chat "Hidden debug log message"
diff --git a/datapacks/Bookshelf Dev/data/bs.log/test/debug/visible.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/test/debug/visible.mcfunction
deleted file mode 100644
index 889541f10d..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/test/debug/visible.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Debug logs are shown when having tag
-# @batch bs.log
-# @dummy
-
-tag @s add bs.foo.log.bar.debug
-function #bs.log:debug { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Debug tag debug log message"' }
-assert chat "Debug tag debug log message"
-tag @s remove bs.foo.log.bar.debug
diff --git a/datapacks/Bookshelf Dev/data/bs.log/test/debug/wildcards.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/test/debug/wildcards.mcfunction
deleted file mode 100644
index b0e6e25f07..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/test/debug/wildcards.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# Debug logs are shown when having tag
-# @batch bs.log
-# @dummy
-
-tag @s add bs.foo.log.bar._
-function #bs.log:debug { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Level wildcard debug log message"' }
-assert chat "Level wildcard debug log message"
-tag @s remove bs.foo.log.bar._
-
-tag @s add bs.foo.log._.debug
-function #bs.log:debug { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Tag wildcard debug log message"' }
-assert chat "Tag wildcard debug log message"
-tag @s remove bs.foo.log._.debug
-
-tag @s add bs.foo.log._._
-function #bs.log:debug { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Tag and level wildcards debug log message"' }
-assert chat "Tag and level wildcards debug log message"
-tag @s remove bs.foo.log._._
-
-tag @s add _.log._._
-function #bs.log:debug { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"All wildcards debug log message"' }
-assert chat "All wildcards debug log message"
-tag @s remove _.log._._
diff --git a/datapacks/Bookshelf Dev/data/bs.log/test/error/hidden.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/test/error/hidden.mcfunction
deleted file mode 100644
index 89d2ae6cc4..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/test/error/hidden.mcfunction
+++ /dev/null
@@ -1,6 +0,0 @@
-# Error logs are not shown when missing tag
-# @batch bs.log
-# @dummy
-
-function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Hidden error log message"' }
-assert not chat "Hidden error log message"
diff --git a/datapacks/Bookshelf Dev/data/bs.log/test/error/visible.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/test/error/visible.mcfunction
deleted file mode 100644
index 5c23f698ef..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/test/error/visible.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# Error logs are shown when having tag
-# @batch bs.log
-# @dummy
-
-tag @s add bs.foo.log.bar.debug
-function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Debug tag error log message"' }
-assert chat "Debug tag error log message"
-tag @s remove bs.foo.log.bar.debug
-
-tag @s add bs.foo.log.bar.info
-function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Info tag error log message"' }
-assert chat "Info tag error log message"
-tag @s remove bs.foo.log.bar.info
-
-tag @s add bs.foo.log.bar.warn
-function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Warn tag error log message"' }
-assert chat "Warn tag error log message"
-tag @s remove bs.foo.log.bar.warn
-
-tag @s add bs.foo.log.bar.error
-function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Error tag error log message"' }
-assert chat "Error tag error log message"
-tag @s remove bs.foo.log.bar.error
diff --git a/datapacks/Bookshelf Dev/data/bs.log/test/error/wildcards.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/test/error/wildcards.mcfunction
deleted file mode 100644
index b14e0c8eab..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/test/error/wildcards.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# Error logs are shown when having tag
-# @batch bs.log
-# @dummy
-
-tag @s add bs.foo.log.bar._
-function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Level wildcard error log message"' }
-assert chat "Level wildcard error log message"
-tag @s remove bs.foo.log.bar._
-
-tag @s add bs.foo.log._.error
-function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Tag wildcard error log message"' }
-assert chat "Tag wildcard error log message"
-tag @s remove bs.foo.log._.error
-
-tag @s add bs.foo.log._._
-function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Tag and level wildcards error log message"' }
-assert chat "Tag and level wildcards error log message"
-tag @s remove bs.foo.log._._
-
-tag @s add _.log._._
-function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"All wildcards error log message"' }
-assert chat "All wildcards error log message"
-tag @s remove _.log._._
-
diff --git a/datapacks/Bookshelf Dev/data/bs.log/test/history/clear.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/test/history/clear.mcfunction
deleted file mode 100644
index e1cf86c742..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/test/history/clear.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Clear history works as expected
-# @batch bs.log
-
-function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "history", message: '"History warn log message"' }
-function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "history", message: '"History error log message"' }
-
-function #bs.log:clear_history {with:{severity:"error"}}
-
-assert data storage bs:data log.history[{severity:"warn"}]
-assert not data storage bs:data log.history[{severity:"error"}]
diff --git a/datapacks/Bookshelf Dev/data/bs.log/test/history/show.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/test/history/show.mcfunction
deleted file mode 100644
index 50ff66bae3..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/test/history/show.mcfunction
+++ /dev/null
@@ -1,14 +0,0 @@
-# Show history filter as expected
-# @batch bs.log
-# @dummy
-
-await entity B5-0-0-0-2
-
-function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "history", message: '"History warn log message"' }
-function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "history", message: '"History error log message"' }
-assert not chat "History warn log message"
-assert not chat "History error log message"
-
-function #bs.log:history {with:{tag:"history",severity:"error"}}
-assert not chat "History warn log message"
-assert chat "History error log message"
diff --git a/datapacks/Bookshelf Dev/data/bs.log/test/info/hidden.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/test/info/hidden.mcfunction
deleted file mode 100644
index b094761f7d..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/test/info/hidden.mcfunction
+++ /dev/null
@@ -1,6 +0,0 @@
-# Info logs are not shown when missing tag
-# @batch bs.log
-# @dummy
-
-function #bs.log:info { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Hidden info log message"' }
-assert not chat "Hidden info log message"
diff --git a/datapacks/Bookshelf Dev/data/bs.log/test/info/visible.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/test/info/visible.mcfunction
deleted file mode 100644
index cae69c4f9d..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/test/info/visible.mcfunction
+++ /dev/null
@@ -1,13 +0,0 @@
-# Info logs are shown when having tag
-# @batch bs.log
-# @dummy
-
-tag @s add bs.foo.log.bar.debug
-function #bs.log:info { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Debug tag info log message"' }
-assert chat "Debug tag info log message"
-tag @s remove bs.foo.log.bar.debug
-
-tag @s add bs.foo.log.bar.info
-function #bs.log:info { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Info tag info log message"' }
-assert chat "Info tag info log message"
-tag @s remove bs.foo.log.bar.info
diff --git a/datapacks/Bookshelf Dev/data/bs.log/test/info/wildcards.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/test/info/wildcards.mcfunction
deleted file mode 100644
index a5d1a7f8b3..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/test/info/wildcards.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# Info logs are shown when having tag
-# @batch bs.log
-# @dummy
-
-tag @s add bs.foo.log.bar._
-function #bs.log:info { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Level wildcard info log message"' }
-assert chat "Level wildcard info log message"
-tag @s remove bs.foo.log.bar._
-
-tag @s add bs.foo.log._.info
-function #bs.log:info { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Tag wildcard info log message"' }
-assert chat "Tag wildcard info log message"
-tag @s remove bs.foo.log._.info
-
-tag @s add bs.foo.log._._
-function #bs.log:info { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Tag and level wildcards info log message"' }
-assert chat "Tag and level wildcards info log message"
-tag @s remove bs.foo.log._._
-
-tag @s add _.log._._
-function #bs.log:info { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"All wildcards info log message"' }
-assert chat "All wildcards info log message"
-tag @s remove _.log._._
diff --git a/datapacks/Bookshelf Dev/data/bs.log/test/warn/hidden.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/test/warn/hidden.mcfunction
deleted file mode 100644
index ab5f4caa4d..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/test/warn/hidden.mcfunction
+++ /dev/null
@@ -1,6 +0,0 @@
-# Warn logs are not shown when missing tag
-# @batch bs.log
-# @dummy
-
-function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Hidden warn log message"' }
-assert not chat "Hidden warn log message"
diff --git a/datapacks/Bookshelf Dev/data/bs.log/test/warn/visible.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/test/warn/visible.mcfunction
deleted file mode 100644
index 185b8ba8c7..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/test/warn/visible.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# Warn logs are shown when having tag
-# @batch bs.log
-# @dummy
-
-tag @s add bs.foo.log.bar.debug
-function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Debug tag warn log message"' }
-assert chat "Debug tag warn log message"
-tag @s remove bs.foo.log.bar.debug
-
-tag @s add bs.foo.log.bar.info
-function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Info tag warn log message"' }
-assert chat "Info tag warn log message"
-tag @s remove bs.foo.log.bar.info
-
-tag @s add bs.foo.log.bar.warn
-function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Warn tag warn log message"' }
-assert chat "Warn tag warn log message"
-tag @s remove bs.foo.log.bar.warn
diff --git a/datapacks/Bookshelf Dev/data/bs.log/test/warn/wildcards.mcfunction b/datapacks/Bookshelf Dev/data/bs.log/test/warn/wildcards.mcfunction
deleted file mode 100644
index 664bfd9e6a..0000000000
--- a/datapacks/Bookshelf Dev/data/bs.log/test/warn/wildcards.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# Warn logs are shown when having tag
-# @batch bs.log
-# @dummy
-
-tag @s add bs.foo.log.bar._
-function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Level wildcard warn log message"' }
-assert chat "Level wildcard warn log message"
-tag @s remove bs.foo.log.bar._
-
-tag @s add bs.foo.log._.warn
-function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Tag wildcard warn log message"' }
-assert chat "Tag wildcard warn log message"
-tag @s remove bs.foo.log._.warn
-
-tag @s add bs.foo.log._._
-function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Tag and level wildcards warn log message"' }
-assert chat "Tag and level wildcards warn log message"
-tag @s remove bs.foo.log._._
-
-tag @s add _.log._._
-function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"All wildcards warn log message"' }
-assert chat "All wildcards warn log message"
-tag @s remove _.log._._
diff --git a/datapacks/Bookshelf Dev/data/minecraft/tags/function/load.json b/datapacks/Bookshelf Dev/data/minecraft/tags/function/load.json
deleted file mode 100644
index 2abe6e2db5..0000000000
--- a/datapacks/Bookshelf Dev/data/minecraft/tags/function/load.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "values": [
- {
- "id": "#bs.dump:load",
- "required": false
- },
- {
- "id": "#bs.log:load",
- "required": false
- }
- ]
-}
diff --git a/datapacks/Bookshelf Dev/data/minecraft/tags/function/tick.json b/datapacks/Bookshelf Dev/data/minecraft/tags/function/tick.json
deleted file mode 100644
index 214c0b7651..0000000000
--- a/datapacks/Bookshelf Dev/data/minecraft/tags/function/tick.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "values": [
- {
- "id": "#bs.log:tick",
- "required": false
- }
- ]
-}
diff --git a/datapacks/Bookshelf Dev/data/minecraft/tags/function/unload.json b/datapacks/Bookshelf Dev/data/minecraft/tags/function/unload.json
deleted file mode 100644
index b0ff27f2b9..0000000000
--- a/datapacks/Bookshelf Dev/data/minecraft/tags/function/unload.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "values": [
- {
- "id": "#bs.dump:unload",
- "required": false
- },
- {
- "id": "#bs.log:unload",
- "required": false
- }
- ]
-}
diff --git a/datapacks/Bookshelf Dev/pack.mcmeta b/datapacks/Bookshelf Dev/pack.mcmeta
deleted file mode 100644
index e8d7c4284c..0000000000
--- a/datapacks/Bookshelf Dev/pack.mcmeta
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "id": "bs",
- "pack": {
- "pack_format": 57,
- "description": "Bookshelf Development Kit - Library designed for mapmakers"
- }
-}
diff --git a/datapacks/Bookshelf Examples/pack.mcmeta b/datapacks/Bookshelf Examples/pack.mcmeta
deleted file mode 100644
index e342fa15b8..0000000000
--- a/datapacks/Bookshelf Examples/pack.mcmeta
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "pack": {
- "pack_format": 57,
- "description": "Bookshelf Examples - Library designed for mapmakers"
- }
-}
diff --git a/datapacks/Bookshelf World/pack.mcmeta b/datapacks/Bookshelf World/pack.mcmeta
deleted file mode 100644
index a3772466cf..0000000000
--- a/datapacks/Bookshelf World/pack.mcmeta
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "pack": {
- "pack_format": 57,
- "description": "Bookshelf Sandbox World - Library designed for mapmakers"
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.biome/.metadata/generated/features.json
deleted file mode 100644
index 362c223a15..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/.metadata/generated/features.json
+++ /dev/null
@@ -1,35 +0,0 @@
-[
- {
- "name": "get_biome",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html#get-biome",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/04/22",
- "version": "1.20.5"
- },
- "updated": {
- "date": "2024/04/22",
- "version": "1.20.5"
- }
- },
- {
- "name": "get_temperature",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html#get-temperature",
- "authors": [
- "theogiraudet"
- ],
- "contributors": [
- "Aksiome"
- ],
- "created": {
- "date": "2018/08/16",
- "version": "1.14"
- },
- "updated": {
- "date": "2024/04/22",
- "version": "1.20.5"
- }
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.biome/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.biome/.metadata/generated/module.json
deleted file mode 100644
index 383234b7af..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/.metadata/generated/module.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "name": "bs.biome",
- "display_name": "Biome",
- "description": "Comprehensive information and tools related to biome properties.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "contributors": [
- "Aksiome"
- ],
- "features": [
- "bs.biome:get_biome",
- "bs.biome:get_temperature"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/.metadata/module.json b/datapacks/Bookshelf/data/bs.biome/.metadata/module.json
deleted file mode 100644
index c5ef8eb508..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.biome",
- "display_name": "Biome",
- "description": "Comprehensive information and tools related to biome properties.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html"
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.biome/function/__help__.mcfunction
deleted file mode 100644
index 7138888543..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.biome documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.biome/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.biome/function/__load__.mcfunction
deleted file mode 100644
index fec0720d45..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/function/__load__.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
-
-scoreboard players set 125000 bs.const 125000
-
-function bs.biome:load/biomes_table
diff --git a/datapacks/Bookshelf/data/bs.biome/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.biome/function/__unload__.mcfunction
deleted file mode 100644
index d21476d912..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/function/__unload__.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard objectives remove bs.const
-scoreboard objectives remove bs.ctx
-scoreboard objectives remove bs.out
-
-data remove storage bs:out biome
-data remove storage bs:const biome
diff --git a/datapacks/Bookshelf/data/bs.biome/function/get/biome/get_biome.mcfunction b/datapacks/Bookshelf/data/bs.biome/function/get/biome/get_biome.mcfunction
deleted file mode 100644
index 8c339697d5..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/function/get/biome/get_biome.mcfunction
+++ /dev/null
@@ -1,28 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html#get-biome
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players set #i bs.ctx 0
-execute if biome ~ ~ ~ #bs.biome:type/group_1 run scoreboard players add #i bs.ctx 1
-execute if biome ~ ~ ~ #bs.biome:type/group_2 run scoreboard players add #i bs.ctx 2
-execute if biome ~ ~ ~ #bs.biome:type/group_4 run scoreboard players add #i bs.ctx 4
-execute if biome ~ ~ ~ #bs.biome:type/group_8 run scoreboard players add #i bs.ctx 8
-execute if biome ~ ~ ~ #bs.biome:type/group_16 run scoreboard players add #i bs.ctx 16
-execute if biome ~ ~ ~ #bs.biome:type/group_32 run scoreboard players add #i bs.ctx 32
-execute if biome ~ ~ ~ #bs.biome:type/group_64 run scoreboard players add #i bs.ctx 64
-
-execute store result storage bs:ctx y short 1 run scoreboard players remove #i bs.ctx 1
-execute unless score #i bs.ctx matches -1 run function bs.biome:get/biome/lookup with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.biome/function/get/biome/lookup.mcfunction b/datapacks/Bookshelf/data/bs.biome/function/get/biome/lookup.mcfunction
deleted file mode 100644
index 708f90dc05..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/function/get/biome/lookup.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:out biome set from storage bs:const biome[$(y)]
diff --git a/datapacks/Bookshelf/data/bs.biome/function/get/temperature/get_temperature.mcfunction b/datapacks/Bookshelf/data/bs.biome/function/get/temperature/get_temperature.mcfunction
deleted file mode 100644
index 104bb2ecbf..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/function/get/temperature/get_temperature.mcfunction
+++ /dev/null
@@ -1,26 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html#get-temperature
-# ------------------------------------------------------------------------------------------------------------
-
-function #bs.biome:get_biome
-execute store result score #t bs.ctx run data get storage bs:out biome.temperature 100000000
-
-execute summon minecraft:marker run function bs.biome:get/temperature/variation
-execute if score #v bs.ctx matches 1.. run scoreboard players operation #v bs.ctx *= 125000 bs.const
-execute if score #v bs.ctx matches 1.. run scoreboard players operation #t bs.ctx -= #v bs.ctx
-execute store result storage bs:ctx y double .00000001 run scoreboard players get #t bs.ctx
-
-$return run execute store result score $biome.get_temperature bs.out run data get storage bs:ctx y $(scale)
diff --git a/datapacks/Bookshelf/data/bs.biome/function/load/biomes_table.mcfunction b/datapacks/Bookshelf/data/bs.biome/function/load/biomes_table.mcfunction
deleted file mode 100644
index 29f7c721da..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/function/load/biomes_table.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# This file was automatically generated, do not edit it
-data modify storage bs:const biome set value [{type:"minecraft:badlands",temperature:2.0,has_precipitation:0b},{type:"minecraft:bamboo_jungle",temperature:0.95,has_precipitation:1b},{type:"minecraft:basalt_deltas",temperature:2.0,has_precipitation:0b},{type:"minecraft:beach",temperature:0.8,has_precipitation:1b},{type:"minecraft:birch_forest",temperature:0.6,has_precipitation:1b},{type:"minecraft:cherry_grove",temperature:0.5,has_precipitation:1b},{type:"minecraft:cold_ocean",temperature:0.5,has_precipitation:1b},{type:"minecraft:crimson_forest",temperature:2.0,has_precipitation:0b},{type:"minecraft:dark_forest",temperature:0.7,has_precipitation:1b},{type:"minecraft:deep_cold_ocean",temperature:0.5,has_precipitation:1b},{type:"minecraft:deep_dark",temperature:0.8,has_precipitation:1b},{type:"minecraft:deep_frozen_ocean",temperature:0.5,has_precipitation:1b},{type:"minecraft:deep_lukewarm_ocean",temperature:0.5,has_precipitation:1b},{type:"minecraft:deep_ocean",temperature:0.5,has_precipitation:1b},{type:"minecraft:desert",temperature:2.0,has_precipitation:0b},{type:"minecraft:dripstone_caves",temperature:0.8,has_precipitation:1b},{type:"minecraft:end_barrens",temperature:0.5,has_precipitation:0b},{type:"minecraft:end_highlands",temperature:0.5,has_precipitation:0b},{type:"minecraft:end_midlands",temperature:0.5,has_precipitation:0b},{type:"minecraft:eroded_badlands",temperature:2.0,has_precipitation:0b},{type:"minecraft:flower_forest",temperature:0.7,has_precipitation:1b},{type:"minecraft:forest",temperature:0.7,has_precipitation:1b},{type:"minecraft:frozen_ocean",temperature:0.0,has_precipitation:1b},{type:"minecraft:frozen_peaks",temperature:-0.7,has_precipitation:1b},{type:"minecraft:frozen_river",temperature:0.0,has_precipitation:1b},{type:"minecraft:grove",temperature:-0.2,has_precipitation:1b},{type:"minecraft:ice_spikes",temperature:0.0,has_precipitation:1b},{type:"minecraft:jagged_peaks",temperature:-0.7,has_precipitation:1b},{type:"minecraft:jungle",temperature:0.95,has_precipitation:1b},{type:"minecraft:lukewarm_ocean",temperature:0.5,has_precipitation:1b},{type:"minecraft:lush_caves",temperature:0.5,has_precipitation:1b},{type:"minecraft:mangrove_swamp",temperature:0.8,has_precipitation:1b},{type:"minecraft:meadow",temperature:0.5,has_precipitation:1b},{type:"minecraft:mushroom_fields",temperature:0.9,has_precipitation:1b},{type:"minecraft:nether_wastes",temperature:2.0,has_precipitation:0b},{type:"minecraft:ocean",temperature:0.5,has_precipitation:1b},{type:"minecraft:old_growth_birch_forest",temperature:0.6,has_precipitation:1b},{type:"minecraft:old_growth_pine_taiga",temperature:0.3,has_precipitation:1b},{type:"minecraft:old_growth_spruce_taiga",temperature:0.25,has_precipitation:1b},{type:"minecraft:plains",temperature:0.8,has_precipitation:1b},{type:"minecraft:river",temperature:0.5,has_precipitation:1b},{type:"minecraft:savanna",temperature:2.0,has_precipitation:0b},{type:"minecraft:savanna_plateau",temperature:2.0,has_precipitation:0b},{type:"minecraft:small_end_islands",temperature:0.5,has_precipitation:0b},{type:"minecraft:snowy_beach",temperature:0.05,has_precipitation:1b},{type:"minecraft:snowy_plains",temperature:0.0,has_precipitation:1b},{type:"minecraft:snowy_slopes",temperature:-0.3,has_precipitation:1b},{type:"minecraft:snowy_taiga",temperature:-0.5,has_precipitation:1b},{type:"minecraft:soul_sand_valley",temperature:2.0,has_precipitation:0b},{type:"minecraft:sparse_jungle",temperature:0.95,has_precipitation:1b},{type:"minecraft:stony_peaks",temperature:1.0,has_precipitation:1b},{type:"minecraft:stony_shore",temperature:0.2,has_precipitation:1b},{type:"minecraft:sunflower_plains",temperature:0.8,has_precipitation:1b},{type:"minecraft:swamp",temperature:0.8,has_precipitation:1b},{type:"minecraft:taiga",temperature:0.25,has_precipitation:1b},{type:"minecraft:the_end",temperature:0.5,has_precipitation:0b},{type:"minecraft:the_void",temperature:0.5,has_precipitation:0b},{type:"minecraft:warm_ocean",temperature:0.5,has_precipitation:1b},{type:"minecraft:warped_forest",temperature:2.0,has_precipitation:0b},{type:"minecraft:windswept_forest",temperature:0.2,has_precipitation:1b},{type:"minecraft:windswept_gravelly_hills",temperature:0.2,has_precipitation:1b},{type:"minecraft:windswept_hills",temperature:0.2,has_precipitation:1b},{type:"minecraft:windswept_savanna",temperature:2.0,has_precipitation:0b},{type:"minecraft:wooded_badlands",temperature:2.0,has_precipitation:0b}]
diff --git a/datapacks/Bookshelf/data/bs.biome/predicate/can_rain.json b/datapacks/Bookshelf/data/bs.biome/predicate/can_rain.json
deleted file mode 100644
index f3b7a5d150..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/predicate/can_rain.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "condition": "minecraft:all_of",
- "terms": [
- {
- "condition": "minecraft:location_check",
- "predicate": {
- "biomes": "#bs.biome:has_precipitation"
- }
- },
- {
- "condition": "minecraft:inverted",
- "term": {
- "condition": "minecraft:reference",
- "name": "bs.biome:can_snow"
- }
- }
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/predicate/can_snow.json b/datapacks/Bookshelf/data/bs.biome/predicate/can_snow.json
deleted file mode 100644
index 91a92622af..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/predicate/can_snow.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
- "condition": "minecraft:any_of",
- "terms": [
- {
- "condition": "minecraft:location_check",
- "predicate": {
- "position": {
- "y": {
- "min": -2147483648
- }
- },
- "biomes": [
- "minecraft:frozen_ocean",
- "minecraft:frozen_peaks",
- "minecraft:frozen_river",
- "minecraft:grove",
- "minecraft:ice_spikes",
- "minecraft:jagged_peaks",
- "minecraft:snowy_beach",
- "minecraft:snowy_plains",
- "minecraft:snowy_slopes",
- "minecraft:snowy_taiga"
- ]
- }
- },
- {
- "condition": "minecraft:location_check",
- "predicate": {
- "position": {
- "y": {
- "min": 120
- }
- },
- "biomes": [
- "minecraft:stony_shore",
- "minecraft:windswept_forest",
- "minecraft:windswept_gravelly_hills",
- "minecraft:windswept_hills"
- ]
- }
- },
- {
- "condition": "minecraft:location_check",
- "predicate": {
- "position": {
- "y": {
- "min": 160
- }
- },
- "biomes": [
- "minecraft:old_growth_spruce_taiga",
- "minecraft:taiga"
- ]
- }
- },
- {
- "condition": "minecraft:location_check",
- "predicate": {
- "position": {
- "y": {
- "min": 200
- }
- },
- "biomes": [
- "minecraft:old_growth_pine_taiga"
- ]
- }
- }
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/predicate/has_precipitation.json b/datapacks/Bookshelf/data/bs.biome/predicate/has_precipitation.json
deleted file mode 100644
index 331e172dec..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/predicate/has_precipitation.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "condition": "minecraft:location_check",
- "predicate": {
- "biomes": "#bs.biome:has_precipitation"
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.biome/tags/function/exclusive_load.json
deleted file mode 100644
index 127ddf91c6..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.biome:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/tags/function/get_biome.json b/datapacks/Bookshelf/data/bs.biome/tags/function/get_biome.json
deleted file mode 100644
index 217a66129b..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/tags/function/get_biome.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html#get-biome",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/04/22",
- "minecraft_version": "1.20.5"
- },
- "updated": {
- "date": "2024/04/22",
- "minecraft_version": "1.20.5"
- }
- },
- "values": [
- "bs.biome:get/biome/get_biome"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/tags/function/get_temperature.json b/datapacks/Bookshelf/data/bs.biome/tags/function/get_temperature.json
deleted file mode 100644
index 41b52f4715..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/tags/function/get_temperature.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html#get-temperature",
- "authors": [
- "theogiraudet"
- ],
- "contributors": [
- "Aksiome"
- ],
- "created": {
- "date": "2018/08/16",
- "minecraft_version": "1.14"
- },
- "updated": {
- "date": "2024/04/22",
- "minecraft_version": "1.20.5"
- }
- },
- "values": [
- "bs.biome:get/temperature/get_temperature"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/tags/function/help.json b/datapacks/Bookshelf/data/bs.biome/tags/function/help.json
deleted file mode 100644
index 505b3e2fba..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.biome:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/tags/function/load.json b/datapacks/Bookshelf/data/bs.biome/tags/function/load.json
deleted file mode 100644
index a9c5f9340c..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/tags/function/load.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.biome:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/tags/function/unload.json b/datapacks/Bookshelf/data/bs.biome/tags/function/unload.json
deleted file mode 100644
index a3bfc2920e..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.biome:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/has_precipitation.json b/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/has_precipitation.json
deleted file mode 100644
index b0f4f6f905..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/has_precipitation.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "values": [
- "minecraft:bamboo_jungle",
- "minecraft:beach",
- "minecraft:birch_forest",
- "minecraft:cherry_grove",
- "minecraft:cold_ocean",
- "minecraft:dark_forest",
- "minecraft:deep_cold_ocean",
- "minecraft:deep_dark",
- "minecraft:deep_frozen_ocean",
- "minecraft:deep_lukewarm_ocean",
- "minecraft:deep_ocean",
- "minecraft:dripstone_caves",
- "minecraft:flower_forest",
- "minecraft:forest",
- "minecraft:frozen_ocean",
- "minecraft:frozen_peaks",
- "minecraft:frozen_river",
- "minecraft:grove",
- "minecraft:ice_spikes",
- "minecraft:jagged_peaks",
- "minecraft:jungle",
- "minecraft:lukewarm_ocean",
- "minecraft:lush_caves",
- "minecraft:mangrove_swamp",
- "minecraft:meadow",
- "minecraft:mushroom_fields",
- "minecraft:ocean",
- "minecraft:old_growth_birch_forest",
- "minecraft:old_growth_pine_taiga",
- "minecraft:old_growth_spruce_taiga",
- "minecraft:plains",
- "minecraft:river",
- "minecraft:snowy_beach",
- "minecraft:snowy_plains",
- "minecraft:snowy_slopes",
- "minecraft:snowy_taiga",
- "minecraft:sparse_jungle",
- "minecraft:stony_peaks",
- "minecraft:stony_shore",
- "minecraft:sunflower_plains",
- "minecraft:swamp",
- "minecraft:taiga",
- "minecraft:warm_ocean",
- "minecraft:windswept_forest",
- "minecraft:windswept_gravelly_hills",
- "minecraft:windswept_hills"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_1.json b/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_1.json
deleted file mode 100644
index d66ee6fb1f..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_1.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "values": [
- "minecraft:badlands",
- "minecraft:basalt_deltas",
- "minecraft:birch_forest",
- "minecraft:cold_ocean",
- "minecraft:dark_forest",
- "minecraft:deep_dark",
- "minecraft:deep_lukewarm_ocean",
- "minecraft:desert",
- "minecraft:end_barrens",
- "minecraft:end_midlands",
- "minecraft:flower_forest",
- "minecraft:frozen_ocean",
- "minecraft:frozen_river",
- "minecraft:ice_spikes",
- "minecraft:jungle",
- "minecraft:lush_caves",
- "minecraft:meadow",
- "minecraft:nether_wastes",
- "minecraft:old_growth_birch_forest",
- "minecraft:old_growth_spruce_taiga",
- "minecraft:river",
- "minecraft:savanna_plateau",
- "minecraft:snowy_beach",
- "minecraft:snowy_slopes",
- "minecraft:soul_sand_valley",
- "minecraft:stony_peaks",
- "minecraft:sunflower_plains",
- "minecraft:taiga",
- "minecraft:the_void",
- "minecraft:warped_forest",
- "minecraft:windswept_gravelly_hills",
- "minecraft:windswept_savanna"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_16.json b/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_16.json
deleted file mode 100644
index 2692eab145..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_16.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "values": [
- "minecraft:dripstone_caves",
- "minecraft:end_barrens",
- "minecraft:end_highlands",
- "minecraft:end_midlands",
- "minecraft:eroded_badlands",
- "minecraft:flower_forest",
- "minecraft:forest",
- "minecraft:frozen_ocean",
- "minecraft:frozen_peaks",
- "minecraft:frozen_river",
- "minecraft:grove",
- "minecraft:ice_spikes",
- "minecraft:jagged_peaks",
- "minecraft:jungle",
- "minecraft:lukewarm_ocean",
- "minecraft:lush_caves",
- "minecraft:snowy_taiga",
- "minecraft:soul_sand_valley",
- "minecraft:sparse_jungle",
- "minecraft:stony_peaks",
- "minecraft:stony_shore",
- "minecraft:sunflower_plains",
- "minecraft:swamp",
- "minecraft:taiga",
- "minecraft:the_end",
- "minecraft:the_void",
- "minecraft:warm_ocean",
- "minecraft:warped_forest",
- "minecraft:windswept_forest",
- "minecraft:windswept_gravelly_hills",
- "minecraft:windswept_hills",
- "minecraft:windswept_savanna"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_2.json b/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_2.json
deleted file mode 100644
index 70263f061d..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_2.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "values": [
- "minecraft:bamboo_jungle",
- "minecraft:basalt_deltas",
- "minecraft:cherry_grove",
- "minecraft:cold_ocean",
- "minecraft:deep_cold_ocean",
- "minecraft:deep_dark",
- "minecraft:deep_ocean",
- "minecraft:desert",
- "minecraft:end_highlands",
- "minecraft:end_midlands",
- "minecraft:forest",
- "minecraft:frozen_ocean",
- "minecraft:grove",
- "minecraft:ice_spikes",
- "minecraft:lukewarm_ocean",
- "minecraft:lush_caves",
- "minecraft:mushroom_fields",
- "minecraft:nether_wastes",
- "minecraft:old_growth_pine_taiga",
- "minecraft:old_growth_spruce_taiga",
- "minecraft:savanna",
- "minecraft:savanna_plateau",
- "minecraft:snowy_plains",
- "minecraft:snowy_slopes",
- "minecraft:sparse_jungle",
- "minecraft:stony_peaks",
- "minecraft:swamp",
- "minecraft:taiga",
- "minecraft:warm_ocean",
- "minecraft:warped_forest",
- "minecraft:windswept_hills",
- "minecraft:windswept_savanna"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_32.json b/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_32.json
deleted file mode 100644
index 3a33d8bbf9..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_32.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "values": [
- "minecraft:mangrove_swamp",
- "minecraft:meadow",
- "minecraft:mushroom_fields",
- "minecraft:nether_wastes",
- "minecraft:ocean",
- "minecraft:old_growth_birch_forest",
- "minecraft:old_growth_pine_taiga",
- "minecraft:old_growth_spruce_taiga",
- "minecraft:plains",
- "minecraft:river",
- "minecraft:savanna",
- "minecraft:savanna_plateau",
- "minecraft:small_end_islands",
- "minecraft:snowy_beach",
- "minecraft:snowy_plains",
- "minecraft:snowy_slopes",
- "minecraft:snowy_taiga",
- "minecraft:soul_sand_valley",
- "minecraft:sparse_jungle",
- "minecraft:stony_peaks",
- "minecraft:stony_shore",
- "minecraft:sunflower_plains",
- "minecraft:swamp",
- "minecraft:taiga",
- "minecraft:the_end",
- "minecraft:the_void",
- "minecraft:warm_ocean",
- "minecraft:warped_forest",
- "minecraft:windswept_forest",
- "minecraft:windswept_gravelly_hills",
- "minecraft:windswept_hills",
- "minecraft:windswept_savanna"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_4.json b/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_4.json
deleted file mode 100644
index c07cc36608..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_4.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "values": [
- "minecraft:beach",
- "minecraft:birch_forest",
- "minecraft:cherry_grove",
- "minecraft:cold_ocean",
- "minecraft:deep_frozen_ocean",
- "minecraft:deep_lukewarm_ocean",
- "minecraft:deep_ocean",
- "minecraft:desert",
- "minecraft:eroded_badlands",
- "minecraft:flower_forest",
- "minecraft:forest",
- "minecraft:frozen_ocean",
- "minecraft:jagged_peaks",
- "minecraft:jungle",
- "minecraft:lukewarm_ocean",
- "minecraft:lush_caves",
- "minecraft:ocean",
- "minecraft:old_growth_birch_forest",
- "minecraft:old_growth_pine_taiga",
- "minecraft:old_growth_spruce_taiga",
- "minecraft:small_end_islands",
- "minecraft:snowy_beach",
- "minecraft:snowy_plains",
- "minecraft:snowy_slopes",
- "minecraft:stony_shore",
- "minecraft:sunflower_plains",
- "minecraft:swamp",
- "minecraft:taiga",
- "minecraft:windswept_forest",
- "minecraft:windswept_gravelly_hills",
- "minecraft:windswept_hills",
- "minecraft:windswept_savanna"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_64.json b/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_64.json
deleted file mode 100644
index 3f28a06f72..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_64.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "minecraft:wooded_badlands"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_8.json b/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_8.json
deleted file mode 100644
index 2b0e64c6e3..0000000000
--- a/datapacks/Bookshelf/data/bs.biome/tags/worldgen/biome/type/group_8.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "values": [
- "minecraft:crimson_forest",
- "minecraft:dark_forest",
- "minecraft:deep_cold_ocean",
- "minecraft:deep_dark",
- "minecraft:deep_frozen_ocean",
- "minecraft:deep_lukewarm_ocean",
- "minecraft:deep_ocean",
- "minecraft:desert",
- "minecraft:frozen_peaks",
- "minecraft:frozen_river",
- "minecraft:grove",
- "minecraft:ice_spikes",
- "minecraft:jagged_peaks",
- "minecraft:jungle",
- "minecraft:lukewarm_ocean",
- "minecraft:lush_caves",
- "minecraft:plains",
- "minecraft:river",
- "minecraft:savanna",
- "minecraft:savanna_plateau",
- "minecraft:small_end_islands",
- "minecraft:snowy_beach",
- "minecraft:snowy_plains",
- "minecraft:snowy_slopes",
- "minecraft:the_end",
- "minecraft:the_void",
- "minecraft:warm_ocean",
- "minecraft:warped_forest",
- "minecraft:windswept_forest",
- "minecraft:windswept_gravelly_hills",
- "minecraft:windswept_hills",
- "minecraft:windswept_savanna"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.bitwise/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.bitwise/.metadata/generated/features.json
deleted file mode 100644
index cf8addee8f..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/.metadata/generated/features.json
+++ /dev/null
@@ -1,113 +0,0 @@
-[
- {
- "name": "and",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#logical-operators",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2018/02/27",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/08/22",
- "version": "23w33a"
- }
- },
- {
- "name": "bit_count",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#bit-count",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/02/27",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "bit_length",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#bit-length",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2020/09/06",
- "version": "1.16"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "not",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#logical-operators",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2018/08/27",
- "version": "1.13"
- },
- "updated": {
- "date": "2024/03/18",
- "version": "1.20.4"
- }
- },
- {
- "name": "or",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#logical-operators",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2018/02/27",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/08/22",
- "version": "23w33a"
- }
- },
- {
- "name": "two_complement",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#complement-to-2",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2020/09/06",
- "version": "1.16"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "xor",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#logical-operators",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2018/02/27",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/08/22",
- "version": "23w33a"
- }
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.bitwise/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.bitwise/.metadata/generated/module.json
deleted file mode 100644
index 5e10280fa3..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/.metadata/generated/module.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "bs.bitwise",
- "display_name": "Bitwise",
- "description": "A collection of various bitwise operations, providing versatile tools for manipulating binary data.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "features": [
- "bs.bitwise:and",
- "bs.bitwise:bit_count",
- "bs.bitwise:bit_length",
- "bs.bitwise:not",
- "bs.bitwise:or",
- "bs.bitwise:two_complement",
- "bs.bitwise:xor"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.bitwise/.metadata/module.json b/datapacks/Bookshelf/data/bs.bitwise/.metadata/module.json
deleted file mode 100644
index 9e02468213..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.bitwise",
- "display_name": "Bitwise",
- "description": "A collection of various bitwise operations, providing versatile tools for manipulating binary data.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html"
-}
diff --git a/datapacks/Bookshelf/data/bs.bitwise/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/function/__help__.mcfunction
deleted file mode 100644
index eb181cff90..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.bitwise documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.bitwise/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/function/__load__.mcfunction
deleted file mode 100644
index 9a9b5d3f78..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/function/__load__.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
-scoreboard objectives add bs.in dummy [{"text":"BS ","color":"dark_gray"},{"text":"Input","color":"aqua"}]
-
-scoreboard players set -1 bs.const -1
-scoreboard players set 2 bs.const 2
diff --git a/datapacks/Bookshelf/data/bs.bitwise/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/function/__unload__.mcfunction
deleted file mode 100644
index f0530e7f92..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/function/__unload__.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard objectives remove bs.const
-scoreboard objectives remove bs.ctx
-scoreboard objectives remove bs.out
-scoreboard objectives remove bs.in
diff --git a/datapacks/Bookshelf/data/bs.bitwise/function/and/and.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/function/and/and.mcfunction
deleted file mode 100644
index 91d242dcf2..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/function/and/and.mcfunction
+++ /dev/null
@@ -1,26 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#logical-operators
-# ------------------------------------------------------------------------------------------------------------
-
-# Note:
-# - This function returns the and bitwise between two numbers.
-# - Example: -178 & 32165 = 32004
-# The result is the number composed by keeping all one at the same position in the two binary representations of these numbers.
-
-scoreboard players operation #a bs.ctx = $bitwise.and.a bs.in
-scoreboard players operation #b bs.ctx = $bitwise.and.b bs.in
-function bs.bitwise:and/compute
-return run scoreboard players operation $bitwise.and bs.out = #x bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.bitwise/function/and/compute.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/function/and/compute.mcfunction
deleted file mode 100644
index 318f16b871..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/function/and/compute.mcfunction
+++ /dev/null
@@ -1,110 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players set #x bs.ctx 0
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players set #x bs.ctx -2147483648
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 1073741824
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 536870912
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 268435456
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 134217728
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 67108864
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 33554432
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 16777216
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 8388608
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 4194304
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 2097152
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 1048576
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 524288
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 262144
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 131072
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 65536
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 32768
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 16384
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 8192
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 4096
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 2048
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 1024
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 512
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 256
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 128
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 64
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 32
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 16
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 8
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 4
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 2
-scoreboard players operation #a bs.ctx *= 2 bs.const
-scoreboard players operation #b bs.ctx *= 2 bs.const
-execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 1
diff --git a/datapacks/Bookshelf/data/bs.bitwise/function/bit_count.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/function/bit_count.mcfunction
deleted file mode 100644
index 7970268c45..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/function/bit_count.mcfunction
+++ /dev/null
@@ -1,83 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#bit-count
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players set $bitwise.bit_count bs.out 0
-scoreboard players operation #n bs.ctx = $bitwise.bit_count.n bs.in
-execute if score #n bs.ctx matches ..-1 run scoreboard players operation #n bs.ctx *= -1 bs.const
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-scoreboard players operation #n bs.ctx *= 2 bs.const
-execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
-return run scoreboard players get $bitwise.bit_count bs.out
diff --git a/datapacks/Bookshelf/data/bs.bitwise/function/bit_length/bit_length.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/function/bit_length/bit_length.mcfunction
deleted file mode 100644
index dec6c04910..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/function/bit_length/bit_length.mcfunction
+++ /dev/null
@@ -1,27 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#bit-length
-# ------------------------------------------------------------------------------------------------------------
-
-# Note:
-# - This function returns the number of bits needed to represent a number
-# - Example: a = 1451, (a)2 = 0b10110101011, |(a)2| = 11
-
-scoreboard players operation #n bs.ctx = $bitwise.bit_length.n bs.in
-execute if score #n bs.ctx matches ..-1 run scoreboard players operation #n bs.ctx *= -1 bs.const
-execute if score #n bs.ctx matches 0..127 run return run function bs.bitwise:bit_length/group_1
-execute if score #n bs.ctx matches 128..32767 run return run function bs.bitwise:bit_length/group_2
-execute if score #n bs.ctx matches 32768..8388607 run return run function bs.bitwise:bit_length/group_3
-execute if score #n bs.ctx matches 8388608..2147483647 run return run function bs.bitwise:bit_length/group_4
diff --git a/datapacks/Bookshelf/data/bs.bitwise/function/not.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/function/not.mcfunction
deleted file mode 100644
index a95d54492d..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/function/not.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#logical-operators
-# ------------------------------------------------------------------------------------------------------------
-
-# Note: This function returns the bit negation of a number
-
-scoreboard players operation $bitwise.not bs.out = $bitwise.not.n bs.in
-scoreboard players operation $bitwise.not bs.out *= -1 bs.const
-
-return run scoreboard players remove $bitwise.not bs.out 1
diff --git a/datapacks/Bookshelf/data/bs.bitwise/function/or.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/function/or.mcfunction
deleted file mode 100644
index f742f0af1f..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/function/or.mcfunction
+++ /dev/null
@@ -1,28 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#logical-operators
-# ------------------------------------------------------------------------------------------------------------
-
-# Note:
-# - This function returns the or bitwise between two numbers.
-# - Example: -178 | 32165 = -17
-# - Formula: a | b = (a + b) - (a & b)
-# The result is the number composed by keeping all one in the two binary representations of these numbers.
-
-scoreboard players operation #a bs.ctx = $bitwise.or.a bs.in
-execute store result score $bitwise.or bs.out run scoreboard players operation #b bs.ctx = $bitwise.or.b bs.in
-scoreboard players operation $bitwise.or bs.out += $bitwise.or.a bs.in
-function bs.bitwise:and/compute
-return run scoreboard players operation $bitwise.or bs.out -= #x bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.bitwise/function/two_complement.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/function/two_complement.mcfunction
deleted file mode 100644
index 56b8fa82c2..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/function/two_complement.mcfunction
+++ /dev/null
@@ -1,31 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#complement-to-2
-# ------------------------------------------------------------------------------------------------------------
-
-# Note:
-# - This function returns the two's complement of a number
-# - Example: -1 -> 2147483647
-# -417 -> 2147483231
-# Two's complement allows to represent a negative number like a positive number by remplacing this number by its complement.
-# The two's complement is obtained by inverted all bits of the binary representation of the number, and add one to this.
-# An other way to compute this: 2^n - abs(x) where n is the number of bit wanted to represent the binary number of the complement.
-# In Minecraft, numbers are stored in a integer type (4 bytes), i.e. a 2^n of 2^31 - 1. In this case, we need to take 2^32 to include
-# all numbers but 2^32 can't be store in an integer, so we modify a bit the operation for: (2^n - 1) - abs(x) + 1.
-
-scoreboard players operation $bitwise.two_complement bs.out = $bitwise.two_complement.n bs.in
-execute if score $bitwise.two_complement bs.out matches 1.. run return run scoreboard players get $bitwise.two_complement bs.out
-scoreboard players add $bitwise.two_complement bs.out 2147483647
-return run scoreboard players add $bitwise.two_complement bs.out 1
diff --git a/datapacks/Bookshelf/data/bs.bitwise/function/xor.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/function/xor.mcfunction
deleted file mode 100644
index bd2c0dc664..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/function/xor.mcfunction
+++ /dev/null
@@ -1,29 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#logical-operators
-# ------------------------------------------------------------------------------------------------------------
-
-# Note:
-# - This function returns the exclusive or bitwise between two numbers.
-# - Example: -178 ^ 32165 = -32021
-# - Formula: a ^ b = (a + b) - 2*(a & b)
-# The result is the number composed by putting one at all bits where the value in the two binary representations of these numbers is different.
-
-scoreboard players operation #a bs.ctx = $bitwise.xor.a bs.in
-execute store result score $bitwise.xor bs.out run scoreboard players operation #b bs.ctx = $bitwise.xor.b bs.in
-scoreboard players operation $bitwise.xor bs.out += $bitwise.xor.a bs.in
-function bs.bitwise:and/compute
-scoreboard players operation $bitwise.xor bs.out -= #x bs.ctx
-return run scoreboard players operation $bitwise.xor bs.out -= #x bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.bitwise/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.bitwise/tags/function/exclusive_load.json
deleted file mode 100644
index f1d0ec8015..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.bitwise:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.bitwise/tags/function/help.json b/datapacks/Bookshelf/data/bs.bitwise/tags/function/help.json
deleted file mode 100644
index 1b06ba523b..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.bitwise:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.bitwise/tags/function/load.json b/datapacks/Bookshelf/data/bs.bitwise/tags/function/load.json
deleted file mode 100644
index 11b981ca97..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/tags/function/load.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.bitwise:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.bitwise/tags/function/not.json b/datapacks/Bookshelf/data/bs.bitwise/tags/function/not.json
deleted file mode 100644
index 5ad47f4be4..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/tags/function/not.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#logical-operators",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2018/08/27",
- "minecraft_version": "1.13"
- },
- "updated": {
- "date": "2024/03/18",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.bitwise:not"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.bitwise/tags/function/or.json b/datapacks/Bookshelf/data/bs.bitwise/tags/function/or.json
deleted file mode 100644
index 6404afa74b..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/tags/function/or.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#logical-operators",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2018/02/27",
- "minecraft_version": "1.13"
- },
- "updated": {
- "date": "2023/08/22",
- "minecraft_version": "23w33a"
- }
- },
- "values": [
- "bs.bitwise:or"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.bitwise/tags/function/unload.json b/datapacks/Bookshelf/data/bs.bitwise/tags/function/unload.json
deleted file mode 100644
index 84744e66c8..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.bitwise:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.bitwise/tags/function/xor.json b/datapacks/Bookshelf/data/bs.bitwise/tags/function/xor.json
deleted file mode 100644
index b832de5978..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/tags/function/xor.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#logical-operators",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2018/02/27",
- "minecraft_version": "1.13"
- },
- "updated": {
- "date": "2023/08/22",
- "minecraft_version": "23w33a"
- }
- },
- "values": [
- "bs.bitwise:xor"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.bitwise/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/test/__boot__.mcfunction
deleted file mode 100644
index ea61cb7eb5..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.bitwise
-# @beforebatch function #bs.bitwise:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.bitwise/test/and.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/test/and.mcfunction
deleted file mode 100644
index 6fe8b2a0e3..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/test/and.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# And operator returns correct values
-# @batch bs.bitwise
-
-scoreboard players set $bitwise.and.a bs.in -9
-scoreboard players set $bitwise.and.b bs.in 57
-function #bs.bitwise:and
-assert score $bitwise.and bs.out matches 49
-
-scoreboard players set $bitwise.and.a bs.in 1234567890
-scoreboard players set $bitwise.and.b bs.in 123456
-function #bs.bitwise:and
-assert score $bitwise.and bs.out matches 576
diff --git a/datapacks/Bookshelf/data/bs.bitwise/test/bit_count.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/test/bit_count.mcfunction
deleted file mode 100644
index 59625bed86..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/test/bit_count.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Bit count returns correct values
-# @batch bs.bitwise
-
-scoreboard players set $bitwise.bit_count.n bs.in -1568
-function #bs.bitwise:bit_count
-assert score $bitwise.bit_count bs.out matches 3
-
-scoreboard players set $bitwise.bit_count.n bs.in 174653179
-function #bs.bitwise:bit_count
-assert score $bitwise.bit_count bs.out matches 19
diff --git a/datapacks/Bookshelf/data/bs.bitwise/test/bit_length.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/test/bit_length.mcfunction
deleted file mode 100644
index 30a068a0d5..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/test/bit_length.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Bit length returns correct values
-# @batch bs.bitwise
-
-scoreboard players set $bitwise.bit_length.n bs.in -1568
-function #bs.bitwise:bit_length
-assert score $bitwise.bit_length bs.out matches 11
-
-scoreboard players set $bitwise.bit_length.n bs.in 174653179
-function #bs.bitwise:bit_length
-assert score $bitwise.bit_length bs.out matches 28
diff --git a/datapacks/Bookshelf/data/bs.bitwise/test/not.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/test/not.mcfunction
deleted file mode 100644
index 7d6ec392e6..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/test/not.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Not operator returns correct values
-# @batch bs.bitwise
-
-scoreboard players set $bitwise.not.n bs.in 123456
-function #bs.bitwise:not
-assert score $bitwise.not bs.out matches -123457
-
-scoreboard players set $bitwise.not.n bs.in -197364158
-function #bs.bitwise:not
-assert score $bitwise.not bs.out matches 197364157
diff --git a/datapacks/Bookshelf/data/bs.bitwise/test/or.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/test/or.mcfunction
deleted file mode 100644
index 2de47f8931..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/test/or.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# Or operator returns correct values
-# @batch bs.bitwise
-
-scoreboard players set $bitwise.or.a bs.in -9
-scoreboard players set $bitwise.or.b bs.in 57
-function #bs.bitwise:or
-assert score $bitwise.or bs.out matches -1
-
-scoreboard players set $bitwise.or.a bs.in 1234567890
-scoreboard players set $bitwise.or.b bs.in 123456
-function #bs.bitwise:or
-assert score $bitwise.or bs.out matches 1234690770
diff --git a/datapacks/Bookshelf/data/bs.bitwise/test/two_complement.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/test/two_complement.mcfunction
deleted file mode 100644
index b591ca784a..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/test/two_complement.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Two complement returns correct values
-# @batch bs.bitwise
-
-scoreboard players set $bitwise.two_complement.n bs.in 123456
-function #bs.bitwise:two_complement
-assert score $bitwise.two_complement bs.out matches 123456
-
-scoreboard players set $bitwise.two_complement.n bs.in -197364158
-function #bs.bitwise:two_complement
-assert score $bitwise.two_complement bs.out matches 1950119490
diff --git a/datapacks/Bookshelf/data/bs.bitwise/test/xor.mcfunction b/datapacks/Bookshelf/data/bs.bitwise/test/xor.mcfunction
deleted file mode 100644
index e11b5cd6fb..0000000000
--- a/datapacks/Bookshelf/data/bs.bitwise/test/xor.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# Xor operator returns correct values
-# @batch bs.bitwise
-
-scoreboard players set $bitwise.xor.a bs.in -9
-scoreboard players set $bitwise.xor.b bs.in 57
-function #bs.bitwise:xor
-assert score $bitwise.xor bs.out matches -50
-
-scoreboard players set $bitwise.xor.a bs.in 1234567890
-scoreboard players set $bitwise.xor.b bs.in 123456
-function #bs.bitwise:xor
-assert score $bitwise.xor bs.out matches 1234690194
diff --git a/datapacks/Bookshelf/data/bs.block/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.block/.metadata/generated/features.json
deleted file mode 100644
index 3d2a432836..0000000000
--- a/datapacks/Bookshelf/data/bs.block/.metadata/generated/features.json
+++ /dev/null
@@ -1,350 +0,0 @@
-[
- {
- "name": "emit_block_particle",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#produce",
- "authors": [
- "theogiraudet"
- ],
- "created": {
- "date": "2024/10/09",
- "version": "1.21.1"
- },
- "updated": {
- "date": "2024/10/09",
- "version": "1.21.1"
- }
- },
- {
- "name": "fill_block",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#fill",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/09/11",
- "version": "1.21"
- }
- },
- {
- "name": "fill_random",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#fill",
- "authors": [
- "Aksiome"
- ],
- "contributors": [
- "SBtree-bit"
- ],
- "created": {
- "date": "2024/06/16",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/11",
- "version": "1.21"
- }
- },
- {
- "name": "fill_type",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#fill",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/09/11",
- "version": "1.21"
- }
- },
- {
- "name": "get_block",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#get",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_type",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#get",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "keep_properties",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "lookup_item",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "lookup_type",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "map_type",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type",
- "authors": [
- "Aksiome"
- ],
- "contributors": [
- "theogiraudet"
- ],
- "created": {
- "date": "2024/05/25",
- "version": "1.20.6"
- },
- "updated": {
- "date": "2024/06/11",
- "version": "1.20.6"
- }
- },
- {
- "name": "match",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#match",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "merge_properties",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "mix_type",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type",
- "authors": [
- "Aksiome"
- ],
- "contributors": [
- "theogiraudet"
- ],
- "created": {
- "date": "2024/06/08",
- "version": "1.20.6"
- },
- "updated": {
- "date": "2024/06/11",
- "version": "1.20.6"
- }
- },
- {
- "name": "remove_properties",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "replace_properties",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "replace_type",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_block",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#set",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_type",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#set",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "shift_properties",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "spawn_block_display",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#produce",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "spawn_falling_block",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#produce",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "spawn_solid_block_display",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#produce",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.block/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.block/.metadata/generated/module.json
deleted file mode 100644
index 923b728ec2..0000000000
--- a/datapacks/Bookshelf/data/bs.block/.metadata/generated/module.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "name": "bs.block",
- "display_name": "Block",
- "description": "Manage blocks, including states and NBTs, while offering advanced tools for seamless transformations.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "contributors": [
- "SBtree-bit",
- "theogiraudet"
- ],
- "features": [
- "bs.block:emit_block_particle",
- "bs.block:fill_block",
- "bs.block:fill_random",
- "bs.block:fill_type",
- "bs.block:get_block",
- "bs.block:get_type",
- "bs.block:keep_properties",
- "bs.block:lookup_item",
- "bs.block:lookup_type",
- "bs.block:map_type",
- "bs.block:match",
- "bs.block:merge_properties",
- "bs.block:mix_type",
- "bs.block:remove_properties",
- "bs.block:replace_properties",
- "bs.block:replace_type",
- "bs.block:set_block",
- "bs.block:set_type",
- "bs.block:shift_properties",
- "bs.block:spawn_block_display",
- "bs.block:spawn_falling_block",
- "bs.block:spawn_solid_block_display"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.block/.metadata/module.json b/datapacks/Bookshelf/data/bs.block/.metadata/module.json
deleted file mode 100644
index 6d596d08e0..0000000000
--- a/datapacks/Bookshelf/data/bs.block/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.block",
- "display_name": "Block",
- "description": "Manage blocks, including states and NBTs, while offering advanced tools for seamless transformations.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html"
-}
diff --git a/datapacks/Bookshelf/data/bs.block/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.block/function/__help__.mcfunction
deleted file mode 100644
index 5df1d148fe..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.block documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.block/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.block/function/__load__.mcfunction
deleted file mode 100644
index f787dabf13..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/__load__.mcfunction
+++ /dev/null
@@ -1,31 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html
-# ------------------------------------------------------------------------------------------------------------
-
-forceload add -30000000 1600
-setblock -30000000 0 1606 minecraft:decorated_pot
-execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
-execute unless entity B5-0-0-0-2 run summon minecraft:text_display -30000000 0 1600 {UUID:[I;181,0,0,2],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],view_range:0f}
-
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
-
-function bs.block:load/types_table
-function bs.block:load/items_table
-function bs.block:load/groups_table
-function bs.block:load/mapping_registry
-
-data modify storage bs:out block set value {}
diff --git a/datapacks/Bookshelf/data/bs.block/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.block/function/__unload__.mcfunction
deleted file mode 100644
index 958587983d..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/__unload__.mcfunction
+++ /dev/null
@@ -1,29 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html
-# ------------------------------------------------------------------------------------------------------------
-
-kill B5-0-0-0-1
-kill B5-0-0-0-2
-setblock -30000000 0 1606 minecraft:air
-forceload remove -30000000 1600
-
-scoreboard objectives remove bs.ctx
-scoreboard objectives remove bs.data
-
-data remove storage bs:in block
-data remove storage bs:out block
-data remove storage bs:const block
-data remove storage bs:data block
diff --git a/datapacks/Bookshelf/data/bs.block/function/fill/process/pause.mcfunction b/datapacks/Bookshelf/data/bs.block/function/fill/process/pause.mcfunction
deleted file mode 100644
index 4dd542df82..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/fill/process/pause.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result storage bs:data block._.pos[0] double 1 run scoreboard players get #block.x bs.data
-execute store result storage bs:data block._.pos[1] double 1 run scoreboard players get #block.y bs.data
-execute store result storage bs:data block._.pos[2] double 1 run scoreboard players get #block.z bs.data
-
-execute unless data storage bs:data block._.dim run function bs.block:utils/get_dimension
-execute unless data storage bs:data block._.rot run data modify storage bs:data block._.rot set from entity @s Rotation
-
-data modify storage bs:data block.fill prepend from storage bs:data block._
-schedule function bs.block:fill/process/scheduled 1t replace
diff --git a/datapacks/Bookshelf/data/bs.block/function/fill/process/resume.mcfunction b/datapacks/Bookshelf/data/bs.block/function/fill/process/resume.mcfunction
deleted file mode 100644
index 8b051b1b9b..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/fill/process/resume.mcfunction
+++ /dev/null
@@ -1,39 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data block._ set from storage bs:data block.fill[-1]
-data remove storage bs:data block._._
-
-data modify entity @s Pos set from storage bs:data block._.pos
-data modify entity @s Rotation set from storage bs:data block._.rot
-
-execute store result score #block.x bs.data run data get storage bs:data block._.pos[0]
-execute store result score #block.y bs.data run data get storage bs:data block._.pos[1]
-execute store result score #block.z bs.data run data get storage bs:data block._.pos[2]
-execute store result score #block.i bs.data run data get storage bs:data block._.limit
-execute store result score #block.min_x bs.data run data get storage bs:data block._.min_x
-execute store result score #block.min_y bs.data run data get storage bs:data block._.min_y
-execute store result score #block.min_z bs.data run data get storage bs:data block._.min_z
-execute store result score #block.max_x bs.data run data get storage bs:data block._.max_x
-execute store result score #block.max_y bs.data run data get storage bs:data block._.max_y
-execute store result score #block.max_z bs.data run data get storage bs:data block._.max_z
-
-$execute in $(dim) positioned as @s rotated as @s run function bs.block:fill/recurse/next with storage bs:data block._
-
-data remove storage bs:data block.fill[-1]
-execute if data storage bs:data block.fill[-1]._ \
- run return run function bs.block:fill/process/resume with storage bs:data block.fill[-1]
-
-execute in minecraft:overworld run tp @s -30000000 0 1600
diff --git a/datapacks/Bookshelf/data/bs.block/function/fill/process/scheduled.mcfunction b/datapacks/Bookshelf/data/bs.block/function/fill/process/scheduled.mcfunction
deleted file mode 100644
index 2e8e872fbd..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/fill/process/scheduled.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data block.fill[]._ set value 1b
-execute as B5-0-0-0-1 run function bs.block:fill/process/resume with storage bs:data block.fill[-1]
diff --git a/datapacks/Bookshelf/data/bs.block/function/fill/recurse/init.mcfunction b/datapacks/Bookshelf/data/bs.block/function/fill/recurse/init.mcfunction
deleted file mode 100644
index 5144b6fe43..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/fill/recurse/init.mcfunction
+++ /dev/null
@@ -1,38 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute unless data storage bs:data block._.from[2] run function bs.block:utils/resolve_from_pos with storage bs:data block._
-execute unless data storage bs:data block._.to[2] run function bs.block:utils/resolve_to_pos with storage bs:data block._
-
-execute store result score #block.i bs.data run data get storage bs:data block._.limit
-execute store result score #block.min_x bs.data run data get storage bs:data block._.from[0]
-execute store result score #block.min_y bs.data run data get storage bs:data block._.from[1]
-execute store result score #block.min_z bs.data run data get storage bs:data block._.from[2]
-execute store result score #block.max_x bs.data run data get storage bs:data block._.to[0]
-execute store result score #block.max_y bs.data run data get storage bs:data block._.to[1]
-execute store result score #block.max_z bs.data run data get storage bs:data block._.to[2]
-execute if score #block.min_x bs.data > #block.max_x bs.data run scoreboard players operation #block.min_x bs.data >< #block.max_x bs.data
-execute if score #block.min_y bs.data > #block.max_y bs.data run scoreboard players operation #block.min_y bs.data >< #block.max_y bs.data
-execute if score #block.min_z bs.data > #block.max_z bs.data run scoreboard players operation #block.min_z bs.data >< #block.max_z bs.data
-execute store result storage bs:data block._.min_x int 1 store result storage bs:data block._.pos[0] double 1 store result score #block.x bs.data run scoreboard players get #block.min_x bs.data
-execute store result storage bs:data block._.min_y int 1 store result storage bs:data block._.pos[1] double 1 store result score #block.y bs.data run scoreboard players get #block.min_y bs.data
-execute store result storage bs:data block._.min_z int 1 store result storage bs:data block._.pos[2] double 1 store result score #block.z bs.data run scoreboard players get #block.min_z bs.data
-execute store result storage bs:data block._.max_x int 1 run scoreboard players get #block.max_x bs.data
-execute store result storage bs:data block._.max_y int 1 run scoreboard players get #block.max_y bs.data
-execute store result storage bs:data block._.max_z int 1 run scoreboard players get #block.max_z bs.data
-
-data modify entity @s Pos set from storage bs:data block._.pos
-execute positioned as @s run function bs.block:fill/recurse/next with storage bs:data block._
-kill @s
diff --git a/datapacks/Bookshelf/data/bs.block/function/fill/recurse/next.mcfunction b/datapacks/Bookshelf/data/bs.block/function/fill/recurse/next.mcfunction
deleted file mode 100644
index 5c18703fbf..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/fill/recurse/next.mcfunction
+++ /dev/null
@@ -1,29 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute if score #block.i bs.data matches 0 run return run function bs.block:fill/process/pause
-
-$execute $(mask)run function bs.block:fill/strategy/$(impl) with storage bs:data block._
-
-scoreboard players remove #block.i bs.data 1
-scoreboard players add #block.z bs.data 1
-execute if score #block.z bs.data > #block.max_z bs.data run scoreboard players add #block.y bs.data 1
-execute if score #block.z bs.data > #block.max_z bs.data run scoreboard players operation #block.z bs.data = #block.min_z bs.data
-execute if score #block.y bs.data > #block.max_y bs.data run scoreboard players add #block.x bs.data 1
-execute if score #block.y bs.data > #block.max_y bs.data run scoreboard players operation #block.y bs.data = #block.min_y bs.data
-
-execute if score #block.z bs.data > #block.min_z bs.data positioned ~ ~ ~1 run return run function bs.block:fill/recurse/next with storage bs:data block._
-$execute if score #block.y bs.data > #block.min_y bs.data positioned ~ ~1 $(min_z) run return run function bs.block:fill/recurse/next with storage bs:data block._
-$execute if score #block.x bs.data <= #block.max_x bs.data positioned ~1 $(min_y) $(min_z) run return run function bs.block:fill/recurse/next with storage bs:data block._
diff --git a/datapacks/Bookshelf/data/bs.block/function/fill/strategy/set_block.mcfunction b/datapacks/Bookshelf/data/bs.block/function/fill/strategy/set_block.mcfunction
deleted file mode 100644
index e6f108769c..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/fill/strategy/set_block.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$setblock ~ ~ ~ $(block) $(mode)
diff --git a/datapacks/Bookshelf/data/bs.block/function/fill/strategy/set_type.mcfunction b/datapacks/Bookshelf/data/bs.block/function/fill/strategy/set_type.mcfunction
deleted file mode 100644
index c8aad08a67..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/fill/strategy/set_type.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-function bs.block:get/get_block
-function #bs.block:replace_type with storage bs:data block._
-data modify storage bs:data block._.block set from storage bs:out block.block
-function bs.block:fill/strategy/set_block with storage bs:data block._
diff --git a/datapacks/Bookshelf/data/bs.block/function/get/compile/block.mcfunction b/datapacks/Bookshelf/data/bs.block/function/get/compile/block.mcfunction
deleted file mode 100644
index b7fdd1842e..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/get/compile/block.mcfunction
+++ /dev/null
@@ -1,29 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# compile the state string or default to an empty one
-execute if data storage bs:out block._ run function bs.block:get/compile/state
-execute unless data storage bs:out block.state run data modify storage bs:out block.state set value ""
-execute unless data storage bs:out block.properties run data modify storage bs:out block.properties set value {}
-
-# escape the nbt or default to an empty string
-execute store success score #s bs.ctx if data storage bs:out block.nbt{}
-execute if score #s bs.ctx matches 0 run data modify storage bs:out block.nbt set value ""
-execute if score #s bs.ctx matches 1 run data modify entity B5-0-0-0-2 text set value '{"storage":"bs:out","nbt":"block.nbt"}'
-
-# generate the full block string representation
-data modify storage bs:ctx _ set from storage bs:out block
-execute if score #s bs.ctx matches 1 run data modify storage bs:ctx _.nbt set string entity B5-0-0-0-2 text 1 -1
-return run function bs.block:get/compile/concat/block with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.block/function/get/compile/concat/block.mcfunction b/datapacks/Bookshelf/data/bs.block/function/get/compile/concat/block.mcfunction
deleted file mode 100644
index 3d0bcb2f96..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/get/compile/concat/block.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$return run data modify storage bs:out block.block set value "$(type)$(state)$(nbt)"
diff --git a/datapacks/Bookshelf/data/bs.block/function/get/compile/concat/state.mcfunction b/datapacks/Bookshelf/data/bs.block/function/get/compile/concat/state.mcfunction
deleted file mode 100644
index bf41456512..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/get/compile/concat/state.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:out block.state set value "[$(6)$(5)$(4)$(3)$(2)$(1)$(0)]"
diff --git a/datapacks/Bookshelf/data/bs.block/function/get/compile/state.mcfunction b/datapacks/Bookshelf/data/bs.block/function/get/compile/state.mcfunction
deleted file mode 100644
index ae2cd202bd..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/get/compile/state.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx _ set value {0:"",1:"",2:"",3:"",4:"",5:"",6:"",7:""}
-data modify storage bs:ctx _ merge from storage bs:out block._
-function bs.block:get/compile/concat/state with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.block/function/get/compile/type.mcfunction b/datapacks/Bookshelf/data/bs.block/function/get/compile/type.mcfunction
deleted file mode 100644
index fb20d067fb..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/get/compile/type.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:out block.block set from storage bs:out block.type
-data modify storage bs:out block.properties set value {}
-data modify storage bs:out block.state set value ""
-data modify storage bs:out block.nbt set value ""
diff --git a/datapacks/Bookshelf/data/bs.block/function/get/get_block.mcfunction b/datapacks/Bookshelf/data/bs.block/function/get/get_block.mcfunction
deleted file mode 100644
index 168e64444b..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/get/get_block.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#get
-# ------------------------------------------------------------------------------------------------------------
-
-data remove storage bs:out block
-loot replace block -30000000 0 1606 container.0 loot bs.block:get/get
-data modify storage bs:out block set from block -30000000 0 1606 item.components."minecraft:custom_data"
-data modify storage bs:out block.nbt set from block ~ ~ ~ {}
diff --git a/datapacks/Bookshelf/data/bs.block/function/load/groups_table.mcfunction b/datapacks/Bookshelf/data/bs.block/function/load/groups_table.mcfunction
deleted file mode 100644
index e584669cff..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/load/groups_table.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# This file was automatically generated, do not edit it
-data modify storage bs:const block.groups set value {0:[],1:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{1:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{1:"powered=true,"}}]},{i:2,n:"face",o:[{i:0,v:"wall",p:{face:"wall"},s:{2:"face=wall,"}},{i:1,v:"ceiling",p:{face:"ceiling"},s:{2:"face=ceiling,"}},{i:2,v:"floor",p:{face:"floor"},s:{2:"face=floor,"}}]}],2:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{1:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{1:"powered=true,"}}]},{i:2,n:"open",o:[{i:0,v:"false",p:{open:"false"},s:{2:"open=false,"}},{i:1,v:"true",p:{open:"true"},s:{2:"open=true,"}}]},{i:3,n:"half",o:[{i:0,v:"lower",p:{half:"lower"},s:{3:"half=lower,"}},{i:1,v:"upper",p:{half:"upper"},s:{3:"half=upper,"}}]},{i:4,n:"hinge",o:[{i:0,v:"left",p:{hinge:"left"},s:{4:"hinge=left,"}},{i:1,v:"right",p:{hinge:"right"},s:{4:"hinge=right,"}}]}],3:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"east",o:[{i:0,v:"false",p:{east:"false"},s:{1:"east=false,"}},{i:1,v:"true",p:{east:"true"},s:{1:"east=true,"}}]},{i:2,n:"north",o:[{i:0,v:"false",p:{north:"false"},s:{2:"north=false,"}},{i:1,v:"true",p:{north:"true"},s:{2:"north=true,"}}]},{i:3,n:"south",o:[{i:0,v:"false",p:{south:"false"},s:{3:"south=false,"}},{i:1,v:"true",p:{south:"true"},s:{3:"south=true,"}}]},{i:4,n:"west",o:[{i:0,v:"false",p:{west:"false"},s:{4:"west=false,"}},{i:1,v:"true",p:{west:"true"},s:{4:"west=true,"}}]}],4:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{1:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{1:"powered=true,"}}]},{i:2,n:"open",o:[{i:0,v:"false",p:{open:"false"},s:{2:"open=false,"}},{i:1,v:"true",p:{open:"true"},s:{2:"open=true,"}}]},{i:3,n:"in_wall",o:[{i:0,v:"false",p:{in_wall:"false"},s:{3:"in_wall=false,"}},{i:1,v:"true",p:{in_wall:"true"},s:{3:"in_wall=true,"}}]}],5:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"rotation",o:[{i:0,v:"0",p:{rotation:"0"},s:{1:"rotation=0,"}},{i:1,v:"1",p:{rotation:"1"},s:{1:"rotation=1,"}},{i:2,v:"2",p:{rotation:"2"},s:{1:"rotation=2,"}},{i:3,v:"3",p:{rotation:"3"},s:{1:"rotation=3,"}},{i:4,v:"4",p:{rotation:"4"},s:{1:"rotation=4,"}},{i:5,v:"5",p:{rotation:"5"},s:{1:"rotation=5,"}},{i:6,v:"6",p:{rotation:"6"},s:{1:"rotation=6,"}},{i:7,v:"7",p:{rotation:"7"},s:{1:"rotation=7,"}},{i:8,v:"8",p:{rotation:"8"},s:{1:"rotation=8,"}},{i:9,v:"9",p:{rotation:"9"},s:{1:"rotation=9,"}},{i:10,v:"10",p:{rotation:"10"},s:{1:"rotation=10,"}},{i:11,v:"11",p:{rotation:"11"},s:{1:"rotation=11,"}},{i:12,v:"12",p:{rotation:"12"},s:{1:"rotation=12,"}},{i:13,v:"13",p:{rotation:"13"},s:{1:"rotation=13,"}},{i:14,v:"14",p:{rotation:"14"},s:{1:"rotation=14,"}},{i:15,v:"15",p:{rotation:"15"},s:{1:"rotation=15,"}}]},{i:2,n:"attached",o:[{i:0,v:"false",p:{attached:"false"},s:{2:"attached=false,"}},{i:1,v:"true",p:{attached:"true"},s:{2:"attached=true,"}}]}],6:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"distance",o:[{i:0,v:"7",p:{distance:"7"},s:{1:"distance=7,"}},{i:1,v:"1",p:{distance:"1"},s:{1:"distance=1,"}},{i:2,v:"2",p:{distance:"2"},s:{1:"distance=2,"}},{i:3,v:"3",p:{distance:"3"},s:{1:"distance=3,"}},{i:4,v:"4",p:{distance:"4"},s:{1:"distance=4,"}},{i:5,v:"5",p:{distance:"5"},s:{1:"distance=5,"}},{i:6,v:"6",p:{distance:"6"},s:{1:"distance=6,"}}]},{i:2,n:"persistent",o:[{i:0,v:"false",p:{persistent:"false"},s:{2:"persistent=false,"}},{i:1,v:"true",p:{persistent:"true"},s:{2:"persistent=true,"}}]}],7:[{i:0,n:"axis",o:[{i:0,v:"y",p:{axis:"y"},s:{0:"axis=y,"}},{i:1,v:"z",p:{axis:"z"},s:{0:"axis=z,"}},{i:2,v:"x",p:{axis:"x"},s:{0:"axis=x,"}}]}],8:[{i:0,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{0:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{0:"powered=true,"}}]}],9:[{i:0,n:"stage",o:[{i:0,v:"0",p:{stage:"0"},s:{0:"stage=0,"}},{i:1,v:"1",p:{stage:"1"},s:{0:"stage=1,"}}]}],10:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"rotation",o:[{i:0,v:"0",p:{rotation:"0"},s:{1:"rotation=0,"}},{i:1,v:"1",p:{rotation:"1"},s:{1:"rotation=1,"}},{i:2,v:"2",p:{rotation:"2"},s:{1:"rotation=2,"}},{i:3,v:"3",p:{rotation:"3"},s:{1:"rotation=3,"}},{i:4,v:"4",p:{rotation:"4"},s:{1:"rotation=4,"}},{i:5,v:"5",p:{rotation:"5"},s:{1:"rotation=5,"}},{i:6,v:"6",p:{rotation:"6"},s:{1:"rotation=6,"}},{i:7,v:"7",p:{rotation:"7"},s:{1:"rotation=7,"}},{i:8,v:"8",p:{rotation:"8"},s:{1:"rotation=8,"}},{i:9,v:"9",p:{rotation:"9"},s:{1:"rotation=9,"}},{i:10,v:"10",p:{rotation:"10"},s:{1:"rotation=10,"}},{i:11,v:"11",p:{rotation:"11"},s:{1:"rotation=11,"}},{i:12,v:"12",p:{rotation:"12"},s:{1:"rotation=12,"}},{i:13,v:"13",p:{rotation:"13"},s:{1:"rotation=13,"}},{i:14,v:"14",p:{rotation:"14"},s:{1:"rotation=14,"}},{i:15,v:"15",p:{rotation:"15"},s:{1:"rotation=15,"}}]}],11:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"type",o:[{i:0,v:"bottom",p:{type:"bottom"},s:{1:"type=bottom,"}},{i:1,v:"double",p:{type:"double"},s:{1:"type=double,"}},{i:2,v:"top",p:{type:"top"},s:{1:"type=top,"}}]}],12:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{1:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{1:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{1:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{1:"facing=east,"}}]},{i:2,n:"half",o:[{i:0,v:"bottom",p:{half:"bottom"},s:{2:"half=bottom,"}},{i:1,v:"top",p:{half:"top"},s:{2:"half=top,"}}]},{i:3,n:"shape",o:[{i:0,v:"straight",p:{shape:"straight"},s:{3:"shape=straight,"}},{i:1,v:"inner_left",p:{shape:"inner_left"},s:{3:"shape=inner_left,"}},{i:2,v:"inner_right",p:{shape:"inner_right"},s:{3:"shape=inner_right,"}},{i:3,v:"outer_left",p:{shape:"outer_left"},s:{3:"shape=outer_left,"}},{i:4,v:"outer_right",p:{shape:"outer_right"},s:{3:"shape=outer_right,"}}]}],13:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{1:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{1:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{1:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{1:"facing=east,"}}]},{i:2,n:"half",o:[{i:0,v:"bottom",p:{half:"bottom"},s:{2:"half=bottom,"}},{i:1,v:"top",p:{half:"top"},s:{2:"half=top,"}}]},{i:3,n:"open",o:[{i:0,v:"false",p:{open:"false"},s:{3:"open=false,"}},{i:1,v:"true",p:{open:"true"},s:{3:"open=true,"}}]},{i:4,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{4:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{4:"powered=true,"}}]}],14:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{1:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{1:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{1:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{1:"facing=east,"}}]}],15:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{1:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{1:"powered=true,"}}]},{i:2,n:"shape",o:[{i:0,v:"north_south",p:{shape:"north_south"},s:{2:"shape=north_south,"}},{i:1,v:"east_west",p:{shape:"east_west"},s:{2:"shape=east_west,"}},{i:2,v:"ascending_east",p:{shape:"ascending_east"},s:{2:"shape=ascending_east,"}},{i:3,v:"ascending_west",p:{shape:"ascending_west"},s:{2:"shape=ascending_west,"}},{i:4,v:"ascending_north",p:{shape:"ascending_north"},s:{2:"shape=ascending_north,"}},{i:5,v:"ascending_south",p:{shape:"ascending_south"},s:{2:"shape=ascending_south,"}}]}],16:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"facing",o:[{i:0,v:"up",p:{facing:"up"},s:{1:"facing=up,"}},{i:1,v:"down",p:{facing:"down"},s:{1:"facing=down,"}},{i:2,v:"north",p:{facing:"north"},s:{1:"facing=north,"}},{i:3,v:"east",p:{facing:"east"},s:{1:"facing=east,"}},{i:4,v:"south",p:{facing:"south"},s:{1:"facing=south,"}},{i:5,v:"west",p:{facing:"west"},s:{1:"facing=west,"}}]}],17:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"up",o:[{i:0,v:"true",p:{up:"true"},s:{1:"up=true,"}},{i:1,v:"false",p:{up:"false"},s:{1:"up=false,"}}]},{i:2,n:"east",o:[{i:0,v:"none",p:{east:"none"},s:{2:"east=none,"}},{i:1,v:"low",p:{east:"low"},s:{2:"east=low,"}},{i:2,v:"tall",p:{east:"tall"},s:{2:"east=tall,"}}]},{i:3,n:"north",o:[{i:0,v:"none",p:{north:"none"},s:{3:"north=none,"}},{i:1,v:"low",p:{north:"low"},s:{3:"north=low,"}},{i:2,v:"tall",p:{north:"tall"},s:{3:"north=tall,"}}]},{i:4,n:"south",o:[{i:0,v:"none",p:{south:"none"},s:{4:"south=none,"}},{i:1,v:"low",p:{south:"low"},s:{4:"south=low,"}},{i:2,v:"tall",p:{south:"tall"},s:{4:"south=tall,"}}]},{i:5,n:"west",o:[{i:0,v:"none",p:{west:"none"},s:{5:"west=none,"}},{i:1,v:"low",p:{west:"low"},s:{5:"west=low,"}},{i:2,v:"tall",p:{west:"tall"},s:{5:"west=tall,"}}]}],18:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]}],19:[{i:0,n:"stage",o:[{i:0,v:"0",p:{stage:"0"},s:{0:"stage=0,"}},{i:1,v:"1",p:{stage:"1"},s:{0:"stage=1,"}}]},{i:1,n:"age",o:[{i:0,v:"0",p:{age:"0"},s:{1:"age=0,"}},{i:1,v:"1",p:{age:"1"},s:{1:"age=1,"}}]},{i:2,n:"leaves",o:[{i:0,v:"none",p:{leaves:"none"},s:{2:"leaves=none,"}},{i:1,v:"small",p:{leaves:"small"},s:{2:"leaves=small,"}},{i:2,v:"large",p:{leaves:"large"},s:{2:"leaves=large,"}}]}],20:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"east",p:{facing:"east"},s:{0:"facing=east,"}},{i:2,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:3,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:4,v:"up",p:{facing:"up"},s:{0:"facing=up,"}},{i:5,v:"down",p:{facing:"down"},s:{0:"facing=down,"}}]},{i:1,n:"open",o:[{i:0,v:"false",p:{open:"false"},s:{1:"open=false,"}},{i:1,v:"true",p:{open:"true"},s:{1:"open=true,"}}]}],21:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]}],22:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"honey_level",o:[{i:0,v:"0",p:{honey_level:"0"},s:{1:"honey_level=0,"}},{i:1,v:"1",p:{honey_level:"1"},s:{1:"honey_level=1,"}},{i:2,v:"2",p:{honey_level:"2"},s:{1:"honey_level=2,"}},{i:3,v:"3",p:{honey_level:"3"},s:{1:"honey_level=3,"}},{i:4,v:"4",p:{honey_level:"4"},s:{1:"honey_level=4,"}},{i:5,v:"5",p:{honey_level:"5"},s:{1:"honey_level=5,"}}]}],23:[{i:0,n:"age",o:[{i:0,v:"0",p:{age:"0"},s:{0:"age=0,"}},{i:1,v:"1",p:{age:"1"},s:{0:"age=1,"}},{i:2,v:"2",p:{age:"2"},s:{0:"age=2,"}},{i:3,v:"3",p:{age:"3"},s:{0:"age=3,"}}]}],24:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{1:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{1:"powered=true,"}}]},{i:2,n:"attachment",o:[{i:0,v:"floor",p:{attachment:"floor"},s:{2:"attachment=floor,"}},{i:1,v:"ceiling",p:{attachment:"ceiling"},s:{2:"attachment=ceiling,"}},{i:2,v:"single_wall",p:{attachment:"single_wall"},s:{2:"attachment=single_wall,"}},{i:3,v:"double_wall",p:{attachment:"double_wall"},s:{2:"attachment=double_wall,"}}]}],25:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{1:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{1:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{1:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{1:"facing=east,"}}]},{i:2,n:"tilt",o:[{i:0,v:"none",p:{tilt:"none"},s:{2:"tilt=none,"}},{i:1,v:"unstable",p:{tilt:"unstable"},s:{2:"tilt=unstable,"}},{i:2,v:"partial",p:{tilt:"partial"},s:{2:"tilt=partial,"}},{i:3,v:"full",p:{tilt:"full"},s:{2:"tilt=full,"}}]}],26:[{i:0,n:"rotation",o:[{i:0,v:"0",p:{rotation:"0"},s:{0:"rotation=0,"}},{i:1,v:"1",p:{rotation:"1"},s:{0:"rotation=1,"}},{i:2,v:"2",p:{rotation:"2"},s:{0:"rotation=2,"}},{i:3,v:"3",p:{rotation:"3"},s:{0:"rotation=3,"}},{i:4,v:"4",p:{rotation:"4"},s:{0:"rotation=4,"}},{i:5,v:"5",p:{rotation:"5"},s:{0:"rotation=5,"}},{i:6,v:"6",p:{rotation:"6"},s:{0:"rotation=6,"}},{i:7,v:"7",p:{rotation:"7"},s:{0:"rotation=7,"}},{i:8,v:"8",p:{rotation:"8"},s:{0:"rotation=8,"}},{i:9,v:"9",p:{rotation:"9"},s:{0:"rotation=9,"}},{i:10,v:"10",p:{rotation:"10"},s:{0:"rotation=10,"}},{i:11,v:"11",p:{rotation:"11"},s:{0:"rotation=11,"}},{i:12,v:"12",p:{rotation:"12"},s:{0:"rotation=12,"}},{i:13,v:"13",p:{rotation:"13"},s:{0:"rotation=13,"}},{i:14,v:"14",p:{rotation:"14"},s:{0:"rotation=14,"}},{i:15,v:"15",p:{rotation:"15"},s:{0:"rotation=15,"}}]}],27:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"occupied",o:[{i:0,v:"false",p:{occupied:"false"},s:{1:"occupied=false,"}},{i:1,v:"true",p:{occupied:"true"},s:{1:"occupied=true,"}}]},{i:2,n:"part",o:[{i:0,v:"foot",p:{part:"foot"},s:{2:"part=foot,"}},{i:1,v:"head",p:{part:"head"},s:{2:"part=head,"}}]}],28:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"lit",o:[{i:0,v:"false",p:{lit:"false"},s:{1:"lit=false,"}},{i:1,v:"true",p:{lit:"true"},s:{1:"lit=true,"}}]},{i:2,n:"candles",o:[{i:0,v:"1",p:{candles:"1"},s:{2:"candles=1,"}},{i:1,v:"2",p:{candles:"2"},s:{2:"candles=2,"}},{i:2,v:"3",p:{candles:"3"},s:{2:"candles=3,"}},{i:3,v:"4",p:{candles:"4"},s:{2:"candles=4,"}}]}],29:[{i:0,n:"lit",o:[{i:0,v:"false",p:{lit:"false"},s:{0:"lit=false,"}},{i:1,v:"true",p:{lit:"true"},s:{0:"lit=true,"}}]}],30:[{i:0,n:"facing",o:[{i:0,v:"up",p:{facing:"up"},s:{0:"facing=up,"}},{i:1,v:"down",p:{facing:"down"},s:{0:"facing=down,"}},{i:2,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}},{i:4,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:5,v:"west",p:{facing:"west"},s:{0:"facing=west,"}}]}],31:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"lit",o:[{i:0,v:"false",p:{lit:"false"},s:{1:"lit=false,"}},{i:1,v:"true",p:{lit:"true"},s:{1:"lit=true,"}}]}],32:[{i:0,n:"waterlogged",o:[{i:0,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}},{i:1,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}}]}],33:[{i:0,n:"waterlogged",o:[{i:0,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}},{i:1,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}}]},{i:1,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{1:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{1:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{1:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{1:"facing=east,"}}]}],34:[{i:0,n:"has_bottle_0",o:[{i:0,v:"false",p:{has_bottle_0:"false"},s:{0:"has_bottle_0=false,"}},{i:1,v:"true",p:{has_bottle_0:"true"},s:{0:"has_bottle_0=true,"}}]},{i:1,n:"has_bottle_1",o:[{i:0,v:"false",p:{has_bottle_1:"false"},s:{1:"has_bottle_1=false,"}},{i:1,v:"true",p:{has_bottle_1:"true"},s:{1:"has_bottle_1=true,"}}]},{i:2,n:"has_bottle_2",o:[{i:0,v:"false",p:{has_bottle_2:"false"},s:{2:"has_bottle_2=false,"}},{i:1,v:"true",p:{has_bottle_2:"true"},s:{2:"has_bottle_2=true,"}}]}],35:[{i:0,n:"east",o:[{i:0,v:"true",p:{east:"true"},s:{0:"east=true,"}},{i:1,v:"false",p:{east:"false"},s:{0:"east=false,"}}]},{i:1,n:"north",o:[{i:0,v:"true",p:{north:"true"},s:{1:"north=true,"}},{i:1,v:"false",p:{north:"false"},s:{1:"north=false,"}}]},{i:2,n:"south",o:[{i:0,v:"true",p:{south:"true"},s:{2:"south=true,"}},{i:1,v:"false",p:{south:"false"},s:{2:"south=false,"}}]},{i:3,n:"west",o:[{i:0,v:"true",p:{west:"true"},s:{3:"west=true,"}},{i:1,v:"false",p:{west:"false"},s:{3:"west=false,"}}]},{i:4,n:"up",o:[{i:0,v:"true",p:{up:"true"},s:{4:"up=true,"}},{i:1,v:"false",p:{up:"false"},s:{4:"up=false,"}}]},{i:5,n:"down",o:[{i:0,v:"true",p:{down:"true"},s:{5:"down=true,"}},{i:1,v:"false",p:{down:"false"},s:{5:"down=false,"}}]}],36:[{i:0,n:"drag",o:[{i:0,v:"true",p:{drag:"true"},s:{0:"drag=true,"}},{i:1,v:"false",p:{drag:"false"},s:{0:"drag=false,"}}]}],37:[{i:0,n:"age",o:[{i:0,v:"0",p:{age:"0"},s:{0:"age=0,"}},{i:1,v:"1",p:{age:"1"},s:{0:"age=1,"}},{i:2,v:"2",p:{age:"2"},s:{0:"age=2,"}},{i:3,v:"3",p:{age:"3"},s:{0:"age=3,"}},{i:4,v:"4",p:{age:"4"},s:{0:"age=4,"}},{i:5,v:"5",p:{age:"5"},s:{0:"age=5,"}},{i:6,v:"6",p:{age:"6"},s:{0:"age=6,"}},{i:7,v:"7",p:{age:"7"},s:{0:"age=7,"}},{i:8,v:"8",p:{age:"8"},s:{0:"age=8,"}},{i:9,v:"9",p:{age:"9"},s:{0:"age=9,"}},{i:10,v:"10",p:{age:"10"},s:{0:"age=10,"}},{i:11,v:"11",p:{age:"11"},s:{0:"age=11,"}},{i:12,v:"12",p:{age:"12"},s:{0:"age=12,"}},{i:13,v:"13",p:{age:"13"},s:{0:"age=13,"}},{i:14,v:"14",p:{age:"14"},s:{0:"age=14,"}},{i:15,v:"15",p:{age:"15"},s:{0:"age=15,"}}]}],38:[{i:0,n:"bites",o:[{i:0,v:"0",p:{bites:"0"},s:{0:"bites=0,"}},{i:1,v:"1",p:{bites:"1"},s:{0:"bites=1,"}},{i:2,v:"2",p:{bites:"2"},s:{0:"bites=2,"}},{i:3,v:"3",p:{bites:"3"},s:{0:"bites=3,"}},{i:4,v:"4",p:{bites:"4"},s:{0:"bites=4,"}},{i:5,v:"5",p:{bites:"5"},s:{0:"bites=5,"}},{i:6,v:"6",p:{bites:"6"},s:{0:"bites=6,"}}]}],39:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{1:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{1:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{1:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{1:"facing=east,"}}]},{i:2,n:"power",o:[{i:0,v:"0",p:{power:"0"},s:{2:"power=0,"}},{i:1,v:"1",p:{power:"1"},s:{2:"power=1,"}},{i:2,v:"2",p:{power:"2"},s:{2:"power=2,"}},{i:3,v:"3",p:{power:"3"},s:{2:"power=3,"}},{i:4,v:"4",p:{power:"4"},s:{2:"power=4,"}},{i:5,v:"5",p:{power:"5"},s:{2:"power=5,"}},{i:6,v:"6",p:{power:"6"},s:{2:"power=6,"}},{i:7,v:"7",p:{power:"7"},s:{2:"power=7,"}},{i:8,v:"8",p:{power:"8"},s:{2:"power=8,"}},{i:9,v:"9",p:{power:"9"},s:{2:"power=9,"}},{i:10,v:"10",p:{power:"10"},s:{2:"power=10,"}},{i:11,v:"11",p:{power:"11"},s:{2:"power=11,"}},{i:12,v:"12",p:{power:"12"},s:{2:"power=12,"}},{i:13,v:"13",p:{power:"13"},s:{2:"power=13,"}},{i:14,v:"14",p:{power:"14"},s:{2:"power=14,"}},{i:15,v:"15",p:{power:"15"},s:{2:"power=15,"}}]},{i:3,n:"sculk_sensor_phase",o:[{i:0,v:"inactive",p:{sculk_sensor_phase:"inactive"},s:{3:"sculk_sensor_phase=inactive,"}},{i:1,v:"active",p:{sculk_sensor_phase:"active"},s:{3:"sculk_sensor_phase=active,"}},{i:2,v:"cooldown",p:{sculk_sensor_phase:"cooldown"},s:{3:"sculk_sensor_phase=cooldown,"}}]}],40:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{1:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{1:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{1:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{1:"facing=east,"}}]},{i:2,n:"lit",o:[{i:0,v:"true",p:{lit:"true"},s:{2:"lit=true,"}},{i:1,v:"false",p:{lit:"false"},s:{2:"lit=false,"}}]},{i:3,n:"signal_fire",o:[{i:0,v:"false",p:{signal_fire:"false"},s:{3:"signal_fire=false,"}},{i:1,v:"true",p:{signal_fire:"true"},s:{3:"signal_fire=true,"}}]}],41:[{i:0,n:"age",o:[{i:0,v:"0",p:{age:"0"},s:{0:"age=0,"}},{i:1,v:"1",p:{age:"1"},s:{0:"age=1,"}},{i:2,v:"2",p:{age:"2"},s:{0:"age=2,"}},{i:3,v:"3",p:{age:"3"},s:{0:"age=3,"}},{i:4,v:"4",p:{age:"4"},s:{0:"age=4,"}},{i:5,v:"5",p:{age:"5"},s:{0:"age=5,"}},{i:6,v:"6",p:{age:"6"},s:{0:"age=6,"}},{i:7,v:"7",p:{age:"7"},s:{0:"age=7,"}}]}],42:[{i:0,n:"age",o:[{i:0,v:"0",p:{age:"0"},s:{0:"age=0,"}},{i:1,v:"1",p:{age:"1"},s:{0:"age=1,"}},{i:2,v:"2",p:{age:"2"},s:{0:"age=2,"}},{i:3,v:"3",p:{age:"3"},s:{0:"age=3,"}},{i:4,v:"4",p:{age:"4"},s:{0:"age=4,"}},{i:5,v:"5",p:{age:"5"},s:{0:"age=5,"}},{i:6,v:"6",p:{age:"6"},s:{0:"age=6,"}},{i:7,v:"7",p:{age:"7"},s:{0:"age=7,"}},{i:8,v:"8",p:{age:"8"},s:{0:"age=8,"}},{i:9,v:"9",p:{age:"9"},s:{0:"age=9,"}},{i:10,v:"10",p:{age:"10"},s:{0:"age=10,"}},{i:11,v:"11",p:{age:"11"},s:{0:"age=11,"}},{i:12,v:"12",p:{age:"12"},s:{0:"age=12,"}},{i:13,v:"13",p:{age:"13"},s:{0:"age=13,"}},{i:14,v:"14",p:{age:"14"},s:{0:"age=14,"}},{i:15,v:"15",p:{age:"15"},s:{0:"age=15,"}},{i:16,v:"16",p:{age:"16"},s:{0:"age=16,"}},{i:17,v:"17",p:{age:"17"},s:{0:"age=17,"}},{i:18,v:"18",p:{age:"18"},s:{0:"age=18,"}},{i:19,v:"19",p:{age:"19"},s:{0:"age=19,"}},{i:20,v:"20",p:{age:"20"},s:{0:"age=20,"}},{i:21,v:"21",p:{age:"21"},s:{0:"age=21,"}},{i:22,v:"22",p:{age:"22"},s:{0:"age=22,"}},{i:23,v:"23",p:{age:"23"},s:{0:"age=23,"}},{i:24,v:"24",p:{age:"24"},s:{0:"age=24,"}},{i:25,v:"25",p:{age:"25"},s:{0:"age=25,"}}]},{i:1,n:"berries",o:[{i:0,v:"false",p:{berries:"false"},s:{1:"berries=false,"}},{i:1,v:"true",p:{berries:"true"},s:{1:"berries=true,"}}]}],43:[{i:0,n:"berries",o:[{i:0,v:"false",p:{berries:"false"},s:{0:"berries=false,"}},{i:1,v:"true",p:{berries:"true"},s:{0:"berries=true,"}}]}],44:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"axis",o:[{i:0,v:"y",p:{axis:"y"},s:{1:"axis=y,"}},{i:1,v:"z",p:{axis:"z"},s:{1:"axis=z,"}},{i:2,v:"x",p:{axis:"x"},s:{1:"axis=x,"}}]}],45:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"east",p:{facing:"east"},s:{0:"facing=east,"}},{i:2,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:3,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:4,v:"up",p:{facing:"up"},s:{0:"facing=up,"}},{i:5,v:"down",p:{facing:"down"},s:{0:"facing=down,"}}]},{i:1,n:"conditional",o:[{i:0,v:"false",p:{conditional:"false"},s:{1:"conditional=false,"}},{i:1,v:"true",p:{conditional:"true"},s:{1:"conditional=true,"}}]}],46:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{1:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{1:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{1:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{1:"facing=east,"}}]},{i:2,n:"type",o:[{i:0,v:"single",p:{type:"single"},s:{2:"type=single,"}},{i:1,v:"left",p:{type:"left"},s:{2:"type=left,"}},{i:2,v:"right",p:{type:"right"},s:{2:"type=right,"}}]}],47:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"slot_0_occupied",o:[{i:0,v:"false",p:{slot_0_occupied:"false"},s:{1:"slot_0_occupied=false,"}},{i:1,v:"true",p:{slot_0_occupied:"true"},s:{1:"slot_0_occupied=true,"}}]},{i:2,n:"slot_1_occupied",o:[{i:0,v:"false",p:{slot_1_occupied:"false"},s:{2:"slot_1_occupied=false,"}},{i:1,v:"true",p:{slot_1_occupied:"true"},s:{2:"slot_1_occupied=true,"}}]},{i:3,n:"slot_2_occupied",o:[{i:0,v:"false",p:{slot_2_occupied:"false"},s:{3:"slot_2_occupied=false,"}},{i:1,v:"true",p:{slot_2_occupied:"true"},s:{3:"slot_2_occupied=true,"}}]},{i:4,n:"slot_3_occupied",o:[{i:0,v:"false",p:{slot_3_occupied:"false"},s:{4:"slot_3_occupied=false,"}},{i:1,v:"true",p:{slot_3_occupied:"true"},s:{4:"slot_3_occupied=true,"}}]},{i:5,n:"slot_4_occupied",o:[{i:0,v:"false",p:{slot_4_occupied:"false"},s:{5:"slot_4_occupied=false,"}},{i:1,v:"true",p:{slot_4_occupied:"true"},s:{5:"slot_4_occupied=true,"}}]},{i:6,n:"slot_5_occupied",o:[{i:0,v:"false",p:{slot_5_occupied:"false"},s:{6:"slot_5_occupied=false,"}},{i:1,v:"true",p:{slot_5_occupied:"true"},s:{6:"slot_5_occupied=true,"}}]}],48:[{i:0,n:"age",o:[{i:0,v:"0",p:{age:"0"},s:{0:"age=0,"}},{i:1,v:"1",p:{age:"1"},s:{0:"age=1,"}},{i:2,v:"2",p:{age:"2"},s:{0:"age=2,"}},{i:3,v:"3",p:{age:"3"},s:{0:"age=3,"}},{i:4,v:"4",p:{age:"4"},s:{0:"age=4,"}},{i:5,v:"5",p:{age:"5"},s:{0:"age=5,"}}]}],49:[{i:0,n:"east",o:[{i:0,v:"false",p:{east:"false"},s:{0:"east=false,"}},{i:1,v:"true",p:{east:"true"},s:{0:"east=true,"}}]},{i:1,n:"north",o:[{i:0,v:"false",p:{north:"false"},s:{1:"north=false,"}},{i:1,v:"true",p:{north:"true"},s:{1:"north=true,"}}]},{i:2,n:"south",o:[{i:0,v:"false",p:{south:"false"},s:{2:"south=false,"}},{i:1,v:"true",p:{south:"true"},s:{2:"south=true,"}}]},{i:3,n:"west",o:[{i:0,v:"false",p:{west:"false"},s:{3:"west=false,"}},{i:1,v:"true",p:{west:"true"},s:{3:"west=true,"}}]},{i:4,n:"up",o:[{i:0,v:"false",p:{up:"false"},s:{4:"up=false,"}},{i:1,v:"true",p:{up:"true"},s:{4:"up=true,"}}]},{i:5,n:"down",o:[{i:0,v:"false",p:{down:"false"},s:{5:"down=false,"}},{i:1,v:"true",p:{down:"true"},s:{5:"down=true,"}}]}],50:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"age",o:[{i:0,v:"0",p:{age:"0"},s:{1:"age=0,"}},{i:1,v:"1",p:{age:"1"},s:{1:"age=1,"}},{i:2,v:"2",p:{age:"2"},s:{1:"age=2,"}}]}],51:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{1:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{1:"powered=true,"}}]},{i:2,n:"mode",o:[{i:0,v:"compare",p:{mode:"compare"},s:{2:"mode=compare,"}},{i:1,v:"subtract",p:{mode:"subtract"},s:{2:"mode=subtract,"}}]}],52:[{i:0,n:"level",o:[{i:0,v:"0",p:{level:"0"},s:{0:"level=0,"}},{i:1,v:"1",p:{level:"1"},s:{0:"level=1,"}},{i:2,v:"2",p:{level:"2"},s:{0:"level=2,"}},{i:3,v:"3",p:{level:"3"},s:{0:"level=3,"}},{i:4,v:"4",p:{level:"4"},s:{0:"level=4,"}},{i:5,v:"5",p:{level:"5"},s:{0:"level=5,"}},{i:6,v:"6",p:{level:"6"},s:{0:"level=6,"}},{i:7,v:"7",p:{level:"7"},s:{0:"level=7,"}},{i:8,v:"8",p:{level:"8"},s:{0:"level=8,"}}]}],53:[{i:0,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{0:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{0:"powered=true,"}}]},{i:1,n:"lit",o:[{i:0,v:"false",p:{lit:"false"},s:{1:"lit=false,"}},{i:1,v:"true",p:{lit:"true"},s:{1:"lit=true,"}}]}],54:[{i:0,n:"orientation",o:[{i:0,v:"north_up",p:{orientation:"north_up"},s:{0:"orientation=north_up,"}},{i:1,v:"south_up",p:{orientation:"south_up"},s:{0:"orientation=south_up,"}},{i:2,v:"down_east",p:{orientation:"down_east"},s:{0:"orientation=down_east,"}},{i:3,v:"down_north",p:{orientation:"down_north"},s:{0:"orientation=down_north,"}},{i:4,v:"down_south",p:{orientation:"down_south"},s:{0:"orientation=down_south,"}},{i:5,v:"down_west",p:{orientation:"down_west"},s:{0:"orientation=down_west,"}},{i:6,v:"up_east",p:{orientation:"up_east"},s:{0:"orientation=up_east,"}},{i:7,v:"up_north",p:{orientation:"up_north"},s:{0:"orientation=up_north,"}},{i:8,v:"up_south",p:{orientation:"up_south"},s:{0:"orientation=up_south,"}},{i:9,v:"up_west",p:{orientation:"up_west"},s:{0:"orientation=up_west,"}},{i:10,v:"west_up",p:{orientation:"west_up"},s:{0:"orientation=west_up,"}},{i:11,v:"east_up",p:{orientation:"east_up"},s:{0:"orientation=east_up,"}}]},{i:1,n:"triggered",o:[{i:0,v:"false",p:{triggered:"false"},s:{1:"triggered=false,"}},{i:1,v:"true",p:{triggered:"true"},s:{1:"triggered=true,"}}]},{i:2,n:"crafting",o:[{i:0,v:"false",p:{crafting:"false"},s:{2:"crafting=false,"}},{i:1,v:"true",p:{crafting:"true"},s:{2:"crafting=true,"}}]}],55:[{i:0,n:"axis",o:[{i:0,v:"y",p:{axis:"y"},s:{0:"axis=y,"}},{i:1,v:"z",p:{axis:"z"},s:{0:"axis=z,"}},{i:2,v:"x",p:{axis:"x"},s:{0:"axis=x,"}}]},{i:1,n:"creaking",o:[{i:0,v:"disabled",p:{creaking:"disabled"},s:{1:"creaking=disabled,"}},{i:1,v:"dormant",p:{creaking:"dormant"},s:{1:"creaking=dormant,"}},{i:2,v:"active",p:{creaking:"active"},s:{1:"creaking=active,"}}]}],56:[{i:0,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{0:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{0:"powered=true,"}}]},{i:1,n:"rotation",o:[{i:0,v:"0",p:{rotation:"0"},s:{1:"rotation=0,"}},{i:1,v:"1",p:{rotation:"1"},s:{1:"rotation=1,"}},{i:2,v:"2",p:{rotation:"2"},s:{1:"rotation=2,"}},{i:3,v:"3",p:{rotation:"3"},s:{1:"rotation=3,"}},{i:4,v:"4",p:{rotation:"4"},s:{1:"rotation=4,"}},{i:5,v:"5",p:{rotation:"5"},s:{1:"rotation=5,"}},{i:6,v:"6",p:{rotation:"6"},s:{1:"rotation=6,"}},{i:7,v:"7",p:{rotation:"7"},s:{1:"rotation=7,"}},{i:8,v:"8",p:{rotation:"8"},s:{1:"rotation=8,"}},{i:9,v:"9",p:{rotation:"9"},s:{1:"rotation=9,"}},{i:10,v:"10",p:{rotation:"10"},s:{1:"rotation=10,"}},{i:11,v:"11",p:{rotation:"11"},s:{1:"rotation=11,"}},{i:12,v:"12",p:{rotation:"12"},s:{1:"rotation=12,"}},{i:13,v:"13",p:{rotation:"13"},s:{1:"rotation=13,"}},{i:14,v:"14",p:{rotation:"14"},s:{1:"rotation=14,"}},{i:15,v:"15",p:{rotation:"15"},s:{1:"rotation=15,"}}]}],57:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{1:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{1:"powered=true,"}}]}],58:[{i:0,n:"power",o:[{i:0,v:"0",p:{power:"0"},s:{0:"power=0,"}},{i:1,v:"1",p:{power:"1"},s:{0:"power=1,"}},{i:2,v:"2",p:{power:"2"},s:{0:"power=2,"}},{i:3,v:"3",p:{power:"3"},s:{0:"power=3,"}},{i:4,v:"4",p:{power:"4"},s:{0:"power=4,"}},{i:5,v:"5",p:{power:"5"},s:{0:"power=5,"}},{i:6,v:"6",p:{power:"6"},s:{0:"power=6,"}},{i:7,v:"7",p:{power:"7"},s:{0:"power=7,"}},{i:8,v:"8",p:{power:"8"},s:{0:"power=8,"}},{i:9,v:"9",p:{power:"9"},s:{0:"power=9,"}},{i:10,v:"10",p:{power:"10"},s:{0:"power=10,"}},{i:11,v:"11",p:{power:"11"},s:{0:"power=11,"}},{i:12,v:"12",p:{power:"12"},s:{0:"power=12,"}},{i:13,v:"13",p:{power:"13"},s:{0:"power=13,"}},{i:14,v:"14",p:{power:"14"},s:{0:"power=14,"}},{i:15,v:"15",p:{power:"15"},s:{0:"power=15,"}}]},{i:1,n:"inverted",o:[{i:0,v:"false",p:{inverted:"false"},s:{1:"inverted=false,"}},{i:1,v:"true",p:{inverted:"true"},s:{1:"inverted=true,"}}]}],59:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{1:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{1:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{1:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{1:"facing=east,"}}]},{i:2,n:"cracked",o:[{i:0,v:"false",p:{cracked:"false"},s:{2:"cracked=false,"}},{i:1,v:"true",p:{cracked:"true"},s:{2:"cracked=true,"}}]}],60:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"east",p:{facing:"east"},s:{0:"facing=east,"}},{i:2,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:3,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:4,v:"up",p:{facing:"up"},s:{0:"facing=up,"}},{i:5,v:"down",p:{facing:"down"},s:{0:"facing=down,"}}]},{i:1,n:"triggered",o:[{i:0,v:"false",p:{triggered:"false"},s:{1:"triggered=false,"}},{i:1,v:"true",p:{triggered:"true"},s:{1:"triggered=true,"}}]}],61:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"eye",o:[{i:0,v:"false",p:{eye:"false"},s:{1:"eye=false,"}},{i:1,v:"true",p:{eye:"true"},s:{1:"eye=true,"}}]}],62:[{i:0,n:"moisture",o:[{i:0,v:"0",p:{moisture:"0"},s:{0:"moisture=0,"}},{i:1,v:"1",p:{moisture:"1"},s:{0:"moisture=1,"}},{i:2,v:"2",p:{moisture:"2"},s:{0:"moisture=2,"}},{i:3,v:"3",p:{moisture:"3"},s:{0:"moisture=3,"}},{i:4,v:"4",p:{moisture:"4"},s:{0:"moisture=4,"}},{i:5,v:"5",p:{moisture:"5"},s:{0:"moisture=5,"}},{i:6,v:"6",p:{moisture:"6"},s:{0:"moisture=6,"}},{i:7,v:"7",p:{moisture:"7"},s:{0:"moisture=7,"}}]}],63:[{i:0,n:"east",o:[{i:0,v:"false",p:{east:"false"},s:{0:"east=false,"}},{i:1,v:"true",p:{east:"true"},s:{0:"east=true,"}}]},{i:1,n:"north",o:[{i:0,v:"false",p:{north:"false"},s:{1:"north=false,"}},{i:1,v:"true",p:{north:"true"},s:{1:"north=true,"}}]},{i:2,n:"south",o:[{i:0,v:"false",p:{south:"false"},s:{2:"south=false,"}},{i:1,v:"true",p:{south:"true"},s:{2:"south=true,"}}]},{i:3,n:"west",o:[{i:0,v:"false",p:{west:"false"},s:{3:"west=false,"}},{i:1,v:"true",p:{west:"true"},s:{3:"west=true,"}}]},{i:4,n:"up",o:[{i:0,v:"false",p:{up:"false"},s:{4:"up=false,"}},{i:1,v:"true",p:{up:"true"},s:{4:"up=true,"}}]},{i:5,n:"age",o:[{i:0,v:"0",p:{age:"0"},s:{5:"age=0,"}},{i:1,v:"1",p:{age:"1"},s:{5:"age=1,"}},{i:2,v:"2",p:{age:"2"},s:{5:"age=2,"}},{i:3,v:"3",p:{age:"3"},s:{5:"age=3,"}},{i:4,v:"4",p:{age:"4"},s:{5:"age=4,"}},{i:5,v:"5",p:{age:"5"},s:{5:"age=5,"}},{i:6,v:"6",p:{age:"6"},s:{5:"age=6,"}},{i:7,v:"7",p:{age:"7"},s:{5:"age=7,"}},{i:8,v:"8",p:{age:"8"},s:{5:"age=8,"}},{i:9,v:"9",p:{age:"9"},s:{5:"age=9,"}},{i:10,v:"10",p:{age:"10"},s:{5:"age=10,"}},{i:11,v:"11",p:{age:"11"},s:{5:"age=11,"}},{i:12,v:"12",p:{age:"12"},s:{5:"age=12,"}},{i:13,v:"13",p:{age:"13"},s:{5:"age=13,"}},{i:14,v:"14",p:{age:"14"},s:{5:"age=14,"}},{i:15,v:"15",p:{age:"15"},s:{5:"age=15,"}}]}],64:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"east",o:[{i:0,v:"false",p:{east:"false"},s:{1:"east=false,"}},{i:1,v:"true",p:{east:"true"},s:{1:"east=true,"}}]},{i:2,n:"north",o:[{i:0,v:"false",p:{north:"false"},s:{2:"north=false,"}},{i:1,v:"true",p:{north:"true"},s:{2:"north=true,"}}]},{i:3,n:"south",o:[{i:0,v:"false",p:{south:"false"},s:{3:"south=false,"}},{i:1,v:"true",p:{south:"true"},s:{3:"south=true,"}}]},{i:4,n:"west",o:[{i:0,v:"false",p:{west:"false"},s:{4:"west=false,"}},{i:1,v:"true",p:{west:"true"},s:{4:"west=true,"}}]},{i:5,n:"down",o:[{i:0,v:"false",p:{down:"false"},s:{5:"down=false,"}},{i:1,v:"true",p:{down:"true"},s:{5:"down=true,"}}]},{i:6,n:"up",o:[{i:0,v:"false",p:{up:"false"},s:{6:"up=false,"}},{i:1,v:"true",p:{up:"true"},s:{6:"up=true,"}}]}],65:[{i:0,n:"snowy",o:[{i:0,v:"false",p:{snowy:"false"},s:{0:"snowy=false,"}},{i:1,v:"true",p:{snowy:"true"},s:{0:"snowy=true,"}}]}],66:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"face",o:[{i:0,v:"wall",p:{face:"wall"},s:{1:"face=wall,"}},{i:1,v:"ceiling",p:{face:"ceiling"},s:{1:"face=ceiling,"}},{i:2,v:"floor",p:{face:"floor"},s:{1:"face=floor,"}}]}],67:[{i:0,n:"power",o:[{i:0,v:"0",p:{power:"0"},s:{0:"power=0,"}},{i:1,v:"1",p:{power:"1"},s:{0:"power=1,"}},{i:2,v:"2",p:{power:"2"},s:{0:"power=2,"}},{i:3,v:"3",p:{power:"3"},s:{0:"power=3,"}},{i:4,v:"4",p:{power:"4"},s:{0:"power=4,"}},{i:5,v:"5",p:{power:"5"},s:{0:"power=5,"}},{i:6,v:"6",p:{power:"6"},s:{0:"power=6,"}},{i:7,v:"7",p:{power:"7"},s:{0:"power=7,"}},{i:8,v:"8",p:{power:"8"},s:{0:"power=8,"}},{i:9,v:"9",p:{power:"9"},s:{0:"power=9,"}},{i:10,v:"10",p:{power:"10"},s:{0:"power=10,"}},{i:11,v:"11",p:{power:"11"},s:{0:"power=11,"}},{i:12,v:"12",p:{power:"12"},s:{0:"power=12,"}},{i:13,v:"13",p:{power:"13"},s:{0:"power=13,"}},{i:14,v:"14",p:{power:"14"},s:{0:"power=14,"}},{i:15,v:"15",p:{power:"15"},s:{0:"power=15,"}}]}],68:[{i:0,n:"enabled",o:[{i:0,v:"true",p:{enabled:"true"},s:{0:"enabled=true,"}},{i:1,v:"false",p:{enabled:"false"},s:{0:"enabled=false,"}}]},{i:1,n:"facing",o:[{i:0,v:"down",p:{facing:"down"},s:{1:"facing=down,"}},{i:1,v:"north",p:{facing:"north"},s:{1:"facing=north,"}},{i:2,v:"south",p:{facing:"south"},s:{1:"facing=south,"}},{i:3,v:"west",p:{facing:"west"},s:{1:"facing=west,"}},{i:4,v:"east",p:{facing:"east"},s:{1:"facing=east,"}}]}],69:[{i:0,n:"orientation",o:[{i:0,v:"north_up",p:{orientation:"north_up"},s:{0:"orientation=north_up,"}},{i:1,v:"south_up",p:{orientation:"south_up"},s:{0:"orientation=south_up,"}},{i:2,v:"down_east",p:{orientation:"down_east"},s:{0:"orientation=down_east,"}},{i:3,v:"down_north",p:{orientation:"down_north"},s:{0:"orientation=down_north,"}},{i:4,v:"down_south",p:{orientation:"down_south"},s:{0:"orientation=down_south,"}},{i:5,v:"down_west",p:{orientation:"down_west"},s:{0:"orientation=down_west,"}},{i:6,v:"up_east",p:{orientation:"up_east"},s:{0:"orientation=up_east,"}},{i:7,v:"up_north",p:{orientation:"up_north"},s:{0:"orientation=up_north,"}},{i:8,v:"up_south",p:{orientation:"up_south"},s:{0:"orientation=up_south,"}},{i:9,v:"up_west",p:{orientation:"up_west"},s:{0:"orientation=up_west,"}},{i:10,v:"west_up",p:{orientation:"west_up"},s:{0:"orientation=west_up,"}},{i:11,v:"east_up",p:{orientation:"east_up"},s:{0:"orientation=east_up,"}}]}],70:[{i:0,n:"has_record",o:[{i:0,v:"false",p:{has_record:"false"},s:{0:"has_record=false,"}},{i:1,v:"true",p:{has_record:"true"},s:{0:"has_record=true,"}}]}],71:[{i:0,n:"age",o:[{i:0,v:"0",p:{age:"0"},s:{0:"age=0,"}},{i:1,v:"1",p:{age:"1"},s:{0:"age=1,"}},{i:2,v:"2",p:{age:"2"},s:{0:"age=2,"}},{i:3,v:"3",p:{age:"3"},s:{0:"age=3,"}},{i:4,v:"4",p:{age:"4"},s:{0:"age=4,"}},{i:5,v:"5",p:{age:"5"},s:{0:"age=5,"}},{i:6,v:"6",p:{age:"6"},s:{0:"age=6,"}},{i:7,v:"7",p:{age:"7"},s:{0:"age=7,"}},{i:8,v:"8",p:{age:"8"},s:{0:"age=8,"}},{i:9,v:"9",p:{age:"9"},s:{0:"age=9,"}},{i:10,v:"10",p:{age:"10"},s:{0:"age=10,"}},{i:11,v:"11",p:{age:"11"},s:{0:"age=11,"}},{i:12,v:"12",p:{age:"12"},s:{0:"age=12,"}},{i:13,v:"13",p:{age:"13"},s:{0:"age=13,"}},{i:14,v:"14",p:{age:"14"},s:{0:"age=14,"}},{i:15,v:"15",p:{age:"15"},s:{0:"age=15,"}},{i:16,v:"16",p:{age:"16"},s:{0:"age=16,"}},{i:17,v:"17",p:{age:"17"},s:{0:"age=17,"}},{i:18,v:"18",p:{age:"18"},s:{0:"age=18,"}},{i:19,v:"19",p:{age:"19"},s:{0:"age=19,"}},{i:20,v:"20",p:{age:"20"},s:{0:"age=20,"}},{i:21,v:"21",p:{age:"21"},s:{0:"age=21,"}},{i:22,v:"22",p:{age:"22"},s:{0:"age=22,"}},{i:23,v:"23",p:{age:"23"},s:{0:"age=23,"}},{i:24,v:"24",p:{age:"24"},s:{0:"age=24,"}},{i:25,v:"25",p:{age:"25"},s:{0:"age=25,"}}]}],72:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"hanging",o:[{i:0,v:"false",p:{hanging:"false"},s:{1:"hanging=false,"}},{i:1,v:"true",p:{hanging:"true"},s:{1:"hanging=true,"}}]}],73:[{i:0,n:"half",o:[{i:0,v:"lower",p:{half:"lower"},s:{0:"half=lower,"}},{i:1,v:"upper",p:{half:"upper"},s:{0:"half=upper,"}}]}],74:[{i:0,n:"level",o:[{i:0,v:"0",p:{level:"0"},s:{0:"level=0,"}},{i:1,v:"1",p:{level:"1"},s:{0:"level=1,"}},{i:2,v:"2",p:{level:"2"},s:{0:"level=2,"}},{i:3,v:"3",p:{level:"3"},s:{0:"level=3,"}},{i:4,v:"4",p:{level:"4"},s:{0:"level=4,"}},{i:5,v:"5",p:{level:"5"},s:{0:"level=5,"}},{i:6,v:"6",p:{level:"6"},s:{0:"level=6,"}},{i:7,v:"7",p:{level:"7"},s:{0:"level=7,"}},{i:8,v:"8",p:{level:"8"},s:{0:"level=8,"}},{i:9,v:"9",p:{level:"9"},s:{0:"level=9,"}},{i:10,v:"10",p:{level:"10"},s:{0:"level=10,"}},{i:11,v:"11",p:{level:"11"},s:{0:"level=11,"}},{i:12,v:"12",p:{level:"12"},s:{0:"level=12,"}},{i:13,v:"13",p:{level:"13"},s:{0:"level=13,"}},{i:14,v:"14",p:{level:"14"},s:{0:"level=14,"}},{i:15,v:"15",p:{level:"15"},s:{0:"level=15,"}}]}],75:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{1:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{1:"powered=true,"}}]},{i:2,n:"has_book",o:[{i:0,v:"false",p:{has_book:"false"},s:{2:"has_book=false,"}},{i:1,v:"true",p:{has_book:"true"},s:{2:"has_book=true,"}}]}],76:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"level",o:[{i:0,v:"15",p:{level:"15"},s:{1:"level=15,"}},{i:1,v:"0",p:{level:"0"},s:{1:"level=0,"}},{i:2,v:"1",p:{level:"1"},s:{1:"level=1,"}},{i:3,v:"2",p:{level:"2"},s:{1:"level=2,"}},{i:4,v:"3",p:{level:"3"},s:{1:"level=3,"}},{i:5,v:"4",p:{level:"4"},s:{1:"level=4,"}},{i:6,v:"5",p:{level:"5"},s:{1:"level=5,"}},{i:7,v:"6",p:{level:"6"},s:{1:"level=6,"}},{i:8,v:"7",p:{level:"7"},s:{1:"level=7,"}},{i:9,v:"8",p:{level:"8"},s:{1:"level=8,"}},{i:10,v:"9",p:{level:"9"},s:{1:"level=9,"}},{i:11,v:"10",p:{level:"10"},s:{1:"level=10,"}},{i:12,v:"11",p:{level:"11"},s:{1:"level=11,"}},{i:13,v:"12",p:{level:"12"},s:{1:"level=12,"}},{i:14,v:"13",p:{level:"13"},s:{1:"level=13,"}},{i:15,v:"14",p:{level:"14"},s:{1:"level=14,"}}]}],77:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"facing",o:[{i:0,v:"up",p:{facing:"up"},s:{1:"facing=up,"}},{i:1,v:"down",p:{facing:"down"},s:{1:"facing=down,"}},{i:2,v:"north",p:{facing:"north"},s:{1:"facing=north,"}},{i:3,v:"east",p:{facing:"east"},s:{1:"facing=east,"}},{i:4,v:"south",p:{facing:"south"},s:{1:"facing=south,"}},{i:5,v:"west",p:{facing:"west"},s:{1:"facing=west,"}}]},{i:2,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{2:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{2:"powered=true,"}}]}],78:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"hanging",o:[{i:0,v:"false",p:{hanging:"false"},s:{1:"hanging=false,"}},{i:1,v:"true",p:{hanging:"true"},s:{1:"hanging=true,"}}]},{i:2,n:"age",o:[{i:0,v:"0",p:{age:"0"},s:{2:"age=0,"}},{i:1,v:"1",p:{age:"1"},s:{2:"age=1,"}},{i:2,v:"2",p:{age:"2"},s:{2:"age=2,"}},{i:3,v:"3",p:{age:"3"},s:{2:"age=3,"}},{i:4,v:"4",p:{age:"4"},s:{2:"age=4,"}}]},{i:3,n:"stage",o:[{i:0,v:"0",p:{stage:"0"},s:{3:"stage=0,"}},{i:1,v:"1",p:{stage:"1"},s:{3:"stage=1,"}}]}],79:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"east",p:{facing:"east"},s:{0:"facing=east,"}},{i:2,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:3,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:4,v:"up",p:{facing:"up"},s:{0:"facing=up,"}},{i:5,v:"down",p:{facing:"down"},s:{0:"facing=down,"}}]},{i:1,n:"type",o:[{i:0,v:"normal",p:{type:"normal"},s:{1:"type=normal,"}},{i:1,v:"sticky",p:{type:"sticky"},s:{1:"type=sticky,"}}]}],80:[{i:0,n:"axis",o:[{i:0,v:"x",p:{axis:"x"},s:{0:"axis=x,"}},{i:1,v:"z",p:{axis:"z"},s:{0:"axis=z,"}}]}],81:[{i:0,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{0:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{0:"powered=true,"}}]},{i:1,n:"instrument",o:[{i:0,v:"harp",p:{instrument:"harp"},s:{1:"instrument=harp,"}},{i:1,v:"basedrum",p:{instrument:"basedrum"},s:{1:"instrument=basedrum,"}},{i:2,v:"snare",p:{instrument:"snare"},s:{1:"instrument=snare,"}},{i:3,v:"hat",p:{instrument:"hat"},s:{1:"instrument=hat,"}},{i:4,v:"bass",p:{instrument:"bass"},s:{1:"instrument=bass,"}},{i:5,v:"flute",p:{instrument:"flute"},s:{1:"instrument=flute,"}},{i:6,v:"bell",p:{instrument:"bell"},s:{1:"instrument=bell,"}},{i:7,v:"guitar",p:{instrument:"guitar"},s:{1:"instrument=guitar,"}},{i:8,v:"chime",p:{instrument:"chime"},s:{1:"instrument=chime,"}},{i:9,v:"xylophone",p:{instrument:"xylophone"},s:{1:"instrument=xylophone,"}},{i:10,v:"iron_xylophone",p:{instrument:"iron_xylophone"},s:{1:"instrument=iron_xylophone,"}},{i:11,v:"cow_bell",p:{instrument:"cow_bell"},s:{1:"instrument=cow_bell,"}},{i:12,v:"didgeridoo",p:{instrument:"didgeridoo"},s:{1:"instrument=didgeridoo,"}},{i:13,v:"bit",p:{instrument:"bit"},s:{1:"instrument=bit,"}},{i:14,v:"banjo",p:{instrument:"banjo"},s:{1:"instrument=banjo,"}},{i:15,v:"pling",p:{instrument:"pling"},s:{1:"instrument=pling,"}},{i:16,v:"zombie",p:{instrument:"zombie"},s:{1:"instrument=zombie,"}},{i:17,v:"skeleton",p:{instrument:"skeleton"},s:{1:"instrument=skeleton,"}},{i:18,v:"creeper",p:{instrument:"creeper"},s:{1:"instrument=creeper,"}},{i:19,v:"dragon",p:{instrument:"dragon"},s:{1:"instrument=dragon,"}},{i:20,v:"wither_skeleton",p:{instrument:"wither_skeleton"},s:{1:"instrument=wither_skeleton,"}},{i:21,v:"piglin",p:{instrument:"piglin"},s:{1:"instrument=piglin,"}},{i:22,v:"custom_head",p:{instrument:"custom_head"},s:{1:"instrument=custom_head,"}}]},{i:2,n:"note",o:[{i:0,v:"0",p:{note:"0"},s:{2:"note=0,"}},{i:1,v:"1",p:{note:"1"},s:{2:"note=1,"}},{i:2,v:"2",p:{note:"2"},s:{2:"note=2,"}},{i:3,v:"3",p:{note:"3"},s:{2:"note=3,"}},{i:4,v:"4",p:{note:"4"},s:{2:"note=4,"}},{i:5,v:"5",p:{note:"5"},s:{2:"note=5,"}},{i:6,v:"6",p:{note:"6"},s:{2:"note=6,"}},{i:7,v:"7",p:{note:"7"},s:{2:"note=7,"}},{i:8,v:"8",p:{note:"8"},s:{2:"note=8,"}},{i:9,v:"9",p:{note:"9"},s:{2:"note=9,"}},{i:10,v:"10",p:{note:"10"},s:{2:"note=10,"}},{i:11,v:"11",p:{note:"11"},s:{2:"note=11,"}},{i:12,v:"12",p:{note:"12"},s:{2:"note=12,"}},{i:13,v:"13",p:{note:"13"},s:{2:"note=13,"}},{i:14,v:"14",p:{note:"14"},s:{2:"note=14,"}},{i:15,v:"15",p:{note:"15"},s:{2:"note=15,"}},{i:16,v:"16",p:{note:"16"},s:{2:"note=16,"}},{i:17,v:"17",p:{note:"17"},s:{2:"note=17,"}},{i:18,v:"18",p:{note:"18"},s:{2:"note=18,"}},{i:19,v:"19",p:{note:"19"},s:{2:"note=19,"}},{i:20,v:"20",p:{note:"20"},s:{2:"note=20,"}},{i:21,v:"21",p:{note:"21"},s:{2:"note=21,"}},{i:22,v:"22",p:{note:"22"},s:{2:"note=22,"}},{i:23,v:"23",p:{note:"23"},s:{2:"note=23,"}},{i:24,v:"24",p:{note:"24"},s:{2:"note=24,"}}]}],82:[{i:0,n:"facing",o:[{i:0,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:1,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:2,v:"up",p:{facing:"up"},s:{0:"facing=up,"}},{i:3,v:"down",p:{facing:"down"},s:{0:"facing=down,"}},{i:4,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:5,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{1:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{1:"powered=true,"}}]}],83:[{i:0,n:"tip",o:[{i:0,v:"true",p:{tip:"true"},s:{0:"tip=true,"}},{i:1,v:"false",p:{tip:"false"},s:{0:"tip=false,"}}]}],84:[{i:0,n:"bottom",o:[{i:0,v:"true",p:{bottom:"true"},s:{0:"bottom=true,"}},{i:1,v:"false",p:{bottom:"false"},s:{0:"bottom=false,"}}]},{i:1,n:"east",o:[{i:0,v:"none",p:{east:"none"},s:{1:"east=none,"}},{i:1,v:"low",p:{east:"low"},s:{1:"east=low,"}},{i:2,v:"tall",p:{east:"tall"},s:{1:"east=tall,"}}]},{i:2,n:"north",o:[{i:0,v:"none",p:{north:"none"},s:{2:"north=none,"}},{i:1,v:"low",p:{north:"low"},s:{2:"north=low,"}},{i:2,v:"tall",p:{north:"tall"},s:{2:"north=tall,"}}]},{i:3,n:"south",o:[{i:0,v:"none",p:{south:"none"},s:{3:"south=none,"}},{i:1,v:"low",p:{south:"low"},s:{3:"south=low,"}},{i:2,v:"tall",p:{south:"tall"},s:{3:"south=tall,"}}]},{i:4,n:"west",o:[{i:0,v:"none",p:{west:"none"},s:{4:"west=none,"}},{i:1,v:"low",p:{west:"low"},s:{4:"west=low,"}},{i:2,v:"tall",p:{west:"tall"},s:{4:"west=tall,"}}]}],85:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"flower_amount",o:[{i:0,v:"1",p:{flower_amount:"1"},s:{1:"flower_amount=1,"}},{i:1,v:"2",p:{flower_amount:"2"},s:{1:"flower_amount=2,"}},{i:2,v:"3",p:{flower_amount:"3"},s:{1:"flower_amount=3,"}},{i:3,v:"4",p:{flower_amount:"4"},s:{1:"flower_amount=4,"}}]}],86:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"east",p:{facing:"east"},s:{0:"facing=east,"}},{i:2,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:3,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:4,v:"up",p:{facing:"up"},s:{0:"facing=up,"}},{i:5,v:"down",p:{facing:"down"},s:{0:"facing=down,"}}]},{i:1,n:"extended",o:[{i:0,v:"false",p:{extended:"false"},s:{1:"extended=false,"}},{i:1,v:"true",p:{extended:"true"},s:{1:"extended=true,"}}]}],87:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"east",p:{facing:"east"},s:{0:"facing=east,"}},{i:2,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:3,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:4,v:"up",p:{facing:"up"},s:{0:"facing=up,"}},{i:5,v:"down",p:{facing:"down"},s:{0:"facing=down,"}}]},{i:1,n:"type",o:[{i:0,v:"normal",p:{type:"normal"},s:{1:"type=normal,"}},{i:1,v:"sticky",p:{type:"sticky"},s:{1:"type=sticky,"}}]},{i:2,n:"short",o:[{i:0,v:"false",p:{short:"false"},s:{2:"short=false,"}},{i:1,v:"true",p:{short:"true"},s:{2:"short=true,"}}]}],88:[{i:0,n:"half",o:[{i:0,v:"lower",p:{half:"lower"},s:{0:"half=lower,"}},{i:1,v:"upper",p:{half:"upper"},s:{0:"half=upper,"}}]},{i:1,n:"age",o:[{i:0,v:"0",p:{age:"0"},s:{1:"age=0,"}},{i:1,v:"1",p:{age:"1"},s:{1:"age=1,"}},{i:2,v:"2",p:{age:"2"},s:{1:"age=2,"}},{i:3,v:"3",p:{age:"3"},s:{1:"age=3,"}},{i:4,v:"4",p:{age:"4"},s:{1:"age=4,"}}]}],89:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"thickness",o:[{i:0,v:"tip",p:{thickness:"tip"},s:{1:"thickness=tip,"}},{i:1,v:"frustum",p:{thickness:"frustum"},s:{1:"thickness=frustum,"}},{i:2,v:"middle",p:{thickness:"middle"},s:{1:"thickness=middle,"}},{i:3,v:"base",p:{thickness:"base"},s:{1:"thickness=base,"}},{i:4,v:"tip_merge",p:{thickness:"tip_merge"},s:{1:"thickness=tip_merge,"}}]},{i:2,n:"vertical_direction",o:[{i:0,v:"up",p:{vertical_direction:"up"},s:{2:"vertical_direction=up,"}},{i:1,v:"down",p:{vertical_direction:"down"},s:{2:"vertical_direction=down,"}}]}],90:[{i:0,n:"level",o:[{i:0,v:"1",p:{level:"1"},s:{0:"level=1,"}},{i:1,v:"2",p:{level:"2"},s:{0:"level=2,"}},{i:2,v:"3",p:{level:"3"},s:{0:"level=3,"}}]}],91:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"shape",o:[{i:0,v:"north_south",p:{shape:"north_south"},s:{1:"shape=north_south,"}},{i:1,v:"east_west",p:{shape:"east_west"},s:{1:"shape=east_west,"}},{i:2,v:"ascending_east",p:{shape:"ascending_east"},s:{1:"shape=ascending_east,"}},{i:3,v:"ascending_west",p:{shape:"ascending_west"},s:{1:"shape=ascending_west,"}},{i:4,v:"ascending_north",p:{shape:"ascending_north"},s:{1:"shape=ascending_north,"}},{i:5,v:"ascending_south",p:{shape:"ascending_south"},s:{1:"shape=ascending_south,"}},{i:6,v:"south_east",p:{shape:"south_east"},s:{1:"shape=south_east,"}},{i:7,v:"south_west",p:{shape:"south_west"},s:{1:"shape=south_west,"}},{i:8,v:"north_west",p:{shape:"north_west"},s:{1:"shape=north_west,"}},{i:9,v:"north_east",p:{shape:"north_east"},s:{1:"shape=north_east,"}}]}],92:[{i:0,n:"lit",o:[{i:0,v:"true",p:{lit:"true"},s:{0:"lit=true,"}},{i:1,v:"false",p:{lit:"false"},s:{0:"lit=false,"}}]}],93:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"lit",o:[{i:0,v:"true",p:{lit:"true"},s:{1:"lit=true,"}},{i:1,v:"false",p:{lit:"false"},s:{1:"lit=false,"}}]}],94:[{i:0,n:"power",o:[{i:0,v:"0",p:{power:"0"},s:{0:"power=0,"}},{i:1,v:"1",p:{power:"1"},s:{0:"power=1,"}},{i:2,v:"2",p:{power:"2"},s:{0:"power=2,"}},{i:3,v:"3",p:{power:"3"},s:{0:"power=3,"}},{i:4,v:"4",p:{power:"4"},s:{0:"power=4,"}},{i:5,v:"5",p:{power:"5"},s:{0:"power=5,"}},{i:6,v:"6",p:{power:"6"},s:{0:"power=6,"}},{i:7,v:"7",p:{power:"7"},s:{0:"power=7,"}},{i:8,v:"8",p:{power:"8"},s:{0:"power=8,"}},{i:9,v:"9",p:{power:"9"},s:{0:"power=9,"}},{i:10,v:"10",p:{power:"10"},s:{0:"power=10,"}},{i:11,v:"11",p:{power:"11"},s:{0:"power=11,"}},{i:12,v:"12",p:{power:"12"},s:{0:"power=12,"}},{i:13,v:"13",p:{power:"13"},s:{0:"power=13,"}},{i:14,v:"14",p:{power:"14"},s:{0:"power=14,"}},{i:15,v:"15",p:{power:"15"},s:{0:"power=15,"}}]},{i:1,n:"east",o:[{i:0,v:"none",p:{east:"none"},s:{1:"east=none,"}},{i:1,v:"up",p:{east:"up"},s:{1:"east=up,"}},{i:2,v:"side",p:{east:"side"},s:{1:"east=side,"}}]},{i:2,n:"north",o:[{i:0,v:"none",p:{north:"none"},s:{2:"north=none,"}},{i:1,v:"up",p:{north:"up"},s:{2:"north=up,"}},{i:2,v:"side",p:{north:"side"},s:{2:"north=side,"}}]},{i:3,n:"south",o:[{i:0,v:"none",p:{south:"none"},s:{3:"south=none,"}},{i:1,v:"up",p:{south:"up"},s:{3:"south=up,"}},{i:2,v:"side",p:{south:"side"},s:{3:"south=side,"}}]},{i:4,n:"west",o:[{i:0,v:"none",p:{west:"none"},s:{4:"west=none,"}},{i:1,v:"up",p:{west:"up"},s:{4:"west=up,"}},{i:2,v:"side",p:{west:"side"},s:{4:"west=side,"}}]}],95:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{1:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{1:"powered=true,"}}]},{i:2,n:"delay",o:[{i:0,v:"1",p:{delay:"1"},s:{2:"delay=1,"}},{i:1,v:"2",p:{delay:"2"},s:{2:"delay=2,"}},{i:2,v:"3",p:{delay:"3"},s:{2:"delay=3,"}},{i:3,v:"4",p:{delay:"4"},s:{2:"delay=4,"}}]},{i:3,n:"locked",o:[{i:0,v:"false",p:{locked:"false"},s:{3:"locked=false,"}},{i:1,v:"true",p:{locked:"true"},s:{3:"locked=true,"}}]}],96:[{i:0,n:"charges",o:[{i:0,v:"0",p:{charges:"0"},s:{0:"charges=0,"}},{i:1,v:"1",p:{charges:"1"},s:{0:"charges=1,"}},{i:2,v:"2",p:{charges:"2"},s:{0:"charges=2,"}},{i:3,v:"3",p:{charges:"3"},s:{0:"charges=3,"}},{i:4,v:"4",p:{charges:"4"},s:{0:"charges=4,"}}]}],97:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"bottom",o:[{i:0,v:"false",p:{bottom:"false"},s:{1:"bottom=false,"}},{i:1,v:"true",p:{bottom:"true"},s:{1:"bottom=true,"}}]},{i:2,n:"distance",o:[{i:0,v:"7",p:{distance:"7"},s:{2:"distance=7,"}},{i:1,v:"0",p:{distance:"0"},s:{2:"distance=0,"}},{i:2,v:"1",p:{distance:"1"},s:{2:"distance=1,"}},{i:3,v:"2",p:{distance:"2"},s:{2:"distance=2,"}},{i:4,v:"3",p:{distance:"3"},s:{2:"distance=3,"}},{i:5,v:"4",p:{distance:"4"},s:{2:"distance=4,"}},{i:6,v:"5",p:{distance:"5"},s:{2:"distance=5,"}},{i:7,v:"6",p:{distance:"6"},s:{2:"distance=6,"}}]}],98:[{i:0,n:"bloom",o:[{i:0,v:"false",p:{bloom:"false"},s:{0:"bloom=false,"}},{i:1,v:"true",p:{bloom:"true"},s:{0:"bloom=true,"}}]}],99:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"power",o:[{i:0,v:"0",p:{power:"0"},s:{1:"power=0,"}},{i:1,v:"1",p:{power:"1"},s:{1:"power=1,"}},{i:2,v:"2",p:{power:"2"},s:{1:"power=2,"}},{i:3,v:"3",p:{power:"3"},s:{1:"power=3,"}},{i:4,v:"4",p:{power:"4"},s:{1:"power=4,"}},{i:5,v:"5",p:{power:"5"},s:{1:"power=5,"}},{i:6,v:"6",p:{power:"6"},s:{1:"power=6,"}},{i:7,v:"7",p:{power:"7"},s:{1:"power=7,"}},{i:8,v:"8",p:{power:"8"},s:{1:"power=8,"}},{i:9,v:"9",p:{power:"9"},s:{1:"power=9,"}},{i:10,v:"10",p:{power:"10"},s:{1:"power=10,"}},{i:11,v:"11",p:{power:"11"},s:{1:"power=11,"}},{i:12,v:"12",p:{power:"12"},s:{1:"power=12,"}},{i:13,v:"13",p:{power:"13"},s:{1:"power=13,"}},{i:14,v:"14",p:{power:"14"},s:{1:"power=14,"}},{i:15,v:"15",p:{power:"15"},s:{1:"power=15,"}}]},{i:2,n:"sculk_sensor_phase",o:[{i:0,v:"inactive",p:{sculk_sensor_phase:"inactive"},s:{2:"sculk_sensor_phase=inactive,"}},{i:1,v:"active",p:{sculk_sensor_phase:"active"},s:{2:"sculk_sensor_phase=active,"}},{i:2,v:"cooldown",p:{sculk_sensor_phase:"cooldown"},s:{2:"sculk_sensor_phase=cooldown,"}}]}],100:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"can_summon",o:[{i:0,v:"false",p:{can_summon:"false"},s:{1:"can_summon=false,"}},{i:1,v:"true",p:{can_summon:"true"},s:{1:"can_summon=true,"}}]},{i:2,n:"shrieking",o:[{i:0,v:"false",p:{shrieking:"false"},s:{2:"shrieking=false,"}},{i:1,v:"true",p:{shrieking:"true"},s:{2:"shrieking=true,"}}]}],101:[{i:0,n:"waterlogged",o:[{i:0,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}},{i:1,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}}]},{i:1,n:"pickles",o:[{i:0,v:"1",p:{pickles:"1"},s:{1:"pickles=1,"}},{i:1,v:"2",p:{pickles:"2"},s:{1:"pickles=2,"}},{i:2,v:"3",p:{pickles:"3"},s:{1:"pickles=3,"}},{i:3,v:"4",p:{pickles:"4"},s:{1:"pickles=4,"}}]}],102:[{i:0,n:"waterlogged",o:[{i:0,v:"false",p:{waterlogged:"false"},s:{0:"waterlogged=false,"}},{i:1,v:"true",p:{waterlogged:"true"},s:{0:"waterlogged=true,"}}]},{i:1,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{1:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{1:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{1:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{1:"facing=east,"}}]},{i:2,n:"half",o:[{i:0,v:"lower",p:{half:"lower"},s:{2:"half=lower,"}},{i:1,v:"upper",p:{half:"upper"},s:{2:"half=upper,"}}]}],103:[{i:0,n:"hatch",o:[{i:0,v:"0",p:{hatch:"0"},s:{0:"hatch=0,"}},{i:1,v:"1",p:{hatch:"1"},s:{0:"hatch=1,"}},{i:2,v:"2",p:{hatch:"2"},s:{0:"hatch=2,"}}]}],104:[{i:0,n:"layers",o:[{i:0,v:"1",p:{layers:"1"},s:{0:"layers=1,"}},{i:1,v:"2",p:{layers:"2"},s:{0:"layers=2,"}},{i:2,v:"3",p:{layers:"3"},s:{0:"layers=3,"}},{i:3,v:"4",p:{layers:"4"},s:{0:"layers=4,"}},{i:4,v:"5",p:{layers:"5"},s:{0:"layers=5,"}},{i:5,v:"6",p:{layers:"6"},s:{0:"layers=6,"}},{i:6,v:"7",p:{layers:"7"},s:{0:"layers=7,"}},{i:7,v:"8",p:{layers:"8"},s:{0:"layers=8,"}}]}],105:[{i:0,n:"mode",o:[{i:0,v:"load",p:{mode:"load"},s:{0:"mode=load,"}},{i:1,v:"corner",p:{mode:"corner"},s:{0:"mode=corner,"}},{i:2,v:"data",p:{mode:"data"},s:{0:"mode=data,"}},{i:3,v:"save",p:{mode:"save"},s:{0:"mode=save,"}}]}],106:[{i:0,n:"dusted",o:[{i:0,v:"0",p:{dusted:"0"},s:{0:"dusted=0,"}},{i:1,v:"1",p:{dusted:"1"},s:{0:"dusted=1,"}},{i:2,v:"2",p:{dusted:"2"},s:{0:"dusted=2,"}},{i:3,v:"3",p:{dusted:"3"},s:{0:"dusted=3,"}}]}],107:[{i:0,n:"unstable",o:[{i:0,v:"false",p:{unstable:"false"},s:{0:"unstable=false,"}},{i:1,v:"true",p:{unstable:"true"},s:{0:"unstable=true,"}}]}],108:[{i:0,n:"age",o:[{i:0,v:"0",p:{age:"0"},s:{0:"age=0,"}},{i:1,v:"1",p:{age:"1"},s:{0:"age=1,"}}]}],109:[{i:0,n:"ominous",o:[{i:0,v:"false",p:{ominous:"false"},s:{0:"ominous=false,"}},{i:1,v:"true",p:{ominous:"true"},s:{0:"ominous=true,"}}]},{i:1,n:"trial_spawner_state",o:[{i:0,v:"inactive",p:{trial_spawner_state:"inactive"},s:{1:"trial_spawner_state=inactive,"}},{i:1,v:"waiting_for_players",p:{trial_spawner_state:"waiting_for_players"},s:{1:"trial_spawner_state=waiting_for_players,"}},{i:2,v:"active",p:{trial_spawner_state:"active"},s:{1:"trial_spawner_state=active,"}},{i:3,v:"waiting_for_reward_ejection",p:{trial_spawner_state:"waiting_for_reward_ejection"},s:{1:"trial_spawner_state=waiting_for_reward_ejection,"}},{i:4,v:"ejecting_reward",p:{trial_spawner_state:"ejecting_reward"},s:{1:"trial_spawner_state=ejecting_reward,"}},{i:5,v:"cooldown",p:{trial_spawner_state:"cooldown"},s:{1:"trial_spawner_state=cooldown,"}}]}],110:[{i:0,n:"east",o:[{i:0,v:"false",p:{east:"false"},s:{0:"east=false,"}},{i:1,v:"true",p:{east:"true"},s:{0:"east=true,"}}]},{i:1,n:"north",o:[{i:0,v:"false",p:{north:"false"},s:{1:"north=false,"}},{i:1,v:"true",p:{north:"true"},s:{1:"north=true,"}}]},{i:2,n:"south",o:[{i:0,v:"false",p:{south:"false"},s:{2:"south=false,"}},{i:1,v:"true",p:{south:"true"},s:{2:"south=true,"}}]},{i:3,n:"west",o:[{i:0,v:"false",p:{west:"false"},s:{3:"west=false,"}},{i:1,v:"true",p:{west:"true"},s:{3:"west=true,"}}]},{i:4,n:"attached",o:[{i:0,v:"false",p:{attached:"false"},s:{4:"attached=false,"}},{i:1,v:"true",p:{attached:"true"},s:{4:"attached=true,"}}]},{i:5,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{5:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{5:"powered=true,"}}]},{i:6,n:"disarmed",o:[{i:0,v:"false",p:{disarmed:"false"},s:{6:"disarmed=false,"}},{i:1,v:"true",p:{disarmed:"true"},s:{6:"disarmed=true,"}}]}],111:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"powered",o:[{i:0,v:"false",p:{powered:"false"},s:{1:"powered=false,"}},{i:1,v:"true",p:{powered:"true"},s:{1:"powered=true,"}}]},{i:2,n:"attached",o:[{i:0,v:"false",p:{attached:"false"},s:{2:"attached=false,"}},{i:1,v:"true",p:{attached:"true"},s:{2:"attached=true,"}}]}],112:[{i:0,n:"hatch",o:[{i:0,v:"0",p:{hatch:"0"},s:{0:"hatch=0,"}},{i:1,v:"1",p:{hatch:"1"},s:{0:"hatch=1,"}},{i:2,v:"2",p:{hatch:"2"},s:{0:"hatch=2,"}}]},{i:1,n:"eggs",o:[{i:0,v:"1",p:{eggs:"1"},s:{1:"eggs=1,"}},{i:1,v:"2",p:{eggs:"2"},s:{1:"eggs=2,"}},{i:2,v:"3",p:{eggs:"3"},s:{1:"eggs=3,"}},{i:3,v:"4",p:{eggs:"4"},s:{1:"eggs=4,"}}]}],113:[{i:0,n:"facing",o:[{i:0,v:"north",p:{facing:"north"},s:{0:"facing=north,"}},{i:1,v:"south",p:{facing:"south"},s:{0:"facing=south,"}},{i:2,v:"west",p:{facing:"west"},s:{0:"facing=west,"}},{i:3,v:"east",p:{facing:"east"},s:{0:"facing=east,"}}]},{i:1,n:"ominous",o:[{i:0,v:"false",p:{ominous:"false"},s:{1:"ominous=false,"}},{i:1,v:"true",p:{ominous:"true"},s:{1:"ominous=true,"}}]},{i:2,n:"vault_state",o:[{i:0,v:"inactive",p:{vault_state:"inactive"},s:{2:"vault_state=inactive,"}},{i:1,v:"active",p:{vault_state:"active"},s:{2:"vault_state=active,"}},{i:2,v:"unlocking",p:{vault_state:"unlocking"},s:{2:"vault_state=unlocking,"}},{i:3,v:"ejecting",p:{vault_state:"ejecting"},s:{2:"vault_state=ejecting,"}}]}],114:[{i:0,n:"east",o:[{i:0,v:"false",p:{east:"false"},s:{0:"east=false,"}},{i:1,v:"true",p:{east:"true"},s:{0:"east=true,"}}]},{i:1,n:"north",o:[{i:0,v:"false",p:{north:"false"},s:{1:"north=false,"}},{i:1,v:"true",p:{north:"true"},s:{1:"north=true,"}}]},{i:2,n:"south",o:[{i:0,v:"false",p:{south:"false"},s:{2:"south=false,"}},{i:1,v:"true",p:{south:"true"},s:{2:"south=true,"}}]},{i:3,n:"west",o:[{i:0,v:"false",p:{west:"false"},s:{3:"west=false,"}},{i:1,v:"true",p:{west:"true"},s:{3:"west=true,"}}]},{i:4,n:"up",o:[{i:0,v:"false",p:{up:"false"},s:{4:"up=false,"}},{i:1,v:"true",p:{up:"true"},s:{4:"up=true,"}}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/function/load/items_table.mcfunction b/datapacks/Bookshelf/data/bs.block/function/load/items_table.mcfunction
deleted file mode 100644
index a4ff8869b9..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/load/items_table.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# This file was automatically generated, do not edit it
-data modify storage bs:const block.items set value {"minecraft:vine":{type:"minecraft:vine",item:"minecraft:vine",group:114},"minecraft:vault":{type:"minecraft:vault",item:"minecraft:vault",group:113},"minecraft:turtle_egg":{type:"minecraft:turtle_egg",item:"minecraft:turtle_egg",group:112},"minecraft:tripwire_hook":{type:"minecraft:tripwire_hook",item:"minecraft:tripwire_hook",group:111},"minecraft:string":{type:"minecraft:tripwire",item:"minecraft:string",group:110},"minecraft:trial_spawner":{type:"minecraft:trial_spawner",item:"minecraft:trial_spawner",group:109},"minecraft:torchflower_seeds":{type:"minecraft:torchflower_crop",item:"minecraft:torchflower_seeds",group:108},"minecraft:tnt":{type:"minecraft:tnt",item:"minecraft:tnt",group:107},"minecraft:suspicious_sand":{type:"minecraft:suspicious_sand",item:"minecraft:suspicious_sand",group:106},"minecraft:suspicious_gravel":{type:"minecraft:suspicious_gravel",item:"minecraft:suspicious_gravel",group:106},"minecraft:structure_block":{type:"minecraft:structure_block",item:"minecraft:structure_block",group:105},"minecraft:snow":{type:"minecraft:snow",item:"minecraft:snow",group:104},"minecraft:sniffer_egg":{type:"minecraft:sniffer_egg",item:"minecraft:sniffer_egg",group:103},"minecraft:small_dripleaf":{type:"minecraft:small_dripleaf",item:"minecraft:small_dripleaf",group:102},"minecraft:sea_pickle":{type:"minecraft:sea_pickle",item:"minecraft:sea_pickle",group:101},"minecraft:sculk_shrieker":{type:"minecraft:sculk_shrieker",item:"minecraft:sculk_shrieker",group:100},"minecraft:sculk_sensor":{type:"minecraft:sculk_sensor",item:"minecraft:sculk_sensor",group:99},"minecraft:sculk_catalyst":{type:"minecraft:sculk_catalyst",item:"minecraft:sculk_catalyst",group:98},"minecraft:scaffolding":{type:"minecraft:scaffolding",item:"minecraft:scaffolding",group:97},"minecraft:respawn_anchor":{type:"minecraft:respawn_anchor",item:"minecraft:respawn_anchor",group:96},"minecraft:repeater":{type:"minecraft:repeater",item:"minecraft:repeater",group:95},"minecraft:redstone":{type:"minecraft:redstone_wire",item:"minecraft:redstone",group:94},"minecraft:redstone_torch":{type:"minecraft:redstone_torch",item:"minecraft:redstone_torch",group:92},"minecraft:rail":{type:"minecraft:rail",item:"minecraft:rail",group:91},"minecraft:cauldron":{type:"minecraft:cauldron",item:"minecraft:cauldron",group:0},"minecraft:pointed_dripstone":{type:"minecraft:pointed_dripstone",item:"minecraft:pointed_dripstone",group:89},"minecraft:pitcher_pod":{type:"minecraft:pitcher_crop",item:"minecraft:pitcher_pod",group:88},None:{type:"minecraft:bamboo_sapling",group:0},"minecraft:sticky_piston":{type:"minecraft:sticky_piston",item:"minecraft:sticky_piston",group:86},"minecraft:piston":{type:"minecraft:piston",item:"minecraft:piston",group:86},"minecraft:pink_petals":{type:"minecraft:pink_petals",item:"minecraft:pink_petals",group:85},"minecraft:pale_moss_carpet":{type:"minecraft:pale_moss_carpet",item:"minecraft:pale_moss_carpet",group:84},"minecraft:pale_hanging_moss":{type:"minecraft:pale_hanging_moss",item:"minecraft:pale_hanging_moss",group:83},"minecraft:observer":{type:"minecraft:observer",item:"minecraft:observer",group:82},"minecraft:note_block":{type:"minecraft:note_block",item:"minecraft:note_block",group:81},"minecraft:mangrove_propagule":{type:"minecraft:mangrove_propagule",item:"minecraft:mangrove_propagule",group:78},"minecraft:lightning_rod":{type:"minecraft:lightning_rod",item:"minecraft:lightning_rod",group:77},"minecraft:light":{type:"minecraft:light",item:"minecraft:light",group:76},"minecraft:lectern":{type:"minecraft:lectern",item:"minecraft:lectern",group:75},"minecraft:water_bucket":{type:"minecraft:water",item:"minecraft:water_bucket",group:74},"minecraft:lava_bucket":{type:"minecraft:lava",item:"minecraft:lava_bucket",group:74},"minecraft:tall_grass":{type:"minecraft:tall_grass",item:"minecraft:tall_grass",group:73},"minecraft:sunflower":{type:"minecraft:sunflower",item:"minecraft:sunflower",group:73},"minecraft:rose_bush":{type:"minecraft:rose_bush",item:"minecraft:rose_bush",group:73},"minecraft:pitcher_plant":{type:"minecraft:pitcher_plant",item:"minecraft:pitcher_plant",group:73},"minecraft:peony":{type:"minecraft:peony",item:"minecraft:peony",group:73},"minecraft:lilac":{type:"minecraft:lilac",item:"minecraft:lilac",group:73},"minecraft:large_fern":{type:"minecraft:large_fern",item:"minecraft:large_fern",group:73},"minecraft:soul_lantern":{type:"minecraft:soul_lantern",item:"minecraft:soul_lantern",group:72},"minecraft:lantern":{type:"minecraft:lantern",item:"minecraft:lantern",group:72},"minecraft:weeping_vines":{type:"minecraft:weeping_vines",item:"minecraft:weeping_vines",group:71},"minecraft:twisting_vines":{type:"minecraft:twisting_vines",item:"minecraft:twisting_vines",group:71},"minecraft:kelp":{type:"minecraft:kelp",item:"minecraft:kelp",group:71},"minecraft:jukebox":{type:"minecraft:jukebox",item:"minecraft:jukebox",group:70},"minecraft:jigsaw":{type:"minecraft:jigsaw",item:"minecraft:jigsaw",group:69},"minecraft:hopper":{type:"minecraft:hopper",item:"minecraft:hopper",group:68},"minecraft:target":{type:"minecraft:target",item:"minecraft:target",group:67},"minecraft:light_weighted_pressure_plate":{type:"minecraft:light_weighted_pressure_plate",item:"minecraft:light_weighted_pressure_plate",group:67},"minecraft:heavy_weighted_pressure_plate":{type:"minecraft:heavy_weighted_pressure_plate",item:"minecraft:heavy_weighted_pressure_plate",group:67},"minecraft:grindstone":{type:"minecraft:grindstone",item:"minecraft:grindstone",group:66},"minecraft:podzol":{type:"minecraft:podzol",item:"minecraft:podzol",group:65},"minecraft:mycelium":{type:"minecraft:mycelium",item:"minecraft:mycelium",group:65},"minecraft:grass_block":{type:"minecraft:grass_block",item:"minecraft:grass_block",group:65},"minecraft:sculk_vein":{type:"minecraft:sculk_vein",item:"minecraft:sculk_vein",group:64},"minecraft:glow_lichen":{type:"minecraft:glow_lichen",item:"minecraft:glow_lichen",group:64},"minecraft:farmland":{type:"minecraft:farmland",item:"minecraft:farmland",group:62},"minecraft:end_portal_frame":{type:"minecraft:end_portal_frame",item:"minecraft:end_portal_frame",group:61},"minecraft:dropper":{type:"minecraft:dropper",item:"minecraft:dropper",group:60},"minecraft:dispenser":{type:"minecraft:dispenser",item:"minecraft:dispenser",group:60},"minecraft:decorated_pot":{type:"minecraft:decorated_pot",item:"minecraft:decorated_pot",group:59},"minecraft:daylight_detector":{type:"minecraft:daylight_detector",item:"minecraft:daylight_detector",group:58},"minecraft:zombie_head":{type:"minecraft:zombie_head",item:"minecraft:zombie_head",group:56},"minecraft:wither_skeleton_skull":{type:"minecraft:wither_skeleton_skull",item:"minecraft:wither_skeleton_skull",group:56},"minecraft:skeleton_skull":{type:"minecraft:skeleton_skull",item:"minecraft:skeleton_skull",group:56},"minecraft:player_head":{type:"minecraft:player_head",item:"minecraft:player_head",group:56},"minecraft:piglin_head":{type:"minecraft:piglin_head",item:"minecraft:piglin_head",group:56},"minecraft:dragon_head":{type:"minecraft:dragon_head",item:"minecraft:dragon_head",group:56},"minecraft:creeper_head":{type:"minecraft:creeper_head",item:"minecraft:creeper_head",group:56},"minecraft:creaking_heart":{type:"minecraft:creaking_heart",item:"minecraft:creaking_heart",group:55},"minecraft:crafter":{type:"minecraft:crafter",item:"minecraft:crafter",group:54},"minecraft:weathered_copper_bulb":{type:"minecraft:weathered_copper_bulb",item:"minecraft:weathered_copper_bulb",group:53},"minecraft:waxed_weathered_copper_bulb":{type:"minecraft:waxed_weathered_copper_bulb",item:"minecraft:waxed_weathered_copper_bulb",group:53},"minecraft:waxed_oxidized_copper_bulb":{type:"minecraft:waxed_oxidized_copper_bulb",item:"minecraft:waxed_oxidized_copper_bulb",group:53},"minecraft:waxed_exposed_copper_bulb":{type:"minecraft:waxed_exposed_copper_bulb",item:"minecraft:waxed_exposed_copper_bulb",group:53},"minecraft:waxed_copper_bulb":{type:"minecraft:waxed_copper_bulb",item:"minecraft:waxed_copper_bulb",group:53},"minecraft:oxidized_copper_bulb":{type:"minecraft:oxidized_copper_bulb",item:"minecraft:oxidized_copper_bulb",group:53},"minecraft:exposed_copper_bulb":{type:"minecraft:exposed_copper_bulb",item:"minecraft:exposed_copper_bulb",group:53},"minecraft:copper_bulb":{type:"minecraft:copper_bulb",item:"minecraft:copper_bulb",group:53},"minecraft:composter":{type:"minecraft:composter",item:"minecraft:composter",group:52},"minecraft:comparator":{type:"minecraft:comparator",item:"minecraft:comparator",group:51},"minecraft:cocoa_beans":{type:"minecraft:cocoa",item:"minecraft:cocoa_beans",group:50},"minecraft:chorus_plant":{type:"minecraft:chorus_plant",item:"minecraft:chorus_plant",group:49},"minecraft:chorus_flower":{type:"minecraft:chorus_flower",item:"minecraft:chorus_flower",group:48},"minecraft:chiseled_bookshelf":{type:"minecraft:chiseled_bookshelf",item:"minecraft:chiseled_bookshelf",group:47},"minecraft:trapped_chest":{type:"minecraft:trapped_chest",item:"minecraft:trapped_chest",group:46},"minecraft:chest":{type:"minecraft:chest",item:"minecraft:chest",group:46},"minecraft:repeating_command_block":{type:"minecraft:repeating_command_block",item:"minecraft:repeating_command_block",group:45},"minecraft:command_block":{type:"minecraft:command_block",item:"minecraft:command_block",group:45},"minecraft:chain_command_block":{type:"minecraft:chain_command_block",item:"minecraft:chain_command_block",group:45},"minecraft:chain":{type:"minecraft:chain",item:"minecraft:chain",group:44},"minecraft:glow_berries":{type:"minecraft:cave_vines",item:"minecraft:glow_berries",group:42},"minecraft:wheat_seeds":{type:"minecraft:wheat",item:"minecraft:wheat_seeds",group:41},"minecraft:pumpkin_seeds":{type:"minecraft:melon_stem",item:"minecraft:pumpkin_seeds",group:41},"minecraft:potato":{type:"minecraft:potatoes",item:"minecraft:potato",group:41},"minecraft:carrot":{type:"minecraft:carrots",item:"minecraft:carrot",group:41},"minecraft:soul_campfire":{type:"minecraft:soul_campfire",item:"minecraft:soul_campfire",group:40},"minecraft:campfire":{type:"minecraft:campfire",item:"minecraft:campfire",group:40},"minecraft:calibrated_sculk_sensor":{type:"minecraft:calibrated_sculk_sensor",item:"minecraft:calibrated_sculk_sensor",group:39},"minecraft:cake":{type:"minecraft:cake",item:"minecraft:cake",group:38},"minecraft:sugar_cane":{type:"minecraft:sugar_cane",item:"minecraft:sugar_cane",group:37},"minecraft:cactus":{type:"minecraft:cactus",item:"minecraft:cactus",group:37},"minecraft:red_mushroom_block":{type:"minecraft:red_mushroom_block",item:"minecraft:red_mushroom_block",group:35},"minecraft:mushroom_stem":{type:"minecraft:mushroom_stem",item:"minecraft:mushroom_stem",group:35},"minecraft:brown_mushroom_block":{type:"minecraft:brown_mushroom_block",item:"minecraft:brown_mushroom_block",group:35},"minecraft:brewing_stand":{type:"minecraft:brewing_stand",item:"minecraft:brewing_stand",group:34},"minecraft:tube_coral_fan":{type:"minecraft:tube_coral_fan",item:"minecraft:tube_coral_fan",group:32},"minecraft:horn_coral_fan":{type:"minecraft:horn_coral_fan",item:"minecraft:horn_coral_fan",group:32},"minecraft:fire_coral_fan":{type:"minecraft:fire_coral_fan",item:"minecraft:fire_coral_fan",group:32},"minecraft:dead_tube_coral_fan":{type:"minecraft:dead_tube_coral_fan",item:"minecraft:dead_tube_coral_fan",group:32},"minecraft:dead_horn_coral_fan":{type:"minecraft:dead_horn_coral_fan",item:"minecraft:dead_horn_coral_fan",group:32},"minecraft:dead_fire_coral_fan":{type:"minecraft:dead_fire_coral_fan",item:"minecraft:dead_fire_coral_fan",group:32},"minecraft:dead_bubble_coral_fan":{type:"minecraft:dead_bubble_coral_fan",item:"minecraft:dead_bubble_coral_fan",group:32},"minecraft:dead_brain_coral_fan":{type:"minecraft:dead_brain_coral_fan",item:"minecraft:dead_brain_coral_fan",group:32},"minecraft:bubble_coral_fan":{type:"minecraft:bubble_coral_fan",item:"minecraft:bubble_coral_fan",group:32},"minecraft:brain_coral_fan":{type:"minecraft:brain_coral_fan",item:"minecraft:brain_coral_fan",group:32},"minecraft:tube_coral":{type:"minecraft:tube_coral",item:"minecraft:tube_coral",group:32},"minecraft:horn_coral":{type:"minecraft:horn_coral",item:"minecraft:horn_coral",group:32},"minecraft:fire_coral":{type:"minecraft:fire_coral",item:"minecraft:fire_coral",group:32},"minecraft:dead_tube_coral":{type:"minecraft:dead_tube_coral",item:"minecraft:dead_tube_coral",group:32},"minecraft:dead_horn_coral":{type:"minecraft:dead_horn_coral",item:"minecraft:dead_horn_coral",group:32},"minecraft:dead_fire_coral":{type:"minecraft:dead_fire_coral",item:"minecraft:dead_fire_coral",group:32},"minecraft:dead_bubble_coral":{type:"minecraft:dead_bubble_coral",item:"minecraft:dead_bubble_coral",group:32},"minecraft:dead_brain_coral":{type:"minecraft:dead_brain_coral",item:"minecraft:dead_brain_coral",group:32},"minecraft:conduit":{type:"minecraft:conduit",item:"minecraft:conduit",group:32},"minecraft:bubble_coral":{type:"minecraft:bubble_coral",item:"minecraft:bubble_coral",group:32},"minecraft:brain_coral":{type:"minecraft:brain_coral",item:"minecraft:brain_coral",group:32},"minecraft:smoker":{type:"minecraft:smoker",item:"minecraft:smoker",group:31},"minecraft:furnace":{type:"minecraft:furnace",item:"minecraft:furnace",group:31},"minecraft:blast_furnace":{type:"minecraft:blast_furnace",item:"minecraft:blast_furnace",group:31},"minecraft:yellow_shulker_box":{type:"minecraft:yellow_shulker_box",item:"minecraft:yellow_shulker_box",group:30},"minecraft:white_shulker_box":{type:"minecraft:white_shulker_box",item:"minecraft:white_shulker_box",group:30},"minecraft:shulker_box":{type:"minecraft:shulker_box",item:"minecraft:shulker_box",group:30},"minecraft:red_shulker_box":{type:"minecraft:red_shulker_box",item:"minecraft:red_shulker_box",group:30},"minecraft:purple_shulker_box":{type:"minecraft:purple_shulker_box",item:"minecraft:purple_shulker_box",group:30},"minecraft:pink_shulker_box":{type:"minecraft:pink_shulker_box",item:"minecraft:pink_shulker_box",group:30},"minecraft:orange_shulker_box":{type:"minecraft:orange_shulker_box",item:"minecraft:orange_shulker_box",group:30},"minecraft:magenta_shulker_box":{type:"minecraft:magenta_shulker_box",item:"minecraft:magenta_shulker_box",group:30},"minecraft:lime_shulker_box":{type:"minecraft:lime_shulker_box",item:"minecraft:lime_shulker_box",group:30},"minecraft:light_gray_shulker_box":{type:"minecraft:light_gray_shulker_box",item:"minecraft:light_gray_shulker_box",group:30},"minecraft:light_blue_shulker_box":{type:"minecraft:light_blue_shulker_box",item:"minecraft:light_blue_shulker_box",group:30},"minecraft:green_shulker_box":{type:"minecraft:green_shulker_box",item:"minecraft:green_shulker_box",group:30},"minecraft:gray_shulker_box":{type:"minecraft:gray_shulker_box",item:"minecraft:gray_shulker_box",group:30},"minecraft:end_rod":{type:"minecraft:end_rod",item:"minecraft:end_rod",group:30},"minecraft:cyan_shulker_box":{type:"minecraft:cyan_shulker_box",item:"minecraft:cyan_shulker_box",group:30},"minecraft:brown_shulker_box":{type:"minecraft:brown_shulker_box",item:"minecraft:brown_shulker_box",group:30},"minecraft:blue_shulker_box":{type:"minecraft:blue_shulker_box",item:"minecraft:blue_shulker_box",group:30},"minecraft:black_shulker_box":{type:"minecraft:black_shulker_box",item:"minecraft:black_shulker_box",group:30},"minecraft:redstone_ore":{type:"minecraft:redstone_ore",item:"minecraft:redstone_ore",group:29},"minecraft:redstone_lamp":{type:"minecraft:redstone_lamp",item:"minecraft:redstone_lamp",group:29},"minecraft:deepslate_redstone_ore":{type:"minecraft:deepslate_redstone_ore",item:"minecraft:deepslate_redstone_ore",group:29},"minecraft:yellow_candle":{type:"minecraft:yellow_candle",item:"minecraft:yellow_candle",group:28},"minecraft:white_candle":{type:"minecraft:white_candle",item:"minecraft:white_candle",group:28},"minecraft:red_candle":{type:"minecraft:red_candle",item:"minecraft:red_candle",group:28},"minecraft:purple_candle":{type:"minecraft:purple_candle",item:"minecraft:purple_candle",group:28},"minecraft:pink_candle":{type:"minecraft:pink_candle",item:"minecraft:pink_candle",group:28},"minecraft:orange_candle":{type:"minecraft:orange_candle",item:"minecraft:orange_candle",group:28},"minecraft:magenta_candle":{type:"minecraft:magenta_candle",item:"minecraft:magenta_candle",group:28},"minecraft:lime_candle":{type:"minecraft:lime_candle",item:"minecraft:lime_candle",group:28},"minecraft:light_gray_candle":{type:"minecraft:light_gray_candle",item:"minecraft:light_gray_candle",group:28},"minecraft:light_blue_candle":{type:"minecraft:light_blue_candle",item:"minecraft:light_blue_candle",group:28},"minecraft:green_candle":{type:"minecraft:green_candle",item:"minecraft:green_candle",group:28},"minecraft:gray_candle":{type:"minecraft:gray_candle",item:"minecraft:gray_candle",group:28},"minecraft:cyan_candle":{type:"minecraft:cyan_candle",item:"minecraft:cyan_candle",group:28},"minecraft:candle":{type:"minecraft:candle",item:"minecraft:candle",group:28},"minecraft:brown_candle":{type:"minecraft:brown_candle",item:"minecraft:brown_candle",group:28},"minecraft:blue_candle":{type:"minecraft:blue_candle",item:"minecraft:blue_candle",group:28},"minecraft:black_candle":{type:"minecraft:black_candle",item:"minecraft:black_candle",group:28},"minecraft:yellow_bed":{type:"minecraft:yellow_bed",item:"minecraft:yellow_bed",group:27},"minecraft:white_bed":{type:"minecraft:white_bed",item:"minecraft:white_bed",group:27},"minecraft:red_bed":{type:"minecraft:red_bed",item:"minecraft:red_bed",group:27},"minecraft:purple_bed":{type:"minecraft:purple_bed",item:"minecraft:purple_bed",group:27},"minecraft:pink_bed":{type:"minecraft:pink_bed",item:"minecraft:pink_bed",group:27},"minecraft:orange_bed":{type:"minecraft:orange_bed",item:"minecraft:orange_bed",group:27},"minecraft:magenta_bed":{type:"minecraft:magenta_bed",item:"minecraft:magenta_bed",group:27},"minecraft:lime_bed":{type:"minecraft:lime_bed",item:"minecraft:lime_bed",group:27},"minecraft:light_gray_bed":{type:"minecraft:light_gray_bed",item:"minecraft:light_gray_bed",group:27},"minecraft:light_blue_bed":{type:"minecraft:light_blue_bed",item:"minecraft:light_blue_bed",group:27},"minecraft:green_bed":{type:"minecraft:green_bed",item:"minecraft:green_bed",group:27},"minecraft:gray_bed":{type:"minecraft:gray_bed",item:"minecraft:gray_bed",group:27},"minecraft:cyan_bed":{type:"minecraft:cyan_bed",item:"minecraft:cyan_bed",group:27},"minecraft:brown_bed":{type:"minecraft:brown_bed",item:"minecraft:brown_bed",group:27},"minecraft:blue_bed":{type:"minecraft:blue_bed",item:"minecraft:blue_bed",group:27},"minecraft:black_bed":{type:"minecraft:black_bed",item:"minecraft:black_bed",group:27},"minecraft:yellow_banner":{type:"minecraft:yellow_wall_banner",item:"minecraft:yellow_banner",group:18},"minecraft:white_banner":{type:"minecraft:white_wall_banner",item:"minecraft:white_banner",group:18},"minecraft:red_banner":{type:"minecraft:red_wall_banner",item:"minecraft:red_banner",group:18},"minecraft:purple_banner":{type:"minecraft:purple_wall_banner",item:"minecraft:purple_banner",group:18},"minecraft:pink_banner":{type:"minecraft:pink_wall_banner",item:"minecraft:pink_banner",group:18},"minecraft:orange_banner":{type:"minecraft:orange_wall_banner",item:"minecraft:orange_banner",group:18},"minecraft:magenta_banner":{type:"minecraft:magenta_wall_banner",item:"minecraft:magenta_banner",group:18},"minecraft:lime_banner":{type:"minecraft:lime_wall_banner",item:"minecraft:lime_banner",group:18},"minecraft:light_gray_banner":{type:"minecraft:light_gray_wall_banner",item:"minecraft:light_gray_banner",group:18},"minecraft:light_blue_banner":{type:"minecraft:light_blue_wall_banner",item:"minecraft:light_blue_banner",group:18},"minecraft:green_banner":{type:"minecraft:green_wall_banner",item:"minecraft:green_banner",group:18},"minecraft:gray_banner":{type:"minecraft:gray_wall_banner",item:"minecraft:gray_banner",group:18},"minecraft:cyan_banner":{type:"minecraft:cyan_wall_banner",item:"minecraft:cyan_banner",group:18},"minecraft:brown_banner":{type:"minecraft:brown_wall_banner",item:"minecraft:brown_banner",group:18},"minecraft:blue_banner":{type:"minecraft:blue_wall_banner",item:"minecraft:blue_banner",group:18},"minecraft:black_banner":{type:"minecraft:black_wall_banner",item:"minecraft:black_banner",group:18},"minecraft:big_dripleaf":{type:"minecraft:big_dripleaf_stem",item:"minecraft:big_dripleaf",group:14},"minecraft:bell":{type:"minecraft:bell",item:"minecraft:bell",group:24},"minecraft:sweet_berries":{type:"minecraft:sweet_berry_bush",item:"minecraft:sweet_berries",group:23},"minecraft:nether_wart":{type:"minecraft:nether_wart",item:"minecraft:nether_wart",group:23},"minecraft:beetroot_seeds":{type:"minecraft:beetroots",item:"minecraft:beetroot_seeds",group:23},"minecraft:beehive":{type:"minecraft:beehive",item:"minecraft:beehive",group:22},"minecraft:bee_nest":{type:"minecraft:bee_nest",item:"minecraft:bee_nest",group:22},"minecraft:weathered_copper_grate":{type:"minecraft:weathered_copper_grate",item:"minecraft:weathered_copper_grate",group:21},"minecraft:waxed_weathered_copper_grate":{type:"minecraft:waxed_weathered_copper_grate",item:"minecraft:waxed_weathered_copper_grate",group:21},"minecraft:waxed_oxidized_copper_grate":{type:"minecraft:waxed_oxidized_copper_grate",item:"minecraft:waxed_oxidized_copper_grate",group:21},"minecraft:waxed_exposed_copper_grate":{type:"minecraft:waxed_exposed_copper_grate",item:"minecraft:waxed_exposed_copper_grate",group:21},"minecraft:waxed_copper_grate":{type:"minecraft:waxed_copper_grate",item:"minecraft:waxed_copper_grate",group:21},"minecraft:oxidized_copper_grate":{type:"minecraft:oxidized_copper_grate",item:"minecraft:oxidized_copper_grate",group:21},"minecraft:mangrove_roots":{type:"minecraft:mangrove_roots",item:"minecraft:mangrove_roots",group:21},"minecraft:heavy_core":{type:"minecraft:heavy_core",item:"minecraft:heavy_core",group:21},"minecraft:hanging_roots":{type:"minecraft:hanging_roots",item:"minecraft:hanging_roots",group:21},"minecraft:exposed_copper_grate":{type:"minecraft:exposed_copper_grate",item:"minecraft:exposed_copper_grate",group:21},"minecraft:copper_grate":{type:"minecraft:copper_grate",item:"minecraft:copper_grate",group:21},"minecraft:barrier":{type:"minecraft:barrier",item:"minecraft:barrier",group:21},"minecraft:barrel":{type:"minecraft:barrel",item:"minecraft:barrel",group:20},"minecraft:bamboo":{type:"minecraft:bamboo",item:"minecraft:bamboo",group:19},"minecraft:yellow_glazed_terracotta":{type:"minecraft:yellow_glazed_terracotta",item:"minecraft:yellow_glazed_terracotta",group:18},"minecraft:white_glazed_terracotta":{type:"minecraft:white_glazed_terracotta",item:"minecraft:white_glazed_terracotta",group:18},"minecraft:torch":{type:"minecraft:torch",item:"minecraft:torch",group:0},"minecraft:stonecutter":{type:"minecraft:stonecutter",item:"minecraft:stonecutter",group:18},"minecraft:soul_torch":{type:"minecraft:soul_torch",item:"minecraft:soul_torch",group:0},"minecraft:red_glazed_terracotta":{type:"minecraft:red_glazed_terracotta",item:"minecraft:red_glazed_terracotta",group:18},"minecraft:purple_glazed_terracotta":{type:"minecraft:purple_glazed_terracotta",item:"minecraft:purple_glazed_terracotta",group:18},"minecraft:pink_glazed_terracotta":{type:"minecraft:pink_glazed_terracotta",item:"minecraft:pink_glazed_terracotta",group:18},"minecraft:orange_glazed_terracotta":{type:"minecraft:orange_glazed_terracotta",item:"minecraft:orange_glazed_terracotta",group:18},"minecraft:magenta_glazed_terracotta":{type:"minecraft:magenta_glazed_terracotta",item:"minecraft:magenta_glazed_terracotta",group:18},"minecraft:loom":{type:"minecraft:loom",item:"minecraft:loom",group:18},"minecraft:lime_glazed_terracotta":{type:"minecraft:lime_glazed_terracotta",item:"minecraft:lime_glazed_terracotta",group:18},"minecraft:light_gray_glazed_terracotta":{type:"minecraft:light_gray_glazed_terracotta",item:"minecraft:light_gray_glazed_terracotta",group:18},"minecraft:light_blue_glazed_terracotta":{type:"minecraft:light_blue_glazed_terracotta",item:"minecraft:light_blue_glazed_terracotta",group:18},"minecraft:jack_o_lantern":{type:"minecraft:jack_o_lantern",item:"minecraft:jack_o_lantern",group:18},"minecraft:green_glazed_terracotta":{type:"minecraft:green_glazed_terracotta",item:"minecraft:green_glazed_terracotta",group:18},"minecraft:gray_glazed_terracotta":{type:"minecraft:gray_glazed_terracotta",item:"minecraft:gray_glazed_terracotta",group:18},"minecraft:damaged_anvil":{type:"minecraft:damaged_anvil",item:"minecraft:damaged_anvil",group:18},"minecraft:cyan_glazed_terracotta":{type:"minecraft:cyan_glazed_terracotta",item:"minecraft:cyan_glazed_terracotta",group:18},"minecraft:chipped_anvil":{type:"minecraft:chipped_anvil",item:"minecraft:chipped_anvil",group:18},"minecraft:carved_pumpkin":{type:"minecraft:carved_pumpkin",item:"minecraft:carved_pumpkin",group:18},"minecraft:brown_glazed_terracotta":{type:"minecraft:brown_glazed_terracotta",item:"minecraft:brown_glazed_terracotta",group:18},"minecraft:blue_glazed_terracotta":{type:"minecraft:blue_glazed_terracotta",item:"minecraft:blue_glazed_terracotta",group:18},"minecraft:black_glazed_terracotta":{type:"minecraft:black_glazed_terracotta",item:"minecraft:black_glazed_terracotta",group:18},"minecraft:melon_seeds":{type:"minecraft:attached_melon_stem",item:"minecraft:melon_seeds",group:18},"minecraft:anvil":{type:"minecraft:anvil",item:"minecraft:anvil",group:18},"minecraft:tuff_wall":{type:"minecraft:tuff_wall",item:"minecraft:tuff_wall",group:17},"minecraft:tuff_brick_wall":{type:"minecraft:tuff_brick_wall",item:"minecraft:tuff_brick_wall",group:17},"minecraft:stone_brick_wall":{type:"minecraft:stone_brick_wall",item:"minecraft:stone_brick_wall",group:17},"minecraft:sandstone_wall":{type:"minecraft:sandstone_wall",item:"minecraft:sandstone_wall",group:17},"minecraft:red_sandstone_wall":{type:"minecraft:red_sandstone_wall",item:"minecraft:red_sandstone_wall",group:17},"minecraft:red_nether_brick_wall":{type:"minecraft:red_nether_brick_wall",item:"minecraft:red_nether_brick_wall",group:17},"minecraft:prismarine_wall":{type:"minecraft:prismarine_wall",item:"minecraft:prismarine_wall",group:17},"minecraft:polished_tuff_wall":{type:"minecraft:polished_tuff_wall",item:"minecraft:polished_tuff_wall",group:17},"minecraft:polished_deepslate_wall":{type:"minecraft:polished_deepslate_wall",item:"minecraft:polished_deepslate_wall",group:17},"minecraft:polished_blackstone_wall":{type:"minecraft:polished_blackstone_wall",item:"minecraft:polished_blackstone_wall",group:17},"minecraft:polished_blackstone_brick_wall":{type:"minecraft:polished_blackstone_brick_wall",item:"minecraft:polished_blackstone_brick_wall",group:17},"minecraft:nether_brick_wall":{type:"minecraft:nether_brick_wall",item:"minecraft:nether_brick_wall",group:17},"minecraft:mud_brick_wall":{type:"minecraft:mud_brick_wall",item:"minecraft:mud_brick_wall",group:17},"minecraft:mossy_stone_brick_wall":{type:"minecraft:mossy_stone_brick_wall",item:"minecraft:mossy_stone_brick_wall",group:17},"minecraft:mossy_cobblestone_wall":{type:"minecraft:mossy_cobblestone_wall",item:"minecraft:mossy_cobblestone_wall",group:17},"minecraft:granite_wall":{type:"minecraft:granite_wall",item:"minecraft:granite_wall",group:17},"minecraft:end_stone_brick_wall":{type:"minecraft:end_stone_brick_wall",item:"minecraft:end_stone_brick_wall",group:17},"minecraft:diorite_wall":{type:"minecraft:diorite_wall",item:"minecraft:diorite_wall",group:17},"minecraft:deepslate_tile_wall":{type:"minecraft:deepslate_tile_wall",item:"minecraft:deepslate_tile_wall",group:17},"minecraft:deepslate_brick_wall":{type:"minecraft:deepslate_brick_wall",item:"minecraft:deepslate_brick_wall",group:17},"minecraft:cobblestone_wall":{type:"minecraft:cobblestone_wall",item:"minecraft:cobblestone_wall",group:17},"minecraft:cobbled_deepslate_wall":{type:"minecraft:cobbled_deepslate_wall",item:"minecraft:cobbled_deepslate_wall",group:17},"minecraft:brick_wall":{type:"minecraft:brick_wall",item:"minecraft:brick_wall",group:17},"minecraft:blackstone_wall":{type:"minecraft:blackstone_wall",item:"minecraft:blackstone_wall",group:17},"minecraft:andesite_wall":{type:"minecraft:andesite_wall",item:"minecraft:andesite_wall",group:17},"minecraft:small_amethyst_bud":{type:"minecraft:small_amethyst_bud",item:"minecraft:small_amethyst_bud",group:16},"minecraft:medium_amethyst_bud":{type:"minecraft:medium_amethyst_bud",item:"minecraft:medium_amethyst_bud",group:16},"minecraft:large_amethyst_bud":{type:"minecraft:large_amethyst_bud",item:"minecraft:large_amethyst_bud",group:16},"minecraft:amethyst_cluster":{type:"minecraft:amethyst_cluster",item:"minecraft:amethyst_cluster",group:16},"minecraft:powered_rail":{type:"minecraft:powered_rail",item:"minecraft:powered_rail",group:15},"minecraft:detector_rail":{type:"minecraft:detector_rail",item:"minecraft:detector_rail",group:15},"minecraft:activator_rail":{type:"minecraft:activator_rail",item:"minecraft:activator_rail",group:15},"minecraft:warped_sign":{type:"minecraft:warped_sign",item:"minecraft:warped_sign",group:10},"minecraft:warped_hanging_sign":{type:"minecraft:warped_hanging_sign",item:"minecraft:warped_hanging_sign",group:5},"minecraft:spruce_sign":{type:"minecraft:spruce_sign",item:"minecraft:spruce_sign",group:10},"minecraft:spruce_hanging_sign":{type:"minecraft:spruce_hanging_sign",item:"minecraft:spruce_hanging_sign",group:5},"minecraft:oak_sign":{type:"minecraft:oak_sign",item:"minecraft:oak_sign",group:10},"minecraft:oak_hanging_sign":{type:"minecraft:oak_hanging_sign",item:"minecraft:oak_hanging_sign",group:5},"minecraft:mangrove_sign":{type:"minecraft:mangrove_sign",item:"minecraft:mangrove_sign",group:10},"minecraft:mangrove_hanging_sign":{type:"minecraft:mangrove_hanging_sign",item:"minecraft:mangrove_hanging_sign",group:5},"minecraft:ladder":{type:"minecraft:ladder",item:"minecraft:ladder",group:14},"minecraft:jungle_sign":{type:"minecraft:jungle_sign",item:"minecraft:jungle_sign",group:10},"minecraft:jungle_hanging_sign":{type:"minecraft:jungle_hanging_sign",item:"minecraft:jungle_hanging_sign",group:5},"minecraft:ender_chest":{type:"minecraft:ender_chest",item:"minecraft:ender_chest",group:14},"minecraft:dark_oak_sign":{type:"minecraft:dark_oak_sign",item:"minecraft:dark_oak_sign",group:10},"minecraft:dark_oak_hanging_sign":{type:"minecraft:dark_oak_hanging_sign",item:"minecraft:dark_oak_hanging_sign",group:5},"minecraft:crimson_sign":{type:"minecraft:crimson_sign",item:"minecraft:crimson_sign",group:10},"minecraft:crimson_hanging_sign":{type:"minecraft:crimson_hanging_sign",item:"minecraft:crimson_hanging_sign",group:5},"minecraft:cherry_sign":{type:"minecraft:cherry_sign",item:"minecraft:cherry_sign",group:10},"minecraft:cherry_hanging_sign":{type:"minecraft:cherry_hanging_sign",item:"minecraft:cherry_hanging_sign",group:5},"minecraft:birch_sign":{type:"minecraft:birch_sign",item:"minecraft:birch_sign",group:10},"minecraft:birch_hanging_sign":{type:"minecraft:birch_hanging_sign",item:"minecraft:birch_hanging_sign",group:5},"minecraft:bamboo_sign":{type:"minecraft:bamboo_sign",item:"minecraft:bamboo_sign",group:10},"minecraft:bamboo_hanging_sign":{type:"minecraft:bamboo_hanging_sign",item:"minecraft:bamboo_hanging_sign",group:5},"minecraft:acacia_sign":{type:"minecraft:acacia_sign",item:"minecraft:acacia_sign",group:10},"minecraft:acacia_hanging_sign":{type:"minecraft:acacia_hanging_sign",item:"minecraft:acacia_hanging_sign",group:5},"minecraft:weathered_copper_trapdoor":{type:"minecraft:weathered_copper_trapdoor",item:"minecraft:weathered_copper_trapdoor",group:13},"minecraft:waxed_weathered_copper_trapdoor":{type:"minecraft:waxed_weathered_copper_trapdoor",item:"minecraft:waxed_weathered_copper_trapdoor",group:13},"minecraft:waxed_oxidized_copper_trapdoor":{type:"minecraft:waxed_oxidized_copper_trapdoor",item:"minecraft:waxed_oxidized_copper_trapdoor",group:13},"minecraft:waxed_exposed_copper_trapdoor":{type:"minecraft:waxed_exposed_copper_trapdoor",item:"minecraft:waxed_exposed_copper_trapdoor",group:13},"minecraft:waxed_copper_trapdoor":{type:"minecraft:waxed_copper_trapdoor",item:"minecraft:waxed_copper_trapdoor",group:13},"minecraft:warped_trapdoor":{type:"minecraft:warped_trapdoor",item:"minecraft:warped_trapdoor",group:13},"minecraft:spruce_trapdoor":{type:"minecraft:spruce_trapdoor",item:"minecraft:spruce_trapdoor",group:13},"minecraft:pale_oak_trapdoor":{type:"minecraft:pale_oak_trapdoor",item:"minecraft:pale_oak_trapdoor",group:13},"minecraft:oxidized_copper_trapdoor":{type:"minecraft:oxidized_copper_trapdoor",item:"minecraft:oxidized_copper_trapdoor",group:13},"minecraft:oak_trapdoor":{type:"minecraft:oak_trapdoor",item:"minecraft:oak_trapdoor",group:13},"minecraft:mangrove_trapdoor":{type:"minecraft:mangrove_trapdoor",item:"minecraft:mangrove_trapdoor",group:13},"minecraft:jungle_trapdoor":{type:"minecraft:jungle_trapdoor",item:"minecraft:jungle_trapdoor",group:13},"minecraft:iron_trapdoor":{type:"minecraft:iron_trapdoor",item:"minecraft:iron_trapdoor",group:13},"minecraft:exposed_copper_trapdoor":{type:"minecraft:exposed_copper_trapdoor",item:"minecraft:exposed_copper_trapdoor",group:13},"minecraft:dark_oak_trapdoor":{type:"minecraft:dark_oak_trapdoor",item:"minecraft:dark_oak_trapdoor",group:13},"minecraft:crimson_trapdoor":{type:"minecraft:crimson_trapdoor",item:"minecraft:crimson_trapdoor",group:13},"minecraft:copper_trapdoor":{type:"minecraft:copper_trapdoor",item:"minecraft:copper_trapdoor",group:13},"minecraft:cherry_trapdoor":{type:"minecraft:cherry_trapdoor",item:"minecraft:cherry_trapdoor",group:13},"minecraft:birch_trapdoor":{type:"minecraft:birch_trapdoor",item:"minecraft:birch_trapdoor",group:13},"minecraft:bamboo_trapdoor":{type:"minecraft:bamboo_trapdoor",item:"minecraft:bamboo_trapdoor",group:13},"minecraft:acacia_trapdoor":{type:"minecraft:acacia_trapdoor",item:"minecraft:acacia_trapdoor",group:13},"minecraft:weathered_cut_copper_stairs":{type:"minecraft:weathered_cut_copper_stairs",item:"minecraft:weathered_cut_copper_stairs",group:12},"minecraft:waxed_weathered_cut_copper_stairs":{type:"minecraft:waxed_weathered_cut_copper_stairs",item:"minecraft:waxed_weathered_cut_copper_stairs",group:12},"minecraft:waxed_oxidized_cut_copper_stairs":{type:"minecraft:waxed_oxidized_cut_copper_stairs",item:"minecraft:waxed_oxidized_cut_copper_stairs",group:12},"minecraft:waxed_exposed_cut_copper_stairs":{type:"minecraft:waxed_exposed_cut_copper_stairs",item:"minecraft:waxed_exposed_cut_copper_stairs",group:12},"minecraft:waxed_cut_copper_stairs":{type:"minecraft:waxed_cut_copper_stairs",item:"minecraft:waxed_cut_copper_stairs",group:12},"minecraft:warped_stairs":{type:"minecraft:warped_stairs",item:"minecraft:warped_stairs",group:12},"minecraft:tuff_stairs":{type:"minecraft:tuff_stairs",item:"minecraft:tuff_stairs",group:12},"minecraft:tuff_brick_stairs":{type:"minecraft:tuff_brick_stairs",item:"minecraft:tuff_brick_stairs",group:12},"minecraft:stone_stairs":{type:"minecraft:stone_stairs",item:"minecraft:stone_stairs",group:12},"minecraft:stone_brick_stairs":{type:"minecraft:stone_brick_stairs",item:"minecraft:stone_brick_stairs",group:12},"minecraft:spruce_stairs":{type:"minecraft:spruce_stairs",item:"minecraft:spruce_stairs",group:12},"minecraft:smooth_sandstone_stairs":{type:"minecraft:smooth_sandstone_stairs",item:"minecraft:smooth_sandstone_stairs",group:12},"minecraft:smooth_red_sandstone_stairs":{type:"minecraft:smooth_red_sandstone_stairs",item:"minecraft:smooth_red_sandstone_stairs",group:12},"minecraft:smooth_quartz_stairs":{type:"minecraft:smooth_quartz_stairs",item:"minecraft:smooth_quartz_stairs",group:12},"minecraft:sandstone_stairs":{type:"minecraft:sandstone_stairs",item:"minecraft:sandstone_stairs",group:12},"minecraft:red_sandstone_stairs":{type:"minecraft:red_sandstone_stairs",item:"minecraft:red_sandstone_stairs",group:12},"minecraft:red_nether_brick_stairs":{type:"minecraft:red_nether_brick_stairs",item:"minecraft:red_nether_brick_stairs",group:12},"minecraft:quartz_stairs":{type:"minecraft:quartz_stairs",item:"minecraft:quartz_stairs",group:12},"minecraft:purpur_stairs":{type:"minecraft:purpur_stairs",item:"minecraft:purpur_stairs",group:12},"minecraft:prismarine_stairs":{type:"minecraft:prismarine_stairs",item:"minecraft:prismarine_stairs",group:12},"minecraft:prismarine_brick_stairs":{type:"minecraft:prismarine_brick_stairs",item:"minecraft:prismarine_brick_stairs",group:12},"minecraft:polished_tuff_stairs":{type:"minecraft:polished_tuff_stairs",item:"minecraft:polished_tuff_stairs",group:12},"minecraft:polished_granite_stairs":{type:"minecraft:polished_granite_stairs",item:"minecraft:polished_granite_stairs",group:12},"minecraft:polished_diorite_stairs":{type:"minecraft:polished_diorite_stairs",item:"minecraft:polished_diorite_stairs",group:12},"minecraft:polished_deepslate_stairs":{type:"minecraft:polished_deepslate_stairs",item:"minecraft:polished_deepslate_stairs",group:12},"minecraft:polished_blackstone_stairs":{type:"minecraft:polished_blackstone_stairs",item:"minecraft:polished_blackstone_stairs",group:12},"minecraft:polished_blackstone_brick_stairs":{type:"minecraft:polished_blackstone_brick_stairs",item:"minecraft:polished_blackstone_brick_stairs",group:12},"minecraft:polished_andesite_stairs":{type:"minecraft:polished_andesite_stairs",item:"minecraft:polished_andesite_stairs",group:12},"minecraft:pale_oak_stairs":{type:"minecraft:pale_oak_stairs",item:"minecraft:pale_oak_stairs",group:12},"minecraft:oxidized_cut_copper_stairs":{type:"minecraft:oxidized_cut_copper_stairs",item:"minecraft:oxidized_cut_copper_stairs",group:12},"minecraft:oak_stairs":{type:"minecraft:oak_stairs",item:"minecraft:oak_stairs",group:12},"minecraft:nether_brick_stairs":{type:"minecraft:nether_brick_stairs",item:"minecraft:nether_brick_stairs",group:12},"minecraft:mud_brick_stairs":{type:"minecraft:mud_brick_stairs",item:"minecraft:mud_brick_stairs",group:12},"minecraft:mossy_stone_brick_stairs":{type:"minecraft:mossy_stone_brick_stairs",item:"minecraft:mossy_stone_brick_stairs",group:12},"minecraft:mossy_cobblestone_stairs":{type:"minecraft:mossy_cobblestone_stairs",item:"minecraft:mossy_cobblestone_stairs",group:12},"minecraft:mangrove_stairs":{type:"minecraft:mangrove_stairs",item:"minecraft:mangrove_stairs",group:12},"minecraft:jungle_stairs":{type:"minecraft:jungle_stairs",item:"minecraft:jungle_stairs",group:12},"minecraft:granite_stairs":{type:"minecraft:granite_stairs",item:"minecraft:granite_stairs",group:12},"minecraft:exposed_cut_copper_stairs":{type:"minecraft:exposed_cut_copper_stairs",item:"minecraft:exposed_cut_copper_stairs",group:12},"minecraft:end_stone_brick_stairs":{type:"minecraft:end_stone_brick_stairs",item:"minecraft:end_stone_brick_stairs",group:12},"minecraft:diorite_stairs":{type:"minecraft:diorite_stairs",item:"minecraft:diorite_stairs",group:12},"minecraft:deepslate_tile_stairs":{type:"minecraft:deepslate_tile_stairs",item:"minecraft:deepslate_tile_stairs",group:12},"minecraft:deepslate_brick_stairs":{type:"minecraft:deepslate_brick_stairs",item:"minecraft:deepslate_brick_stairs",group:12},"minecraft:dark_prismarine_stairs":{type:"minecraft:dark_prismarine_stairs",item:"minecraft:dark_prismarine_stairs",group:12},"minecraft:dark_oak_stairs":{type:"minecraft:dark_oak_stairs",item:"minecraft:dark_oak_stairs",group:12},"minecraft:cut_copper_stairs":{type:"minecraft:cut_copper_stairs",item:"minecraft:cut_copper_stairs",group:12},"minecraft:crimson_stairs":{type:"minecraft:crimson_stairs",item:"minecraft:crimson_stairs",group:12},"minecraft:cobblestone_stairs":{type:"minecraft:cobblestone_stairs",item:"minecraft:cobblestone_stairs",group:12},"minecraft:cobbled_deepslate_stairs":{type:"minecraft:cobbled_deepslate_stairs",item:"minecraft:cobbled_deepslate_stairs",group:12},"minecraft:cherry_stairs":{type:"minecraft:cherry_stairs",item:"minecraft:cherry_stairs",group:12},"minecraft:brick_stairs":{type:"minecraft:brick_stairs",item:"minecraft:brick_stairs",group:12},"minecraft:blackstone_stairs":{type:"minecraft:blackstone_stairs",item:"minecraft:blackstone_stairs",group:12},"minecraft:birch_stairs":{type:"minecraft:birch_stairs",item:"minecraft:birch_stairs",group:12},"minecraft:bamboo_stairs":{type:"minecraft:bamboo_stairs",item:"minecraft:bamboo_stairs",group:12},"minecraft:bamboo_mosaic_stairs":{type:"minecraft:bamboo_mosaic_stairs",item:"minecraft:bamboo_mosaic_stairs",group:12},"minecraft:andesite_stairs":{type:"minecraft:andesite_stairs",item:"minecraft:andesite_stairs",group:12},"minecraft:acacia_stairs":{type:"minecraft:acacia_stairs",item:"minecraft:acacia_stairs",group:12},"minecraft:weathered_cut_copper_slab":{type:"minecraft:weathered_cut_copper_slab",item:"minecraft:weathered_cut_copper_slab",group:11},"minecraft:waxed_weathered_cut_copper_slab":{type:"minecraft:waxed_weathered_cut_copper_slab",item:"minecraft:waxed_weathered_cut_copper_slab",group:11},"minecraft:waxed_oxidized_cut_copper_slab":{type:"minecraft:waxed_oxidized_cut_copper_slab",item:"minecraft:waxed_oxidized_cut_copper_slab",group:11},"minecraft:waxed_exposed_cut_copper_slab":{type:"minecraft:waxed_exposed_cut_copper_slab",item:"minecraft:waxed_exposed_cut_copper_slab",group:11},"minecraft:waxed_cut_copper_slab":{type:"minecraft:waxed_cut_copper_slab",item:"minecraft:waxed_cut_copper_slab",group:11},"minecraft:warped_slab":{type:"minecraft:warped_slab",item:"minecraft:warped_slab",group:11},"minecraft:tuff_slab":{type:"minecraft:tuff_slab",item:"minecraft:tuff_slab",group:11},"minecraft:tuff_brick_slab":{type:"minecraft:tuff_brick_slab",item:"minecraft:tuff_brick_slab",group:11},"minecraft:stone_slab":{type:"minecraft:stone_slab",item:"minecraft:stone_slab",group:11},"minecraft:stone_brick_slab":{type:"minecraft:stone_brick_slab",item:"minecraft:stone_brick_slab",group:11},"minecraft:spruce_slab":{type:"minecraft:spruce_slab",item:"minecraft:spruce_slab",group:11},"minecraft:smooth_stone_slab":{type:"minecraft:smooth_stone_slab",item:"minecraft:smooth_stone_slab",group:11},"minecraft:smooth_sandstone_slab":{type:"minecraft:smooth_sandstone_slab",item:"minecraft:smooth_sandstone_slab",group:11},"minecraft:smooth_red_sandstone_slab":{type:"minecraft:smooth_red_sandstone_slab",item:"minecraft:smooth_red_sandstone_slab",group:11},"minecraft:smooth_quartz_slab":{type:"minecraft:smooth_quartz_slab",item:"minecraft:smooth_quartz_slab",group:11},"minecraft:sandstone_slab":{type:"minecraft:sandstone_slab",item:"minecraft:sandstone_slab",group:11},"minecraft:red_sandstone_slab":{type:"minecraft:red_sandstone_slab",item:"minecraft:red_sandstone_slab",group:11},"minecraft:red_nether_brick_slab":{type:"minecraft:red_nether_brick_slab",item:"minecraft:red_nether_brick_slab",group:11},"minecraft:quartz_slab":{type:"minecraft:quartz_slab",item:"minecraft:quartz_slab",group:11},"minecraft:purpur_slab":{type:"minecraft:purpur_slab",item:"minecraft:purpur_slab",group:11},"minecraft:prismarine_slab":{type:"minecraft:prismarine_slab",item:"minecraft:prismarine_slab",group:11},"minecraft:prismarine_brick_slab":{type:"minecraft:prismarine_brick_slab",item:"minecraft:prismarine_brick_slab",group:11},"minecraft:polished_tuff_slab":{type:"minecraft:polished_tuff_slab",item:"minecraft:polished_tuff_slab",group:11},"minecraft:polished_granite_slab":{type:"minecraft:polished_granite_slab",item:"minecraft:polished_granite_slab",group:11},"minecraft:polished_diorite_slab":{type:"minecraft:polished_diorite_slab",item:"minecraft:polished_diorite_slab",group:11},"minecraft:polished_deepslate_slab":{type:"minecraft:polished_deepslate_slab",item:"minecraft:polished_deepslate_slab",group:11},"minecraft:polished_blackstone_slab":{type:"minecraft:polished_blackstone_slab",item:"minecraft:polished_blackstone_slab",group:11},"minecraft:polished_blackstone_brick_slab":{type:"minecraft:polished_blackstone_brick_slab",item:"minecraft:polished_blackstone_brick_slab",group:11},"minecraft:polished_andesite_slab":{type:"minecraft:polished_andesite_slab",item:"minecraft:polished_andesite_slab",group:11},"minecraft:petrified_oak_slab":{type:"minecraft:petrified_oak_slab",item:"minecraft:petrified_oak_slab",group:11},"minecraft:pale_oak_slab":{type:"minecraft:pale_oak_slab",item:"minecraft:pale_oak_slab",group:11},"minecraft:oxidized_cut_copper_slab":{type:"minecraft:oxidized_cut_copper_slab",item:"minecraft:oxidized_cut_copper_slab",group:11},"minecraft:oak_slab":{type:"minecraft:oak_slab",item:"minecraft:oak_slab",group:11},"minecraft:nether_brick_slab":{type:"minecraft:nether_brick_slab",item:"minecraft:nether_brick_slab",group:11},"minecraft:mud_brick_slab":{type:"minecraft:mud_brick_slab",item:"minecraft:mud_brick_slab",group:11},"minecraft:mossy_stone_brick_slab":{type:"minecraft:mossy_stone_brick_slab",item:"minecraft:mossy_stone_brick_slab",group:11},"minecraft:mossy_cobblestone_slab":{type:"minecraft:mossy_cobblestone_slab",item:"minecraft:mossy_cobblestone_slab",group:11},"minecraft:mangrove_slab":{type:"minecraft:mangrove_slab",item:"minecraft:mangrove_slab",group:11},"minecraft:jungle_slab":{type:"minecraft:jungle_slab",item:"minecraft:jungle_slab",group:11},"minecraft:granite_slab":{type:"minecraft:granite_slab",item:"minecraft:granite_slab",group:11},"minecraft:exposed_cut_copper_slab":{type:"minecraft:exposed_cut_copper_slab",item:"minecraft:exposed_cut_copper_slab",group:11},"minecraft:end_stone_brick_slab":{type:"minecraft:end_stone_brick_slab",item:"minecraft:end_stone_brick_slab",group:11},"minecraft:diorite_slab":{type:"minecraft:diorite_slab",item:"minecraft:diorite_slab",group:11},"minecraft:deepslate_tile_slab":{type:"minecraft:deepslate_tile_slab",item:"minecraft:deepslate_tile_slab",group:11},"minecraft:deepslate_brick_slab":{type:"minecraft:deepslate_brick_slab",item:"minecraft:deepslate_brick_slab",group:11},"minecraft:dark_prismarine_slab":{type:"minecraft:dark_prismarine_slab",item:"minecraft:dark_prismarine_slab",group:11},"minecraft:dark_oak_slab":{type:"minecraft:dark_oak_slab",item:"minecraft:dark_oak_slab",group:11},"minecraft:cut_sandstone_slab":{type:"minecraft:cut_sandstone_slab",item:"minecraft:cut_sandstone_slab",group:11},"minecraft:cut_red_sandstone_slab":{type:"minecraft:cut_red_sandstone_slab",item:"minecraft:cut_red_sandstone_slab",group:11},"minecraft:cut_copper_slab":{type:"minecraft:cut_copper_slab",item:"minecraft:cut_copper_slab",group:11},"minecraft:crimson_slab":{type:"minecraft:crimson_slab",item:"minecraft:crimson_slab",group:11},"minecraft:cobblestone_slab":{type:"minecraft:cobblestone_slab",item:"minecraft:cobblestone_slab",group:11},"minecraft:cobbled_deepslate_slab":{type:"minecraft:cobbled_deepslate_slab",item:"minecraft:cobbled_deepslate_slab",group:11},"minecraft:cherry_slab":{type:"minecraft:cherry_slab",item:"minecraft:cherry_slab",group:11},"minecraft:brick_slab":{type:"minecraft:brick_slab",item:"minecraft:brick_slab",group:11},"minecraft:blackstone_slab":{type:"minecraft:blackstone_slab",item:"minecraft:blackstone_slab",group:11},"minecraft:birch_slab":{type:"minecraft:birch_slab",item:"minecraft:birch_slab",group:11},"minecraft:bamboo_slab":{type:"minecraft:bamboo_slab",item:"minecraft:bamboo_slab",group:11},"minecraft:bamboo_mosaic_slab":{type:"minecraft:bamboo_mosaic_slab",item:"minecraft:bamboo_mosaic_slab",group:11},"minecraft:andesite_slab":{type:"minecraft:andesite_slab",item:"minecraft:andesite_slab",group:11},"minecraft:acacia_slab":{type:"minecraft:acacia_slab",item:"minecraft:acacia_slab",group:11},"minecraft:pale_oak_sign":{type:"minecraft:pale_oak_sign",item:"minecraft:pale_oak_sign",group:10},"minecraft:spruce_sapling":{type:"minecraft:spruce_sapling",item:"minecraft:spruce_sapling",group:9},"minecraft:pale_oak_sapling":{type:"minecraft:pale_oak_sapling",item:"minecraft:pale_oak_sapling",group:9},"minecraft:oak_sapling":{type:"minecraft:oak_sapling",item:"minecraft:oak_sapling",group:9},"minecraft:jungle_sapling":{type:"minecraft:jungle_sapling",item:"minecraft:jungle_sapling",group:9},"minecraft:dark_oak_sapling":{type:"minecraft:dark_oak_sapling",item:"minecraft:dark_oak_sapling",group:9},"minecraft:cherry_sapling":{type:"minecraft:cherry_sapling",item:"minecraft:cherry_sapling",group:9},"minecraft:birch_sapling":{type:"minecraft:birch_sapling",item:"minecraft:birch_sapling",group:9},"minecraft:acacia_sapling":{type:"minecraft:acacia_sapling",item:"minecraft:acacia_sapling",group:9},"minecraft:warped_pressure_plate":{type:"minecraft:warped_pressure_plate",item:"minecraft:warped_pressure_plate",group:8},"minecraft:stone_pressure_plate":{type:"minecraft:stone_pressure_plate",item:"minecraft:stone_pressure_plate",group:8},"minecraft:spruce_pressure_plate":{type:"minecraft:spruce_pressure_plate",item:"minecraft:spruce_pressure_plate",group:8},"minecraft:polished_blackstone_pressure_plate":{type:"minecraft:polished_blackstone_pressure_plate",item:"minecraft:polished_blackstone_pressure_plate",group:8},"minecraft:pale_oak_pressure_plate":{type:"minecraft:pale_oak_pressure_plate",item:"minecraft:pale_oak_pressure_plate",group:8},"minecraft:oak_pressure_plate":{type:"minecraft:oak_pressure_plate",item:"minecraft:oak_pressure_plate",group:8},"minecraft:mangrove_pressure_plate":{type:"minecraft:mangrove_pressure_plate",item:"minecraft:mangrove_pressure_plate",group:8},"minecraft:jungle_pressure_plate":{type:"minecraft:jungle_pressure_plate",item:"minecraft:jungle_pressure_plate",group:8},"minecraft:dark_oak_pressure_plate":{type:"minecraft:dark_oak_pressure_plate",item:"minecraft:dark_oak_pressure_plate",group:8},"minecraft:crimson_pressure_plate":{type:"minecraft:crimson_pressure_plate",item:"minecraft:crimson_pressure_plate",group:8},"minecraft:cherry_pressure_plate":{type:"minecraft:cherry_pressure_plate",item:"minecraft:cherry_pressure_plate",group:8},"minecraft:birch_pressure_plate":{type:"minecraft:birch_pressure_plate",item:"minecraft:birch_pressure_plate",group:8},"minecraft:bamboo_pressure_plate":{type:"minecraft:bamboo_pressure_plate",item:"minecraft:bamboo_pressure_plate",group:8},"minecraft:acacia_pressure_plate":{type:"minecraft:acacia_pressure_plate",item:"minecraft:acacia_pressure_plate",group:8},"minecraft:warped_stem":{type:"minecraft:warped_stem",item:"minecraft:warped_stem",group:7},"minecraft:warped_hyphae":{type:"minecraft:warped_hyphae",item:"minecraft:warped_hyphae",group:7},"minecraft:verdant_froglight":{type:"minecraft:verdant_froglight",item:"minecraft:verdant_froglight",group:7},"minecraft:stripped_warped_stem":{type:"minecraft:stripped_warped_stem",item:"minecraft:stripped_warped_stem",group:7},"minecraft:stripped_warped_hyphae":{type:"minecraft:stripped_warped_hyphae",item:"minecraft:stripped_warped_hyphae",group:7},"minecraft:stripped_spruce_wood":{type:"minecraft:stripped_spruce_wood",item:"minecraft:stripped_spruce_wood",group:7},"minecraft:stripped_spruce_log":{type:"minecraft:stripped_spruce_log",item:"minecraft:stripped_spruce_log",group:7},"minecraft:stripped_pale_oak_wood":{type:"minecraft:stripped_pale_oak_wood",item:"minecraft:stripped_pale_oak_wood",group:7},"minecraft:stripped_pale_oak_log":{type:"minecraft:stripped_pale_oak_log",item:"minecraft:stripped_pale_oak_log",group:7},"minecraft:stripped_oak_wood":{type:"minecraft:stripped_oak_wood",item:"minecraft:stripped_oak_wood",group:7},"minecraft:stripped_oak_log":{type:"minecraft:stripped_oak_log",item:"minecraft:stripped_oak_log",group:7},"minecraft:stripped_mangrove_wood":{type:"minecraft:stripped_mangrove_wood",item:"minecraft:stripped_mangrove_wood",group:7},"minecraft:stripped_mangrove_log":{type:"minecraft:stripped_mangrove_log",item:"minecraft:stripped_mangrove_log",group:7},"minecraft:stripped_jungle_wood":{type:"minecraft:stripped_jungle_wood",item:"minecraft:stripped_jungle_wood",group:7},"minecraft:stripped_jungle_log":{type:"minecraft:stripped_jungle_log",item:"minecraft:stripped_jungle_log",group:7},"minecraft:stripped_dark_oak_wood":{type:"minecraft:stripped_dark_oak_wood",item:"minecraft:stripped_dark_oak_wood",group:7},"minecraft:stripped_dark_oak_log":{type:"minecraft:stripped_dark_oak_log",item:"minecraft:stripped_dark_oak_log",group:7},"minecraft:stripped_crimson_stem":{type:"minecraft:stripped_crimson_stem",item:"minecraft:stripped_crimson_stem",group:7},"minecraft:stripped_crimson_hyphae":{type:"minecraft:stripped_crimson_hyphae",item:"minecraft:stripped_crimson_hyphae",group:7},"minecraft:stripped_cherry_wood":{type:"minecraft:stripped_cherry_wood",item:"minecraft:stripped_cherry_wood",group:7},"minecraft:stripped_cherry_log":{type:"minecraft:stripped_cherry_log",item:"minecraft:stripped_cherry_log",group:7},"minecraft:stripped_birch_wood":{type:"minecraft:stripped_birch_wood",item:"minecraft:stripped_birch_wood",group:7},"minecraft:stripped_birch_log":{type:"minecraft:stripped_birch_log",item:"minecraft:stripped_birch_log",group:7},"minecraft:stripped_bamboo_block":{type:"minecraft:stripped_bamboo_block",item:"minecraft:stripped_bamboo_block",group:7},"minecraft:stripped_acacia_wood":{type:"minecraft:stripped_acacia_wood",item:"minecraft:stripped_acacia_wood",group:7},"minecraft:stripped_acacia_log":{type:"minecraft:stripped_acacia_log",item:"minecraft:stripped_acacia_log",group:7},"minecraft:spruce_wood":{type:"minecraft:spruce_wood",item:"minecraft:spruce_wood",group:7},"minecraft:spruce_log":{type:"minecraft:spruce_log",item:"minecraft:spruce_log",group:7},"minecraft:quartz_pillar":{type:"minecraft:quartz_pillar",item:"minecraft:quartz_pillar",group:7},"minecraft:purpur_pillar":{type:"minecraft:purpur_pillar",item:"minecraft:purpur_pillar",group:7},"minecraft:polished_basalt":{type:"minecraft:polished_basalt",item:"minecraft:polished_basalt",group:7},"minecraft:pearlescent_froglight":{type:"minecraft:pearlescent_froglight",item:"minecraft:pearlescent_froglight",group:7},"minecraft:pale_oak_wood":{type:"minecraft:pale_oak_wood",item:"minecraft:pale_oak_wood",group:7},"minecraft:pale_oak_log":{type:"minecraft:pale_oak_log",item:"minecraft:pale_oak_log",group:7},"minecraft:ochre_froglight":{type:"minecraft:ochre_froglight",item:"minecraft:ochre_froglight",group:7},"minecraft:oak_wood":{type:"minecraft:oak_wood",item:"minecraft:oak_wood",group:7},"minecraft:oak_log":{type:"minecraft:oak_log",item:"minecraft:oak_log",group:7},"minecraft:muddy_mangrove_roots":{type:"minecraft:muddy_mangrove_roots",item:"minecraft:muddy_mangrove_roots",group:7},"minecraft:mangrove_wood":{type:"minecraft:mangrove_wood",item:"minecraft:mangrove_wood",group:7},"minecraft:mangrove_log":{type:"minecraft:mangrove_log",item:"minecraft:mangrove_log",group:7},"minecraft:jungle_wood":{type:"minecraft:jungle_wood",item:"minecraft:jungle_wood",group:7},"minecraft:jungle_log":{type:"minecraft:jungle_log",item:"minecraft:jungle_log",group:7},"minecraft:infested_deepslate":{type:"minecraft:infested_deepslate",item:"minecraft:infested_deepslate",group:7},"minecraft:hay_block":{type:"minecraft:hay_block",item:"minecraft:hay_block",group:7},"minecraft:deepslate":{type:"minecraft:deepslate",item:"minecraft:deepslate",group:7},"minecraft:dark_oak_wood":{type:"minecraft:dark_oak_wood",item:"minecraft:dark_oak_wood",group:7},"minecraft:dark_oak_log":{type:"minecraft:dark_oak_log",item:"minecraft:dark_oak_log",group:7},"minecraft:crimson_stem":{type:"minecraft:crimson_stem",item:"minecraft:crimson_stem",group:7},"minecraft:crimson_hyphae":{type:"minecraft:crimson_hyphae",item:"minecraft:crimson_hyphae",group:7},"minecraft:cherry_wood":{type:"minecraft:cherry_wood",item:"minecraft:cherry_wood",group:7},"minecraft:cherry_log":{type:"minecraft:cherry_log",item:"minecraft:cherry_log",group:7},"minecraft:bone_block":{type:"minecraft:bone_block",item:"minecraft:bone_block",group:7},"minecraft:birch_wood":{type:"minecraft:birch_wood",item:"minecraft:birch_wood",group:7},"minecraft:birch_log":{type:"minecraft:birch_log",item:"minecraft:birch_log",group:7},"minecraft:basalt":{type:"minecraft:basalt",item:"minecraft:basalt",group:7},"minecraft:bamboo_block":{type:"minecraft:bamboo_block",item:"minecraft:bamboo_block",group:7},"minecraft:acacia_wood":{type:"minecraft:acacia_wood",item:"minecraft:acacia_wood",group:7},"minecraft:acacia_log":{type:"minecraft:acacia_log",item:"minecraft:acacia_log",group:7},"minecraft:spruce_leaves":{type:"minecraft:spruce_leaves",item:"minecraft:spruce_leaves",group:6},"minecraft:pale_oak_leaves":{type:"minecraft:pale_oak_leaves",item:"minecraft:pale_oak_leaves",group:6},"minecraft:oak_leaves":{type:"minecraft:oak_leaves",item:"minecraft:oak_leaves",group:6},"minecraft:mangrove_leaves":{type:"minecraft:mangrove_leaves",item:"minecraft:mangrove_leaves",group:6},"minecraft:jungle_leaves":{type:"minecraft:jungle_leaves",item:"minecraft:jungle_leaves",group:6},"minecraft:flowering_azalea_leaves":{type:"minecraft:flowering_azalea_leaves",item:"minecraft:flowering_azalea_leaves",group:6},"minecraft:dark_oak_leaves":{type:"minecraft:dark_oak_leaves",item:"minecraft:dark_oak_leaves",group:6},"minecraft:cherry_leaves":{type:"minecraft:cherry_leaves",item:"minecraft:cherry_leaves",group:6},"minecraft:birch_leaves":{type:"minecraft:birch_leaves",item:"minecraft:birch_leaves",group:6},"minecraft:azalea_leaves":{type:"minecraft:azalea_leaves",item:"minecraft:azalea_leaves",group:6},"minecraft:acacia_leaves":{type:"minecraft:acacia_leaves",item:"minecraft:acacia_leaves",group:6},"minecraft:pale_oak_hanging_sign":{type:"minecraft:pale_oak_hanging_sign",item:"minecraft:pale_oak_hanging_sign",group:5},"minecraft:warped_fence_gate":{type:"minecraft:warped_fence_gate",item:"minecraft:warped_fence_gate",group:4},"minecraft:spruce_fence_gate":{type:"minecraft:spruce_fence_gate",item:"minecraft:spruce_fence_gate",group:4},"minecraft:pale_oak_fence_gate":{type:"minecraft:pale_oak_fence_gate",item:"minecraft:pale_oak_fence_gate",group:4},"minecraft:oak_fence_gate":{type:"minecraft:oak_fence_gate",item:"minecraft:oak_fence_gate",group:4},"minecraft:mangrove_fence_gate":{type:"minecraft:mangrove_fence_gate",item:"minecraft:mangrove_fence_gate",group:4},"minecraft:jungle_fence_gate":{type:"minecraft:jungle_fence_gate",item:"minecraft:jungle_fence_gate",group:4},"minecraft:dark_oak_fence_gate":{type:"minecraft:dark_oak_fence_gate",item:"minecraft:dark_oak_fence_gate",group:4},"minecraft:crimson_fence_gate":{type:"minecraft:crimson_fence_gate",item:"minecraft:crimson_fence_gate",group:4},"minecraft:cherry_fence_gate":{type:"minecraft:cherry_fence_gate",item:"minecraft:cherry_fence_gate",group:4},"minecraft:birch_fence_gate":{type:"minecraft:birch_fence_gate",item:"minecraft:birch_fence_gate",group:4},"minecraft:bamboo_fence_gate":{type:"minecraft:bamboo_fence_gate",item:"minecraft:bamboo_fence_gate",group:4},"minecraft:acacia_fence_gate":{type:"minecraft:acacia_fence_gate",item:"minecraft:acacia_fence_gate",group:4},"minecraft:yellow_stained_glass_pane":{type:"minecraft:yellow_stained_glass_pane",item:"minecraft:yellow_stained_glass_pane",group:3},"minecraft:white_stained_glass_pane":{type:"minecraft:white_stained_glass_pane",item:"minecraft:white_stained_glass_pane",group:3},"minecraft:warped_fence":{type:"minecraft:warped_fence",item:"minecraft:warped_fence",group:3},"minecraft:spruce_fence":{type:"minecraft:spruce_fence",item:"minecraft:spruce_fence",group:3},"minecraft:red_stained_glass_pane":{type:"minecraft:red_stained_glass_pane",item:"minecraft:red_stained_glass_pane",group:3},"minecraft:purple_stained_glass_pane":{type:"minecraft:purple_stained_glass_pane",item:"minecraft:purple_stained_glass_pane",group:3},"minecraft:pink_stained_glass_pane":{type:"minecraft:pink_stained_glass_pane",item:"minecraft:pink_stained_glass_pane",group:3},"minecraft:pale_oak_fence":{type:"minecraft:pale_oak_fence",item:"minecraft:pale_oak_fence",group:3},"minecraft:orange_stained_glass_pane":{type:"minecraft:orange_stained_glass_pane",item:"minecraft:orange_stained_glass_pane",group:3},"minecraft:oak_fence":{type:"minecraft:oak_fence",item:"minecraft:oak_fence",group:3},"minecraft:nether_brick_fence":{type:"minecraft:nether_brick_fence",item:"minecraft:nether_brick_fence",group:3},"minecraft:mangrove_fence":{type:"minecraft:mangrove_fence",item:"minecraft:mangrove_fence",group:3},"minecraft:magenta_stained_glass_pane":{type:"minecraft:magenta_stained_glass_pane",item:"minecraft:magenta_stained_glass_pane",group:3},"minecraft:lime_stained_glass_pane":{type:"minecraft:lime_stained_glass_pane",item:"minecraft:lime_stained_glass_pane",group:3},"minecraft:light_gray_stained_glass_pane":{type:"minecraft:light_gray_stained_glass_pane",item:"minecraft:light_gray_stained_glass_pane",group:3},"minecraft:light_blue_stained_glass_pane":{type:"minecraft:light_blue_stained_glass_pane",item:"minecraft:light_blue_stained_glass_pane",group:3},"minecraft:jungle_fence":{type:"minecraft:jungle_fence",item:"minecraft:jungle_fence",group:3},"minecraft:iron_bars":{type:"minecraft:iron_bars",item:"minecraft:iron_bars",group:3},"minecraft:green_stained_glass_pane":{type:"minecraft:green_stained_glass_pane",item:"minecraft:green_stained_glass_pane",group:3},"minecraft:gray_stained_glass_pane":{type:"minecraft:gray_stained_glass_pane",item:"minecraft:gray_stained_glass_pane",group:3},"minecraft:glass_pane":{type:"minecraft:glass_pane",item:"minecraft:glass_pane",group:3},"minecraft:dark_oak_fence":{type:"minecraft:dark_oak_fence",item:"minecraft:dark_oak_fence",group:3},"minecraft:cyan_stained_glass_pane":{type:"minecraft:cyan_stained_glass_pane",item:"minecraft:cyan_stained_glass_pane",group:3},"minecraft:crimson_fence":{type:"minecraft:crimson_fence",item:"minecraft:crimson_fence",group:3},"minecraft:cherry_fence":{type:"minecraft:cherry_fence",item:"minecraft:cherry_fence",group:3},"minecraft:brown_stained_glass_pane":{type:"minecraft:brown_stained_glass_pane",item:"minecraft:brown_stained_glass_pane",group:3},"minecraft:blue_stained_glass_pane":{type:"minecraft:blue_stained_glass_pane",item:"minecraft:blue_stained_glass_pane",group:3},"minecraft:black_stained_glass_pane":{type:"minecraft:black_stained_glass_pane",item:"minecraft:black_stained_glass_pane",group:3},"minecraft:birch_fence":{type:"minecraft:birch_fence",item:"minecraft:birch_fence",group:3},"minecraft:bamboo_fence":{type:"minecraft:bamboo_fence",item:"minecraft:bamboo_fence",group:3},"minecraft:acacia_fence":{type:"minecraft:acacia_fence",item:"minecraft:acacia_fence",group:3},"minecraft:weathered_copper_door":{type:"minecraft:weathered_copper_door",item:"minecraft:weathered_copper_door",group:2},"minecraft:waxed_weathered_copper_door":{type:"minecraft:waxed_weathered_copper_door",item:"minecraft:waxed_weathered_copper_door",group:2},"minecraft:waxed_oxidized_copper_door":{type:"minecraft:waxed_oxidized_copper_door",item:"minecraft:waxed_oxidized_copper_door",group:2},"minecraft:waxed_exposed_copper_door":{type:"minecraft:waxed_exposed_copper_door",item:"minecraft:waxed_exposed_copper_door",group:2},"minecraft:waxed_copper_door":{type:"minecraft:waxed_copper_door",item:"minecraft:waxed_copper_door",group:2},"minecraft:warped_door":{type:"minecraft:warped_door",item:"minecraft:warped_door",group:2},"minecraft:spruce_door":{type:"minecraft:spruce_door",item:"minecraft:spruce_door",group:2},"minecraft:pale_oak_door":{type:"minecraft:pale_oak_door",item:"minecraft:pale_oak_door",group:2},"minecraft:oxidized_copper_door":{type:"minecraft:oxidized_copper_door",item:"minecraft:oxidized_copper_door",group:2},"minecraft:oak_door":{type:"minecraft:oak_door",item:"minecraft:oak_door",group:2},"minecraft:mangrove_door":{type:"minecraft:mangrove_door",item:"minecraft:mangrove_door",group:2},"minecraft:jungle_door":{type:"minecraft:jungle_door",item:"minecraft:jungle_door",group:2},"minecraft:iron_door":{type:"minecraft:iron_door",item:"minecraft:iron_door",group:2},"minecraft:exposed_copper_door":{type:"minecraft:exposed_copper_door",item:"minecraft:exposed_copper_door",group:2},"minecraft:dark_oak_door":{type:"minecraft:dark_oak_door",item:"minecraft:dark_oak_door",group:2},"minecraft:crimson_door":{type:"minecraft:crimson_door",item:"minecraft:crimson_door",group:2},"minecraft:copper_door":{type:"minecraft:copper_door",item:"minecraft:copper_door",group:2},"minecraft:cherry_door":{type:"minecraft:cherry_door",item:"minecraft:cherry_door",group:2},"minecraft:birch_door":{type:"minecraft:birch_door",item:"minecraft:birch_door",group:2},"minecraft:bamboo_door":{type:"minecraft:bamboo_door",item:"minecraft:bamboo_door",group:2},"minecraft:acacia_door":{type:"minecraft:acacia_door",item:"minecraft:acacia_door",group:2},"minecraft:warped_button":{type:"minecraft:warped_button",item:"minecraft:warped_button",group:1},"minecraft:stone_button":{type:"minecraft:stone_button",item:"minecraft:stone_button",group:1},"minecraft:spruce_button":{type:"minecraft:spruce_button",item:"minecraft:spruce_button",group:1},"minecraft:polished_blackstone_button":{type:"minecraft:polished_blackstone_button",item:"minecraft:polished_blackstone_button",group:1},"minecraft:pale_oak_button":{type:"minecraft:pale_oak_button",item:"minecraft:pale_oak_button",group:1},"minecraft:oak_button":{type:"minecraft:oak_button",item:"minecraft:oak_button",group:1},"minecraft:mangrove_button":{type:"minecraft:mangrove_button",item:"minecraft:mangrove_button",group:1},"minecraft:lever":{type:"minecraft:lever",item:"minecraft:lever",group:1},"minecraft:jungle_button":{type:"minecraft:jungle_button",item:"minecraft:jungle_button",group:1},"minecraft:dark_oak_button":{type:"minecraft:dark_oak_button",item:"minecraft:dark_oak_button",group:1},"minecraft:crimson_button":{type:"minecraft:crimson_button",item:"minecraft:crimson_button",group:1},"minecraft:cherry_button":{type:"minecraft:cherry_button",item:"minecraft:cherry_button",group:1},"minecraft:birch_button":{type:"minecraft:birch_button",item:"minecraft:birch_button",group:1},"minecraft:bamboo_button":{type:"minecraft:bamboo_button",item:"minecraft:bamboo_button",group:1},"minecraft:acacia_button":{type:"minecraft:acacia_button",item:"minecraft:acacia_button",group:1},"minecraft:yellow_wool":{type:"minecraft:yellow_wool",item:"minecraft:yellow_wool",group:0},"minecraft:yellow_terracotta":{type:"minecraft:yellow_terracotta",item:"minecraft:yellow_terracotta",group:0},"minecraft:yellow_stained_glass":{type:"minecraft:yellow_stained_glass",item:"minecraft:yellow_stained_glass",group:0},"minecraft:yellow_concrete_powder":{type:"minecraft:yellow_concrete_powder",item:"minecraft:yellow_concrete_powder",group:0},"minecraft:yellow_concrete":{type:"minecraft:yellow_concrete",item:"minecraft:yellow_concrete",group:0},"minecraft:yellow_carpet":{type:"minecraft:yellow_carpet",item:"minecraft:yellow_carpet",group:0},"minecraft:wither_rose":{type:"minecraft:wither_rose",item:"minecraft:wither_rose",group:0},"minecraft:white_wool":{type:"minecraft:white_wool",item:"minecraft:white_wool",group:0},"minecraft:white_tulip":{type:"minecraft:white_tulip",item:"minecraft:white_tulip",group:0},"minecraft:white_terracotta":{type:"minecraft:white_terracotta",item:"minecraft:white_terracotta",group:0},"minecraft:white_stained_glass":{type:"minecraft:white_stained_glass",item:"minecraft:white_stained_glass",group:0},"minecraft:white_concrete_powder":{type:"minecraft:white_concrete_powder",item:"minecraft:white_concrete_powder",group:0},"minecraft:white_concrete":{type:"minecraft:white_concrete",item:"minecraft:white_concrete",group:0},"minecraft:white_carpet":{type:"minecraft:white_carpet",item:"minecraft:white_carpet",group:0},"minecraft:wet_sponge":{type:"minecraft:wet_sponge",item:"minecraft:wet_sponge",group:0},"minecraft:weathered_cut_copper":{type:"minecraft:weathered_cut_copper",item:"minecraft:weathered_cut_copper",group:0},"minecraft:weathered_copper":{type:"minecraft:weathered_copper",item:"minecraft:weathered_copper",group:0},"minecraft:weathered_chiseled_copper":{type:"minecraft:weathered_chiseled_copper",item:"minecraft:weathered_chiseled_copper",group:0},"minecraft:waxed_weathered_cut_copper":{type:"minecraft:waxed_weathered_cut_copper",item:"minecraft:waxed_weathered_cut_copper",group:0},"minecraft:waxed_weathered_copper":{type:"minecraft:waxed_weathered_copper",item:"minecraft:waxed_weathered_copper",group:0},"minecraft:waxed_weathered_chiseled_copper":{type:"minecraft:waxed_weathered_chiseled_copper",item:"minecraft:waxed_weathered_chiseled_copper",group:0},"minecraft:waxed_oxidized_cut_copper":{type:"minecraft:waxed_oxidized_cut_copper",item:"minecraft:waxed_oxidized_cut_copper",group:0},"minecraft:waxed_oxidized_copper":{type:"minecraft:waxed_oxidized_copper",item:"minecraft:waxed_oxidized_copper",group:0},"minecraft:waxed_oxidized_chiseled_copper":{type:"minecraft:waxed_oxidized_chiseled_copper",item:"minecraft:waxed_oxidized_chiseled_copper",group:0},"minecraft:waxed_exposed_cut_copper":{type:"minecraft:waxed_exposed_cut_copper",item:"minecraft:waxed_exposed_cut_copper",group:0},"minecraft:waxed_exposed_copper":{type:"minecraft:waxed_exposed_copper",item:"minecraft:waxed_exposed_copper",group:0},"minecraft:waxed_exposed_chiseled_copper":{type:"minecraft:waxed_exposed_chiseled_copper",item:"minecraft:waxed_exposed_chiseled_copper",group:0},"minecraft:waxed_cut_copper":{type:"minecraft:waxed_cut_copper",item:"minecraft:waxed_cut_copper",group:0},"minecraft:waxed_copper_block":{type:"minecraft:waxed_copper_block",item:"minecraft:waxed_copper_block",group:0},"minecraft:waxed_chiseled_copper":{type:"minecraft:waxed_chiseled_copper",item:"minecraft:waxed_chiseled_copper",group:0},"minecraft:warped_wart_block":{type:"minecraft:warped_wart_block",item:"minecraft:warped_wart_block",group:0},"minecraft:warped_roots":{type:"minecraft:warped_roots",item:"minecraft:warped_roots",group:0},"minecraft:warped_planks":{type:"minecraft:warped_planks",item:"minecraft:warped_planks",group:0},"minecraft:warped_nylium":{type:"minecraft:warped_nylium",item:"minecraft:warped_nylium",group:0},"minecraft:warped_fungus":{type:"minecraft:warped_fungus",item:"minecraft:warped_fungus",group:0},"minecraft:tuff_bricks":{type:"minecraft:tuff_bricks",item:"minecraft:tuff_bricks",group:0},"minecraft:tuff":{type:"minecraft:tuff",item:"minecraft:tuff",group:0},"minecraft:tube_coral_block":{type:"minecraft:tube_coral_block",item:"minecraft:tube_coral_block",group:0},"minecraft:torchflower":{type:"minecraft:torchflower",item:"minecraft:torchflower",group:0},"minecraft:tinted_glass":{type:"minecraft:tinted_glass",item:"minecraft:tinted_glass",group:0},"minecraft:terracotta":{type:"minecraft:terracotta",item:"minecraft:terracotta",group:0},"minecraft:structure_void":{type:"minecraft:structure_void",item:"minecraft:structure_void",group:0},"minecraft:stone_bricks":{type:"minecraft:stone_bricks",item:"minecraft:stone_bricks",group:0},"minecraft:stone":{type:"minecraft:stone",item:"minecraft:stone",group:0},"minecraft:spruce_planks":{type:"minecraft:spruce_planks",item:"minecraft:spruce_planks",group:0},"minecraft:spore_blossom":{type:"minecraft:spore_blossom",item:"minecraft:spore_blossom",group:0},"minecraft:sponge":{type:"minecraft:sponge",item:"minecraft:sponge",group:0},"minecraft:spawner":{type:"minecraft:spawner",item:"minecraft:spawner",group:0},"minecraft:soul_soil":{type:"minecraft:soul_soil",item:"minecraft:soul_soil",group:0},"minecraft:soul_sand":{type:"minecraft:soul_sand",item:"minecraft:soul_sand",group:0},"minecraft:snow_block":{type:"minecraft:snow_block",item:"minecraft:snow_block",group:0},"minecraft:smooth_stone":{type:"minecraft:smooth_stone",item:"minecraft:smooth_stone",group:0},"minecraft:smooth_sandstone":{type:"minecraft:smooth_sandstone",item:"minecraft:smooth_sandstone",group:0},"minecraft:smooth_red_sandstone":{type:"minecraft:smooth_red_sandstone",item:"minecraft:smooth_red_sandstone",group:0},"minecraft:smooth_quartz":{type:"minecraft:smooth_quartz",item:"minecraft:smooth_quartz",group:0},"minecraft:smooth_basalt":{type:"minecraft:smooth_basalt",item:"minecraft:smooth_basalt",group:0},"minecraft:smithing_table":{type:"minecraft:smithing_table",item:"minecraft:smithing_table",group:0},"minecraft:slime_block":{type:"minecraft:slime_block",item:"minecraft:slime_block",group:0},"minecraft:shroomlight":{type:"minecraft:shroomlight",item:"minecraft:shroomlight",group:0},"minecraft:short_grass":{type:"minecraft:short_grass",item:"minecraft:short_grass",group:0},"minecraft:seagrass":{type:"minecraft:seagrass",item:"minecraft:seagrass",group:0},"minecraft:sea_lantern":{type:"minecraft:sea_lantern",item:"minecraft:sea_lantern",group:0},"minecraft:sculk":{type:"minecraft:sculk",item:"minecraft:sculk",group:0},"minecraft:sandstone":{type:"minecraft:sandstone",item:"minecraft:sandstone",group:0},"minecraft:sand":{type:"minecraft:sand",item:"minecraft:sand",group:0},"minecraft:rooted_dirt":{type:"minecraft:rooted_dirt",item:"minecraft:rooted_dirt",group:0},"minecraft:reinforced_deepslate":{type:"minecraft:reinforced_deepslate",item:"minecraft:reinforced_deepslate",group:0},"minecraft:redstone_block":{type:"minecraft:redstone_block",item:"minecraft:redstone_block",group:0},"minecraft:red_wool":{type:"minecraft:red_wool",item:"minecraft:red_wool",group:0},"minecraft:red_tulip":{type:"minecraft:red_tulip",item:"minecraft:red_tulip",group:0},"minecraft:red_terracotta":{type:"minecraft:red_terracotta",item:"minecraft:red_terracotta",group:0},"minecraft:red_stained_glass":{type:"minecraft:red_stained_glass",item:"minecraft:red_stained_glass",group:0},"minecraft:red_sandstone":{type:"minecraft:red_sandstone",item:"minecraft:red_sandstone",group:0},"minecraft:red_sand":{type:"minecraft:red_sand",item:"minecraft:red_sand",group:0},"minecraft:red_nether_bricks":{type:"minecraft:red_nether_bricks",item:"minecraft:red_nether_bricks",group:0},"minecraft:red_mushroom":{type:"minecraft:red_mushroom",item:"minecraft:red_mushroom",group:0},"minecraft:red_concrete_powder":{type:"minecraft:red_concrete_powder",item:"minecraft:red_concrete_powder",group:0},"minecraft:red_concrete":{type:"minecraft:red_concrete",item:"minecraft:red_concrete",group:0},"minecraft:red_carpet":{type:"minecraft:red_carpet",item:"minecraft:red_carpet",group:0},"minecraft:raw_iron_block":{type:"minecraft:raw_iron_block",item:"minecraft:raw_iron_block",group:0},"minecraft:raw_gold_block":{type:"minecraft:raw_gold_block",item:"minecraft:raw_gold_block",group:0},"minecraft:raw_copper_block":{type:"minecraft:raw_copper_block",item:"minecraft:raw_copper_block",group:0},"minecraft:quartz_bricks":{type:"minecraft:quartz_bricks",item:"minecraft:quartz_bricks",group:0},"minecraft:quartz_block":{type:"minecraft:quartz_block",item:"minecraft:quartz_block",group:0},"minecraft:purpur_block":{type:"minecraft:purpur_block",item:"minecraft:purpur_block",group:0},"minecraft:purple_wool":{type:"minecraft:purple_wool",item:"minecraft:purple_wool",group:0},"minecraft:purple_terracotta":{type:"minecraft:purple_terracotta",item:"minecraft:purple_terracotta",group:0},"minecraft:purple_stained_glass":{type:"minecraft:purple_stained_glass",item:"minecraft:purple_stained_glass",group:0},"minecraft:purple_concrete_powder":{type:"minecraft:purple_concrete_powder",item:"minecraft:purple_concrete_powder",group:0},"minecraft:purple_concrete":{type:"minecraft:purple_concrete",item:"minecraft:purple_concrete",group:0},"minecraft:purple_carpet":{type:"minecraft:purple_carpet",item:"minecraft:purple_carpet",group:0},"minecraft:pumpkin":{type:"minecraft:pumpkin",item:"minecraft:pumpkin",group:0},"minecraft:prismarine_bricks":{type:"minecraft:prismarine_bricks",item:"minecraft:prismarine_bricks",group:0},"minecraft:prismarine":{type:"minecraft:prismarine",item:"minecraft:prismarine",group:0},"minecraft:powder_snow_bucket":{type:"minecraft:powder_snow",item:"minecraft:powder_snow_bucket",group:0},"minecraft:poppy":{type:"minecraft:poppy",item:"minecraft:poppy",group:0},"minecraft:polished_tuff":{type:"minecraft:polished_tuff",item:"minecraft:polished_tuff",group:0},"minecraft:polished_granite":{type:"minecraft:polished_granite",item:"minecraft:polished_granite",group:0},"minecraft:polished_diorite":{type:"minecraft:polished_diorite",item:"minecraft:polished_diorite",group:0},"minecraft:polished_deepslate":{type:"minecraft:polished_deepslate",item:"minecraft:polished_deepslate",group:0},"minecraft:polished_blackstone_bricks":{type:"minecraft:polished_blackstone_bricks",item:"minecraft:polished_blackstone_bricks",group:0},"minecraft:polished_blackstone":{type:"minecraft:polished_blackstone",item:"minecraft:polished_blackstone",group:0},"minecraft:polished_andesite":{type:"minecraft:polished_andesite",item:"minecraft:polished_andesite",group:0},"minecraft:pink_wool":{type:"minecraft:pink_wool",item:"minecraft:pink_wool",group:0},"minecraft:pink_tulip":{type:"minecraft:pink_tulip",item:"minecraft:pink_tulip",group:0},"minecraft:pink_terracotta":{type:"minecraft:pink_terracotta",item:"minecraft:pink_terracotta",group:0},"minecraft:pink_stained_glass":{type:"minecraft:pink_stained_glass",item:"minecraft:pink_stained_glass",group:0},"minecraft:pink_concrete_powder":{type:"minecraft:pink_concrete_powder",item:"minecraft:pink_concrete_powder",group:0},"minecraft:pink_concrete":{type:"minecraft:pink_concrete",item:"minecraft:pink_concrete",group:0},"minecraft:pink_carpet":{type:"minecraft:pink_carpet",item:"minecraft:pink_carpet",group:0},"minecraft:pale_oak_planks":{type:"minecraft:pale_oak_planks",item:"minecraft:pale_oak_planks",group:0},"minecraft:pale_moss_block":{type:"minecraft:pale_moss_block",item:"minecraft:pale_moss_block",group:0},"minecraft:packed_mud":{type:"minecraft:packed_mud",item:"minecraft:packed_mud",group:0},"minecraft:packed_ice":{type:"minecraft:packed_ice",item:"minecraft:packed_ice",group:0},"minecraft:oxidized_cut_copper":{type:"minecraft:oxidized_cut_copper",item:"minecraft:oxidized_cut_copper",group:0},"minecraft:oxidized_copper":{type:"minecraft:oxidized_copper",item:"minecraft:oxidized_copper",group:0},"minecraft:oxidized_chiseled_copper":{type:"minecraft:oxidized_chiseled_copper",item:"minecraft:oxidized_chiseled_copper",group:0},"minecraft:oxeye_daisy":{type:"minecraft:oxeye_daisy",item:"minecraft:oxeye_daisy",group:0},"minecraft:orange_wool":{type:"minecraft:orange_wool",item:"minecraft:orange_wool",group:0},"minecraft:orange_tulip":{type:"minecraft:orange_tulip",item:"minecraft:orange_tulip",group:0},"minecraft:orange_terracotta":{type:"minecraft:orange_terracotta",item:"minecraft:orange_terracotta",group:0},"minecraft:orange_stained_glass":{type:"minecraft:orange_stained_glass",item:"minecraft:orange_stained_glass",group:0},"minecraft:orange_concrete_powder":{type:"minecraft:orange_concrete_powder",item:"minecraft:orange_concrete_powder",group:0},"minecraft:orange_concrete":{type:"minecraft:orange_concrete",item:"minecraft:orange_concrete",group:0},"minecraft:orange_carpet":{type:"minecraft:orange_carpet",item:"minecraft:orange_carpet",group:0},"minecraft:obsidian":{type:"minecraft:obsidian",item:"minecraft:obsidian",group:0},"minecraft:oak_planks":{type:"minecraft:oak_planks",item:"minecraft:oak_planks",group:0},"minecraft:netherrack":{type:"minecraft:netherrack",item:"minecraft:netherrack",group:0},"minecraft:netherite_block":{type:"minecraft:netherite_block",item:"minecraft:netherite_block",group:0},"minecraft:nether_wart_block":{type:"minecraft:nether_wart_block",item:"minecraft:nether_wart_block",group:0},"minecraft:nether_sprouts":{type:"minecraft:nether_sprouts",item:"minecraft:nether_sprouts",group:0},"minecraft:nether_quartz_ore":{type:"minecraft:nether_quartz_ore",item:"minecraft:nether_quartz_ore",group:0},"minecraft:nether_gold_ore":{type:"minecraft:nether_gold_ore",item:"minecraft:nether_gold_ore",group:0},"minecraft:nether_bricks":{type:"minecraft:nether_bricks",item:"minecraft:nether_bricks",group:0},"minecraft:mud_bricks":{type:"minecraft:mud_bricks",item:"minecraft:mud_bricks",group:0},"minecraft:mud":{type:"minecraft:mud",item:"minecraft:mud",group:0},"minecraft:mossy_stone_bricks":{type:"minecraft:mossy_stone_bricks",item:"minecraft:mossy_stone_bricks",group:0},"minecraft:mossy_cobblestone":{type:"minecraft:mossy_cobblestone",item:"minecraft:mossy_cobblestone",group:0},"minecraft:moss_carpet":{type:"minecraft:moss_carpet",item:"minecraft:moss_carpet",group:0},"minecraft:moss_block":{type:"minecraft:moss_block",item:"minecraft:moss_block",group:0},"minecraft:melon":{type:"minecraft:melon",item:"minecraft:melon",group:0},"minecraft:mangrove_planks":{type:"minecraft:mangrove_planks",item:"minecraft:mangrove_planks",group:0},"minecraft:magma_block":{type:"minecraft:magma_block",item:"minecraft:magma_block",group:0},"minecraft:magenta_wool":{type:"minecraft:magenta_wool",item:"minecraft:magenta_wool",group:0},"minecraft:magenta_terracotta":{type:"minecraft:magenta_terracotta",item:"minecraft:magenta_terracotta",group:0},"minecraft:magenta_stained_glass":{type:"minecraft:magenta_stained_glass",item:"minecraft:magenta_stained_glass",group:0},"minecraft:magenta_concrete_powder":{type:"minecraft:magenta_concrete_powder",item:"minecraft:magenta_concrete_powder",group:0},"minecraft:magenta_concrete":{type:"minecraft:magenta_concrete",item:"minecraft:magenta_concrete",group:0},"minecraft:magenta_carpet":{type:"minecraft:magenta_carpet",item:"minecraft:magenta_carpet",group:0},"minecraft:lodestone":{type:"minecraft:lodestone",item:"minecraft:lodestone",group:0},"minecraft:lime_wool":{type:"minecraft:lime_wool",item:"minecraft:lime_wool",group:0},"minecraft:lime_terracotta":{type:"minecraft:lime_terracotta",item:"minecraft:lime_terracotta",group:0},"minecraft:lime_stained_glass":{type:"minecraft:lime_stained_glass",item:"minecraft:lime_stained_glass",group:0},"minecraft:lime_concrete_powder":{type:"minecraft:lime_concrete_powder",item:"minecraft:lime_concrete_powder",group:0},"minecraft:lime_concrete":{type:"minecraft:lime_concrete",item:"minecraft:lime_concrete",group:0},"minecraft:lime_carpet":{type:"minecraft:lime_carpet",item:"minecraft:lime_carpet",group:0},"minecraft:lily_pad":{type:"minecraft:lily_pad",item:"minecraft:lily_pad",group:0},"minecraft:lily_of_the_valley":{type:"minecraft:lily_of_the_valley",item:"minecraft:lily_of_the_valley",group:0},"minecraft:light_gray_wool":{type:"minecraft:light_gray_wool",item:"minecraft:light_gray_wool",group:0},"minecraft:light_gray_terracotta":{type:"minecraft:light_gray_terracotta",item:"minecraft:light_gray_terracotta",group:0},"minecraft:light_gray_stained_glass":{type:"minecraft:light_gray_stained_glass",item:"minecraft:light_gray_stained_glass",group:0},"minecraft:light_gray_concrete_powder":{type:"minecraft:light_gray_concrete_powder",item:"minecraft:light_gray_concrete_powder",group:0},"minecraft:light_gray_concrete":{type:"minecraft:light_gray_concrete",item:"minecraft:light_gray_concrete",group:0},"minecraft:light_gray_carpet":{type:"minecraft:light_gray_carpet",item:"minecraft:light_gray_carpet",group:0},"minecraft:light_blue_wool":{type:"minecraft:light_blue_wool",item:"minecraft:light_blue_wool",group:0},"minecraft:light_blue_terracotta":{type:"minecraft:light_blue_terracotta",item:"minecraft:light_blue_terracotta",group:0},"minecraft:light_blue_stained_glass":{type:"minecraft:light_blue_stained_glass",item:"minecraft:light_blue_stained_glass",group:0},"minecraft:light_blue_concrete_powder":{type:"minecraft:light_blue_concrete_powder",item:"minecraft:light_blue_concrete_powder",group:0},"minecraft:light_blue_concrete":{type:"minecraft:light_blue_concrete",item:"minecraft:light_blue_concrete",group:0},"minecraft:light_blue_carpet":{type:"minecraft:light_blue_carpet",item:"minecraft:light_blue_carpet",group:0},"minecraft:lapis_ore":{type:"minecraft:lapis_ore",item:"minecraft:lapis_ore",group:0},"minecraft:lapis_block":{type:"minecraft:lapis_block",item:"minecraft:lapis_block",group:0},"minecraft:jungle_planks":{type:"minecraft:jungle_planks",item:"minecraft:jungle_planks",group:0},"minecraft:iron_ore":{type:"minecraft:iron_ore",item:"minecraft:iron_ore",group:0},"minecraft:iron_block":{type:"minecraft:iron_block",item:"minecraft:iron_block",group:0},"minecraft:infested_stone_bricks":{type:"minecraft:infested_stone_bricks",item:"minecraft:infested_stone_bricks",group:0},"minecraft:infested_stone":{type:"minecraft:infested_stone",item:"minecraft:infested_stone",group:0},"minecraft:infested_mossy_stone_bricks":{type:"minecraft:infested_mossy_stone_bricks",item:"minecraft:infested_mossy_stone_bricks",group:0},"minecraft:infested_cracked_stone_bricks":{type:"minecraft:infested_cracked_stone_bricks",item:"minecraft:infested_cracked_stone_bricks",group:0},"minecraft:infested_cobblestone":{type:"minecraft:infested_cobblestone",item:"minecraft:infested_cobblestone",group:0},"minecraft:infested_chiseled_stone_bricks":{type:"minecraft:infested_chiseled_stone_bricks",item:"minecraft:infested_chiseled_stone_bricks",group:0},"minecraft:ice":{type:"minecraft:ice",item:"minecraft:ice",group:0},"minecraft:horn_coral_block":{type:"minecraft:horn_coral_block",item:"minecraft:horn_coral_block",group:0},"minecraft:honeycomb_block":{type:"minecraft:honeycomb_block",item:"minecraft:honeycomb_block",group:0},"minecraft:honey_block":{type:"minecraft:honey_block",item:"minecraft:honey_block",group:0},"minecraft:green_wool":{type:"minecraft:green_wool",item:"minecraft:green_wool",group:0},"minecraft:green_terracotta":{type:"minecraft:green_terracotta",item:"minecraft:green_terracotta",group:0},"minecraft:green_stained_glass":{type:"minecraft:green_stained_glass",item:"minecraft:green_stained_glass",group:0},"minecraft:green_concrete_powder":{type:"minecraft:green_concrete_powder",item:"minecraft:green_concrete_powder",group:0},"minecraft:green_concrete":{type:"minecraft:green_concrete",item:"minecraft:green_concrete",group:0},"minecraft:green_carpet":{type:"minecraft:green_carpet",item:"minecraft:green_carpet",group:0},"minecraft:gray_wool":{type:"minecraft:gray_wool",item:"minecraft:gray_wool",group:0},"minecraft:gray_terracotta":{type:"minecraft:gray_terracotta",item:"minecraft:gray_terracotta",group:0},"minecraft:gray_stained_glass":{type:"minecraft:gray_stained_glass",item:"minecraft:gray_stained_glass",group:0},"minecraft:gray_concrete_powder":{type:"minecraft:gray_concrete_powder",item:"minecraft:gray_concrete_powder",group:0},"minecraft:gray_concrete":{type:"minecraft:gray_concrete",item:"minecraft:gray_concrete",group:0},"minecraft:gray_carpet":{type:"minecraft:gray_carpet",item:"minecraft:gray_carpet",group:0},"minecraft:gravel":{type:"minecraft:gravel",item:"minecraft:gravel",group:0},"minecraft:granite":{type:"minecraft:granite",item:"minecraft:granite",group:0},"minecraft:gold_ore":{type:"minecraft:gold_ore",item:"minecraft:gold_ore",group:0},"minecraft:gold_block":{type:"minecraft:gold_block",item:"minecraft:gold_block",group:0},"minecraft:glowstone":{type:"minecraft:glowstone",item:"minecraft:glowstone",group:0},"minecraft:glass":{type:"minecraft:glass",item:"minecraft:glass",group:0},"minecraft:gilded_blackstone":{type:"minecraft:gilded_blackstone",item:"minecraft:gilded_blackstone",group:0},"minecraft:frogspawn":{type:"minecraft:frogspawn",item:"minecraft:frogspawn",group:0},"minecraft:flowering_azalea":{type:"minecraft:flowering_azalea",item:"minecraft:flowering_azalea",group:0},"minecraft:flower_pot":{type:"minecraft:flower_pot",item:"minecraft:flower_pot",group:0},"minecraft:fletching_table":{type:"minecraft:fletching_table",item:"minecraft:fletching_table",group:0},"minecraft:fire_coral_block":{type:"minecraft:fire_coral_block",item:"minecraft:fire_coral_block",group:0},"minecraft:fern":{type:"minecraft:fern",item:"minecraft:fern",group:0},"minecraft:exposed_cut_copper":{type:"minecraft:exposed_cut_copper",item:"minecraft:exposed_cut_copper",group:0},"minecraft:exposed_copper":{type:"minecraft:exposed_copper",item:"minecraft:exposed_copper",group:0},"minecraft:exposed_chiseled_copper":{type:"minecraft:exposed_chiseled_copper",item:"minecraft:exposed_chiseled_copper",group:0},"minecraft:end_stone_bricks":{type:"minecraft:end_stone_bricks",item:"minecraft:end_stone_bricks",group:0},"minecraft:end_stone":{type:"minecraft:end_stone",item:"minecraft:end_stone",group:0},"minecraft:enchanting_table":{type:"minecraft:enchanting_table",item:"minecraft:enchanting_table",group:0},"minecraft:emerald_ore":{type:"minecraft:emerald_ore",item:"minecraft:emerald_ore",group:0},"minecraft:emerald_block":{type:"minecraft:emerald_block",item:"minecraft:emerald_block",group:0},"minecraft:dripstone_block":{type:"minecraft:dripstone_block",item:"minecraft:dripstone_block",group:0},"minecraft:dried_kelp_block":{type:"minecraft:dried_kelp_block",item:"minecraft:dried_kelp_block",group:0},"minecraft:dragon_egg":{type:"minecraft:dragon_egg",item:"minecraft:dragon_egg",group:0},"minecraft:dirt_path":{type:"minecraft:dirt_path",item:"minecraft:dirt_path",group:0},"minecraft:dirt":{type:"minecraft:dirt",item:"minecraft:dirt",group:0},"minecraft:diorite":{type:"minecraft:diorite",item:"minecraft:diorite",group:0},"minecraft:diamond_ore":{type:"minecraft:diamond_ore",item:"minecraft:diamond_ore",group:0},"minecraft:diamond_block":{type:"minecraft:diamond_block",item:"minecraft:diamond_block",group:0},"minecraft:deepslate_tiles":{type:"minecraft:deepslate_tiles",item:"minecraft:deepslate_tiles",group:0},"minecraft:deepslate_lapis_ore":{type:"minecraft:deepslate_lapis_ore",item:"minecraft:deepslate_lapis_ore",group:0},"minecraft:deepslate_iron_ore":{type:"minecraft:deepslate_iron_ore",item:"minecraft:deepslate_iron_ore",group:0},"minecraft:deepslate_gold_ore":{type:"minecraft:deepslate_gold_ore",item:"minecraft:deepslate_gold_ore",group:0},"minecraft:deepslate_emerald_ore":{type:"minecraft:deepslate_emerald_ore",item:"minecraft:deepslate_emerald_ore",group:0},"minecraft:deepslate_diamond_ore":{type:"minecraft:deepslate_diamond_ore",item:"minecraft:deepslate_diamond_ore",group:0},"minecraft:deepslate_copper_ore":{type:"minecraft:deepslate_copper_ore",item:"minecraft:deepslate_copper_ore",group:0},"minecraft:deepslate_coal_ore":{type:"minecraft:deepslate_coal_ore",item:"minecraft:deepslate_coal_ore",group:0},"minecraft:deepslate_bricks":{type:"minecraft:deepslate_bricks",item:"minecraft:deepslate_bricks",group:0},"minecraft:dead_tube_coral_block":{type:"minecraft:dead_tube_coral_block",item:"minecraft:dead_tube_coral_block",group:0},"minecraft:dead_horn_coral_block":{type:"minecraft:dead_horn_coral_block",item:"minecraft:dead_horn_coral_block",group:0},"minecraft:dead_fire_coral_block":{type:"minecraft:dead_fire_coral_block",item:"minecraft:dead_fire_coral_block",group:0},"minecraft:dead_bush":{type:"minecraft:dead_bush",item:"minecraft:dead_bush",group:0},"minecraft:dead_bubble_coral_block":{type:"minecraft:dead_bubble_coral_block",item:"minecraft:dead_bubble_coral_block",group:0},"minecraft:dead_brain_coral_block":{type:"minecraft:dead_brain_coral_block",item:"minecraft:dead_brain_coral_block",group:0},"minecraft:dark_prismarine":{type:"minecraft:dark_prismarine",item:"minecraft:dark_prismarine",group:0},"minecraft:dark_oak_planks":{type:"minecraft:dark_oak_planks",item:"minecraft:dark_oak_planks",group:0},"minecraft:dandelion":{type:"minecraft:dandelion",item:"minecraft:dandelion",group:0},"minecraft:cyan_wool":{type:"minecraft:cyan_wool",item:"minecraft:cyan_wool",group:0},"minecraft:cyan_terracotta":{type:"minecraft:cyan_terracotta",item:"minecraft:cyan_terracotta",group:0},"minecraft:cyan_stained_glass":{type:"minecraft:cyan_stained_glass",item:"minecraft:cyan_stained_glass",group:0},"minecraft:cyan_concrete_powder":{type:"minecraft:cyan_concrete_powder",item:"minecraft:cyan_concrete_powder",group:0},"minecraft:cyan_concrete":{type:"minecraft:cyan_concrete",item:"minecraft:cyan_concrete",group:0},"minecraft:cyan_carpet":{type:"minecraft:cyan_carpet",item:"minecraft:cyan_carpet",group:0},"minecraft:cut_sandstone":{type:"minecraft:cut_sandstone",item:"minecraft:cut_sandstone",group:0},"minecraft:cut_red_sandstone":{type:"minecraft:cut_red_sandstone",item:"minecraft:cut_red_sandstone",group:0},"minecraft:cut_copper":{type:"minecraft:cut_copper",item:"minecraft:cut_copper",group:0},"minecraft:crying_obsidian":{type:"minecraft:crying_obsidian",item:"minecraft:crying_obsidian",group:0},"minecraft:crimson_roots":{type:"minecraft:crimson_roots",item:"minecraft:crimson_roots",group:0},"minecraft:crimson_planks":{type:"minecraft:crimson_planks",item:"minecraft:crimson_planks",group:0},"minecraft:crimson_nylium":{type:"minecraft:crimson_nylium",item:"minecraft:crimson_nylium",group:0},"minecraft:crimson_fungus":{type:"minecraft:crimson_fungus",item:"minecraft:crimson_fungus",group:0},"minecraft:crafting_table":{type:"minecraft:crafting_table",item:"minecraft:crafting_table",group:0},"minecraft:cracked_stone_bricks":{type:"minecraft:cracked_stone_bricks",item:"minecraft:cracked_stone_bricks",group:0},"minecraft:cracked_polished_blackstone_bricks":{type:"minecraft:cracked_polished_blackstone_bricks",item:"minecraft:cracked_polished_blackstone_bricks",group:0},"minecraft:cracked_nether_bricks":{type:"minecraft:cracked_nether_bricks",item:"minecraft:cracked_nether_bricks",group:0},"minecraft:cracked_deepslate_tiles":{type:"minecraft:cracked_deepslate_tiles",item:"minecraft:cracked_deepslate_tiles",group:0},"minecraft:cracked_deepslate_bricks":{type:"minecraft:cracked_deepslate_bricks",item:"minecraft:cracked_deepslate_bricks",group:0},"minecraft:cornflower":{type:"minecraft:cornflower",item:"minecraft:cornflower",group:0},"minecraft:copper_ore":{type:"minecraft:copper_ore",item:"minecraft:copper_ore",group:0},"minecraft:copper_block":{type:"minecraft:copper_block",item:"minecraft:copper_block",group:0},"minecraft:cobweb":{type:"minecraft:cobweb",item:"minecraft:cobweb",group:0},"minecraft:cobblestone":{type:"minecraft:cobblestone",item:"minecraft:cobblestone",group:0},"minecraft:cobbled_deepslate":{type:"minecraft:cobbled_deepslate",item:"minecraft:cobbled_deepslate",group:0},"minecraft:coarse_dirt":{type:"minecraft:coarse_dirt",item:"minecraft:coarse_dirt",group:0},"minecraft:coal_ore":{type:"minecraft:coal_ore",item:"minecraft:coal_ore",group:0},"minecraft:coal_block":{type:"minecraft:coal_block",item:"minecraft:coal_block",group:0},"minecraft:clay":{type:"minecraft:clay",item:"minecraft:clay",group:0},"minecraft:chiseled_tuff_bricks":{type:"minecraft:chiseled_tuff_bricks",item:"minecraft:chiseled_tuff_bricks",group:0},"minecraft:chiseled_tuff":{type:"minecraft:chiseled_tuff",item:"minecraft:chiseled_tuff",group:0},"minecraft:chiseled_stone_bricks":{type:"minecraft:chiseled_stone_bricks",item:"minecraft:chiseled_stone_bricks",group:0},"minecraft:chiseled_sandstone":{type:"minecraft:chiseled_sandstone",item:"minecraft:chiseled_sandstone",group:0},"minecraft:chiseled_red_sandstone":{type:"minecraft:chiseled_red_sandstone",item:"minecraft:chiseled_red_sandstone",group:0},"minecraft:chiseled_quartz_block":{type:"minecraft:chiseled_quartz_block",item:"minecraft:chiseled_quartz_block",group:0},"minecraft:chiseled_polished_blackstone":{type:"minecraft:chiseled_polished_blackstone",item:"minecraft:chiseled_polished_blackstone",group:0},"minecraft:chiseled_nether_bricks":{type:"minecraft:chiseled_nether_bricks",item:"minecraft:chiseled_nether_bricks",group:0},"minecraft:chiseled_deepslate":{type:"minecraft:chiseled_deepslate",item:"minecraft:chiseled_deepslate",group:0},"minecraft:chiseled_copper":{type:"minecraft:chiseled_copper",item:"minecraft:chiseled_copper",group:0},"minecraft:cherry_planks":{type:"minecraft:cherry_planks",item:"minecraft:cherry_planks",group:0},"minecraft:cartography_table":{type:"minecraft:cartography_table",item:"minecraft:cartography_table",group:0},"minecraft:calcite":{type:"minecraft:calcite",item:"minecraft:calcite",group:0},"minecraft:budding_amethyst":{type:"minecraft:budding_amethyst",item:"minecraft:budding_amethyst",group:0},"minecraft:bubble_coral_block":{type:"minecraft:bubble_coral_block",item:"minecraft:bubble_coral_block",group:0},"minecraft:brown_wool":{type:"minecraft:brown_wool",item:"minecraft:brown_wool",group:0},"minecraft:brown_terracotta":{type:"minecraft:brown_terracotta",item:"minecraft:brown_terracotta",group:0},"minecraft:brown_stained_glass":{type:"minecraft:brown_stained_glass",item:"minecraft:brown_stained_glass",group:0},"minecraft:brown_mushroom":{type:"minecraft:brown_mushroom",item:"minecraft:brown_mushroom",group:0},"minecraft:brown_concrete_powder":{type:"minecraft:brown_concrete_powder",item:"minecraft:brown_concrete_powder",group:0},"minecraft:brown_concrete":{type:"minecraft:brown_concrete",item:"minecraft:brown_concrete",group:0},"minecraft:brown_carpet":{type:"minecraft:brown_carpet",item:"minecraft:brown_carpet",group:0},"minecraft:bricks":{type:"minecraft:bricks",item:"minecraft:bricks",group:0},"minecraft:brain_coral_block":{type:"minecraft:brain_coral_block",item:"minecraft:brain_coral_block",group:0},"minecraft:bookshelf":{type:"minecraft:bookshelf",item:"minecraft:bookshelf",group:0},"minecraft:blue_wool":{type:"minecraft:blue_wool",item:"minecraft:blue_wool",group:0},"minecraft:blue_terracotta":{type:"minecraft:blue_terracotta",item:"minecraft:blue_terracotta",group:0},"minecraft:blue_stained_glass":{type:"minecraft:blue_stained_glass",item:"minecraft:blue_stained_glass",group:0},"minecraft:blue_orchid":{type:"minecraft:blue_orchid",item:"minecraft:blue_orchid",group:0},"minecraft:blue_ice":{type:"minecraft:blue_ice",item:"minecraft:blue_ice",group:0},"minecraft:blue_concrete_powder":{type:"minecraft:blue_concrete_powder",item:"minecraft:blue_concrete_powder",group:0},"minecraft:blue_concrete":{type:"minecraft:blue_concrete",item:"minecraft:blue_concrete",group:0},"minecraft:blue_carpet":{type:"minecraft:blue_carpet",item:"minecraft:blue_carpet",group:0},"minecraft:blackstone":{type:"minecraft:blackstone",item:"minecraft:blackstone",group:0},"minecraft:black_wool":{type:"minecraft:black_wool",item:"minecraft:black_wool",group:0},"minecraft:black_terracotta":{type:"minecraft:black_terracotta",item:"minecraft:black_terracotta",group:0},"minecraft:black_stained_glass":{type:"minecraft:black_stained_glass",item:"minecraft:black_stained_glass",group:0},"minecraft:black_concrete_powder":{type:"minecraft:black_concrete_powder",item:"minecraft:black_concrete_powder",group:0},"minecraft:black_concrete":{type:"minecraft:black_concrete",item:"minecraft:black_concrete",group:0},"minecraft:black_carpet":{type:"minecraft:black_carpet",item:"minecraft:black_carpet",group:0},"minecraft:birch_planks":{type:"minecraft:birch_planks",item:"minecraft:birch_planks",group:0},"minecraft:bedrock":{type:"minecraft:bedrock",item:"minecraft:bedrock",group:0},"minecraft:beacon":{type:"minecraft:beacon",item:"minecraft:beacon",group:0},"minecraft:bamboo_planks":{type:"minecraft:bamboo_planks",item:"minecraft:bamboo_planks",group:0},"minecraft:bamboo_mosaic":{type:"minecraft:bamboo_mosaic",item:"minecraft:bamboo_mosaic",group:0},"minecraft:azure_bluet":{type:"minecraft:azure_bluet",item:"minecraft:azure_bluet",group:0},"minecraft:azalea":{type:"minecraft:azalea",item:"minecraft:azalea",group:0},"minecraft:andesite":{type:"minecraft:andesite",item:"minecraft:andesite",group:0},"minecraft:ancient_debris":{type:"minecraft:ancient_debris",item:"minecraft:ancient_debris",group:0},"minecraft:amethyst_block":{type:"minecraft:amethyst_block",item:"minecraft:amethyst_block",group:0},"minecraft:allium":{type:"minecraft:allium",item:"minecraft:allium",group:0},"minecraft:air":{type:"minecraft:air",item:"minecraft:air",group:0},"minecraft:acacia_planks":{type:"minecraft:acacia_planks",item:"minecraft:acacia_planks",group:0}}
diff --git a/datapacks/Bookshelf/data/bs.block/function/load/types_table.mcfunction b/datapacks/Bookshelf/data/bs.block/function/load/types_table.mcfunction
deleted file mode 100644
index 774b774970..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/load/types_table.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# This file was automatically generated, do not edit it
-data modify storage bs:const block.types set value {"minecraft:acacia_planks":{type:"minecraft:acacia_planks",item:"minecraft:acacia_planks",group:0},"minecraft:air":{type:"minecraft:air",item:"minecraft:air",group:0},"minecraft:allium":{type:"minecraft:allium",item:"minecraft:allium",group:0},"minecraft:amethyst_block":{type:"minecraft:amethyst_block",item:"minecraft:amethyst_block",group:0},"minecraft:ancient_debris":{type:"minecraft:ancient_debris",item:"minecraft:ancient_debris",group:0},"minecraft:andesite":{type:"minecraft:andesite",item:"minecraft:andesite",group:0},"minecraft:azalea":{type:"minecraft:azalea",item:"minecraft:azalea",group:0},"minecraft:azure_bluet":{type:"minecraft:azure_bluet",item:"minecraft:azure_bluet",group:0},"minecraft:bamboo_mosaic":{type:"minecraft:bamboo_mosaic",item:"minecraft:bamboo_mosaic",group:0},"minecraft:bamboo_planks":{type:"minecraft:bamboo_planks",item:"minecraft:bamboo_planks",group:0},"minecraft:bamboo_sapling":{type:"minecraft:bamboo_sapling",group:0},"minecraft:beacon":{type:"minecraft:beacon",item:"minecraft:beacon",group:0},"minecraft:bedrock":{type:"minecraft:bedrock",item:"minecraft:bedrock",group:0},"minecraft:birch_planks":{type:"minecraft:birch_planks",item:"minecraft:birch_planks",group:0},"minecraft:black_carpet":{type:"minecraft:black_carpet",item:"minecraft:black_carpet",group:0},"minecraft:black_concrete":{type:"minecraft:black_concrete",item:"minecraft:black_concrete",group:0},"minecraft:black_concrete_powder":{type:"minecraft:black_concrete_powder",item:"minecraft:black_concrete_powder",group:0},"minecraft:black_stained_glass":{type:"minecraft:black_stained_glass",item:"minecraft:black_stained_glass",group:0},"minecraft:black_terracotta":{type:"minecraft:black_terracotta",item:"minecraft:black_terracotta",group:0},"minecraft:black_wool":{type:"minecraft:black_wool",item:"minecraft:black_wool",group:0},"minecraft:blackstone":{type:"minecraft:blackstone",item:"minecraft:blackstone",group:0},"minecraft:blue_carpet":{type:"minecraft:blue_carpet",item:"minecraft:blue_carpet",group:0},"minecraft:blue_concrete":{type:"minecraft:blue_concrete",item:"minecraft:blue_concrete",group:0},"minecraft:blue_concrete_powder":{type:"minecraft:blue_concrete_powder",item:"minecraft:blue_concrete_powder",group:0},"minecraft:blue_ice":{type:"minecraft:blue_ice",item:"minecraft:blue_ice",group:0},"minecraft:blue_orchid":{type:"minecraft:blue_orchid",item:"minecraft:blue_orchid",group:0},"minecraft:blue_stained_glass":{type:"minecraft:blue_stained_glass",item:"minecraft:blue_stained_glass",group:0},"minecraft:blue_terracotta":{type:"minecraft:blue_terracotta",item:"minecraft:blue_terracotta",group:0},"minecraft:blue_wool":{type:"minecraft:blue_wool",item:"minecraft:blue_wool",group:0},"minecraft:bookshelf":{type:"minecraft:bookshelf",item:"minecraft:bookshelf",group:0},"minecraft:brain_coral_block":{type:"minecraft:brain_coral_block",item:"minecraft:brain_coral_block",group:0},"minecraft:bricks":{type:"minecraft:bricks",item:"minecraft:bricks",group:0},"minecraft:brown_carpet":{type:"minecraft:brown_carpet",item:"minecraft:brown_carpet",group:0},"minecraft:brown_concrete":{type:"minecraft:brown_concrete",item:"minecraft:brown_concrete",group:0},"minecraft:brown_concrete_powder":{type:"minecraft:brown_concrete_powder",item:"minecraft:brown_concrete_powder",group:0},"minecraft:brown_mushroom":{type:"minecraft:brown_mushroom",item:"minecraft:brown_mushroom",group:0},"minecraft:brown_stained_glass":{type:"minecraft:brown_stained_glass",item:"minecraft:brown_stained_glass",group:0},"minecraft:brown_terracotta":{type:"minecraft:brown_terracotta",item:"minecraft:brown_terracotta",group:0},"minecraft:brown_wool":{type:"minecraft:brown_wool",item:"minecraft:brown_wool",group:0},"minecraft:bubble_coral_block":{type:"minecraft:bubble_coral_block",item:"minecraft:bubble_coral_block",group:0},"minecraft:budding_amethyst":{type:"minecraft:budding_amethyst",item:"minecraft:budding_amethyst",group:0},"minecraft:calcite":{type:"minecraft:calcite",item:"minecraft:calcite",group:0},"minecraft:cartography_table":{type:"minecraft:cartography_table",item:"minecraft:cartography_table",group:0},"minecraft:cauldron":{type:"minecraft:cauldron",item:"minecraft:cauldron",group:0},"minecraft:cave_air":{type:"minecraft:cave_air",group:0},"minecraft:cherry_planks":{type:"minecraft:cherry_planks",item:"minecraft:cherry_planks",group:0},"minecraft:chiseled_copper":{type:"minecraft:chiseled_copper",item:"minecraft:chiseled_copper",group:0},"minecraft:chiseled_deepslate":{type:"minecraft:chiseled_deepslate",item:"minecraft:chiseled_deepslate",group:0},"minecraft:chiseled_nether_bricks":{type:"minecraft:chiseled_nether_bricks",item:"minecraft:chiseled_nether_bricks",group:0},"minecraft:chiseled_polished_blackstone":{type:"minecraft:chiseled_polished_blackstone",item:"minecraft:chiseled_polished_blackstone",group:0},"minecraft:chiseled_quartz_block":{type:"minecraft:chiseled_quartz_block",item:"minecraft:chiseled_quartz_block",group:0},"minecraft:chiseled_red_sandstone":{type:"minecraft:chiseled_red_sandstone",item:"minecraft:chiseled_red_sandstone",group:0},"minecraft:chiseled_sandstone":{type:"minecraft:chiseled_sandstone",item:"minecraft:chiseled_sandstone",group:0},"minecraft:chiseled_stone_bricks":{type:"minecraft:chiseled_stone_bricks",item:"minecraft:chiseled_stone_bricks",group:0},"minecraft:chiseled_tuff":{type:"minecraft:chiseled_tuff",item:"minecraft:chiseled_tuff",group:0},"minecraft:chiseled_tuff_bricks":{type:"minecraft:chiseled_tuff_bricks",item:"minecraft:chiseled_tuff_bricks",group:0},"minecraft:clay":{type:"minecraft:clay",item:"minecraft:clay",group:0},"minecraft:coal_block":{type:"minecraft:coal_block",item:"minecraft:coal_block",group:0},"minecraft:coal_ore":{type:"minecraft:coal_ore",item:"minecraft:coal_ore",group:0},"minecraft:coarse_dirt":{type:"minecraft:coarse_dirt",item:"minecraft:coarse_dirt",group:0},"minecraft:cobbled_deepslate":{type:"minecraft:cobbled_deepslate",item:"minecraft:cobbled_deepslate",group:0},"minecraft:cobblestone":{type:"minecraft:cobblestone",item:"minecraft:cobblestone",group:0},"minecraft:cobweb":{type:"minecraft:cobweb",item:"minecraft:cobweb",group:0},"minecraft:copper_block":{type:"minecraft:copper_block",item:"minecraft:copper_block",group:0},"minecraft:copper_ore":{type:"minecraft:copper_ore",item:"minecraft:copper_ore",group:0},"minecraft:cornflower":{type:"minecraft:cornflower",item:"minecraft:cornflower",group:0},"minecraft:cracked_deepslate_bricks":{type:"minecraft:cracked_deepslate_bricks",item:"minecraft:cracked_deepslate_bricks",group:0},"minecraft:cracked_deepslate_tiles":{type:"minecraft:cracked_deepslate_tiles",item:"minecraft:cracked_deepslate_tiles",group:0},"minecraft:cracked_nether_bricks":{type:"minecraft:cracked_nether_bricks",item:"minecraft:cracked_nether_bricks",group:0},"minecraft:cracked_polished_blackstone_bricks":{type:"minecraft:cracked_polished_blackstone_bricks",item:"minecraft:cracked_polished_blackstone_bricks",group:0},"minecraft:cracked_stone_bricks":{type:"minecraft:cracked_stone_bricks",item:"minecraft:cracked_stone_bricks",group:0},"minecraft:crafting_table":{type:"minecraft:crafting_table",item:"minecraft:crafting_table",group:0},"minecraft:crimson_fungus":{type:"minecraft:crimson_fungus",item:"minecraft:crimson_fungus",group:0},"minecraft:crimson_nylium":{type:"minecraft:crimson_nylium",item:"minecraft:crimson_nylium",group:0},"minecraft:crimson_planks":{type:"minecraft:crimson_planks",item:"minecraft:crimson_planks",group:0},"minecraft:crimson_roots":{type:"minecraft:crimson_roots",item:"minecraft:crimson_roots",group:0},"minecraft:crying_obsidian":{type:"minecraft:crying_obsidian",item:"minecraft:crying_obsidian",group:0},"minecraft:cut_copper":{type:"minecraft:cut_copper",item:"minecraft:cut_copper",group:0},"minecraft:cut_red_sandstone":{type:"minecraft:cut_red_sandstone",item:"minecraft:cut_red_sandstone",group:0},"minecraft:cut_sandstone":{type:"minecraft:cut_sandstone",item:"minecraft:cut_sandstone",group:0},"minecraft:cyan_carpet":{type:"minecraft:cyan_carpet",item:"minecraft:cyan_carpet",group:0},"minecraft:cyan_concrete":{type:"minecraft:cyan_concrete",item:"minecraft:cyan_concrete",group:0},"minecraft:cyan_concrete_powder":{type:"minecraft:cyan_concrete_powder",item:"minecraft:cyan_concrete_powder",group:0},"minecraft:cyan_stained_glass":{type:"minecraft:cyan_stained_glass",item:"minecraft:cyan_stained_glass",group:0},"minecraft:cyan_terracotta":{type:"minecraft:cyan_terracotta",item:"minecraft:cyan_terracotta",group:0},"minecraft:cyan_wool":{type:"minecraft:cyan_wool",item:"minecraft:cyan_wool",group:0},"minecraft:dandelion":{type:"minecraft:dandelion",item:"minecraft:dandelion",group:0},"minecraft:dark_oak_planks":{type:"minecraft:dark_oak_planks",item:"minecraft:dark_oak_planks",group:0},"minecraft:dark_prismarine":{type:"minecraft:dark_prismarine",item:"minecraft:dark_prismarine",group:0},"minecraft:dead_brain_coral_block":{type:"minecraft:dead_brain_coral_block",item:"minecraft:dead_brain_coral_block",group:0},"minecraft:dead_bubble_coral_block":{type:"minecraft:dead_bubble_coral_block",item:"minecraft:dead_bubble_coral_block",group:0},"minecraft:dead_bush":{type:"minecraft:dead_bush",item:"minecraft:dead_bush",group:0},"minecraft:dead_fire_coral_block":{type:"minecraft:dead_fire_coral_block",item:"minecraft:dead_fire_coral_block",group:0},"minecraft:dead_horn_coral_block":{type:"minecraft:dead_horn_coral_block",item:"minecraft:dead_horn_coral_block",group:0},"minecraft:dead_tube_coral_block":{type:"minecraft:dead_tube_coral_block",item:"minecraft:dead_tube_coral_block",group:0},"minecraft:deepslate_bricks":{type:"minecraft:deepslate_bricks",item:"minecraft:deepslate_bricks",group:0},"minecraft:deepslate_coal_ore":{type:"minecraft:deepslate_coal_ore",item:"minecraft:deepslate_coal_ore",group:0},"minecraft:deepslate_copper_ore":{type:"minecraft:deepslate_copper_ore",item:"minecraft:deepslate_copper_ore",group:0},"minecraft:deepslate_diamond_ore":{type:"minecraft:deepslate_diamond_ore",item:"minecraft:deepslate_diamond_ore",group:0},"minecraft:deepslate_emerald_ore":{type:"minecraft:deepslate_emerald_ore",item:"minecraft:deepslate_emerald_ore",group:0},"minecraft:deepslate_gold_ore":{type:"minecraft:deepslate_gold_ore",item:"minecraft:deepslate_gold_ore",group:0},"minecraft:deepslate_iron_ore":{type:"minecraft:deepslate_iron_ore",item:"minecraft:deepslate_iron_ore",group:0},"minecraft:deepslate_lapis_ore":{type:"minecraft:deepslate_lapis_ore",item:"minecraft:deepslate_lapis_ore",group:0},"minecraft:deepslate_tiles":{type:"minecraft:deepslate_tiles",item:"minecraft:deepslate_tiles",group:0},"minecraft:diamond_block":{type:"minecraft:diamond_block",item:"minecraft:diamond_block",group:0},"minecraft:diamond_ore":{type:"minecraft:diamond_ore",item:"minecraft:diamond_ore",group:0},"minecraft:diorite":{type:"minecraft:diorite",item:"minecraft:diorite",group:0},"minecraft:dirt":{type:"minecraft:dirt",item:"minecraft:dirt",group:0},"minecraft:dirt_path":{type:"minecraft:dirt_path",item:"minecraft:dirt_path",group:0},"minecraft:dragon_egg":{type:"minecraft:dragon_egg",item:"minecraft:dragon_egg",group:0},"minecraft:dried_kelp_block":{type:"minecraft:dried_kelp_block",item:"minecraft:dried_kelp_block",group:0},"minecraft:dripstone_block":{type:"minecraft:dripstone_block",item:"minecraft:dripstone_block",group:0},"minecraft:emerald_block":{type:"minecraft:emerald_block",item:"minecraft:emerald_block",group:0},"minecraft:emerald_ore":{type:"minecraft:emerald_ore",item:"minecraft:emerald_ore",group:0},"minecraft:enchanting_table":{type:"minecraft:enchanting_table",item:"minecraft:enchanting_table",group:0},"minecraft:end_gateway":{type:"minecraft:end_gateway",group:0},"minecraft:end_portal":{type:"minecraft:end_portal",group:0},"minecraft:end_stone":{type:"minecraft:end_stone",item:"minecraft:end_stone",group:0},"minecraft:end_stone_bricks":{type:"minecraft:end_stone_bricks",item:"minecraft:end_stone_bricks",group:0},"minecraft:exposed_chiseled_copper":{type:"minecraft:exposed_chiseled_copper",item:"minecraft:exposed_chiseled_copper",group:0},"minecraft:exposed_copper":{type:"minecraft:exposed_copper",item:"minecraft:exposed_copper",group:0},"minecraft:exposed_cut_copper":{type:"minecraft:exposed_cut_copper",item:"minecraft:exposed_cut_copper",group:0},"minecraft:fern":{type:"minecraft:fern",item:"minecraft:fern",group:0},"minecraft:fire_coral_block":{type:"minecraft:fire_coral_block",item:"minecraft:fire_coral_block",group:0},"minecraft:fletching_table":{type:"minecraft:fletching_table",item:"minecraft:fletching_table",group:0},"minecraft:flower_pot":{type:"minecraft:flower_pot",item:"minecraft:flower_pot",group:0},"minecraft:flowering_azalea":{type:"minecraft:flowering_azalea",item:"minecraft:flowering_azalea",group:0},"minecraft:frogspawn":{type:"minecraft:frogspawn",item:"minecraft:frogspawn",group:0},"minecraft:gilded_blackstone":{type:"minecraft:gilded_blackstone",item:"minecraft:gilded_blackstone",group:0},"minecraft:glass":{type:"minecraft:glass",item:"minecraft:glass",group:0},"minecraft:glowstone":{type:"minecraft:glowstone",item:"minecraft:glowstone",group:0},"minecraft:gold_block":{type:"minecraft:gold_block",item:"minecraft:gold_block",group:0},"minecraft:gold_ore":{type:"minecraft:gold_ore",item:"minecraft:gold_ore",group:0},"minecraft:granite":{type:"minecraft:granite",item:"minecraft:granite",group:0},"minecraft:gravel":{type:"minecraft:gravel",item:"minecraft:gravel",group:0},"minecraft:gray_carpet":{type:"minecraft:gray_carpet",item:"minecraft:gray_carpet",group:0},"minecraft:gray_concrete":{type:"minecraft:gray_concrete",item:"minecraft:gray_concrete",group:0},"minecraft:gray_concrete_powder":{type:"minecraft:gray_concrete_powder",item:"minecraft:gray_concrete_powder",group:0},"minecraft:gray_stained_glass":{type:"minecraft:gray_stained_glass",item:"minecraft:gray_stained_glass",group:0},"minecraft:gray_terracotta":{type:"minecraft:gray_terracotta",item:"minecraft:gray_terracotta",group:0},"minecraft:gray_wool":{type:"minecraft:gray_wool",item:"minecraft:gray_wool",group:0},"minecraft:green_carpet":{type:"minecraft:green_carpet",item:"minecraft:green_carpet",group:0},"minecraft:green_concrete":{type:"minecraft:green_concrete",item:"minecraft:green_concrete",group:0},"minecraft:green_concrete_powder":{type:"minecraft:green_concrete_powder",item:"minecraft:green_concrete_powder",group:0},"minecraft:green_stained_glass":{type:"minecraft:green_stained_glass",item:"minecraft:green_stained_glass",group:0},"minecraft:green_terracotta":{type:"minecraft:green_terracotta",item:"minecraft:green_terracotta",group:0},"minecraft:green_wool":{type:"minecraft:green_wool",item:"minecraft:green_wool",group:0},"minecraft:honey_block":{type:"minecraft:honey_block",item:"minecraft:honey_block",group:0},"minecraft:honeycomb_block":{type:"minecraft:honeycomb_block",item:"minecraft:honeycomb_block",group:0},"minecraft:horn_coral_block":{type:"minecraft:horn_coral_block",item:"minecraft:horn_coral_block",group:0},"minecraft:ice":{type:"minecraft:ice",item:"minecraft:ice",group:0},"minecraft:infested_chiseled_stone_bricks":{type:"minecraft:infested_chiseled_stone_bricks",item:"minecraft:infested_chiseled_stone_bricks",group:0},"minecraft:infested_cobblestone":{type:"minecraft:infested_cobblestone",item:"minecraft:infested_cobblestone",group:0},"minecraft:infested_cracked_stone_bricks":{type:"minecraft:infested_cracked_stone_bricks",item:"minecraft:infested_cracked_stone_bricks",group:0},"minecraft:infested_mossy_stone_bricks":{type:"minecraft:infested_mossy_stone_bricks",item:"minecraft:infested_mossy_stone_bricks",group:0},"minecraft:infested_stone":{type:"minecraft:infested_stone",item:"minecraft:infested_stone",group:0},"minecraft:infested_stone_bricks":{type:"minecraft:infested_stone_bricks",item:"minecraft:infested_stone_bricks",group:0},"minecraft:iron_block":{type:"minecraft:iron_block",item:"minecraft:iron_block",group:0},"minecraft:iron_ore":{type:"minecraft:iron_ore",item:"minecraft:iron_ore",group:0},"minecraft:jungle_planks":{type:"minecraft:jungle_planks",item:"minecraft:jungle_planks",group:0},"minecraft:kelp_plant":{type:"minecraft:kelp_plant",group:0},"minecraft:lapis_block":{type:"minecraft:lapis_block",item:"minecraft:lapis_block",group:0},"minecraft:lapis_ore":{type:"minecraft:lapis_ore",item:"minecraft:lapis_ore",group:0},"minecraft:lava_cauldron":{type:"minecraft:lava_cauldron",item:"minecraft:cauldron",group:0},"minecraft:light_blue_carpet":{type:"minecraft:light_blue_carpet",item:"minecraft:light_blue_carpet",group:0},"minecraft:light_blue_concrete":{type:"minecraft:light_blue_concrete",item:"minecraft:light_blue_concrete",group:0},"minecraft:light_blue_concrete_powder":{type:"minecraft:light_blue_concrete_powder",item:"minecraft:light_blue_concrete_powder",group:0},"minecraft:light_blue_stained_glass":{type:"minecraft:light_blue_stained_glass",item:"minecraft:light_blue_stained_glass",group:0},"minecraft:light_blue_terracotta":{type:"minecraft:light_blue_terracotta",item:"minecraft:light_blue_terracotta",group:0},"minecraft:light_blue_wool":{type:"minecraft:light_blue_wool",item:"minecraft:light_blue_wool",group:0},"minecraft:light_gray_carpet":{type:"minecraft:light_gray_carpet",item:"minecraft:light_gray_carpet",group:0},"minecraft:light_gray_concrete":{type:"minecraft:light_gray_concrete",item:"minecraft:light_gray_concrete",group:0},"minecraft:light_gray_concrete_powder":{type:"minecraft:light_gray_concrete_powder",item:"minecraft:light_gray_concrete_powder",group:0},"minecraft:light_gray_stained_glass":{type:"minecraft:light_gray_stained_glass",item:"minecraft:light_gray_stained_glass",group:0},"minecraft:light_gray_terracotta":{type:"minecraft:light_gray_terracotta",item:"minecraft:light_gray_terracotta",group:0},"minecraft:light_gray_wool":{type:"minecraft:light_gray_wool",item:"minecraft:light_gray_wool",group:0},"minecraft:lily_of_the_valley":{type:"minecraft:lily_of_the_valley",item:"minecraft:lily_of_the_valley",group:0},"minecraft:lily_pad":{type:"minecraft:lily_pad",item:"minecraft:lily_pad",group:0},"minecraft:lime_carpet":{type:"minecraft:lime_carpet",item:"minecraft:lime_carpet",group:0},"minecraft:lime_concrete":{type:"minecraft:lime_concrete",item:"minecraft:lime_concrete",group:0},"minecraft:lime_concrete_powder":{type:"minecraft:lime_concrete_powder",item:"minecraft:lime_concrete_powder",group:0},"minecraft:lime_stained_glass":{type:"minecraft:lime_stained_glass",item:"minecraft:lime_stained_glass",group:0},"minecraft:lime_terracotta":{type:"minecraft:lime_terracotta",item:"minecraft:lime_terracotta",group:0},"minecraft:lime_wool":{type:"minecraft:lime_wool",item:"minecraft:lime_wool",group:0},"minecraft:lodestone":{type:"minecraft:lodestone",item:"minecraft:lodestone",group:0},"minecraft:magenta_carpet":{type:"minecraft:magenta_carpet",item:"minecraft:magenta_carpet",group:0},"minecraft:magenta_concrete":{type:"minecraft:magenta_concrete",item:"minecraft:magenta_concrete",group:0},"minecraft:magenta_concrete_powder":{type:"minecraft:magenta_concrete_powder",item:"minecraft:magenta_concrete_powder",group:0},"minecraft:magenta_stained_glass":{type:"minecraft:magenta_stained_glass",item:"minecraft:magenta_stained_glass",group:0},"minecraft:magenta_terracotta":{type:"minecraft:magenta_terracotta",item:"minecraft:magenta_terracotta",group:0},"minecraft:magenta_wool":{type:"minecraft:magenta_wool",item:"minecraft:magenta_wool",group:0},"minecraft:magma_block":{type:"minecraft:magma_block",item:"minecraft:magma_block",group:0},"minecraft:mangrove_planks":{type:"minecraft:mangrove_planks",item:"minecraft:mangrove_planks",group:0},"minecraft:melon":{type:"minecraft:melon",item:"minecraft:melon",group:0},"minecraft:moss_block":{type:"minecraft:moss_block",item:"minecraft:moss_block",group:0},"minecraft:moss_carpet":{type:"minecraft:moss_carpet",item:"minecraft:moss_carpet",group:0},"minecraft:mossy_cobblestone":{type:"minecraft:mossy_cobblestone",item:"minecraft:mossy_cobblestone",group:0},"minecraft:mossy_stone_bricks":{type:"minecraft:mossy_stone_bricks",item:"minecraft:mossy_stone_bricks",group:0},"minecraft:mud":{type:"minecraft:mud",item:"minecraft:mud",group:0},"minecraft:mud_bricks":{type:"minecraft:mud_bricks",item:"minecraft:mud_bricks",group:0},"minecraft:nether_bricks":{type:"minecraft:nether_bricks",item:"minecraft:nether_bricks",group:0},"minecraft:nether_gold_ore":{type:"minecraft:nether_gold_ore",item:"minecraft:nether_gold_ore",group:0},"minecraft:nether_quartz_ore":{type:"minecraft:nether_quartz_ore",item:"minecraft:nether_quartz_ore",group:0},"minecraft:nether_sprouts":{type:"minecraft:nether_sprouts",item:"minecraft:nether_sprouts",group:0},"minecraft:nether_wart_block":{type:"minecraft:nether_wart_block",item:"minecraft:nether_wart_block",group:0},"minecraft:netherite_block":{type:"minecraft:netherite_block",item:"minecraft:netherite_block",group:0},"minecraft:netherrack":{type:"minecraft:netherrack",item:"minecraft:netherrack",group:0},"minecraft:oak_planks":{type:"minecraft:oak_planks",item:"minecraft:oak_planks",group:0},"minecraft:obsidian":{type:"minecraft:obsidian",item:"minecraft:obsidian",group:0},"minecraft:orange_carpet":{type:"minecraft:orange_carpet",item:"minecraft:orange_carpet",group:0},"minecraft:orange_concrete":{type:"minecraft:orange_concrete",item:"minecraft:orange_concrete",group:0},"minecraft:orange_concrete_powder":{type:"minecraft:orange_concrete_powder",item:"minecraft:orange_concrete_powder",group:0},"minecraft:orange_stained_glass":{type:"minecraft:orange_stained_glass",item:"minecraft:orange_stained_glass",group:0},"minecraft:orange_terracotta":{type:"minecraft:orange_terracotta",item:"minecraft:orange_terracotta",group:0},"minecraft:orange_tulip":{type:"minecraft:orange_tulip",item:"minecraft:orange_tulip",group:0},"minecraft:orange_wool":{type:"minecraft:orange_wool",item:"minecraft:orange_wool",group:0},"minecraft:oxeye_daisy":{type:"minecraft:oxeye_daisy",item:"minecraft:oxeye_daisy",group:0},"minecraft:oxidized_chiseled_copper":{type:"minecraft:oxidized_chiseled_copper",item:"minecraft:oxidized_chiseled_copper",group:0},"minecraft:oxidized_copper":{type:"minecraft:oxidized_copper",item:"minecraft:oxidized_copper",group:0},"minecraft:oxidized_cut_copper":{type:"minecraft:oxidized_cut_copper",item:"minecraft:oxidized_cut_copper",group:0},"minecraft:packed_ice":{type:"minecraft:packed_ice",item:"minecraft:packed_ice",group:0},"minecraft:packed_mud":{type:"minecraft:packed_mud",item:"minecraft:packed_mud",group:0},"minecraft:pale_moss_block":{type:"minecraft:pale_moss_block",item:"minecraft:pale_moss_block",group:0},"minecraft:pale_oak_planks":{type:"minecraft:pale_oak_planks",item:"minecraft:pale_oak_planks",group:0},"minecraft:pink_carpet":{type:"minecraft:pink_carpet",item:"minecraft:pink_carpet",group:0},"minecraft:pink_concrete":{type:"minecraft:pink_concrete",item:"minecraft:pink_concrete",group:0},"minecraft:pink_concrete_powder":{type:"minecraft:pink_concrete_powder",item:"minecraft:pink_concrete_powder",group:0},"minecraft:pink_stained_glass":{type:"minecraft:pink_stained_glass",item:"minecraft:pink_stained_glass",group:0},"minecraft:pink_terracotta":{type:"minecraft:pink_terracotta",item:"minecraft:pink_terracotta",group:0},"minecraft:pink_tulip":{type:"minecraft:pink_tulip",item:"minecraft:pink_tulip",group:0},"minecraft:pink_wool":{type:"minecraft:pink_wool",item:"minecraft:pink_wool",group:0},"minecraft:polished_andesite":{type:"minecraft:polished_andesite",item:"minecraft:polished_andesite",group:0},"minecraft:polished_blackstone":{type:"minecraft:polished_blackstone",item:"minecraft:polished_blackstone",group:0},"minecraft:polished_blackstone_bricks":{type:"minecraft:polished_blackstone_bricks",item:"minecraft:polished_blackstone_bricks",group:0},"minecraft:polished_deepslate":{type:"minecraft:polished_deepslate",item:"minecraft:polished_deepslate",group:0},"minecraft:polished_diorite":{type:"minecraft:polished_diorite",item:"minecraft:polished_diorite",group:0},"minecraft:polished_granite":{type:"minecraft:polished_granite",item:"minecraft:polished_granite",group:0},"minecraft:polished_tuff":{type:"minecraft:polished_tuff",item:"minecraft:polished_tuff",group:0},"minecraft:poppy":{type:"minecraft:poppy",item:"minecraft:poppy",group:0},"minecraft:potted_acacia_sapling":{type:"minecraft:potted_acacia_sapling",group:0},"minecraft:potted_allium":{type:"minecraft:potted_allium",group:0},"minecraft:potted_azalea_bush":{type:"minecraft:potted_azalea_bush",group:0},"minecraft:potted_azure_bluet":{type:"minecraft:potted_azure_bluet",group:0},"minecraft:potted_bamboo":{type:"minecraft:potted_bamboo",group:0},"minecraft:potted_birch_sapling":{type:"minecraft:potted_birch_sapling",group:0},"minecraft:potted_blue_orchid":{type:"minecraft:potted_blue_orchid",group:0},"minecraft:potted_brown_mushroom":{type:"minecraft:potted_brown_mushroom",group:0},"minecraft:potted_cactus":{type:"minecraft:potted_cactus",group:0},"minecraft:potted_cherry_sapling":{type:"minecraft:potted_cherry_sapling",group:0},"minecraft:potted_cornflower":{type:"minecraft:potted_cornflower",group:0},"minecraft:potted_crimson_fungus":{type:"minecraft:potted_crimson_fungus",group:0},"minecraft:potted_crimson_roots":{type:"minecraft:potted_crimson_roots",group:0},"minecraft:potted_dandelion":{type:"minecraft:potted_dandelion",group:0},"minecraft:potted_dark_oak_sapling":{type:"minecraft:potted_dark_oak_sapling",group:0},"minecraft:potted_dead_bush":{type:"minecraft:potted_dead_bush",group:0},"minecraft:potted_fern":{type:"minecraft:potted_fern",group:0},"minecraft:potted_flowering_azalea_bush":{type:"minecraft:potted_flowering_azalea_bush",group:0},"minecraft:potted_jungle_sapling":{type:"minecraft:potted_jungle_sapling",group:0},"minecraft:potted_lily_of_the_valley":{type:"minecraft:potted_lily_of_the_valley",group:0},"minecraft:potted_mangrove_propagule":{type:"minecraft:potted_mangrove_propagule",group:0},"minecraft:potted_oak_sapling":{type:"minecraft:potted_oak_sapling",group:0},"minecraft:potted_orange_tulip":{type:"minecraft:potted_orange_tulip",group:0},"minecraft:potted_oxeye_daisy":{type:"minecraft:potted_oxeye_daisy",group:0},"minecraft:potted_pale_oak_sapling":{type:"minecraft:potted_pale_oak_sapling",group:0},"minecraft:potted_pink_tulip":{type:"minecraft:potted_pink_tulip",group:0},"minecraft:potted_poppy":{type:"minecraft:potted_poppy",group:0},"minecraft:potted_red_mushroom":{type:"minecraft:potted_red_mushroom",group:0},"minecraft:potted_red_tulip":{type:"minecraft:potted_red_tulip",group:0},"minecraft:potted_spruce_sapling":{type:"minecraft:potted_spruce_sapling",group:0},"minecraft:potted_torchflower":{type:"minecraft:potted_torchflower",group:0},"minecraft:potted_warped_fungus":{type:"minecraft:potted_warped_fungus",group:0},"minecraft:potted_warped_roots":{type:"minecraft:potted_warped_roots",group:0},"minecraft:potted_white_tulip":{type:"minecraft:potted_white_tulip",group:0},"minecraft:potted_wither_rose":{type:"minecraft:potted_wither_rose",group:0},"minecraft:powder_snow":{type:"minecraft:powder_snow",item:"minecraft:powder_snow_bucket",group:0},"minecraft:prismarine":{type:"minecraft:prismarine",item:"minecraft:prismarine",group:0},"minecraft:prismarine_bricks":{type:"minecraft:prismarine_bricks",item:"minecraft:prismarine_bricks",group:0},"minecraft:pumpkin":{type:"minecraft:pumpkin",item:"minecraft:pumpkin",group:0},"minecraft:purple_carpet":{type:"minecraft:purple_carpet",item:"minecraft:purple_carpet",group:0},"minecraft:purple_concrete":{type:"minecraft:purple_concrete",item:"minecraft:purple_concrete",group:0},"minecraft:purple_concrete_powder":{type:"minecraft:purple_concrete_powder",item:"minecraft:purple_concrete_powder",group:0},"minecraft:purple_stained_glass":{type:"minecraft:purple_stained_glass",item:"minecraft:purple_stained_glass",group:0},"minecraft:purple_terracotta":{type:"minecraft:purple_terracotta",item:"minecraft:purple_terracotta",group:0},"minecraft:purple_wool":{type:"minecraft:purple_wool",item:"minecraft:purple_wool",group:0},"minecraft:purpur_block":{type:"minecraft:purpur_block",item:"minecraft:purpur_block",group:0},"minecraft:quartz_block":{type:"minecraft:quartz_block",item:"minecraft:quartz_block",group:0},"minecraft:quartz_bricks":{type:"minecraft:quartz_bricks",item:"minecraft:quartz_bricks",group:0},"minecraft:raw_copper_block":{type:"minecraft:raw_copper_block",item:"minecraft:raw_copper_block",group:0},"minecraft:raw_gold_block":{type:"minecraft:raw_gold_block",item:"minecraft:raw_gold_block",group:0},"minecraft:raw_iron_block":{type:"minecraft:raw_iron_block",item:"minecraft:raw_iron_block",group:0},"minecraft:red_carpet":{type:"minecraft:red_carpet",item:"minecraft:red_carpet",group:0},"minecraft:red_concrete":{type:"minecraft:red_concrete",item:"minecraft:red_concrete",group:0},"minecraft:red_concrete_powder":{type:"minecraft:red_concrete_powder",item:"minecraft:red_concrete_powder",group:0},"minecraft:red_mushroom":{type:"minecraft:red_mushroom",item:"minecraft:red_mushroom",group:0},"minecraft:red_nether_bricks":{type:"minecraft:red_nether_bricks",item:"minecraft:red_nether_bricks",group:0},"minecraft:red_sand":{type:"minecraft:red_sand",item:"minecraft:red_sand",group:0},"minecraft:red_sandstone":{type:"minecraft:red_sandstone",item:"minecraft:red_sandstone",group:0},"minecraft:red_stained_glass":{type:"minecraft:red_stained_glass",item:"minecraft:red_stained_glass",group:0},"minecraft:red_terracotta":{type:"minecraft:red_terracotta",item:"minecraft:red_terracotta",group:0},"minecraft:red_tulip":{type:"minecraft:red_tulip",item:"minecraft:red_tulip",group:0},"minecraft:red_wool":{type:"minecraft:red_wool",item:"minecraft:red_wool",group:0},"minecraft:redstone_block":{type:"minecraft:redstone_block",item:"minecraft:redstone_block",group:0},"minecraft:reinforced_deepslate":{type:"minecraft:reinforced_deepslate",item:"minecraft:reinforced_deepslate",group:0},"minecraft:rooted_dirt":{type:"minecraft:rooted_dirt",item:"minecraft:rooted_dirt",group:0},"minecraft:sand":{type:"minecraft:sand",item:"minecraft:sand",group:0},"minecraft:sandstone":{type:"minecraft:sandstone",item:"minecraft:sandstone",group:0},"minecraft:sculk":{type:"minecraft:sculk",item:"minecraft:sculk",group:0},"minecraft:sea_lantern":{type:"minecraft:sea_lantern",item:"minecraft:sea_lantern",group:0},"minecraft:seagrass":{type:"minecraft:seagrass",item:"minecraft:seagrass",group:0},"minecraft:short_grass":{type:"minecraft:short_grass",item:"minecraft:short_grass",group:0},"minecraft:shroomlight":{type:"minecraft:shroomlight",item:"minecraft:shroomlight",group:0},"minecraft:slime_block":{type:"minecraft:slime_block",item:"minecraft:slime_block",group:0},"minecraft:smithing_table":{type:"minecraft:smithing_table",item:"minecraft:smithing_table",group:0},"minecraft:smooth_basalt":{type:"minecraft:smooth_basalt",item:"minecraft:smooth_basalt",group:0},"minecraft:smooth_quartz":{type:"minecraft:smooth_quartz",item:"minecraft:smooth_quartz",group:0},"minecraft:smooth_red_sandstone":{type:"minecraft:smooth_red_sandstone",item:"minecraft:smooth_red_sandstone",group:0},"minecraft:smooth_sandstone":{type:"minecraft:smooth_sandstone",item:"minecraft:smooth_sandstone",group:0},"minecraft:smooth_stone":{type:"minecraft:smooth_stone",item:"minecraft:smooth_stone",group:0},"minecraft:snow_block":{type:"minecraft:snow_block",item:"minecraft:snow_block",group:0},"minecraft:soul_fire":{type:"minecraft:soul_fire",group:0},"minecraft:soul_sand":{type:"minecraft:soul_sand",item:"minecraft:soul_sand",group:0},"minecraft:soul_soil":{type:"minecraft:soul_soil",item:"minecraft:soul_soil",group:0},"minecraft:soul_torch":{type:"minecraft:soul_torch",item:"minecraft:soul_torch",group:0},"minecraft:spawner":{type:"minecraft:spawner",item:"minecraft:spawner",group:0},"minecraft:sponge":{type:"minecraft:sponge",item:"minecraft:sponge",group:0},"minecraft:spore_blossom":{type:"minecraft:spore_blossom",item:"minecraft:spore_blossom",group:0},"minecraft:spruce_planks":{type:"minecraft:spruce_planks",item:"minecraft:spruce_planks",group:0},"minecraft:stone":{type:"minecraft:stone",item:"minecraft:stone",group:0},"minecraft:stone_bricks":{type:"minecraft:stone_bricks",item:"minecraft:stone_bricks",group:0},"minecraft:structure_void":{type:"minecraft:structure_void",item:"minecraft:structure_void",group:0},"minecraft:terracotta":{type:"minecraft:terracotta",item:"minecraft:terracotta",group:0},"minecraft:tinted_glass":{type:"minecraft:tinted_glass",item:"minecraft:tinted_glass",group:0},"minecraft:torch":{type:"minecraft:torch",item:"minecraft:torch",group:0},"minecraft:torchflower":{type:"minecraft:torchflower",item:"minecraft:torchflower",group:0},"minecraft:tube_coral_block":{type:"minecraft:tube_coral_block",item:"minecraft:tube_coral_block",group:0},"minecraft:tuff":{type:"minecraft:tuff",item:"minecraft:tuff",group:0},"minecraft:tuff_bricks":{type:"minecraft:tuff_bricks",item:"minecraft:tuff_bricks",group:0},"minecraft:twisting_vines_plant":{type:"minecraft:twisting_vines_plant",group:0},"minecraft:void_air":{type:"minecraft:void_air",group:0},"minecraft:warped_fungus":{type:"minecraft:warped_fungus",item:"minecraft:warped_fungus",group:0},"minecraft:warped_nylium":{type:"minecraft:warped_nylium",item:"minecraft:warped_nylium",group:0},"minecraft:warped_planks":{type:"minecraft:warped_planks",item:"minecraft:warped_planks",group:0},"minecraft:warped_roots":{type:"minecraft:warped_roots",item:"minecraft:warped_roots",group:0},"minecraft:warped_wart_block":{type:"minecraft:warped_wart_block",item:"minecraft:warped_wart_block",group:0},"minecraft:waxed_chiseled_copper":{type:"minecraft:waxed_chiseled_copper",item:"minecraft:waxed_chiseled_copper",group:0},"minecraft:waxed_copper_block":{type:"minecraft:waxed_copper_block",item:"minecraft:waxed_copper_block",group:0},"minecraft:waxed_cut_copper":{type:"minecraft:waxed_cut_copper",item:"minecraft:waxed_cut_copper",group:0},"minecraft:waxed_exposed_chiseled_copper":{type:"minecraft:waxed_exposed_chiseled_copper",item:"minecraft:waxed_exposed_chiseled_copper",group:0},"minecraft:waxed_exposed_copper":{type:"minecraft:waxed_exposed_copper",item:"minecraft:waxed_exposed_copper",group:0},"minecraft:waxed_exposed_cut_copper":{type:"minecraft:waxed_exposed_cut_copper",item:"minecraft:waxed_exposed_cut_copper",group:0},"minecraft:waxed_oxidized_chiseled_copper":{type:"minecraft:waxed_oxidized_chiseled_copper",item:"minecraft:waxed_oxidized_chiseled_copper",group:0},"minecraft:waxed_oxidized_copper":{type:"minecraft:waxed_oxidized_copper",item:"minecraft:waxed_oxidized_copper",group:0},"minecraft:waxed_oxidized_cut_copper":{type:"minecraft:waxed_oxidized_cut_copper",item:"minecraft:waxed_oxidized_cut_copper",group:0},"minecraft:waxed_weathered_chiseled_copper":{type:"minecraft:waxed_weathered_chiseled_copper",item:"minecraft:waxed_weathered_chiseled_copper",group:0},"minecraft:waxed_weathered_copper":{type:"minecraft:waxed_weathered_copper",item:"minecraft:waxed_weathered_copper",group:0},"minecraft:waxed_weathered_cut_copper":{type:"minecraft:waxed_weathered_cut_copper",item:"minecraft:waxed_weathered_cut_copper",group:0},"minecraft:weathered_chiseled_copper":{type:"minecraft:weathered_chiseled_copper",item:"minecraft:weathered_chiseled_copper",group:0},"minecraft:weathered_copper":{type:"minecraft:weathered_copper",item:"minecraft:weathered_copper",group:0},"minecraft:weathered_cut_copper":{type:"minecraft:weathered_cut_copper",item:"minecraft:weathered_cut_copper",group:0},"minecraft:weeping_vines_plant":{type:"minecraft:weeping_vines_plant",group:0},"minecraft:wet_sponge":{type:"minecraft:wet_sponge",item:"minecraft:wet_sponge",group:0},"minecraft:white_carpet":{type:"minecraft:white_carpet",item:"minecraft:white_carpet",group:0},"minecraft:white_concrete":{type:"minecraft:white_concrete",item:"minecraft:white_concrete",group:0},"minecraft:white_concrete_powder":{type:"minecraft:white_concrete_powder",item:"minecraft:white_concrete_powder",group:0},"minecraft:white_stained_glass":{type:"minecraft:white_stained_glass",item:"minecraft:white_stained_glass",group:0},"minecraft:white_terracotta":{type:"minecraft:white_terracotta",item:"minecraft:white_terracotta",group:0},"minecraft:white_tulip":{type:"minecraft:white_tulip",item:"minecraft:white_tulip",group:0},"minecraft:white_wool":{type:"minecraft:white_wool",item:"minecraft:white_wool",group:0},"minecraft:wither_rose":{type:"minecraft:wither_rose",item:"minecraft:wither_rose",group:0},"minecraft:yellow_carpet":{type:"minecraft:yellow_carpet",item:"minecraft:yellow_carpet",group:0},"minecraft:yellow_concrete":{type:"minecraft:yellow_concrete",item:"minecraft:yellow_concrete",group:0},"minecraft:yellow_concrete_powder":{type:"minecraft:yellow_concrete_powder",item:"minecraft:yellow_concrete_powder",group:0},"minecraft:yellow_stained_glass":{type:"minecraft:yellow_stained_glass",item:"minecraft:yellow_stained_glass",group:0},"minecraft:yellow_terracotta":{type:"minecraft:yellow_terracotta",item:"minecraft:yellow_terracotta",group:0},"minecraft:yellow_wool":{type:"minecraft:yellow_wool",item:"minecraft:yellow_wool",group:0},"minecraft:acacia_button":{type:"minecraft:acacia_button",item:"minecraft:acacia_button",group:1},"minecraft:bamboo_button":{type:"minecraft:bamboo_button",item:"minecraft:bamboo_button",group:1},"minecraft:birch_button":{type:"minecraft:birch_button",item:"minecraft:birch_button",group:1},"minecraft:cherry_button":{type:"minecraft:cherry_button",item:"minecraft:cherry_button",group:1},"minecraft:crimson_button":{type:"minecraft:crimson_button",item:"minecraft:crimson_button",group:1},"minecraft:dark_oak_button":{type:"minecraft:dark_oak_button",item:"minecraft:dark_oak_button",group:1},"minecraft:jungle_button":{type:"minecraft:jungle_button",item:"minecraft:jungle_button",group:1},"minecraft:lever":{type:"minecraft:lever",item:"minecraft:lever",group:1},"minecraft:mangrove_button":{type:"minecraft:mangrove_button",item:"minecraft:mangrove_button",group:1},"minecraft:oak_button":{type:"minecraft:oak_button",item:"minecraft:oak_button",group:1},"minecraft:pale_oak_button":{type:"minecraft:pale_oak_button",item:"minecraft:pale_oak_button",group:1},"minecraft:polished_blackstone_button":{type:"minecraft:polished_blackstone_button",item:"minecraft:polished_blackstone_button",group:1},"minecraft:spruce_button":{type:"minecraft:spruce_button",item:"minecraft:spruce_button",group:1},"minecraft:stone_button":{type:"minecraft:stone_button",item:"minecraft:stone_button",group:1},"minecraft:warped_button":{type:"minecraft:warped_button",item:"minecraft:warped_button",group:1},"minecraft:acacia_door":{type:"minecraft:acacia_door",item:"minecraft:acacia_door",group:2},"minecraft:bamboo_door":{type:"minecraft:bamboo_door",item:"minecraft:bamboo_door",group:2},"minecraft:birch_door":{type:"minecraft:birch_door",item:"minecraft:birch_door",group:2},"minecraft:cherry_door":{type:"minecraft:cherry_door",item:"minecraft:cherry_door",group:2},"minecraft:copper_door":{type:"minecraft:copper_door",item:"minecraft:copper_door",group:2},"minecraft:crimson_door":{type:"minecraft:crimson_door",item:"minecraft:crimson_door",group:2},"minecraft:dark_oak_door":{type:"minecraft:dark_oak_door",item:"minecraft:dark_oak_door",group:2},"minecraft:exposed_copper_door":{type:"minecraft:exposed_copper_door",item:"minecraft:exposed_copper_door",group:2},"minecraft:iron_door":{type:"minecraft:iron_door",item:"minecraft:iron_door",group:2},"minecraft:jungle_door":{type:"minecraft:jungle_door",item:"minecraft:jungle_door",group:2},"minecraft:mangrove_door":{type:"minecraft:mangrove_door",item:"minecraft:mangrove_door",group:2},"minecraft:oak_door":{type:"minecraft:oak_door",item:"minecraft:oak_door",group:2},"minecraft:oxidized_copper_door":{type:"minecraft:oxidized_copper_door",item:"minecraft:oxidized_copper_door",group:2},"minecraft:pale_oak_door":{type:"minecraft:pale_oak_door",item:"minecraft:pale_oak_door",group:2},"minecraft:spruce_door":{type:"minecraft:spruce_door",item:"minecraft:spruce_door",group:2},"minecraft:warped_door":{type:"minecraft:warped_door",item:"minecraft:warped_door",group:2},"minecraft:waxed_copper_door":{type:"minecraft:waxed_copper_door",item:"minecraft:waxed_copper_door",group:2},"minecraft:waxed_exposed_copper_door":{type:"minecraft:waxed_exposed_copper_door",item:"minecraft:waxed_exposed_copper_door",group:2},"minecraft:waxed_oxidized_copper_door":{type:"minecraft:waxed_oxidized_copper_door",item:"minecraft:waxed_oxidized_copper_door",group:2},"minecraft:waxed_weathered_copper_door":{type:"minecraft:waxed_weathered_copper_door",item:"minecraft:waxed_weathered_copper_door",group:2},"minecraft:weathered_copper_door":{type:"minecraft:weathered_copper_door",item:"minecraft:weathered_copper_door",group:2},"minecraft:acacia_fence":{type:"minecraft:acacia_fence",item:"minecraft:acacia_fence",group:3},"minecraft:bamboo_fence":{type:"minecraft:bamboo_fence",item:"minecraft:bamboo_fence",group:3},"minecraft:birch_fence":{type:"minecraft:birch_fence",item:"minecraft:birch_fence",group:3},"minecraft:black_stained_glass_pane":{type:"minecraft:black_stained_glass_pane",item:"minecraft:black_stained_glass_pane",group:3},"minecraft:blue_stained_glass_pane":{type:"minecraft:blue_stained_glass_pane",item:"minecraft:blue_stained_glass_pane",group:3},"minecraft:brown_stained_glass_pane":{type:"minecraft:brown_stained_glass_pane",item:"minecraft:brown_stained_glass_pane",group:3},"minecraft:cherry_fence":{type:"minecraft:cherry_fence",item:"minecraft:cherry_fence",group:3},"minecraft:crimson_fence":{type:"minecraft:crimson_fence",item:"minecraft:crimson_fence",group:3},"minecraft:cyan_stained_glass_pane":{type:"minecraft:cyan_stained_glass_pane",item:"minecraft:cyan_stained_glass_pane",group:3},"minecraft:dark_oak_fence":{type:"minecraft:dark_oak_fence",item:"minecraft:dark_oak_fence",group:3},"minecraft:glass_pane":{type:"minecraft:glass_pane",item:"minecraft:glass_pane",group:3},"minecraft:gray_stained_glass_pane":{type:"minecraft:gray_stained_glass_pane",item:"minecraft:gray_stained_glass_pane",group:3},"minecraft:green_stained_glass_pane":{type:"minecraft:green_stained_glass_pane",item:"minecraft:green_stained_glass_pane",group:3},"minecraft:iron_bars":{type:"minecraft:iron_bars",item:"minecraft:iron_bars",group:3},"minecraft:jungle_fence":{type:"minecraft:jungle_fence",item:"minecraft:jungle_fence",group:3},"minecraft:light_blue_stained_glass_pane":{type:"minecraft:light_blue_stained_glass_pane",item:"minecraft:light_blue_stained_glass_pane",group:3},"minecraft:light_gray_stained_glass_pane":{type:"minecraft:light_gray_stained_glass_pane",item:"minecraft:light_gray_stained_glass_pane",group:3},"minecraft:lime_stained_glass_pane":{type:"minecraft:lime_stained_glass_pane",item:"minecraft:lime_stained_glass_pane",group:3},"minecraft:magenta_stained_glass_pane":{type:"minecraft:magenta_stained_glass_pane",item:"minecraft:magenta_stained_glass_pane",group:3},"minecraft:mangrove_fence":{type:"minecraft:mangrove_fence",item:"minecraft:mangrove_fence",group:3},"minecraft:nether_brick_fence":{type:"minecraft:nether_brick_fence",item:"minecraft:nether_brick_fence",group:3},"minecraft:oak_fence":{type:"minecraft:oak_fence",item:"minecraft:oak_fence",group:3},"minecraft:orange_stained_glass_pane":{type:"minecraft:orange_stained_glass_pane",item:"minecraft:orange_stained_glass_pane",group:3},"minecraft:pale_oak_fence":{type:"minecraft:pale_oak_fence",item:"minecraft:pale_oak_fence",group:3},"minecraft:pink_stained_glass_pane":{type:"minecraft:pink_stained_glass_pane",item:"minecraft:pink_stained_glass_pane",group:3},"minecraft:purple_stained_glass_pane":{type:"minecraft:purple_stained_glass_pane",item:"minecraft:purple_stained_glass_pane",group:3},"minecraft:red_stained_glass_pane":{type:"minecraft:red_stained_glass_pane",item:"minecraft:red_stained_glass_pane",group:3},"minecraft:spruce_fence":{type:"minecraft:spruce_fence",item:"minecraft:spruce_fence",group:3},"minecraft:warped_fence":{type:"minecraft:warped_fence",item:"minecraft:warped_fence",group:3},"minecraft:white_stained_glass_pane":{type:"minecraft:white_stained_glass_pane",item:"minecraft:white_stained_glass_pane",group:3},"minecraft:yellow_stained_glass_pane":{type:"minecraft:yellow_stained_glass_pane",item:"minecraft:yellow_stained_glass_pane",group:3},"minecraft:acacia_fence_gate":{type:"minecraft:acacia_fence_gate",item:"minecraft:acacia_fence_gate",group:4},"minecraft:bamboo_fence_gate":{type:"minecraft:bamboo_fence_gate",item:"minecraft:bamboo_fence_gate",group:4},"minecraft:birch_fence_gate":{type:"minecraft:birch_fence_gate",item:"minecraft:birch_fence_gate",group:4},"minecraft:cherry_fence_gate":{type:"minecraft:cherry_fence_gate",item:"minecraft:cherry_fence_gate",group:4},"minecraft:crimson_fence_gate":{type:"minecraft:crimson_fence_gate",item:"minecraft:crimson_fence_gate",group:4},"minecraft:dark_oak_fence_gate":{type:"minecraft:dark_oak_fence_gate",item:"minecraft:dark_oak_fence_gate",group:4},"minecraft:jungle_fence_gate":{type:"minecraft:jungle_fence_gate",item:"minecraft:jungle_fence_gate",group:4},"minecraft:mangrove_fence_gate":{type:"minecraft:mangrove_fence_gate",item:"minecraft:mangrove_fence_gate",group:4},"minecraft:oak_fence_gate":{type:"minecraft:oak_fence_gate",item:"minecraft:oak_fence_gate",group:4},"minecraft:pale_oak_fence_gate":{type:"minecraft:pale_oak_fence_gate",item:"minecraft:pale_oak_fence_gate",group:4},"minecraft:spruce_fence_gate":{type:"minecraft:spruce_fence_gate",item:"minecraft:spruce_fence_gate",group:4},"minecraft:warped_fence_gate":{type:"minecraft:warped_fence_gate",item:"minecraft:warped_fence_gate",group:4},"minecraft:acacia_hanging_sign":{type:"minecraft:acacia_hanging_sign",item:"minecraft:acacia_hanging_sign",group:5},"minecraft:bamboo_hanging_sign":{type:"minecraft:bamboo_hanging_sign",item:"minecraft:bamboo_hanging_sign",group:5},"minecraft:birch_hanging_sign":{type:"minecraft:birch_hanging_sign",item:"minecraft:birch_hanging_sign",group:5},"minecraft:cherry_hanging_sign":{type:"minecraft:cherry_hanging_sign",item:"minecraft:cherry_hanging_sign",group:5},"minecraft:crimson_hanging_sign":{type:"minecraft:crimson_hanging_sign",item:"minecraft:crimson_hanging_sign",group:5},"minecraft:dark_oak_hanging_sign":{type:"minecraft:dark_oak_hanging_sign",item:"minecraft:dark_oak_hanging_sign",group:5},"minecraft:jungle_hanging_sign":{type:"minecraft:jungle_hanging_sign",item:"minecraft:jungle_hanging_sign",group:5},"minecraft:mangrove_hanging_sign":{type:"minecraft:mangrove_hanging_sign",item:"minecraft:mangrove_hanging_sign",group:5},"minecraft:oak_hanging_sign":{type:"minecraft:oak_hanging_sign",item:"minecraft:oak_hanging_sign",group:5},"minecraft:pale_oak_hanging_sign":{type:"minecraft:pale_oak_hanging_sign",item:"minecraft:pale_oak_hanging_sign",group:5},"minecraft:spruce_hanging_sign":{type:"minecraft:spruce_hanging_sign",item:"minecraft:spruce_hanging_sign",group:5},"minecraft:warped_hanging_sign":{type:"minecraft:warped_hanging_sign",item:"minecraft:warped_hanging_sign",group:5},"minecraft:acacia_leaves":{type:"minecraft:acacia_leaves",item:"minecraft:acacia_leaves",group:6},"minecraft:azalea_leaves":{type:"minecraft:azalea_leaves",item:"minecraft:azalea_leaves",group:6},"minecraft:birch_leaves":{type:"minecraft:birch_leaves",item:"minecraft:birch_leaves",group:6},"minecraft:cherry_leaves":{type:"minecraft:cherry_leaves",item:"minecraft:cherry_leaves",group:6},"minecraft:dark_oak_leaves":{type:"minecraft:dark_oak_leaves",item:"minecraft:dark_oak_leaves",group:6},"minecraft:flowering_azalea_leaves":{type:"minecraft:flowering_azalea_leaves",item:"minecraft:flowering_azalea_leaves",group:6},"minecraft:jungle_leaves":{type:"minecraft:jungle_leaves",item:"minecraft:jungle_leaves",group:6},"minecraft:mangrove_leaves":{type:"minecraft:mangrove_leaves",item:"minecraft:mangrove_leaves",group:6},"minecraft:oak_leaves":{type:"minecraft:oak_leaves",item:"minecraft:oak_leaves",group:6},"minecraft:pale_oak_leaves":{type:"minecraft:pale_oak_leaves",item:"minecraft:pale_oak_leaves",group:6},"minecraft:spruce_leaves":{type:"minecraft:spruce_leaves",item:"minecraft:spruce_leaves",group:6},"minecraft:acacia_log":{type:"minecraft:acacia_log",item:"minecraft:acacia_log",group:7},"minecraft:acacia_wood":{type:"minecraft:acacia_wood",item:"minecraft:acacia_wood",group:7},"minecraft:bamboo_block":{type:"minecraft:bamboo_block",item:"minecraft:bamboo_block",group:7},"minecraft:basalt":{type:"minecraft:basalt",item:"minecraft:basalt",group:7},"minecraft:birch_log":{type:"minecraft:birch_log",item:"minecraft:birch_log",group:7},"minecraft:birch_wood":{type:"minecraft:birch_wood",item:"minecraft:birch_wood",group:7},"minecraft:bone_block":{type:"minecraft:bone_block",item:"minecraft:bone_block",group:7},"minecraft:cherry_log":{type:"minecraft:cherry_log",item:"minecraft:cherry_log",group:7},"minecraft:cherry_wood":{type:"minecraft:cherry_wood",item:"minecraft:cherry_wood",group:7},"minecraft:crimson_hyphae":{type:"minecraft:crimson_hyphae",item:"minecraft:crimson_hyphae",group:7},"minecraft:crimson_stem":{type:"minecraft:crimson_stem",item:"minecraft:crimson_stem",group:7},"minecraft:dark_oak_log":{type:"minecraft:dark_oak_log",item:"minecraft:dark_oak_log",group:7},"minecraft:dark_oak_wood":{type:"minecraft:dark_oak_wood",item:"minecraft:dark_oak_wood",group:7},"minecraft:deepslate":{type:"minecraft:deepslate",item:"minecraft:deepslate",group:7},"minecraft:hay_block":{type:"minecraft:hay_block",item:"minecraft:hay_block",group:7},"minecraft:infested_deepslate":{type:"minecraft:infested_deepslate",item:"minecraft:infested_deepslate",group:7},"minecraft:jungle_log":{type:"minecraft:jungle_log",item:"minecraft:jungle_log",group:7},"minecraft:jungle_wood":{type:"minecraft:jungle_wood",item:"minecraft:jungle_wood",group:7},"minecraft:mangrove_log":{type:"minecraft:mangrove_log",item:"minecraft:mangrove_log",group:7},"minecraft:mangrove_wood":{type:"minecraft:mangrove_wood",item:"minecraft:mangrove_wood",group:7},"minecraft:muddy_mangrove_roots":{type:"minecraft:muddy_mangrove_roots",item:"minecraft:muddy_mangrove_roots",group:7},"minecraft:oak_log":{type:"minecraft:oak_log",item:"minecraft:oak_log",group:7},"minecraft:oak_wood":{type:"minecraft:oak_wood",item:"minecraft:oak_wood",group:7},"minecraft:ochre_froglight":{type:"minecraft:ochre_froglight",item:"minecraft:ochre_froglight",group:7},"minecraft:pale_oak_log":{type:"minecraft:pale_oak_log",item:"minecraft:pale_oak_log",group:7},"minecraft:pale_oak_wood":{type:"minecraft:pale_oak_wood",item:"minecraft:pale_oak_wood",group:7},"minecraft:pearlescent_froglight":{type:"minecraft:pearlescent_froglight",item:"minecraft:pearlescent_froglight",group:7},"minecraft:polished_basalt":{type:"minecraft:polished_basalt",item:"minecraft:polished_basalt",group:7},"minecraft:purpur_pillar":{type:"minecraft:purpur_pillar",item:"minecraft:purpur_pillar",group:7},"minecraft:quartz_pillar":{type:"minecraft:quartz_pillar",item:"minecraft:quartz_pillar",group:7},"minecraft:spruce_log":{type:"minecraft:spruce_log",item:"minecraft:spruce_log",group:7},"minecraft:spruce_wood":{type:"minecraft:spruce_wood",item:"minecraft:spruce_wood",group:7},"minecraft:stripped_acacia_log":{type:"minecraft:stripped_acacia_log",item:"minecraft:stripped_acacia_log",group:7},"minecraft:stripped_acacia_wood":{type:"minecraft:stripped_acacia_wood",item:"minecraft:stripped_acacia_wood",group:7},"minecraft:stripped_bamboo_block":{type:"minecraft:stripped_bamboo_block",item:"minecraft:stripped_bamboo_block",group:7},"minecraft:stripped_birch_log":{type:"minecraft:stripped_birch_log",item:"minecraft:stripped_birch_log",group:7},"minecraft:stripped_birch_wood":{type:"minecraft:stripped_birch_wood",item:"minecraft:stripped_birch_wood",group:7},"minecraft:stripped_cherry_log":{type:"minecraft:stripped_cherry_log",item:"minecraft:stripped_cherry_log",group:7},"minecraft:stripped_cherry_wood":{type:"minecraft:stripped_cherry_wood",item:"minecraft:stripped_cherry_wood",group:7},"minecraft:stripped_crimson_hyphae":{type:"minecraft:stripped_crimson_hyphae",item:"minecraft:stripped_crimson_hyphae",group:7},"minecraft:stripped_crimson_stem":{type:"minecraft:stripped_crimson_stem",item:"minecraft:stripped_crimson_stem",group:7},"minecraft:stripped_dark_oak_log":{type:"minecraft:stripped_dark_oak_log",item:"minecraft:stripped_dark_oak_log",group:7},"minecraft:stripped_dark_oak_wood":{type:"minecraft:stripped_dark_oak_wood",item:"minecraft:stripped_dark_oak_wood",group:7},"minecraft:stripped_jungle_log":{type:"minecraft:stripped_jungle_log",item:"minecraft:stripped_jungle_log",group:7},"minecraft:stripped_jungle_wood":{type:"minecraft:stripped_jungle_wood",item:"minecraft:stripped_jungle_wood",group:7},"minecraft:stripped_mangrove_log":{type:"minecraft:stripped_mangrove_log",item:"minecraft:stripped_mangrove_log",group:7},"minecraft:stripped_mangrove_wood":{type:"minecraft:stripped_mangrove_wood",item:"minecraft:stripped_mangrove_wood",group:7},"minecraft:stripped_oak_log":{type:"minecraft:stripped_oak_log",item:"minecraft:stripped_oak_log",group:7},"minecraft:stripped_oak_wood":{type:"minecraft:stripped_oak_wood",item:"minecraft:stripped_oak_wood",group:7},"minecraft:stripped_pale_oak_log":{type:"minecraft:stripped_pale_oak_log",item:"minecraft:stripped_pale_oak_log",group:7},"minecraft:stripped_pale_oak_wood":{type:"minecraft:stripped_pale_oak_wood",item:"minecraft:stripped_pale_oak_wood",group:7},"minecraft:stripped_spruce_log":{type:"minecraft:stripped_spruce_log",item:"minecraft:stripped_spruce_log",group:7},"minecraft:stripped_spruce_wood":{type:"minecraft:stripped_spruce_wood",item:"minecraft:stripped_spruce_wood",group:7},"minecraft:stripped_warped_hyphae":{type:"minecraft:stripped_warped_hyphae",item:"minecraft:stripped_warped_hyphae",group:7},"minecraft:stripped_warped_stem":{type:"minecraft:stripped_warped_stem",item:"minecraft:stripped_warped_stem",group:7},"minecraft:verdant_froglight":{type:"minecraft:verdant_froglight",item:"minecraft:verdant_froglight",group:7},"minecraft:warped_hyphae":{type:"minecraft:warped_hyphae",item:"minecraft:warped_hyphae",group:7},"minecraft:warped_stem":{type:"minecraft:warped_stem",item:"minecraft:warped_stem",group:7},"minecraft:acacia_pressure_plate":{type:"minecraft:acacia_pressure_plate",item:"minecraft:acacia_pressure_plate",group:8},"minecraft:bamboo_pressure_plate":{type:"minecraft:bamboo_pressure_plate",item:"minecraft:bamboo_pressure_plate",group:8},"minecraft:birch_pressure_plate":{type:"minecraft:birch_pressure_plate",item:"minecraft:birch_pressure_plate",group:8},"minecraft:cherry_pressure_plate":{type:"minecraft:cherry_pressure_plate",item:"minecraft:cherry_pressure_plate",group:8},"minecraft:crimson_pressure_plate":{type:"minecraft:crimson_pressure_plate",item:"minecraft:crimson_pressure_plate",group:8},"minecraft:dark_oak_pressure_plate":{type:"minecraft:dark_oak_pressure_plate",item:"minecraft:dark_oak_pressure_plate",group:8},"minecraft:jungle_pressure_plate":{type:"minecraft:jungle_pressure_plate",item:"minecraft:jungle_pressure_plate",group:8},"minecraft:mangrove_pressure_plate":{type:"minecraft:mangrove_pressure_plate",item:"minecraft:mangrove_pressure_plate",group:8},"minecraft:oak_pressure_plate":{type:"minecraft:oak_pressure_plate",item:"minecraft:oak_pressure_plate",group:8},"minecraft:pale_oak_pressure_plate":{type:"minecraft:pale_oak_pressure_plate",item:"minecraft:pale_oak_pressure_plate",group:8},"minecraft:polished_blackstone_pressure_plate":{type:"minecraft:polished_blackstone_pressure_plate",item:"minecraft:polished_blackstone_pressure_plate",group:8},"minecraft:spruce_pressure_plate":{type:"minecraft:spruce_pressure_plate",item:"minecraft:spruce_pressure_plate",group:8},"minecraft:stone_pressure_plate":{type:"minecraft:stone_pressure_plate",item:"minecraft:stone_pressure_plate",group:8},"minecraft:warped_pressure_plate":{type:"minecraft:warped_pressure_plate",item:"minecraft:warped_pressure_plate",group:8},"minecraft:acacia_sapling":{type:"minecraft:acacia_sapling",item:"minecraft:acacia_sapling",group:9},"minecraft:birch_sapling":{type:"minecraft:birch_sapling",item:"minecraft:birch_sapling",group:9},"minecraft:cherry_sapling":{type:"minecraft:cherry_sapling",item:"minecraft:cherry_sapling",group:9},"minecraft:dark_oak_sapling":{type:"minecraft:dark_oak_sapling",item:"minecraft:dark_oak_sapling",group:9},"minecraft:jungle_sapling":{type:"minecraft:jungle_sapling",item:"minecraft:jungle_sapling",group:9},"minecraft:oak_sapling":{type:"minecraft:oak_sapling",item:"minecraft:oak_sapling",group:9},"minecraft:pale_oak_sapling":{type:"minecraft:pale_oak_sapling",item:"minecraft:pale_oak_sapling",group:9},"minecraft:spruce_sapling":{type:"minecraft:spruce_sapling",item:"minecraft:spruce_sapling",group:9},"minecraft:acacia_sign":{type:"minecraft:acacia_sign",item:"minecraft:acacia_sign",group:10},"minecraft:bamboo_sign":{type:"minecraft:bamboo_sign",item:"minecraft:bamboo_sign",group:10},"minecraft:birch_sign":{type:"minecraft:birch_sign",item:"minecraft:birch_sign",group:10},"minecraft:cherry_sign":{type:"minecraft:cherry_sign",item:"minecraft:cherry_sign",group:10},"minecraft:crimson_sign":{type:"minecraft:crimson_sign",item:"minecraft:crimson_sign",group:10},"minecraft:dark_oak_sign":{type:"minecraft:dark_oak_sign",item:"minecraft:dark_oak_sign",group:10},"minecraft:jungle_sign":{type:"minecraft:jungle_sign",item:"minecraft:jungle_sign",group:10},"minecraft:mangrove_sign":{type:"minecraft:mangrove_sign",item:"minecraft:mangrove_sign",group:10},"minecraft:oak_sign":{type:"minecraft:oak_sign",item:"minecraft:oak_sign",group:10},"minecraft:pale_oak_sign":{type:"minecraft:pale_oak_sign",item:"minecraft:pale_oak_sign",group:10},"minecraft:spruce_sign":{type:"minecraft:spruce_sign",item:"minecraft:spruce_sign",group:10},"minecraft:warped_sign":{type:"minecraft:warped_sign",item:"minecraft:warped_sign",group:10},"minecraft:acacia_slab":{type:"minecraft:acacia_slab",item:"minecraft:acacia_slab",group:11},"minecraft:andesite_slab":{type:"minecraft:andesite_slab",item:"minecraft:andesite_slab",group:11},"minecraft:bamboo_mosaic_slab":{type:"minecraft:bamboo_mosaic_slab",item:"minecraft:bamboo_mosaic_slab",group:11},"minecraft:bamboo_slab":{type:"minecraft:bamboo_slab",item:"minecraft:bamboo_slab",group:11},"minecraft:birch_slab":{type:"minecraft:birch_slab",item:"minecraft:birch_slab",group:11},"minecraft:blackstone_slab":{type:"minecraft:blackstone_slab",item:"minecraft:blackstone_slab",group:11},"minecraft:brick_slab":{type:"minecraft:brick_slab",item:"minecraft:brick_slab",group:11},"minecraft:cherry_slab":{type:"minecraft:cherry_slab",item:"minecraft:cherry_slab",group:11},"minecraft:cobbled_deepslate_slab":{type:"minecraft:cobbled_deepslate_slab",item:"minecraft:cobbled_deepslate_slab",group:11},"minecraft:cobblestone_slab":{type:"minecraft:cobblestone_slab",item:"minecraft:cobblestone_slab",group:11},"minecraft:crimson_slab":{type:"minecraft:crimson_slab",item:"minecraft:crimson_slab",group:11},"minecraft:cut_copper_slab":{type:"minecraft:cut_copper_slab",item:"minecraft:cut_copper_slab",group:11},"minecraft:cut_red_sandstone_slab":{type:"minecraft:cut_red_sandstone_slab",item:"minecraft:cut_red_sandstone_slab",group:11},"minecraft:cut_sandstone_slab":{type:"minecraft:cut_sandstone_slab",item:"minecraft:cut_sandstone_slab",group:11},"minecraft:dark_oak_slab":{type:"minecraft:dark_oak_slab",item:"minecraft:dark_oak_slab",group:11},"minecraft:dark_prismarine_slab":{type:"minecraft:dark_prismarine_slab",item:"minecraft:dark_prismarine_slab",group:11},"minecraft:deepslate_brick_slab":{type:"minecraft:deepslate_brick_slab",item:"minecraft:deepslate_brick_slab",group:11},"minecraft:deepslate_tile_slab":{type:"minecraft:deepslate_tile_slab",item:"minecraft:deepslate_tile_slab",group:11},"minecraft:diorite_slab":{type:"minecraft:diorite_slab",item:"minecraft:diorite_slab",group:11},"minecraft:end_stone_brick_slab":{type:"minecraft:end_stone_brick_slab",item:"minecraft:end_stone_brick_slab",group:11},"minecraft:exposed_cut_copper_slab":{type:"minecraft:exposed_cut_copper_slab",item:"minecraft:exposed_cut_copper_slab",group:11},"minecraft:granite_slab":{type:"minecraft:granite_slab",item:"minecraft:granite_slab",group:11},"minecraft:jungle_slab":{type:"minecraft:jungle_slab",item:"minecraft:jungle_slab",group:11},"minecraft:mangrove_slab":{type:"minecraft:mangrove_slab",item:"minecraft:mangrove_slab",group:11},"minecraft:mossy_cobblestone_slab":{type:"minecraft:mossy_cobblestone_slab",item:"minecraft:mossy_cobblestone_slab",group:11},"minecraft:mossy_stone_brick_slab":{type:"minecraft:mossy_stone_brick_slab",item:"minecraft:mossy_stone_brick_slab",group:11},"minecraft:mud_brick_slab":{type:"minecraft:mud_brick_slab",item:"minecraft:mud_brick_slab",group:11},"minecraft:nether_brick_slab":{type:"minecraft:nether_brick_slab",item:"minecraft:nether_brick_slab",group:11},"minecraft:oak_slab":{type:"minecraft:oak_slab",item:"minecraft:oak_slab",group:11},"minecraft:oxidized_cut_copper_slab":{type:"minecraft:oxidized_cut_copper_slab",item:"minecraft:oxidized_cut_copper_slab",group:11},"minecraft:pale_oak_slab":{type:"minecraft:pale_oak_slab",item:"minecraft:pale_oak_slab",group:11},"minecraft:petrified_oak_slab":{type:"minecraft:petrified_oak_slab",item:"minecraft:petrified_oak_slab",group:11},"minecraft:polished_andesite_slab":{type:"minecraft:polished_andesite_slab",item:"minecraft:polished_andesite_slab",group:11},"minecraft:polished_blackstone_brick_slab":{type:"minecraft:polished_blackstone_brick_slab",item:"minecraft:polished_blackstone_brick_slab",group:11},"minecraft:polished_blackstone_slab":{type:"minecraft:polished_blackstone_slab",item:"minecraft:polished_blackstone_slab",group:11},"minecraft:polished_deepslate_slab":{type:"minecraft:polished_deepslate_slab",item:"minecraft:polished_deepslate_slab",group:11},"minecraft:polished_diorite_slab":{type:"minecraft:polished_diorite_slab",item:"minecraft:polished_diorite_slab",group:11},"minecraft:polished_granite_slab":{type:"minecraft:polished_granite_slab",item:"minecraft:polished_granite_slab",group:11},"minecraft:polished_tuff_slab":{type:"minecraft:polished_tuff_slab",item:"minecraft:polished_tuff_slab",group:11},"minecraft:prismarine_brick_slab":{type:"minecraft:prismarine_brick_slab",item:"minecraft:prismarine_brick_slab",group:11},"minecraft:prismarine_slab":{type:"minecraft:prismarine_slab",item:"minecraft:prismarine_slab",group:11},"minecraft:purpur_slab":{type:"minecraft:purpur_slab",item:"minecraft:purpur_slab",group:11},"minecraft:quartz_slab":{type:"minecraft:quartz_slab",item:"minecraft:quartz_slab",group:11},"minecraft:red_nether_brick_slab":{type:"minecraft:red_nether_brick_slab",item:"minecraft:red_nether_brick_slab",group:11},"minecraft:red_sandstone_slab":{type:"minecraft:red_sandstone_slab",item:"minecraft:red_sandstone_slab",group:11},"minecraft:sandstone_slab":{type:"minecraft:sandstone_slab",item:"minecraft:sandstone_slab",group:11},"minecraft:smooth_quartz_slab":{type:"minecraft:smooth_quartz_slab",item:"minecraft:smooth_quartz_slab",group:11},"minecraft:smooth_red_sandstone_slab":{type:"minecraft:smooth_red_sandstone_slab",item:"minecraft:smooth_red_sandstone_slab",group:11},"minecraft:smooth_sandstone_slab":{type:"minecraft:smooth_sandstone_slab",item:"minecraft:smooth_sandstone_slab",group:11},"minecraft:smooth_stone_slab":{type:"minecraft:smooth_stone_slab",item:"minecraft:smooth_stone_slab",group:11},"minecraft:spruce_slab":{type:"minecraft:spruce_slab",item:"minecraft:spruce_slab",group:11},"minecraft:stone_brick_slab":{type:"minecraft:stone_brick_slab",item:"minecraft:stone_brick_slab",group:11},"minecraft:stone_slab":{type:"minecraft:stone_slab",item:"minecraft:stone_slab",group:11},"minecraft:tuff_brick_slab":{type:"minecraft:tuff_brick_slab",item:"minecraft:tuff_brick_slab",group:11},"minecraft:tuff_slab":{type:"minecraft:tuff_slab",item:"minecraft:tuff_slab",group:11},"minecraft:warped_slab":{type:"minecraft:warped_slab",item:"minecraft:warped_slab",group:11},"minecraft:waxed_cut_copper_slab":{type:"minecraft:waxed_cut_copper_slab",item:"minecraft:waxed_cut_copper_slab",group:11},"minecraft:waxed_exposed_cut_copper_slab":{type:"minecraft:waxed_exposed_cut_copper_slab",item:"minecraft:waxed_exposed_cut_copper_slab",group:11},"minecraft:waxed_oxidized_cut_copper_slab":{type:"minecraft:waxed_oxidized_cut_copper_slab",item:"minecraft:waxed_oxidized_cut_copper_slab",group:11},"minecraft:waxed_weathered_cut_copper_slab":{type:"minecraft:waxed_weathered_cut_copper_slab",item:"minecraft:waxed_weathered_cut_copper_slab",group:11},"minecraft:weathered_cut_copper_slab":{type:"minecraft:weathered_cut_copper_slab",item:"minecraft:weathered_cut_copper_slab",group:11},"minecraft:acacia_stairs":{type:"minecraft:acacia_stairs",item:"minecraft:acacia_stairs",group:12},"minecraft:andesite_stairs":{type:"minecraft:andesite_stairs",item:"minecraft:andesite_stairs",group:12},"minecraft:bamboo_mosaic_stairs":{type:"minecraft:bamboo_mosaic_stairs",item:"minecraft:bamboo_mosaic_stairs",group:12},"minecraft:bamboo_stairs":{type:"minecraft:bamboo_stairs",item:"minecraft:bamboo_stairs",group:12},"minecraft:birch_stairs":{type:"minecraft:birch_stairs",item:"minecraft:birch_stairs",group:12},"minecraft:blackstone_stairs":{type:"minecraft:blackstone_stairs",item:"minecraft:blackstone_stairs",group:12},"minecraft:brick_stairs":{type:"minecraft:brick_stairs",item:"minecraft:brick_stairs",group:12},"minecraft:cherry_stairs":{type:"minecraft:cherry_stairs",item:"minecraft:cherry_stairs",group:12},"minecraft:cobbled_deepslate_stairs":{type:"minecraft:cobbled_deepslate_stairs",item:"minecraft:cobbled_deepslate_stairs",group:12},"minecraft:cobblestone_stairs":{type:"minecraft:cobblestone_stairs",item:"minecraft:cobblestone_stairs",group:12},"minecraft:crimson_stairs":{type:"minecraft:crimson_stairs",item:"minecraft:crimson_stairs",group:12},"minecraft:cut_copper_stairs":{type:"minecraft:cut_copper_stairs",item:"minecraft:cut_copper_stairs",group:12},"minecraft:dark_oak_stairs":{type:"minecraft:dark_oak_stairs",item:"minecraft:dark_oak_stairs",group:12},"minecraft:dark_prismarine_stairs":{type:"minecraft:dark_prismarine_stairs",item:"minecraft:dark_prismarine_stairs",group:12},"minecraft:deepslate_brick_stairs":{type:"minecraft:deepslate_brick_stairs",item:"minecraft:deepslate_brick_stairs",group:12},"minecraft:deepslate_tile_stairs":{type:"minecraft:deepslate_tile_stairs",item:"minecraft:deepslate_tile_stairs",group:12},"minecraft:diorite_stairs":{type:"minecraft:diorite_stairs",item:"minecraft:diorite_stairs",group:12},"minecraft:end_stone_brick_stairs":{type:"minecraft:end_stone_brick_stairs",item:"minecraft:end_stone_brick_stairs",group:12},"minecraft:exposed_cut_copper_stairs":{type:"minecraft:exposed_cut_copper_stairs",item:"minecraft:exposed_cut_copper_stairs",group:12},"minecraft:granite_stairs":{type:"minecraft:granite_stairs",item:"minecraft:granite_stairs",group:12},"minecraft:jungle_stairs":{type:"minecraft:jungle_stairs",item:"minecraft:jungle_stairs",group:12},"minecraft:mangrove_stairs":{type:"minecraft:mangrove_stairs",item:"minecraft:mangrove_stairs",group:12},"minecraft:mossy_cobblestone_stairs":{type:"minecraft:mossy_cobblestone_stairs",item:"minecraft:mossy_cobblestone_stairs",group:12},"minecraft:mossy_stone_brick_stairs":{type:"minecraft:mossy_stone_brick_stairs",item:"minecraft:mossy_stone_brick_stairs",group:12},"minecraft:mud_brick_stairs":{type:"minecraft:mud_brick_stairs",item:"minecraft:mud_brick_stairs",group:12},"minecraft:nether_brick_stairs":{type:"minecraft:nether_brick_stairs",item:"minecraft:nether_brick_stairs",group:12},"minecraft:oak_stairs":{type:"minecraft:oak_stairs",item:"minecraft:oak_stairs",group:12},"minecraft:oxidized_cut_copper_stairs":{type:"minecraft:oxidized_cut_copper_stairs",item:"minecraft:oxidized_cut_copper_stairs",group:12},"minecraft:pale_oak_stairs":{type:"minecraft:pale_oak_stairs",item:"minecraft:pale_oak_stairs",group:12},"minecraft:polished_andesite_stairs":{type:"minecraft:polished_andesite_stairs",item:"minecraft:polished_andesite_stairs",group:12},"minecraft:polished_blackstone_brick_stairs":{type:"minecraft:polished_blackstone_brick_stairs",item:"minecraft:polished_blackstone_brick_stairs",group:12},"minecraft:polished_blackstone_stairs":{type:"minecraft:polished_blackstone_stairs",item:"minecraft:polished_blackstone_stairs",group:12},"minecraft:polished_deepslate_stairs":{type:"minecraft:polished_deepslate_stairs",item:"minecraft:polished_deepslate_stairs",group:12},"minecraft:polished_diorite_stairs":{type:"minecraft:polished_diorite_stairs",item:"minecraft:polished_diorite_stairs",group:12},"minecraft:polished_granite_stairs":{type:"minecraft:polished_granite_stairs",item:"minecraft:polished_granite_stairs",group:12},"minecraft:polished_tuff_stairs":{type:"minecraft:polished_tuff_stairs",item:"minecraft:polished_tuff_stairs",group:12},"minecraft:prismarine_brick_stairs":{type:"minecraft:prismarine_brick_stairs",item:"minecraft:prismarine_brick_stairs",group:12},"minecraft:prismarine_stairs":{type:"minecraft:prismarine_stairs",item:"minecraft:prismarine_stairs",group:12},"minecraft:purpur_stairs":{type:"minecraft:purpur_stairs",item:"minecraft:purpur_stairs",group:12},"minecraft:quartz_stairs":{type:"minecraft:quartz_stairs",item:"minecraft:quartz_stairs",group:12},"minecraft:red_nether_brick_stairs":{type:"minecraft:red_nether_brick_stairs",item:"minecraft:red_nether_brick_stairs",group:12},"minecraft:red_sandstone_stairs":{type:"minecraft:red_sandstone_stairs",item:"minecraft:red_sandstone_stairs",group:12},"minecraft:sandstone_stairs":{type:"minecraft:sandstone_stairs",item:"minecraft:sandstone_stairs",group:12},"minecraft:smooth_quartz_stairs":{type:"minecraft:smooth_quartz_stairs",item:"minecraft:smooth_quartz_stairs",group:12},"minecraft:smooth_red_sandstone_stairs":{type:"minecraft:smooth_red_sandstone_stairs",item:"minecraft:smooth_red_sandstone_stairs",group:12},"minecraft:smooth_sandstone_stairs":{type:"minecraft:smooth_sandstone_stairs",item:"minecraft:smooth_sandstone_stairs",group:12},"minecraft:spruce_stairs":{type:"minecraft:spruce_stairs",item:"minecraft:spruce_stairs",group:12},"minecraft:stone_brick_stairs":{type:"minecraft:stone_brick_stairs",item:"minecraft:stone_brick_stairs",group:12},"minecraft:stone_stairs":{type:"minecraft:stone_stairs",item:"minecraft:stone_stairs",group:12},"minecraft:tuff_brick_stairs":{type:"minecraft:tuff_brick_stairs",item:"minecraft:tuff_brick_stairs",group:12},"minecraft:tuff_stairs":{type:"minecraft:tuff_stairs",item:"minecraft:tuff_stairs",group:12},"minecraft:warped_stairs":{type:"minecraft:warped_stairs",item:"minecraft:warped_stairs",group:12},"minecraft:waxed_cut_copper_stairs":{type:"minecraft:waxed_cut_copper_stairs",item:"minecraft:waxed_cut_copper_stairs",group:12},"minecraft:waxed_exposed_cut_copper_stairs":{type:"minecraft:waxed_exposed_cut_copper_stairs",item:"minecraft:waxed_exposed_cut_copper_stairs",group:12},"minecraft:waxed_oxidized_cut_copper_stairs":{type:"minecraft:waxed_oxidized_cut_copper_stairs",item:"minecraft:waxed_oxidized_cut_copper_stairs",group:12},"minecraft:waxed_weathered_cut_copper_stairs":{type:"minecraft:waxed_weathered_cut_copper_stairs",item:"minecraft:waxed_weathered_cut_copper_stairs",group:12},"minecraft:weathered_cut_copper_stairs":{type:"minecraft:weathered_cut_copper_stairs",item:"minecraft:weathered_cut_copper_stairs",group:12},"minecraft:acacia_trapdoor":{type:"minecraft:acacia_trapdoor",item:"minecraft:acacia_trapdoor",group:13},"minecraft:bamboo_trapdoor":{type:"minecraft:bamboo_trapdoor",item:"minecraft:bamboo_trapdoor",group:13},"minecraft:birch_trapdoor":{type:"minecraft:birch_trapdoor",item:"minecraft:birch_trapdoor",group:13},"minecraft:cherry_trapdoor":{type:"minecraft:cherry_trapdoor",item:"minecraft:cherry_trapdoor",group:13},"minecraft:copper_trapdoor":{type:"minecraft:copper_trapdoor",item:"minecraft:copper_trapdoor",group:13},"minecraft:crimson_trapdoor":{type:"minecraft:crimson_trapdoor",item:"minecraft:crimson_trapdoor",group:13},"minecraft:dark_oak_trapdoor":{type:"minecraft:dark_oak_trapdoor",item:"minecraft:dark_oak_trapdoor",group:13},"minecraft:exposed_copper_trapdoor":{type:"minecraft:exposed_copper_trapdoor",item:"minecraft:exposed_copper_trapdoor",group:13},"minecraft:iron_trapdoor":{type:"minecraft:iron_trapdoor",item:"minecraft:iron_trapdoor",group:13},"minecraft:jungle_trapdoor":{type:"minecraft:jungle_trapdoor",item:"minecraft:jungle_trapdoor",group:13},"minecraft:mangrove_trapdoor":{type:"minecraft:mangrove_trapdoor",item:"minecraft:mangrove_trapdoor",group:13},"minecraft:oak_trapdoor":{type:"minecraft:oak_trapdoor",item:"minecraft:oak_trapdoor",group:13},"minecraft:oxidized_copper_trapdoor":{type:"minecraft:oxidized_copper_trapdoor",item:"minecraft:oxidized_copper_trapdoor",group:13},"minecraft:pale_oak_trapdoor":{type:"minecraft:pale_oak_trapdoor",item:"minecraft:pale_oak_trapdoor",group:13},"minecraft:spruce_trapdoor":{type:"minecraft:spruce_trapdoor",item:"minecraft:spruce_trapdoor",group:13},"minecraft:warped_trapdoor":{type:"minecraft:warped_trapdoor",item:"minecraft:warped_trapdoor",group:13},"minecraft:waxed_copper_trapdoor":{type:"minecraft:waxed_copper_trapdoor",item:"minecraft:waxed_copper_trapdoor",group:13},"minecraft:waxed_exposed_copper_trapdoor":{type:"minecraft:waxed_exposed_copper_trapdoor",item:"minecraft:waxed_exposed_copper_trapdoor",group:13},"minecraft:waxed_oxidized_copper_trapdoor":{type:"minecraft:waxed_oxidized_copper_trapdoor",item:"minecraft:waxed_oxidized_copper_trapdoor",group:13},"minecraft:waxed_weathered_copper_trapdoor":{type:"minecraft:waxed_weathered_copper_trapdoor",item:"minecraft:waxed_weathered_copper_trapdoor",group:13},"minecraft:weathered_copper_trapdoor":{type:"minecraft:weathered_copper_trapdoor",item:"minecraft:weathered_copper_trapdoor",group:13},"minecraft:acacia_wall_hanging_sign":{type:"minecraft:acacia_wall_hanging_sign",item:"minecraft:acacia_hanging_sign",group:14},"minecraft:acacia_wall_sign":{type:"minecraft:acacia_wall_sign",item:"minecraft:acacia_sign",group:14},"minecraft:bamboo_wall_hanging_sign":{type:"minecraft:bamboo_wall_hanging_sign",item:"minecraft:bamboo_hanging_sign",group:14},"minecraft:bamboo_wall_sign":{type:"minecraft:bamboo_wall_sign",item:"minecraft:bamboo_sign",group:14},"minecraft:big_dripleaf_stem":{type:"minecraft:big_dripleaf_stem",item:"minecraft:big_dripleaf",group:14},"minecraft:birch_wall_hanging_sign":{type:"minecraft:birch_wall_hanging_sign",item:"minecraft:birch_hanging_sign",group:14},"minecraft:birch_wall_sign":{type:"minecraft:birch_wall_sign",item:"minecraft:birch_sign",group:14},"minecraft:cherry_wall_hanging_sign":{type:"minecraft:cherry_wall_hanging_sign",item:"minecraft:cherry_hanging_sign",group:14},"minecraft:cherry_wall_sign":{type:"minecraft:cherry_wall_sign",item:"minecraft:cherry_sign",group:14},"minecraft:crimson_wall_hanging_sign":{type:"minecraft:crimson_wall_hanging_sign",item:"minecraft:crimson_hanging_sign",group:14},"minecraft:crimson_wall_sign":{type:"minecraft:crimson_wall_sign",item:"minecraft:crimson_sign",group:14},"minecraft:dark_oak_wall_hanging_sign":{type:"minecraft:dark_oak_wall_hanging_sign",item:"minecraft:dark_oak_hanging_sign",group:14},"minecraft:dark_oak_wall_sign":{type:"minecraft:dark_oak_wall_sign",item:"minecraft:dark_oak_sign",group:14},"minecraft:ender_chest":{type:"minecraft:ender_chest",item:"minecraft:ender_chest",group:14},"minecraft:jungle_wall_hanging_sign":{type:"minecraft:jungle_wall_hanging_sign",item:"minecraft:jungle_hanging_sign",group:14},"minecraft:jungle_wall_sign":{type:"minecraft:jungle_wall_sign",item:"minecraft:jungle_sign",group:14},"minecraft:ladder":{type:"minecraft:ladder",item:"minecraft:ladder",group:14},"minecraft:mangrove_wall_hanging_sign":{type:"minecraft:mangrove_wall_hanging_sign",item:"minecraft:mangrove_hanging_sign",group:14},"minecraft:mangrove_wall_sign":{type:"minecraft:mangrove_wall_sign",item:"minecraft:mangrove_sign",group:14},"minecraft:oak_wall_hanging_sign":{type:"minecraft:oak_wall_hanging_sign",item:"minecraft:oak_hanging_sign",group:14},"minecraft:oak_wall_sign":{type:"minecraft:oak_wall_sign",item:"minecraft:oak_sign",group:14},"minecraft:pale_oak_wall_hanging_sign":{type:"minecraft:pale_oak_wall_hanging_sign",group:14},"minecraft:pale_oak_wall_sign":{type:"minecraft:pale_oak_wall_sign",group:14},"minecraft:spruce_wall_hanging_sign":{type:"minecraft:spruce_wall_hanging_sign",item:"minecraft:spruce_hanging_sign",group:14},"minecraft:spruce_wall_sign":{type:"minecraft:spruce_wall_sign",item:"minecraft:spruce_sign",group:14},"minecraft:warped_wall_hanging_sign":{type:"minecraft:warped_wall_hanging_sign",item:"minecraft:warped_hanging_sign",group:14},"minecraft:warped_wall_sign":{type:"minecraft:warped_wall_sign",item:"minecraft:warped_sign",group:14},"minecraft:activator_rail":{type:"minecraft:activator_rail",item:"minecraft:activator_rail",group:15},"minecraft:detector_rail":{type:"minecraft:detector_rail",item:"minecraft:detector_rail",group:15},"minecraft:powered_rail":{type:"minecraft:powered_rail",item:"minecraft:powered_rail",group:15},"minecraft:amethyst_cluster":{type:"minecraft:amethyst_cluster",item:"minecraft:amethyst_cluster",group:16},"minecraft:large_amethyst_bud":{type:"minecraft:large_amethyst_bud",item:"minecraft:large_amethyst_bud",group:16},"minecraft:medium_amethyst_bud":{type:"minecraft:medium_amethyst_bud",item:"minecraft:medium_amethyst_bud",group:16},"minecraft:small_amethyst_bud":{type:"minecraft:small_amethyst_bud",item:"minecraft:small_amethyst_bud",group:16},"minecraft:andesite_wall":{type:"minecraft:andesite_wall",item:"minecraft:andesite_wall",group:17},"minecraft:blackstone_wall":{type:"minecraft:blackstone_wall",item:"minecraft:blackstone_wall",group:17},"minecraft:brick_wall":{type:"minecraft:brick_wall",item:"minecraft:brick_wall",group:17},"minecraft:cobbled_deepslate_wall":{type:"minecraft:cobbled_deepslate_wall",item:"minecraft:cobbled_deepslate_wall",group:17},"minecraft:cobblestone_wall":{type:"minecraft:cobblestone_wall",item:"minecraft:cobblestone_wall",group:17},"minecraft:deepslate_brick_wall":{type:"minecraft:deepslate_brick_wall",item:"minecraft:deepslate_brick_wall",group:17},"minecraft:deepslate_tile_wall":{type:"minecraft:deepslate_tile_wall",item:"minecraft:deepslate_tile_wall",group:17},"minecraft:diorite_wall":{type:"minecraft:diorite_wall",item:"minecraft:diorite_wall",group:17},"minecraft:end_stone_brick_wall":{type:"minecraft:end_stone_brick_wall",item:"minecraft:end_stone_brick_wall",group:17},"minecraft:granite_wall":{type:"minecraft:granite_wall",item:"minecraft:granite_wall",group:17},"minecraft:mossy_cobblestone_wall":{type:"minecraft:mossy_cobblestone_wall",item:"minecraft:mossy_cobblestone_wall",group:17},"minecraft:mossy_stone_brick_wall":{type:"minecraft:mossy_stone_brick_wall",item:"minecraft:mossy_stone_brick_wall",group:17},"minecraft:mud_brick_wall":{type:"minecraft:mud_brick_wall",item:"minecraft:mud_brick_wall",group:17},"minecraft:nether_brick_wall":{type:"minecraft:nether_brick_wall",item:"minecraft:nether_brick_wall",group:17},"minecraft:polished_blackstone_brick_wall":{type:"minecraft:polished_blackstone_brick_wall",item:"minecraft:polished_blackstone_brick_wall",group:17},"minecraft:polished_blackstone_wall":{type:"minecraft:polished_blackstone_wall",item:"minecraft:polished_blackstone_wall",group:17},"minecraft:polished_deepslate_wall":{type:"minecraft:polished_deepslate_wall",item:"minecraft:polished_deepslate_wall",group:17},"minecraft:polished_tuff_wall":{type:"minecraft:polished_tuff_wall",item:"minecraft:polished_tuff_wall",group:17},"minecraft:prismarine_wall":{type:"minecraft:prismarine_wall",item:"minecraft:prismarine_wall",group:17},"minecraft:red_nether_brick_wall":{type:"minecraft:red_nether_brick_wall",item:"minecraft:red_nether_brick_wall",group:17},"minecraft:red_sandstone_wall":{type:"minecraft:red_sandstone_wall",item:"minecraft:red_sandstone_wall",group:17},"minecraft:sandstone_wall":{type:"minecraft:sandstone_wall",item:"minecraft:sandstone_wall",group:17},"minecraft:stone_brick_wall":{type:"minecraft:stone_brick_wall",item:"minecraft:stone_brick_wall",group:17},"minecraft:tuff_brick_wall":{type:"minecraft:tuff_brick_wall",item:"minecraft:tuff_brick_wall",group:17},"minecraft:tuff_wall":{type:"minecraft:tuff_wall",item:"minecraft:tuff_wall",group:17},"minecraft:anvil":{type:"minecraft:anvil",item:"minecraft:anvil",group:18},"minecraft:attached_melon_stem":{type:"minecraft:attached_melon_stem",item:"minecraft:melon_seeds",group:18},"minecraft:attached_pumpkin_stem":{type:"minecraft:attached_pumpkin_stem",item:"minecraft:melon_seeds",group:18},"minecraft:black_glazed_terracotta":{type:"minecraft:black_glazed_terracotta",item:"minecraft:black_glazed_terracotta",group:18},"minecraft:black_wall_banner":{type:"minecraft:black_wall_banner",item:"minecraft:black_banner",group:18},"minecraft:blue_glazed_terracotta":{type:"minecraft:blue_glazed_terracotta",item:"minecraft:blue_glazed_terracotta",group:18},"minecraft:blue_wall_banner":{type:"minecraft:blue_wall_banner",item:"minecraft:blue_banner",group:18},"minecraft:brown_glazed_terracotta":{type:"minecraft:brown_glazed_terracotta",item:"minecraft:brown_glazed_terracotta",group:18},"minecraft:brown_wall_banner":{type:"minecraft:brown_wall_banner",item:"minecraft:brown_banner",group:18},"minecraft:carved_pumpkin":{type:"minecraft:carved_pumpkin",item:"minecraft:carved_pumpkin",group:18},"minecraft:chipped_anvil":{type:"minecraft:chipped_anvil",item:"minecraft:chipped_anvil",group:18},"minecraft:cyan_glazed_terracotta":{type:"minecraft:cyan_glazed_terracotta",item:"minecraft:cyan_glazed_terracotta",group:18},"minecraft:cyan_wall_banner":{type:"minecraft:cyan_wall_banner",item:"minecraft:cyan_banner",group:18},"minecraft:damaged_anvil":{type:"minecraft:damaged_anvil",item:"minecraft:damaged_anvil",group:18},"minecraft:gray_glazed_terracotta":{type:"minecraft:gray_glazed_terracotta",item:"minecraft:gray_glazed_terracotta",group:18},"minecraft:gray_wall_banner":{type:"minecraft:gray_wall_banner",item:"minecraft:gray_banner",group:18},"minecraft:green_glazed_terracotta":{type:"minecraft:green_glazed_terracotta",item:"minecraft:green_glazed_terracotta",group:18},"minecraft:green_wall_banner":{type:"minecraft:green_wall_banner",item:"minecraft:green_banner",group:18},"minecraft:jack_o_lantern":{type:"minecraft:jack_o_lantern",item:"minecraft:jack_o_lantern",group:18},"minecraft:light_blue_glazed_terracotta":{type:"minecraft:light_blue_glazed_terracotta",item:"minecraft:light_blue_glazed_terracotta",group:18},"minecraft:light_blue_wall_banner":{type:"minecraft:light_blue_wall_banner",item:"minecraft:light_blue_banner",group:18},"minecraft:light_gray_glazed_terracotta":{type:"minecraft:light_gray_glazed_terracotta",item:"minecraft:light_gray_glazed_terracotta",group:18},"minecraft:light_gray_wall_banner":{type:"minecraft:light_gray_wall_banner",item:"minecraft:light_gray_banner",group:18},"minecraft:lime_glazed_terracotta":{type:"minecraft:lime_glazed_terracotta",item:"minecraft:lime_glazed_terracotta",group:18},"minecraft:lime_wall_banner":{type:"minecraft:lime_wall_banner",item:"minecraft:lime_banner",group:18},"minecraft:loom":{type:"minecraft:loom",item:"minecraft:loom",group:18},"minecraft:magenta_glazed_terracotta":{type:"minecraft:magenta_glazed_terracotta",item:"minecraft:magenta_glazed_terracotta",group:18},"minecraft:magenta_wall_banner":{type:"minecraft:magenta_wall_banner",item:"minecraft:magenta_banner",group:18},"minecraft:orange_glazed_terracotta":{type:"minecraft:orange_glazed_terracotta",item:"minecraft:orange_glazed_terracotta",group:18},"minecraft:orange_wall_banner":{type:"minecraft:orange_wall_banner",item:"minecraft:orange_banner",group:18},"minecraft:pink_glazed_terracotta":{type:"minecraft:pink_glazed_terracotta",item:"minecraft:pink_glazed_terracotta",group:18},"minecraft:pink_wall_banner":{type:"minecraft:pink_wall_banner",item:"minecraft:pink_banner",group:18},"minecraft:purple_glazed_terracotta":{type:"minecraft:purple_glazed_terracotta",item:"minecraft:purple_glazed_terracotta",group:18},"minecraft:purple_wall_banner":{type:"minecraft:purple_wall_banner",item:"minecraft:purple_banner",group:18},"minecraft:red_glazed_terracotta":{type:"minecraft:red_glazed_terracotta",item:"minecraft:red_glazed_terracotta",group:18},"minecraft:red_wall_banner":{type:"minecraft:red_wall_banner",item:"minecraft:red_banner",group:18},"minecraft:soul_wall_torch":{type:"minecraft:soul_wall_torch",item:"minecraft:soul_torch",group:18},"minecraft:stonecutter":{type:"minecraft:stonecutter",item:"minecraft:stonecutter",group:18},"minecraft:wall_torch":{type:"minecraft:wall_torch",item:"minecraft:torch",group:18},"minecraft:white_glazed_terracotta":{type:"minecraft:white_glazed_terracotta",item:"minecraft:white_glazed_terracotta",group:18},"minecraft:white_wall_banner":{type:"minecraft:white_wall_banner",item:"minecraft:white_banner",group:18},"minecraft:yellow_glazed_terracotta":{type:"minecraft:yellow_glazed_terracotta",item:"minecraft:yellow_glazed_terracotta",group:18},"minecraft:yellow_wall_banner":{type:"minecraft:yellow_wall_banner",item:"minecraft:yellow_banner",group:18},"minecraft:bamboo":{type:"minecraft:bamboo",item:"minecraft:bamboo",group:19},"minecraft:barrel":{type:"minecraft:barrel",item:"minecraft:barrel",group:20},"minecraft:barrier":{type:"minecraft:barrier",item:"minecraft:barrier",group:21},"minecraft:copper_grate":{type:"minecraft:copper_grate",item:"minecraft:copper_grate",group:21},"minecraft:exposed_copper_grate":{type:"minecraft:exposed_copper_grate",item:"minecraft:exposed_copper_grate",group:21},"minecraft:hanging_roots":{type:"minecraft:hanging_roots",item:"minecraft:hanging_roots",group:21},"minecraft:heavy_core":{type:"minecraft:heavy_core",item:"minecraft:heavy_core",group:21},"minecraft:mangrove_roots":{type:"minecraft:mangrove_roots",item:"minecraft:mangrove_roots",group:21},"minecraft:oxidized_copper_grate":{type:"minecraft:oxidized_copper_grate",item:"minecraft:oxidized_copper_grate",group:21},"minecraft:waxed_copper_grate":{type:"minecraft:waxed_copper_grate",item:"minecraft:waxed_copper_grate",group:21},"minecraft:waxed_exposed_copper_grate":{type:"minecraft:waxed_exposed_copper_grate",item:"minecraft:waxed_exposed_copper_grate",group:21},"minecraft:waxed_oxidized_copper_grate":{type:"minecraft:waxed_oxidized_copper_grate",item:"minecraft:waxed_oxidized_copper_grate",group:21},"minecraft:waxed_weathered_copper_grate":{type:"minecraft:waxed_weathered_copper_grate",item:"minecraft:waxed_weathered_copper_grate",group:21},"minecraft:weathered_copper_grate":{type:"minecraft:weathered_copper_grate",item:"minecraft:weathered_copper_grate",group:21},"minecraft:bee_nest":{type:"minecraft:bee_nest",item:"minecraft:bee_nest",group:22},"minecraft:beehive":{type:"minecraft:beehive",item:"minecraft:beehive",group:22},"minecraft:beetroots":{type:"minecraft:beetroots",item:"minecraft:beetroot_seeds",group:23},"minecraft:frosted_ice":{type:"minecraft:frosted_ice",group:23},"minecraft:nether_wart":{type:"minecraft:nether_wart",item:"minecraft:nether_wart",group:23},"minecraft:sweet_berry_bush":{type:"minecraft:sweet_berry_bush",item:"minecraft:sweet_berries",group:23},"minecraft:bell":{type:"minecraft:bell",item:"minecraft:bell",group:24},"minecraft:big_dripleaf":{type:"minecraft:big_dripleaf",item:"minecraft:big_dripleaf",group:25},"minecraft:black_banner":{type:"minecraft:black_banner",item:"minecraft:black_banner",group:26},"minecraft:blue_banner":{type:"minecraft:blue_banner",item:"minecraft:blue_banner",group:26},"minecraft:brown_banner":{type:"minecraft:brown_banner",item:"minecraft:brown_banner",group:26},"minecraft:cyan_banner":{type:"minecraft:cyan_banner",item:"minecraft:cyan_banner",group:26},"minecraft:gray_banner":{type:"minecraft:gray_banner",item:"minecraft:gray_banner",group:26},"minecraft:green_banner":{type:"minecraft:green_banner",item:"minecraft:green_banner",group:26},"minecraft:light_blue_banner":{type:"minecraft:light_blue_banner",item:"minecraft:light_blue_banner",group:26},"minecraft:light_gray_banner":{type:"minecraft:light_gray_banner",item:"minecraft:light_gray_banner",group:26},"minecraft:lime_banner":{type:"minecraft:lime_banner",item:"minecraft:lime_banner",group:26},"minecraft:magenta_banner":{type:"minecraft:magenta_banner",item:"minecraft:magenta_banner",group:26},"minecraft:orange_banner":{type:"minecraft:orange_banner",item:"minecraft:orange_banner",group:26},"minecraft:pink_banner":{type:"minecraft:pink_banner",item:"minecraft:pink_banner",group:26},"minecraft:purple_banner":{type:"minecraft:purple_banner",item:"minecraft:purple_banner",group:26},"minecraft:red_banner":{type:"minecraft:red_banner",item:"minecraft:red_banner",group:26},"minecraft:white_banner":{type:"minecraft:white_banner",item:"minecraft:white_banner",group:26},"minecraft:yellow_banner":{type:"minecraft:yellow_banner",item:"minecraft:yellow_banner",group:26},"minecraft:black_bed":{type:"minecraft:black_bed",item:"minecraft:black_bed",group:27},"minecraft:blue_bed":{type:"minecraft:blue_bed",item:"minecraft:blue_bed",group:27},"minecraft:brown_bed":{type:"minecraft:brown_bed",item:"minecraft:brown_bed",group:27},"minecraft:cyan_bed":{type:"minecraft:cyan_bed",item:"minecraft:cyan_bed",group:27},"minecraft:gray_bed":{type:"minecraft:gray_bed",item:"minecraft:gray_bed",group:27},"minecraft:green_bed":{type:"minecraft:green_bed",item:"minecraft:green_bed",group:27},"minecraft:light_blue_bed":{type:"minecraft:light_blue_bed",item:"minecraft:light_blue_bed",group:27},"minecraft:light_gray_bed":{type:"minecraft:light_gray_bed",item:"minecraft:light_gray_bed",group:27},"minecraft:lime_bed":{type:"minecraft:lime_bed",item:"minecraft:lime_bed",group:27},"minecraft:magenta_bed":{type:"minecraft:magenta_bed",item:"minecraft:magenta_bed",group:27},"minecraft:orange_bed":{type:"minecraft:orange_bed",item:"minecraft:orange_bed",group:27},"minecraft:pink_bed":{type:"minecraft:pink_bed",item:"minecraft:pink_bed",group:27},"minecraft:purple_bed":{type:"minecraft:purple_bed",item:"minecraft:purple_bed",group:27},"minecraft:red_bed":{type:"minecraft:red_bed",item:"minecraft:red_bed",group:27},"minecraft:white_bed":{type:"minecraft:white_bed",item:"minecraft:white_bed",group:27},"minecraft:yellow_bed":{type:"minecraft:yellow_bed",item:"minecraft:yellow_bed",group:27},"minecraft:black_candle":{type:"minecraft:black_candle",item:"minecraft:black_candle",group:28},"minecraft:blue_candle":{type:"minecraft:blue_candle",item:"minecraft:blue_candle",group:28},"minecraft:brown_candle":{type:"minecraft:brown_candle",item:"minecraft:brown_candle",group:28},"minecraft:candle":{type:"minecraft:candle",item:"minecraft:candle",group:28},"minecraft:cyan_candle":{type:"minecraft:cyan_candle",item:"minecraft:cyan_candle",group:28},"minecraft:gray_candle":{type:"minecraft:gray_candle",item:"minecraft:gray_candle",group:28},"minecraft:green_candle":{type:"minecraft:green_candle",item:"minecraft:green_candle",group:28},"minecraft:light_blue_candle":{type:"minecraft:light_blue_candle",item:"minecraft:light_blue_candle",group:28},"minecraft:light_gray_candle":{type:"minecraft:light_gray_candle",item:"minecraft:light_gray_candle",group:28},"minecraft:lime_candle":{type:"minecraft:lime_candle",item:"minecraft:lime_candle",group:28},"minecraft:magenta_candle":{type:"minecraft:magenta_candle",item:"minecraft:magenta_candle",group:28},"minecraft:orange_candle":{type:"minecraft:orange_candle",item:"minecraft:orange_candle",group:28},"minecraft:pink_candle":{type:"minecraft:pink_candle",item:"minecraft:pink_candle",group:28},"minecraft:purple_candle":{type:"minecraft:purple_candle",item:"minecraft:purple_candle",group:28},"minecraft:red_candle":{type:"minecraft:red_candle",item:"minecraft:red_candle",group:28},"minecraft:white_candle":{type:"minecraft:white_candle",item:"minecraft:white_candle",group:28},"minecraft:yellow_candle":{type:"minecraft:yellow_candle",item:"minecraft:yellow_candle",group:28},"minecraft:black_candle_cake":{type:"minecraft:black_candle_cake",group:29},"minecraft:blue_candle_cake":{type:"minecraft:blue_candle_cake",group:29},"minecraft:brown_candle_cake":{type:"minecraft:brown_candle_cake",group:29},"minecraft:candle_cake":{type:"minecraft:candle_cake",group:29},"minecraft:cyan_candle_cake":{type:"minecraft:cyan_candle_cake",group:29},"minecraft:deepslate_redstone_ore":{type:"minecraft:deepslate_redstone_ore",item:"minecraft:deepslate_redstone_ore",group:29},"minecraft:gray_candle_cake":{type:"minecraft:gray_candle_cake",group:29},"minecraft:green_candle_cake":{type:"minecraft:green_candle_cake",group:29},"minecraft:light_blue_candle_cake":{type:"minecraft:light_blue_candle_cake",group:29},"minecraft:light_gray_candle_cake":{type:"minecraft:light_gray_candle_cake",group:29},"minecraft:lime_candle_cake":{type:"minecraft:lime_candle_cake",group:29},"minecraft:magenta_candle_cake":{type:"minecraft:magenta_candle_cake",group:29},"minecraft:orange_candle_cake":{type:"minecraft:orange_candle_cake",group:29},"minecraft:pink_candle_cake":{type:"minecraft:pink_candle_cake",group:29},"minecraft:purple_candle_cake":{type:"minecraft:purple_candle_cake",group:29},"minecraft:red_candle_cake":{type:"minecraft:red_candle_cake",group:29},"minecraft:redstone_lamp":{type:"minecraft:redstone_lamp",item:"minecraft:redstone_lamp",group:29},"minecraft:redstone_ore":{type:"minecraft:redstone_ore",item:"minecraft:redstone_ore",group:29},"minecraft:white_candle_cake":{type:"minecraft:white_candle_cake",group:29},"minecraft:yellow_candle_cake":{type:"minecraft:yellow_candle_cake",group:29},"minecraft:black_shulker_box":{type:"minecraft:black_shulker_box",item:"minecraft:black_shulker_box",group:30},"minecraft:blue_shulker_box":{type:"minecraft:blue_shulker_box",item:"minecraft:blue_shulker_box",group:30},"minecraft:brown_shulker_box":{type:"minecraft:brown_shulker_box",item:"minecraft:brown_shulker_box",group:30},"minecraft:cyan_shulker_box":{type:"minecraft:cyan_shulker_box",item:"minecraft:cyan_shulker_box",group:30},"minecraft:end_rod":{type:"minecraft:end_rod",item:"minecraft:end_rod",group:30},"minecraft:gray_shulker_box":{type:"minecraft:gray_shulker_box",item:"minecraft:gray_shulker_box",group:30},"minecraft:green_shulker_box":{type:"minecraft:green_shulker_box",item:"minecraft:green_shulker_box",group:30},"minecraft:light_blue_shulker_box":{type:"minecraft:light_blue_shulker_box",item:"minecraft:light_blue_shulker_box",group:30},"minecraft:light_gray_shulker_box":{type:"minecraft:light_gray_shulker_box",item:"minecraft:light_gray_shulker_box",group:30},"minecraft:lime_shulker_box":{type:"minecraft:lime_shulker_box",item:"minecraft:lime_shulker_box",group:30},"minecraft:magenta_shulker_box":{type:"minecraft:magenta_shulker_box",item:"minecraft:magenta_shulker_box",group:30},"minecraft:orange_shulker_box":{type:"minecraft:orange_shulker_box",item:"minecraft:orange_shulker_box",group:30},"minecraft:pink_shulker_box":{type:"minecraft:pink_shulker_box",item:"minecraft:pink_shulker_box",group:30},"minecraft:purple_shulker_box":{type:"minecraft:purple_shulker_box",item:"minecraft:purple_shulker_box",group:30},"minecraft:red_shulker_box":{type:"minecraft:red_shulker_box",item:"minecraft:red_shulker_box",group:30},"minecraft:shulker_box":{type:"minecraft:shulker_box",item:"minecraft:shulker_box",group:30},"minecraft:white_shulker_box":{type:"minecraft:white_shulker_box",item:"minecraft:white_shulker_box",group:30},"minecraft:yellow_shulker_box":{type:"minecraft:yellow_shulker_box",item:"minecraft:yellow_shulker_box",group:30},"minecraft:blast_furnace":{type:"minecraft:blast_furnace",item:"minecraft:blast_furnace",group:31},"minecraft:furnace":{type:"minecraft:furnace",item:"minecraft:furnace",group:31},"minecraft:smoker":{type:"minecraft:smoker",item:"minecraft:smoker",group:31},"minecraft:brain_coral":{type:"minecraft:brain_coral",item:"minecraft:brain_coral",group:32},"minecraft:brain_coral_fan":{type:"minecraft:brain_coral_fan",item:"minecraft:brain_coral_fan",group:32},"minecraft:bubble_coral":{type:"minecraft:bubble_coral",item:"minecraft:bubble_coral",group:32},"minecraft:bubble_coral_fan":{type:"minecraft:bubble_coral_fan",item:"minecraft:bubble_coral_fan",group:32},"minecraft:conduit":{type:"minecraft:conduit",item:"minecraft:conduit",group:32},"minecraft:dead_brain_coral":{type:"minecraft:dead_brain_coral",item:"minecraft:dead_brain_coral",group:32},"minecraft:dead_brain_coral_fan":{type:"minecraft:dead_brain_coral_fan",item:"minecraft:dead_brain_coral_fan",group:32},"minecraft:dead_bubble_coral":{type:"minecraft:dead_bubble_coral",item:"minecraft:dead_bubble_coral",group:32},"minecraft:dead_bubble_coral_fan":{type:"minecraft:dead_bubble_coral_fan",item:"minecraft:dead_bubble_coral_fan",group:32},"minecraft:dead_fire_coral":{type:"minecraft:dead_fire_coral",item:"minecraft:dead_fire_coral",group:32},"minecraft:dead_fire_coral_fan":{type:"minecraft:dead_fire_coral_fan",item:"minecraft:dead_fire_coral_fan",group:32},"minecraft:dead_horn_coral":{type:"minecraft:dead_horn_coral",item:"minecraft:dead_horn_coral",group:32},"minecraft:dead_horn_coral_fan":{type:"minecraft:dead_horn_coral_fan",item:"minecraft:dead_horn_coral_fan",group:32},"minecraft:dead_tube_coral":{type:"minecraft:dead_tube_coral",item:"minecraft:dead_tube_coral",group:32},"minecraft:dead_tube_coral_fan":{type:"minecraft:dead_tube_coral_fan",item:"minecraft:dead_tube_coral_fan",group:32},"minecraft:fire_coral":{type:"minecraft:fire_coral",item:"minecraft:fire_coral",group:32},"minecraft:fire_coral_fan":{type:"minecraft:fire_coral_fan",item:"minecraft:fire_coral_fan",group:32},"minecraft:horn_coral":{type:"minecraft:horn_coral",item:"minecraft:horn_coral",group:32},"minecraft:horn_coral_fan":{type:"minecraft:horn_coral_fan",item:"minecraft:horn_coral_fan",group:32},"minecraft:tube_coral":{type:"minecraft:tube_coral",item:"minecraft:tube_coral",group:32},"minecraft:tube_coral_fan":{type:"minecraft:tube_coral_fan",item:"minecraft:tube_coral_fan",group:32},"minecraft:brain_coral_wall_fan":{type:"minecraft:brain_coral_wall_fan",item:"minecraft:brain_coral_fan",group:33},"minecraft:bubble_coral_wall_fan":{type:"minecraft:bubble_coral_wall_fan",item:"minecraft:bubble_coral_fan",group:33},"minecraft:dead_brain_coral_wall_fan":{type:"minecraft:dead_brain_coral_wall_fan",item:"minecraft:dead_brain_coral_fan",group:33},"minecraft:dead_bubble_coral_wall_fan":{type:"minecraft:dead_bubble_coral_wall_fan",item:"minecraft:dead_bubble_coral_fan",group:33},"minecraft:dead_fire_coral_wall_fan":{type:"minecraft:dead_fire_coral_wall_fan",item:"minecraft:dead_fire_coral_fan",group:33},"minecraft:dead_horn_coral_wall_fan":{type:"minecraft:dead_horn_coral_wall_fan",item:"minecraft:dead_horn_coral_fan",group:33},"minecraft:dead_tube_coral_wall_fan":{type:"minecraft:dead_tube_coral_wall_fan",item:"minecraft:dead_tube_coral_fan",group:33},"minecraft:fire_coral_wall_fan":{type:"minecraft:fire_coral_wall_fan",item:"minecraft:fire_coral_fan",group:33},"minecraft:horn_coral_wall_fan":{type:"minecraft:horn_coral_wall_fan",item:"minecraft:horn_coral_fan",group:33},"minecraft:tube_coral_wall_fan":{type:"minecraft:tube_coral_wall_fan",item:"minecraft:tube_coral_fan",group:33},"minecraft:brewing_stand":{type:"minecraft:brewing_stand",item:"minecraft:brewing_stand",group:34},"minecraft:brown_mushroom_block":{type:"minecraft:brown_mushroom_block",item:"minecraft:brown_mushroom_block",group:35},"minecraft:mushroom_stem":{type:"minecraft:mushroom_stem",item:"minecraft:mushroom_stem",group:35},"minecraft:red_mushroom_block":{type:"minecraft:red_mushroom_block",item:"minecraft:red_mushroom_block",group:35},"minecraft:bubble_column":{type:"minecraft:bubble_column",group:36},"minecraft:cactus":{type:"minecraft:cactus",item:"minecraft:cactus",group:37},"minecraft:sugar_cane":{type:"minecraft:sugar_cane",item:"minecraft:sugar_cane",group:37},"minecraft:cake":{type:"minecraft:cake",item:"minecraft:cake",group:38},"minecraft:calibrated_sculk_sensor":{type:"minecraft:calibrated_sculk_sensor",item:"minecraft:calibrated_sculk_sensor",group:39},"minecraft:campfire":{type:"minecraft:campfire",item:"minecraft:campfire",group:40},"minecraft:soul_campfire":{type:"minecraft:soul_campfire",item:"minecraft:soul_campfire",group:40},"minecraft:carrots":{type:"minecraft:carrots",item:"minecraft:carrot",group:41},"minecraft:melon_stem":{type:"minecraft:melon_stem",item:"minecraft:pumpkin_seeds",group:41},"minecraft:potatoes":{type:"minecraft:potatoes",item:"minecraft:potato",group:41},"minecraft:pumpkin_stem":{type:"minecraft:pumpkin_stem",item:"minecraft:pumpkin_seeds",group:41},"minecraft:wheat":{type:"minecraft:wheat",item:"minecraft:wheat_seeds",group:41},"minecraft:cave_vines":{type:"minecraft:cave_vines",item:"minecraft:glow_berries",group:42},"minecraft:cave_vines_plant":{type:"minecraft:cave_vines_plant",item:"minecraft:glow_berries",group:43},"minecraft:chain":{type:"minecraft:chain",item:"minecraft:chain",group:44},"minecraft:chain_command_block":{type:"minecraft:chain_command_block",item:"minecraft:chain_command_block",group:45},"minecraft:command_block":{type:"minecraft:command_block",item:"minecraft:command_block",group:45},"minecraft:repeating_command_block":{type:"minecraft:repeating_command_block",item:"minecraft:repeating_command_block",group:45},"minecraft:chest":{type:"minecraft:chest",item:"minecraft:chest",group:46},"minecraft:trapped_chest":{type:"minecraft:trapped_chest",item:"minecraft:trapped_chest",group:46},"minecraft:chiseled_bookshelf":{type:"minecraft:chiseled_bookshelf",item:"minecraft:chiseled_bookshelf",group:47},"minecraft:chorus_flower":{type:"minecraft:chorus_flower",item:"minecraft:chorus_flower",group:48},"minecraft:chorus_plant":{type:"minecraft:chorus_plant",item:"minecraft:chorus_plant",group:49},"minecraft:cocoa":{type:"minecraft:cocoa",item:"minecraft:cocoa_beans",group:50},"minecraft:comparator":{type:"minecraft:comparator",item:"minecraft:comparator",group:51},"minecraft:composter":{type:"minecraft:composter",item:"minecraft:composter",group:52},"minecraft:copper_bulb":{type:"minecraft:copper_bulb",item:"minecraft:copper_bulb",group:53},"minecraft:exposed_copper_bulb":{type:"minecraft:exposed_copper_bulb",item:"minecraft:exposed_copper_bulb",group:53},"minecraft:oxidized_copper_bulb":{type:"minecraft:oxidized_copper_bulb",item:"minecraft:oxidized_copper_bulb",group:53},"minecraft:waxed_copper_bulb":{type:"minecraft:waxed_copper_bulb",item:"minecraft:waxed_copper_bulb",group:53},"minecraft:waxed_exposed_copper_bulb":{type:"minecraft:waxed_exposed_copper_bulb",item:"minecraft:waxed_exposed_copper_bulb",group:53},"minecraft:waxed_oxidized_copper_bulb":{type:"minecraft:waxed_oxidized_copper_bulb",item:"minecraft:waxed_oxidized_copper_bulb",group:53},"minecraft:waxed_weathered_copper_bulb":{type:"minecraft:waxed_weathered_copper_bulb",item:"minecraft:waxed_weathered_copper_bulb",group:53},"minecraft:weathered_copper_bulb":{type:"minecraft:weathered_copper_bulb",item:"minecraft:weathered_copper_bulb",group:53},"minecraft:crafter":{type:"minecraft:crafter",item:"minecraft:crafter",group:54},"minecraft:creaking_heart":{type:"minecraft:creaking_heart",item:"minecraft:creaking_heart",group:55},"minecraft:creeper_head":{type:"minecraft:creeper_head",item:"minecraft:creeper_head",group:56},"minecraft:dragon_head":{type:"minecraft:dragon_head",item:"minecraft:dragon_head",group:56},"minecraft:piglin_head":{type:"minecraft:piglin_head",item:"minecraft:piglin_head",group:56},"minecraft:player_head":{type:"minecraft:player_head",item:"minecraft:player_head",group:56},"minecraft:skeleton_skull":{type:"minecraft:skeleton_skull",item:"minecraft:skeleton_skull",group:56},"minecraft:wither_skeleton_skull":{type:"minecraft:wither_skeleton_skull",item:"minecraft:wither_skeleton_skull",group:56},"minecraft:zombie_head":{type:"minecraft:zombie_head",item:"minecraft:zombie_head",group:56},"minecraft:creeper_wall_head":{type:"minecraft:creeper_wall_head",item:"minecraft:creeper_head",group:57},"minecraft:dragon_wall_head":{type:"minecraft:dragon_wall_head",item:"minecraft:dragon_head",group:57},"minecraft:piglin_wall_head":{type:"minecraft:piglin_wall_head",item:"minecraft:piglin_head",group:57},"minecraft:player_wall_head":{type:"minecraft:player_wall_head",item:"minecraft:player_head",group:57},"minecraft:skeleton_wall_skull":{type:"minecraft:skeleton_wall_skull",item:"minecraft:skeleton_skull",group:57},"minecraft:wither_skeleton_wall_skull":{type:"minecraft:wither_skeleton_wall_skull",item:"minecraft:wither_skeleton_skull",group:57},"minecraft:zombie_wall_head":{type:"minecraft:zombie_wall_head",item:"minecraft:zombie_head",group:57},"minecraft:daylight_detector":{type:"minecraft:daylight_detector",item:"minecraft:daylight_detector",group:58},"minecraft:decorated_pot":{type:"minecraft:decorated_pot",item:"minecraft:decorated_pot",group:59},"minecraft:dispenser":{type:"minecraft:dispenser",item:"minecraft:dispenser",group:60},"minecraft:dropper":{type:"minecraft:dropper",item:"minecraft:dropper",group:60},"minecraft:end_portal_frame":{type:"minecraft:end_portal_frame",item:"minecraft:end_portal_frame",group:61},"minecraft:farmland":{type:"minecraft:farmland",item:"minecraft:farmland",group:62},"minecraft:fire":{type:"minecraft:fire",group:63},"minecraft:glow_lichen":{type:"minecraft:glow_lichen",item:"minecraft:glow_lichen",group:64},"minecraft:sculk_vein":{type:"minecraft:sculk_vein",item:"minecraft:sculk_vein",group:64},"minecraft:grass_block":{type:"minecraft:grass_block",item:"minecraft:grass_block",group:65},"minecraft:mycelium":{type:"minecraft:mycelium",item:"minecraft:mycelium",group:65},"minecraft:podzol":{type:"minecraft:podzol",item:"minecraft:podzol",group:65},"minecraft:grindstone":{type:"minecraft:grindstone",item:"minecraft:grindstone",group:66},"minecraft:heavy_weighted_pressure_plate":{type:"minecraft:heavy_weighted_pressure_plate",item:"minecraft:heavy_weighted_pressure_plate",group:67},"minecraft:light_weighted_pressure_plate":{type:"minecraft:light_weighted_pressure_plate",item:"minecraft:light_weighted_pressure_plate",group:67},"minecraft:target":{type:"minecraft:target",item:"minecraft:target",group:67},"minecraft:hopper":{type:"minecraft:hopper",item:"minecraft:hopper",group:68},"minecraft:jigsaw":{type:"minecraft:jigsaw",item:"minecraft:jigsaw",group:69},"minecraft:jukebox":{type:"minecraft:jukebox",item:"minecraft:jukebox",group:70},"minecraft:kelp":{type:"minecraft:kelp",item:"minecraft:kelp",group:71},"minecraft:twisting_vines":{type:"minecraft:twisting_vines",item:"minecraft:twisting_vines",group:71},"minecraft:weeping_vines":{type:"minecraft:weeping_vines",item:"minecraft:weeping_vines",group:71},"minecraft:lantern":{type:"minecraft:lantern",item:"minecraft:lantern",group:72},"minecraft:soul_lantern":{type:"minecraft:soul_lantern",item:"minecraft:soul_lantern",group:72},"minecraft:large_fern":{type:"minecraft:large_fern",item:"minecraft:large_fern",group:73},"minecraft:lilac":{type:"minecraft:lilac",item:"minecraft:lilac",group:73},"minecraft:peony":{type:"minecraft:peony",item:"minecraft:peony",group:73},"minecraft:pitcher_plant":{type:"minecraft:pitcher_plant",item:"minecraft:pitcher_plant",group:73},"minecraft:rose_bush":{type:"minecraft:rose_bush",item:"minecraft:rose_bush",group:73},"minecraft:sunflower":{type:"minecraft:sunflower",item:"minecraft:sunflower",group:73},"minecraft:tall_grass":{type:"minecraft:tall_grass",item:"minecraft:tall_grass",group:73},"minecraft:tall_seagrass":{type:"minecraft:tall_seagrass",group:73},"minecraft:lava":{type:"minecraft:lava",item:"minecraft:lava_bucket",group:74},"minecraft:water":{type:"minecraft:water",item:"minecraft:water_bucket",group:74},"minecraft:lectern":{type:"minecraft:lectern",item:"minecraft:lectern",group:75},"minecraft:light":{type:"minecraft:light",item:"minecraft:light",group:76},"minecraft:lightning_rod":{type:"minecraft:lightning_rod",item:"minecraft:lightning_rod",group:77},"minecraft:mangrove_propagule":{type:"minecraft:mangrove_propagule",item:"minecraft:mangrove_propagule",group:78},"minecraft:moving_piston":{type:"minecraft:moving_piston",group:79},"minecraft:nether_portal":{type:"minecraft:nether_portal",group:80},"minecraft:note_block":{type:"minecraft:note_block",item:"minecraft:note_block",group:81},"minecraft:observer":{type:"minecraft:observer",item:"minecraft:observer",group:82},"minecraft:pale_hanging_moss":{type:"minecraft:pale_hanging_moss",item:"minecraft:pale_hanging_moss",group:83},"minecraft:pale_moss_carpet":{type:"minecraft:pale_moss_carpet",item:"minecraft:pale_moss_carpet",group:84},"minecraft:pink_petals":{type:"minecraft:pink_petals",item:"minecraft:pink_petals",group:85},"minecraft:piston":{type:"minecraft:piston",item:"minecraft:piston",group:86},"minecraft:sticky_piston":{type:"minecraft:sticky_piston",item:"minecraft:sticky_piston",group:86},"minecraft:piston_head":{type:"minecraft:piston_head",group:87},"minecraft:pitcher_crop":{type:"minecraft:pitcher_crop",item:"minecraft:pitcher_pod",group:88},"minecraft:pointed_dripstone":{type:"minecraft:pointed_dripstone",item:"minecraft:pointed_dripstone",group:89},"minecraft:powder_snow_cauldron":{type:"minecraft:powder_snow_cauldron",item:"minecraft:cauldron",group:90},"minecraft:water_cauldron":{type:"minecraft:water_cauldron",item:"minecraft:cauldron",group:90},"minecraft:rail":{type:"minecraft:rail",item:"minecraft:rail",group:91},"minecraft:redstone_torch":{type:"minecraft:redstone_torch",item:"minecraft:redstone_torch",group:92},"minecraft:redstone_wall_torch":{type:"minecraft:redstone_wall_torch",item:"minecraft:redstone_torch",group:93},"minecraft:redstone_wire":{type:"minecraft:redstone_wire",item:"minecraft:redstone",group:94},"minecraft:repeater":{type:"minecraft:repeater",item:"minecraft:repeater",group:95},"minecraft:respawn_anchor":{type:"minecraft:respawn_anchor",item:"minecraft:respawn_anchor",group:96},"minecraft:scaffolding":{type:"minecraft:scaffolding",item:"minecraft:scaffolding",group:97},"minecraft:sculk_catalyst":{type:"minecraft:sculk_catalyst",item:"minecraft:sculk_catalyst",group:98},"minecraft:sculk_sensor":{type:"minecraft:sculk_sensor",item:"minecraft:sculk_sensor",group:99},"minecraft:sculk_shrieker":{type:"minecraft:sculk_shrieker",item:"minecraft:sculk_shrieker",group:100},"minecraft:sea_pickle":{type:"minecraft:sea_pickle",item:"minecraft:sea_pickle",group:101},"minecraft:small_dripleaf":{type:"minecraft:small_dripleaf",item:"minecraft:small_dripleaf",group:102},"minecraft:sniffer_egg":{type:"minecraft:sniffer_egg",item:"minecraft:sniffer_egg",group:103},"minecraft:snow":{type:"minecraft:snow",item:"minecraft:snow",group:104},"minecraft:structure_block":{type:"minecraft:structure_block",item:"minecraft:structure_block",group:105},"minecraft:suspicious_gravel":{type:"minecraft:suspicious_gravel",item:"minecraft:suspicious_gravel",group:106},"minecraft:suspicious_sand":{type:"minecraft:suspicious_sand",item:"minecraft:suspicious_sand",group:106},"minecraft:tnt":{type:"minecraft:tnt",item:"minecraft:tnt",group:107},"minecraft:torchflower_crop":{type:"minecraft:torchflower_crop",item:"minecraft:torchflower_seeds",group:108},"minecraft:trial_spawner":{type:"minecraft:trial_spawner",item:"minecraft:trial_spawner",group:109},"minecraft:tripwire":{type:"minecraft:tripwire",item:"minecraft:string",group:110},"minecraft:tripwire_hook":{type:"minecraft:tripwire_hook",item:"minecraft:tripwire_hook",group:111},"minecraft:turtle_egg":{type:"minecraft:turtle_egg",item:"minecraft:turtle_egg",group:112},"minecraft:vault":{type:"minecraft:vault",item:"minecraft:vault",group:113},"minecraft:vine":{type:"minecraft:vine",item:"minecraft:vine",group:114}}
diff --git a/datapacks/Bookshelf/data/bs.block/function/match/check.mcfunction b/datapacks/Bookshelf/data/bs.block/function/match/check.mcfunction
deleted file mode 100644
index b2d7621e4e..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/match/check.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$return run execute if block ~ ~ ~ $(block)
diff --git a/datapacks/Bookshelf/data/bs.block/function/match/match.mcfunction b/datapacks/Bookshelf/data/bs.block/function/match/match.mcfunction
deleted file mode 100644
index bd20e5a5da..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/match/match.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#match
-# ------------------------------------------------------------------------------------------------------------
-
-return run function bs.block:match/check with storage bs:in block.match
diff --git a/datapacks/Bookshelf/data/bs.block/function/produce/block_display/run.mcfunction b/datapacks/Bookshelf/data/bs.block/function/produce/block_display/run.mcfunction
deleted file mode 100644
index c53312d89c..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/produce/block_display/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$summon minecraft:block_display ~ ~ ~ $(_)
diff --git a/datapacks/Bookshelf/data/bs.block/function/produce/block_particle/emit_block_particle.mcfunction b/datapacks/Bookshelf/data/bs.block/function/produce/block_particle/emit_block_particle.mcfunction
deleted file mode 100644
index 881c7550c3..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/produce/block_particle/emit_block_particle.mcfunction
+++ /dev/null
@@ -1,25 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#produce
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx _ set value {}
-data modify storage bs:ctx _.name set from storage bs:in block.emit_block_particle.type
-data modify storage bs:ctx _.properties set from storage bs:in block.emit_block_particle.properties
-data modify storage bs:ctx _.delta set from storage bs:in block.emit_block_particle.delta
-data modify storage bs:ctx _.speed set from storage bs:in block.emit_block_particle.speed
-data modify storage bs:ctx _.count set from storage bs:in block.emit_block_particle.count
-
-function bs.block:produce/block_particle/run with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.block/function/produce/block_particle/run.mcfunction b/datapacks/Bookshelf/data/bs.block/function/produce/block_particle/run.mcfunction
deleted file mode 100644
index 7dabda4fe7..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/produce/block_particle/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$particle block{block_state: { Name: "$(name)", Properties: $(properties) }} ~ ~ ~ $(delta) $(speed) $(count)
\ No newline at end of file
diff --git a/datapacks/Bookshelf/data/bs.block/function/produce/falling_block/run.mcfunction b/datapacks/Bookshelf/data/bs.block/function/produce/falling_block/run.mcfunction
deleted file mode 100644
index ea199807d1..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/produce/falling_block/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$summon minecraft:falling_block ~ ~ ~ $(_)
diff --git a/datapacks/Bookshelf/data/bs.block/function/set/run.mcfunction b/datapacks/Bookshelf/data/bs.block/function/set/run.mcfunction
deleted file mode 100644
index b3281f3aaa..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/set/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$return run setblock ~ ~ ~ $(block) $(mode)
diff --git a/datapacks/Bookshelf/data/bs.block/function/set/set_block.mcfunction b/datapacks/Bookshelf/data/bs.block/function/set/set_block.mcfunction
deleted file mode 100644
index 40e6ec8d66..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/set/set_block.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#set
-# ------------------------------------------------------------------------------------------------------------
-
-execute unless data storage bs:in block.set_block.mode run data modify storage bs:in block.set_block.mode set value "replace"
-return run function bs.block:set/run with storage bs:in block.set_block
diff --git a/datapacks/Bookshelf/data/bs.block/function/set/set_type.mcfunction b/datapacks/Bookshelf/data/bs.block/function/set/set_type.mcfunction
deleted file mode 100644
index 2e8d0aebd1..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/set/set_type.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#set
-# ------------------------------------------------------------------------------------------------------------
-
-execute unless data storage bs:in block.set_type.mode run data modify storage bs:in block.set_type.mode set value "replace"
-function bs.block:get/get_block
-function #bs.block:replace_type with storage bs:in block.set_type
-data modify storage bs:out block.mode set from storage bs:in block.set_type.mode
-return run function bs.block:set/run with storage bs:out block
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/keep_properties/keep_properties.mcfunction b/datapacks/Bookshelf/data/bs.block/function/transform/keep_properties/keep_properties.mcfunction
deleted file mode 100644
index 314cd6a5c4..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/transform/keep_properties/keep_properties.mcfunction
+++ /dev/null
@@ -1,25 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state
-# ------------------------------------------------------------------------------------------------------------
-
-execute if data storage bs:out block{group:0} run return 0
-
-$data modify storage bs:ctx _ set value {i:$(properties)}
-function bs.block:transform/lookup_group with storage bs:out block
-function bs.block:transform/keep_properties/recurse/next with storage bs:ctx _.i[-1]
-
-data modify storage bs:out block.properties set from storage bs:ctx _.p
-data modify storage bs:out block._ set from storage bs:ctx _.s
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/keep_properties/recurse/get_by_value.mcfunction b/datapacks/Bookshelf/data/bs.block/function/transform/keep_properties/recurse/get_by_value.mcfunction
deleted file mode 100644
index f88290a4a6..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/transform/keep_properties/recurse/get_by_value.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:ctx _.v set from storage bs:ctx _.g[{n:"$(name)"}].o[{v:"$(v)"}]
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/keep_properties/recurse/next.mcfunction b/datapacks/Bookshelf/data/bs.block/function/transform/keep_properties/recurse/next.mcfunction
deleted file mode 100644
index 1a4265948a..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/transform/keep_properties/recurse/next.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store success score #s bs.ctx run data modify storage bs:ctx _.i[-1].v set from storage bs:out block.properties."$(name)"
-execute if score #s bs.ctx matches 0 run function bs.block:transform/keep_properties/recurse/get_default with storage bs:ctx _.i[-1]
-execute if score #s bs.ctx matches 1 run function bs.block:transform/keep_properties/recurse/get_by_value with storage bs:ctx _.i[-1]
-
-data modify storage bs:ctx _.p merge from storage bs:ctx _.v.p
-data modify storage bs:ctx _.s merge from storage bs:ctx _.v.s
-
-data remove storage bs:ctx _.i[-1]
-function bs.block:transform/keep_properties/recurse/next with storage bs:ctx _.i[-1]
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/merge_properties/merge_properties.mcfunction b/datapacks/Bookshelf/data/bs.block/function/transform/merge_properties/merge_properties.mcfunction
deleted file mode 100644
index fff19b98a0..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/transform/merge_properties/merge_properties.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state
-# ------------------------------------------------------------------------------------------------------------
-
-execute if data storage bs:out block{group:0} run return 0
-
-$data modify storage bs:ctx _ set value {i:$(properties)}
-function bs.block:transform/lookup_group with storage bs:out block
-loot replace block -30000000 0 1606 container.0 loot bs.block:get/get
-data modify storage bs:ctx _.p set from block -30000000 0 1606 item.components."minecraft:custom_data".properties
-function bs.block:transform/merge_properties/recurse/next with storage bs:ctx _.i[-1]
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/merge_properties/recurse/get_by_value.mcfunction b/datapacks/Bookshelf/data/bs.block/function/transform/merge_properties/recurse/get_by_value.mcfunction
deleted file mode 100644
index f88290a4a6..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/transform/merge_properties/recurse/get_by_value.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:ctx _.v set from storage bs:ctx _.g[{n:"$(name)"}].o[{v:"$(v)"}]
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/merge_properties/recurse/next.mcfunction b/datapacks/Bookshelf/data/bs.block/function/transform/merge_properties/recurse/next.mcfunction
deleted file mode 100644
index a4f94e4431..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/transform/merge_properties/recurse/next.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store success score #s bs.ctx run data modify storage bs:ctx _.i[-1].v set from storage bs:ctx _.p."$(name)"
-execute if score #s bs.ctx matches 1 run function bs.block:transform/merge_properties/recurse/get_by_value with storage bs:ctx _.i[-1]
-
-data modify storage bs:out block.properties merge from storage bs:ctx _.v.p
-data modify storage bs:out block._ merge from storage bs:ctx _.v.s
-
-data remove storage bs:ctx _.i[-1]
-function bs.block:transform/merge_properties/recurse/next with storage bs:ctx _.i[-1]
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/remove_properties/recurse/next.mcfunction b/datapacks/Bookshelf/data/bs.block/function/transform/remove_properties/recurse/next.mcfunction
deleted file mode 100644
index cc39304484..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/transform/remove_properties/recurse/next.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$function bs.block:transform/remove_properties/recurse/remove with storage bs:ctx _.g[{n:"$(name)"}]
-
-data remove storage bs:ctx _.i[-1]
-function bs.block:transform/remove_properties/recurse/next with storage bs:ctx _.i[-1]
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/remove_properties/remove_properties.mcfunction b/datapacks/Bookshelf/data/bs.block/function/transform/remove_properties/remove_properties.mcfunction
deleted file mode 100644
index 04fcc80722..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/transform/remove_properties/remove_properties.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state
-# ------------------------------------------------------------------------------------------------------------
-
-execute if data storage bs:out block{group:0} run return 0
-
-$data modify storage bs:ctx _ set value {i:$(properties)}
-function bs.block:transform/lookup_group with storage bs:out block
-function bs.block:transform/remove_properties/recurse/next with storage bs:ctx _.i[-1]
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/replace_properties/recurse/next.mcfunction b/datapacks/Bookshelf/data/bs.block/function/transform/replace_properties/recurse/next.mcfunction
deleted file mode 100644
index faf52cf3dc..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/transform/replace_properties/recurse/next.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:ctx _.v set from storage bs:ctx _.g[{n:"$(name)"}].o[{v:"$(value)"}]
-
-data modify storage bs:out block.properties merge from storage bs:ctx _.v.p
-data modify storage bs:out block._ merge from storage bs:ctx _.v.s
-
-data remove storage bs:ctx _.i[-1]
-function bs.block:transform/replace_properties/recurse/next with storage bs:ctx _.i[-1]
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/replace_properties/replace_properties.mcfunction b/datapacks/Bookshelf/data/bs.block/function/transform/replace_properties/replace_properties.mcfunction
deleted file mode 100644
index cff49cca50..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/transform/replace_properties/replace_properties.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state
-# ------------------------------------------------------------------------------------------------------------
-
-execute if data storage bs:out block{group:0} run return 0
-
-$data modify storage bs:ctx _ set value {i:$(properties)}
-function bs.block:transform/lookup_group with storage bs:out block
-function bs.block:transform/replace_properties/recurse/next with storage bs:ctx _.i[-1]
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/replace_type.mcfunction b/datapacks/Bookshelf/data/bs.block/function/transform/replace_type.mcfunction
deleted file mode 100644
index 76bb57b741..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/transform/replace_type.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store success score #s bs.ctx run data modify storage bs:ctx _ set from storage bs:const block.types."$(type)"
-execute if score #s bs.ctx matches 0 run return fail
-execute store success score #s bs.ctx run data modify storage bs:ctx _.group set from storage bs:out block.group
-execute if score #s bs.ctx matches 0 run data modify storage bs:out block.type set from storage bs:ctx _.type
-execute if score #s bs.ctx matches 1 run data modify storage bs:out block set from storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/shift_properties/recurse/next.mcfunction b/datapacks/Bookshelf/data/bs.block/function/transform/shift_properties/recurse/next.mcfunction
deleted file mode 100644
index 8e4a901a1c..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/transform/shift_properties/recurse/next.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result score #l bs.ctx if data storage bs:ctx _.g[{n:"$(name)"}].o[]
-
-execute if score #l bs.ctx matches 1.. \
- run function bs.block:transform/shift_properties/recurse/shift_property with storage bs:ctx _.i[-1]
-
-data remove storage bs:ctx _.i[-1]
-function bs.block:transform/shift_properties/recurse/next with storage bs:ctx _.i[-1]
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/shift_properties/shift_properties.mcfunction b/datapacks/Bookshelf/data/bs.block/function/transform/shift_properties/shift_properties.mcfunction
deleted file mode 100644
index 0e4b125f3f..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/transform/shift_properties/shift_properties.mcfunction
+++ /dev/null
@@ -1,25 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state
-# ------------------------------------------------------------------------------------------------------------
-
-execute if data storage bs:out block{group:0} run return 0
-
-$data modify storage bs:ctx _ set value {i:$(properties)}
-function bs.block:transform/lookup_group with storage bs:out block
-function bs.block:transform/shift_properties/recurse/next with storage bs:ctx _.i[-1]
-
-data modify storage bs:out block._ merge from storage bs:ctx _.s[].o[{_:1b}].s
-data modify storage bs:out block.properties merge from storage bs:ctx _.s[].o[{_:1b}].p
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/map_type.mcfunction b/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/map_type.mcfunction
deleted file mode 100644
index a32388a875..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/map_type.mcfunction
+++ /dev/null
@@ -1,37 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type
-# ------------------------------------------------------------------------------------------------------------
-
-# get all attributes that belongs to the type input
-$data modify storage bs:ctx _.attrs append from storage bs:ctx _.sets[{type:"$(type)"}].attrs[]
-execute unless data storage bs:ctx _.attrs[-1] run return fail
-
-# keep only the set that has the bs:out block type
-function bs.block:transform/type_mappings/filter_type with storage bs:out block
-execute unless data storage bs:ctx _.filter run return fail
-
-# find entries that match the attributes
-scoreboard players set #a bs.ctx 0
-data modify storage bs:ctx _.entry set from storage bs:ctx _.sets[-1]
-function bs.block:transform/type_mappings/find_match with storage bs:ctx _.entry
-
-# filter out entries that have more attributes
-execute store result storage bs:ctx y byte 1 run scoreboard players get #a bs.ctx
-function bs.block:transform/type_mappings/keep_best with storage bs:ctx
-
-# replace the type in bs:out block
-data modify storage bs:ctx _.type set from storage bs:ctx _.found[0].type
-return run function #bs.block:replace_type with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/mix_type.mcfunction b/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/mix_type.mcfunction
deleted file mode 100644
index de5f40c159..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/mix_type.mcfunction
+++ /dev/null
@@ -1,42 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type
-# ------------------------------------------------------------------------------------------------------------
-
-# get all attributes that belongs to the type input
-$data modify storage bs:ctx _.attrs append from storage bs:ctx _.sets[{type:"$(type)"}].attrs[]
-execute unless data storage bs:ctx _.attrs[-1] run return fail
-
-# keep only the set that has the bs:out block type
-function bs.block:transform/type_mappings/filter_type with storage bs:out block
-execute unless data storage bs:ctx _.filter run return fail
-
-# find entries that match the attributes
-scoreboard players set #a bs.ctx 0
-data modify storage bs:ctx _.attrs append from storage bs:ctx _.filter.attrs[]
-data modify storage bs:ctx _.entry set from storage bs:ctx _.sets[-1]
-function bs.block:transform/type_mappings/find_match with storage bs:ctx _.entry
-
-# filter out entries that have more attributes
-execute store result storage bs:ctx y byte 1 run scoreboard players get #a bs.ctx
-function bs.block:transform/type_mappings/keep_best with storage bs:ctx
-
-# filter out entries that are different from the input / output
-$execute if data storage bs:ctx _.found[1] run data remove storage bs:ctx _.found[{type:"$(type)"}]
-execute if data storage bs:ctx _.found[1] run function bs.block:transform/type_mappings/remove_type with storage bs:ctx _.filter
-
-# replace the type in bs:out block
-data modify storage bs:ctx _.type set from storage bs:ctx _.found[0].type
-return run function #bs.block:replace_type with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.block/function/utils/get_custom_dimension.mcfunction b/datapacks/Bookshelf/data/bs.block/function/utils/get_custom_dimension.mcfunction
deleted file mode 100644
index 4fb21a3d81..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/utils/get_custom_dimension.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data block._.dim set from entity @s Brain.memories.minecraft:home.value.dimension
-kill @s
diff --git a/datapacks/Bookshelf/data/bs.block/function/utils/get_dimension.mcfunction b/datapacks/Bookshelf/data/bs.block/function/utils/get_dimension.mcfunction
deleted file mode 100644
index a96a3ae8d2..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/utils/get_dimension.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute if dimension minecraft:overworld run return run data modify storage bs:data block._.dim set value "minecraft:overworld"
-execute if dimension minecraft:the_nether run return run data modify storage bs:data block._.dim set value "minecraft:the_nether"
-execute if dimension minecraft:the_end run return run data modify storage bs:data block._.dim set value "minecraft:the_end"
-
-execute positioned -30000000 0 1600 summon piglin_brute run function bs.block:utils/get_custom_dimension
diff --git a/datapacks/Bookshelf/data/bs.block/function/utils/masks/compile.mcfunction b/datapacks/Bookshelf/data/bs.block/function/utils/masks/compile.mcfunction
deleted file mode 100644
index 421e1e1470..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/utils/masks/compile.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx _ set value {x:0,y:0,z:0,negate:0b,mask:""}
-data modify storage bs:ctx _ merge from storage bs:data block._.masks[-1]
-execute if data storage bs:ctx _.block run function bs.block:utils/masks/loop with storage bs:ctx _
-data modify storage bs:data block._.mask set from storage bs:ctx _.mask
diff --git a/datapacks/Bookshelf/data/bs.block/function/utils/masks/loop.mcfunction b/datapacks/Bookshelf/data/bs.block/function/utils/masks/loop.mcfunction
deleted file mode 100644
index c832dccc7b..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/utils/masks/loop.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute if data storage bs:ctx _{negate:0b} run data modify storage bs:ctx _.mask set value "if block ~$(x) ~$(y) ~$(z) $(block) $(mask)"
-$execute if data storage bs:ctx _{negate:1b} run data modify storage bs:ctx _.mask set value "unless block ~$(x) ~$(y) ~$(z) $(block) $(mask)"
-
-data remove storage bs:data block._.masks[-1]
-data modify storage bs:ctx _ merge value {x:0,y:0,z:0,negate:0b,block:0b}
-data modify storage bs:ctx _ merge from storage bs:data block._.masks[-1]
-execute unless data storage bs:ctx _{block:0b} run function bs.block:utils/masks/loop with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.block/function/utils/random/compile.mcfunction b/datapacks/Bookshelf/data/bs.block/function/utils/random/compile.mcfunction
deleted file mode 100644
index a0a9bdafdb..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/utils/random/compile.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx _ set value {pools:[{rolls:1,entries:[]}]}
-execute if data storage bs:data block._.entries[-1] run function bs.block:utils/random/loop
-data modify storage bs:data block._.entries set from storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.block/function/utils/random/loop.mcfunction b/datapacks/Bookshelf/data/bs.block/function/utils/random/loop.mcfunction
deleted file mode 100644
index 6cf590b884..0000000000
--- a/datapacks/Bookshelf/data/bs.block/function/utils/random/loop.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx _.pools[0].entries append value {type:"item",name:"cod",weight:1,functions:[{function:"set_custom_data",tag:{}}]}
-
-data modify storage bs:ctx _.pools[0].entries[-1].weight set from storage bs:data block._.entries[-1].weight
-data modify storage bs:ctx _.pools[0].entries[-1].functions[0].tag.block set from storage bs:data block._.entries[-1].block
-data modify storage bs:ctx _.pools[0].entries[-1].functions[0].tag.type set from storage bs:data block._.entries[-1].type
-
-data remove storage bs:data block._.entries[-1]
-execute if data storage bs:data block._.entries[-1] run function bs.block:utils/random/loop
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/1.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/1.json
deleted file mode 100644
index a181262df2..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/1.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'north'},_:{0:'facing=north,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'south'},_:{0:'facing=south,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'west'},_:{0:'facing=west,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"east"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'east'},_:{0:'facing=east,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/10.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/10.json
deleted file mode 100644
index a0f8040368..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/10.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/9","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{south:'false'},_:{3:'south=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/9","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{south:'true'},_:{3:'south=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/100.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/100.json
deleted file mode 100644
index 1a12e9f68f..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/100.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/99","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"down"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'down'},_:{1:'facing=down,'}}"}]},{"type":"loot_table","value":"bs.block:get/99","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'north'},_:{1:'facing=north,'}}"}]},{"type":"loot_table","value":"bs.block:get/99","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'south'},_:{1:'facing=south,'}}"}]},{"type":"loot_table","value":"bs.block:get/99","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'west'},_:{1:'facing=west,'}}"}]},{"type":"loot_table","value":"bs.block:get/99","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"east"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'east'},_:{1:'facing=east,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/101.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/101.json
deleted file mode 100644
index 89f6e9a077..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/101.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"has_record":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{has_record:'false'},_:{0:'has_record=false,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"has_record":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{has_record:'true'},_:{0:'has_record=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/102.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/102.json
deleted file mode 100644
index 4e984869b9..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/102.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"hanging":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{hanging:'false'},_:{1:'hanging=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"hanging":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{hanging:'true'},_:{1:'hanging=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/103.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/103.json
deleted file mode 100644
index 76f52b7c7e..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/103.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"half":"lower"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{half:'lower'},_:{0:'half=lower,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"half":"upper"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{half:'upper'},_:{0:'half=upper,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/104.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/104.json
deleted file mode 100644
index f2e5f4d5cc..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/104.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'0'},_:{0:'level=0,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'1'},_:{0:'level=1,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'2'},_:{0:'level=2,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'3'},_:{0:'level=3,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'4'},_:{0:'level=4,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'5'},_:{0:'level=5,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'6'},_:{0:'level=6,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'7'},_:{0:'level=7,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"8"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'8'},_:{0:'level=8,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"9"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'9'},_:{0:'level=9,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"10"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'10'},_:{0:'level=10,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"11"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'11'},_:{0:'level=11,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"12"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'12'},_:{0:'level=12,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"13"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'13'},_:{0:'level=13,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"14"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'14'},_:{0:'level=14,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"15"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'15'},_:{0:'level=15,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/105.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/105.json
deleted file mode 100644
index 29b168927c..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/105.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"has_book":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{has_book:'false'},_:{2:'has_book=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"has_book":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{has_book:'true'},_:{2:'has_book=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/106.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/106.json
deleted file mode 100644
index 228da81db4..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/106.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"15"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'15'},_:{1:'level=15,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'0'},_:{1:'level=0,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'1'},_:{1:'level=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'2'},_:{1:'level=2,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'3'},_:{1:'level=3,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'4'},_:{1:'level=4,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'5'},_:{1:'level=5,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'6'},_:{1:'level=6,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'7'},_:{1:'level=7,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"8"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'8'},_:{1:'level=8,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"9"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'9'},_:{1:'level=9,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"10"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'10'},_:{1:'level=10,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"11"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'11'},_:{1:'level=11,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"12"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'12'},_:{1:'level=12,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"13"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'13'},_:{1:'level=13,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"14"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'14'},_:{1:'level=14,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/107.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/107.json
deleted file mode 100644
index 2bedf0c3b7..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/107.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/28","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"powered":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{powered:'false'},_:{2:'powered=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/28","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"powered":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{powered:'true'},_:{2:'powered=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/108.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/108.json
deleted file mode 100644
index 1046d0bce9..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/108.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/102","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'0'},_:{2:'age=0,'}}"}]},{"type":"loot_table","value":"bs.block:get/102","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'1'},_:{2:'age=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/102","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'2'},_:{2:'age=2,'}}"}]},{"type":"loot_table","value":"bs.block:get/102","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'3'},_:{2:'age=3,'}}"}]},{"type":"loot_table","value":"bs.block:get/102","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'4'},_:{2:'age=4,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/109.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/109.json
deleted file mode 100644
index cf9a7f3f6b..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/109.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/108","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"stage":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{stage:'0'},_:{3:'stage=0,'}}"}]},{"type":"loot_table","value":"bs.block:get/108","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"stage":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{stage:'1'},_:{3:'stage=1,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/11.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/11.json
deleted file mode 100644
index f953a722e5..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/11.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/10","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{west:'false'},_:{4:'west=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/10","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{west:'true'},_:{4:'west=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/110.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/110.json
deleted file mode 100644
index 59faf2ed59..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/110.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/36","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"type":"normal"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{type:'normal'},_:{1:'type=normal,'}}"}]},{"type":"loot_table","value":"bs.block:get/36","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"type":"sticky"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{type:'sticky'},_:{1:'type=sticky,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/111.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/111.json
deleted file mode 100644
index f7b595f794..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/111.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"axis":"x"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{axis:'x'},_:{0:'axis=x,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"axis":"z"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{axis:'z'},_:{0:'axis=z,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/112.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/112.json
deleted file mode 100644
index b2b12d7516..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/112.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"harp"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'harp'},_:{1:'instrument=harp,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"basedrum"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'basedrum'},_:{1:'instrument=basedrum,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"snare"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'snare'},_:{1:'instrument=snare,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"hat"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'hat'},_:{1:'instrument=hat,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"bass"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'bass'},_:{1:'instrument=bass,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"flute"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'flute'},_:{1:'instrument=flute,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"bell"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'bell'},_:{1:'instrument=bell,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"guitar"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'guitar'},_:{1:'instrument=guitar,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"chime"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'chime'},_:{1:'instrument=chime,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"xylophone"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'xylophone'},_:{1:'instrument=xylophone,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"iron_xylophone"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'iron_xylophone'},_:{1:'instrument=iron_xylophone,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"cow_bell"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'cow_bell'},_:{1:'instrument=cow_bell,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"didgeridoo"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'didgeridoo'},_:{1:'instrument=didgeridoo,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"bit"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'bit'},_:{1:'instrument=bit,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"banjo"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'banjo'},_:{1:'instrument=banjo,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"pling"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'pling'},_:{1:'instrument=pling,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"zombie"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'zombie'},_:{1:'instrument=zombie,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"skeleton"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'skeleton'},_:{1:'instrument=skeleton,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"creeper"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'creeper'},_:{1:'instrument=creeper,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"dragon"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'dragon'},_:{1:'instrument=dragon,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"wither_skeleton"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'wither_skeleton'},_:{1:'instrument=wither_skeleton,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"piglin"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'piglin'},_:{1:'instrument=piglin,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"instrument":"custom_head"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{instrument:'custom_head'},_:{1:'instrument=custom_head,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/113.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/113.json
deleted file mode 100644
index caa464386a..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/113.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'0'},_:{2:'note=0,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'1'},_:{2:'note=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'2'},_:{2:'note=2,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'3'},_:{2:'note=3,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'4'},_:{2:'note=4,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'5'},_:{2:'note=5,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'6'},_:{2:'note=6,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'7'},_:{2:'note=7,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"8"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'8'},_:{2:'note=8,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"9"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'9'},_:{2:'note=9,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"10"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'10'},_:{2:'note=10,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"11"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'11'},_:{2:'note=11,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"12"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'12'},_:{2:'note=12,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"13"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'13'},_:{2:'note=13,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"14"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'14'},_:{2:'note=14,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"15"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'15'},_:{2:'note=15,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"16"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'16'},_:{2:'note=16,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"17"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'17'},_:{2:'note=17,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"18"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'18'},_:{2:'note=18,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"19"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'19'},_:{2:'note=19,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"20"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'20'},_:{2:'note=20,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"21"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'21'},_:{2:'note=21,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"22"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'22'},_:{2:'note=22,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"23"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'23'},_:{2:'note=23,'}}"}]},{"type":"loot_table","value":"bs.block:get/112","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"note":"24"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{note:'24'},_:{2:'note=24,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/114.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/114.json
deleted file mode 100644
index f0ed84de30..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/114.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/36","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"powered":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{powered:'false'},_:{1:'powered=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/36","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"powered":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{powered:'true'},_:{1:'powered=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/115.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/115.json
deleted file mode 100644
index 89ce0878fb..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/115.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tip":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{tip:'true'},_:{0:'tip=true,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tip":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{tip:'false'},_:{0:'tip=false,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/116.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/116.json
deleted file mode 100644
index 06a339c2a5..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/116.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bottom":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{bottom:'true'},_:{0:'bottom=true,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bottom":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{bottom:'false'},_:{0:'bottom=false,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/117.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/117.json
deleted file mode 100644
index dce93a2d9a..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/117.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/116","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"none"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{east:'none'},_:{1:'east=none,'}}"}]},{"type":"loot_table","value":"bs.block:get/116","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"low"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{east:'low'},_:{1:'east=low,'}}"}]},{"type":"loot_table","value":"bs.block:get/116","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"tall"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{east:'tall'},_:{1:'east=tall,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/118.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/118.json
deleted file mode 100644
index 41f27a1a44..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/118.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/117","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"none"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{north:'none'},_:{2:'north=none,'}}"}]},{"type":"loot_table","value":"bs.block:get/117","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"low"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{north:'low'},_:{2:'north=low,'}}"}]},{"type":"loot_table","value":"bs.block:get/117","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"tall"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{north:'tall'},_:{2:'north=tall,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/119.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/119.json
deleted file mode 100644
index e96ea7dc11..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/119.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/118","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{south:'none'},_:{3:'south=none,'}}"}]},{"type":"loot_table","value":"bs.block:get/118","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{south:'low'},_:{3:'south=low,'}}"}]},{"type":"loot_table","value":"bs.block:get/118","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"tall"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{south:'tall'},_:{3:'south=tall,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/12.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/12.json
deleted file mode 100644
index f8c8963220..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/12.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/4","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"in_wall":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{in_wall:'false'},_:{3:'in_wall=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/4","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"in_wall":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{in_wall:'true'},_:{3:'in_wall=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/120.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/120.json
deleted file mode 100644
index b8b3d428b2..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/120.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/119","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{west:'none'},_:{4:'west=none,'}}"}]},{"type":"loot_table","value":"bs.block:get/119","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{west:'low'},_:{4:'west=low,'}}"}]},{"type":"loot_table","value":"bs.block:get/119","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"tall"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{west:'tall'},_:{4:'west=tall,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/121.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/121.json
deleted file mode 100644
index 3636589023..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/121.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"flower_amount":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{flower_amount:'1'},_:{1:'flower_amount=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"flower_amount":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{flower_amount:'2'},_:{1:'flower_amount=2,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"flower_amount":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{flower_amount:'3'},_:{1:'flower_amount=3,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"flower_amount":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{flower_amount:'4'},_:{1:'flower_amount=4,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/122.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/122.json
deleted file mode 100644
index 616c8c776e..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/122.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/36","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"extended":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{extended:'false'},_:{1:'extended=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/36","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"extended":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{extended:'true'},_:{1:'extended=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/123.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/123.json
deleted file mode 100644
index 33bde9f9be..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/123.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/110","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"short":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{short:'false'},_:{2:'short=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/110","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"short":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{short:'true'},_:{2:'short=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/124.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/124.json
deleted file mode 100644
index 667cda1784..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/124.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/103","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'0'},_:{1:'age=0,'}}"}]},{"type":"loot_table","value":"bs.block:get/103","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'1'},_:{1:'age=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/103","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'2'},_:{1:'age=2,'}}"}]},{"type":"loot_table","value":"bs.block:get/103","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'3'},_:{1:'age=3,'}}"}]},{"type":"loot_table","value":"bs.block:get/103","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'4'},_:{1:'age=4,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/125.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/125.json
deleted file mode 100644
index 530126bbb9..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/125.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"thickness":"tip"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{thickness:'tip'},_:{1:'thickness=tip,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"thickness":"frustum"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{thickness:'frustum'},_:{1:'thickness=frustum,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"thickness":"middle"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{thickness:'middle'},_:{1:'thickness=middle,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"thickness":"base"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{thickness:'base'},_:{1:'thickness=base,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"thickness":"tip_merge"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{thickness:'tip_merge'},_:{1:'thickness=tip_merge,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/126.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/126.json
deleted file mode 100644
index 8584033417..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/126.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/125","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"vertical_direction":"up"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{vertical_direction:'up'},_:{2:'vertical_direction=up,'}}"}]},{"type":"loot_table","value":"bs.block:get/125","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"vertical_direction":"down"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{vertical_direction:'down'},_:{2:'vertical_direction=down,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/127.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/127.json
deleted file mode 100644
index d75ae2db65..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/127.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'1'},_:{0:'level=1,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'2'},_:{0:'level=2,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'3'},_:{0:'level=3,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/128.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/128.json
deleted file mode 100644
index 252bd9e523..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/128.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"north_south"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'north_south'},_:{1:'shape=north_south,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"east_west"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'east_west'},_:{1:'shape=east_west,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"ascending_east"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'ascending_east'},_:{1:'shape=ascending_east,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"ascending_west"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'ascending_west'},_:{1:'shape=ascending_west,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"ascending_north"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'ascending_north'},_:{1:'shape=ascending_north,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"ascending_south"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'ascending_south'},_:{1:'shape=ascending_south,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"south_east"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'south_east'},_:{1:'shape=south_east,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"south_west"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'south_west'},_:{1:'shape=south_west,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"north_west"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'north_west'},_:{1:'shape=north_west,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"north_east"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'north_east'},_:{1:'shape=north_east,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/129.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/129.json
deleted file mode 100644
index 70f335cd16..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/129.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/88","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"none"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{east:'none'},_:{1:'east=none,'}}"}]},{"type":"loot_table","value":"bs.block:get/88","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"up"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{east:'up'},_:{1:'east=up,'}}"}]},{"type":"loot_table","value":"bs.block:get/88","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"side"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{east:'side'},_:{1:'east=side,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/13.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/13.json
deleted file mode 100644
index 5e9ab67541..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/13.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'0'},_:{1:'rotation=0,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'1'},_:{1:'rotation=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'2'},_:{1:'rotation=2,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'3'},_:{1:'rotation=3,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'4'},_:{1:'rotation=4,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'5'},_:{1:'rotation=5,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'6'},_:{1:'rotation=6,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'7'},_:{1:'rotation=7,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"8"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'8'},_:{1:'rotation=8,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"9"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'9'},_:{1:'rotation=9,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"10"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'10'},_:{1:'rotation=10,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"11"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'11'},_:{1:'rotation=11,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"12"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'12'},_:{1:'rotation=12,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"13"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'13'},_:{1:'rotation=13,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"14"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'14'},_:{1:'rotation=14,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"15"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'15'},_:{1:'rotation=15,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/130.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/130.json
deleted file mode 100644
index c8e119fd7d..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/130.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/129","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"none"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{north:'none'},_:{2:'north=none,'}}"}]},{"type":"loot_table","value":"bs.block:get/129","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"up"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{north:'up'},_:{2:'north=up,'}}"}]},{"type":"loot_table","value":"bs.block:get/129","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"side"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{north:'side'},_:{2:'north=side,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/131.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/131.json
deleted file mode 100644
index d4db09c48b..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/131.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/130","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{south:'none'},_:{3:'south=none,'}}"}]},{"type":"loot_table","value":"bs.block:get/130","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"up"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{south:'up'},_:{3:'south=up,'}}"}]},{"type":"loot_table","value":"bs.block:get/130","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"side"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{south:'side'},_:{3:'south=side,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/132.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/132.json
deleted file mode 100644
index 601429cba8..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/132.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/131","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{west:'none'},_:{4:'west=none,'}}"}]},{"type":"loot_table","value":"bs.block:get/131","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{west:'up'},_:{4:'west=up,'}}"}]},{"type":"loot_table","value":"bs.block:get/131","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{west:'side'},_:{4:'west=side,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/133.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/133.json
deleted file mode 100644
index 48b0360552..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/133.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"delay":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{delay:'1'},_:{2:'delay=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"delay":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{delay:'2'},_:{2:'delay=2,'}}"}]},{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"delay":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{delay:'3'},_:{2:'delay=3,'}}"}]},{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"delay":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{delay:'4'},_:{2:'delay=4,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/134.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/134.json
deleted file mode 100644
index 0175d2c522..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/134.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/133","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"locked":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{locked:'false'},_:{3:'locked=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/133","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"locked":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{locked:'true'},_:{3:'locked=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/135.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/135.json
deleted file mode 100644
index 7ce81e5587..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/135.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"charges":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{charges:'0'},_:{0:'charges=0,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"charges":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{charges:'1'},_:{0:'charges=1,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"charges":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{charges:'2'},_:{0:'charges=2,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"charges":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{charges:'3'},_:{0:'charges=3,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"charges":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{charges:'4'},_:{0:'charges=4,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/136.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/136.json
deleted file mode 100644
index 58dafdb1e6..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/136.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bottom":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{bottom:'false'},_:{1:'bottom=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bottom":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{bottom:'true'},_:{1:'bottom=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/137.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/137.json
deleted file mode 100644
index 97f1c49450..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/137.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/136","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"distance":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{distance:'7'},_:{2:'distance=7,'}}"}]},{"type":"loot_table","value":"bs.block:get/136","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"distance":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{distance:'0'},_:{2:'distance=0,'}}"}]},{"type":"loot_table","value":"bs.block:get/136","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"distance":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{distance:'1'},_:{2:'distance=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/136","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"distance":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{distance:'2'},_:{2:'distance=2,'}}"}]},{"type":"loot_table","value":"bs.block:get/136","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"distance":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{distance:'3'},_:{2:'distance=3,'}}"}]},{"type":"loot_table","value":"bs.block:get/136","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"distance":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{distance:'4'},_:{2:'distance=4,'}}"}]},{"type":"loot_table","value":"bs.block:get/136","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"distance":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{distance:'5'},_:{2:'distance=5,'}}"}]},{"type":"loot_table","value":"bs.block:get/136","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"distance":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{distance:'6'},_:{2:'distance=6,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/138.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/138.json
deleted file mode 100644
index 023ad51da4..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/138.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bloom":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{bloom:'false'},_:{0:'bloom=false,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bloom":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{bloom:'true'},_:{0:'bloom=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/139.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/139.json
deleted file mode 100644
index a53d3dd1f0..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/139.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'0'},_:{1:'power=0,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'1'},_:{1:'power=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'2'},_:{1:'power=2,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'3'},_:{1:'power=3,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'4'},_:{1:'power=4,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'5'},_:{1:'power=5,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'6'},_:{1:'power=6,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'7'},_:{1:'power=7,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"8"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'8'},_:{1:'power=8,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"9"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'9'},_:{1:'power=9,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"10"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'10'},_:{1:'power=10,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"11"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'11'},_:{1:'power=11,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"12"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'12'},_:{1:'power=12,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"13"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'13'},_:{1:'power=13,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"14"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'14'},_:{1:'power=14,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"15"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'15'},_:{1:'power=15,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/14.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/14.json
deleted file mode 100644
index 194aa5abb2..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/14.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/13","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"attached":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{attached:'false'},_:{2:'attached=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/13","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"attached":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{attached:'true'},_:{2:'attached=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/140.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/140.json
deleted file mode 100644
index 24682ed95b..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/140.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/139","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"sculk_sensor_phase":"inactive"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{sculk_sensor_phase:'inactive'},_:{2:'sculk_sensor_phase=inactive,'}}"}]},{"type":"loot_table","value":"bs.block:get/139","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"sculk_sensor_phase":"active"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{sculk_sensor_phase:'active'},_:{2:'sculk_sensor_phase=active,'}}"}]},{"type":"loot_table","value":"bs.block:get/139","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"sculk_sensor_phase":"cooldown"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{sculk_sensor_phase:'cooldown'},_:{2:'sculk_sensor_phase=cooldown,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/141.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/141.json
deleted file mode 100644
index cec0f22018..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/141.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"can_summon":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{can_summon:'false'},_:{1:'can_summon=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"can_summon":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{can_summon:'true'},_:{1:'can_summon=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/142.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/142.json
deleted file mode 100644
index 202143f039..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/142.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/141","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shrieking":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shrieking:'false'},_:{2:'shrieking=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/141","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shrieking":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shrieking:'true'},_:{2:'shrieking=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/143.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/143.json
deleted file mode 100644
index 39f317d20d..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/143.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"pickles":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{pickles:'1'},_:{1:'pickles=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"pickles":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{pickles:'2'},_:{1:'pickles=2,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"pickles":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{pickles:'3'},_:{1:'pickles=3,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"pickles":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{pickles:'4'},_:{1:'pickles=4,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/144.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/144.json
deleted file mode 100644
index 8cd8d89aea..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/144.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"half":"lower"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{half:'lower'},_:{2:'half=lower,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"half":"upper"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{half:'upper'},_:{2:'half=upper,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/145.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/145.json
deleted file mode 100644
index 1cc4461760..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/145.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"hatch":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{hatch:'0'},_:{0:'hatch=0,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"hatch":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{hatch:'1'},_:{0:'hatch=1,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"hatch":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{hatch:'2'},_:{0:'hatch=2,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/146.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/146.json
deleted file mode 100644
index 0874716efa..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/146.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"layers":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{layers:'1'},_:{0:'layers=1,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"layers":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{layers:'2'},_:{0:'layers=2,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"layers":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{layers:'3'},_:{0:'layers=3,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"layers":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{layers:'4'},_:{0:'layers=4,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"layers":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{layers:'5'},_:{0:'layers=5,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"layers":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{layers:'6'},_:{0:'layers=6,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"layers":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{layers:'7'},_:{0:'layers=7,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"layers":"8"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{layers:'8'},_:{0:'layers=8,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/147.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/147.json
deleted file mode 100644
index c7480cfaf7..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/147.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"mode":"load"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{mode:'load'},_:{0:'mode=load,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"mode":"corner"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{mode:'corner'},_:{0:'mode=corner,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"mode":"data"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{mode:'data'},_:{0:'mode=data,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"mode":"save"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{mode:'save'},_:{0:'mode=save,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/148.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/148.json
deleted file mode 100644
index 2dd9a92e18..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/148.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"dusted":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{dusted:'0'},_:{0:'dusted=0,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"dusted":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{dusted:'1'},_:{0:'dusted=1,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"dusted":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{dusted:'2'},_:{0:'dusted=2,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"dusted":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{dusted:'3'},_:{0:'dusted=3,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/149.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/149.json
deleted file mode 100644
index b99713cb09..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/149.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"unstable":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{unstable:'false'},_:{0:'unstable=false,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"unstable":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{unstable:'true'},_:{0:'unstable=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/15.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/15.json
deleted file mode 100644
index 17d6e07356..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/15.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"distance":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{distance:'7'},_:{1:'distance=7,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"distance":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{distance:'1'},_:{1:'distance=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"distance":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{distance:'2'},_:{1:'distance=2,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"distance":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{distance:'3'},_:{1:'distance=3,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"distance":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{distance:'4'},_:{1:'distance=4,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"distance":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{distance:'5'},_:{1:'distance=5,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"distance":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{distance:'6'},_:{1:'distance=6,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/150.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/150.json
deleted file mode 100644
index 8d12d1cf20..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/150.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'0'},_:{0:'age=0,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'1'},_:{0:'age=1,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/151.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/151.json
deleted file mode 100644
index 23060fa36b..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/151.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"ominous":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{ominous:'false'},_:{0:'ominous=false,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"ominous":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{ominous:'true'},_:{0:'ominous=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/152.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/152.json
deleted file mode 100644
index d15d0850f4..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/152.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/151","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"trial_spawner_state":"inactive"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{trial_spawner_state:'inactive'},_:{1:'trial_spawner_state=inactive,'}}"}]},{"type":"loot_table","value":"bs.block:get/151","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"trial_spawner_state":"waiting_for_players"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{trial_spawner_state:'waiting_for_players'},_:{1:'trial_spawner_state=waiting_for_players,'}}"}]},{"type":"loot_table","value":"bs.block:get/151","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"trial_spawner_state":"active"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{trial_spawner_state:'active'},_:{1:'trial_spawner_state=active,'}}"}]},{"type":"loot_table","value":"bs.block:get/151","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"trial_spawner_state":"waiting_for_reward_ejection"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{trial_spawner_state:'waiting_for_reward_ejection'},_:{1:'trial_spawner_state=waiting_for_reward_ejection,'}}"}]},{"type":"loot_table","value":"bs.block:get/151","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"trial_spawner_state":"ejecting_reward"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{trial_spawner_state:'ejecting_reward'},_:{1:'trial_spawner_state=ejecting_reward,'}}"}]},{"type":"loot_table","value":"bs.block:get/151","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"trial_spawner_state":"cooldown"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{trial_spawner_state:'cooldown'},_:{1:'trial_spawner_state=cooldown,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/153.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/153.json
deleted file mode 100644
index 8d31f15627..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/153.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/55","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"attached":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{attached:'false'},_:{4:'attached=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/55","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"attached":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{attached:'true'},_:{4:'attached=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/154.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/154.json
deleted file mode 100644
index 847d9aeafa..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/154.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/153","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"powered":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{powered:'false'},_:{5:'powered=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/153","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"powered":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{powered:'true'},_:{5:'powered=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/155.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/155.json
deleted file mode 100644
index e90d84beb5..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/155.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/154","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"disarmed":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{disarmed:'false'},_:{6:'disarmed=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/154","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"disarmed":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{disarmed:'true'},_:{6:'disarmed=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/156.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/156.json
deleted file mode 100644
index c5a2de9ca3..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/156.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"attached":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{attached:'false'},_:{2:'attached=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"attached":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{attached:'true'},_:{2:'attached=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/157.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/157.json
deleted file mode 100644
index e145bc7d6d..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/157.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/145","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"eggs":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{eggs:'1'},_:{1:'eggs=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/145","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"eggs":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{eggs:'2'},_:{1:'eggs=2,'}}"}]},{"type":"loot_table","value":"bs.block:get/145","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"eggs":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{eggs:'3'},_:{1:'eggs=3,'}}"}]},{"type":"loot_table","value":"bs.block:get/145","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"eggs":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{eggs:'4'},_:{1:'eggs=4,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/158.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/158.json
deleted file mode 100644
index bd2ffcd1bb..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/158.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"ominous":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{ominous:'false'},_:{1:'ominous=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"ominous":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{ominous:'true'},_:{1:'ominous=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/159.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/159.json
deleted file mode 100644
index e925318a57..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/159.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/158","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"vault_state":"inactive"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{vault_state:'inactive'},_:{2:'vault_state=inactive,'}}"}]},{"type":"loot_table","value":"bs.block:get/158","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"vault_state":"active"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{vault_state:'active'},_:{2:'vault_state=active,'}}"}]},{"type":"loot_table","value":"bs.block:get/158","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"vault_state":"unlocking"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{vault_state:'unlocking'},_:{2:'vault_state=unlocking,'}}"}]},{"type":"loot_table","value":"bs.block:get/158","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"vault_state":"ejecting"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{vault_state:'ejecting'},_:{2:'vault_state=ejecting,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/16.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/16.json
deleted file mode 100644
index 7bae2ee011..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/16.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/15","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"persistent":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{persistent:'false'},_:{2:'persistent=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/15","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"persistent":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{persistent:'true'},_:{2:'persistent=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/17.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/17.json
deleted file mode 100644
index 092ff4b8b5..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/17.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"axis":"y"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{axis:'y'},_:{0:'axis=y,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"axis":"z"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{axis:'z'},_:{0:'axis=z,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"axis":"x"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{axis:'x'},_:{0:'axis=x,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/18.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/18.json
deleted file mode 100644
index f18a2d74c0..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/18.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"powered":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{powered:'false'},_:{0:'powered=false,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"powered":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{powered:'true'},_:{0:'powered=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/19.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/19.json
deleted file mode 100644
index 4d9b3f17bc..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/19.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"stage":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{stage:'0'},_:{0:'stage=0,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"stage":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{stage:'1'},_:{0:'stage=1,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/2.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/2.json
deleted file mode 100644
index b16dedd4ab..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/2.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"powered":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{powered:'false'},_:{1:'powered=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"powered":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{powered:'true'},_:{1:'powered=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/20.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/20.json
deleted file mode 100644
index a144afd18a..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/20.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"type":"bottom"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{type:'bottom'},_:{1:'type=bottom,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"type":"double"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{type:'double'},_:{1:'type=double,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"type":"top"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{type:'top'},_:{1:'type=top,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/21.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/21.json
deleted file mode 100644
index 5ceb954f6b..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/21.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'north'},_:{1:'facing=north,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'south'},_:{1:'facing=south,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'west'},_:{1:'facing=west,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"east"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'east'},_:{1:'facing=east,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/22.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/22.json
deleted file mode 100644
index 67f69f85c8..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/22.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"half":"bottom"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{half:'bottom'},_:{2:'half=bottom,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"half":"top"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{half:'top'},_:{2:'half=top,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/23.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/23.json
deleted file mode 100644
index 5efe0f94bb..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/23.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/22","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"straight"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'straight'},_:{3:'shape=straight,'}}"}]},{"type":"loot_table","value":"bs.block:get/22","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_left"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'inner_left'},_:{3:'shape=inner_left,'}}"}]},{"type":"loot_table","value":"bs.block:get/22","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_right"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'inner_right'},_:{3:'shape=inner_right,'}}"}]},{"type":"loot_table","value":"bs.block:get/22","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"outer_left"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'outer_left'},_:{3:'shape=outer_left,'}}"}]},{"type":"loot_table","value":"bs.block:get/22","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"outer_right"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'outer_right'},_:{3:'shape=outer_right,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/24.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/24.json
deleted file mode 100644
index 189ee4a313..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/24.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/22","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"open":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{open:'false'},_:{3:'open=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/22","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"open":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{open:'true'},_:{3:'open=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/25.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/25.json
deleted file mode 100644
index 0323468a03..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/25.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/24","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"powered":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{powered:'false'},_:{4:'powered=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/24","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"powered":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{powered:'true'},_:{4:'powered=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/26.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/26.json
deleted file mode 100644
index d744913255..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/26.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"powered":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{powered:'false'},_:{1:'powered=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"powered":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{powered:'true'},_:{1:'powered=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/27.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/27.json
deleted file mode 100644
index 3b76450295..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/27.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/26","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"north_south"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'north_south'},_:{2:'shape=north_south,'}}"}]},{"type":"loot_table","value":"bs.block:get/26","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"east_west"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'east_west'},_:{2:'shape=east_west,'}}"}]},{"type":"loot_table","value":"bs.block:get/26","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"ascending_east"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'ascending_east'},_:{2:'shape=ascending_east,'}}"}]},{"type":"loot_table","value":"bs.block:get/26","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"ascending_west"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'ascending_west'},_:{2:'shape=ascending_west,'}}"}]},{"type":"loot_table","value":"bs.block:get/26","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"ascending_north"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'ascending_north'},_:{2:'shape=ascending_north,'}}"}]},{"type":"loot_table","value":"bs.block:get/26","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"ascending_south"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{shape:'ascending_south'},_:{2:'shape=ascending_south,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/28.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/28.json
deleted file mode 100644
index 9758971d85..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/28.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"up"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'up'},_:{1:'facing=up,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"down"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'down'},_:{1:'facing=down,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'north'},_:{1:'facing=north,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"east"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'east'},_:{1:'facing=east,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'south'},_:{1:'facing=south,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'west'},_:{1:'facing=west,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/29.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/29.json
deleted file mode 100644
index 1700124b8f..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/29.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{up:'true'},_:{1:'up=true,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{up:'false'},_:{1:'up=false,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/3.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/3.json
deleted file mode 100644
index 8d72db9147..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/3.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"face":"wall"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{face:'wall'},_:{2:'face=wall,'}}"}]},{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"face":"ceiling"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{face:'ceiling'},_:{2:'face=ceiling,'}}"}]},{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"face":"floor"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{face:'floor'},_:{2:'face=floor,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/30.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/30.json
deleted file mode 100644
index 6f53b88ea6..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/30.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/29","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"none"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{east:'none'},_:{2:'east=none,'}}"}]},{"type":"loot_table","value":"bs.block:get/29","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"low"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{east:'low'},_:{2:'east=low,'}}"}]},{"type":"loot_table","value":"bs.block:get/29","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"tall"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{east:'tall'},_:{2:'east=tall,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/31.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/31.json
deleted file mode 100644
index 16ae80468e..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/31.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/30","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"none"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{north:'none'},_:{3:'north=none,'}}"}]},{"type":"loot_table","value":"bs.block:get/30","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"low"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{north:'low'},_:{3:'north=low,'}}"}]},{"type":"loot_table","value":"bs.block:get/30","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"tall"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{north:'tall'},_:{3:'north=tall,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/32.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/32.json
deleted file mode 100644
index e3ca1442a2..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/32.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/31","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{south:'none'},_:{4:'south=none,'}}"}]},{"type":"loot_table","value":"bs.block:get/31","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{south:'low'},_:{4:'south=low,'}}"}]},{"type":"loot_table","value":"bs.block:get/31","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"tall"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{south:'tall'},_:{4:'south=tall,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/33.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/33.json
deleted file mode 100644
index 06d43fafbb..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/33.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/32","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{west:'none'},_:{5:'west=none,'}}"}]},{"type":"loot_table","value":"bs.block:get/32","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{west:'low'},_:{5:'west=low,'}}"}]},{"type":"loot_table","value":"bs.block:get/32","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"tall"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{west:'tall'},_:{5:'west=tall,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/34.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/34.json
deleted file mode 100644
index 9f7892b58f..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/34.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/19","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'0'},_:{1:'age=0,'}}"}]},{"type":"loot_table","value":"bs.block:get/19","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'1'},_:{1:'age=1,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/35.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/35.json
deleted file mode 100644
index 3f1043aa40..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/35.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/34","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"leaves":"none"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{leaves:'none'},_:{2:'leaves=none,'}}"}]},{"type":"loot_table","value":"bs.block:get/34","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"leaves":"small"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{leaves:'small'},_:{2:'leaves=small,'}}"}]},{"type":"loot_table","value":"bs.block:get/34","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"leaves":"large"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{leaves:'large'},_:{2:'leaves=large,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/36.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/36.json
deleted file mode 100644
index 49ddeedf66..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/36.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'north'},_:{0:'facing=north,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"east"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'east'},_:{0:'facing=east,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'south'},_:{0:'facing=south,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'west'},_:{0:'facing=west,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"up"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'up'},_:{0:'facing=up,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"down"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{facing:'down'},_:{0:'facing=down,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/37.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/37.json
deleted file mode 100644
index 92633e641a..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/37.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/36","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"open":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{open:'false'},_:{1:'open=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/36","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"open":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{open:'true'},_:{1:'open=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/38.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/38.json
deleted file mode 100644
index db828ce88e..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/38.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"honey_level":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{honey_level:'0'},_:{1:'honey_level=0,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"honey_level":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{honey_level:'1'},_:{1:'honey_level=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"honey_level":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{honey_level:'2'},_:{1:'honey_level=2,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"honey_level":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{honey_level:'3'},_:{1:'honey_level=3,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"honey_level":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{honey_level:'4'},_:{1:'honey_level=4,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"honey_level":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{honey_level:'5'},_:{1:'honey_level=5,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/39.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/39.json
deleted file mode 100644
index 36a90b1d52..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/39.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'0'},_:{0:'age=0,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'1'},_:{0:'age=1,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'2'},_:{0:'age=2,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'3'},_:{0:'age=3,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/4.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/4.json
deleted file mode 100644
index 3dbc163bc4..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/4.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"open":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{open:'false'},_:{2:'open=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"open":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{open:'true'},_:{2:'open=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/40.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/40.json
deleted file mode 100644
index d6d4a0d25f..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/40.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"attachment":"floor"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{attachment:'floor'},_:{2:'attachment=floor,'}}"}]},{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"attachment":"ceiling"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{attachment:'ceiling'},_:{2:'attachment=ceiling,'}}"}]},{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"attachment":"single_wall"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{attachment:'single_wall'},_:{2:'attachment=single_wall,'}}"}]},{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"attachment":"double_wall"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{attachment:'double_wall'},_:{2:'attachment=double_wall,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/41.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/41.json
deleted file mode 100644
index c58aebc982..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/41.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tilt":"none"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{tilt:'none'},_:{2:'tilt=none,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tilt":"unstable"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{tilt:'unstable'},_:{2:'tilt=unstable,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tilt":"partial"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{tilt:'partial'},_:{2:'tilt=partial,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tilt":"full"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{tilt:'full'},_:{2:'tilt=full,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/42.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/42.json
deleted file mode 100644
index 5debf4cccf..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/42.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'0'},_:{0:'rotation=0,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'1'},_:{0:'rotation=1,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'2'},_:{0:'rotation=2,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'3'},_:{0:'rotation=3,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'4'},_:{0:'rotation=4,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'5'},_:{0:'rotation=5,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'6'},_:{0:'rotation=6,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'7'},_:{0:'rotation=7,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"8"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'8'},_:{0:'rotation=8,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"9"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'9'},_:{0:'rotation=9,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"10"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'10'},_:{0:'rotation=10,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"11"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'11'},_:{0:'rotation=11,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"12"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'12'},_:{0:'rotation=12,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"13"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'13'},_:{0:'rotation=13,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"14"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'14'},_:{0:'rotation=14,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"15"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'15'},_:{0:'rotation=15,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/43.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/43.json
deleted file mode 100644
index 659726bae4..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/43.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"occupied":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{occupied:'false'},_:{1:'occupied=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"occupied":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{occupied:'true'},_:{1:'occupied=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/44.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/44.json
deleted file mode 100644
index 1afc5d7dfd..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/44.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/43","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"part":"foot"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{part:'foot'},_:{2:'part=foot,'}}"}]},{"type":"loot_table","value":"bs.block:get/43","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"part":"head"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{part:'head'},_:{2:'part=head,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/45.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/45.json
deleted file mode 100644
index 52f57a9ae8..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/45.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"lit":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{lit:'false'},_:{1:'lit=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"lit":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{lit:'true'},_:{1:'lit=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/46.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/46.json
deleted file mode 100644
index 700e7425fa..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/46.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/45","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"candles":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{candles:'1'},_:{2:'candles=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/45","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"candles":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{candles:'2'},_:{2:'candles=2,'}}"}]},{"type":"loot_table","value":"bs.block:get/45","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"candles":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{candles:'3'},_:{2:'candles=3,'}}"}]},{"type":"loot_table","value":"bs.block:get/45","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"candles":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{candles:'4'},_:{2:'candles=4,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/47.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/47.json
deleted file mode 100644
index 0336a8143d..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/47.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"lit":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{lit:'true'},_:{0:'lit=true,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"lit":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{lit:'false'},_:{0:'lit=false,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/48.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/48.json
deleted file mode 100644
index df768c4388..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/48.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"lit":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{lit:'true'},_:{1:'lit=true,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"lit":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{lit:'false'},_:{1:'lit=false,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/49.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/49.json
deleted file mode 100644
index da8e53fc66..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/49.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"has_bottle_0":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{has_bottle_0:'false'},_:{0:'has_bottle_0=false,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"has_bottle_0":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{has_bottle_0:'true'},_:{0:'has_bottle_0=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/5.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/5.json
deleted file mode 100644
index 5c891acce4..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/5.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/4","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"half":"lower"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{half:'lower'},_:{3:'half=lower,'}}"}]},{"type":"loot_table","value":"bs.block:get/4","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"half":"upper"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{half:'upper'},_:{3:'half=upper,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/50.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/50.json
deleted file mode 100644
index 40b81877db..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/50.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/49","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"has_bottle_1":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{has_bottle_1:'false'},_:{1:'has_bottle_1=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/49","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"has_bottle_1":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{has_bottle_1:'true'},_:{1:'has_bottle_1=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/51.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/51.json
deleted file mode 100644
index 6bd5ce9384..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/51.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/50","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"has_bottle_2":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{has_bottle_2:'false'},_:{2:'has_bottle_2=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/50","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"has_bottle_2":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{has_bottle_2:'true'},_:{2:'has_bottle_2=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/52.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/52.json
deleted file mode 100644
index 494f1c6e70..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/52.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{east:'false'},_:{0:'east=false,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{east:'true'},_:{0:'east=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/53.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/53.json
deleted file mode 100644
index af979e55ee..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/53.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/52","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{north:'false'},_:{1:'north=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/52","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{north:'true'},_:{1:'north=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/54.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/54.json
deleted file mode 100644
index cd453895bf..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/54.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/53","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{south:'false'},_:{2:'south=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/53","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{south:'true'},_:{2:'south=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/55.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/55.json
deleted file mode 100644
index da04a4662f..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/55.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/54","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{west:'false'},_:{3:'west=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/54","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{west:'true'},_:{3:'west=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/56.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/56.json
deleted file mode 100644
index 3bfedcb144..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/56.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/55","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{up:'false'},_:{4:'up=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/55","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{up:'true'},_:{4:'up=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/57.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/57.json
deleted file mode 100644
index 241b188db1..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/57.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"down":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{down:'false'},_:{5:'down=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"down":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{down:'true'},_:{5:'down=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/58.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/58.json
deleted file mode 100644
index d9fe9118e2..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/58.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"drag":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{drag:'true'},_:{0:'drag=true,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"drag":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{drag:'false'},_:{0:'drag=false,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/59.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/59.json
deleted file mode 100644
index 73a9379142..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/59.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'0'},_:{0:'age=0,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'1'},_:{0:'age=1,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'2'},_:{0:'age=2,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'3'},_:{0:'age=3,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'4'},_:{0:'age=4,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'5'},_:{0:'age=5,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'6'},_:{0:'age=6,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'7'},_:{0:'age=7,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"8"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'8'},_:{0:'age=8,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"9"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'9'},_:{0:'age=9,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"10"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'10'},_:{0:'age=10,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"11"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'11'},_:{0:'age=11,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"12"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'12'},_:{0:'age=12,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"13"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'13'},_:{0:'age=13,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"14"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'14'},_:{0:'age=14,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"15"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'15'},_:{0:'age=15,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/6.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/6.json
deleted file mode 100644
index aa9abd53ec..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/6.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/5","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"hinge":"left"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{hinge:'left'},_:{4:'hinge=left,'}}"}]},{"type":"loot_table","value":"bs.block:get/5","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"hinge":"right"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{hinge:'right'},_:{4:'hinge=right,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/60.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/60.json
deleted file mode 100644
index a0521de90d..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/60.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bites":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{bites:'0'},_:{0:'bites=0,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bites":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{bites:'1'},_:{0:'bites=1,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bites":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{bites:'2'},_:{0:'bites=2,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bites":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{bites:'3'},_:{0:'bites=3,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bites":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{bites:'4'},_:{0:'bites=4,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bites":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{bites:'5'},_:{0:'bites=5,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bites":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{bites:'6'},_:{0:'bites=6,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/61.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/61.json
deleted file mode 100644
index 5256df8c3f..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/61.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'0'},_:{2:'power=0,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'1'},_:{2:'power=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'2'},_:{2:'power=2,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'3'},_:{2:'power=3,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'4'},_:{2:'power=4,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'5'},_:{2:'power=5,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'6'},_:{2:'power=6,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'7'},_:{2:'power=7,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"8"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'8'},_:{2:'power=8,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"9"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'9'},_:{2:'power=9,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"10"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'10'},_:{2:'power=10,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"11"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'11'},_:{2:'power=11,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"12"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'12'},_:{2:'power=12,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"13"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'13'},_:{2:'power=13,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"14"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'14'},_:{2:'power=14,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"15"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'15'},_:{2:'power=15,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/62.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/62.json
deleted file mode 100644
index 6f2819ba5a..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/62.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/61","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"sculk_sensor_phase":"inactive"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{sculk_sensor_phase:'inactive'},_:{3:'sculk_sensor_phase=inactive,'}}"}]},{"type":"loot_table","value":"bs.block:get/61","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"sculk_sensor_phase":"active"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{sculk_sensor_phase:'active'},_:{3:'sculk_sensor_phase=active,'}}"}]},{"type":"loot_table","value":"bs.block:get/61","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"sculk_sensor_phase":"cooldown"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{sculk_sensor_phase:'cooldown'},_:{3:'sculk_sensor_phase=cooldown,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/63.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/63.json
deleted file mode 100644
index defc1793ba..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/63.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"lit":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{lit:'true'},_:{2:'lit=true,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"lit":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{lit:'false'},_:{2:'lit=false,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/64.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/64.json
deleted file mode 100644
index 3d180b827e..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/64.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/63","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"signal_fire":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{signal_fire:'false'},_:{3:'signal_fire=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/63","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"signal_fire":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{signal_fire:'true'},_:{3:'signal_fire=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/65.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/65.json
deleted file mode 100644
index 18e339b014..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/65.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'0'},_:{0:'age=0,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'1'},_:{0:'age=1,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'2'},_:{0:'age=2,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'3'},_:{0:'age=3,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'4'},_:{0:'age=4,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'5'},_:{0:'age=5,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'6'},_:{0:'age=6,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'7'},_:{0:'age=7,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/66.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/66.json
deleted file mode 100644
index 0cc1267e43..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/66.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'0'},_:{0:'age=0,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'1'},_:{0:'age=1,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'2'},_:{0:'age=2,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'3'},_:{0:'age=3,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'4'},_:{0:'age=4,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'5'},_:{0:'age=5,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'6'},_:{0:'age=6,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'7'},_:{0:'age=7,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"8"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'8'},_:{0:'age=8,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"9"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'9'},_:{0:'age=9,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"10"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'10'},_:{0:'age=10,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"11"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'11'},_:{0:'age=11,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"12"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'12'},_:{0:'age=12,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"13"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'13'},_:{0:'age=13,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"14"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'14'},_:{0:'age=14,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"15"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'15'},_:{0:'age=15,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"16"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'16'},_:{0:'age=16,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"17"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'17'},_:{0:'age=17,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"18"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'18'},_:{0:'age=18,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"19"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'19'},_:{0:'age=19,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"20"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'20'},_:{0:'age=20,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"21"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'21'},_:{0:'age=21,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"22"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'22'},_:{0:'age=22,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"23"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'23'},_:{0:'age=23,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"24"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'24'},_:{0:'age=24,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"25"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'25'},_:{0:'age=25,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/67.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/67.json
deleted file mode 100644
index e3dca3dece..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/67.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/66","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"berries":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{berries:'false'},_:{1:'berries=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/66","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"berries":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{berries:'true'},_:{1:'berries=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/68.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/68.json
deleted file mode 100644
index 32b05ca122..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/68.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"berries":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{berries:'false'},_:{0:'berries=false,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"berries":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{berries:'true'},_:{0:'berries=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/69.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/69.json
deleted file mode 100644
index 0909f4a26a..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/69.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"axis":"y"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{axis:'y'},_:{1:'axis=y,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"axis":"z"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{axis:'z'},_:{1:'axis=z,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"axis":"x"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{axis:'x'},_:{1:'axis=x,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/7.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/7.json
deleted file mode 100644
index 3ac1451b87..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/7.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"waterlogged":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{waterlogged:'false'},_:{0:'waterlogged=false,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"waterlogged":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{waterlogged:'true'},_:{0:'waterlogged=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/70.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/70.json
deleted file mode 100644
index d7c300432e..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/70.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/36","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"conditional":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{conditional:'false'},_:{1:'conditional=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/36","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"conditional":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{conditional:'true'},_:{1:'conditional=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/71.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/71.json
deleted file mode 100644
index 86523f37d6..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/71.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"type":"single"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{type:'single'},_:{2:'type=single,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"type":"left"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{type:'left'},_:{2:'type=left,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"type":"right"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{type:'right'},_:{2:'type=right,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/72.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/72.json
deleted file mode 100644
index 7850b00016..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/72.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"slot_0_occupied":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{slot_0_occupied:'false'},_:{1:'slot_0_occupied=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"slot_0_occupied":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{slot_0_occupied:'true'},_:{1:'slot_0_occupied=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/73.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/73.json
deleted file mode 100644
index 8f424cd5f4..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/73.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/72","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"slot_1_occupied":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{slot_1_occupied:'false'},_:{2:'slot_1_occupied=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/72","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"slot_1_occupied":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{slot_1_occupied:'true'},_:{2:'slot_1_occupied=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/74.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/74.json
deleted file mode 100644
index 2aa3e314ba..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/74.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/73","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"slot_2_occupied":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{slot_2_occupied:'false'},_:{3:'slot_2_occupied=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/73","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"slot_2_occupied":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{slot_2_occupied:'true'},_:{3:'slot_2_occupied=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/75.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/75.json
deleted file mode 100644
index 56cde4c93a..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/75.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/74","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"slot_3_occupied":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{slot_3_occupied:'false'},_:{4:'slot_3_occupied=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/74","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"slot_3_occupied":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{slot_3_occupied:'true'},_:{4:'slot_3_occupied=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/76.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/76.json
deleted file mode 100644
index 6cc03e8232..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/76.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/75","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"slot_4_occupied":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{slot_4_occupied:'false'},_:{5:'slot_4_occupied=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/75","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"slot_4_occupied":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{slot_4_occupied:'true'},_:{5:'slot_4_occupied=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/77.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/77.json
deleted file mode 100644
index cde88e4160..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/77.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/76","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"slot_5_occupied":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{slot_5_occupied:'false'},_:{6:'slot_5_occupied=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/76","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"slot_5_occupied":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{slot_5_occupied:'true'},_:{6:'slot_5_occupied=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/78.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/78.json
deleted file mode 100644
index bab57c69c1..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/78.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'0'},_:{0:'age=0,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'1'},_:{0:'age=1,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'2'},_:{0:'age=2,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'3'},_:{0:'age=3,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'4'},_:{0:'age=4,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'5'},_:{0:'age=5,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/79.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/79.json
deleted file mode 100644
index 817c25ee86..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/79.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'0'},_:{1:'age=0,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'1'},_:{1:'age=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'2'},_:{1:'age=2,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/8.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/8.json
deleted file mode 100644
index 151660aa1a..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/8.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{east:'false'},_:{1:'east=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/7","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{east:'true'},_:{1:'east=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/80.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/80.json
deleted file mode 100644
index fae325b6e1..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/80.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"mode":"compare"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{mode:'compare'},_:{2:'mode=compare,'}}"}]},{"type":"loot_table","value":"bs.block:get/2","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"mode":"subtract"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{mode:'subtract'},_:{2:'mode=subtract,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/81.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/81.json
deleted file mode 100644
index 797bff79e9..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/81.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'0'},_:{0:'level=0,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'1'},_:{0:'level=1,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'2'},_:{0:'level=2,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'3'},_:{0:'level=3,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'4'},_:{0:'level=4,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'5'},_:{0:'level=5,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'6'},_:{0:'level=6,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'7'},_:{0:'level=7,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"8"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{level:'8'},_:{0:'level=8,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/82.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/82.json
deleted file mode 100644
index 143a1968c4..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/82.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"lit":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{lit:'false'},_:{1:'lit=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"lit":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{lit:'true'},_:{1:'lit=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/83.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/83.json
deleted file mode 100644
index 0c71744a24..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/83.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"orientation":"north_up"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{orientation:'north_up'},_:{0:'orientation=north_up,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"orientation":"south_up"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{orientation:'south_up'},_:{0:'orientation=south_up,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"orientation":"down_east"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{orientation:'down_east'},_:{0:'orientation=down_east,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"orientation":"down_north"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{orientation:'down_north'},_:{0:'orientation=down_north,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"orientation":"down_south"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{orientation:'down_south'},_:{0:'orientation=down_south,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"orientation":"down_west"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{orientation:'down_west'},_:{0:'orientation=down_west,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"orientation":"up_east"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{orientation:'up_east'},_:{0:'orientation=up_east,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"orientation":"up_north"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{orientation:'up_north'},_:{0:'orientation=up_north,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"orientation":"up_south"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{orientation:'up_south'},_:{0:'orientation=up_south,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"orientation":"up_west"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{orientation:'up_west'},_:{0:'orientation=up_west,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"orientation":"west_up"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{orientation:'west_up'},_:{0:'orientation=west_up,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"orientation":"east_up"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{orientation:'east_up'},_:{0:'orientation=east_up,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/84.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/84.json
deleted file mode 100644
index 54137562c6..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/84.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/83","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"triggered":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{triggered:'false'},_:{1:'triggered=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/83","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"triggered":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{triggered:'true'},_:{1:'triggered=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/85.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/85.json
deleted file mode 100644
index 5fe73ed870..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/85.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/84","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"crafting":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{crafting:'false'},_:{2:'crafting=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/84","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"crafting":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{crafting:'true'},_:{2:'crafting=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/86.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/86.json
deleted file mode 100644
index 3a164343d6..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/86.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"creaking":"disabled"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{creaking:'disabled'},_:{1:'creaking=disabled,'}}"}]},{"type":"loot_table","value":"bs.block:get/17","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"creaking":"dormant"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{creaking:'dormant'},_:{1:'creaking=dormant,'}}"}]},{"type":"loot_table","value":"bs.block:get/17","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"creaking":"active"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{creaking:'active'},_:{1:'creaking=active,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/87.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/87.json
deleted file mode 100644
index 1a0b60590a..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/87.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'0'},_:{1:'rotation=0,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'1'},_:{1:'rotation=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'2'},_:{1:'rotation=2,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'3'},_:{1:'rotation=3,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'4'},_:{1:'rotation=4,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'5'},_:{1:'rotation=5,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'6'},_:{1:'rotation=6,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'7'},_:{1:'rotation=7,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"8"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'8'},_:{1:'rotation=8,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"9"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'9'},_:{1:'rotation=9,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"10"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'10'},_:{1:'rotation=10,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"11"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'11'},_:{1:'rotation=11,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"12"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'12'},_:{1:'rotation=12,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"13"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'13'},_:{1:'rotation=13,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"14"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'14'},_:{1:'rotation=14,'}}"}]},{"type":"loot_table","value":"bs.block:get/18","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"15"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{rotation:'15'},_:{1:'rotation=15,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/88.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/88.json
deleted file mode 100644
index 41605d7b71..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/88.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'0'},_:{0:'power=0,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'1'},_:{0:'power=1,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'2'},_:{0:'power=2,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'3'},_:{0:'power=3,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'4'},_:{0:'power=4,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'5'},_:{0:'power=5,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'6'},_:{0:'power=6,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'7'},_:{0:'power=7,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"8"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'8'},_:{0:'power=8,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"9"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'9'},_:{0:'power=9,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"10"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'10'},_:{0:'power=10,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"11"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'11'},_:{0:'power=11,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"12"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'12'},_:{0:'power=12,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"13"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'13'},_:{0:'power=13,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"14"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'14'},_:{0:'power=14,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"15"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{power:'15'},_:{0:'power=15,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/89.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/89.json
deleted file mode 100644
index d4935effd9..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/89.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/88","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"inverted":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{inverted:'false'},_:{1:'inverted=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/88","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"inverted":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{inverted:'true'},_:{1:'inverted=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/9.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/9.json
deleted file mode 100644
index 3ca0d831bb..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/9.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/8","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{north:'false'},_:{2:'north=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/8","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{north:'true'},_:{2:'north=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/90.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/90.json
deleted file mode 100644
index f94dab0534..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/90.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"cracked":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{cracked:'false'},_:{2:'cracked=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/21","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"cracked":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{cracked:'true'},_:{2:'cracked=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/91.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/91.json
deleted file mode 100644
index b4b1cc74c8..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/91.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/36","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"triggered":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{triggered:'false'},_:{1:'triggered=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/36","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"triggered":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{triggered:'true'},_:{1:'triggered=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/92.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/92.json
deleted file mode 100644
index 9286ff8f03..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/92.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"eye":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{eye:'false'},_:{1:'eye=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"eye":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{eye:'true'},_:{1:'eye=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/93.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/93.json
deleted file mode 100644
index 0f986ca2a7..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/93.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"moisture":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{moisture:'0'},_:{0:'moisture=0,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"moisture":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{moisture:'1'},_:{0:'moisture=1,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"moisture":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{moisture:'2'},_:{0:'moisture=2,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"moisture":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{moisture:'3'},_:{0:'moisture=3,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"moisture":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{moisture:'4'},_:{0:'moisture=4,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"moisture":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{moisture:'5'},_:{0:'moisture=5,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"moisture":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{moisture:'6'},_:{0:'moisture=6,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"moisture":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{moisture:'7'},_:{0:'moisture=7,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/94.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/94.json
deleted file mode 100644
index cc8cc6f3ca..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/94.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'0'},_:{5:'age=0,'}}"}]},{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'1'},_:{5:'age=1,'}}"}]},{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'2'},_:{5:'age=2,'}}"}]},{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"3"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'3'},_:{5:'age=3,'}}"}]},{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"4"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'4'},_:{5:'age=4,'}}"}]},{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"5"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'5'},_:{5:'age=5,'}}"}]},{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"6"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'6'},_:{5:'age=6,'}}"}]},{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"7"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'7'},_:{5:'age=7,'}}"}]},{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"8"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'8'},_:{5:'age=8,'}}"}]},{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"9"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'9'},_:{5:'age=9,'}}"}]},{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"10"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'10'},_:{5:'age=10,'}}"}]},{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"11"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'11'},_:{5:'age=11,'}}"}]},{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"12"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'12'},_:{5:'age=12,'}}"}]},{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"13"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'13'},_:{5:'age=13,'}}"}]},{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"14"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'14'},_:{5:'age=14,'}}"}]},{"type":"loot_table","value":"bs.block:get/56","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"15"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{age:'15'},_:{5:'age=15,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/95.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/95.json
deleted file mode 100644
index d63603a789..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/95.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/11","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"down":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{down:'false'},_:{5:'down=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/11","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"down":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{down:'true'},_:{5:'down=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/96.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/96.json
deleted file mode 100644
index a7b19ea6ed..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/96.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/95","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{up:'false'},_:{6:'up=false,'}}"}]},{"type":"loot_table","value":"bs.block:get/95","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{up:'true'},_:{6:'up=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/97.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/97.json
deleted file mode 100644
index be59dc95d6..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/97.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"snowy":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{snowy:'false'},_:{0:'snowy=false,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"snowy":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{snowy:'true'},_:{0:'snowy=true,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/98.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/98.json
deleted file mode 100644
index de7a7ebb23..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/98.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"face":"wall"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{face:'wall'},_:{1:'face=wall,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"face":"ceiling"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{face:'ceiling'},_:{1:'face=ceiling,'}}"}]},{"type":"loot_table","value":"bs.block:get/1","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"face":"floor"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{face:'floor'},_:{1:'face=floor,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/99.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/99.json
deleted file mode 100644
index 4b4171946c..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/99.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"enabled":"true"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{enabled:'true'},_:{0:'enabled=true,'}}"}]},{"type":"item","name":"egg","conditions":[{"condition":"location_check","predicate":{"block":{"state":{"enabled":"false"}}}}],"functions":[{"function":"set_custom_data","tag":"{properties:{enabled:'false'},_:{0:'enabled=false,'}}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/loot_table/get/get.json b/datapacks/Bookshelf/data/bs.block/loot_table/get/get.json
deleted file mode 100644
index 1270d6eccb..0000000000
--- a/datapacks/Bookshelf/data/bs.block/loot_table/get/get.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:acacia_planks',item:'minecraft:acacia_planks',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_planks"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:air',item:'minecraft:air',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_planks","air"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:allium',item:'minecraft:allium',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["allium"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:amethyst_block',item:'minecraft:amethyst_block',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_planks","air","allium","amethyst_block"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:ancient_debris',item:'minecraft:ancient_debris',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["ancient_debris"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:andesite',item:'minecraft:andesite',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["ancient_debris","andesite"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:azalea',item:'minecraft:azalea',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["azalea"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:azure_bluet',item:'minecraft:azure_bluet',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_planks","air","allium","amethyst_block","ancient_debris","andesite","azalea","azure_bluet"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_mosaic',item:'minecraft:bamboo_mosaic',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_mosaic"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_planks',item:'minecraft:bamboo_planks',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_mosaic","bamboo_planks"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_sapling',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_sapling"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:beacon',item:'minecraft:beacon',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_mosaic","bamboo_planks","bamboo_sapling","beacon"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bedrock',item:'minecraft:bedrock',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bedrock"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:birch_planks',item:'minecraft:birch_planks',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bedrock","birch_planks"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:black_carpet',item:'minecraft:black_carpet',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["black_carpet"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:black_concrete',item:'minecraft:black_concrete',group:0}"}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_planks","air","allium","amethyst_block","ancient_debris","andesite","azalea","azure_bluet","bamboo_mosaic","bamboo_planks","bamboo_sapling","beacon","bedrock","birch_planks","black_carpet","black_concrete"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:black_concrete_powder',item:'minecraft:black_concrete_powder',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["black_concrete_powder"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:black_stained_glass',item:'minecraft:black_stained_glass',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["black_concrete_powder","black_stained_glass"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:black_terracotta',item:'minecraft:black_terracotta',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["black_terracotta"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:black_wool',item:'minecraft:black_wool',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["black_concrete_powder","black_stained_glass","black_terracotta","black_wool"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blackstone',item:'minecraft:blackstone',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["blackstone"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blue_carpet',item:'minecraft:blue_carpet',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["blackstone","blue_carpet"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blue_concrete',item:'minecraft:blue_concrete',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["blue_concrete"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blue_concrete_powder',item:'minecraft:blue_concrete_powder',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["black_concrete_powder","black_stained_glass","black_terracotta","black_wool","blackstone","blue_carpet","blue_concrete","blue_concrete_powder"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blue_ice',item:'minecraft:blue_ice',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["blue_ice"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blue_orchid',item:'minecraft:blue_orchid',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["blue_ice","blue_orchid"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blue_stained_glass',item:'minecraft:blue_stained_glass',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["blue_stained_glass"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blue_terracotta',item:'minecraft:blue_terracotta',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["blue_ice","blue_orchid","blue_stained_glass","blue_terracotta"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blue_wool',item:'minecraft:blue_wool',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["blue_wool"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bookshelf',item:'minecraft:bookshelf',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["blue_wool","bookshelf"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brain_coral_block',item:'minecraft:brain_coral_block',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brain_coral_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bricks',item:'minecraft:bricks',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bricks"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brown_carpet',item:'minecraft:brown_carpet',group:0}"}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_planks","air","allium","amethyst_block","ancient_debris","andesite","azalea","azure_bluet","bamboo_mosaic","bamboo_planks","bamboo_sapling","beacon","bedrock","birch_planks","black_carpet","black_concrete","black_concrete_powder","black_stained_glass","black_terracotta","black_wool","blackstone","blue_carpet","blue_concrete","blue_concrete_powder","blue_ice","blue_orchid","blue_stained_glass","blue_terracotta","blue_wool","bookshelf","brain_coral_block","bricks","brown_carpet"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brown_concrete',item:'minecraft:brown_concrete',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brown_concrete"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brown_concrete_powder',item:'minecraft:brown_concrete_powder',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brown_concrete","brown_concrete_powder"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brown_mushroom',item:'minecraft:brown_mushroom',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brown_mushroom"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brown_stained_glass',item:'minecraft:brown_stained_glass',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brown_concrete","brown_concrete_powder","brown_mushroom","brown_stained_glass"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brown_terracotta',item:'minecraft:brown_terracotta',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brown_terracotta"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brown_wool',item:'minecraft:brown_wool',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brown_terracotta","brown_wool"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bubble_coral_block',item:'minecraft:bubble_coral_block',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bubble_coral_block"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:budding_amethyst',item:'minecraft:budding_amethyst',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brown_concrete","brown_concrete_powder","brown_mushroom","brown_stained_glass","brown_terracotta","brown_wool","bubble_coral_block","budding_amethyst"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:calcite',item:'minecraft:calcite',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["calcite"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cartography_table',item:'minecraft:cartography_table',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["calcite","cartography_table"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cauldron',item:'minecraft:cauldron',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cauldron"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cave_air',item:'None',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["calcite","cartography_table","cauldron","cave_air"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cherry_planks',item:'minecraft:cherry_planks',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cherry_planks"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:chiseled_copper',item:'minecraft:chiseled_copper',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cherry_planks","chiseled_copper"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:chiseled_deepslate',item:'minecraft:chiseled_deepslate',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["chiseled_deepslate"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:chiseled_nether_bricks',item:'minecraft:chiseled_nether_bricks',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["chiseled_nether_bricks"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:chiseled_polished_blackstone',item:'minecraft:chiseled_polished_blackstone',group:0}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brown_concrete","brown_concrete_powder","brown_mushroom","brown_stained_glass","brown_terracotta","brown_wool","bubble_coral_block","budding_amethyst","calcite","cartography_table","cauldron","cave_air","cherry_planks","chiseled_copper","chiseled_deepslate","chiseled_nether_bricks","chiseled_polished_blackstone"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:chiseled_quartz_block',item:'minecraft:chiseled_quartz_block',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["chiseled_quartz_block"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:chiseled_red_sandstone',item:'minecraft:chiseled_red_sandstone',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["chiseled_quartz_block","chiseled_red_sandstone"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:chiseled_sandstone',item:'minecraft:chiseled_sandstone',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["chiseled_sandstone"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:chiseled_stone_bricks',item:'minecraft:chiseled_stone_bricks',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["chiseled_quartz_block","chiseled_red_sandstone","chiseled_sandstone","chiseled_stone_bricks"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:chiseled_tuff',item:'minecraft:chiseled_tuff',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["chiseled_tuff"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:chiseled_tuff_bricks',item:'minecraft:chiseled_tuff_bricks',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["chiseled_tuff","chiseled_tuff_bricks"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:clay',item:'minecraft:clay',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["clay"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:coal_block',item:'minecraft:coal_block',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["chiseled_quartz_block","chiseled_red_sandstone","chiseled_sandstone","chiseled_stone_bricks","chiseled_tuff","chiseled_tuff_bricks","clay","coal_block"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:coal_ore',item:'minecraft:coal_ore',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["coal_ore"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:coarse_dirt',item:'minecraft:coarse_dirt',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["coal_ore","coarse_dirt"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cobbled_deepslate',item:'minecraft:cobbled_deepslate',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cobbled_deepslate"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cobblestone',item:'minecraft:cobblestone',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["coal_ore","coarse_dirt","cobbled_deepslate","cobblestone"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cobweb',item:'minecraft:cobweb',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cobweb"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:copper_block',item:'minecraft:copper_block',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cobweb","copper_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:copper_ore',item:'minecraft:copper_ore',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["copper_ore"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cornflower',item:'minecraft:cornflower',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cornflower"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cracked_deepslate_bricks',item:'minecraft:cracked_deepslate_bricks',group:0}"}]}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_planks","air","allium","amethyst_block","ancient_debris","andesite","azalea","azure_bluet","bamboo_mosaic","bamboo_planks","bamboo_sapling","beacon","bedrock","birch_planks","black_carpet","black_concrete","black_concrete_powder","black_stained_glass","black_terracotta","black_wool","blackstone","blue_carpet","blue_concrete","blue_concrete_powder","blue_ice","blue_orchid","blue_stained_glass","blue_terracotta","blue_wool","bookshelf","brain_coral_block","bricks","brown_carpet","brown_concrete","brown_concrete_powder","brown_mushroom","brown_stained_glass","brown_terracotta","brown_wool","bubble_coral_block","budding_amethyst","calcite","cartography_table","cauldron","cave_air","cherry_planks","chiseled_copper","chiseled_deepslate","chiseled_nether_bricks","chiseled_polished_blackstone","chiseled_quartz_block","chiseled_red_sandstone","chiseled_sandstone","chiseled_stone_bricks","chiseled_tuff","chiseled_tuff_bricks","clay","coal_block","coal_ore","coarse_dirt","cobbled_deepslate","cobblestone","cobweb","copper_block","copper_ore","cornflower","cracked_deepslate_bricks"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cracked_deepslate_tiles',item:'minecraft:cracked_deepslate_tiles',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cracked_deepslate_tiles"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cracked_nether_bricks',item:'minecraft:cracked_nether_bricks',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cracked_deepslate_tiles","cracked_nether_bricks"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cracked_polished_blackstone_bricks',item:'minecraft:cracked_polished_blackstone_bricks',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cracked_polished_blackstone_bricks"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cracked_stone_bricks',item:'minecraft:cracked_stone_bricks',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cracked_deepslate_tiles","cracked_nether_bricks","cracked_polished_blackstone_bricks","cracked_stone_bricks"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crafting_table',item:'minecraft:crafting_table',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crafting_table"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_fungus',item:'minecraft:crimson_fungus',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crafting_table","crimson_fungus"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_nylium',item:'minecraft:crimson_nylium',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crimson_nylium"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_planks',item:'minecraft:crimson_planks',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cracked_deepslate_tiles","cracked_nether_bricks","cracked_polished_blackstone_bricks","cracked_stone_bricks","crafting_table","crimson_fungus","crimson_nylium","crimson_planks"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_roots',item:'minecraft:crimson_roots',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crimson_roots"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crying_obsidian',item:'minecraft:crying_obsidian',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crimson_roots","crying_obsidian"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cut_copper',item:'minecraft:cut_copper',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cut_copper"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cut_red_sandstone',item:'minecraft:cut_red_sandstone',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crimson_roots","crying_obsidian","cut_copper","cut_red_sandstone"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cut_sandstone',item:'minecraft:cut_sandstone',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cut_sandstone"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cyan_carpet',item:'minecraft:cyan_carpet',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cut_sandstone","cyan_carpet"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cyan_concrete',item:'minecraft:cyan_concrete',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cyan_concrete"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cyan_concrete_powder',item:'minecraft:cyan_concrete_powder',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cyan_concrete_powder"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cyan_stained_glass',item:'minecraft:cyan_stained_glass',group:0}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cracked_deepslate_tiles","cracked_nether_bricks","cracked_polished_blackstone_bricks","cracked_stone_bricks","crafting_table","crimson_fungus","crimson_nylium","crimson_planks","crimson_roots","crying_obsidian","cut_copper","cut_red_sandstone","cut_sandstone","cyan_carpet","cyan_concrete","cyan_concrete_powder","cyan_stained_glass"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cyan_terracotta',item:'minecraft:cyan_terracotta',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cyan_terracotta"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cyan_wool',item:'minecraft:cyan_wool',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cyan_terracotta","cyan_wool"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dandelion',item:'minecraft:dandelion',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dandelion"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_oak_planks',item:'minecraft:dark_oak_planks',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cyan_terracotta","cyan_wool","dandelion","dark_oak_planks"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_prismarine',item:'minecraft:dark_prismarine',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_prismarine"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_brain_coral_block',item:'minecraft:dead_brain_coral_block',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_prismarine","dead_brain_coral_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_bubble_coral_block',item:'minecraft:dead_bubble_coral_block',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_bubble_coral_block"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_bush',item:'minecraft:dead_bush',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cyan_terracotta","cyan_wool","dandelion","dark_oak_planks","dark_prismarine","dead_brain_coral_block","dead_bubble_coral_block","dead_bush"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_fire_coral_block',item:'minecraft:dead_fire_coral_block',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_fire_coral_block"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_horn_coral_block',item:'minecraft:dead_horn_coral_block',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_fire_coral_block","dead_horn_coral_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_tube_coral_block',item:'minecraft:dead_tube_coral_block',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_tube_coral_block"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:deepslate_bricks',item:'minecraft:deepslate_bricks',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_fire_coral_block","dead_horn_coral_block","dead_tube_coral_block","deepslate_bricks"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:deepslate_coal_ore',item:'minecraft:deepslate_coal_ore',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["deepslate_coal_ore"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:deepslate_copper_ore',item:'minecraft:deepslate_copper_ore',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["deepslate_coal_ore","deepslate_copper_ore"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:deepslate_diamond_ore',item:'minecraft:deepslate_diamond_ore',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["deepslate_diamond_ore"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:deepslate_emerald_ore',item:'minecraft:deepslate_emerald_ore',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["deepslate_emerald_ore"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:deepslate_gold_ore',item:'minecraft:deepslate_gold_ore',group:0}"}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cracked_deepslate_tiles","cracked_nether_bricks","cracked_polished_blackstone_bricks","cracked_stone_bricks","crafting_table","crimson_fungus","crimson_nylium","crimson_planks","crimson_roots","crying_obsidian","cut_copper","cut_red_sandstone","cut_sandstone","cyan_carpet","cyan_concrete","cyan_concrete_powder","cyan_stained_glass","cyan_terracotta","cyan_wool","dandelion","dark_oak_planks","dark_prismarine","dead_brain_coral_block","dead_bubble_coral_block","dead_bush","dead_fire_coral_block","dead_horn_coral_block","dead_tube_coral_block","deepslate_bricks","deepslate_coal_ore","deepslate_copper_ore","deepslate_diamond_ore","deepslate_emerald_ore","deepslate_gold_ore"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:deepslate_iron_ore',item:'minecraft:deepslate_iron_ore',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["deepslate_iron_ore"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:deepslate_lapis_ore',item:'minecraft:deepslate_lapis_ore',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["deepslate_iron_ore","deepslate_lapis_ore"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:deepslate_tiles',item:'minecraft:deepslate_tiles',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["deepslate_tiles"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:diamond_block',item:'minecraft:diamond_block',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["deepslate_iron_ore","deepslate_lapis_ore","deepslate_tiles","diamond_block"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:diamond_ore',item:'minecraft:diamond_ore',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["diamond_ore"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:diorite',item:'minecraft:diorite',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["diamond_ore","diorite"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dirt',item:'minecraft:dirt',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dirt"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dirt_path',item:'minecraft:dirt_path',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["deepslate_iron_ore","deepslate_lapis_ore","deepslate_tiles","diamond_block","diamond_ore","diorite","dirt","dirt_path"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dragon_egg',item:'minecraft:dragon_egg',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dragon_egg"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dried_kelp_block',item:'minecraft:dried_kelp_block',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dragon_egg","dried_kelp_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dripstone_block',item:'minecraft:dripstone_block',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dripstone_block"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:emerald_block',item:'minecraft:emerald_block',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dragon_egg","dried_kelp_block","dripstone_block","emerald_block"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:emerald_ore',item:'minecraft:emerald_ore',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["emerald_ore"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:enchanting_table',item:'minecraft:enchanting_table',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["emerald_ore","enchanting_table"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:end_gateway',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["end_gateway"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:end_portal',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["end_portal"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:end_stone',item:'minecraft:end_stone',group:0}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["deepslate_iron_ore","deepslate_lapis_ore","deepslate_tiles","diamond_block","diamond_ore","diorite","dirt","dirt_path","dragon_egg","dried_kelp_block","dripstone_block","emerald_block","emerald_ore","enchanting_table","end_gateway","end_portal","end_stone"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:end_stone_bricks',item:'minecraft:end_stone_bricks',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["end_stone_bricks"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:exposed_chiseled_copper',item:'minecraft:exposed_chiseled_copper',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["end_stone_bricks","exposed_chiseled_copper"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:exposed_copper',item:'minecraft:exposed_copper',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["exposed_copper"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:exposed_cut_copper',item:'minecraft:exposed_cut_copper',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["end_stone_bricks","exposed_chiseled_copper","exposed_copper","exposed_cut_copper"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:fern',item:'minecraft:fern',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["fern"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:fire_coral_block',item:'minecraft:fire_coral_block',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["fern","fire_coral_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:fletching_table',item:'minecraft:fletching_table',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["fletching_table"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:flower_pot',item:'minecraft:flower_pot',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["end_stone_bricks","exposed_chiseled_copper","exposed_copper","exposed_cut_copper","fern","fire_coral_block","fletching_table","flower_pot"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:flowering_azalea',item:'minecraft:flowering_azalea',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["flowering_azalea"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:frogspawn',item:'minecraft:frogspawn',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["flowering_azalea","frogspawn"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gilded_blackstone',item:'minecraft:gilded_blackstone',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["gilded_blackstone"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:glass',item:'minecraft:glass',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["flowering_azalea","frogspawn","gilded_blackstone","glass"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:glowstone',item:'minecraft:glowstone',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["glowstone"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gold_block',item:'minecraft:gold_block',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["glowstone","gold_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gold_ore',item:'minecraft:gold_ore',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["gold_ore"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:granite',item:'minecraft:granite',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["granite"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gravel',item:'minecraft:gravel',group:0}"}]}]}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_planks","air","allium","amethyst_block","ancient_debris","andesite","azalea","azure_bluet","bamboo_mosaic","bamboo_planks","bamboo_sapling","beacon","bedrock","birch_planks","black_carpet","black_concrete","black_concrete_powder","black_stained_glass","black_terracotta","black_wool","blackstone","blue_carpet","blue_concrete","blue_concrete_powder","blue_ice","blue_orchid","blue_stained_glass","blue_terracotta","blue_wool","bookshelf","brain_coral_block","bricks","brown_carpet","brown_concrete","brown_concrete_powder","brown_mushroom","brown_stained_glass","brown_terracotta","brown_wool","bubble_coral_block","budding_amethyst","calcite","cartography_table","cauldron","cave_air","cherry_planks","chiseled_copper","chiseled_deepslate","chiseled_nether_bricks","chiseled_polished_blackstone","chiseled_quartz_block","chiseled_red_sandstone","chiseled_sandstone","chiseled_stone_bricks","chiseled_tuff","chiseled_tuff_bricks","clay","coal_block","coal_ore","coarse_dirt","cobbled_deepslate","cobblestone","cobweb","copper_block","copper_ore","cornflower","cracked_deepslate_bricks","cracked_deepslate_tiles","cracked_nether_bricks","cracked_polished_blackstone_bricks","cracked_stone_bricks","crafting_table","crimson_fungus","crimson_nylium","crimson_planks","crimson_roots","crying_obsidian","cut_copper","cut_red_sandstone","cut_sandstone","cyan_carpet","cyan_concrete","cyan_concrete_powder","cyan_stained_glass","cyan_terracotta","cyan_wool","dandelion","dark_oak_planks","dark_prismarine","dead_brain_coral_block","dead_bubble_coral_block","dead_bush","dead_fire_coral_block","dead_horn_coral_block","dead_tube_coral_block","deepslate_bricks","deepslate_coal_ore","deepslate_copper_ore","deepslate_diamond_ore","deepslate_emerald_ore","deepslate_gold_ore","deepslate_iron_ore","deepslate_lapis_ore","deepslate_tiles","diamond_block","diamond_ore","diorite","dirt","dirt_path","dragon_egg","dried_kelp_block","dripstone_block","emerald_block","emerald_ore","enchanting_table","end_gateway","end_portal","end_stone","end_stone_bricks","exposed_chiseled_copper","exposed_copper","exposed_cut_copper","fern","fire_coral_block","fletching_table","flower_pot","flowering_azalea","frogspawn","gilded_blackstone","glass","glowstone","gold_block","gold_ore","granite","gravel"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gray_carpet',item:'minecraft:gray_carpet',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["gray_carpet"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gray_concrete',item:'minecraft:gray_concrete',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["gray_carpet","gray_concrete"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gray_concrete_powder',item:'minecraft:gray_concrete_powder',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["gray_concrete_powder"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gray_stained_glass',item:'minecraft:gray_stained_glass',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["gray_carpet","gray_concrete","gray_concrete_powder","gray_stained_glass"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gray_terracotta',item:'minecraft:gray_terracotta',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["gray_terracotta"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gray_wool',item:'minecraft:gray_wool',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["gray_terracotta","gray_wool"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:green_carpet',item:'minecraft:green_carpet',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_carpet"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:green_concrete',item:'minecraft:green_concrete',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["gray_carpet","gray_concrete","gray_concrete_powder","gray_stained_glass","gray_terracotta","gray_wool","green_carpet","green_concrete"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:green_concrete_powder',item:'minecraft:green_concrete_powder',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_concrete_powder"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:green_stained_glass',item:'minecraft:green_stained_glass',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_concrete_powder","green_stained_glass"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:green_terracotta',item:'minecraft:green_terracotta',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_terracotta"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:green_wool',item:'minecraft:green_wool',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_concrete_powder","green_stained_glass","green_terracotta","green_wool"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:honey_block',item:'minecraft:honey_block',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["honey_block"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:honeycomb_block',item:'minecraft:honeycomb_block',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["honey_block","honeycomb_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:horn_coral_block',item:'minecraft:horn_coral_block',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["horn_coral_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:ice',item:'minecraft:ice',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["ice"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:infested_chiseled_stone_bricks',item:'minecraft:infested_chiseled_stone_bricks',group:0}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["gray_carpet","gray_concrete","gray_concrete_powder","gray_stained_glass","gray_terracotta","gray_wool","green_carpet","green_concrete","green_concrete_powder","green_stained_glass","green_terracotta","green_wool","honey_block","honeycomb_block","horn_coral_block","ice","infested_chiseled_stone_bricks"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:infested_cobblestone',item:'minecraft:infested_cobblestone',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["infested_cobblestone"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:infested_cracked_stone_bricks',item:'minecraft:infested_cracked_stone_bricks',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["infested_cobblestone","infested_cracked_stone_bricks"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:infested_mossy_stone_bricks',item:'minecraft:infested_mossy_stone_bricks',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["infested_mossy_stone_bricks"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:infested_stone',item:'minecraft:infested_stone',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["infested_cobblestone","infested_cracked_stone_bricks","infested_mossy_stone_bricks","infested_stone"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:infested_stone_bricks',item:'minecraft:infested_stone_bricks',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["infested_stone_bricks"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:iron_block',item:'minecraft:iron_block',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["infested_stone_bricks","iron_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:iron_ore',item:'minecraft:iron_ore',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["iron_ore"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jungle_planks',item:'minecraft:jungle_planks',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["infested_cobblestone","infested_cracked_stone_bricks","infested_mossy_stone_bricks","infested_stone","infested_stone_bricks","iron_block","iron_ore","jungle_planks"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:kelp_plant',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["kelp_plant"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lapis_block',item:'minecraft:lapis_block',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["kelp_plant","lapis_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lapis_ore',item:'minecraft:lapis_ore',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lapis_ore"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lava_cauldron',item:'minecraft:cauldron',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["kelp_plant","lapis_block","lapis_ore","lava_cauldron"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_blue_carpet',item:'minecraft:light_blue_carpet',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_carpet"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_blue_concrete',item:'minecraft:light_blue_concrete',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_carpet","light_blue_concrete"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_blue_concrete_powder',item:'minecraft:light_blue_concrete_powder',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_concrete_powder"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_blue_stained_glass',item:'minecraft:light_blue_stained_glass',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_stained_glass"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_blue_terracotta',item:'minecraft:light_blue_terracotta',group:0}"}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["gray_carpet","gray_concrete","gray_concrete_powder","gray_stained_glass","gray_terracotta","gray_wool","green_carpet","green_concrete","green_concrete_powder","green_stained_glass","green_terracotta","green_wool","honey_block","honeycomb_block","horn_coral_block","ice","infested_chiseled_stone_bricks","infested_cobblestone","infested_cracked_stone_bricks","infested_mossy_stone_bricks","infested_stone","infested_stone_bricks","iron_block","iron_ore","jungle_planks","kelp_plant","lapis_block","lapis_ore","lava_cauldron","light_blue_carpet","light_blue_concrete","light_blue_concrete_powder","light_blue_stained_glass","light_blue_terracotta"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_blue_wool',item:'minecraft:light_blue_wool',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_wool"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_gray_carpet',item:'minecraft:light_gray_carpet',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_wool","light_gray_carpet"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_gray_concrete',item:'minecraft:light_gray_concrete',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_gray_concrete"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_gray_concrete_powder',item:'minecraft:light_gray_concrete_powder',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_wool","light_gray_carpet","light_gray_concrete","light_gray_concrete_powder"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_gray_stained_glass',item:'minecraft:light_gray_stained_glass',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_gray_stained_glass"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_gray_terracotta',item:'minecraft:light_gray_terracotta',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_gray_stained_glass","light_gray_terracotta"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_gray_wool',item:'minecraft:light_gray_wool',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_gray_wool"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lily_of_the_valley',item:'minecraft:lily_of_the_valley',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_wool","light_gray_carpet","light_gray_concrete","light_gray_concrete_powder","light_gray_stained_glass","light_gray_terracotta","light_gray_wool","lily_of_the_valley"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lily_pad',item:'minecraft:lily_pad',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lily_pad"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lime_carpet',item:'minecraft:lime_carpet',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lily_pad","lime_carpet"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lime_concrete',item:'minecraft:lime_concrete',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lime_concrete"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lime_concrete_powder',item:'minecraft:lime_concrete_powder',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lily_pad","lime_carpet","lime_concrete","lime_concrete_powder"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lime_stained_glass',item:'minecraft:lime_stained_glass',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lime_stained_glass"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lime_terracotta',item:'minecraft:lime_terracotta',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lime_stained_glass","lime_terracotta"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lime_wool',item:'minecraft:lime_wool',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lime_wool"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lodestone',item:'minecraft:lodestone',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lodestone"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:magenta_carpet',item:'minecraft:magenta_carpet',group:0}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_wool","light_gray_carpet","light_gray_concrete","light_gray_concrete_powder","light_gray_stained_glass","light_gray_terracotta","light_gray_wool","lily_of_the_valley","lily_pad","lime_carpet","lime_concrete","lime_concrete_powder","lime_stained_glass","lime_terracotta","lime_wool","lodestone","magenta_carpet"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:magenta_concrete',item:'minecraft:magenta_concrete',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["magenta_concrete"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:magenta_concrete_powder',item:'minecraft:magenta_concrete_powder',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["magenta_concrete","magenta_concrete_powder"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:magenta_stained_glass',item:'minecraft:magenta_stained_glass',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["magenta_stained_glass"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:magenta_terracotta',item:'minecraft:magenta_terracotta',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["magenta_concrete","magenta_concrete_powder","magenta_stained_glass","magenta_terracotta"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:magenta_wool',item:'minecraft:magenta_wool',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["magenta_wool"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:magma_block',item:'minecraft:magma_block',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["magenta_wool","magma_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_planks',item:'minecraft:mangrove_planks',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_planks"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:melon',item:'minecraft:melon',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["magenta_concrete","magenta_concrete_powder","magenta_stained_glass","magenta_terracotta","magenta_wool","magma_block","mangrove_planks","melon"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:moss_block',item:'minecraft:moss_block',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["moss_block"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:moss_carpet',item:'minecraft:moss_carpet',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["moss_block","moss_carpet"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mossy_cobblestone',item:'minecraft:mossy_cobblestone',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mossy_cobblestone"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mossy_stone_bricks',item:'minecraft:mossy_stone_bricks',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["moss_block","moss_carpet","mossy_cobblestone","mossy_stone_bricks"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mud',item:'minecraft:mud',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mud"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mud_bricks',item:'minecraft:mud_bricks',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mud","mud_bricks"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:nether_bricks',item:'minecraft:nether_bricks',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_bricks"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:nether_gold_ore',item:'minecraft:nether_gold_ore',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_gold_ore"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:nether_quartz_ore',item:'minecraft:nether_quartz_ore',group:0}"}]}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["gray_carpet","gray_concrete","gray_concrete_powder","gray_stained_glass","gray_terracotta","gray_wool","green_carpet","green_concrete","green_concrete_powder","green_stained_glass","green_terracotta","green_wool","honey_block","honeycomb_block","horn_coral_block","ice","infested_chiseled_stone_bricks","infested_cobblestone","infested_cracked_stone_bricks","infested_mossy_stone_bricks","infested_stone","infested_stone_bricks","iron_block","iron_ore","jungle_planks","kelp_plant","lapis_block","lapis_ore","lava_cauldron","light_blue_carpet","light_blue_concrete","light_blue_concrete_powder","light_blue_stained_glass","light_blue_terracotta","light_blue_wool","light_gray_carpet","light_gray_concrete","light_gray_concrete_powder","light_gray_stained_glass","light_gray_terracotta","light_gray_wool","lily_of_the_valley","lily_pad","lime_carpet","lime_concrete","lime_concrete_powder","lime_stained_glass","lime_terracotta","lime_wool","lodestone","magenta_carpet","magenta_concrete","magenta_concrete_powder","magenta_stained_glass","magenta_terracotta","magenta_wool","magma_block","mangrove_planks","melon","moss_block","moss_carpet","mossy_cobblestone","mossy_stone_bricks","mud","mud_bricks","nether_bricks","nether_gold_ore","nether_quartz_ore"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:nether_sprouts',item:'minecraft:nether_sprouts',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_sprouts"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:nether_wart_block',item:'minecraft:nether_wart_block',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_sprouts","nether_wart_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:netherite_block',item:'minecraft:netherite_block',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["netherite_block"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:netherrack',item:'minecraft:netherrack',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_sprouts","nether_wart_block","netherite_block","netherrack"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oak_planks',item:'minecraft:oak_planks',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_planks"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:obsidian',item:'minecraft:obsidian',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_planks","obsidian"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:orange_carpet',item:'minecraft:orange_carpet',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["orange_carpet"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:orange_concrete',item:'minecraft:orange_concrete',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_sprouts","nether_wart_block","netherite_block","netherrack","oak_planks","obsidian","orange_carpet","orange_concrete"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:orange_concrete_powder',item:'minecraft:orange_concrete_powder',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["orange_concrete_powder"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:orange_stained_glass',item:'minecraft:orange_stained_glass',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["orange_concrete_powder","orange_stained_glass"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:orange_terracotta',item:'minecraft:orange_terracotta',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["orange_terracotta"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:orange_tulip',item:'minecraft:orange_tulip',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["orange_concrete_powder","orange_stained_glass","orange_terracotta","orange_tulip"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:orange_wool',item:'minecraft:orange_wool',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["orange_wool"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oxeye_daisy',item:'minecraft:oxeye_daisy',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["orange_wool","oxeye_daisy"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oxidized_chiseled_copper',item:'minecraft:oxidized_chiseled_copper',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oxidized_chiseled_copper"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oxidized_copper',item:'minecraft:oxidized_copper',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oxidized_copper"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oxidized_cut_copper',item:'minecraft:oxidized_cut_copper',group:0}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_sprouts","nether_wart_block","netherite_block","netherrack","oak_planks","obsidian","orange_carpet","orange_concrete","orange_concrete_powder","orange_stained_glass","orange_terracotta","orange_tulip","orange_wool","oxeye_daisy","oxidized_chiseled_copper","oxidized_copper","oxidized_cut_copper"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:packed_ice',item:'minecraft:packed_ice',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["packed_ice"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:packed_mud',item:'minecraft:packed_mud',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["packed_ice","packed_mud"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_moss_block',item:'minecraft:pale_moss_block',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pale_moss_block"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_oak_planks',item:'minecraft:pale_oak_planks',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["packed_ice","packed_mud","pale_moss_block","pale_oak_planks"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pink_carpet',item:'minecraft:pink_carpet',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pink_carpet"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pink_concrete',item:'minecraft:pink_concrete',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pink_carpet","pink_concrete"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pink_concrete_powder',item:'minecraft:pink_concrete_powder',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pink_concrete_powder"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pink_stained_glass',item:'minecraft:pink_stained_glass',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["packed_ice","packed_mud","pale_moss_block","pale_oak_planks","pink_carpet","pink_concrete","pink_concrete_powder","pink_stained_glass"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pink_terracotta',item:'minecraft:pink_terracotta',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pink_terracotta"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pink_tulip',item:'minecraft:pink_tulip',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pink_terracotta","pink_tulip"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pink_wool',item:'minecraft:pink_wool',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pink_wool"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_andesite',item:'minecraft:polished_andesite',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pink_terracotta","pink_tulip","pink_wool","polished_andesite"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_blackstone',item:'minecraft:polished_blackstone',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_blackstone"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_blackstone_bricks',item:'minecraft:polished_blackstone_bricks',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_blackstone","polished_blackstone_bricks"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_deepslate',item:'minecraft:polished_deepslate',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_deepslate"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_diorite',item:'minecraft:polished_diorite',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_diorite"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_granite',item:'minecraft:polished_granite',group:0}"}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_sprouts","nether_wart_block","netherite_block","netherrack","oak_planks","obsidian","orange_carpet","orange_concrete","orange_concrete_powder","orange_stained_glass","orange_terracotta","orange_tulip","orange_wool","oxeye_daisy","oxidized_chiseled_copper","oxidized_copper","oxidized_cut_copper","packed_ice","packed_mud","pale_moss_block","pale_oak_planks","pink_carpet","pink_concrete","pink_concrete_powder","pink_stained_glass","pink_terracotta","pink_tulip","pink_wool","polished_andesite","polished_blackstone","polished_blackstone_bricks","polished_deepslate","polished_diorite","polished_granite"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_tuff',item:'minecraft:polished_tuff',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_tuff"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:poppy',item:'minecraft:poppy',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_tuff","poppy"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_acacia_sapling',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_acacia_sapling"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_allium',item:'None',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_tuff","poppy","potted_acacia_sapling","potted_allium"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_azalea_bush',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_azalea_bush"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_azure_bluet',item:'None',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_azalea_bush","potted_azure_bluet"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_bamboo',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_bamboo"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_birch_sapling',item:'None',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_tuff","poppy","potted_acacia_sapling","potted_allium","potted_azalea_bush","potted_azure_bluet","potted_bamboo","potted_birch_sapling"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_blue_orchid',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_blue_orchid"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_brown_mushroom',item:'None',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_blue_orchid","potted_brown_mushroom"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_cactus',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_cactus"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_cherry_sapling',item:'None',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_blue_orchid","potted_brown_mushroom","potted_cactus","potted_cherry_sapling"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_cornflower',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_cornflower"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_crimson_fungus',item:'None',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_cornflower","potted_crimson_fungus"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_crimson_roots',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_crimson_roots"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_dandelion',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_dandelion"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_dark_oak_sapling',item:'None',group:0}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_tuff","poppy","potted_acacia_sapling","potted_allium","potted_azalea_bush","potted_azure_bluet","potted_bamboo","potted_birch_sapling","potted_blue_orchid","potted_brown_mushroom","potted_cactus","potted_cherry_sapling","potted_cornflower","potted_crimson_fungus","potted_crimson_roots","potted_dandelion","potted_dark_oak_sapling"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_dead_bush',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_dead_bush"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_fern',item:'None',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_dead_bush","potted_fern"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_flowering_azalea_bush',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_flowering_azalea_bush"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_jungle_sapling',item:'None',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_dead_bush","potted_fern","potted_flowering_azalea_bush","potted_jungle_sapling"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_lily_of_the_valley',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_lily_of_the_valley"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_mangrove_propagule',item:'None',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_lily_of_the_valley","potted_mangrove_propagule"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_oak_sapling',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_oak_sapling"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_orange_tulip',item:'None',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_dead_bush","potted_fern","potted_flowering_azalea_bush","potted_jungle_sapling","potted_lily_of_the_valley","potted_mangrove_propagule","potted_oak_sapling","potted_orange_tulip"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_oxeye_daisy',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_oxeye_daisy"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_pale_oak_sapling',item:'None',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_oxeye_daisy","potted_pale_oak_sapling"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_pink_tulip',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_pink_tulip"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_poppy',item:'None',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_oxeye_daisy","potted_pale_oak_sapling","potted_pink_tulip","potted_poppy"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_red_mushroom',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_red_mushroom"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_red_tulip',item:'None',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_red_mushroom","potted_red_tulip"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_spruce_sapling',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_spruce_sapling"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_torchflower',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_torchflower"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_warped_fungus',item:'None',group:0}"}]}]}]}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_planks","air","allium","amethyst_block","ancient_debris","andesite","azalea","azure_bluet","bamboo_mosaic","bamboo_planks","bamboo_sapling","beacon","bedrock","birch_planks","black_carpet","black_concrete","black_concrete_powder","black_stained_glass","black_terracotta","black_wool","blackstone","blue_carpet","blue_concrete","blue_concrete_powder","blue_ice","blue_orchid","blue_stained_glass","blue_terracotta","blue_wool","bookshelf","brain_coral_block","bricks","brown_carpet","brown_concrete","brown_concrete_powder","brown_mushroom","brown_stained_glass","brown_terracotta","brown_wool","bubble_coral_block","budding_amethyst","calcite","cartography_table","cauldron","cave_air","cherry_planks","chiseled_copper","chiseled_deepslate","chiseled_nether_bricks","chiseled_polished_blackstone","chiseled_quartz_block","chiseled_red_sandstone","chiseled_sandstone","chiseled_stone_bricks","chiseled_tuff","chiseled_tuff_bricks","clay","coal_block","coal_ore","coarse_dirt","cobbled_deepslate","cobblestone","cobweb","copper_block","copper_ore","cornflower","cracked_deepslate_bricks","cracked_deepslate_tiles","cracked_nether_bricks","cracked_polished_blackstone_bricks","cracked_stone_bricks","crafting_table","crimson_fungus","crimson_nylium","crimson_planks","crimson_roots","crying_obsidian","cut_copper","cut_red_sandstone","cut_sandstone","cyan_carpet","cyan_concrete","cyan_concrete_powder","cyan_stained_glass","cyan_terracotta","cyan_wool","dandelion","dark_oak_planks","dark_prismarine","dead_brain_coral_block","dead_bubble_coral_block","dead_bush","dead_fire_coral_block","dead_horn_coral_block","dead_tube_coral_block","deepslate_bricks","deepslate_coal_ore","deepslate_copper_ore","deepslate_diamond_ore","deepslate_emerald_ore","deepslate_gold_ore","deepslate_iron_ore","deepslate_lapis_ore","deepslate_tiles","diamond_block","diamond_ore","diorite","dirt","dirt_path","dragon_egg","dried_kelp_block","dripstone_block","emerald_block","emerald_ore","enchanting_table","end_gateway","end_portal","end_stone","end_stone_bricks","exposed_chiseled_copper","exposed_copper","exposed_cut_copper","fern","fire_coral_block","fletching_table","flower_pot","flowering_azalea","frogspawn","gilded_blackstone","glass","glowstone","gold_block","gold_ore","granite","gravel","gray_carpet","gray_concrete","gray_concrete_powder","gray_stained_glass","gray_terracotta","gray_wool","green_carpet","green_concrete","green_concrete_powder","green_stained_glass","green_terracotta","green_wool","honey_block","honeycomb_block","horn_coral_block","ice","infested_chiseled_stone_bricks","infested_cobblestone","infested_cracked_stone_bricks","infested_mossy_stone_bricks","infested_stone","infested_stone_bricks","iron_block","iron_ore","jungle_planks","kelp_plant","lapis_block","lapis_ore","lava_cauldron","light_blue_carpet","light_blue_concrete","light_blue_concrete_powder","light_blue_stained_glass","light_blue_terracotta","light_blue_wool","light_gray_carpet","light_gray_concrete","light_gray_concrete_powder","light_gray_stained_glass","light_gray_terracotta","light_gray_wool","lily_of_the_valley","lily_pad","lime_carpet","lime_concrete","lime_concrete_powder","lime_stained_glass","lime_terracotta","lime_wool","lodestone","magenta_carpet","magenta_concrete","magenta_concrete_powder","magenta_stained_glass","magenta_terracotta","magenta_wool","magma_block","mangrove_planks","melon","moss_block","moss_carpet","mossy_cobblestone","mossy_stone_bricks","mud","mud_bricks","nether_bricks","nether_gold_ore","nether_quartz_ore","nether_sprouts","nether_wart_block","netherite_block","netherrack","oak_planks","obsidian","orange_carpet","orange_concrete","orange_concrete_powder","orange_stained_glass","orange_terracotta","orange_tulip","orange_wool","oxeye_daisy","oxidized_chiseled_copper","oxidized_copper","oxidized_cut_copper","packed_ice","packed_mud","pale_moss_block","pale_oak_planks","pink_carpet","pink_concrete","pink_concrete_powder","pink_stained_glass","pink_terracotta","pink_tulip","pink_wool","polished_andesite","polished_blackstone","polished_blackstone_bricks","polished_deepslate","polished_diorite","polished_granite","polished_tuff","poppy","potted_acacia_sapling","potted_allium","potted_azalea_bush","potted_azure_bluet","potted_bamboo","potted_birch_sapling","potted_blue_orchid","potted_brown_mushroom","potted_cactus","potted_cherry_sapling","potted_cornflower","potted_crimson_fungus","potted_crimson_roots","potted_dandelion","potted_dark_oak_sapling","potted_dead_bush","potted_fern","potted_flowering_azalea_bush","potted_jungle_sapling","potted_lily_of_the_valley","potted_mangrove_propagule","potted_oak_sapling","potted_orange_tulip","potted_oxeye_daisy","potted_pale_oak_sapling","potted_pink_tulip","potted_poppy","potted_red_mushroom","potted_red_tulip","potted_spruce_sapling","potted_torchflower","potted_warped_fungus"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_warped_roots',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_warped_roots"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_white_tulip',item:'None',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_warped_roots","potted_white_tulip"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potted_wither_rose',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_wither_rose"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:powder_snow',item:'minecraft:powder_snow_bucket',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_warped_roots","potted_white_tulip","potted_wither_rose","powder_snow"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:prismarine',item:'minecraft:prismarine',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["prismarine"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:prismarine_bricks',item:'minecraft:prismarine_bricks',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["prismarine","prismarine_bricks"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pumpkin',item:'minecraft:pumpkin',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pumpkin"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purple_carpet',item:'minecraft:purple_carpet',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_warped_roots","potted_white_tulip","potted_wither_rose","powder_snow","prismarine","prismarine_bricks","pumpkin","purple_carpet"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purple_concrete',item:'minecraft:purple_concrete',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purple_concrete"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purple_concrete_powder',item:'minecraft:purple_concrete_powder',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purple_concrete","purple_concrete_powder"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purple_stained_glass',item:'minecraft:purple_stained_glass',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purple_stained_glass"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purple_terracotta',item:'minecraft:purple_terracotta',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purple_concrete","purple_concrete_powder","purple_stained_glass","purple_terracotta"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purple_wool',item:'minecraft:purple_wool',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purple_wool"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purpur_block',item:'minecraft:purpur_block',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purple_wool","purpur_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:quartz_block',item:'minecraft:quartz_block',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["quartz_block"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:quartz_bricks',item:'minecraft:quartz_bricks',group:0}"}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_warped_roots","potted_white_tulip","potted_wither_rose","powder_snow","prismarine","prismarine_bricks","pumpkin","purple_carpet","purple_concrete","purple_concrete_powder","purple_stained_glass","purple_terracotta","purple_wool","purpur_block","quartz_block","quartz_bricks"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:raw_copper_block',item:'minecraft:raw_copper_block',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["raw_copper_block"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:raw_gold_block',item:'minecraft:raw_gold_block',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["raw_copper_block","raw_gold_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:raw_iron_block',item:'minecraft:raw_iron_block',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["raw_iron_block"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_carpet',item:'minecraft:red_carpet',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["raw_copper_block","raw_gold_block","raw_iron_block","red_carpet"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_concrete',item:'minecraft:red_concrete',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_concrete"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_concrete_powder',item:'minecraft:red_concrete_powder',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_concrete","red_concrete_powder"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_mushroom',item:'minecraft:red_mushroom',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_mushroom"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_nether_bricks',item:'minecraft:red_nether_bricks',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["raw_copper_block","raw_gold_block","raw_iron_block","red_carpet","red_concrete","red_concrete_powder","red_mushroom","red_nether_bricks"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_sand',item:'minecraft:red_sand',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_sand"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_sandstone',item:'minecraft:red_sandstone',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_sand","red_sandstone"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_stained_glass',item:'minecraft:red_stained_glass',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_stained_glass"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_terracotta',item:'minecraft:red_terracotta',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_sand","red_sandstone","red_stained_glass","red_terracotta"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_tulip',item:'minecraft:red_tulip',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_tulip"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_wool',item:'minecraft:red_wool',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_tulip","red_wool"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:redstone_block',item:'minecraft:redstone_block',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["redstone_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:reinforced_deepslate',item:'minecraft:reinforced_deepslate',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["reinforced_deepslate"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:rooted_dirt',item:'minecraft:rooted_dirt',group:0}"}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_warped_roots","potted_white_tulip","potted_wither_rose","powder_snow","prismarine","prismarine_bricks","pumpkin","purple_carpet","purple_concrete","purple_concrete_powder","purple_stained_glass","purple_terracotta","purple_wool","purpur_block","quartz_block","quartz_bricks","raw_copper_block","raw_gold_block","raw_iron_block","red_carpet","red_concrete","red_concrete_powder","red_mushroom","red_nether_bricks","red_sand","red_sandstone","red_stained_glass","red_terracotta","red_tulip","red_wool","redstone_block","reinforced_deepslate","rooted_dirt"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sand',item:'minecraft:sand',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sand"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sandstone',item:'minecraft:sandstone',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sand","sandstone"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sculk',item:'minecraft:sculk',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sculk"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sea_lantern',item:'minecraft:sea_lantern',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sand","sandstone","sculk","sea_lantern"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:seagrass',item:'minecraft:seagrass',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["seagrass"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:short_grass',item:'minecraft:short_grass',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["seagrass","short_grass"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:shroomlight',item:'minecraft:shroomlight',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["shroomlight"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:slime_block',item:'minecraft:slime_block',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sand","sandstone","sculk","sea_lantern","seagrass","short_grass","shroomlight","slime_block"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:smithing_table',item:'minecraft:smithing_table',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["smithing_table"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:smooth_basalt',item:'minecraft:smooth_basalt',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["smithing_table","smooth_basalt"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:smooth_quartz',item:'minecraft:smooth_quartz',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["smooth_quartz"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:smooth_red_sandstone',item:'minecraft:smooth_red_sandstone',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["smithing_table","smooth_basalt","smooth_quartz","smooth_red_sandstone"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:smooth_sandstone',item:'minecraft:smooth_sandstone',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["smooth_sandstone"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:smooth_stone',item:'minecraft:smooth_stone',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["smooth_sandstone","smooth_stone"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:snow_block',item:'minecraft:snow_block',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["snow_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:soul_fire',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["soul_fire"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:soul_sand',item:'minecraft:soul_sand',group:0}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sand","sandstone","sculk","sea_lantern","seagrass","short_grass","shroomlight","slime_block","smithing_table","smooth_basalt","smooth_quartz","smooth_red_sandstone","smooth_sandstone","smooth_stone","snow_block","soul_fire","soul_sand"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:soul_soil',item:'minecraft:soul_soil',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["soul_soil"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:soul_torch',item:'minecraft:soul_torch',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["soul_soil","soul_torch"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spawner',item:'minecraft:spawner',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spawner"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sponge',item:'minecraft:sponge',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["soul_soil","soul_torch","spawner","sponge"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spore_blossom',item:'minecraft:spore_blossom',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spore_blossom"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spruce_planks',item:'minecraft:spruce_planks',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spore_blossom","spruce_planks"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stone',item:'minecraft:stone',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stone"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stone_bricks',item:'minecraft:stone_bricks',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["soul_soil","soul_torch","spawner","sponge","spore_blossom","spruce_planks","stone","stone_bricks"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:structure_void',item:'minecraft:structure_void',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["structure_void"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:terracotta',item:'minecraft:terracotta',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["structure_void","terracotta"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tinted_glass',item:'minecraft:tinted_glass',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["tinted_glass"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:torch',item:'minecraft:torch',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["structure_void","terracotta","tinted_glass","torch"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:torchflower',item:'minecraft:torchflower',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["torchflower"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tube_coral_block',item:'minecraft:tube_coral_block',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["torchflower","tube_coral_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tuff',item:'minecraft:tuff',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["tuff"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tuff_bricks',item:'minecraft:tuff_bricks',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["tuff_bricks"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:twisting_vines_plant',item:'None',group:0}"}]}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_warped_roots","potted_white_tulip","potted_wither_rose","powder_snow","prismarine","prismarine_bricks","pumpkin","purple_carpet","purple_concrete","purple_concrete_powder","purple_stained_glass","purple_terracotta","purple_wool","purpur_block","quartz_block","quartz_bricks","raw_copper_block","raw_gold_block","raw_iron_block","red_carpet","red_concrete","red_concrete_powder","red_mushroom","red_nether_bricks","red_sand","red_sandstone","red_stained_glass","red_terracotta","red_tulip","red_wool","redstone_block","reinforced_deepslate","rooted_dirt","sand","sandstone","sculk","sea_lantern","seagrass","short_grass","shroomlight","slime_block","smithing_table","smooth_basalt","smooth_quartz","smooth_red_sandstone","smooth_sandstone","smooth_stone","snow_block","soul_fire","soul_sand","soul_soil","soul_torch","spawner","sponge","spore_blossom","spruce_planks","stone","stone_bricks","structure_void","terracotta","tinted_glass","torch","torchflower","tube_coral_block","tuff","tuff_bricks","twisting_vines_plant"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:void_air',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["void_air"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_fungus',item:'minecraft:warped_fungus',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["void_air","warped_fungus"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_nylium',item:'minecraft:warped_nylium',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_nylium"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_planks',item:'minecraft:warped_planks',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["void_air","warped_fungus","warped_nylium","warped_planks"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_roots',item:'minecraft:warped_roots',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_roots"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_wart_block',item:'minecraft:warped_wart_block',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_roots","warped_wart_block"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_chiseled_copper',item:'minecraft:waxed_chiseled_copper',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_chiseled_copper"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_copper_block',item:'minecraft:waxed_copper_block',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["void_air","warped_fungus","warped_nylium","warped_planks","warped_roots","warped_wart_block","waxed_chiseled_copper","waxed_copper_block"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_cut_copper',item:'minecraft:waxed_cut_copper',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_cut_copper"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_exposed_chiseled_copper',item:'minecraft:waxed_exposed_chiseled_copper',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_cut_copper","waxed_exposed_chiseled_copper"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_exposed_copper',item:'minecraft:waxed_exposed_copper',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_exposed_copper"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_exposed_cut_copper',item:'minecraft:waxed_exposed_cut_copper',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_cut_copper","waxed_exposed_chiseled_copper","waxed_exposed_copper","waxed_exposed_cut_copper"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_oxidized_chiseled_copper',item:'minecraft:waxed_oxidized_chiseled_copper',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_oxidized_chiseled_copper"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_oxidized_copper',item:'minecraft:waxed_oxidized_copper',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_oxidized_chiseled_copper","waxed_oxidized_copper"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_oxidized_cut_copper',item:'minecraft:waxed_oxidized_cut_copper',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_oxidized_cut_copper"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_weathered_chiseled_copper',item:'minecraft:waxed_weathered_chiseled_copper',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_weathered_chiseled_copper"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_weathered_copper',item:'minecraft:waxed_weathered_copper',group:0}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["void_air","warped_fungus","warped_nylium","warped_planks","warped_roots","warped_wart_block","waxed_chiseled_copper","waxed_copper_block","waxed_cut_copper","waxed_exposed_chiseled_copper","waxed_exposed_copper","waxed_exposed_cut_copper","waxed_oxidized_chiseled_copper","waxed_oxidized_copper","waxed_oxidized_cut_copper","waxed_weathered_chiseled_copper","waxed_weathered_copper"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_weathered_cut_copper',item:'minecraft:waxed_weathered_cut_copper',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_weathered_cut_copper"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:weathered_chiseled_copper',item:'minecraft:weathered_chiseled_copper',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_weathered_cut_copper","weathered_chiseled_copper"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:weathered_copper',item:'minecraft:weathered_copper',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["weathered_copper"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:weathered_cut_copper',item:'minecraft:weathered_cut_copper',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_weathered_cut_copper","weathered_chiseled_copper","weathered_copper","weathered_cut_copper"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:weeping_vines_plant',item:'None',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["weeping_vines_plant"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:wet_sponge',item:'minecraft:wet_sponge',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["weeping_vines_plant","wet_sponge"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:white_carpet',item:'minecraft:white_carpet',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_carpet"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:white_concrete',item:'minecraft:white_concrete',group:0}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_weathered_cut_copper","weathered_chiseled_copper","weathered_copper","weathered_cut_copper","weeping_vines_plant","wet_sponge","white_carpet","white_concrete"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:white_concrete_powder',item:'minecraft:white_concrete_powder',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_concrete_powder"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:white_stained_glass',item:'minecraft:white_stained_glass',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_concrete_powder","white_stained_glass"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:white_terracotta',item:'minecraft:white_terracotta',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_terracotta"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:white_tulip',item:'minecraft:white_tulip',group:0}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_concrete_powder","white_stained_glass","white_terracotta","white_tulip"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:white_wool',item:'minecraft:white_wool',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_wool"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:wither_rose',item:'minecraft:wither_rose',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_wool","wither_rose"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:yellow_carpet',item:'minecraft:yellow_carpet',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_carpet"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:yellow_concrete',item:'minecraft:yellow_concrete',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_concrete"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:yellow_concrete_powder',item:'minecraft:yellow_concrete_powder',group:0}"}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["void_air","warped_fungus","warped_nylium","warped_planks","warped_roots","warped_wart_block","waxed_chiseled_copper","waxed_copper_block","waxed_cut_copper","waxed_exposed_chiseled_copper","waxed_exposed_copper","waxed_exposed_cut_copper","waxed_oxidized_chiseled_copper","waxed_oxidized_copper","waxed_oxidized_cut_copper","waxed_weathered_chiseled_copper","waxed_weathered_copper","waxed_weathered_cut_copper","weathered_chiseled_copper","weathered_copper","weathered_cut_copper","weeping_vines_plant","wet_sponge","white_carpet","white_concrete","white_concrete_powder","white_stained_glass","white_terracotta","white_tulip","white_wool","wither_rose","yellow_carpet","yellow_concrete","yellow_concrete_powder"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:yellow_stained_glass',item:'minecraft:yellow_stained_glass',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_stained_glass"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:yellow_terracotta',item:'minecraft:yellow_terracotta',group:0}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_stained_glass","yellow_terracotta"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:yellow_wool',item:'minecraft:yellow_wool',group:0}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_wool"]}}}]},{"type":"loot_table","value":"bs.block:get/3","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:acacia_button',item:'minecraft:acacia_button',group:1}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_stained_glass","yellow_terracotta","yellow_wool","acacia_button"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/3","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_button',item:'minecraft:bamboo_button',group:1}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_button"]}}}]},{"type":"loot_table","value":"bs.block:get/3","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:birch_button',item:'minecraft:birch_button',group:1}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_button","birch_button"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/3","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cherry_button',item:'minecraft:cherry_button',group:1}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cherry_button"]}}}]},{"type":"loot_table","value":"bs.block:get/3","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_button',item:'minecraft:crimson_button',group:1}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_stained_glass","yellow_terracotta","yellow_wool","acacia_button","bamboo_button","birch_button","cherry_button","crimson_button"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/3","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_oak_button',item:'minecraft:dark_oak_button',group:1}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_oak_button"]}}}]},{"type":"loot_table","value":"bs.block:get/3","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jungle_button',item:'minecraft:jungle_button',group:1}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_oak_button","jungle_button"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/3","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lever',item:'minecraft:lever',group:1}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lever"]}}}]},{"type":"loot_table","value":"bs.block:get/3","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_button',item:'minecraft:mangrove_button',group:1}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_oak_button","jungle_button","lever","mangrove_button"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/3","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oak_button',item:'minecraft:oak_button',group:1}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_button"]}}}]},{"type":"loot_table","value":"bs.block:get/3","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_oak_button',item:'minecraft:pale_oak_button',group:1}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_button","pale_oak_button"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/3","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_blackstone_button',item:'minecraft:polished_blackstone_button',group:1}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_blackstone_button"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/3","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spruce_button',item:'minecraft:spruce_button',group:1}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spruce_button"]}}}]},{"type":"loot_table","value":"bs.block:get/3","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stone_button',item:'minecraft:stone_button',group:1}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_stained_glass","yellow_terracotta","yellow_wool","acacia_button","bamboo_button","birch_button","cherry_button","crimson_button","dark_oak_button","jungle_button","lever","mangrove_button","oak_button","pale_oak_button","polished_blackstone_button","spruce_button","stone_button"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/3","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_button',item:'minecraft:warped_button',group:1}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_button"]}}}]},{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:acacia_door',item:'minecraft:acacia_door',group:2}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_button","acacia_door"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_door',item:'minecraft:bamboo_door',group:2}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_door"]}}}]},{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:birch_door',item:'minecraft:birch_door',group:2}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_button","acacia_door","bamboo_door","birch_door"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cherry_door',item:'minecraft:cherry_door',group:2}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cherry_door"]}}}]},{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:copper_door',item:'minecraft:copper_door',group:2}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cherry_door","copper_door"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_door',item:'minecraft:crimson_door',group:2}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crimson_door"]}}}]},{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_oak_door',item:'minecraft:dark_oak_door',group:2}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_button","acacia_door","bamboo_door","birch_door","cherry_door","copper_door","crimson_door","dark_oak_door"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:exposed_copper_door',item:'minecraft:exposed_copper_door',group:2}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["exposed_copper_door"]}}}]},{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:iron_door',item:'minecraft:iron_door',group:2}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["exposed_copper_door","iron_door"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jungle_door',item:'minecraft:jungle_door',group:2}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["jungle_door"]}}}]},{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_door',item:'minecraft:mangrove_door',group:2}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["exposed_copper_door","iron_door","jungle_door","mangrove_door"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oak_door',item:'minecraft:oak_door',group:2}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_door"]}}}]},{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oxidized_copper_door',item:'minecraft:oxidized_copper_door',group:2}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_door","oxidized_copper_door"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_oak_door',item:'minecraft:pale_oak_door',group:2}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pale_oak_door"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spruce_door',item:'minecraft:spruce_door',group:2}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spruce_door"]}}}]},{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_door',item:'minecraft:warped_door',group:2}"}]}]}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["potted_warped_roots","potted_white_tulip","potted_wither_rose","powder_snow","prismarine","prismarine_bricks","pumpkin","purple_carpet","purple_concrete","purple_concrete_powder","purple_stained_glass","purple_terracotta","purple_wool","purpur_block","quartz_block","quartz_bricks","raw_copper_block","raw_gold_block","raw_iron_block","red_carpet","red_concrete","red_concrete_powder","red_mushroom","red_nether_bricks","red_sand","red_sandstone","red_stained_glass","red_terracotta","red_tulip","red_wool","redstone_block","reinforced_deepslate","rooted_dirt","sand","sandstone","sculk","sea_lantern","seagrass","short_grass","shroomlight","slime_block","smithing_table","smooth_basalt","smooth_quartz","smooth_red_sandstone","smooth_sandstone","smooth_stone","snow_block","soul_fire","soul_sand","soul_soil","soul_torch","spawner","sponge","spore_blossom","spruce_planks","stone","stone_bricks","structure_void","terracotta","tinted_glass","torch","torchflower","tube_coral_block","tuff","tuff_bricks","twisting_vines_plant","void_air","warped_fungus","warped_nylium","warped_planks","warped_roots","warped_wart_block","waxed_chiseled_copper","waxed_copper_block","waxed_cut_copper","waxed_exposed_chiseled_copper","waxed_exposed_copper","waxed_exposed_cut_copper","waxed_oxidized_chiseled_copper","waxed_oxidized_copper","waxed_oxidized_cut_copper","waxed_weathered_chiseled_copper","waxed_weathered_copper","waxed_weathered_cut_copper","weathered_chiseled_copper","weathered_copper","weathered_cut_copper","weeping_vines_plant","wet_sponge","white_carpet","white_concrete","white_concrete_powder","white_stained_glass","white_terracotta","white_tulip","white_wool","wither_rose","yellow_carpet","yellow_concrete","yellow_concrete_powder","yellow_stained_glass","yellow_terracotta","yellow_wool","acacia_button","bamboo_button","birch_button","cherry_button","crimson_button","dark_oak_button","jungle_button","lever","mangrove_button","oak_button","pale_oak_button","polished_blackstone_button","spruce_button","stone_button","warped_button","acacia_door","bamboo_door","birch_door","cherry_door","copper_door","crimson_door","dark_oak_door","exposed_copper_door","iron_door","jungle_door","mangrove_door","oak_door","oxidized_copper_door","pale_oak_door","spruce_door","warped_door"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_copper_door',item:'minecraft:waxed_copper_door',group:2}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_copper_door"]}}}]},{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_exposed_copper_door',item:'minecraft:waxed_exposed_copper_door',group:2}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_copper_door","waxed_exposed_copper_door"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_oxidized_copper_door',item:'minecraft:waxed_oxidized_copper_door',group:2}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_oxidized_copper_door"]}}}]},{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_weathered_copper_door',item:'minecraft:waxed_weathered_copper_door',group:2}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_copper_door","waxed_exposed_copper_door","waxed_oxidized_copper_door","waxed_weathered_copper_door"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/6","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:weathered_copper_door',item:'minecraft:weathered_copper_door',group:2}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["weathered_copper_door"]}}}]},{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:acacia_fence',item:'minecraft:acacia_fence',group:3}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["weathered_copper_door","acacia_fence"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_fence',item:'minecraft:bamboo_fence',group:3}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_fence"]}}}]},{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:birch_fence',item:'minecraft:birch_fence',group:3}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_copper_door","waxed_exposed_copper_door","waxed_oxidized_copper_door","waxed_weathered_copper_door","weathered_copper_door","acacia_fence","bamboo_fence","birch_fence"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:black_stained_glass_pane',item:'minecraft:black_stained_glass_pane',group:3}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["black_stained_glass_pane"]}}}]},{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blue_stained_glass_pane',item:'minecraft:blue_stained_glass_pane',group:3}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["black_stained_glass_pane","blue_stained_glass_pane"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brown_stained_glass_pane',item:'minecraft:brown_stained_glass_pane',group:3}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brown_stained_glass_pane"]}}}]},{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cherry_fence',item:'minecraft:cherry_fence',group:3}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["black_stained_glass_pane","blue_stained_glass_pane","brown_stained_glass_pane","cherry_fence"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_fence',item:'minecraft:crimson_fence',group:3}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crimson_fence"]}}}]},{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cyan_stained_glass_pane',item:'minecraft:cyan_stained_glass_pane',group:3}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crimson_fence","cyan_stained_glass_pane"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_oak_fence',item:'minecraft:dark_oak_fence',group:3}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_oak_fence"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:glass_pane',item:'minecraft:glass_pane',group:3}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["glass_pane"]}}}]},{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gray_stained_glass_pane',item:'minecraft:gray_stained_glass_pane',group:3}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_copper_door","waxed_exposed_copper_door","waxed_oxidized_copper_door","waxed_weathered_copper_door","weathered_copper_door","acacia_fence","bamboo_fence","birch_fence","black_stained_glass_pane","blue_stained_glass_pane","brown_stained_glass_pane","cherry_fence","crimson_fence","cyan_stained_glass_pane","dark_oak_fence","glass_pane","gray_stained_glass_pane"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:green_stained_glass_pane',item:'minecraft:green_stained_glass_pane',group:3}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_stained_glass_pane"]}}}]},{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:iron_bars',item:'minecraft:iron_bars',group:3}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_stained_glass_pane","iron_bars"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jungle_fence',item:'minecraft:jungle_fence',group:3}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["jungle_fence"]}}}]},{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_blue_stained_glass_pane',item:'minecraft:light_blue_stained_glass_pane',group:3}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_stained_glass_pane","iron_bars","jungle_fence","light_blue_stained_glass_pane"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_gray_stained_glass_pane',item:'minecraft:light_gray_stained_glass_pane',group:3}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_gray_stained_glass_pane"]}}}]},{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lime_stained_glass_pane',item:'minecraft:lime_stained_glass_pane',group:3}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_gray_stained_glass_pane","lime_stained_glass_pane"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:magenta_stained_glass_pane',item:'minecraft:magenta_stained_glass_pane',group:3}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["magenta_stained_glass_pane"]}}}]},{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_fence',item:'minecraft:mangrove_fence',group:3}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_stained_glass_pane","iron_bars","jungle_fence","light_blue_stained_glass_pane","light_gray_stained_glass_pane","lime_stained_glass_pane","magenta_stained_glass_pane","mangrove_fence"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:nether_brick_fence',item:'minecraft:nether_brick_fence',group:3}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_brick_fence"]}}}]},{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oak_fence',item:'minecraft:oak_fence',group:3}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_brick_fence","oak_fence"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:orange_stained_glass_pane',item:'minecraft:orange_stained_glass_pane',group:3}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["orange_stained_glass_pane"]}}}]},{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_oak_fence',item:'minecraft:pale_oak_fence',group:3}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_brick_fence","oak_fence","orange_stained_glass_pane","pale_oak_fence"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pink_stained_glass_pane',item:'minecraft:pink_stained_glass_pane',group:3}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pink_stained_glass_pane"]}}}]},{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purple_stained_glass_pane',item:'minecraft:purple_stained_glass_pane',group:3}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pink_stained_glass_pane","purple_stained_glass_pane"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_stained_glass_pane',item:'minecraft:red_stained_glass_pane',group:3}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_stained_glass_pane"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spruce_fence',item:'minecraft:spruce_fence',group:3}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spruce_fence"]}}}]},{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_fence',item:'minecraft:warped_fence',group:3}"}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_copper_door","waxed_exposed_copper_door","waxed_oxidized_copper_door","waxed_weathered_copper_door","weathered_copper_door","acacia_fence","bamboo_fence","birch_fence","black_stained_glass_pane","blue_stained_glass_pane","brown_stained_glass_pane","cherry_fence","crimson_fence","cyan_stained_glass_pane","dark_oak_fence","glass_pane","gray_stained_glass_pane","green_stained_glass_pane","iron_bars","jungle_fence","light_blue_stained_glass_pane","light_gray_stained_glass_pane","lime_stained_glass_pane","magenta_stained_glass_pane","mangrove_fence","nether_brick_fence","oak_fence","orange_stained_glass_pane","pale_oak_fence","pink_stained_glass_pane","purple_stained_glass_pane","red_stained_glass_pane","spruce_fence","warped_fence"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:white_stained_glass_pane',item:'minecraft:white_stained_glass_pane',group:3}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_stained_glass_pane"]}}}]},{"type":"loot_table","value":"bs.block:get/11","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:yellow_stained_glass_pane',item:'minecraft:yellow_stained_glass_pane',group:3}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_stained_glass_pane","yellow_stained_glass_pane"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/12","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:acacia_fence_gate',item:'minecraft:acacia_fence_gate',group:4}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_fence_gate"]}}}]},{"type":"loot_table","value":"bs.block:get/12","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_fence_gate',item:'minecraft:bamboo_fence_gate',group:4}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_stained_glass_pane","yellow_stained_glass_pane","acacia_fence_gate","bamboo_fence_gate"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/12","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:birch_fence_gate',item:'minecraft:birch_fence_gate',group:4}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["birch_fence_gate"]}}}]},{"type":"loot_table","value":"bs.block:get/12","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cherry_fence_gate',item:'minecraft:cherry_fence_gate',group:4}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["birch_fence_gate","cherry_fence_gate"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/12","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_fence_gate',item:'minecraft:crimson_fence_gate',group:4}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crimson_fence_gate"]}}}]},{"type":"loot_table","value":"bs.block:get/12","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_oak_fence_gate',item:'minecraft:dark_oak_fence_gate',group:4}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_stained_glass_pane","yellow_stained_glass_pane","acacia_fence_gate","bamboo_fence_gate","birch_fence_gate","cherry_fence_gate","crimson_fence_gate","dark_oak_fence_gate"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/12","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jungle_fence_gate',item:'minecraft:jungle_fence_gate',group:4}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["jungle_fence_gate"]}}}]},{"type":"loot_table","value":"bs.block:get/12","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_fence_gate',item:'minecraft:mangrove_fence_gate',group:4}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["jungle_fence_gate","mangrove_fence_gate"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/12","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oak_fence_gate',item:'minecraft:oak_fence_gate',group:4}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_fence_gate"]}}}]},{"type":"loot_table","value":"bs.block:get/12","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_oak_fence_gate',item:'minecraft:pale_oak_fence_gate',group:4}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["jungle_fence_gate","mangrove_fence_gate","oak_fence_gate","pale_oak_fence_gate"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/12","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spruce_fence_gate',item:'minecraft:spruce_fence_gate',group:4}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spruce_fence_gate"]}}}]},{"type":"loot_table","value":"bs.block:get/12","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_fence_gate',item:'minecraft:warped_fence_gate',group:4}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spruce_fence_gate","warped_fence_gate"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/14","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:acacia_hanging_sign',item:'minecraft:acacia_hanging_sign',group:5}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_hanging_sign"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/14","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_hanging_sign',item:'minecraft:bamboo_hanging_sign',group:5}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_hanging_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/14","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:birch_hanging_sign',item:'minecraft:birch_hanging_sign',group:5}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_stained_glass_pane","yellow_stained_glass_pane","acacia_fence_gate","bamboo_fence_gate","birch_fence_gate","cherry_fence_gate","crimson_fence_gate","dark_oak_fence_gate","jungle_fence_gate","mangrove_fence_gate","oak_fence_gate","pale_oak_fence_gate","spruce_fence_gate","warped_fence_gate","acacia_hanging_sign","bamboo_hanging_sign","birch_hanging_sign"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/14","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cherry_hanging_sign',item:'minecraft:cherry_hanging_sign',group:5}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cherry_hanging_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/14","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_hanging_sign',item:'minecraft:crimson_hanging_sign',group:5}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cherry_hanging_sign","crimson_hanging_sign"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/14","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_oak_hanging_sign',item:'minecraft:dark_oak_hanging_sign',group:5}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_oak_hanging_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/14","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jungle_hanging_sign',item:'minecraft:jungle_hanging_sign',group:5}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cherry_hanging_sign","crimson_hanging_sign","dark_oak_hanging_sign","jungle_hanging_sign"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/14","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_hanging_sign',item:'minecraft:mangrove_hanging_sign',group:5}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_hanging_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/14","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oak_hanging_sign',item:'minecraft:oak_hanging_sign',group:5}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_hanging_sign","oak_hanging_sign"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/14","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_oak_hanging_sign',item:'minecraft:pale_oak_hanging_sign',group:5}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pale_oak_hanging_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/14","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spruce_hanging_sign',item:'minecraft:spruce_hanging_sign',group:5}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cherry_hanging_sign","crimson_hanging_sign","dark_oak_hanging_sign","jungle_hanging_sign","mangrove_hanging_sign","oak_hanging_sign","pale_oak_hanging_sign","spruce_hanging_sign"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/14","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_hanging_sign',item:'minecraft:warped_hanging_sign',group:5}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_hanging_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/16","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:acacia_leaves',item:'minecraft:acacia_leaves',group:6}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_hanging_sign","acacia_leaves"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/16","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:azalea_leaves',item:'minecraft:azalea_leaves',group:6}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["azalea_leaves"]}}}]},{"type":"loot_table","value":"bs.block:get/16","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:birch_leaves',item:'minecraft:birch_leaves',group:6}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_hanging_sign","acacia_leaves","azalea_leaves","birch_leaves"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/16","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cherry_leaves',item:'minecraft:cherry_leaves',group:6}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cherry_leaves"]}}}]},{"type":"loot_table","value":"bs.block:get/16","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_oak_leaves',item:'minecraft:dark_oak_leaves',group:6}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cherry_leaves","dark_oak_leaves"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/16","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:flowering_azalea_leaves',item:'minecraft:flowering_azalea_leaves',group:6}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["flowering_azalea_leaves"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/16","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jungle_leaves',item:'minecraft:jungle_leaves',group:6}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["jungle_leaves"]}}}]},{"type":"loot_table","value":"bs.block:get/16","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_leaves',item:'minecraft:mangrove_leaves',group:6}"}]}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_copper_door","waxed_exposed_copper_door","waxed_oxidized_copper_door","waxed_weathered_copper_door","weathered_copper_door","acacia_fence","bamboo_fence","birch_fence","black_stained_glass_pane","blue_stained_glass_pane","brown_stained_glass_pane","cherry_fence","crimson_fence","cyan_stained_glass_pane","dark_oak_fence","glass_pane","gray_stained_glass_pane","green_stained_glass_pane","iron_bars","jungle_fence","light_blue_stained_glass_pane","light_gray_stained_glass_pane","lime_stained_glass_pane","magenta_stained_glass_pane","mangrove_fence","nether_brick_fence","oak_fence","orange_stained_glass_pane","pale_oak_fence","pink_stained_glass_pane","purple_stained_glass_pane","red_stained_glass_pane","spruce_fence","warped_fence","white_stained_glass_pane","yellow_stained_glass_pane","acacia_fence_gate","bamboo_fence_gate","birch_fence_gate","cherry_fence_gate","crimson_fence_gate","dark_oak_fence_gate","jungle_fence_gate","mangrove_fence_gate","oak_fence_gate","pale_oak_fence_gate","spruce_fence_gate","warped_fence_gate","acacia_hanging_sign","bamboo_hanging_sign","birch_hanging_sign","cherry_hanging_sign","crimson_hanging_sign","dark_oak_hanging_sign","jungle_hanging_sign","mangrove_hanging_sign","oak_hanging_sign","pale_oak_hanging_sign","spruce_hanging_sign","warped_hanging_sign","acacia_leaves","azalea_leaves","birch_leaves","cherry_leaves","dark_oak_leaves","flowering_azalea_leaves","jungle_leaves","mangrove_leaves"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/16","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oak_leaves',item:'minecraft:oak_leaves',group:6}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_leaves"]}}}]},{"type":"loot_table","value":"bs.block:get/16","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_oak_leaves',item:'minecraft:pale_oak_leaves',group:6}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_leaves","pale_oak_leaves"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/16","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spruce_leaves',item:'minecraft:spruce_leaves',group:6}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spruce_leaves"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:acacia_log',item:'minecraft:acacia_log',group:7}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_leaves","pale_oak_leaves","spruce_leaves","acacia_log"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:acacia_wood',item:'minecraft:acacia_wood',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_wood"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_block',item:'minecraft:bamboo_block',group:7}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_wood","bamboo_block"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:basalt',item:'minecraft:basalt',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["basalt"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:birch_log',item:'minecraft:birch_log',group:7}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_leaves","pale_oak_leaves","spruce_leaves","acacia_log","acacia_wood","bamboo_block","basalt","birch_log"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:birch_wood',item:'minecraft:birch_wood',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["birch_wood"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bone_block',item:'minecraft:bone_block',group:7}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["birch_wood","bone_block"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cherry_log',item:'minecraft:cherry_log',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cherry_log"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cherry_wood',item:'minecraft:cherry_wood',group:7}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["birch_wood","bone_block","cherry_log","cherry_wood"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_hyphae',item:'minecraft:crimson_hyphae',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crimson_hyphae"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_stem',item:'minecraft:crimson_stem',group:7}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crimson_hyphae","crimson_stem"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_oak_log',item:'minecraft:dark_oak_log',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_oak_log"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_oak_wood',item:'minecraft:dark_oak_wood',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_oak_wood"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:deepslate',item:'minecraft:deepslate',group:7}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_leaves","pale_oak_leaves","spruce_leaves","acacia_log","acacia_wood","bamboo_block","basalt","birch_log","birch_wood","bone_block","cherry_log","cherry_wood","crimson_hyphae","crimson_stem","dark_oak_log","dark_oak_wood","deepslate"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:hay_block',item:'minecraft:hay_block',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["hay_block"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:infested_deepslate',item:'minecraft:infested_deepslate',group:7}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["hay_block","infested_deepslate"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jungle_log',item:'minecraft:jungle_log',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["jungle_log"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jungle_wood',item:'minecraft:jungle_wood',group:7}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["hay_block","infested_deepslate","jungle_log","jungle_wood"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_log',item:'minecraft:mangrove_log',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_log"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_wood',item:'minecraft:mangrove_wood',group:7}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_log","mangrove_wood"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:muddy_mangrove_roots',item:'minecraft:muddy_mangrove_roots',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["muddy_mangrove_roots"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oak_log',item:'minecraft:oak_log',group:7}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["hay_block","infested_deepslate","jungle_log","jungle_wood","mangrove_log","mangrove_wood","muddy_mangrove_roots","oak_log"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oak_wood',item:'minecraft:oak_wood',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_wood"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:ochre_froglight',item:'minecraft:ochre_froglight',group:7}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_wood","ochre_froglight"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_oak_log',item:'minecraft:pale_oak_log',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pale_oak_log"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_oak_wood',item:'minecraft:pale_oak_wood',group:7}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_wood","ochre_froglight","pale_oak_log","pale_oak_wood"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pearlescent_froglight',item:'minecraft:pearlescent_froglight',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pearlescent_froglight"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_basalt',item:'minecraft:polished_basalt',group:7}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pearlescent_froglight","polished_basalt"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purpur_pillar',item:'minecraft:purpur_pillar',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purpur_pillar"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:quartz_pillar',item:'minecraft:quartz_pillar',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["quartz_pillar"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spruce_log',item:'minecraft:spruce_log',group:7}"}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_leaves","pale_oak_leaves","spruce_leaves","acacia_log","acacia_wood","bamboo_block","basalt","birch_log","birch_wood","bone_block","cherry_log","cherry_wood","crimson_hyphae","crimson_stem","dark_oak_log","dark_oak_wood","deepslate","hay_block","infested_deepslate","jungle_log","jungle_wood","mangrove_log","mangrove_wood","muddy_mangrove_roots","oak_log","oak_wood","ochre_froglight","pale_oak_log","pale_oak_wood","pearlescent_froglight","polished_basalt","purpur_pillar","quartz_pillar","spruce_log"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spruce_wood',item:'minecraft:spruce_wood',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spruce_wood"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_acacia_log',item:'minecraft:stripped_acacia_log',group:7}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spruce_wood","stripped_acacia_log"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_acacia_wood',item:'minecraft:stripped_acacia_wood',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_acacia_wood"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_bamboo_block',item:'minecraft:stripped_bamboo_block',group:7}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spruce_wood","stripped_acacia_log","stripped_acacia_wood","stripped_bamboo_block"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_birch_log',item:'minecraft:stripped_birch_log',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_birch_log"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_birch_wood',item:'minecraft:stripped_birch_wood',group:7}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_birch_log","stripped_birch_wood"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_cherry_log',item:'minecraft:stripped_cherry_log',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_cherry_log"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_cherry_wood',item:'minecraft:stripped_cherry_wood',group:7}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spruce_wood","stripped_acacia_log","stripped_acacia_wood","stripped_bamboo_block","stripped_birch_log","stripped_birch_wood","stripped_cherry_log","stripped_cherry_wood"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_crimson_hyphae',item:'minecraft:stripped_crimson_hyphae',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_crimson_hyphae"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_crimson_stem',item:'minecraft:stripped_crimson_stem',group:7}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_crimson_hyphae","stripped_crimson_stem"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_dark_oak_log',item:'minecraft:stripped_dark_oak_log',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_dark_oak_log"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_dark_oak_wood',item:'minecraft:stripped_dark_oak_wood',group:7}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_crimson_hyphae","stripped_crimson_stem","stripped_dark_oak_log","stripped_dark_oak_wood"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_jungle_log',item:'minecraft:stripped_jungle_log',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_jungle_log"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_jungle_wood',item:'minecraft:stripped_jungle_wood',group:7}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_jungle_log","stripped_jungle_wood"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_mangrove_log',item:'minecraft:stripped_mangrove_log',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_mangrove_log"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_mangrove_wood',item:'minecraft:stripped_mangrove_wood',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_mangrove_wood"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_oak_log',item:'minecraft:stripped_oak_log',group:7}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spruce_wood","stripped_acacia_log","stripped_acacia_wood","stripped_bamboo_block","stripped_birch_log","stripped_birch_wood","stripped_cherry_log","stripped_cherry_wood","stripped_crimson_hyphae","stripped_crimson_stem","stripped_dark_oak_log","stripped_dark_oak_wood","stripped_jungle_log","stripped_jungle_wood","stripped_mangrove_log","stripped_mangrove_wood","stripped_oak_log"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_oak_wood',item:'minecraft:stripped_oak_wood',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_oak_wood"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_pale_oak_log',item:'minecraft:stripped_pale_oak_log',group:7}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_oak_wood","stripped_pale_oak_log"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_pale_oak_wood',item:'minecraft:stripped_pale_oak_wood',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_pale_oak_wood"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_spruce_log',item:'minecraft:stripped_spruce_log',group:7}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_oak_wood","stripped_pale_oak_log","stripped_pale_oak_wood","stripped_spruce_log"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_spruce_wood',item:'minecraft:stripped_spruce_wood',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_spruce_wood"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_warped_hyphae',item:'minecraft:stripped_warped_hyphae',group:7}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_spruce_wood","stripped_warped_hyphae"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stripped_warped_stem',item:'minecraft:stripped_warped_stem',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_warped_stem"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:verdant_froglight',item:'minecraft:verdant_froglight',group:7}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stripped_oak_wood","stripped_pale_oak_log","stripped_pale_oak_wood","stripped_spruce_log","stripped_spruce_wood","stripped_warped_hyphae","stripped_warped_stem","verdant_froglight"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_hyphae',item:'minecraft:warped_hyphae',group:7}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_hyphae"]}}}]},{"type":"loot_table","value":"bs.block:get/17","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_stem',item:'minecraft:warped_stem',group:7}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_hyphae","warped_stem"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/18","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:acacia_pressure_plate',item:'minecraft:acacia_pressure_plate',group:8}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_pressure_plate"]}}}]},{"type":"loot_table","value":"bs.block:get/18","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_pressure_plate',item:'minecraft:bamboo_pressure_plate',group:8}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_hyphae","warped_stem","acacia_pressure_plate","bamboo_pressure_plate"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/18","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:birch_pressure_plate',item:'minecraft:birch_pressure_plate',group:8}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["birch_pressure_plate"]}}}]},{"type":"loot_table","value":"bs.block:get/18","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cherry_pressure_plate',item:'minecraft:cherry_pressure_plate',group:8}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["birch_pressure_plate","cherry_pressure_plate"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/18","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_pressure_plate',item:'minecraft:crimson_pressure_plate',group:8}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crimson_pressure_plate"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/18","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_oak_pressure_plate',item:'minecraft:dark_oak_pressure_plate',group:8}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_oak_pressure_plate"]}}}]},{"type":"loot_table","value":"bs.block:get/18","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jungle_pressure_plate',item:'minecraft:jungle_pressure_plate',group:8}"}]}]}]}]}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_planks","air","allium","amethyst_block","ancient_debris","andesite","azalea","azure_bluet","bamboo_mosaic","bamboo_planks","bamboo_sapling","beacon","bedrock","birch_planks","black_carpet","black_concrete","black_concrete_powder","black_stained_glass","black_terracotta","black_wool","blackstone","blue_carpet","blue_concrete","blue_concrete_powder","blue_ice","blue_orchid","blue_stained_glass","blue_terracotta","blue_wool","bookshelf","brain_coral_block","bricks","brown_carpet","brown_concrete","brown_concrete_powder","brown_mushroom","brown_stained_glass","brown_terracotta","brown_wool","bubble_coral_block","budding_amethyst","calcite","cartography_table","cauldron","cave_air","cherry_planks","chiseled_copper","chiseled_deepslate","chiseled_nether_bricks","chiseled_polished_blackstone","chiseled_quartz_block","chiseled_red_sandstone","chiseled_sandstone","chiseled_stone_bricks","chiseled_tuff","chiseled_tuff_bricks","clay","coal_block","coal_ore","coarse_dirt","cobbled_deepslate","cobblestone","cobweb","copper_block","copper_ore","cornflower","cracked_deepslate_bricks","cracked_deepslate_tiles","cracked_nether_bricks","cracked_polished_blackstone_bricks","cracked_stone_bricks","crafting_table","crimson_fungus","crimson_nylium","crimson_planks","crimson_roots","crying_obsidian","cut_copper","cut_red_sandstone","cut_sandstone","cyan_carpet","cyan_concrete","cyan_concrete_powder","cyan_stained_glass","cyan_terracotta","cyan_wool","dandelion","dark_oak_planks","dark_prismarine","dead_brain_coral_block","dead_bubble_coral_block","dead_bush","dead_fire_coral_block","dead_horn_coral_block","dead_tube_coral_block","deepslate_bricks","deepslate_coal_ore","deepslate_copper_ore","deepslate_diamond_ore","deepslate_emerald_ore","deepslate_gold_ore","deepslate_iron_ore","deepslate_lapis_ore","deepslate_tiles","diamond_block","diamond_ore","diorite","dirt","dirt_path","dragon_egg","dried_kelp_block","dripstone_block","emerald_block","emerald_ore","enchanting_table","end_gateway","end_portal","end_stone","end_stone_bricks","exposed_chiseled_copper","exposed_copper","exposed_cut_copper","fern","fire_coral_block","fletching_table","flower_pot","flowering_azalea","frogspawn","gilded_blackstone","glass","glowstone","gold_block","gold_ore","granite","gravel","gray_carpet","gray_concrete","gray_concrete_powder","gray_stained_glass","gray_terracotta","gray_wool","green_carpet","green_concrete","green_concrete_powder","green_stained_glass","green_terracotta","green_wool","honey_block","honeycomb_block","horn_coral_block","ice","infested_chiseled_stone_bricks","infested_cobblestone","infested_cracked_stone_bricks","infested_mossy_stone_bricks","infested_stone","infested_stone_bricks","iron_block","iron_ore","jungle_planks","kelp_plant","lapis_block","lapis_ore","lava_cauldron","light_blue_carpet","light_blue_concrete","light_blue_concrete_powder","light_blue_stained_glass","light_blue_terracotta","light_blue_wool","light_gray_carpet","light_gray_concrete","light_gray_concrete_powder","light_gray_stained_glass","light_gray_terracotta","light_gray_wool","lily_of_the_valley","lily_pad","lime_carpet","lime_concrete","lime_concrete_powder","lime_stained_glass","lime_terracotta","lime_wool","lodestone","magenta_carpet","magenta_concrete","magenta_concrete_powder","magenta_stained_glass","magenta_terracotta","magenta_wool","magma_block","mangrove_planks","melon","moss_block","moss_carpet","mossy_cobblestone","mossy_stone_bricks","mud","mud_bricks","nether_bricks","nether_gold_ore","nether_quartz_ore","nether_sprouts","nether_wart_block","netherite_block","netherrack","oak_planks","obsidian","orange_carpet","orange_concrete","orange_concrete_powder","orange_stained_glass","orange_terracotta","orange_tulip","orange_wool","oxeye_daisy","oxidized_chiseled_copper","oxidized_copper","oxidized_cut_copper","packed_ice","packed_mud","pale_moss_block","pale_oak_planks","pink_carpet","pink_concrete","pink_concrete_powder","pink_stained_glass","pink_terracotta","pink_tulip","pink_wool","polished_andesite","polished_blackstone","polished_blackstone_bricks","polished_deepslate","polished_diorite","polished_granite","polished_tuff","poppy","potted_acacia_sapling","potted_allium","potted_azalea_bush","potted_azure_bluet","potted_bamboo","potted_birch_sapling","potted_blue_orchid","potted_brown_mushroom","potted_cactus","potted_cherry_sapling","potted_cornflower","potted_crimson_fungus","potted_crimson_roots","potted_dandelion","potted_dark_oak_sapling","potted_dead_bush","potted_fern","potted_flowering_azalea_bush","potted_jungle_sapling","potted_lily_of_the_valley","potted_mangrove_propagule","potted_oak_sapling","potted_orange_tulip","potted_oxeye_daisy","potted_pale_oak_sapling","potted_pink_tulip","potted_poppy","potted_red_mushroom","potted_red_tulip","potted_spruce_sapling","potted_torchflower","potted_warped_fungus","potted_warped_roots","potted_white_tulip","potted_wither_rose","powder_snow","prismarine","prismarine_bricks","pumpkin","purple_carpet","purple_concrete","purple_concrete_powder","purple_stained_glass","purple_terracotta","purple_wool","purpur_block","quartz_block","quartz_bricks","raw_copper_block","raw_gold_block","raw_iron_block","red_carpet","red_concrete","red_concrete_powder","red_mushroom","red_nether_bricks","red_sand","red_sandstone","red_stained_glass","red_terracotta","red_tulip","red_wool","redstone_block","reinforced_deepslate","rooted_dirt","sand","sandstone","sculk","sea_lantern","seagrass","short_grass","shroomlight","slime_block","smithing_table","smooth_basalt","smooth_quartz","smooth_red_sandstone","smooth_sandstone","smooth_stone","snow_block","soul_fire","soul_sand","soul_soil","soul_torch","spawner","sponge","spore_blossom","spruce_planks","stone","stone_bricks","structure_void","terracotta","tinted_glass","torch","torchflower","tube_coral_block","tuff","tuff_bricks","twisting_vines_plant","void_air","warped_fungus","warped_nylium","warped_planks","warped_roots","warped_wart_block","waxed_chiseled_copper","waxed_copper_block","waxed_cut_copper","waxed_exposed_chiseled_copper","waxed_exposed_copper","waxed_exposed_cut_copper","waxed_oxidized_chiseled_copper","waxed_oxidized_copper","waxed_oxidized_cut_copper","waxed_weathered_chiseled_copper","waxed_weathered_copper","waxed_weathered_cut_copper","weathered_chiseled_copper","weathered_copper","weathered_cut_copper","weeping_vines_plant","wet_sponge","white_carpet","white_concrete","white_concrete_powder","white_stained_glass","white_terracotta","white_tulip","white_wool","wither_rose","yellow_carpet","yellow_concrete","yellow_concrete_powder","yellow_stained_glass","yellow_terracotta","yellow_wool","acacia_button","bamboo_button","birch_button","cherry_button","crimson_button","dark_oak_button","jungle_button","lever","mangrove_button","oak_button","pale_oak_button","polished_blackstone_button","spruce_button","stone_button","warped_button","acacia_door","bamboo_door","birch_door","cherry_door","copper_door","crimson_door","dark_oak_door","exposed_copper_door","iron_door","jungle_door","mangrove_door","oak_door","oxidized_copper_door","pale_oak_door","spruce_door","warped_door","waxed_copper_door","waxed_exposed_copper_door","waxed_oxidized_copper_door","waxed_weathered_copper_door","weathered_copper_door","acacia_fence","bamboo_fence","birch_fence","black_stained_glass_pane","blue_stained_glass_pane","brown_stained_glass_pane","cherry_fence","crimson_fence","cyan_stained_glass_pane","dark_oak_fence","glass_pane","gray_stained_glass_pane","green_stained_glass_pane","iron_bars","jungle_fence","light_blue_stained_glass_pane","light_gray_stained_glass_pane","lime_stained_glass_pane","magenta_stained_glass_pane","mangrove_fence","nether_brick_fence","oak_fence","orange_stained_glass_pane","pale_oak_fence","pink_stained_glass_pane","purple_stained_glass_pane","red_stained_glass_pane","spruce_fence","warped_fence","white_stained_glass_pane","yellow_stained_glass_pane","acacia_fence_gate","bamboo_fence_gate","birch_fence_gate","cherry_fence_gate","crimson_fence_gate","dark_oak_fence_gate","jungle_fence_gate","mangrove_fence_gate","oak_fence_gate","pale_oak_fence_gate","spruce_fence_gate","warped_fence_gate","acacia_hanging_sign","bamboo_hanging_sign","birch_hanging_sign","cherry_hanging_sign","crimson_hanging_sign","dark_oak_hanging_sign","jungle_hanging_sign","mangrove_hanging_sign","oak_hanging_sign","pale_oak_hanging_sign","spruce_hanging_sign","warped_hanging_sign","acacia_leaves","azalea_leaves","birch_leaves","cherry_leaves","dark_oak_leaves","flowering_azalea_leaves","jungle_leaves","mangrove_leaves","oak_leaves","pale_oak_leaves","spruce_leaves","acacia_log","acacia_wood","bamboo_block","basalt","birch_log","birch_wood","bone_block","cherry_log","cherry_wood","crimson_hyphae","crimson_stem","dark_oak_log","dark_oak_wood","deepslate","hay_block","infested_deepslate","jungle_log","jungle_wood","mangrove_log","mangrove_wood","muddy_mangrove_roots","oak_log","oak_wood","ochre_froglight","pale_oak_log","pale_oak_wood","pearlescent_froglight","polished_basalt","purpur_pillar","quartz_pillar","spruce_log","spruce_wood","stripped_acacia_log","stripped_acacia_wood","stripped_bamboo_block","stripped_birch_log","stripped_birch_wood","stripped_cherry_log","stripped_cherry_wood","stripped_crimson_hyphae","stripped_crimson_stem","stripped_dark_oak_log","stripped_dark_oak_wood","stripped_jungle_log","stripped_jungle_wood","stripped_mangrove_log","stripped_mangrove_wood","stripped_oak_log","stripped_oak_wood","stripped_pale_oak_log","stripped_pale_oak_wood","stripped_spruce_log","stripped_spruce_wood","stripped_warped_hyphae","stripped_warped_stem","verdant_froglight","warped_hyphae","warped_stem","acacia_pressure_plate","bamboo_pressure_plate","birch_pressure_plate","cherry_pressure_plate","crimson_pressure_plate","dark_oak_pressure_plate","jungle_pressure_plate"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/18","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_pressure_plate',item:'minecraft:mangrove_pressure_plate',group:8}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_pressure_plate"]}}}]},{"type":"loot_table","value":"bs.block:get/18","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oak_pressure_plate',item:'minecraft:oak_pressure_plate',group:8}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_pressure_plate","oak_pressure_plate"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/18","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_oak_pressure_plate',item:'minecraft:pale_oak_pressure_plate',group:8}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pale_oak_pressure_plate"]}}}]},{"type":"loot_table","value":"bs.block:get/18","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_blackstone_pressure_plate',item:'minecraft:polished_blackstone_pressure_plate',group:8}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_pressure_plate","oak_pressure_plate","pale_oak_pressure_plate","polished_blackstone_pressure_plate"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/18","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spruce_pressure_plate',item:'minecraft:spruce_pressure_plate',group:8}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spruce_pressure_plate"]}}}]},{"type":"loot_table","value":"bs.block:get/18","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stone_pressure_plate',item:'minecraft:stone_pressure_plate',group:8}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spruce_pressure_plate","stone_pressure_plate"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/18","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_pressure_plate',item:'minecraft:warped_pressure_plate',group:8}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_pressure_plate"]}}}]},{"type":"loot_table","value":"bs.block:get/19","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:acacia_sapling',item:'minecraft:acacia_sapling',group:9}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_pressure_plate","oak_pressure_plate","pale_oak_pressure_plate","polished_blackstone_pressure_plate","spruce_pressure_plate","stone_pressure_plate","warped_pressure_plate","acacia_sapling"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/19","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:birch_sapling',item:'minecraft:birch_sapling',group:9}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["birch_sapling"]}}}]},{"type":"loot_table","value":"bs.block:get/19","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cherry_sapling',item:'minecraft:cherry_sapling',group:9}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["birch_sapling","cherry_sapling"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/19","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_oak_sapling',item:'minecraft:dark_oak_sapling',group:9}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_oak_sapling"]}}}]},{"type":"loot_table","value":"bs.block:get/19","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jungle_sapling',item:'minecraft:jungle_sapling',group:9}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["birch_sapling","cherry_sapling","dark_oak_sapling","jungle_sapling"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/19","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oak_sapling',item:'minecraft:oak_sapling',group:9}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_sapling"]}}}]},{"type":"loot_table","value":"bs.block:get/19","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_oak_sapling',item:'minecraft:pale_oak_sapling',group:9}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_sapling","pale_oak_sapling"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/19","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spruce_sapling',item:'minecraft:spruce_sapling',group:9}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spruce_sapling"]}}}]},{"type":"loot_table","value":"bs.block:get/13","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:acacia_sign',item:'minecraft:acacia_sign',group:10}"}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_pressure_plate","oak_pressure_plate","pale_oak_pressure_plate","polished_blackstone_pressure_plate","spruce_pressure_plate","stone_pressure_plate","warped_pressure_plate","acacia_sapling","birch_sapling","cherry_sapling","dark_oak_sapling","jungle_sapling","oak_sapling","pale_oak_sapling","spruce_sapling","acacia_sign"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/13","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_sign',item:'minecraft:bamboo_sign',group:10}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/13","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:birch_sign',item:'minecraft:birch_sign',group:10}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_sign","birch_sign"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/13","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cherry_sign',item:'minecraft:cherry_sign',group:10}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cherry_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/13","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_sign',item:'minecraft:crimson_sign',group:10}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_sign","birch_sign","cherry_sign","crimson_sign"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/13","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_oak_sign',item:'minecraft:dark_oak_sign',group:10}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_oak_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/13","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jungle_sign',item:'minecraft:jungle_sign',group:10}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_oak_sign","jungle_sign"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/13","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_sign',item:'minecraft:mangrove_sign',group:10}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/13","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oak_sign',item:'minecraft:oak_sign',group:10}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_sign","birch_sign","cherry_sign","crimson_sign","dark_oak_sign","jungle_sign","mangrove_sign","oak_sign"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/13","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_oak_sign',item:'minecraft:pale_oak_sign',group:10}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pale_oak_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/13","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spruce_sign',item:'minecraft:spruce_sign',group:10}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pale_oak_sign","spruce_sign"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/13","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_sign',item:'minecraft:warped_sign',group:10}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:acacia_slab',item:'minecraft:acacia_slab',group:11}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pale_oak_sign","spruce_sign","warped_sign","acacia_slab"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:andesite_slab',item:'minecraft:andesite_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["andesite_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_mosaic_slab',item:'minecraft:bamboo_mosaic_slab',group:11}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["andesite_slab","bamboo_mosaic_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_slab',item:'minecraft:bamboo_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:birch_slab',item:'minecraft:birch_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["birch_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blackstone_slab',item:'minecraft:blackstone_slab',group:11}"}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_pressure_plate","oak_pressure_plate","pale_oak_pressure_plate","polished_blackstone_pressure_plate","spruce_pressure_plate","stone_pressure_plate","warped_pressure_plate","acacia_sapling","birch_sapling","cherry_sapling","dark_oak_sapling","jungle_sapling","oak_sapling","pale_oak_sapling","spruce_sapling","acacia_sign","bamboo_sign","birch_sign","cherry_sign","crimson_sign","dark_oak_sign","jungle_sign","mangrove_sign","oak_sign","pale_oak_sign","spruce_sign","warped_sign","acacia_slab","andesite_slab","bamboo_mosaic_slab","bamboo_slab","birch_slab","blackstone_slab"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brick_slab',item:'minecraft:brick_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brick_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cherry_slab',item:'minecraft:cherry_slab',group:11}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brick_slab","cherry_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cobbled_deepslate_slab',item:'minecraft:cobbled_deepslate_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cobbled_deepslate_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cobblestone_slab',item:'minecraft:cobblestone_slab',group:11}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brick_slab","cherry_slab","cobbled_deepslate_slab","cobblestone_slab"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_slab',item:'minecraft:crimson_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crimson_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cut_copper_slab',item:'minecraft:cut_copper_slab',group:11}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crimson_slab","cut_copper_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cut_red_sandstone_slab',item:'minecraft:cut_red_sandstone_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cut_red_sandstone_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cut_sandstone_slab',item:'minecraft:cut_sandstone_slab',group:11}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brick_slab","cherry_slab","cobbled_deepslate_slab","cobblestone_slab","crimson_slab","cut_copper_slab","cut_red_sandstone_slab","cut_sandstone_slab"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_oak_slab',item:'minecraft:dark_oak_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_oak_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_prismarine_slab',item:'minecraft:dark_prismarine_slab',group:11}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_oak_slab","dark_prismarine_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:deepslate_brick_slab',item:'minecraft:deepslate_brick_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["deepslate_brick_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:deepslate_tile_slab',item:'minecraft:deepslate_tile_slab',group:11}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_oak_slab","dark_prismarine_slab","deepslate_brick_slab","deepslate_tile_slab"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:diorite_slab',item:'minecraft:diorite_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["diorite_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:end_stone_brick_slab',item:'minecraft:end_stone_brick_slab',group:11}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["diorite_slab","end_stone_brick_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:exposed_cut_copper_slab',item:'minecraft:exposed_cut_copper_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["exposed_cut_copper_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:granite_slab',item:'minecraft:granite_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["granite_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jungle_slab',item:'minecraft:jungle_slab',group:11}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brick_slab","cherry_slab","cobbled_deepslate_slab","cobblestone_slab","crimson_slab","cut_copper_slab","cut_red_sandstone_slab","cut_sandstone_slab","dark_oak_slab","dark_prismarine_slab","deepslate_brick_slab","deepslate_tile_slab","diorite_slab","end_stone_brick_slab","exposed_cut_copper_slab","granite_slab","jungle_slab"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_slab',item:'minecraft:mangrove_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mossy_cobblestone_slab',item:'minecraft:mossy_cobblestone_slab',group:11}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_slab","mossy_cobblestone_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mossy_stone_brick_slab',item:'minecraft:mossy_stone_brick_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mossy_stone_brick_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mud_brick_slab',item:'minecraft:mud_brick_slab',group:11}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_slab","mossy_cobblestone_slab","mossy_stone_brick_slab","mud_brick_slab"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:nether_brick_slab',item:'minecraft:nether_brick_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_brick_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oak_slab',item:'minecraft:oak_slab',group:11}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_brick_slab","oak_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oxidized_cut_copper_slab',item:'minecraft:oxidized_cut_copper_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oxidized_cut_copper_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_oak_slab',item:'minecraft:pale_oak_slab',group:11}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_slab","mossy_cobblestone_slab","mossy_stone_brick_slab","mud_brick_slab","nether_brick_slab","oak_slab","oxidized_cut_copper_slab","pale_oak_slab"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:petrified_oak_slab',item:'minecraft:petrified_oak_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["petrified_oak_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_andesite_slab',item:'minecraft:polished_andesite_slab',group:11}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["petrified_oak_slab","polished_andesite_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_blackstone_brick_slab',item:'minecraft:polished_blackstone_brick_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_blackstone_brick_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_blackstone_slab',item:'minecraft:polished_blackstone_slab',group:11}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["petrified_oak_slab","polished_andesite_slab","polished_blackstone_brick_slab","polished_blackstone_slab"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_deepslate_slab',item:'minecraft:polished_deepslate_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_deepslate_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_diorite_slab',item:'minecraft:polished_diorite_slab',group:11}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_deepslate_slab","polished_diorite_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_granite_slab',item:'minecraft:polished_granite_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_granite_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_tuff_slab',item:'minecraft:polished_tuff_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_tuff_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:prismarine_brick_slab',item:'minecraft:prismarine_brick_slab',group:11}"}]}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_pressure_plate","oak_pressure_plate","pale_oak_pressure_plate","polished_blackstone_pressure_plate","spruce_pressure_plate","stone_pressure_plate","warped_pressure_plate","acacia_sapling","birch_sapling","cherry_sapling","dark_oak_sapling","jungle_sapling","oak_sapling","pale_oak_sapling","spruce_sapling","acacia_sign","bamboo_sign","birch_sign","cherry_sign","crimson_sign","dark_oak_sign","jungle_sign","mangrove_sign","oak_sign","pale_oak_sign","spruce_sign","warped_sign","acacia_slab","andesite_slab","bamboo_mosaic_slab","bamboo_slab","birch_slab","blackstone_slab","brick_slab","cherry_slab","cobbled_deepslate_slab","cobblestone_slab","crimson_slab","cut_copper_slab","cut_red_sandstone_slab","cut_sandstone_slab","dark_oak_slab","dark_prismarine_slab","deepslate_brick_slab","deepslate_tile_slab","diorite_slab","end_stone_brick_slab","exposed_cut_copper_slab","granite_slab","jungle_slab","mangrove_slab","mossy_cobblestone_slab","mossy_stone_brick_slab","mud_brick_slab","nether_brick_slab","oak_slab","oxidized_cut_copper_slab","pale_oak_slab","petrified_oak_slab","polished_andesite_slab","polished_blackstone_brick_slab","polished_blackstone_slab","polished_deepslate_slab","polished_diorite_slab","polished_granite_slab","polished_tuff_slab","prismarine_brick_slab"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:prismarine_slab',item:'minecraft:prismarine_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["prismarine_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purpur_slab',item:'minecraft:purpur_slab',group:11}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["prismarine_slab","purpur_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:quartz_slab',item:'minecraft:quartz_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["quartz_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_nether_brick_slab',item:'minecraft:red_nether_brick_slab',group:11}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["prismarine_slab","purpur_slab","quartz_slab","red_nether_brick_slab"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_sandstone_slab',item:'minecraft:red_sandstone_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_sandstone_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sandstone_slab',item:'minecraft:sandstone_slab',group:11}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_sandstone_slab","sandstone_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:smooth_quartz_slab',item:'minecraft:smooth_quartz_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["smooth_quartz_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:smooth_red_sandstone_slab',item:'minecraft:smooth_red_sandstone_slab',group:11}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["prismarine_slab","purpur_slab","quartz_slab","red_nether_brick_slab","red_sandstone_slab","sandstone_slab","smooth_quartz_slab","smooth_red_sandstone_slab"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:smooth_sandstone_slab',item:'minecraft:smooth_sandstone_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["smooth_sandstone_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:smooth_stone_slab',item:'minecraft:smooth_stone_slab',group:11}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["smooth_sandstone_slab","smooth_stone_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spruce_slab',item:'minecraft:spruce_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spruce_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stone_brick_slab',item:'minecraft:stone_brick_slab',group:11}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["smooth_sandstone_slab","smooth_stone_slab","spruce_slab","stone_brick_slab"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stone_slab',item:'minecraft:stone_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stone_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tuff_brick_slab',item:'minecraft:tuff_brick_slab',group:11}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stone_slab","tuff_brick_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tuff_slab',item:'minecraft:tuff_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["tuff_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_slab',item:'minecraft:warped_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_cut_copper_slab',item:'minecraft:waxed_cut_copper_slab',group:11}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["prismarine_slab","purpur_slab","quartz_slab","red_nether_brick_slab","red_sandstone_slab","sandstone_slab","smooth_quartz_slab","smooth_red_sandstone_slab","smooth_sandstone_slab","smooth_stone_slab","spruce_slab","stone_brick_slab","stone_slab","tuff_brick_slab","tuff_slab","warped_slab","waxed_cut_copper_slab"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_exposed_cut_copper_slab',item:'minecraft:waxed_exposed_cut_copper_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_exposed_cut_copper_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_oxidized_cut_copper_slab',item:'minecraft:waxed_oxidized_cut_copper_slab',group:11}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_exposed_cut_copper_slab","waxed_oxidized_cut_copper_slab"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_weathered_cut_copper_slab',item:'minecraft:waxed_weathered_cut_copper_slab',group:11}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_weathered_cut_copper_slab"]}}}]},{"type":"loot_table","value":"bs.block:get/20","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:weathered_cut_copper_slab',item:'minecraft:weathered_cut_copper_slab',group:11}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_exposed_cut_copper_slab","waxed_oxidized_cut_copper_slab","waxed_weathered_cut_copper_slab","weathered_cut_copper_slab"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:acacia_stairs',item:'minecraft:acacia_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:andesite_stairs',item:'minecraft:andesite_stairs',group:12}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_stairs","andesite_stairs"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_mosaic_stairs',item:'minecraft:bamboo_mosaic_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_mosaic_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_stairs',item:'minecraft:bamboo_stairs',group:12}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_exposed_cut_copper_slab","waxed_oxidized_cut_copper_slab","waxed_weathered_cut_copper_slab","weathered_cut_copper_slab","acacia_stairs","andesite_stairs","bamboo_mosaic_stairs","bamboo_stairs"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:birch_stairs',item:'minecraft:birch_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["birch_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blackstone_stairs',item:'minecraft:blackstone_stairs',group:12}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["birch_stairs","blackstone_stairs"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brick_stairs',item:'minecraft:brick_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brick_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cherry_stairs',item:'minecraft:cherry_stairs',group:12}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["birch_stairs","blackstone_stairs","brick_stairs","cherry_stairs"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cobbled_deepslate_stairs',item:'minecraft:cobbled_deepslate_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cobbled_deepslate_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cobblestone_stairs',item:'minecraft:cobblestone_stairs',group:12}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cobbled_deepslate_stairs","cobblestone_stairs"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_stairs',item:'minecraft:crimson_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crimson_stairs"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cut_copper_stairs',item:'minecraft:cut_copper_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cut_copper_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_oak_stairs',item:'minecraft:dark_oak_stairs',group:12}"}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["prismarine_slab","purpur_slab","quartz_slab","red_nether_brick_slab","red_sandstone_slab","sandstone_slab","smooth_quartz_slab","smooth_red_sandstone_slab","smooth_sandstone_slab","smooth_stone_slab","spruce_slab","stone_brick_slab","stone_slab","tuff_brick_slab","tuff_slab","warped_slab","waxed_cut_copper_slab","waxed_exposed_cut_copper_slab","waxed_oxidized_cut_copper_slab","waxed_weathered_cut_copper_slab","weathered_cut_copper_slab","acacia_stairs","andesite_stairs","bamboo_mosaic_stairs","bamboo_stairs","birch_stairs","blackstone_stairs","brick_stairs","cherry_stairs","cobbled_deepslate_stairs","cobblestone_stairs","crimson_stairs","cut_copper_stairs","dark_oak_stairs"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_prismarine_stairs',item:'minecraft:dark_prismarine_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_prismarine_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:deepslate_brick_stairs',item:'minecraft:deepslate_brick_stairs',group:12}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_prismarine_stairs","deepslate_brick_stairs"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:deepslate_tile_stairs',item:'minecraft:deepslate_tile_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["deepslate_tile_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:diorite_stairs',item:'minecraft:diorite_stairs',group:12}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_prismarine_stairs","deepslate_brick_stairs","deepslate_tile_stairs","diorite_stairs"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:end_stone_brick_stairs',item:'minecraft:end_stone_brick_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["end_stone_brick_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:exposed_cut_copper_stairs',item:'minecraft:exposed_cut_copper_stairs',group:12}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["end_stone_brick_stairs","exposed_cut_copper_stairs"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:granite_stairs',item:'minecraft:granite_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["granite_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jungle_stairs',item:'minecraft:jungle_stairs',group:12}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_prismarine_stairs","deepslate_brick_stairs","deepslate_tile_stairs","diorite_stairs","end_stone_brick_stairs","exposed_cut_copper_stairs","granite_stairs","jungle_stairs"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_stairs',item:'minecraft:mangrove_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mossy_cobblestone_stairs',item:'minecraft:mossy_cobblestone_stairs',group:12}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_stairs","mossy_cobblestone_stairs"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mossy_stone_brick_stairs',item:'minecraft:mossy_stone_brick_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mossy_stone_brick_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mud_brick_stairs',item:'minecraft:mud_brick_stairs',group:12}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_stairs","mossy_cobblestone_stairs","mossy_stone_brick_stairs","mud_brick_stairs"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:nether_brick_stairs',item:'minecraft:nether_brick_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_brick_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oak_stairs',item:'minecraft:oak_stairs',group:12}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_brick_stairs","oak_stairs"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oxidized_cut_copper_stairs',item:'minecraft:oxidized_cut_copper_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oxidized_cut_copper_stairs"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_oak_stairs',item:'minecraft:pale_oak_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pale_oak_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_andesite_stairs',item:'minecraft:polished_andesite_stairs',group:12}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_prismarine_stairs","deepslate_brick_stairs","deepslate_tile_stairs","diorite_stairs","end_stone_brick_stairs","exposed_cut_copper_stairs","granite_stairs","jungle_stairs","mangrove_stairs","mossy_cobblestone_stairs","mossy_stone_brick_stairs","mud_brick_stairs","nether_brick_stairs","oak_stairs","oxidized_cut_copper_stairs","pale_oak_stairs","polished_andesite_stairs"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_blackstone_brick_stairs',item:'minecraft:polished_blackstone_brick_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_blackstone_brick_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_blackstone_stairs',item:'minecraft:polished_blackstone_stairs',group:12}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_blackstone_brick_stairs","polished_blackstone_stairs"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_deepslate_stairs',item:'minecraft:polished_deepslate_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_deepslate_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_diorite_stairs',item:'minecraft:polished_diorite_stairs',group:12}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_blackstone_brick_stairs","polished_blackstone_stairs","polished_deepslate_stairs","polished_diorite_stairs"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_granite_stairs',item:'minecraft:polished_granite_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_granite_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_tuff_stairs',item:'minecraft:polished_tuff_stairs',group:12}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_granite_stairs","polished_tuff_stairs"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:prismarine_brick_stairs',item:'minecraft:prismarine_brick_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["prismarine_brick_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:prismarine_stairs',item:'minecraft:prismarine_stairs',group:12}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_blackstone_brick_stairs","polished_blackstone_stairs","polished_deepslate_stairs","polished_diorite_stairs","polished_granite_stairs","polished_tuff_stairs","prismarine_brick_stairs","prismarine_stairs"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purpur_stairs',item:'minecraft:purpur_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purpur_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:quartz_stairs',item:'minecraft:quartz_stairs',group:12}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purpur_stairs","quartz_stairs"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_nether_brick_stairs',item:'minecraft:red_nether_brick_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_nether_brick_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_sandstone_stairs',item:'minecraft:red_sandstone_stairs',group:12}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purpur_stairs","quartz_stairs","red_nether_brick_stairs","red_sandstone_stairs"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sandstone_stairs',item:'minecraft:sandstone_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sandstone_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:smooth_quartz_stairs',item:'minecraft:smooth_quartz_stairs',group:12}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sandstone_stairs","smooth_quartz_stairs"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:smooth_red_sandstone_stairs',item:'minecraft:smooth_red_sandstone_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["smooth_red_sandstone_stairs"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:smooth_sandstone_stairs',item:'minecraft:smooth_sandstone_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["smooth_sandstone_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spruce_stairs',item:'minecraft:spruce_stairs',group:12}"}]}]}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_pressure_plate","oak_pressure_plate","pale_oak_pressure_plate","polished_blackstone_pressure_plate","spruce_pressure_plate","stone_pressure_plate","warped_pressure_plate","acacia_sapling","birch_sapling","cherry_sapling","dark_oak_sapling","jungle_sapling","oak_sapling","pale_oak_sapling","spruce_sapling","acacia_sign","bamboo_sign","birch_sign","cherry_sign","crimson_sign","dark_oak_sign","jungle_sign","mangrove_sign","oak_sign","pale_oak_sign","spruce_sign","warped_sign","acacia_slab","andesite_slab","bamboo_mosaic_slab","bamboo_slab","birch_slab","blackstone_slab","brick_slab","cherry_slab","cobbled_deepslate_slab","cobblestone_slab","crimson_slab","cut_copper_slab","cut_red_sandstone_slab","cut_sandstone_slab","dark_oak_slab","dark_prismarine_slab","deepslate_brick_slab","deepslate_tile_slab","diorite_slab","end_stone_brick_slab","exposed_cut_copper_slab","granite_slab","jungle_slab","mangrove_slab","mossy_cobblestone_slab","mossy_stone_brick_slab","mud_brick_slab","nether_brick_slab","oak_slab","oxidized_cut_copper_slab","pale_oak_slab","petrified_oak_slab","polished_andesite_slab","polished_blackstone_brick_slab","polished_blackstone_slab","polished_deepslate_slab","polished_diorite_slab","polished_granite_slab","polished_tuff_slab","prismarine_brick_slab","prismarine_slab","purpur_slab","quartz_slab","red_nether_brick_slab","red_sandstone_slab","sandstone_slab","smooth_quartz_slab","smooth_red_sandstone_slab","smooth_sandstone_slab","smooth_stone_slab","spruce_slab","stone_brick_slab","stone_slab","tuff_brick_slab","tuff_slab","warped_slab","waxed_cut_copper_slab","waxed_exposed_cut_copper_slab","waxed_oxidized_cut_copper_slab","waxed_weathered_cut_copper_slab","weathered_cut_copper_slab","acacia_stairs","andesite_stairs","bamboo_mosaic_stairs","bamboo_stairs","birch_stairs","blackstone_stairs","brick_stairs","cherry_stairs","cobbled_deepslate_stairs","cobblestone_stairs","crimson_stairs","cut_copper_stairs","dark_oak_stairs","dark_prismarine_stairs","deepslate_brick_stairs","deepslate_tile_stairs","diorite_stairs","end_stone_brick_stairs","exposed_cut_copper_stairs","granite_stairs","jungle_stairs","mangrove_stairs","mossy_cobblestone_stairs","mossy_stone_brick_stairs","mud_brick_stairs","nether_brick_stairs","oak_stairs","oxidized_cut_copper_stairs","pale_oak_stairs","polished_andesite_stairs","polished_blackstone_brick_stairs","polished_blackstone_stairs","polished_deepslate_stairs","polished_diorite_stairs","polished_granite_stairs","polished_tuff_stairs","prismarine_brick_stairs","prismarine_stairs","purpur_stairs","quartz_stairs","red_nether_brick_stairs","red_sandstone_stairs","sandstone_stairs","smooth_quartz_stairs","smooth_red_sandstone_stairs","smooth_sandstone_stairs","spruce_stairs"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stone_brick_stairs',item:'minecraft:stone_brick_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stone_brick_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stone_stairs',item:'minecraft:stone_stairs',group:12}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stone_brick_stairs","stone_stairs"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tuff_brick_stairs',item:'minecraft:tuff_brick_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["tuff_brick_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tuff_stairs',item:'minecraft:tuff_stairs',group:12}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stone_brick_stairs","stone_stairs","tuff_brick_stairs","tuff_stairs"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_stairs',item:'minecraft:warped_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_cut_copper_stairs',item:'minecraft:waxed_cut_copper_stairs',group:12}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_stairs","waxed_cut_copper_stairs"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_exposed_cut_copper_stairs',item:'minecraft:waxed_exposed_cut_copper_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_exposed_cut_copper_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_oxidized_cut_copper_stairs',item:'minecraft:waxed_oxidized_cut_copper_stairs',group:12}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stone_brick_stairs","stone_stairs","tuff_brick_stairs","tuff_stairs","warped_stairs","waxed_cut_copper_stairs","waxed_exposed_cut_copper_stairs","waxed_oxidized_cut_copper_stairs"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_weathered_cut_copper_stairs',item:'minecraft:waxed_weathered_cut_copper_stairs',group:12}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_weathered_cut_copper_stairs"]}}}]},{"type":"loot_table","value":"bs.block:get/23","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:weathered_cut_copper_stairs',item:'minecraft:weathered_cut_copper_stairs',group:12}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_weathered_cut_copper_stairs","weathered_cut_copper_stairs"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:acacia_trapdoor',item:'minecraft:acacia_trapdoor',group:13}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_trapdoor"]}}}]},{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_trapdoor',item:'minecraft:bamboo_trapdoor',group:13}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_weathered_cut_copper_stairs","weathered_cut_copper_stairs","acacia_trapdoor","bamboo_trapdoor"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:birch_trapdoor',item:'minecraft:birch_trapdoor',group:13}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["birch_trapdoor"]}}}]},{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cherry_trapdoor',item:'minecraft:cherry_trapdoor',group:13}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["birch_trapdoor","cherry_trapdoor"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:copper_trapdoor',item:'minecraft:copper_trapdoor',group:13}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["copper_trapdoor"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_trapdoor',item:'minecraft:crimson_trapdoor',group:13}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crimson_trapdoor"]}}}]},{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_oak_trapdoor',item:'minecraft:dark_oak_trapdoor',group:13}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stone_brick_stairs","stone_stairs","tuff_brick_stairs","tuff_stairs","warped_stairs","waxed_cut_copper_stairs","waxed_exposed_cut_copper_stairs","waxed_oxidized_cut_copper_stairs","waxed_weathered_cut_copper_stairs","weathered_cut_copper_stairs","acacia_trapdoor","bamboo_trapdoor","birch_trapdoor","cherry_trapdoor","copper_trapdoor","crimson_trapdoor","dark_oak_trapdoor"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:exposed_copper_trapdoor',item:'minecraft:exposed_copper_trapdoor',group:13}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["exposed_copper_trapdoor"]}}}]},{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:iron_trapdoor',item:'minecraft:iron_trapdoor',group:13}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["exposed_copper_trapdoor","iron_trapdoor"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jungle_trapdoor',item:'minecraft:jungle_trapdoor',group:13}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["jungle_trapdoor"]}}}]},{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_trapdoor',item:'minecraft:mangrove_trapdoor',group:13}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["exposed_copper_trapdoor","iron_trapdoor","jungle_trapdoor","mangrove_trapdoor"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oak_trapdoor',item:'minecraft:oak_trapdoor',group:13}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_trapdoor"]}}}]},{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oxidized_copper_trapdoor',item:'minecraft:oxidized_copper_trapdoor',group:13}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_trapdoor","oxidized_copper_trapdoor"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_oak_trapdoor',item:'minecraft:pale_oak_trapdoor',group:13}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pale_oak_trapdoor"]}}}]},{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spruce_trapdoor',item:'minecraft:spruce_trapdoor',group:13}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["exposed_copper_trapdoor","iron_trapdoor","jungle_trapdoor","mangrove_trapdoor","oak_trapdoor","oxidized_copper_trapdoor","pale_oak_trapdoor","spruce_trapdoor"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_trapdoor',item:'minecraft:warped_trapdoor',group:13}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_trapdoor"]}}}]},{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_copper_trapdoor',item:'minecraft:waxed_copper_trapdoor',group:13}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_trapdoor","waxed_copper_trapdoor"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_exposed_copper_trapdoor',item:'minecraft:waxed_exposed_copper_trapdoor',group:13}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_exposed_copper_trapdoor"]}}}]},{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_oxidized_copper_trapdoor',item:'minecraft:waxed_oxidized_copper_trapdoor',group:13}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_trapdoor","waxed_copper_trapdoor","waxed_exposed_copper_trapdoor","waxed_oxidized_copper_trapdoor"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_weathered_copper_trapdoor',item:'minecraft:waxed_weathered_copper_trapdoor',group:13}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_weathered_copper_trapdoor"]}}}]},{"type":"loot_table","value":"bs.block:get/25","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:weathered_copper_trapdoor',item:'minecraft:weathered_copper_trapdoor',group:13}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_weathered_copper_trapdoor","weathered_copper_trapdoor"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:acacia_wall_hanging_sign',item:'minecraft:acacia_hanging_sign',group:14}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_wall_hanging_sign"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:acacia_wall_sign',item:'minecraft:acacia_sign',group:14}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["acacia_wall_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_wall_hanging_sign',item:'minecraft:bamboo_hanging_sign',group:14}"}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stone_brick_stairs","stone_stairs","tuff_brick_stairs","tuff_stairs","warped_stairs","waxed_cut_copper_stairs","waxed_exposed_cut_copper_stairs","waxed_oxidized_cut_copper_stairs","waxed_weathered_cut_copper_stairs","weathered_cut_copper_stairs","acacia_trapdoor","bamboo_trapdoor","birch_trapdoor","cherry_trapdoor","copper_trapdoor","crimson_trapdoor","dark_oak_trapdoor","exposed_copper_trapdoor","iron_trapdoor","jungle_trapdoor","mangrove_trapdoor","oak_trapdoor","oxidized_copper_trapdoor","pale_oak_trapdoor","spruce_trapdoor","warped_trapdoor","waxed_copper_trapdoor","waxed_exposed_copper_trapdoor","waxed_oxidized_copper_trapdoor","waxed_weathered_copper_trapdoor","weathered_copper_trapdoor","acacia_wall_hanging_sign","acacia_wall_sign","bamboo_wall_hanging_sign"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo_wall_sign',item:'minecraft:bamboo_sign',group:14}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_wall_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:big_dripleaf_stem',item:'minecraft:big_dripleaf',group:14}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_wall_sign","big_dripleaf_stem"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:birch_wall_hanging_sign',item:'minecraft:birch_hanging_sign',group:14}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["birch_wall_hanging_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:birch_wall_sign',item:'minecraft:birch_sign',group:14}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_wall_sign","big_dripleaf_stem","birch_wall_hanging_sign","birch_wall_sign"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cherry_wall_hanging_sign',item:'minecraft:cherry_hanging_sign',group:14}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cherry_wall_hanging_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cherry_wall_sign',item:'minecraft:cherry_sign',group:14}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cherry_wall_hanging_sign","cherry_wall_sign"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_wall_hanging_sign',item:'minecraft:crimson_hanging_sign',group:14}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["crimson_wall_hanging_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crimson_wall_sign',item:'minecraft:crimson_sign',group:14}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_wall_sign","big_dripleaf_stem","birch_wall_hanging_sign","birch_wall_sign","cherry_wall_hanging_sign","cherry_wall_sign","crimson_wall_hanging_sign","crimson_wall_sign"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_oak_wall_hanging_sign',item:'minecraft:dark_oak_hanging_sign',group:14}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_oak_wall_hanging_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dark_oak_wall_sign',item:'minecraft:dark_oak_sign',group:14}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_oak_wall_hanging_sign","dark_oak_wall_sign"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:ender_chest',item:'minecraft:ender_chest',group:14}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["ender_chest"]}}}]},{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jungle_wall_hanging_sign',item:'minecraft:jungle_hanging_sign',group:14}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dark_oak_wall_hanging_sign","dark_oak_wall_sign","ender_chest","jungle_wall_hanging_sign"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jungle_wall_sign',item:'minecraft:jungle_sign',group:14}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["jungle_wall_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:ladder',item:'minecraft:ladder',group:14}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["jungle_wall_sign","ladder"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_wall_hanging_sign',item:'minecraft:mangrove_hanging_sign',group:14}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_wall_hanging_sign"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_wall_sign',item:'minecraft:mangrove_sign',group:14}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_wall_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oak_wall_hanging_sign',item:'minecraft:oak_hanging_sign',group:14}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo_wall_sign","big_dripleaf_stem","birch_wall_hanging_sign","birch_wall_sign","cherry_wall_hanging_sign","cherry_wall_sign","crimson_wall_hanging_sign","crimson_wall_sign","dark_oak_wall_hanging_sign","dark_oak_wall_sign","ender_chest","jungle_wall_hanging_sign","jungle_wall_sign","ladder","mangrove_wall_hanging_sign","mangrove_wall_sign","oak_wall_hanging_sign"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oak_wall_sign',item:'minecraft:oak_sign',group:14}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_wall_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_oak_wall_hanging_sign',item:'None',group:14}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_wall_sign","pale_oak_wall_hanging_sign"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_oak_wall_sign',item:'None',group:14}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pale_oak_wall_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spruce_wall_hanging_sign',item:'minecraft:spruce_hanging_sign',group:14}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_wall_sign","pale_oak_wall_hanging_sign","pale_oak_wall_sign","spruce_wall_hanging_sign"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:spruce_wall_sign',item:'minecraft:spruce_sign',group:14}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spruce_wall_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_wall_hanging_sign',item:'minecraft:warped_hanging_sign',group:14}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spruce_wall_sign","warped_wall_hanging_sign"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:warped_wall_sign',item:'minecraft:warped_sign',group:14}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["warped_wall_sign"]}}}]},{"type":"loot_table","value":"bs.block:get/27","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:activator_rail',item:'minecraft:activator_rail',group:15}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_wall_sign","pale_oak_wall_hanging_sign","pale_oak_wall_sign","spruce_wall_hanging_sign","spruce_wall_sign","warped_wall_hanging_sign","warped_wall_sign","activator_rail"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/27","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:detector_rail',item:'minecraft:detector_rail',group:15}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["detector_rail"]}}}]},{"type":"loot_table","value":"bs.block:get/27","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:powered_rail',item:'minecraft:powered_rail',group:15}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["detector_rail","powered_rail"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/28","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:amethyst_cluster',item:'minecraft:amethyst_cluster',group:16}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["amethyst_cluster"]}}}]},{"type":"loot_table","value":"bs.block:get/28","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:large_amethyst_bud',item:'minecraft:large_amethyst_bud',group:16}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["detector_rail","powered_rail","amethyst_cluster","large_amethyst_bud"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/28","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:medium_amethyst_bud',item:'minecraft:medium_amethyst_bud',group:16}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["medium_amethyst_bud"]}}}]},{"type":"loot_table","value":"bs.block:get/28","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:small_amethyst_bud',item:'minecraft:small_amethyst_bud',group:16}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["medium_amethyst_bud","small_amethyst_bud"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:andesite_wall',item:'minecraft:andesite_wall',group:17}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["andesite_wall"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blackstone_wall',item:'minecraft:blackstone_wall',group:17}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["blackstone_wall"]}}}]},{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brick_wall',item:'minecraft:brick_wall',group:17}"}]}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stone_brick_stairs","stone_stairs","tuff_brick_stairs","tuff_stairs","warped_stairs","waxed_cut_copper_stairs","waxed_exposed_cut_copper_stairs","waxed_oxidized_cut_copper_stairs","waxed_weathered_cut_copper_stairs","weathered_cut_copper_stairs","acacia_trapdoor","bamboo_trapdoor","birch_trapdoor","cherry_trapdoor","copper_trapdoor","crimson_trapdoor","dark_oak_trapdoor","exposed_copper_trapdoor","iron_trapdoor","jungle_trapdoor","mangrove_trapdoor","oak_trapdoor","oxidized_copper_trapdoor","pale_oak_trapdoor","spruce_trapdoor","warped_trapdoor","waxed_copper_trapdoor","waxed_exposed_copper_trapdoor","waxed_oxidized_copper_trapdoor","waxed_weathered_copper_trapdoor","weathered_copper_trapdoor","acacia_wall_hanging_sign","acacia_wall_sign","bamboo_wall_hanging_sign","bamboo_wall_sign","big_dripleaf_stem","birch_wall_hanging_sign","birch_wall_sign","cherry_wall_hanging_sign","cherry_wall_sign","crimson_wall_hanging_sign","crimson_wall_sign","dark_oak_wall_hanging_sign","dark_oak_wall_sign","ender_chest","jungle_wall_hanging_sign","jungle_wall_sign","ladder","mangrove_wall_hanging_sign","mangrove_wall_sign","oak_wall_hanging_sign","oak_wall_sign","pale_oak_wall_hanging_sign","pale_oak_wall_sign","spruce_wall_hanging_sign","spruce_wall_sign","warped_wall_hanging_sign","warped_wall_sign","activator_rail","detector_rail","powered_rail","amethyst_cluster","large_amethyst_bud","medium_amethyst_bud","small_amethyst_bud","andesite_wall","blackstone_wall","brick_wall"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cobbled_deepslate_wall',item:'minecraft:cobbled_deepslate_wall',group:17}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cobbled_deepslate_wall"]}}}]},{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cobblestone_wall',item:'minecraft:cobblestone_wall',group:17}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cobbled_deepslate_wall","cobblestone_wall"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:deepslate_brick_wall',item:'minecraft:deepslate_brick_wall',group:17}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["deepslate_brick_wall"]}}}]},{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:deepslate_tile_wall',item:'minecraft:deepslate_tile_wall',group:17}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cobbled_deepslate_wall","cobblestone_wall","deepslate_brick_wall","deepslate_tile_wall"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:diorite_wall',item:'minecraft:diorite_wall',group:17}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["diorite_wall"]}}}]},{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:end_stone_brick_wall',item:'minecraft:end_stone_brick_wall',group:17}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["diorite_wall","end_stone_brick_wall"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:granite_wall',item:'minecraft:granite_wall',group:17}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["granite_wall"]}}}]},{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mossy_cobblestone_wall',item:'minecraft:mossy_cobblestone_wall',group:17}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cobbled_deepslate_wall","cobblestone_wall","deepslate_brick_wall","deepslate_tile_wall","diorite_wall","end_stone_brick_wall","granite_wall","mossy_cobblestone_wall"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mossy_stone_brick_wall',item:'minecraft:mossy_stone_brick_wall',group:17}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mossy_stone_brick_wall"]}}}]},{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mud_brick_wall',item:'minecraft:mud_brick_wall',group:17}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mossy_stone_brick_wall","mud_brick_wall"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:nether_brick_wall',item:'minecraft:nether_brick_wall',group:17}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_brick_wall"]}}}]},{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_blackstone_brick_wall',item:'minecraft:polished_blackstone_brick_wall',group:17}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mossy_stone_brick_wall","mud_brick_wall","nether_brick_wall","polished_blackstone_brick_wall"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_blackstone_wall',item:'minecraft:polished_blackstone_wall',group:17}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_blackstone_wall"]}}}]},{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_deepslate_wall',item:'minecraft:polished_deepslate_wall',group:17}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_blackstone_wall","polished_deepslate_wall"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:polished_tuff_wall',item:'minecraft:polished_tuff_wall',group:17}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["polished_tuff_wall"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:prismarine_wall',item:'minecraft:prismarine_wall',group:17}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["prismarine_wall"]}}}]},{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_nether_brick_wall',item:'minecraft:red_nether_brick_wall',group:17}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cobbled_deepslate_wall","cobblestone_wall","deepslate_brick_wall","deepslate_tile_wall","diorite_wall","end_stone_brick_wall","granite_wall","mossy_cobblestone_wall","mossy_stone_brick_wall","mud_brick_wall","nether_brick_wall","polished_blackstone_brick_wall","polished_blackstone_wall","polished_deepslate_wall","polished_tuff_wall","prismarine_wall","red_nether_brick_wall"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_sandstone_wall',item:'minecraft:red_sandstone_wall',group:17}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_sandstone_wall"]}}}]},{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sandstone_wall',item:'minecraft:sandstone_wall',group:17}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_sandstone_wall","sandstone_wall"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stone_brick_wall',item:'minecraft:stone_brick_wall',group:17}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stone_brick_wall"]}}}]},{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tuff_brick_wall',item:'minecraft:tuff_brick_wall',group:17}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_sandstone_wall","sandstone_wall","stone_brick_wall","tuff_brick_wall"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/33","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tuff_wall',item:'minecraft:tuff_wall',group:17}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["tuff_wall"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:anvil',item:'minecraft:anvil',group:18}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["tuff_wall","anvil"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:attached_melon_stem',item:'minecraft:melon_seeds',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["attached_melon_stem"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:attached_pumpkin_stem',item:'minecraft:melon_seeds',group:18}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_sandstone_wall","sandstone_wall","stone_brick_wall","tuff_brick_wall","tuff_wall","anvil","attached_melon_stem","attached_pumpkin_stem"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:black_glazed_terracotta',item:'minecraft:black_glazed_terracotta',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["black_glazed_terracotta"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:black_wall_banner',item:'minecraft:black_banner',group:18}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["black_glazed_terracotta","black_wall_banner"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blue_glazed_terracotta',item:'minecraft:blue_glazed_terracotta',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["blue_glazed_terracotta"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blue_wall_banner',item:'minecraft:blue_banner',group:18}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["black_glazed_terracotta","black_wall_banner","blue_glazed_terracotta","blue_wall_banner"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brown_glazed_terracotta',item:'minecraft:brown_glazed_terracotta',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brown_glazed_terracotta"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brown_wall_banner',item:'minecraft:brown_banner',group:18}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brown_glazed_terracotta","brown_wall_banner"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:carved_pumpkin',item:'minecraft:carved_pumpkin',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["carved_pumpkin"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:chipped_anvil',item:'minecraft:chipped_anvil',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["chipped_anvil"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cyan_glazed_terracotta',item:'minecraft:cyan_glazed_terracotta',group:18}"}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cobbled_deepslate_wall","cobblestone_wall","deepslate_brick_wall","deepslate_tile_wall","diorite_wall","end_stone_brick_wall","granite_wall","mossy_cobblestone_wall","mossy_stone_brick_wall","mud_brick_wall","nether_brick_wall","polished_blackstone_brick_wall","polished_blackstone_wall","polished_deepslate_wall","polished_tuff_wall","prismarine_wall","red_nether_brick_wall","red_sandstone_wall","sandstone_wall","stone_brick_wall","tuff_brick_wall","tuff_wall","anvil","attached_melon_stem","attached_pumpkin_stem","black_glazed_terracotta","black_wall_banner","blue_glazed_terracotta","blue_wall_banner","brown_glazed_terracotta","brown_wall_banner","carved_pumpkin","chipped_anvil","cyan_glazed_terracotta"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cyan_wall_banner',item:'minecraft:cyan_banner',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cyan_wall_banner"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:damaged_anvil',item:'minecraft:damaged_anvil',group:18}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cyan_wall_banner","damaged_anvil"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gray_glazed_terracotta',item:'minecraft:gray_glazed_terracotta',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["gray_glazed_terracotta"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gray_wall_banner',item:'minecraft:gray_banner',group:18}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cyan_wall_banner","damaged_anvil","gray_glazed_terracotta","gray_wall_banner"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:green_glazed_terracotta',item:'minecraft:green_glazed_terracotta',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_glazed_terracotta"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:green_wall_banner',item:'minecraft:green_banner',group:18}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_glazed_terracotta","green_wall_banner"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jack_o_lantern',item:'minecraft:jack_o_lantern',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["jack_o_lantern"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_blue_glazed_terracotta',item:'minecraft:light_blue_glazed_terracotta',group:18}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cyan_wall_banner","damaged_anvil","gray_glazed_terracotta","gray_wall_banner","green_glazed_terracotta","green_wall_banner","jack_o_lantern","light_blue_glazed_terracotta"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_blue_wall_banner',item:'minecraft:light_blue_banner',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_wall_banner"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_gray_glazed_terracotta',item:'minecraft:light_gray_glazed_terracotta',group:18}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_wall_banner","light_gray_glazed_terracotta"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_gray_wall_banner',item:'minecraft:light_gray_banner',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_gray_wall_banner"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lime_glazed_terracotta',item:'minecraft:lime_glazed_terracotta',group:18}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_wall_banner","light_gray_glazed_terracotta","light_gray_wall_banner","lime_glazed_terracotta"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lime_wall_banner',item:'minecraft:lime_banner',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lime_wall_banner"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:loom',item:'minecraft:loom',group:18}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lime_wall_banner","loom"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:magenta_glazed_terracotta',item:'minecraft:magenta_glazed_terracotta',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["magenta_glazed_terracotta"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:magenta_wall_banner',item:'minecraft:magenta_banner',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["magenta_wall_banner"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:orange_glazed_terracotta',item:'minecraft:orange_glazed_terracotta',group:18}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cyan_wall_banner","damaged_anvil","gray_glazed_terracotta","gray_wall_banner","green_glazed_terracotta","green_wall_banner","jack_o_lantern","light_blue_glazed_terracotta","light_blue_wall_banner","light_gray_glazed_terracotta","light_gray_wall_banner","lime_glazed_terracotta","lime_wall_banner","loom","magenta_glazed_terracotta","magenta_wall_banner","orange_glazed_terracotta"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:orange_wall_banner',item:'minecraft:orange_banner',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["orange_wall_banner"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pink_glazed_terracotta',item:'minecraft:pink_glazed_terracotta',group:18}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["orange_wall_banner","pink_glazed_terracotta"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pink_wall_banner',item:'minecraft:pink_banner',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pink_wall_banner"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purple_glazed_terracotta',item:'minecraft:purple_glazed_terracotta',group:18}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["orange_wall_banner","pink_glazed_terracotta","pink_wall_banner","purple_glazed_terracotta"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purple_wall_banner',item:'minecraft:purple_banner',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purple_wall_banner"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_glazed_terracotta',item:'minecraft:red_glazed_terracotta',group:18}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purple_wall_banner","red_glazed_terracotta"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_wall_banner',item:'minecraft:red_banner',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_wall_banner"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:soul_wall_torch',item:'minecraft:soul_torch',group:18}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["orange_wall_banner","pink_glazed_terracotta","pink_wall_banner","purple_glazed_terracotta","purple_wall_banner","red_glazed_terracotta","red_wall_banner","soul_wall_torch"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:stonecutter',item:'minecraft:stonecutter',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stonecutter"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:wall_torch',item:'minecraft:torch',group:18}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stonecutter","wall_torch"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:white_glazed_terracotta',item:'minecraft:white_glazed_terracotta',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_glazed_terracotta"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:white_wall_banner',item:'minecraft:white_banner',group:18}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stonecutter","wall_torch","white_glazed_terracotta","white_wall_banner"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:yellow_glazed_terracotta',item:'minecraft:yellow_glazed_terracotta',group:18}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_glazed_terracotta"]}}}]},{"type":"loot_table","value":"bs.block:get/1","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:yellow_wall_banner',item:'minecraft:yellow_banner',group:18}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_glazed_terracotta","yellow_wall_banner"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/35","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bamboo',item:'minecraft:bamboo',group:19}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/37","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:barrel',item:'minecraft:barrel',group:20}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["barrel"]}}}]},{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:barrier',item:'minecraft:barrier',group:21}"}]}]}]}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_pressure_plate","oak_pressure_plate","pale_oak_pressure_plate","polished_blackstone_pressure_plate","spruce_pressure_plate","stone_pressure_plate","warped_pressure_plate","acacia_sapling","birch_sapling","cherry_sapling","dark_oak_sapling","jungle_sapling","oak_sapling","pale_oak_sapling","spruce_sapling","acacia_sign","bamboo_sign","birch_sign","cherry_sign","crimson_sign","dark_oak_sign","jungle_sign","mangrove_sign","oak_sign","pale_oak_sign","spruce_sign","warped_sign","acacia_slab","andesite_slab","bamboo_mosaic_slab","bamboo_slab","birch_slab","blackstone_slab","brick_slab","cherry_slab","cobbled_deepslate_slab","cobblestone_slab","crimson_slab","cut_copper_slab","cut_red_sandstone_slab","cut_sandstone_slab","dark_oak_slab","dark_prismarine_slab","deepslate_brick_slab","deepslate_tile_slab","diorite_slab","end_stone_brick_slab","exposed_cut_copper_slab","granite_slab","jungle_slab","mangrove_slab","mossy_cobblestone_slab","mossy_stone_brick_slab","mud_brick_slab","nether_brick_slab","oak_slab","oxidized_cut_copper_slab","pale_oak_slab","petrified_oak_slab","polished_andesite_slab","polished_blackstone_brick_slab","polished_blackstone_slab","polished_deepslate_slab","polished_diorite_slab","polished_granite_slab","polished_tuff_slab","prismarine_brick_slab","prismarine_slab","purpur_slab","quartz_slab","red_nether_brick_slab","red_sandstone_slab","sandstone_slab","smooth_quartz_slab","smooth_red_sandstone_slab","smooth_sandstone_slab","smooth_stone_slab","spruce_slab","stone_brick_slab","stone_slab","tuff_brick_slab","tuff_slab","warped_slab","waxed_cut_copper_slab","waxed_exposed_cut_copper_slab","waxed_oxidized_cut_copper_slab","waxed_weathered_cut_copper_slab","weathered_cut_copper_slab","acacia_stairs","andesite_stairs","bamboo_mosaic_stairs","bamboo_stairs","birch_stairs","blackstone_stairs","brick_stairs","cherry_stairs","cobbled_deepslate_stairs","cobblestone_stairs","crimson_stairs","cut_copper_stairs","dark_oak_stairs","dark_prismarine_stairs","deepslate_brick_stairs","deepslate_tile_stairs","diorite_stairs","end_stone_brick_stairs","exposed_cut_copper_stairs","granite_stairs","jungle_stairs","mangrove_stairs","mossy_cobblestone_stairs","mossy_stone_brick_stairs","mud_brick_stairs","nether_brick_stairs","oak_stairs","oxidized_cut_copper_stairs","pale_oak_stairs","polished_andesite_stairs","polished_blackstone_brick_stairs","polished_blackstone_stairs","polished_deepslate_stairs","polished_diorite_stairs","polished_granite_stairs","polished_tuff_stairs","prismarine_brick_stairs","prismarine_stairs","purpur_stairs","quartz_stairs","red_nether_brick_stairs","red_sandstone_stairs","sandstone_stairs","smooth_quartz_stairs","smooth_red_sandstone_stairs","smooth_sandstone_stairs","spruce_stairs","stone_brick_stairs","stone_stairs","tuff_brick_stairs","tuff_stairs","warped_stairs","waxed_cut_copper_stairs","waxed_exposed_cut_copper_stairs","waxed_oxidized_cut_copper_stairs","waxed_weathered_cut_copper_stairs","weathered_cut_copper_stairs","acacia_trapdoor","bamboo_trapdoor","birch_trapdoor","cherry_trapdoor","copper_trapdoor","crimson_trapdoor","dark_oak_trapdoor","exposed_copper_trapdoor","iron_trapdoor","jungle_trapdoor","mangrove_trapdoor","oak_trapdoor","oxidized_copper_trapdoor","pale_oak_trapdoor","spruce_trapdoor","warped_trapdoor","waxed_copper_trapdoor","waxed_exposed_copper_trapdoor","waxed_oxidized_copper_trapdoor","waxed_weathered_copper_trapdoor","weathered_copper_trapdoor","acacia_wall_hanging_sign","acacia_wall_sign","bamboo_wall_hanging_sign","bamboo_wall_sign","big_dripleaf_stem","birch_wall_hanging_sign","birch_wall_sign","cherry_wall_hanging_sign","cherry_wall_sign","crimson_wall_hanging_sign","crimson_wall_sign","dark_oak_wall_hanging_sign","dark_oak_wall_sign","ender_chest","jungle_wall_hanging_sign","jungle_wall_sign","ladder","mangrove_wall_hanging_sign","mangrove_wall_sign","oak_wall_hanging_sign","oak_wall_sign","pale_oak_wall_hanging_sign","pale_oak_wall_sign","spruce_wall_hanging_sign","spruce_wall_sign","warped_wall_hanging_sign","warped_wall_sign","activator_rail","detector_rail","powered_rail","amethyst_cluster","large_amethyst_bud","medium_amethyst_bud","small_amethyst_bud","andesite_wall","blackstone_wall","brick_wall","cobbled_deepslate_wall","cobblestone_wall","deepslate_brick_wall","deepslate_tile_wall","diorite_wall","end_stone_brick_wall","granite_wall","mossy_cobblestone_wall","mossy_stone_brick_wall","mud_brick_wall","nether_brick_wall","polished_blackstone_brick_wall","polished_blackstone_wall","polished_deepslate_wall","polished_tuff_wall","prismarine_wall","red_nether_brick_wall","red_sandstone_wall","sandstone_wall","stone_brick_wall","tuff_brick_wall","tuff_wall","anvil","attached_melon_stem","attached_pumpkin_stem","black_glazed_terracotta","black_wall_banner","blue_glazed_terracotta","blue_wall_banner","brown_glazed_terracotta","brown_wall_banner","carved_pumpkin","chipped_anvil","cyan_glazed_terracotta","cyan_wall_banner","damaged_anvil","gray_glazed_terracotta","gray_wall_banner","green_glazed_terracotta","green_wall_banner","jack_o_lantern","light_blue_glazed_terracotta","light_blue_wall_banner","light_gray_glazed_terracotta","light_gray_wall_banner","lime_glazed_terracotta","lime_wall_banner","loom","magenta_glazed_terracotta","magenta_wall_banner","orange_glazed_terracotta","orange_wall_banner","pink_glazed_terracotta","pink_wall_banner","purple_glazed_terracotta","purple_wall_banner","red_glazed_terracotta","red_wall_banner","soul_wall_torch","stonecutter","wall_torch","white_glazed_terracotta","white_wall_banner","yellow_glazed_terracotta","yellow_wall_banner","bamboo","barrel","barrier"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:copper_grate',item:'minecraft:copper_grate',group:21}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["copper_grate"]}}}]},{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:exposed_copper_grate',item:'minecraft:exposed_copper_grate',group:21}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["copper_grate","exposed_copper_grate"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:hanging_roots',item:'minecraft:hanging_roots',group:21}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["hanging_roots"]}}}]},{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:heavy_core',item:'minecraft:heavy_core',group:21}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["copper_grate","exposed_copper_grate","hanging_roots","heavy_core"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_roots',item:'minecraft:mangrove_roots',group:21}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_roots"]}}}]},{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oxidized_copper_grate',item:'minecraft:oxidized_copper_grate',group:21}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_roots","oxidized_copper_grate"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_copper_grate',item:'minecraft:waxed_copper_grate',group:21}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_copper_grate"]}}}]},{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_exposed_copper_grate',item:'minecraft:waxed_exposed_copper_grate',group:21}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["copper_grate","exposed_copper_grate","hanging_roots","heavy_core","mangrove_roots","oxidized_copper_grate","waxed_copper_grate","waxed_exposed_copper_grate"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_oxidized_copper_grate',item:'minecraft:waxed_oxidized_copper_grate',group:21}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_oxidized_copper_grate"]}}}]},{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_weathered_copper_grate',item:'minecraft:waxed_weathered_copper_grate',group:21}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_oxidized_copper_grate","waxed_weathered_copper_grate"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:weathered_copper_grate',item:'minecraft:weathered_copper_grate',group:21}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["weathered_copper_grate"]}}}]},{"type":"loot_table","value":"bs.block:get/38","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bee_nest',item:'minecraft:bee_nest',group:22}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_oxidized_copper_grate","waxed_weathered_copper_grate","weathered_copper_grate","bee_nest"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/38","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:beehive',item:'minecraft:beehive',group:22}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["beehive"]}}}]},{"type":"loot_table","value":"bs.block:get/39","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:beetroots',item:'minecraft:beetroot_seeds',group:23}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["beehive","beetroots"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/39","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:frosted_ice',item:'None',group:23}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["frosted_ice"]}}}]},{"type":"loot_table","value":"bs.block:get/39","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:nether_wart',item:'minecraft:nether_wart',group:23}"}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["copper_grate","exposed_copper_grate","hanging_roots","heavy_core","mangrove_roots","oxidized_copper_grate","waxed_copper_grate","waxed_exposed_copper_grate","waxed_oxidized_copper_grate","waxed_weathered_copper_grate","weathered_copper_grate","bee_nest","beehive","beetroots","frosted_ice","nether_wart"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/39","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sweet_berry_bush',item:'minecraft:sweet_berries',group:23}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sweet_berry_bush"]}}}]},{"type":"loot_table","value":"bs.block:get/40","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bell',item:'minecraft:bell',group:24}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sweet_berry_bush","bell"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/41","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:big_dripleaf',item:'minecraft:big_dripleaf',group:25}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["big_dripleaf"]}}}]},{"type":"loot_table","value":"bs.block:get/42","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:black_banner',item:'minecraft:black_banner',group:26}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sweet_berry_bush","bell","big_dripleaf","black_banner"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/42","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blue_banner',item:'minecraft:blue_banner',group:26}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["blue_banner"]}}}]},{"type":"loot_table","value":"bs.block:get/42","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brown_banner',item:'minecraft:brown_banner',group:26}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["blue_banner","brown_banner"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/42","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cyan_banner',item:'minecraft:cyan_banner',group:26}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cyan_banner"]}}}]},{"type":"loot_table","value":"bs.block:get/42","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gray_banner',item:'minecraft:gray_banner',group:26}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sweet_berry_bush","bell","big_dripleaf","black_banner","blue_banner","brown_banner","cyan_banner","gray_banner"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/42","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:green_banner',item:'minecraft:green_banner',group:26}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_banner"]}}}]},{"type":"loot_table","value":"bs.block:get/42","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_blue_banner',item:'minecraft:light_blue_banner',group:26}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_banner","light_blue_banner"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/42","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_gray_banner',item:'minecraft:light_gray_banner',group:26}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_gray_banner"]}}}]},{"type":"loot_table","value":"bs.block:get/42","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lime_banner',item:'minecraft:lime_banner',group:26}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_banner","light_blue_banner","light_gray_banner","lime_banner"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/42","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:magenta_banner',item:'minecraft:magenta_banner',group:26}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["magenta_banner"]}}}]},{"type":"loot_table","value":"bs.block:get/42","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:orange_banner',item:'minecraft:orange_banner',group:26}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["magenta_banner","orange_banner"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/42","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pink_banner',item:'minecraft:pink_banner',group:26}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pink_banner"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/42","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purple_banner',item:'minecraft:purple_banner',group:26}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purple_banner"]}}}]},{"type":"loot_table","value":"bs.block:get/42","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_banner',item:'minecraft:red_banner',group:26}"}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["copper_grate","exposed_copper_grate","hanging_roots","heavy_core","mangrove_roots","oxidized_copper_grate","waxed_copper_grate","waxed_exposed_copper_grate","waxed_oxidized_copper_grate","waxed_weathered_copper_grate","weathered_copper_grate","bee_nest","beehive","beetroots","frosted_ice","nether_wart","sweet_berry_bush","bell","big_dripleaf","black_banner","blue_banner","brown_banner","cyan_banner","gray_banner","green_banner","light_blue_banner","light_gray_banner","lime_banner","magenta_banner","orange_banner","pink_banner","purple_banner","red_banner"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/42","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:white_banner',item:'minecraft:white_banner',group:26}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_banner"]}}}]},{"type":"loot_table","value":"bs.block:get/42","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:yellow_banner',item:'minecraft:yellow_banner',group:26}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_banner","yellow_banner"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/44","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:black_bed',item:'minecraft:black_bed',group:27}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["black_bed"]}}}]},{"type":"loot_table","value":"bs.block:get/44","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blue_bed',item:'minecraft:blue_bed',group:27}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_banner","yellow_banner","black_bed","blue_bed"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/44","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brown_bed',item:'minecraft:brown_bed',group:27}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brown_bed"]}}}]},{"type":"loot_table","value":"bs.block:get/44","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cyan_bed',item:'minecraft:cyan_bed',group:27}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brown_bed","cyan_bed"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/44","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gray_bed',item:'minecraft:gray_bed',group:27}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["gray_bed"]}}}]},{"type":"loot_table","value":"bs.block:get/44","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:green_bed',item:'minecraft:green_bed',group:27}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_banner","yellow_banner","black_bed","blue_bed","brown_bed","cyan_bed","gray_bed","green_bed"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/44","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_blue_bed',item:'minecraft:light_blue_bed',group:27}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_bed"]}}}]},{"type":"loot_table","value":"bs.block:get/44","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_gray_bed',item:'minecraft:light_gray_bed',group:27}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_bed","light_gray_bed"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/44","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lime_bed',item:'minecraft:lime_bed',group:27}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lime_bed"]}}}]},{"type":"loot_table","value":"bs.block:get/44","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:magenta_bed',item:'minecraft:magenta_bed',group:27}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_bed","light_gray_bed","lime_bed","magenta_bed"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/44","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:orange_bed',item:'minecraft:orange_bed',group:27}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["orange_bed"]}}}]},{"type":"loot_table","value":"bs.block:get/44","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pink_bed',item:'minecraft:pink_bed',group:27}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["orange_bed","pink_bed"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/44","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purple_bed',item:'minecraft:purple_bed',group:27}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purple_bed"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/44","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_bed',item:'minecraft:red_bed',group:27}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_bed"]}}}]},{"type":"loot_table","value":"bs.block:get/44","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:white_bed',item:'minecraft:white_bed',group:27}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_banner","yellow_banner","black_bed","blue_bed","brown_bed","cyan_bed","gray_bed","green_bed","light_blue_bed","light_gray_bed","lime_bed","magenta_bed","orange_bed","pink_bed","purple_bed","red_bed","white_bed"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/44","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:yellow_bed',item:'minecraft:yellow_bed',group:27}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_bed"]}}}]},{"type":"loot_table","value":"bs.block:get/46","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:black_candle',item:'minecraft:black_candle',group:28}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_bed","black_candle"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/46","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blue_candle',item:'minecraft:blue_candle',group:28}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["blue_candle"]}}}]},{"type":"loot_table","value":"bs.block:get/46","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brown_candle',item:'minecraft:brown_candle',group:28}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_bed","black_candle","blue_candle","brown_candle"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/46","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:candle',item:'minecraft:candle',group:28}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["candle"]}}}]},{"type":"loot_table","value":"bs.block:get/46","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cyan_candle',item:'minecraft:cyan_candle',group:28}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["candle","cyan_candle"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/46","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gray_candle',item:'minecraft:gray_candle',group:28}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["gray_candle"]}}}]},{"type":"loot_table","value":"bs.block:get/46","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:green_candle',item:'minecraft:green_candle',group:28}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_bed","black_candle","blue_candle","brown_candle","candle","cyan_candle","gray_candle","green_candle"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/46","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_blue_candle',item:'minecraft:light_blue_candle',group:28}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_candle"]}}}]},{"type":"loot_table","value":"bs.block:get/46","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_gray_candle',item:'minecraft:light_gray_candle',group:28}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_candle","light_gray_candle"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/46","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lime_candle',item:'minecraft:lime_candle',group:28}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lime_candle"]}}}]},{"type":"loot_table","value":"bs.block:get/46","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:magenta_candle',item:'minecraft:magenta_candle',group:28}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_blue_candle","light_gray_candle","lime_candle","magenta_candle"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/46","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:orange_candle',item:'minecraft:orange_candle',group:28}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["orange_candle"]}}}]},{"type":"loot_table","value":"bs.block:get/46","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pink_candle',item:'minecraft:pink_candle',group:28}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["orange_candle","pink_candle"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/46","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purple_candle',item:'minecraft:purple_candle',group:28}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purple_candle"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/46","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_candle',item:'minecraft:red_candle',group:28}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_candle"]}}}]},{"type":"loot_table","value":"bs.block:get/46","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:white_candle',item:'minecraft:white_candle',group:28}"}]}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["copper_grate","exposed_copper_grate","hanging_roots","heavy_core","mangrove_roots","oxidized_copper_grate","waxed_copper_grate","waxed_exposed_copper_grate","waxed_oxidized_copper_grate","waxed_weathered_copper_grate","weathered_copper_grate","bee_nest","beehive","beetroots","frosted_ice","nether_wart","sweet_berry_bush","bell","big_dripleaf","black_banner","blue_banner","brown_banner","cyan_banner","gray_banner","green_banner","light_blue_banner","light_gray_banner","lime_banner","magenta_banner","orange_banner","pink_banner","purple_banner","red_banner","white_banner","yellow_banner","black_bed","blue_bed","brown_bed","cyan_bed","gray_bed","green_bed","light_blue_bed","light_gray_bed","lime_bed","magenta_bed","orange_bed","pink_bed","purple_bed","red_bed","white_bed","yellow_bed","black_candle","blue_candle","brown_candle","candle","cyan_candle","gray_candle","green_candle","light_blue_candle","light_gray_candle","lime_candle","magenta_candle","orange_candle","pink_candle","purple_candle","red_candle","white_candle"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/46","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:yellow_candle',item:'minecraft:yellow_candle',group:28}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_candle"]}}}]},{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:black_candle_cake',item:'None',group:29}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_candle","black_candle_cake"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blue_candle_cake',item:'None',group:29}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["blue_candle_cake"]}}}]},{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brown_candle_cake',item:'None',group:29}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_candle","black_candle_cake","blue_candle_cake","brown_candle_cake"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:candle_cake',item:'None',group:29}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["candle_cake"]}}}]},{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cyan_candle_cake',item:'None',group:29}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["candle_cake","cyan_candle_cake"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:deepslate_redstone_ore',item:'minecraft:deepslate_redstone_ore',group:29}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["deepslate_redstone_ore"]}}}]},{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gray_candle_cake',item:'None',group:29}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_candle","black_candle_cake","blue_candle_cake","brown_candle_cake","candle_cake","cyan_candle_cake","deepslate_redstone_ore","gray_candle_cake"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:green_candle_cake',item:'None',group:29}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_candle_cake"]}}}]},{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_blue_candle_cake',item:'None',group:29}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_candle_cake","light_blue_candle_cake"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_gray_candle_cake',item:'None',group:29}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_gray_candle_cake"]}}}]},{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lime_candle_cake',item:'None',group:29}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_candle_cake","light_blue_candle_cake","light_gray_candle_cake","lime_candle_cake"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:magenta_candle_cake',item:'None',group:29}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["magenta_candle_cake"]}}}]},{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:orange_candle_cake',item:'None',group:29}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["magenta_candle_cake","orange_candle_cake"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pink_candle_cake',item:'None',group:29}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pink_candle_cake"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purple_candle_cake',item:'None',group:29}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purple_candle_cake"]}}}]},{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_candle_cake',item:'None',group:29}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_candle","black_candle_cake","blue_candle_cake","brown_candle_cake","candle_cake","cyan_candle_cake","deepslate_redstone_ore","gray_candle_cake","green_candle_cake","light_blue_candle_cake","light_gray_candle_cake","lime_candle_cake","magenta_candle_cake","orange_candle_cake","pink_candle_cake","purple_candle_cake","red_candle_cake"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:redstone_lamp',item:'minecraft:redstone_lamp',group:29}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["redstone_lamp"]}}}]},{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:redstone_ore',item:'minecraft:redstone_ore',group:29}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["redstone_lamp","redstone_ore"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:white_candle_cake',item:'None',group:29}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["white_candle_cake"]}}}]},{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:yellow_candle_cake',item:'None',group:29}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["redstone_lamp","redstone_ore","white_candle_cake","yellow_candle_cake"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:black_shulker_box',item:'minecraft:black_shulker_box',group:30}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["black_shulker_box"]}}}]},{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blue_shulker_box',item:'minecraft:blue_shulker_box',group:30}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["black_shulker_box","blue_shulker_box"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brown_shulker_box',item:'minecraft:brown_shulker_box',group:30}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brown_shulker_box"]}}}]},{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cyan_shulker_box',item:'minecraft:cyan_shulker_box',group:30}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["redstone_lamp","redstone_ore","white_candle_cake","yellow_candle_cake","black_shulker_box","blue_shulker_box","brown_shulker_box","cyan_shulker_box"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:end_rod',item:'minecraft:end_rod',group:30}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["end_rod"]}}}]},{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:gray_shulker_box',item:'minecraft:gray_shulker_box',group:30}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["end_rod","gray_shulker_box"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:green_shulker_box',item:'minecraft:green_shulker_box',group:30}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["green_shulker_box"]}}}]},{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_blue_shulker_box',item:'minecraft:light_blue_shulker_box',group:30}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["end_rod","gray_shulker_box","green_shulker_box","light_blue_shulker_box"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_gray_shulker_box',item:'minecraft:light_gray_shulker_box',group:30}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_gray_shulker_box"]}}}]},{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lime_shulker_box',item:'minecraft:lime_shulker_box',group:30}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_gray_shulker_box","lime_shulker_box"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:magenta_shulker_box',item:'minecraft:magenta_shulker_box',group:30}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["magenta_shulker_box"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:orange_shulker_box',item:'minecraft:orange_shulker_box',group:30}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["orange_shulker_box"]}}}]},{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pink_shulker_box',item:'minecraft:pink_shulker_box',group:30}"}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_candle","black_candle_cake","blue_candle_cake","brown_candle_cake","candle_cake","cyan_candle_cake","deepslate_redstone_ore","gray_candle_cake","green_candle_cake","light_blue_candle_cake","light_gray_candle_cake","lime_candle_cake","magenta_candle_cake","orange_candle_cake","pink_candle_cake","purple_candle_cake","red_candle_cake","redstone_lamp","redstone_ore","white_candle_cake","yellow_candle_cake","black_shulker_box","blue_shulker_box","brown_shulker_box","cyan_shulker_box","end_rod","gray_shulker_box","green_shulker_box","light_blue_shulker_box","light_gray_shulker_box","lime_shulker_box","magenta_shulker_box","orange_shulker_box","pink_shulker_box"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:purple_shulker_box',item:'minecraft:purple_shulker_box',group:30}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purple_shulker_box"]}}}]},{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_shulker_box',item:'minecraft:red_shulker_box',group:30}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purple_shulker_box","red_shulker_box"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:shulker_box',item:'minecraft:shulker_box',group:30}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["shulker_box"]}}}]},{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:white_shulker_box',item:'minecraft:white_shulker_box',group:30}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purple_shulker_box","red_shulker_box","shulker_box","white_shulker_box"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/36","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:yellow_shulker_box',item:'minecraft:yellow_shulker_box',group:30}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_shulker_box"]}}}]},{"type":"loot_table","value":"bs.block:get/48","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:blast_furnace',item:'minecraft:blast_furnace',group:31}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["yellow_shulker_box","blast_furnace"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/48","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:furnace',item:'minecraft:furnace',group:31}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["furnace"]}}}]},{"type":"loot_table","value":"bs.block:get/48","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:smoker',item:'minecraft:smoker',group:31}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purple_shulker_box","red_shulker_box","shulker_box","white_shulker_box","yellow_shulker_box","blast_furnace","furnace","smoker"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brain_coral',item:'minecraft:brain_coral',group:32}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brain_coral"]}}}]},{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brain_coral_fan',item:'minecraft:brain_coral_fan',group:32}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brain_coral","brain_coral_fan"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bubble_coral',item:'minecraft:bubble_coral',group:32}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bubble_coral"]}}}]},{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bubble_coral_fan',item:'minecraft:bubble_coral_fan',group:32}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brain_coral","brain_coral_fan","bubble_coral","bubble_coral_fan"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:conduit',item:'minecraft:conduit',group:32}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["conduit"]}}}]},{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_brain_coral',item:'minecraft:dead_brain_coral',group:32}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["conduit","dead_brain_coral"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_brain_coral_fan',item:'minecraft:dead_brain_coral_fan',group:32}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_brain_coral_fan"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_bubble_coral',item:'minecraft:dead_bubble_coral',group:32}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_bubble_coral"]}}}]},{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_bubble_coral_fan',item:'minecraft:dead_bubble_coral_fan',group:32}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["purple_shulker_box","red_shulker_box","shulker_box","white_shulker_box","yellow_shulker_box","blast_furnace","furnace","smoker","brain_coral","brain_coral_fan","bubble_coral","bubble_coral_fan","conduit","dead_brain_coral","dead_brain_coral_fan","dead_bubble_coral","dead_bubble_coral_fan"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_fire_coral',item:'minecraft:dead_fire_coral',group:32}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_fire_coral"]}}}]},{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_fire_coral_fan',item:'minecraft:dead_fire_coral_fan',group:32}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_fire_coral","dead_fire_coral_fan"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_horn_coral',item:'minecraft:dead_horn_coral',group:32}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_horn_coral"]}}}]},{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_horn_coral_fan',item:'minecraft:dead_horn_coral_fan',group:32}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_fire_coral","dead_fire_coral_fan","dead_horn_coral","dead_horn_coral_fan"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_tube_coral',item:'minecraft:dead_tube_coral',group:32}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_tube_coral"]}}}]},{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_tube_coral_fan',item:'minecraft:dead_tube_coral_fan',group:32}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_tube_coral","dead_tube_coral_fan"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:fire_coral',item:'minecraft:fire_coral',group:32}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["fire_coral"]}}}]},{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:fire_coral_fan',item:'minecraft:fire_coral_fan',group:32}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_fire_coral","dead_fire_coral_fan","dead_horn_coral","dead_horn_coral_fan","dead_tube_coral","dead_tube_coral_fan","fire_coral","fire_coral_fan"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:horn_coral',item:'minecraft:horn_coral',group:32}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["horn_coral"]}}}]},{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:horn_coral_fan',item:'minecraft:horn_coral_fan',group:32}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["horn_coral","horn_coral_fan"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tube_coral',item:'minecraft:tube_coral',group:32}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["tube_coral"]}}}]},{"type":"loot_table","value":"bs.block:get/7","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tube_coral_fan',item:'minecraft:tube_coral_fan',group:32}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["horn_coral","horn_coral_fan","tube_coral","tube_coral_fan"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brain_coral_wall_fan',item:'minecraft:brain_coral_fan',group:33}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brain_coral_wall_fan"]}}}]},{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bubble_coral_wall_fan',item:'minecraft:bubble_coral_fan',group:33}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brain_coral_wall_fan","bubble_coral_wall_fan"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_brain_coral_wall_fan',item:'minecraft:dead_brain_coral_fan',group:33}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_brain_coral_wall_fan"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_bubble_coral_wall_fan',item:'minecraft:dead_bubble_coral_fan',group:33}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_bubble_coral_wall_fan"]}}}]},{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_fire_coral_wall_fan',item:'minecraft:dead_fire_coral_fan',group:33}"}]}]}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["copper_grate","exposed_copper_grate","hanging_roots","heavy_core","mangrove_roots","oxidized_copper_grate","waxed_copper_grate","waxed_exposed_copper_grate","waxed_oxidized_copper_grate","waxed_weathered_copper_grate","weathered_copper_grate","bee_nest","beehive","beetroots","frosted_ice","nether_wart","sweet_berry_bush","bell","big_dripleaf","black_banner","blue_banner","brown_banner","cyan_banner","gray_banner","green_banner","light_blue_banner","light_gray_banner","lime_banner","magenta_banner","orange_banner","pink_banner","purple_banner","red_banner","white_banner","yellow_banner","black_bed","blue_bed","brown_bed","cyan_bed","gray_bed","green_bed","light_blue_bed","light_gray_bed","lime_bed","magenta_bed","orange_bed","pink_bed","purple_bed","red_bed","white_bed","yellow_bed","black_candle","blue_candle","brown_candle","candle","cyan_candle","gray_candle","green_candle","light_blue_candle","light_gray_candle","lime_candle","magenta_candle","orange_candle","pink_candle","purple_candle","red_candle","white_candle","yellow_candle","black_candle_cake","blue_candle_cake","brown_candle_cake","candle_cake","cyan_candle_cake","deepslate_redstone_ore","gray_candle_cake","green_candle_cake","light_blue_candle_cake","light_gray_candle_cake","lime_candle_cake","magenta_candle_cake","orange_candle_cake","pink_candle_cake","purple_candle_cake","red_candle_cake","redstone_lamp","redstone_ore","white_candle_cake","yellow_candle_cake","black_shulker_box","blue_shulker_box","brown_shulker_box","cyan_shulker_box","end_rod","gray_shulker_box","green_shulker_box","light_blue_shulker_box","light_gray_shulker_box","lime_shulker_box","magenta_shulker_box","orange_shulker_box","pink_shulker_box","purple_shulker_box","red_shulker_box","shulker_box","white_shulker_box","yellow_shulker_box","blast_furnace","furnace","smoker","brain_coral","brain_coral_fan","bubble_coral","bubble_coral_fan","conduit","dead_brain_coral","dead_brain_coral_fan","dead_bubble_coral","dead_bubble_coral_fan","dead_fire_coral","dead_fire_coral_fan","dead_horn_coral","dead_horn_coral_fan","dead_tube_coral","dead_tube_coral_fan","fire_coral","fire_coral_fan","horn_coral","horn_coral_fan","tube_coral","tube_coral_fan","brain_coral_wall_fan","bubble_coral_wall_fan","dead_brain_coral_wall_fan","dead_bubble_coral_wall_fan","dead_fire_coral_wall_fan"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_horn_coral_wall_fan',item:'minecraft:dead_horn_coral_fan',group:33}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_horn_coral_wall_fan"]}}}]},{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dead_tube_coral_wall_fan',item:'minecraft:dead_tube_coral_fan',group:33}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_horn_coral_wall_fan","dead_tube_coral_wall_fan"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:fire_coral_wall_fan',item:'minecraft:fire_coral_fan',group:33}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["fire_coral_wall_fan"]}}}]},{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:horn_coral_wall_fan',item:'minecraft:horn_coral_fan',group:33}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_horn_coral_wall_fan","dead_tube_coral_wall_fan","fire_coral_wall_fan","horn_coral_wall_fan"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/21","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tube_coral_wall_fan',item:'minecraft:tube_coral_fan',group:33}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["tube_coral_wall_fan"]}}}]},{"type":"loot_table","value":"bs.block:get/51","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brewing_stand',item:'minecraft:brewing_stand',group:34}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["tube_coral_wall_fan","brewing_stand"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/57","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:brown_mushroom_block',item:'minecraft:brown_mushroom_block',group:35}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brown_mushroom_block"]}}}]},{"type":"loot_table","value":"bs.block:get/57","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mushroom_stem',item:'minecraft:mushroom_stem',group:35}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_horn_coral_wall_fan","dead_tube_coral_wall_fan","fire_coral_wall_fan","horn_coral_wall_fan","tube_coral_wall_fan","brewing_stand","brown_mushroom_block","mushroom_stem"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/57","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:red_mushroom_block',item:'minecraft:red_mushroom_block',group:35}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_mushroom_block"]}}}]},{"type":"loot_table","value":"bs.block:get/58","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:bubble_column',item:'None',group:36}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_mushroom_block","bubble_column"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/59","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cactus',item:'minecraft:cactus',group:37}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cactus"]}}}]},{"type":"loot_table","value":"bs.block:get/59","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sugar_cane',item:'minecraft:sugar_cane',group:37}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["red_mushroom_block","bubble_column","cactus","sugar_cane"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/60","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cake',item:'minecraft:cake',group:38}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cake"]}}}]},{"type":"loot_table","value":"bs.block:get/62","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:calibrated_sculk_sensor',item:'minecraft:calibrated_sculk_sensor',group:39}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cake","calibrated_sculk_sensor"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/64","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:campfire',item:'minecraft:campfire',group:40}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["campfire"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/64","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:soul_campfire',item:'minecraft:soul_campfire',group:40}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["soul_campfire"]}}}]},{"type":"loot_table","value":"bs.block:get/65","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:carrots',item:'minecraft:carrot',group:41}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_horn_coral_wall_fan","dead_tube_coral_wall_fan","fire_coral_wall_fan","horn_coral_wall_fan","tube_coral_wall_fan","brewing_stand","brown_mushroom_block","mushroom_stem","red_mushroom_block","bubble_column","cactus","sugar_cane","cake","calibrated_sculk_sensor","campfire","soul_campfire","carrots"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/65","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:melon_stem',item:'minecraft:pumpkin_seeds',group:41}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["melon_stem"]}}}]},{"type":"loot_table","value":"bs.block:get/65","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:potatoes',item:'minecraft:potato',group:41}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["melon_stem","potatoes"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/65","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pumpkin_stem',item:'minecraft:pumpkin_seeds',group:41}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pumpkin_stem"]}}}]},{"type":"loot_table","value":"bs.block:get/65","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:wheat',item:'minecraft:wheat_seeds',group:41}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["melon_stem","potatoes","pumpkin_stem","wheat"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/67","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cave_vines',item:'minecraft:glow_berries',group:42}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cave_vines"]}}}]},{"type":"loot_table","value":"bs.block:get/68","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cave_vines_plant',item:'minecraft:glow_berries',group:43}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cave_vines","cave_vines_plant"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/69","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:chain',item:'minecraft:chain',group:44}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["chain"]}}}]},{"type":"loot_table","value":"bs.block:get/70","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:chain_command_block',item:'minecraft:chain_command_block',group:45}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["melon_stem","potatoes","pumpkin_stem","wheat","cave_vines","cave_vines_plant","chain","chain_command_block"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/70","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:command_block',item:'minecraft:command_block',group:45}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["command_block"]}}}]},{"type":"loot_table","value":"bs.block:get/70","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:repeating_command_block',item:'minecraft:repeating_command_block',group:45}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["command_block","repeating_command_block"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/71","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:chest',item:'minecraft:chest',group:46}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["chest"]}}}]},{"type":"loot_table","value":"bs.block:get/71","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:trapped_chest',item:'minecraft:trapped_chest',group:46}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["command_block","repeating_command_block","chest","trapped_chest"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/77","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:chiseled_bookshelf',item:'minecraft:chiseled_bookshelf',group:47}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["chiseled_bookshelf"]}}}]},{"type":"loot_table","value":"bs.block:get/78","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:chorus_flower',item:'minecraft:chorus_flower',group:48}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["chiseled_bookshelf","chorus_flower"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/57","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:chorus_plant',item:'minecraft:chorus_plant',group:49}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["chorus_plant"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/79","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:cocoa',item:'minecraft:cocoa_beans',group:50}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cocoa"]}}}]},{"type":"loot_table","value":"bs.block:get/80","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:comparator',item:'minecraft:comparator',group:51}"}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_horn_coral_wall_fan","dead_tube_coral_wall_fan","fire_coral_wall_fan","horn_coral_wall_fan","tube_coral_wall_fan","brewing_stand","brown_mushroom_block","mushroom_stem","red_mushroom_block","bubble_column","cactus","sugar_cane","cake","calibrated_sculk_sensor","campfire","soul_campfire","carrots","melon_stem","potatoes","pumpkin_stem","wheat","cave_vines","cave_vines_plant","chain","chain_command_block","command_block","repeating_command_block","chest","trapped_chest","chiseled_bookshelf","chorus_flower","chorus_plant","cocoa","comparator"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/81","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:composter',item:'minecraft:composter',group:52}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["composter"]}}}]},{"type":"loot_table","value":"bs.block:get/82","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:copper_bulb',item:'minecraft:copper_bulb',group:53}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["composter","copper_bulb"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/82","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:exposed_copper_bulb',item:'minecraft:exposed_copper_bulb',group:53}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["exposed_copper_bulb"]}}}]},{"type":"loot_table","value":"bs.block:get/82","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:oxidized_copper_bulb',item:'minecraft:oxidized_copper_bulb',group:53}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["composter","copper_bulb","exposed_copper_bulb","oxidized_copper_bulb"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/82","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_copper_bulb',item:'minecraft:waxed_copper_bulb',group:53}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_copper_bulb"]}}}]},{"type":"loot_table","value":"bs.block:get/82","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_exposed_copper_bulb',item:'minecraft:waxed_exposed_copper_bulb',group:53}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_copper_bulb","waxed_exposed_copper_bulb"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/82","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_oxidized_copper_bulb',item:'minecraft:waxed_oxidized_copper_bulb',group:53}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["waxed_oxidized_copper_bulb"]}}}]},{"type":"loot_table","value":"bs.block:get/82","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:waxed_weathered_copper_bulb',item:'minecraft:waxed_weathered_copper_bulb',group:53}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["composter","copper_bulb","exposed_copper_bulb","oxidized_copper_bulb","waxed_copper_bulb","waxed_exposed_copper_bulb","waxed_oxidized_copper_bulb","waxed_weathered_copper_bulb"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/82","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:weathered_copper_bulb',item:'minecraft:weathered_copper_bulb',group:53}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["weathered_copper_bulb"]}}}]},{"type":"loot_table","value":"bs.block:get/85","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:crafter',item:'minecraft:crafter',group:54}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["weathered_copper_bulb","crafter"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/86","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:creaking_heart',item:'minecraft:creaking_heart',group:55}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["creaking_heart"]}}}]},{"type":"loot_table","value":"bs.block:get/87","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:creeper_head',item:'minecraft:creeper_head',group:56}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["weathered_copper_bulb","crafter","creaking_heart","creeper_head"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/87","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dragon_head',item:'minecraft:dragon_head',group:56}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dragon_head"]}}}]},{"type":"loot_table","value":"bs.block:get/87","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:piglin_head',item:'minecraft:piglin_head',group:56}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dragon_head","piglin_head"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/87","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:player_head',item:'minecraft:player_head',group:56}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["player_head"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/87","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:skeleton_skull',item:'minecraft:skeleton_skull',group:56}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["skeleton_skull"]}}}]},{"type":"loot_table","value":"bs.block:get/87","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:wither_skeleton_skull',item:'minecraft:wither_skeleton_skull',group:56}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["composter","copper_bulb","exposed_copper_bulb","oxidized_copper_bulb","waxed_copper_bulb","waxed_exposed_copper_bulb","waxed_oxidized_copper_bulb","waxed_weathered_copper_bulb","weathered_copper_bulb","crafter","creaking_heart","creeper_head","dragon_head","piglin_head","player_head","skeleton_skull","wither_skeleton_skull"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/87","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:zombie_head',item:'minecraft:zombie_head',group:56}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["zombie_head"]}}}]},{"type":"loot_table","value":"bs.block:get/2","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:creeper_wall_head',item:'minecraft:creeper_head',group:57}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["zombie_head","creeper_wall_head"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/2","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dragon_wall_head',item:'minecraft:dragon_head',group:57}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dragon_wall_head"]}}}]},{"type":"loot_table","value":"bs.block:get/2","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:piglin_wall_head',item:'minecraft:piglin_head',group:57}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["zombie_head","creeper_wall_head","dragon_wall_head","piglin_wall_head"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/2","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:player_wall_head',item:'minecraft:player_head',group:57}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["player_wall_head"]}}}]},{"type":"loot_table","value":"bs.block:get/2","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:skeleton_wall_skull',item:'minecraft:skeleton_skull',group:57}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["player_wall_head","skeleton_wall_skull"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/2","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:wither_skeleton_wall_skull',item:'minecraft:wither_skeleton_skull',group:57}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["wither_skeleton_wall_skull"]}}}]},{"type":"loot_table","value":"bs.block:get/2","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:zombie_wall_head',item:'minecraft:zombie_head',group:57}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["zombie_head","creeper_wall_head","dragon_wall_head","piglin_wall_head","player_wall_head","skeleton_wall_skull","wither_skeleton_wall_skull","zombie_wall_head"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/89","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:daylight_detector',item:'minecraft:daylight_detector',group:58}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["daylight_detector"]}}}]},{"type":"loot_table","value":"bs.block:get/90","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:decorated_pot',item:'minecraft:decorated_pot',group:59}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["daylight_detector","decorated_pot"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/91","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dispenser',item:'minecraft:dispenser',group:60}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dispenser"]}}}]},{"type":"loot_table","value":"bs.block:get/91","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:dropper',item:'minecraft:dropper',group:60}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["daylight_detector","decorated_pot","dispenser","dropper"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/92","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:end_portal_frame',item:'minecraft:end_portal_frame',group:61}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["end_portal_frame"]}}}]},{"type":"loot_table","value":"bs.block:get/93","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:farmland',item:'minecraft:farmland',group:62}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["end_portal_frame","farmland"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/94","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:fire',item:'None',group:63}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["fire"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/96","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:glow_lichen',item:'minecraft:glow_lichen',group:64}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["glow_lichen"]}}}]},{"type":"loot_table","value":"bs.block:get/96","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sculk_vein',item:'minecraft:sculk_vein',group:64}"}]}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_horn_coral_wall_fan","dead_tube_coral_wall_fan","fire_coral_wall_fan","horn_coral_wall_fan","tube_coral_wall_fan","brewing_stand","brown_mushroom_block","mushroom_stem","red_mushroom_block","bubble_column","cactus","sugar_cane","cake","calibrated_sculk_sensor","campfire","soul_campfire","carrots","melon_stem","potatoes","pumpkin_stem","wheat","cave_vines","cave_vines_plant","chain","chain_command_block","command_block","repeating_command_block","chest","trapped_chest","chiseled_bookshelf","chorus_flower","chorus_plant","cocoa","comparator","composter","copper_bulb","exposed_copper_bulb","oxidized_copper_bulb","waxed_copper_bulb","waxed_exposed_copper_bulb","waxed_oxidized_copper_bulb","waxed_weathered_copper_bulb","weathered_copper_bulb","crafter","creaking_heart","creeper_head","dragon_head","piglin_head","player_head","skeleton_skull","wither_skeleton_skull","zombie_head","creeper_wall_head","dragon_wall_head","piglin_wall_head","player_wall_head","skeleton_wall_skull","wither_skeleton_wall_skull","zombie_wall_head","daylight_detector","decorated_pot","dispenser","dropper","end_portal_frame","farmland","fire","glow_lichen","sculk_vein"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/97","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:grass_block',item:'minecraft:grass_block',group:65}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["grass_block"]}}}]},{"type":"loot_table","value":"bs.block:get/97","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mycelium',item:'minecraft:mycelium',group:65}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["grass_block","mycelium"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/97","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:podzol',item:'minecraft:podzol',group:65}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["podzol"]}}}]},{"type":"loot_table","value":"bs.block:get/98","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:grindstone',item:'minecraft:grindstone',group:66}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["grass_block","mycelium","podzol","grindstone"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/88","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:heavy_weighted_pressure_plate',item:'minecraft:heavy_weighted_pressure_plate',group:67}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["heavy_weighted_pressure_plate"]}}}]},{"type":"loot_table","value":"bs.block:get/88","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light_weighted_pressure_plate',item:'minecraft:light_weighted_pressure_plate',group:67}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["heavy_weighted_pressure_plate","light_weighted_pressure_plate"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/88","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:target',item:'minecraft:target',group:67}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["target"]}}}]},{"type":"loot_table","value":"bs.block:get/100","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:hopper',item:'minecraft:hopper',group:68}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["grass_block","mycelium","podzol","grindstone","heavy_weighted_pressure_plate","light_weighted_pressure_plate","target","hopper"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/83","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jigsaw',item:'minecraft:jigsaw',group:69}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["jigsaw"]}}}]},{"type":"loot_table","value":"bs.block:get/101","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:jukebox',item:'minecraft:jukebox',group:70}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["jigsaw","jukebox"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/66","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:kelp',item:'minecraft:kelp',group:71}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["kelp"]}}}]},{"type":"loot_table","value":"bs.block:get/66","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:twisting_vines',item:'minecraft:twisting_vines',group:71}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["jigsaw","jukebox","kelp","twisting_vines"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/66","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:weeping_vines',item:'minecraft:weeping_vines',group:71}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["weeping_vines"]}}}]},{"type":"loot_table","value":"bs.block:get/102","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lantern',item:'minecraft:lantern',group:72}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["weeping_vines","lantern"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/102","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:soul_lantern',item:'minecraft:soul_lantern',group:72}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["soul_lantern"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/103","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:large_fern',item:'minecraft:large_fern',group:73}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["large_fern"]}}}]},{"type":"loot_table","value":"bs.block:get/103","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lilac',item:'minecraft:lilac',group:73}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["grass_block","mycelium","podzol","grindstone","heavy_weighted_pressure_plate","light_weighted_pressure_plate","target","hopper","jigsaw","jukebox","kelp","twisting_vines","weeping_vines","lantern","soul_lantern","large_fern","lilac"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/103","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:peony',item:'minecraft:peony',group:73}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["peony"]}}}]},{"type":"loot_table","value":"bs.block:get/103","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pitcher_plant',item:'minecraft:pitcher_plant',group:73}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["peony","pitcher_plant"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/103","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:rose_bush',item:'minecraft:rose_bush',group:73}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["rose_bush"]}}}]},{"type":"loot_table","value":"bs.block:get/103","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sunflower',item:'minecraft:sunflower',group:73}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["peony","pitcher_plant","rose_bush","sunflower"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/103","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tall_grass',item:'minecraft:tall_grass',group:73}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["tall_grass"]}}}]},{"type":"loot_table","value":"bs.block:get/103","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tall_seagrass',item:'None',group:73}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["tall_grass","tall_seagrass"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/104","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lava',item:'minecraft:lava_bucket',group:74}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lava"]}}}]},{"type":"loot_table","value":"bs.block:get/104","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:water',item:'minecraft:water_bucket',group:74}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["peony","pitcher_plant","rose_bush","sunflower","tall_grass","tall_seagrass","lava","water"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/105","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lectern',item:'minecraft:lectern',group:75}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lectern"]}}}]},{"type":"loot_table","value":"bs.block:get/106","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:light',item:'minecraft:light',group:76}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lectern","light"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/107","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:lightning_rod',item:'minecraft:lightning_rod',group:77}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lightning_rod"]}}}]},{"type":"loot_table","value":"bs.block:get/109","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:mangrove_propagule',item:'minecraft:mangrove_propagule',group:78}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lectern","light","lightning_rod","mangrove_propagule"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/110","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:moving_piston',item:'None',group:79}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["moving_piston"]}}}]},{"type":"loot_table","value":"bs.block:get/111","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:nether_portal',item:'None',group:80}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["moving_piston","nether_portal"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/113","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:note_block',item:'minecraft:note_block',group:81}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["note_block"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/114","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:observer',item:'minecraft:observer',group:82}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["observer"]}}}]},{"type":"loot_table","value":"bs.block:get/115","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_hanging_moss',item:'minecraft:pale_hanging_moss',group:83}"}]}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["grass_block","mycelium","podzol","grindstone","heavy_weighted_pressure_plate","light_weighted_pressure_plate","target","hopper","jigsaw","jukebox","kelp","twisting_vines","weeping_vines","lantern","soul_lantern","large_fern","lilac","peony","pitcher_plant","rose_bush","sunflower","tall_grass","tall_seagrass","lava","water","lectern","light","lightning_rod","mangrove_propagule","moving_piston","nether_portal","note_block","observer","pale_hanging_moss"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/120","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pale_moss_carpet',item:'minecraft:pale_moss_carpet',group:84}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pale_moss_carpet"]}}}]},{"type":"loot_table","value":"bs.block:get/121","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pink_petals',item:'minecraft:pink_petals',group:85}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pale_moss_carpet","pink_petals"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/122","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:piston',item:'minecraft:piston',group:86}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["piston"]}}}]},{"type":"loot_table","value":"bs.block:get/122","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sticky_piston',item:'minecraft:sticky_piston',group:86}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pale_moss_carpet","pink_petals","piston","sticky_piston"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/123","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:piston_head',item:'None',group:87}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["piston_head"]}}}]},{"type":"loot_table","value":"bs.block:get/124","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pitcher_crop',item:'minecraft:pitcher_pod',group:88}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["piston_head","pitcher_crop"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/126","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:pointed_dripstone',item:'minecraft:pointed_dripstone',group:89}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pointed_dripstone"]}}}]},{"type":"loot_table","value":"bs.block:get/127","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:powder_snow_cauldron',item:'minecraft:cauldron',group:90}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pale_moss_carpet","pink_petals","piston","sticky_piston","piston_head","pitcher_crop","pointed_dripstone","powder_snow_cauldron"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/127","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:water_cauldron',item:'minecraft:cauldron',group:90}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["water_cauldron"]}}}]},{"type":"loot_table","value":"bs.block:get/128","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:rail',item:'minecraft:rail',group:91}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["water_cauldron","rail"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/47","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:redstone_torch',item:'minecraft:redstone_torch',group:92}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["redstone_torch"]}}}]},{"type":"loot_table","value":"bs.block:get/48","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:redstone_wall_torch',item:'minecraft:redstone_torch',group:93}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["water_cauldron","rail","redstone_torch","redstone_wall_torch"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/132","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:redstone_wire',item:'minecraft:redstone',group:94}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["redstone_wire"]}}}]},{"type":"loot_table","value":"bs.block:get/134","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:repeater',item:'minecraft:repeater',group:95}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["redstone_wire","repeater"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/135","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:respawn_anchor',item:'minecraft:respawn_anchor',group:96}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["respawn_anchor"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/137","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:scaffolding',item:'minecraft:scaffolding',group:97}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["scaffolding"]}}}]},{"type":"loot_table","value":"bs.block:get/138","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sculk_catalyst',item:'minecraft:sculk_catalyst',group:98}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pale_moss_carpet","pink_petals","piston","sticky_piston","piston_head","pitcher_crop","pointed_dripstone","powder_snow_cauldron","water_cauldron","rail","redstone_torch","redstone_wall_torch","redstone_wire","repeater","respawn_anchor","scaffolding","sculk_catalyst"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/140","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sculk_sensor',item:'minecraft:sculk_sensor',group:99}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sculk_sensor"]}}}]},{"type":"loot_table","value":"bs.block:get/142","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sculk_shrieker',item:'minecraft:sculk_shrieker',group:100}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sculk_sensor","sculk_shrieker"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/143","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sea_pickle',item:'minecraft:sea_pickle',group:101}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sea_pickle"]}}}]},{"type":"loot_table","value":"bs.block:get/144","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:small_dripleaf',item:'minecraft:small_dripleaf',group:102}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sculk_sensor","sculk_shrieker","sea_pickle","small_dripleaf"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/145","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:sniffer_egg',item:'minecraft:sniffer_egg',group:103}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sniffer_egg"]}}}]},{"type":"loot_table","value":"bs.block:get/146","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:snow',item:'minecraft:snow',group:104}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sniffer_egg","snow"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/147","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:structure_block',item:'minecraft:structure_block',group:105}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["structure_block"]}}}]},{"type":"loot_table","value":"bs.block:get/148","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:suspicious_gravel',item:'minecraft:suspicious_gravel',group:106}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sculk_sensor","sculk_shrieker","sea_pickle","small_dripleaf","sniffer_egg","snow","structure_block","suspicious_gravel"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/148","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:suspicious_sand',item:'minecraft:suspicious_sand',group:106}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["suspicious_sand"]}}}]},{"type":"loot_table","value":"bs.block:get/149","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tnt',item:'minecraft:tnt',group:107}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["suspicious_sand","tnt"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/150","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:torchflower_crop',item:'minecraft:torchflower_seeds',group:108}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["torchflower_crop"]}}}]},{"type":"loot_table","value":"bs.block:get/152","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:trial_spawner',item:'minecraft:trial_spawner',group:109}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["suspicious_sand","tnt","torchflower_crop","trial_spawner"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/155","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tripwire',item:'minecraft:string',group:110}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["tripwire"]}}}]},{"type":"loot_table","value":"bs.block:get/156","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:tripwire_hook',item:'minecraft:tripwire_hook',group:111}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["tripwire","tripwire_hook"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/157","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:turtle_egg',item:'minecraft:turtle_egg',group:112}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["turtle_egg"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.block:get/159","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:vault',item:'minecraft:vault',group:113}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["vault"]}}}]},{"type":"loot_table","value":"bs.block:get/56","functions":[{"function":"set_custom_data","tag":"{type:'minecraft:vine',item:'minecraft:vine',group:114}"}]}]}]}]}]}]}]}]}]}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.block/tags/block/has_state.json b/datapacks/Bookshelf/data/bs.block/tags/block/has_state.json
deleted file mode 100644
index d1d7f6c8c5..0000000000
--- a/datapacks/Bookshelf/data/bs.block/tags/block/has_state.json
+++ /dev/null
@@ -1,713 +0,0 @@
-{
- "values": [
- "minecraft:acacia_button",
- "minecraft:bamboo_button",
- "minecraft:birch_button",
- "minecraft:cherry_button",
- "minecraft:crimson_button",
- "minecraft:dark_oak_button",
- "minecraft:jungle_button",
- "minecraft:lever",
- "minecraft:mangrove_button",
- "minecraft:oak_button",
- "minecraft:pale_oak_button",
- "minecraft:polished_blackstone_button",
- "minecraft:spruce_button",
- "minecraft:stone_button",
- "minecraft:warped_button",
- "minecraft:acacia_door",
- "minecraft:bamboo_door",
- "minecraft:birch_door",
- "minecraft:cherry_door",
- "minecraft:copper_door",
- "minecraft:crimson_door",
- "minecraft:dark_oak_door",
- "minecraft:exposed_copper_door",
- "minecraft:iron_door",
- "minecraft:jungle_door",
- "minecraft:mangrove_door",
- "minecraft:oak_door",
- "minecraft:oxidized_copper_door",
- "minecraft:pale_oak_door",
- "minecraft:spruce_door",
- "minecraft:warped_door",
- "minecraft:waxed_copper_door",
- "minecraft:waxed_exposed_copper_door",
- "minecraft:waxed_oxidized_copper_door",
- "minecraft:waxed_weathered_copper_door",
- "minecraft:weathered_copper_door",
- "minecraft:acacia_fence",
- "minecraft:bamboo_fence",
- "minecraft:birch_fence",
- "minecraft:black_stained_glass_pane",
- "minecraft:blue_stained_glass_pane",
- "minecraft:brown_stained_glass_pane",
- "minecraft:cherry_fence",
- "minecraft:crimson_fence",
- "minecraft:cyan_stained_glass_pane",
- "minecraft:dark_oak_fence",
- "minecraft:glass_pane",
- "minecraft:gray_stained_glass_pane",
- "minecraft:green_stained_glass_pane",
- "minecraft:iron_bars",
- "minecraft:jungle_fence",
- "minecraft:light_blue_stained_glass_pane",
- "minecraft:light_gray_stained_glass_pane",
- "minecraft:lime_stained_glass_pane",
- "minecraft:magenta_stained_glass_pane",
- "minecraft:mangrove_fence",
- "minecraft:nether_brick_fence",
- "minecraft:oak_fence",
- "minecraft:orange_stained_glass_pane",
- "minecraft:pale_oak_fence",
- "minecraft:pink_stained_glass_pane",
- "minecraft:purple_stained_glass_pane",
- "minecraft:red_stained_glass_pane",
- "minecraft:spruce_fence",
- "minecraft:warped_fence",
- "minecraft:white_stained_glass_pane",
- "minecraft:yellow_stained_glass_pane",
- "minecraft:acacia_fence_gate",
- "minecraft:bamboo_fence_gate",
- "minecraft:birch_fence_gate",
- "minecraft:cherry_fence_gate",
- "minecraft:crimson_fence_gate",
- "minecraft:dark_oak_fence_gate",
- "minecraft:jungle_fence_gate",
- "minecraft:mangrove_fence_gate",
- "minecraft:oak_fence_gate",
- "minecraft:pale_oak_fence_gate",
- "minecraft:spruce_fence_gate",
- "minecraft:warped_fence_gate",
- "minecraft:acacia_hanging_sign",
- "minecraft:bamboo_hanging_sign",
- "minecraft:birch_hanging_sign",
- "minecraft:cherry_hanging_sign",
- "minecraft:crimson_hanging_sign",
- "minecraft:dark_oak_hanging_sign",
- "minecraft:jungle_hanging_sign",
- "minecraft:mangrove_hanging_sign",
- "minecraft:oak_hanging_sign",
- "minecraft:pale_oak_hanging_sign",
- "minecraft:spruce_hanging_sign",
- "minecraft:warped_hanging_sign",
- "minecraft:acacia_leaves",
- "minecraft:azalea_leaves",
- "minecraft:birch_leaves",
- "minecraft:cherry_leaves",
- "minecraft:dark_oak_leaves",
- "minecraft:flowering_azalea_leaves",
- "minecraft:jungle_leaves",
- "minecraft:mangrove_leaves",
- "minecraft:oak_leaves",
- "minecraft:pale_oak_leaves",
- "minecraft:spruce_leaves",
- "minecraft:acacia_log",
- "minecraft:acacia_wood",
- "minecraft:bamboo_block",
- "minecraft:basalt",
- "minecraft:birch_log",
- "minecraft:birch_wood",
- "minecraft:bone_block",
- "minecraft:cherry_log",
- "minecraft:cherry_wood",
- "minecraft:crimson_hyphae",
- "minecraft:crimson_stem",
- "minecraft:dark_oak_log",
- "minecraft:dark_oak_wood",
- "minecraft:deepslate",
- "minecraft:hay_block",
- "minecraft:infested_deepslate",
- "minecraft:jungle_log",
- "minecraft:jungle_wood",
- "minecraft:mangrove_log",
- "minecraft:mangrove_wood",
- "minecraft:muddy_mangrove_roots",
- "minecraft:oak_log",
- "minecraft:oak_wood",
- "minecraft:ochre_froglight",
- "minecraft:pale_oak_log",
- "minecraft:pale_oak_wood",
- "minecraft:pearlescent_froglight",
- "minecraft:polished_basalt",
- "minecraft:purpur_pillar",
- "minecraft:quartz_pillar",
- "minecraft:spruce_log",
- "minecraft:spruce_wood",
- "minecraft:stripped_acacia_log",
- "minecraft:stripped_acacia_wood",
- "minecraft:stripped_bamboo_block",
- "minecraft:stripped_birch_log",
- "minecraft:stripped_birch_wood",
- "minecraft:stripped_cherry_log",
- "minecraft:stripped_cherry_wood",
- "minecraft:stripped_crimson_hyphae",
- "minecraft:stripped_crimson_stem",
- "minecraft:stripped_dark_oak_log",
- "minecraft:stripped_dark_oak_wood",
- "minecraft:stripped_jungle_log",
- "minecraft:stripped_jungle_wood",
- "minecraft:stripped_mangrove_log",
- "minecraft:stripped_mangrove_wood",
- "minecraft:stripped_oak_log",
- "minecraft:stripped_oak_wood",
- "minecraft:stripped_pale_oak_log",
- "minecraft:stripped_pale_oak_wood",
- "minecraft:stripped_spruce_log",
- "minecraft:stripped_spruce_wood",
- "minecraft:stripped_warped_hyphae",
- "minecraft:stripped_warped_stem",
- "minecraft:verdant_froglight",
- "minecraft:warped_hyphae",
- "minecraft:warped_stem",
- "minecraft:acacia_pressure_plate",
- "minecraft:bamboo_pressure_plate",
- "minecraft:birch_pressure_plate",
- "minecraft:cherry_pressure_plate",
- "minecraft:crimson_pressure_plate",
- "minecraft:dark_oak_pressure_plate",
- "minecraft:jungle_pressure_plate",
- "minecraft:mangrove_pressure_plate",
- "minecraft:oak_pressure_plate",
- "minecraft:pale_oak_pressure_plate",
- "minecraft:polished_blackstone_pressure_plate",
- "minecraft:spruce_pressure_plate",
- "minecraft:stone_pressure_plate",
- "minecraft:warped_pressure_plate",
- "minecraft:acacia_sapling",
- "minecraft:birch_sapling",
- "minecraft:cherry_sapling",
- "minecraft:dark_oak_sapling",
- "minecraft:jungle_sapling",
- "minecraft:oak_sapling",
- "minecraft:pale_oak_sapling",
- "minecraft:spruce_sapling",
- "minecraft:acacia_sign",
- "minecraft:bamboo_sign",
- "minecraft:birch_sign",
- "minecraft:cherry_sign",
- "minecraft:crimson_sign",
- "minecraft:dark_oak_sign",
- "minecraft:jungle_sign",
- "minecraft:mangrove_sign",
- "minecraft:oak_sign",
- "minecraft:pale_oak_sign",
- "minecraft:spruce_sign",
- "minecraft:warped_sign",
- "minecraft:acacia_slab",
- "minecraft:andesite_slab",
- "minecraft:bamboo_mosaic_slab",
- "minecraft:bamboo_slab",
- "minecraft:birch_slab",
- "minecraft:blackstone_slab",
- "minecraft:brick_slab",
- "minecraft:cherry_slab",
- "minecraft:cobbled_deepslate_slab",
- "minecraft:cobblestone_slab",
- "minecraft:crimson_slab",
- "minecraft:cut_copper_slab",
- "minecraft:cut_red_sandstone_slab",
- "minecraft:cut_sandstone_slab",
- "minecraft:dark_oak_slab",
- "minecraft:dark_prismarine_slab",
- "minecraft:deepslate_brick_slab",
- "minecraft:deepslate_tile_slab",
- "minecraft:diorite_slab",
- "minecraft:end_stone_brick_slab",
- "minecraft:exposed_cut_copper_slab",
- "minecraft:granite_slab",
- "minecraft:jungle_slab",
- "minecraft:mangrove_slab",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:mud_brick_slab",
- "minecraft:nether_brick_slab",
- "minecraft:oak_slab",
- "minecraft:oxidized_cut_copper_slab",
- "minecraft:pale_oak_slab",
- "minecraft:petrified_oak_slab",
- "minecraft:polished_andesite_slab",
- "minecraft:polished_blackstone_brick_slab",
- "minecraft:polished_blackstone_slab",
- "minecraft:polished_deepslate_slab",
- "minecraft:polished_diorite_slab",
- "minecraft:polished_granite_slab",
- "minecraft:polished_tuff_slab",
- "minecraft:prismarine_brick_slab",
- "minecraft:prismarine_slab",
- "minecraft:purpur_slab",
- "minecraft:quartz_slab",
- "minecraft:red_nether_brick_slab",
- "minecraft:red_sandstone_slab",
- "minecraft:sandstone_slab",
- "minecraft:smooth_quartz_slab",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_stone_slab",
- "minecraft:spruce_slab",
- "minecraft:stone_brick_slab",
- "minecraft:stone_slab",
- "minecraft:tuff_brick_slab",
- "minecraft:tuff_slab",
- "minecraft:warped_slab",
- "minecraft:waxed_cut_copper_slab",
- "minecraft:waxed_exposed_cut_copper_slab",
- "minecraft:waxed_oxidized_cut_copper_slab",
- "minecraft:waxed_weathered_cut_copper_slab",
- "minecraft:weathered_cut_copper_slab",
- "minecraft:acacia_stairs",
- "minecraft:andesite_stairs",
- "minecraft:bamboo_mosaic_stairs",
- "minecraft:bamboo_stairs",
- "minecraft:birch_stairs",
- "minecraft:blackstone_stairs",
- "minecraft:brick_stairs",
- "minecraft:cherry_stairs",
- "minecraft:cobbled_deepslate_stairs",
- "minecraft:cobblestone_stairs",
- "minecraft:crimson_stairs",
- "minecraft:cut_copper_stairs",
- "minecraft:dark_oak_stairs",
- "minecraft:dark_prismarine_stairs",
- "minecraft:deepslate_brick_stairs",
- "minecraft:deepslate_tile_stairs",
- "minecraft:diorite_stairs",
- "minecraft:end_stone_brick_stairs",
- "minecraft:exposed_cut_copper_stairs",
- "minecraft:granite_stairs",
- "minecraft:jungle_stairs",
- "minecraft:mangrove_stairs",
- "minecraft:mossy_cobblestone_stairs",
- "minecraft:mossy_stone_brick_stairs",
- "minecraft:mud_brick_stairs",
- "minecraft:nether_brick_stairs",
- "minecraft:oak_stairs",
- "minecraft:oxidized_cut_copper_stairs",
- "minecraft:pale_oak_stairs",
- "minecraft:polished_andesite_stairs",
- "minecraft:polished_blackstone_brick_stairs",
- "minecraft:polished_blackstone_stairs",
- "minecraft:polished_deepslate_stairs",
- "minecraft:polished_diorite_stairs",
- "minecraft:polished_granite_stairs",
- "minecraft:polished_tuff_stairs",
- "minecraft:prismarine_brick_stairs",
- "minecraft:prismarine_stairs",
- "minecraft:purpur_stairs",
- "minecraft:quartz_stairs",
- "minecraft:red_nether_brick_stairs",
- "minecraft:red_sandstone_stairs",
- "minecraft:sandstone_stairs",
- "minecraft:smooth_quartz_stairs",
- "minecraft:smooth_red_sandstone_stairs",
- "minecraft:smooth_sandstone_stairs",
- "minecraft:spruce_stairs",
- "minecraft:stone_brick_stairs",
- "minecraft:stone_stairs",
- "minecraft:tuff_brick_stairs",
- "minecraft:tuff_stairs",
- "minecraft:warped_stairs",
- "minecraft:waxed_cut_copper_stairs",
- "minecraft:waxed_exposed_cut_copper_stairs",
- "minecraft:waxed_oxidized_cut_copper_stairs",
- "minecraft:waxed_weathered_cut_copper_stairs",
- "minecraft:weathered_cut_copper_stairs",
- "minecraft:acacia_trapdoor",
- "minecraft:bamboo_trapdoor",
- "minecraft:birch_trapdoor",
- "minecraft:cherry_trapdoor",
- "minecraft:copper_trapdoor",
- "minecraft:crimson_trapdoor",
- "minecraft:dark_oak_trapdoor",
- "minecraft:exposed_copper_trapdoor",
- "minecraft:iron_trapdoor",
- "minecraft:jungle_trapdoor",
- "minecraft:mangrove_trapdoor",
- "minecraft:oak_trapdoor",
- "minecraft:oxidized_copper_trapdoor",
- "minecraft:pale_oak_trapdoor",
- "minecraft:spruce_trapdoor",
- "minecraft:warped_trapdoor",
- "minecraft:waxed_copper_trapdoor",
- "minecraft:waxed_exposed_copper_trapdoor",
- "minecraft:waxed_oxidized_copper_trapdoor",
- "minecraft:waxed_weathered_copper_trapdoor",
- "minecraft:weathered_copper_trapdoor",
- "minecraft:acacia_wall_hanging_sign",
- "minecraft:acacia_wall_sign",
- "minecraft:bamboo_wall_hanging_sign",
- "minecraft:bamboo_wall_sign",
- "minecraft:big_dripleaf_stem",
- "minecraft:birch_wall_hanging_sign",
- "minecraft:birch_wall_sign",
- "minecraft:cherry_wall_hanging_sign",
- "minecraft:cherry_wall_sign",
- "minecraft:crimson_wall_hanging_sign",
- "minecraft:crimson_wall_sign",
- "minecraft:dark_oak_wall_hanging_sign",
- "minecraft:dark_oak_wall_sign",
- "minecraft:ender_chest",
- "minecraft:jungle_wall_hanging_sign",
- "minecraft:jungle_wall_sign",
- "minecraft:ladder",
- "minecraft:mangrove_wall_hanging_sign",
- "minecraft:mangrove_wall_sign",
- "minecraft:oak_wall_hanging_sign",
- "minecraft:oak_wall_sign",
- "minecraft:pale_oak_wall_hanging_sign",
- "minecraft:pale_oak_wall_sign",
- "minecraft:spruce_wall_hanging_sign",
- "minecraft:spruce_wall_sign",
- "minecraft:warped_wall_hanging_sign",
- "minecraft:warped_wall_sign",
- "minecraft:activator_rail",
- "minecraft:detector_rail",
- "minecraft:powered_rail",
- "minecraft:amethyst_cluster",
- "minecraft:large_amethyst_bud",
- "minecraft:medium_amethyst_bud",
- "minecraft:small_amethyst_bud",
- "minecraft:andesite_wall",
- "minecraft:blackstone_wall",
- "minecraft:brick_wall",
- "minecraft:cobbled_deepslate_wall",
- "minecraft:cobblestone_wall",
- "minecraft:deepslate_brick_wall",
- "minecraft:deepslate_tile_wall",
- "minecraft:diorite_wall",
- "minecraft:end_stone_brick_wall",
- "minecraft:granite_wall",
- "minecraft:mossy_cobblestone_wall",
- "minecraft:mossy_stone_brick_wall",
- "minecraft:mud_brick_wall",
- "minecraft:nether_brick_wall",
- "minecraft:polished_blackstone_brick_wall",
- "minecraft:polished_blackstone_wall",
- "minecraft:polished_deepslate_wall",
- "minecraft:polished_tuff_wall",
- "minecraft:prismarine_wall",
- "minecraft:red_nether_brick_wall",
- "minecraft:red_sandstone_wall",
- "minecraft:sandstone_wall",
- "minecraft:stone_brick_wall",
- "minecraft:tuff_brick_wall",
- "minecraft:tuff_wall",
- "minecraft:anvil",
- "minecraft:attached_melon_stem",
- "minecraft:attached_pumpkin_stem",
- "minecraft:black_glazed_terracotta",
- "minecraft:black_wall_banner",
- "minecraft:blue_glazed_terracotta",
- "minecraft:blue_wall_banner",
- "minecraft:brown_glazed_terracotta",
- "minecraft:brown_wall_banner",
- "minecraft:carved_pumpkin",
- "minecraft:chipped_anvil",
- "minecraft:cyan_glazed_terracotta",
- "minecraft:cyan_wall_banner",
- "minecraft:damaged_anvil",
- "minecraft:gray_glazed_terracotta",
- "minecraft:gray_wall_banner",
- "minecraft:green_glazed_terracotta",
- "minecraft:green_wall_banner",
- "minecraft:jack_o_lantern",
- "minecraft:light_blue_glazed_terracotta",
- "minecraft:light_blue_wall_banner",
- "minecraft:light_gray_glazed_terracotta",
- "minecraft:light_gray_wall_banner",
- "minecraft:lime_glazed_terracotta",
- "minecraft:lime_wall_banner",
- "minecraft:loom",
- "minecraft:magenta_glazed_terracotta",
- "minecraft:magenta_wall_banner",
- "minecraft:orange_glazed_terracotta",
- "minecraft:orange_wall_banner",
- "minecraft:pink_glazed_terracotta",
- "minecraft:pink_wall_banner",
- "minecraft:purple_glazed_terracotta",
- "minecraft:purple_wall_banner",
- "minecraft:red_glazed_terracotta",
- "minecraft:red_wall_banner",
- "minecraft:soul_wall_torch",
- "minecraft:stonecutter",
- "minecraft:wall_torch",
- "minecraft:white_glazed_terracotta",
- "minecraft:white_wall_banner",
- "minecraft:yellow_glazed_terracotta",
- "minecraft:yellow_wall_banner",
- "minecraft:bamboo",
- "minecraft:barrel",
- "minecraft:barrier",
- "minecraft:copper_grate",
- "minecraft:exposed_copper_grate",
- "minecraft:hanging_roots",
- "minecraft:heavy_core",
- "minecraft:mangrove_roots",
- "minecraft:oxidized_copper_grate",
- "minecraft:waxed_copper_grate",
- "minecraft:waxed_exposed_copper_grate",
- "minecraft:waxed_oxidized_copper_grate",
- "minecraft:waxed_weathered_copper_grate",
- "minecraft:weathered_copper_grate",
- "minecraft:bee_nest",
- "minecraft:beehive",
- "minecraft:beetroots",
- "minecraft:frosted_ice",
- "minecraft:nether_wart",
- "minecraft:sweet_berry_bush",
- "minecraft:bell",
- "minecraft:big_dripleaf",
- "minecraft:black_banner",
- "minecraft:blue_banner",
- "minecraft:brown_banner",
- "minecraft:cyan_banner",
- "minecraft:gray_banner",
- "minecraft:green_banner",
- "minecraft:light_blue_banner",
- "minecraft:light_gray_banner",
- "minecraft:lime_banner",
- "minecraft:magenta_banner",
- "minecraft:orange_banner",
- "minecraft:pink_banner",
- "minecraft:purple_banner",
- "minecraft:red_banner",
- "minecraft:white_banner",
- "minecraft:yellow_banner",
- "minecraft:black_bed",
- "minecraft:blue_bed",
- "minecraft:brown_bed",
- "minecraft:cyan_bed",
- "minecraft:gray_bed",
- "minecraft:green_bed",
- "minecraft:light_blue_bed",
- "minecraft:light_gray_bed",
- "minecraft:lime_bed",
- "minecraft:magenta_bed",
- "minecraft:orange_bed",
- "minecraft:pink_bed",
- "minecraft:purple_bed",
- "minecraft:red_bed",
- "minecraft:white_bed",
- "minecraft:yellow_bed",
- "minecraft:black_candle",
- "minecraft:blue_candle",
- "minecraft:brown_candle",
- "minecraft:candle",
- "minecraft:cyan_candle",
- "minecraft:gray_candle",
- "minecraft:green_candle",
- "minecraft:light_blue_candle",
- "minecraft:light_gray_candle",
- "minecraft:lime_candle",
- "minecraft:magenta_candle",
- "minecraft:orange_candle",
- "minecraft:pink_candle",
- "minecraft:purple_candle",
- "minecraft:red_candle",
- "minecraft:white_candle",
- "minecraft:yellow_candle",
- "minecraft:black_candle_cake",
- "minecraft:blue_candle_cake",
- "minecraft:brown_candle_cake",
- "minecraft:candle_cake",
- "minecraft:cyan_candle_cake",
- "minecraft:deepslate_redstone_ore",
- "minecraft:gray_candle_cake",
- "minecraft:green_candle_cake",
- "minecraft:light_blue_candle_cake",
- "minecraft:light_gray_candle_cake",
- "minecraft:lime_candle_cake",
- "minecraft:magenta_candle_cake",
- "minecraft:orange_candle_cake",
- "minecraft:pink_candle_cake",
- "minecraft:purple_candle_cake",
- "minecraft:red_candle_cake",
- "minecraft:redstone_lamp",
- "minecraft:redstone_ore",
- "minecraft:white_candle_cake",
- "minecraft:yellow_candle_cake",
- "minecraft:black_shulker_box",
- "minecraft:blue_shulker_box",
- "minecraft:brown_shulker_box",
- "minecraft:cyan_shulker_box",
- "minecraft:end_rod",
- "minecraft:gray_shulker_box",
- "minecraft:green_shulker_box",
- "minecraft:light_blue_shulker_box",
- "minecraft:light_gray_shulker_box",
- "minecraft:lime_shulker_box",
- "minecraft:magenta_shulker_box",
- "minecraft:orange_shulker_box",
- "minecraft:pink_shulker_box",
- "minecraft:purple_shulker_box",
- "minecraft:red_shulker_box",
- "minecraft:shulker_box",
- "minecraft:white_shulker_box",
- "minecraft:yellow_shulker_box",
- "minecraft:blast_furnace",
- "minecraft:furnace",
- "minecraft:smoker",
- "minecraft:brain_coral",
- "minecraft:brain_coral_fan",
- "minecraft:bubble_coral",
- "minecraft:bubble_coral_fan",
- "minecraft:conduit",
- "minecraft:dead_brain_coral",
- "minecraft:dead_brain_coral_fan",
- "minecraft:dead_bubble_coral",
- "minecraft:dead_bubble_coral_fan",
- "minecraft:dead_fire_coral",
- "minecraft:dead_fire_coral_fan",
- "minecraft:dead_horn_coral",
- "minecraft:dead_horn_coral_fan",
- "minecraft:dead_tube_coral",
- "minecraft:dead_tube_coral_fan",
- "minecraft:fire_coral",
- "minecraft:fire_coral_fan",
- "minecraft:horn_coral",
- "minecraft:horn_coral_fan",
- "minecraft:tube_coral",
- "minecraft:tube_coral_fan",
- "minecraft:brain_coral_wall_fan",
- "minecraft:bubble_coral_wall_fan",
- "minecraft:dead_brain_coral_wall_fan",
- "minecraft:dead_bubble_coral_wall_fan",
- "minecraft:dead_fire_coral_wall_fan",
- "minecraft:dead_horn_coral_wall_fan",
- "minecraft:dead_tube_coral_wall_fan",
- "minecraft:fire_coral_wall_fan",
- "minecraft:horn_coral_wall_fan",
- "minecraft:tube_coral_wall_fan",
- "minecraft:brewing_stand",
- "minecraft:brown_mushroom_block",
- "minecraft:mushroom_stem",
- "minecraft:red_mushroom_block",
- "minecraft:bubble_column",
- "minecraft:cactus",
- "minecraft:sugar_cane",
- "minecraft:cake",
- "minecraft:calibrated_sculk_sensor",
- "minecraft:campfire",
- "minecraft:soul_campfire",
- "minecraft:carrots",
- "minecraft:melon_stem",
- "minecraft:potatoes",
- "minecraft:pumpkin_stem",
- "minecraft:wheat",
- "minecraft:cave_vines",
- "minecraft:cave_vines_plant",
- "minecraft:chain",
- "minecraft:chain_command_block",
- "minecraft:command_block",
- "minecraft:repeating_command_block",
- "minecraft:chest",
- "minecraft:trapped_chest",
- "minecraft:chiseled_bookshelf",
- "minecraft:chorus_flower",
- "minecraft:chorus_plant",
- "minecraft:cocoa",
- "minecraft:comparator",
- "minecraft:composter",
- "minecraft:copper_bulb",
- "minecraft:exposed_copper_bulb",
- "minecraft:oxidized_copper_bulb",
- "minecraft:waxed_copper_bulb",
- "minecraft:waxed_exposed_copper_bulb",
- "minecraft:waxed_oxidized_copper_bulb",
- "minecraft:waxed_weathered_copper_bulb",
- "minecraft:weathered_copper_bulb",
- "minecraft:crafter",
- "minecraft:creaking_heart",
- "minecraft:creeper_head",
- "minecraft:dragon_head",
- "minecraft:piglin_head",
- "minecraft:player_head",
- "minecraft:skeleton_skull",
- "minecraft:wither_skeleton_skull",
- "minecraft:zombie_head",
- "minecraft:creeper_wall_head",
- "minecraft:dragon_wall_head",
- "minecraft:piglin_wall_head",
- "minecraft:player_wall_head",
- "minecraft:skeleton_wall_skull",
- "minecraft:wither_skeleton_wall_skull",
- "minecraft:zombie_wall_head",
- "minecraft:daylight_detector",
- "minecraft:decorated_pot",
- "minecraft:dispenser",
- "minecraft:dropper",
- "minecraft:end_portal_frame",
- "minecraft:farmland",
- "minecraft:fire",
- "minecraft:glow_lichen",
- "minecraft:sculk_vein",
- "minecraft:grass_block",
- "minecraft:mycelium",
- "minecraft:podzol",
- "minecraft:grindstone",
- "minecraft:heavy_weighted_pressure_plate",
- "minecraft:light_weighted_pressure_plate",
- "minecraft:target",
- "minecraft:hopper",
- "minecraft:jigsaw",
- "minecraft:jukebox",
- "minecraft:kelp",
- "minecraft:twisting_vines",
- "minecraft:weeping_vines",
- "minecraft:lantern",
- "minecraft:soul_lantern",
- "minecraft:large_fern",
- "minecraft:lilac",
- "minecraft:peony",
- "minecraft:pitcher_plant",
- "minecraft:rose_bush",
- "minecraft:sunflower",
- "minecraft:tall_grass",
- "minecraft:tall_seagrass",
- "minecraft:lava",
- "minecraft:water",
- "minecraft:lectern",
- "minecraft:light",
- "minecraft:lightning_rod",
- "minecraft:mangrove_propagule",
- "minecraft:moving_piston",
- "minecraft:nether_portal",
- "minecraft:note_block",
- "minecraft:observer",
- "minecraft:pale_hanging_moss",
- "minecraft:pale_moss_carpet",
- "minecraft:pink_petals",
- "minecraft:piston",
- "minecraft:sticky_piston",
- "minecraft:piston_head",
- "minecraft:pitcher_crop",
- "minecraft:pointed_dripstone",
- "minecraft:powder_snow_cauldron",
- "minecraft:water_cauldron",
- "minecraft:rail",
- "minecraft:redstone_torch",
- "minecraft:redstone_wall_torch",
- "minecraft:redstone_wire",
- "minecraft:repeater",
- "minecraft:respawn_anchor",
- "minecraft:scaffolding",
- "minecraft:sculk_catalyst",
- "minecraft:sculk_sensor",
- "minecraft:sculk_shrieker",
- "minecraft:sea_pickle",
- "minecraft:small_dripleaf",
- "minecraft:sniffer_egg",
- "minecraft:snow",
- "minecraft:structure_block",
- "minecraft:suspicious_gravel",
- "minecraft:suspicious_sand",
- "minecraft:tnt",
- "minecraft:torchflower_crop",
- "minecraft:trial_spawner",
- "minecraft:tripwire",
- "minecraft:tripwire_hook",
- "minecraft:turtle_egg",
- "minecraft:vault",
- "minecraft:vine"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.block/tags/function/exclusive_load.json
deleted file mode 100644
index df97cc21d3..0000000000
--- a/datapacks/Bookshelf/data/bs.block/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.block:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/get_block.json b/datapacks/Bookshelf/data/bs.block/tags/function/get_block.json
deleted file mode 100644
index 8baa6d8ab0..0000000000
--- a/datapacks/Bookshelf/data/bs.block/tags/function/get_block.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#get",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "minecraft_version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.block:get/get_block",
- "bs.block:get/compile/block"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/help.json b/datapacks/Bookshelf/data/bs.block/tags/function/help.json
deleted file mode 100644
index 897bc79a8e..0000000000
--- a/datapacks/Bookshelf/data/bs.block/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.block:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/load.json b/datapacks/Bookshelf/data/bs.block/tags/function/load.json
deleted file mode 100644
index 1664ea8ba1..0000000000
--- a/datapacks/Bookshelf/data/bs.block/tags/function/load.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.block:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/unload.json b/datapacks/Bookshelf/data/bs.block/tags/function/unload.json
deleted file mode 100644
index fe995ddb3c..0000000000
--- a/datapacks/Bookshelf/data/bs.block/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.block:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.block/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.block/test/__boot__.mcfunction
deleted file mode 100644
index 3f1dbf5f73..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.block
-# @beforebatch function #bs.block:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.block/test/fill/async.mcfunction b/datapacks/Bookshelf/data/bs.block/test/fill/async.mcfunction
deleted file mode 100644
index 88586742fe..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/fill/async.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Fill a region with a specific block one by one
-# @batch bs.block
-
-data modify storage bs:in block.fill_block set value {block:"minecraft:stone",from:"~ ~ ~",to:"~1 ~ ~",limit:1}
-function #bs.block:fill_block
-
-assert block ~ ~ ~ minecraft:stone
-assert not block ~1 ~ ~ minecraft:stone
-await delay 1t
-assert block ~1 ~ ~ minecraft:stone
diff --git a/datapacks/Bookshelf/data/bs.block/test/fill/block.mcfunction b/datapacks/Bookshelf/data/bs.block/test/fill/block.mcfunction
deleted file mode 100644
index 03792a1692..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/fill/block.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Fill a region with a specific block (using absolute coordinates)
-# @batch bs.block
-
-data modify storage bs:in block.fill_block set value {block:"minecraft:stone"}
-execute summon minecraft:marker run data modify storage bs:in block.fill_block.from set from entity @s Pos
-execute positioned ~1 ~ ~ summon minecraft:marker run data modify storage bs:in block.fill_block.to set from entity @s Pos
-function #bs.block:fill_block
-
-assert block ~ ~ ~ minecraft:stone
-assert block ~1 ~ ~ minecraft:stone
diff --git a/datapacks/Bookshelf/data/bs.block/test/fill/masks.mcfunction b/datapacks/Bookshelf/data/bs.block/test/fill/masks.mcfunction
deleted file mode 100644
index 84ddd2a61a..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/fill/masks.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Fill a region with a specific block
-# @batch bs.block
-
-fill ~ ~ ~ ~ ~1 ~ dirt
-data modify storage bs:in block.fill_block set value {block:"minecraft:grass_block",from:"~ ~ ~",to:"~ ~1 ~",masks:[{block:"minecraft:dirt"},{block:"minecraft:air",y:1}]}
-function #bs.block:fill_block
-
-assert block ~ ~ ~ minecraft:dirt
-assert block ~ ~1 ~ minecraft:grass_block
diff --git a/datapacks/Bookshelf/data/bs.block/test/fill/type.mcfunction b/datapacks/Bookshelf/data/bs.block/test/fill/type.mcfunction
deleted file mode 100644
index ffcaa58550..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/fill/type.mcfunction
+++ /dev/null
@@ -1,11 +0,0 @@
-# Fill a region with a specific block while trying to conserve states and NBTs
-# @batch bs.block
-
-setblock ~ ~ ~ minecraft:oak_stairs[facing=west]
-setblock ~1 ~ ~ minecraft:oak_stairs[facing=south]
-
-data modify storage bs:in block.fill_type set value {type:"minecraft:spruce_stairs",from:"~ ~ ~",to:"~1 ~ ~"}
-function #bs.block:fill_type
-
-assert block ~ ~ ~ minecraft:spruce_stairs[facing=west]
-assert block ~1 ~ ~ minecraft:spruce_stairs[facing=south]
diff --git a/datapacks/Bookshelf/data/bs.block/test/get/block.mcfunction b/datapacks/Bookshelf/data/bs.block/test/get/block.mcfunction
deleted file mode 100644
index fb63f71bfc..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/get/block.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# Get block data from location
-# @batch bs.block
-
-setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
-function #bs.block:get_block
-
-assert data storage bs:out block{ block: "minecraft:stone_stairs[shape=straight,half=top,facing=west,waterlogged=false,]", type: "minecraft:stone_stairs", state: "[shape=straight,half=top,facing=west,waterlogged=false,]", properties: { facing: "west", half: "top", shape: "straight", waterlogged: "false" } }
-
-setblock ~ ~ ~ minecraft:campfire
-function #bs.block:get_block
-
-assert data storage bs:out block.block
diff --git a/datapacks/Bookshelf/data/bs.block/test/get/type.mcfunction b/datapacks/Bookshelf/data/bs.block/test/get/type.mcfunction
deleted file mode 100644
index 3ecad3af2a..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/get/type.mcfunction
+++ /dev/null
@@ -1,7 +0,0 @@
-# Get block type from location
-# @batch bs.block
-
-setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
-function #bs.block:get_type
-
-assert data storage bs:out block{ block: "minecraft:stone_stairs", type: "minecraft:stone_stairs", state: "", properties: {} }
diff --git a/datapacks/Bookshelf/data/bs.block/test/lookup/item.mcfunction b/datapacks/Bookshelf/data/bs.block/test/lookup/item.mcfunction
deleted file mode 100644
index 5e72f3e7a4..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/lookup/item.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Lookup block by item
-# @batch bs.block
-
-function #bs.block:lookup_item {item:"minecraft:stone"}
-assert data storage bs:out block{block:"minecraft:stone",type:"minecraft:stone"}
-
-function #bs.block:lookup_item {item:"minecraft:carrot"}
-assert data storage bs:out block{block:"minecraft:carrots",type:"minecraft:carrots"}
diff --git a/datapacks/Bookshelf/data/bs.block/test/lookup/type.mcfunction b/datapacks/Bookshelf/data/bs.block/test/lookup/type.mcfunction
deleted file mode 100644
index 5c30d89508..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/lookup/type.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Lookup block by type
-# @batch bs.block
-
-function #bs.block:lookup_type {type:"minecraft:stone"}
-assert data storage bs:out block{block:"minecraft:stone"}
-
-function #bs.block:lookup_type {type:"minecraft:carrots"}
-assert data storage bs:out block{block:"minecraft:carrots",item:"minecraft:carrot"}
diff --git a/datapacks/Bookshelf/data/bs.block/test/match.mcfunction b/datapacks/Bookshelf/data/bs.block/test/match.mcfunction
deleted file mode 100644
index 1c3ed1b9ee..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/match.mcfunction
+++ /dev/null
@@ -1,6 +0,0 @@
-# Check that a block matches an other one
-# @batch bs.block
-
-setblock ~ ~ ~ minecraft:bookshelf
-data modify storage bs:in block.match.block set value "minecraft:bookshelf"
-execute unless function #bs.block:match run fail "Fail to match the given block"
diff --git a/datapacks/Bookshelf/data/bs.block/test/produce/block_display.mcfunction b/datapacks/Bookshelf/data/bs.block/test/produce/block_display.mcfunction
deleted file mode 100644
index d26d569673..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/produce/block_display.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Spawn block display
-# @batch bs.block
-
-data modify storage bs:in block.spawn_block_display.type set value "minecraft:bookshelf"
-data modify storage bs:in block.spawn_block_display.extra_nbt set value {Tags:["bs.packtest"]}
-function #bs.block:spawn_block_display
-
-assert entity @e[type=minecraft:block_display,tag=bs.packtest] inside
diff --git a/datapacks/Bookshelf/data/bs.block/test/produce/emit_block_particle.mcfunction b/datapacks/Bookshelf/data/bs.block/test/produce/emit_block_particle.mcfunction
deleted file mode 100644
index 0a1bb6b01f..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/produce/emit_block_particle.mcfunction
+++ /dev/null
@@ -1,7 +0,0 @@
-# Emit block particle
-# @batch bs.block
-
-data modify storage bs:in block.emit_block_particle.type set value "minecraft:bookshelf"
-data modify storage bs:in block.emit_block_particle merge value { delta: "0 0 0", speed: 5, count: 30, properties: {}}
-
-function #bs.block:emit_block_particle
diff --git a/datapacks/Bookshelf/data/bs.block/test/produce/falling_block.mcfunction b/datapacks/Bookshelf/data/bs.block/test/produce/falling_block.mcfunction
deleted file mode 100644
index 3b24bc76a1..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/produce/falling_block.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Spawn falling block
-# @batch bs.block
-
-data modify storage bs:in block.spawn_falling_block.type set value "minecraft:bookshelf"
-data modify storage bs:in block.spawn_falling_block.extra_nbt set value {Tags:["bs.packtest"]}
-function #bs.block:spawn_falling_block
-
-assert entity @e[type=minecraft:falling_block,tag=bs.packtest] inside
diff --git a/datapacks/Bookshelf/data/bs.block/test/produce/solid_block_display.mcfunction b/datapacks/Bookshelf/data/bs.block/test/produce/solid_block_display.mcfunction
deleted file mode 100644
index 1faf80bb66..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/produce/solid_block_display.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Spawn block display with a hitbox
-# @batch bs.block
-
-data modify storage bs:in block.spawn_solid_block_display.type set value "minecraft:bookshelf"
-data modify storage bs:in block.spawn_solid_block_display.extra_nbt set value {Tags:["bs.packtest"]}
-function #bs.block:spawn_solid_block_display
-execute as @e[type=minecraft:block_display,tag=bs.packtest] on passengers at @s positioned ~ ~ ~.4 run tag @s[dx=0] add bs.packtest.hitbox
-
-assert entity @e[type=minecraft:block_display,tag=bs.packtest] inside
-assert entity @e[type=!minecraft:block_display,tag=bs.packtest.hitbox] inside
diff --git a/datapacks/Bookshelf/data/bs.block/test/set/block.mcfunction b/datapacks/Bookshelf/data/bs.block/test/set/block.mcfunction
deleted file mode 100644
index 4d3a6afb7c..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/set/block.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Set block at location
-# @batch bs.block
-
-setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
-data modify storage bs:in block.set_block set value {block:"minecraft:oak_stairs"}
-function #bs.block:set_block
-
-assert block ~ ~ ~ minecraft:oak_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]
diff --git a/datapacks/Bookshelf/data/bs.block/test/set/type.mcfunction b/datapacks/Bookshelf/data/bs.block/test/set/type.mcfunction
deleted file mode 100644
index dc69891c3b..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/set/type.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Set type at location
-# @batch bs.block
-
-setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
-data modify storage bs:in block.set_type set value {type:"minecraft:oak_stairs"}
-function #bs.block:set_type
-
-assert block ~ ~ ~ minecraft:oak_stairs[facing=west,half=top,shape=straight,waterlogged=false]
diff --git a/datapacks/Bookshelf/data/bs.block/test/transform/keep_properties.mcfunction b/datapacks/Bookshelf/data/bs.block/test/transform/keep_properties.mcfunction
deleted file mode 100644
index e34454dda2..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/transform/keep_properties.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Only keep given properties
-# @batch bs.block
-
-setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
-function #bs.block:get_block
-function #bs.block:keep_properties {properties:[{name:"facing"},{name:"shape"}]}
-
-assert data storage bs:out block{ block: "minecraft:stone_stairs[shape=straight,facing=west,]", type: "minecraft:stone_stairs", state: "[shape=straight,facing=west,]", properties: { facing: "west", shape: "straight" } }
diff --git a/datapacks/Bookshelf/data/bs.block/test/transform/map_type.mcfunction b/datapacks/Bookshelf/data/bs.block/test/transform/map_type.mcfunction
deleted file mode 100644
index d50c0eb269..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/transform/map_type.mcfunction
+++ /dev/null
@@ -1,11 +0,0 @@
-# Replace the block type from the type_set while trying to conserve the state
-# @batch bs.block
-
-setblock ~ ~ ~ minecraft:spruce_stairs[facing=west,half=top,shape=straight,waterlogged=false]
-function #bs.block:get_block
-
-function #bs.block:map_type {type:"minecraft:oak_planks",mapping_registry:"bs.shapes"}
-assert data storage bs:out block{ block: "minecraft:oak_stairs[shape=straight,half=top,facing=west,waterlogged=false,]" }
-
-function #bs.block:map_type {type:"minecraft:spruce_planks",mapping_registry:"bs.shapes"}
-assert data storage bs:out block{ block: "minecraft:spruce_stairs[shape=straight,half=top,facing=west,waterlogged=false,]" }
diff --git a/datapacks/Bookshelf/data/bs.block/test/transform/merge_properties.mcfunction b/datapacks/Bookshelf/data/bs.block/test/transform/merge_properties.mcfunction
deleted file mode 100644
index 3b81521961..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/transform/merge_properties.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Merge state properties from the current location
-# @batch bs.block
-
-setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
-function #bs.block:get_block
-setblock ~ ~ ~ minecraft:furnace[facing=north]
-function #bs.block:merge_properties {properties:[{name:"facing"}]}
-
-assert data storage bs:out block{ block: "minecraft:stone_stairs[shape=straight,half=top,facing=north,waterlogged=false,]", type: "minecraft:stone_stairs", state: "[shape=straight,half=top,facing=north,waterlogged=false,]", properties: { facing: "north", half: "top", shape: "straight", waterlogged: "false" } }
diff --git a/datapacks/Bookshelf/data/bs.block/test/transform/mix_type.mcfunction b/datapacks/Bookshelf/data/bs.block/test/transform/mix_type.mcfunction
deleted file mode 100644
index 224a762d95..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/transform/mix_type.mcfunction
+++ /dev/null
@@ -1,14 +0,0 @@
-# Replace the block type using the mapping registry (mix mode)
-# @batch bs.block
-
-setblock ~ ~ ~ minecraft:mossy_stone_bricks
-function #bs.block:get_block
-
-function #bs.block:mix_type {type:"minecraft:cobblestone",mapping_registry:"bs.shapes"}
-assert data storage bs:out block{ block: "minecraft:mossy_cobblestone" }
-
-setblock ~ ~ ~ minecraft:mossy_cobblestone
-function #bs.block:get_block
-
-function #bs.block:mix_type {type:"minecraft:stone_bricks",mapping_registry:"bs.shapes"}
-assert data storage bs:out block{ block: "minecraft:mossy_stone_bricks" }
diff --git a/datapacks/Bookshelf/data/bs.block/test/transform/remove_properties.mcfunction b/datapacks/Bookshelf/data/bs.block/test/transform/remove_properties.mcfunction
deleted file mode 100644
index 3829c2dc42..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/transform/remove_properties.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Remove given properties
-# @batch bs.block
-
-setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
-function #bs.block:get_block
-function #bs.block:remove_properties {properties:[{name:"facing"},{name:"shape"}]}
-
-assert data storage bs:out block{ block: "minecraft:stone_stairs[half=top,waterlogged=false,]", type: "minecraft:stone_stairs", state: "[half=top,waterlogged=false,]", properties: { half: "top", waterlogged: "false" } }
diff --git a/datapacks/Bookshelf/data/bs.block/test/transform/replace_properties.mcfunction b/datapacks/Bookshelf/data/bs.block/test/transform/replace_properties.mcfunction
deleted file mode 100644
index 08647486c4..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/transform/replace_properties.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Replace property values
-# @batch bs.block
-
-setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
-function #bs.block:get_block
-function #bs.block:replace_properties {properties:[{name:"facing",value:"north"}]}
-
-assert data storage bs:out block{ block: "minecraft:stone_stairs[shape=straight,half=top,facing=north,waterlogged=false,]", type: "minecraft:stone_stairs", state: "[shape=straight,half=top,facing=north,waterlogged=false,]", properties: { facing: "north", half: "top", shape: "straight", waterlogged: "false" } }
diff --git a/datapacks/Bookshelf/data/bs.block/test/transform/replace_type.mcfunction b/datapacks/Bookshelf/data/bs.block/test/transform/replace_type.mcfunction
deleted file mode 100644
index ece2d40c99..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/transform/replace_type.mcfunction
+++ /dev/null
@@ -1,11 +0,0 @@
-# Replace the block type while trying to conserve the state
-# @batch bs.block
-
-setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
-function #bs.block:get_block
-
-function #bs.block:replace_type {type:"minecraft:spruce_stairs"}
-assert data storage bs:out block{ block: "minecraft:spruce_stairs[shape=straight,half=top,facing=west,waterlogged=false,]", type: "minecraft:spruce_stairs", state: "[shape=straight,half=top,facing=west,waterlogged=false,]", properties: { facing: "west", half: "top", shape: "straight", waterlogged: "false" } }
-
-function #bs.block:replace_type {type:"minecraft:stone"}
-assert data storage bs:out block{ block: "minecraft:stone", type: "minecraft:stone", state: "", properties: {} }
diff --git a/datapacks/Bookshelf/data/bs.block/test/transform/shift_properties.mcfunction b/datapacks/Bookshelf/data/bs.block/test/transform/shift_properties.mcfunction
deleted file mode 100644
index 0df32dd8c5..0000000000
--- a/datapacks/Bookshelf/data/bs.block/test/transform/shift_properties.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Replace property values
-# @batch bs.block
-
-setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
-function #bs.block:get_block
-function #bs.block:shift_properties {properties:[{name:"facing",by:2}]}
-
-assert data storage bs:out block{ block: "minecraft:stone_stairs[shape=straight,half=top,facing=north,waterlogged=false,]", type: "minecraft:stone_stairs", state: "[shape=straight,half=top,facing=north,waterlogged=false,]", properties: { facing: "north", half: "top", shape: "straight", waterlogged: "false" } }
diff --git a/datapacks/Bookshelf/data/bs.color/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.color/.metadata/generated/features.json
deleted file mode 100644
index b41af43495..0000000000
--- a/datapacks/Bookshelf/data/bs.color/.metadata/generated/features.json
+++ /dev/null
@@ -1,98 +0,0 @@
-[
- {
- "name": "hex_to_int",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html#get-biome",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/04/22",
- "version": "1.20.5"
- },
- "updated": {
- "date": "2024/04/22",
- "version": "1.20.5"
- }
- },
- {
- "name": "hex_to_rgb",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-rgb",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/20",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/20",
- "version": "1.20.4"
- }
- },
- {
- "name": "int_to_hex",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-hex",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/20",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/20",
- "version": "1.20.4"
- }
- },
- {
- "name": "int_to_rgb",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-rgb",
- "authors": [
- "theogiraudet"
- ],
- "contributors": [
- "Aksiome"
- ],
- "created": {
- "date": "2019/08/12",
- "version": "1.14"
- },
- "updated": {
- "date": "2023/10/22",
- "version": "1.20.2"
- }
- },
- {
- "name": "rgb_to_hex",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-hex",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/20",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/20",
- "version": "1.20.4"
- }
- },
- {
- "name": "rgb_to_int",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-int",
- "authors": [
- "theogiraudet"
- ],
- "contributors": [
- "Aksiome"
- ],
- "created": {
- "date": "2019/08/12",
- "version": "1.14"
- },
- "updated": {
- "date": "2023/10/22",
- "version": "1.20.2"
- }
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.color/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.color/.metadata/generated/module.json
deleted file mode 100644
index 95fbf7ffa5..0000000000
--- a/datapacks/Bookshelf/data/bs.color/.metadata/generated/module.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "name": "bs.color",
- "display_name": "Color",
- "description": "Facilitate color conversion between various formats.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "contributors": [
- "Aksiome"
- ],
- "features": [
- "bs.color:hex_to_int",
- "bs.color:hex_to_rgb",
- "bs.color:int_to_hex",
- "bs.color:int_to_rgb",
- "bs.color:rgb_to_hex",
- "bs.color:rgb_to_int"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.color/.metadata/module.json b/datapacks/Bookshelf/data/bs.color/.metadata/module.json
deleted file mode 100644
index d2f6ca24e8..0000000000
--- a/datapacks/Bookshelf/data/bs.color/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.color",
- "display_name": "Color",
- "description": "Facilitate color conversion between various formats.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html"
-}
diff --git a/datapacks/Bookshelf/data/bs.color/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.color/function/__help__.mcfunction
deleted file mode 100644
index c08639a368..0000000000
--- a/datapacks/Bookshelf/data/bs.color/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/color.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.color documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.color/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.color/function/__load__.mcfunction
deleted file mode 100644
index 3460f3a934..0000000000
--- a/datapacks/Bookshelf/data/bs.color/function/__load__.mcfunction
+++ /dev/null
@@ -1,29 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/color.html
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
-
-scoreboard players set 256 bs.const 256
-scoreboard players set 65536 bs.const 65536
-
-data modify storage bs:const color.hex_chars set value ["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f","50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f","60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f","70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f","80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f","90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df","e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff"]
-data modify storage bs:const color.hex_values set value {00:0,01:1,02:2,03:3,04:4,05:5,06:6,07:7,08:8,09:9,0a:10,0b:11,0c:12,0d:13,0e:14,0f:15,0A:10,0B:11,0C:12,0D:13,0E:14,0F:15,10:16,11:17,12:18,13:19,14:20,15:21,16:22,17:23,18:24,19:25,1a:26,1b:27,1c:28,1d:29,1e:30,1f:31,1A:26,1B:27,1C:28,1D:29,1E:30,1F:31,20:32,21:33,22:34,23:35,24:36,25:37,26:38,27:39,28:40,29:41,2a:42,2b:43,2c:44,2d:45,2e:46,2f:47,2A:42,2B:43,2C:44,2D:45,2E:46,2F:47,30:48,31:49,32:50,33:51,34:52,35:53,36:54,37:55,38:56,39:57,3a:58,3b:59,3c:60,3d:61,3e:62,3f:63,3A:58,3B:59,3C:60,3D:61,3E:62,3F:63,40:64,41:65,42:66,43:67,44:68,45:69,46:70,47:71,48:72,49:73,4a:74,4b:75,4c:76,4d:77,4e:78,4f:79,4A:74,4B:75,4C:76,4D:77,4E:78,4F:79,50:80,51:81,52:82,53:83,54:84,55:85,56:86,57:87,58:88,59:89,5a:90,5b:91,5c:92,5d:93,5e:94,5f:95,5A:90,5B:91,5C:92,5D:93,5E:94,5F:95,60:96,61:97,62:98,63:99,64:100,65:101,66:102,67:103,68:104,69:105,6a:106,6b:107,6c:108,6d:109,6e:110,6f:111,6A:106,6B:107,6C:108,6D:109,6E:110,6F:111,70:112,71:113,72:114,73:115,74:116,75:117,76:118,77:119,78:120,79:121,7a:122,7b:123,7c:124,7d:125,7e:126,7f:127,7A:122,7B:123,7C:124,7D:125,7E:126,7F:127,80:128,81:129,82:130,83:131,84:132,85:133,86:134,87:135,88:136,89:137,8a:138,8b:139,8c:140,8d:141,8e:142,8f:143,8A:138,8B:139,8C:140,8D:141,8E:142,8F:143,90:144,91:145,92:146,93:147,94:148,95:149,96:150,97:151,98:152,99:153,9a:154,9b:155,9c:156,9d:157,9e:158,9f:159,9A:154,9B:155,9C:156,9D:157,9E:158,9F:159,a0:160,a1:161,a2:162,a3:163,a4:164,a5:165,a6:166,a7:167,a8:168,a9:169,aa:170,ab:171,ac:172,ad:173,ae:174,af:175,b0:176,b1:177,b2:178,b3:179,b4:180,b5:181,b6:182,b7:183,b8:184,b9:185,ba:186,bb:187,bc:188,bd:189,be:190,bf:191,c0:192,c1:193,c2:194,c3:195,c4:196,c5:197,c6:198,c7:199,c8:200,c9:201,ca:202,cb:203,cc:204,cd:205,ce:206,cf:207,d0:208,d1:209,d2:210,d3:211,d4:212,d5:213,d6:214,d7:215,d8:216,d9:217,da:218,db:219,dc:220,dd:221,de:222,df:223,e0:224,e1:225,e2:226,e3:227,e4:228,e5:229,e6:230,e7:231,e8:232,e9:233,ea:234,eb:235,ec:236,ed:237,ee:238,ef:239,f0:240,f1:241,f2:242,f3:243,f4:244,f5:245,f6:246,f7:247,f8:248,f9:249,fa:250,fb:251,fc:252,fd:253,fe:254,ff:255,A1:161,A2:162,A3:163,A4:164,A5:165,A6:166,A7:167,A8:168,A9:169,AA:170,AB:171,AC:172,AD:173,AE:174,AF:175,B0:176,B1:177,B2:178,B3:179,B4:180,B5:181,B6:182,B7:183,B8:184,B9:185,BA:186,BB:187,BC:188,BD:189,BE:190,BF:191,C0:192,C1:193,C2:194,C3:195,C4:196,C5:197,C6:198,C7:199,C8:200,C9:201,CA:202,CB:203,CC:204,CD:205,CE:206,CF:207,D0:208,D1:209,D2:210,D3:211,D4:212,D5:213,D6:214,D7:215,D8:216,D9:217,DA:218,DB:219,DC:220,DD:221,DE:222,DF:223,E0:224,E1:225,E2:226,E3:227,E4:228,E5:229,E6:230,E7:231,E8:232,E9:233,EA:234,EB:235,EC:236,ED:237,EE:238,EF:239,F0:240,F1:241,F2:242,F3:243,F4:244,F5:245,F6:246,F7:247,F8:248,F9:249,FA:250,FB:251,FC:252,FD:253,FE:254,FF:255}
-
-execute unless data storage bs:out color.int_to_rgb run data modify storage bs:out color.int_to_rgb set value [0,0,0]
-execute unless data storage bs:out color.hex_to_rgb run data modify storage bs:out color.hex_to_rgb set value [0,0,0]
diff --git a/datapacks/Bookshelf/data/bs.color/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.color/function/__unload__.mcfunction
deleted file mode 100644
index e2d04c3315..0000000000
--- a/datapacks/Bookshelf/data/bs.color/function/__unload__.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/color.html
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard objectives remove bs.const
-scoreboard objectives remove bs.ctx
-scoreboard objectives remove bs.out
-
-data remove storage bs:const color
-data remove storage bs:out color
diff --git a/datapacks/Bookshelf/data/bs.color/function/hex_to_int/convert_hexes.mcfunction b/datapacks/Bookshelf/data/bs.color/function/hex_to_int/convert_hexes.mcfunction
deleted file mode 100644
index a725371c4f..0000000000
--- a/datapacks/Bookshelf/data/bs.color/function/hex_to_int/convert_hexes.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result score $color.hex_to_int bs.out run data get storage bs:const color.hex_values.$(z)
-$execute store result score #r bs.ctx run data get storage bs:const color.hex_values.$(y)
-scoreboard players operation #r bs.ctx *= 256 bs.const
-scoreboard players operation $color.hex_to_int bs.out += #r bs.ctx
-$execute store result score #r bs.ctx run data get storage bs:const color.hex_values.$(x)
-scoreboard players operation #r bs.ctx *= 65536 bs.const
-execute store result storage bs:out color.hex_to_int int 1 run return run scoreboard players operation $color.hex_to_int bs.out += #r bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.color/function/hex_to_int/hex_to_int.mcfunction b/datapacks/Bookshelf/data/bs.color/function/hex_to_int/hex_to_int.mcfunction
deleted file mode 100644
index 80ee8d120b..0000000000
--- a/datapacks/Bookshelf/data/bs.color/function/hex_to_int/hex_to_int.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-int
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:ctx _ set value '$(color)'
-data modify storage bs:ctx x set string storage bs:ctx _ 1 3
-data modify storage bs:ctx y set string storage bs:ctx _ 3 5
-data modify storage bs:ctx z set string storage bs:ctx _ 5 7
-
-return run function bs.color:hex_to_int/convert_hexes with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.color/function/hex_to_rgb/convert_hexes.mcfunction b/datapacks/Bookshelf/data/bs.color/function/hex_to_rgb/convert_hexes.mcfunction
deleted file mode 100644
index e943ce5600..0000000000
--- a/datapacks/Bookshelf/data/bs.color/function/hex_to_rgb/convert_hexes.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:out color.hex_to_rgb[0] int 1 store result score $color.hex_to_rgb.r bs.out run data get storage bs:const color.hex_values.$(x)
-$execute store result storage bs:out color.hex_to_rgb[1] int 1 store result score $color.hex_to_rgb.g bs.out run data get storage bs:const color.hex_values.$(y)
-$execute store result storage bs:out color.hex_to_rgb[2] int 1 store result score $color.hex_to_rgb.b bs.out run data get storage bs:const color.hex_values.$(z)
diff --git a/datapacks/Bookshelf/data/bs.color/function/hex_to_rgb/hex_to_rgb.mcfunction b/datapacks/Bookshelf/data/bs.color/function/hex_to_rgb/hex_to_rgb.mcfunction
deleted file mode 100644
index b528c118d3..0000000000
--- a/datapacks/Bookshelf/data/bs.color/function/hex_to_rgb/hex_to_rgb.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-rgb
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:ctx _ set value '$(color)'
-data modify storage bs:ctx x set string storage bs:ctx _ 1 3
-data modify storage bs:ctx y set string storage bs:ctx _ 3 5
-data modify storage bs:ctx z set string storage bs:ctx _ 5 7
-
-return run function bs.color:hex_to_rgb/convert_hexes with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.color/function/int_to_hex/concat_hexes.mcfunction b/datapacks/Bookshelf/data/bs.color/function/int_to_hex/concat_hexes.mcfunction
deleted file mode 100644
index 558a5e1259..0000000000
--- a/datapacks/Bookshelf/data/bs.color/function/int_to_hex/concat_hexes.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:out color.int_to_hex set value "#$(r)$(g)$(b)"
diff --git a/datapacks/Bookshelf/data/bs.color/function/int_to_hex/get_hexes.mcfunction b/datapacks/Bookshelf/data/bs.color/function/int_to_hex/get_hexes.mcfunction
deleted file mode 100644
index b1aeee2dc9..0000000000
--- a/datapacks/Bookshelf/data/bs.color/function/int_to_hex/get_hexes.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx _ set value {r:"",g:"",b:""}
-$data modify storage bs:ctx _.r set from storage bs:const color.hex_chars[$(x)]
-$data modify storage bs:ctx _.g set from storage bs:const color.hex_chars[$(y)]
-$data modify storage bs:ctx _.b set from storage bs:const color.hex_chars[$(z)]
diff --git a/datapacks/Bookshelf/data/bs.color/function/int_to_hex/int_to_hex.mcfunction b/datapacks/Bookshelf/data/bs.color/function/int_to_hex/int_to_hex.mcfunction
deleted file mode 100644
index ea446a50c0..0000000000
--- a/datapacks/Bookshelf/data/bs.color/function/int_to_hex/int_to_hex.mcfunction
+++ /dev/null
@@ -1,31 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-hex
-# ------------------------------------------------------------------------------------------------------------
-
-$scoreboard players set #c bs.ctx $(color)
-
-scoreboard players operation #r bs.ctx = #c bs.ctx
-scoreboard players operation #r bs.ctx /= 65536 bs.const
-scoreboard players operation #g bs.ctx = #c bs.ctx
-scoreboard players operation #g bs.ctx /= 256 bs.const
-scoreboard players operation #b bs.ctx = #c bs.ctx
-
-execute store result storage bs:ctx x int 1 run scoreboard players operation #r bs.ctx %= 256 bs.const
-execute store result storage bs:ctx y int 1 run scoreboard players operation #g bs.ctx %= 256 bs.const
-execute store result storage bs:ctx z int 1 run scoreboard players operation #b bs.ctx %= 256 bs.const
-
-function bs.color:int_to_hex/get_hexes with storage bs:ctx
-function bs.color:int_to_hex/concat_hexes with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.color/function/int_to_rgb.mcfunction b/datapacks/Bookshelf/data/bs.color/function/int_to_rgb.mcfunction
deleted file mode 100644
index bbc3431e8a..0000000000
--- a/datapacks/Bookshelf/data/bs.color/function/int_to_rgb.mcfunction
+++ /dev/null
@@ -1,28 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-rgb
-# ------------------------------------------------------------------------------------------------------------
-
-$scoreboard players set #c bs.ctx $(color)
-
-scoreboard players operation $color.int_to_rgb.r bs.out = #c bs.ctx
-scoreboard players operation $color.int_to_rgb.r bs.out /= 65536 bs.const
-scoreboard players operation $color.int_to_rgb.g bs.out = #c bs.ctx
-scoreboard players operation $color.int_to_rgb.g bs.out /= 256 bs.const
-scoreboard players operation $color.int_to_rgb.b bs.out = #c bs.ctx
-
-execute store result storage bs:out color.int_to_rgb[0] int 1 run scoreboard players operation $color.int_to_rgb.r bs.out %= 256 bs.const
-execute store result storage bs:out color.int_to_rgb[1] int 1 run scoreboard players operation $color.int_to_rgb.g bs.out %= 256 bs.const
-execute store result storage bs:out color.int_to_rgb[2] int 1 run scoreboard players operation $color.int_to_rgb.b bs.out %= 256 bs.const
diff --git a/datapacks/Bookshelf/data/bs.color/function/rgb_to_hex/concat_hexes.mcfunction b/datapacks/Bookshelf/data/bs.color/function/rgb_to_hex/concat_hexes.mcfunction
deleted file mode 100644
index 28b0713e19..0000000000
--- a/datapacks/Bookshelf/data/bs.color/function/rgb_to_hex/concat_hexes.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:out color.rgb_to_hex set value "#$(r)$(g)$(b)"
diff --git a/datapacks/Bookshelf/data/bs.color/function/rgb_to_hex/get_hexes.mcfunction b/datapacks/Bookshelf/data/bs.color/function/rgb_to_hex/get_hexes.mcfunction
deleted file mode 100644
index 17672d0814..0000000000
--- a/datapacks/Bookshelf/data/bs.color/function/rgb_to_hex/get_hexes.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:ctx _.r set from storage bs:const color.hex_chars[$(x)]
-$data modify storage bs:ctx _.g set from storage bs:const color.hex_chars[$(y)]
-$data modify storage bs:ctx _.b set from storage bs:const color.hex_chars[$(z)]
diff --git a/datapacks/Bookshelf/data/bs.color/function/rgb_to_hex/rgb_to_hex.mcfunction b/datapacks/Bookshelf/data/bs.color/function/rgb_to_hex/rgb_to_hex.mcfunction
deleted file mode 100644
index aa2260b35e..0000000000
--- a/datapacks/Bookshelf/data/bs.color/function/rgb_to_hex/rgb_to_hex.mcfunction
+++ /dev/null
@@ -1,25 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-hex
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:ctx _ set value {rgb:$(color)}
-
-data modify storage bs:ctx x set from storage bs:ctx _.rgb[0]
-data modify storage bs:ctx y set from storage bs:ctx _.rgb[1]
-data modify storage bs:ctx z set from storage bs:ctx _.rgb[2]
-
-function bs.color:rgb_to_hex/get_hexes with storage bs:ctx
-function bs.color:rgb_to_hex/concat_hexes with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.color/function/rgb_to_int.mcfunction b/datapacks/Bookshelf/data/bs.color/function/rgb_to_int.mcfunction
deleted file mode 100644
index 72c237b2cf..0000000000
--- a/datapacks/Bookshelf/data/bs.color/function/rgb_to_int.mcfunction
+++ /dev/null
@@ -1,29 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-int
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:ctx _ set value $(color)
-
-execute store result score #r bs.ctx run data get storage bs:ctx _[0]
-execute store result score #g bs.ctx run data get storage bs:ctx _[1]
-execute store result score #b bs.ctx run data get storage bs:ctx _[2]
-
-scoreboard players operation $color.rgb_to_int bs.out = #r bs.ctx
-scoreboard players operation $color.rgb_to_int bs.out *= 65536 bs.const
-scoreboard players operation #c bs.ctx = #g bs.ctx
-scoreboard players operation #c bs.ctx *= 256 bs.const
-scoreboard players operation $color.rgb_to_int bs.out += #c bs.ctx
-return run execute store result storage bs:out color.rgb_to_int int 1 run scoreboard players operation $color.rgb_to_int bs.out += #b bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.color/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.color/tags/function/exclusive_load.json
deleted file mode 100644
index 509787c2e3..0000000000
--- a/datapacks/Bookshelf/data/bs.color/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.color:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.color/tags/function/help.json b/datapacks/Bookshelf/data/bs.color/tags/function/help.json
deleted file mode 100644
index 03342a7705..0000000000
--- a/datapacks/Bookshelf/data/bs.color/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.color:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.color/tags/function/load.json b/datapacks/Bookshelf/data/bs.color/tags/function/load.json
deleted file mode 100644
index 6a81b04d35..0000000000
--- a/datapacks/Bookshelf/data/bs.color/tags/function/load.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.color:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.color/tags/function/unload.json b/datapacks/Bookshelf/data/bs.color/tags/function/unload.json
deleted file mode 100644
index b77564f388..0000000000
--- a/datapacks/Bookshelf/data/bs.color/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.color:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.color/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.color/test/__boot__.mcfunction
deleted file mode 100644
index b7a9ebd4a1..0000000000
--- a/datapacks/Bookshelf/data/bs.color/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.color
-# @beforebatch function #bs.color:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.color/test/hex_to_int.mcfunction b/datapacks/Bookshelf/data/bs.color/test/hex_to_int.mcfunction
deleted file mode 100644
index ccafd18085..0000000000
--- a/datapacks/Bookshelf/data/bs.color/test/hex_to_int.mcfunction
+++ /dev/null
@@ -1,13 +0,0 @@
-# Color is converted the right way
-# @batch bs.color
-
-execute store result score #r bs.ctx run function #bs.color:hex_to_int {color:"#F26A3B"}
-assert data storage bs:out color{hex_to_int:15886907}
-assert score $color.hex_to_int bs.out matches 15886907
-assert score #r bs.ctx matches 15886907
-
-execute store result score #r bs.ctx run function #bs.color:hex_to_int {color:"#2AC855"}
-assert score #r bs.ctx matches 2803797
-
-execute store result score #r bs.ctx run function #bs.color:hex_to_int {color:"#5919C0"}
-assert score #r bs.ctx matches 5839296
diff --git a/datapacks/Bookshelf/data/bs.color/test/hex_to_rgb.mcfunction b/datapacks/Bookshelf/data/bs.color/test/hex_to_rgb.mcfunction
deleted file mode 100644
index 03f2170d22..0000000000
--- a/datapacks/Bookshelf/data/bs.color/test/hex_to_rgb.mcfunction
+++ /dev/null
@@ -1,14 +0,0 @@
-# Color is converted the right way
-# @batch bs.color
-
-function #bs.color:hex_to_rgb {color:"#F26A3B"}
-assert score $color.hex_to_rgb.r bs.out matches 242
-assert score $color.hex_to_rgb.g bs.out matches 106
-assert score $color.hex_to_rgb.b bs.out matches 59
-assert data storage bs:out color{hex_to_rgb:[242,106,59]}
-
-function #bs.color:hex_to_rgb {color:"#2AC855"}
-assert data storage bs:out color{hex_to_rgb:[42,200,85]}
-
-function #bs.color:hex_to_rgb {color:"#5919C0"}
-assert data storage bs:out color{hex_to_rgb:[89,25,192]}
diff --git a/datapacks/Bookshelf/data/bs.color/test/int_to_hex.mcfunction b/datapacks/Bookshelf/data/bs.color/test/int_to_hex.mcfunction
deleted file mode 100644
index 01b2e1a403..0000000000
--- a/datapacks/Bookshelf/data/bs.color/test/int_to_hex.mcfunction
+++ /dev/null
@@ -1,11 +0,0 @@
-# Color is converted the right way
-# @batch bs.color
-
-function #bs.color:int_to_hex {color:15886907}
-assert data storage bs:out color{int_to_hex:"#f26a3b"}
-
-function #bs.color:int_to_hex {color:2803797}
-assert data storage bs:out color{int_to_hex:"#2ac855"}
-
-function #bs.color:int_to_hex {color:5839296}
-assert data storage bs:out color{int_to_hex:"#5919c0"}
diff --git a/datapacks/Bookshelf/data/bs.color/test/int_to_rgb.mcfunction b/datapacks/Bookshelf/data/bs.color/test/int_to_rgb.mcfunction
deleted file mode 100644
index ab54bacc38..0000000000
--- a/datapacks/Bookshelf/data/bs.color/test/int_to_rgb.mcfunction
+++ /dev/null
@@ -1,14 +0,0 @@
-# Color is converted the right way
-# @batch bs.color
-
-function #bs.color:int_to_rgb {color:15886907}
-assert score $color.int_to_rgb.r bs.out matches 242
-assert score $color.int_to_rgb.g bs.out matches 106
-assert score $color.int_to_rgb.b bs.out matches 59
-assert data storage bs:out color{int_to_rgb:[242,106,59]}
-
-function #bs.color:int_to_rgb {color:2803797}
-assert data storage bs:out color{int_to_rgb:[42,200,85]}
-
-function #bs.color:int_to_rgb {color:5839296}
-assert data storage bs:out color{int_to_rgb:[89,25,192]}
diff --git a/datapacks/Bookshelf/data/bs.color/test/rgb_to_hex.mcfunction b/datapacks/Bookshelf/data/bs.color/test/rgb_to_hex.mcfunction
deleted file mode 100644
index ab6c068bc3..0000000000
--- a/datapacks/Bookshelf/data/bs.color/test/rgb_to_hex.mcfunction
+++ /dev/null
@@ -1,11 +0,0 @@
-# Color is converted the right way
-# @batch bs.color
-
-function #bs.color:rgb_to_hex {color:[242,106,59]}
-assert data storage bs:out color{rgb_to_hex:"#f26a3b"}
-
-function #bs.color:rgb_to_hex {color:[42,200,85]}
-assert data storage bs:out color{rgb_to_hex:"#2ac855"}
-
-function #bs.color:rgb_to_hex {color:[89,25,192]}
-assert data storage bs:out color{rgb_to_hex:"#5919c0"}
diff --git a/datapacks/Bookshelf/data/bs.color/test/rgb_to_int.mcfunction b/datapacks/Bookshelf/data/bs.color/test/rgb_to_int.mcfunction
deleted file mode 100644
index b1d8c402ea..0000000000
--- a/datapacks/Bookshelf/data/bs.color/test/rgb_to_int.mcfunction
+++ /dev/null
@@ -1,13 +0,0 @@
-# Color is converted the right way
-# @batch bs.color
-
-execute store result score #r bs.ctx run function #bs.color:rgb_to_int {color:[242,106,59]}
-assert data storage bs:out color{rgb_to_int:15886907}
-assert score $color.rgb_to_int bs.out matches 15886907
-assert score #r bs.ctx matches 15886907
-
-execute store result score #r bs.ctx run function #bs.color:rgb_to_int {color:[42,200,85]}
-assert score #r bs.ctx matches 2803797
-
-execute store result score #r bs.ctx run function #bs.color:rgb_to_int {color:[89,25,192]}
-assert score #r bs.ctx matches 5839296
diff --git a/datapacks/Bookshelf/data/bs.generate/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.generate/.metadata/generated/features.json
deleted file mode 100644
index 6efe39018b..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/.metadata/generated/features.json
+++ /dev/null
@@ -1,47 +0,0 @@
-[
- {
- "name": "fractal_shape_2d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/09",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/09",
- "version": "1.21"
- }
- },
- {
- "name": "shape_2d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/09",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/09",
- "version": "1.21"
- }
- },
- {
- "name": "simplex_shape_2d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/09",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/09",
- "version": "1.21"
- }
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.generate/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.generate/.metadata/generated/module.json
deleted file mode 100644
index d4ffd90e73..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/.metadata/generated/module.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "name": "bs.generate",
- "display_name": "Generate",
- "description": "Generate diverse terrains and landscapes, incorporating natural features.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html",
- "authors": [
- "Aksiome"
- ],
- "dependencies": [
- "bs.random"
- ],
- "features": [
- "bs.generate:fractal_shape_2d",
- "bs.generate:shape_2d",
- "bs.generate:simplex_shape_2d"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.generate/.metadata/module.json b/datapacks/Bookshelf/data/bs.generate/.metadata/module.json
deleted file mode 100644
index 0d5a2b41dd..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/.metadata/module.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "bs.generate",
- "display_name": "Generate",
- "description": "Generate diverse terrains and landscapes, incorporating natural features.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html",
- "dependencies": [
- "bs.random"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.generate/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/__help__.mcfunction
deleted file mode 100644
index b801cd346c..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.generate documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.generate/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/__load__.mcfunction
deleted file mode 100644
index 5ff7841635..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/__load__.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html
-# ------------------------------------------------------------------------------------------------------------
-
-forceload add -30000000 1600
-setblock -30000000 0 1606 minecraft:decorated_pot
-execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
-
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
diff --git a/datapacks/Bookshelf/data/bs.generate/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/__unload__.mcfunction
deleted file mode 100644
index 26425dc37d..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/__unload__.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html
-# ------------------------------------------------------------------------------------------------------------
-
-kill B5-0-0-0-1
-forceload remove -30000000 1600
-
-data remove storage bs:data generate
diff --git a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/demo/heightmap/heightmap.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/shape_2d/demo/heightmap/heightmap.mcfunction
deleted file mode 100644
index 23a91fff04..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/demo/heightmap/heightmap.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result storage bs:ctx y int .01 run scoreboard players add $random.fractal_noise_2d bs.out 1000
-function bs.generate:shape_2d/demo/heightmap/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/demo/heightmap/run.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/shape_2d/demo/heightmap/run.mcfunction
deleted file mode 100644
index 0aaf22d935..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/demo/heightmap/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$fill ~ ~ ~ ~ ~$(y) ~ stone
diff --git a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/demo/texture.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/shape_2d/demo/texture.mcfunction
deleted file mode 100644
index 16b5c8492b..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/demo/texture.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute if score $random.fractal_noise_2d bs.out matches -1000..-778 run setblock ~ ~ ~ cherry_planks
-execute if score $random.fractal_noise_2d bs.out matches -777..-556 run setblock ~ ~ ~ bamboo_planks
-execute if score $random.fractal_noise_2d bs.out matches -555..-334 run setblock ~ ~ ~ birch_planks
-execute if score $random.fractal_noise_2d bs.out matches -333..-112 run setblock ~ ~ ~ oak_planks
-execute if score $random.fractal_noise_2d bs.out matches -111..110 run setblock ~ ~ ~ jungle_planks
-execute if score $random.fractal_noise_2d bs.out matches 111..332 run setblock ~ ~ ~ acacia_planks
-execute if score $random.fractal_noise_2d bs.out matches 333..554 run setblock ~ ~ ~ mangrove_planks
-execute if score $random.fractal_noise_2d bs.out matches 555..776 run setblock ~ ~ ~ spruce_planks
-execute if score $random.fractal_noise_2d bs.out matches 777..1000 run setblock ~ ~ ~ dark_oak_planks
diff --git a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/process/pause.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/shape_2d/process/pause.mcfunction
deleted file mode 100644
index 6ef4b2d020..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/process/pause.mcfunction
+++ /dev/null
@@ -1,25 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d
-# ------------------------------------------------------------------------------------------------------------
-
-execute summon minecraft:marker run function bs.generate:utils/get_location
-execute unless data storage bs:data generate._.dim run function bs.generate:utils/get_dimension
-
-execute store result storage bs:data generate._.x int 1 run scoreboard players get $generate.x bs.data
-execute store result storage bs:data generate._.y int 1 run scoreboard players get $generate.y bs.data
-
-data modify storage bs:data generate.shape_2d prepend from storage bs:data generate._
-schedule function bs.generate:shape_2d/process/scheduled 1t replace
diff --git a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/process/resume.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/shape_2d/process/resume.mcfunction
deleted file mode 100644
index d660703b05..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/process/resume.mcfunction
+++ /dev/null
@@ -1,30 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data generate._ set from storage bs:data generate.shape_2d[-1]
-data remove storage bs:data generate._._
-
-$function bs.generate:shape_2d/strategy/$(impl)/setup
-data modify entity @s Pos set from storage bs:data generate._.pos
-data modify entity @s Rotation set from storage bs:data generate._.rot
-$execute in $(dim) positioned as @s rotated as @s run function bs.generate:shape_2d/recurse/next with storage bs:data generate._
-
-data remove storage bs:data generate.shape_2d[-1]
-execute if data storage bs:data generate.shape_2d[-1]._ \
- run return run function bs.generate:shape_2d/process/resume with storage bs:data generate.shape_2d[-1]
-
-execute in minecraft:overworld run tp @s -30000000 0 1600
diff --git a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/process/scheduled.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/shape_2d/process/scheduled.mcfunction
deleted file mode 100644
index 63a1ab7f7c..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/process/scheduled.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data generate.shape_2d[]._ set value 1b
-execute as B5-0-0-0-1 run function bs.generate:shape_2d/process/resume with storage bs:data generate.shape_2d[-1]
diff --git a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/recurse/init.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/shape_2d/recurse/init.mcfunction
deleted file mode 100644
index 77ada04ec3..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/recurse/init.mcfunction
+++ /dev/null
@@ -1,26 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d
-# ------------------------------------------------------------------------------------------------------------
-
-execute if data storage bs:data generate._{direction:"xz"} run data modify storage bs:data generate._.oz set from entity @s Pos[2]
-execute unless data storage bs:data generate._{direction:"xz"} run data modify storage bs:data generate._.oy set from entity @s Pos[1]
-kill @s
-
-$function bs.generate:shape_2d/strategy/$(impl)/setup
-
-execute if data storage bs:data generate._{direction:"xz"} rotated 0 90 run return run function bs.generate:shape_2d/recurse/next with storage bs:data generate._
-execute if data storage bs:data generate._{direction:"xy"} rotated 0 0 run return run function bs.generate:shape_2d/recurse/next with storage bs:data generate._
-execute if data storage bs:data generate._{direction:"zy"} rotated 90 0 run return run function bs.generate:shape_2d/recurse/next with storage bs:data generate._
diff --git a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/recurse/next.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/shape_2d/recurse/next.mcfunction
deleted file mode 100644
index 5f2e2bb089..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/recurse/next.mcfunction
+++ /dev/null
@@ -1,27 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d
-# ------------------------------------------------------------------------------------------------------------
-
-execute if score #generate.i bs.data matches 0 run return run function bs.generate:shape_2d/process/pause
-
-$execute if score #generate.i bs.data matches 1.. run function bs.generate:shape_2d/strategy/$(impl)/run with storage bs:data generate._
-scoreboard players remove #generate.i bs.data 1
-
-scoreboard players add $generate.x bs.data 1
-$execute if score $generate.x bs.data < #generate.w bs.data positioned ^ ^$(spacing) ^ run return run function bs.generate:shape_2d/recurse/next with storage bs:data generate._
-scoreboard players set $generate.x bs.data 0
-scoreboard players add $generate.y bs.data 1
-$execute if score $generate.y bs.data < #generate.h bs.data positioned ~ $(oy) $(oz) positioned ^$(spacing) ^ ^ run function bs.generate:shape_2d/recurse/next with storage bs:data generate._
diff --git a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/dummy/run.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/dummy/run.mcfunction
deleted file mode 100644
index d0bf8e50df..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/dummy/run.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d
-# ------------------------------------------------------------------------------------------------------------
-
-$$(cb)
diff --git a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/dummy/setup.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/dummy/setup.mcfunction
deleted file mode 100644
index c45f6bf9a1..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/dummy/setup.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score $generate.x bs.data run data get storage bs:data generate._.x
-execute store result score $generate.y bs.data run data get storage bs:data generate._.y
-execute store result score #generate.w bs.data run data get storage bs:data generate._.w
-execute store result score #generate.h bs.data run data get storage bs:data generate._.h
-execute store result score #generate.i bs.data run data get storage bs:data generate._.limit
diff --git a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/fractal_noise_2d/run.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/fractal_noise_2d/run.mcfunction
deleted file mode 100644
index 15b482980a..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/fractal_noise_2d/run.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation $random.fractal_noise_2d.x bs.in = $generate.x bs.data
-scoreboard players operation $random.fractal_noise_2d.y bs.in = $generate.y bs.data
-scoreboard players operation $random.fractal_noise_2d.x bs.in *= #generate.k bs.data
-scoreboard players operation $random.fractal_noise_2d.y bs.in *= #generate.k bs.data
-
-function #bs.random:fractal_noise_2d
-$$(cb)
diff --git a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/fractal_noise_2d/setup.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/fractal_noise_2d/setup.mcfunction
deleted file mode 100644
index e728928e83..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/fractal_noise_2d/setup.mcfunction
+++ /dev/null
@@ -1,28 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score $random.fractal_noise_2d.seed bs.in run data get storage bs:data generate._.seed
-execute store result score $random.fractal_noise_2d.octaves bs.in run data get storage bs:data generate._.octaves
-execute store result score $random.fractal_noise_2d.persistence bs.in run data get storage bs:data generate._.persistence 1000
-execute store result score $random.fractal_noise_2d.lacunarity bs.in run data get storage bs:data generate._.lacunarity 1000
-
-execute store result score $generate.x bs.data run data get storage bs:data generate._.x
-execute store result score $generate.y bs.data run data get storage bs:data generate._.y
-execute store result score #generate.w bs.data run data get storage bs:data generate._.w
-execute store result score #generate.h bs.data run data get storage bs:data generate._.h
-execute store result score #generate.k bs.data run data get storage bs:data generate._.k
-execute store result score #generate.i bs.data run data get storage bs:data generate._.limit
diff --git a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/simplex_noise_2d/run.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/simplex_noise_2d/run.mcfunction
deleted file mode 100644
index deeec96dbc..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/simplex_noise_2d/run.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation $random.simplex_noise_2d.x bs.in = $generate.x bs.data
-scoreboard players operation $random.simplex_noise_2d.y bs.in = $generate.y bs.data
-scoreboard players operation $random.simplex_noise_2d.x bs.in *= #generate.k bs.data
-scoreboard players operation $random.simplex_noise_2d.y bs.in *= #generate.k bs.data
-
-function #bs.random:simplex_noise_2d
-$$(cb)
diff --git a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/simplex_noise_2d/setup.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/simplex_noise_2d/setup.mcfunction
deleted file mode 100644
index 0c6405071b..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/strategy/simplex_noise_2d/setup.mcfunction
+++ /dev/null
@@ -1,25 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score $random.simplex_noise_2d.seed bs.in run data get storage bs:data generate._.seed
-
-execute store result score $generate.x bs.data run data get storage bs:data generate._.x
-execute store result score $generate.y bs.data run data get storage bs:data generate._.y
-execute store result score #generate.w bs.data run data get storage bs:data generate._.w
-execute store result score #generate.h bs.data run data get storage bs:data generate._.h
-execute store result score #generate.k bs.data run data get storage bs:data generate._.k
-execute store result score #generate.i bs.data run data get storage bs:data generate._.limit
diff --git a/datapacks/Bookshelf/data/bs.generate/function/utils/get_custom_dimension.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/utils/get_custom_dimension.mcfunction
deleted file mode 100644
index 572caf9d53..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/utils/get_custom_dimension.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data generate._.dim set from entity @s Brain.memories.minecraft:home.value.dimension
-kill @s
diff --git a/datapacks/Bookshelf/data/bs.generate/function/utils/get_dimension.mcfunction b/datapacks/Bookshelf/data/bs.generate/function/utils/get_dimension.mcfunction
deleted file mode 100644
index c81c2205f9..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/function/utils/get_dimension.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute if dimension minecraft:overworld run return run data modify storage bs:data generate._.dim set value "minecraft:overworld"
-execute if dimension minecraft:the_nether run return run data modify storage bs:data generate._.dim set value "minecraft:the_nether"
-execute if dimension minecraft:the_end run return run data modify storage bs:data generate._.dim set value "minecraft:the_end"
-
-execute positioned -30000000 0 1600 summon piglin_brute run function bs.generate:utils/get_custom_dimension
diff --git a/datapacks/Bookshelf/data/bs.generate/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.generate/tags/function/exclusive_load.json
deleted file mode 100644
index 53fc2b9eea..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.generate:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.generate/tags/function/help.json b/datapacks/Bookshelf/data/bs.generate/tags/function/help.json
deleted file mode 100644
index ffd0ce5386..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.generate:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.generate/tags/function/load.json b/datapacks/Bookshelf/data/bs.generate/tags/function/load.json
deleted file mode 100644
index bf70e9fc4b..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/tags/function/load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#bs.random:load",
- "bs.generate:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.generate/tags/function/unload.json b/datapacks/Bookshelf/data/bs.generate/tags/function/unload.json
deleted file mode 100644
index e8aa044b87..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.generate:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.generate/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.generate/test/__boot__.mcfunction
deleted file mode 100644
index 0081f05be0..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.generate
-# @beforebatch function #bs.generate:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.generate/test/shape_2d/async.mcfunction b/datapacks/Bookshelf/data/bs.generate/test/shape_2d/async.mcfunction
deleted file mode 100644
index e9ca3088ea..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/test/shape_2d/async.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Go through each step one time per tick
-# @batch bs.generate
-
-function #bs.generate:shape_2d {width:1,height:2,run:"setblock ~ ~ ~ minecraft:stone",with:{limit:1}}
-
-assert block ~ ~ ~ minecraft:stone
-assert not block ~1 ~ ~ minecraft:stone
-await delay 1t
-assert block ~1 ~ ~ minecraft:stone
diff --git a/datapacks/Bookshelf/data/bs.generate/test/shape_2d/fractal.mcfunction b/datapacks/Bookshelf/data/bs.generate/test/shape_2d/fractal.mcfunction
deleted file mode 100644
index f51a32e4ca..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/test/shape_2d/fractal.mcfunction
+++ /dev/null
@@ -1,6 +0,0 @@
-# Check fractal algorithm
-# @batch bs.generate
-
-scoreboard players reset $random.fractal_noise_2d bs.out
-function #bs.generate:fractal_shape_2d {width:1,height:2,run:"assert score $random.fractal_noise_2d bs.out matches -1000..1000",with:{limit:1}}
-scoreboard players reset $random.fractal_noise_2d bs.out
diff --git a/datapacks/Bookshelf/data/bs.generate/test/shape_2d/plane_xy.mcfunction b/datapacks/Bookshelf/data/bs.generate/test/shape_2d/plane_xy.mcfunction
deleted file mode 100644
index 9bcc95d616..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/test/shape_2d/plane_xy.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Check shape 2D xy plane
-# @batch bs.generate
-
-function #bs.generate:shape_2d {width:2,height:2,run:"setblock ~ ~ ~ minecraft:stone",with:{direction:"xy"}}
-
-assert block ~ ~ ~ minecraft:stone
-assert block ~ ~1 ~ minecraft:stone
-assert block ~1 ~ ~ minecraft:stone
-assert block ~1 ~1 ~ minecraft:stone
diff --git a/datapacks/Bookshelf/data/bs.generate/test/shape_2d/plane_xz.mcfunction b/datapacks/Bookshelf/data/bs.generate/test/shape_2d/plane_xz.mcfunction
deleted file mode 100644
index 922a6e9af0..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/test/shape_2d/plane_xz.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Check shape 2D xz plane
-# @batch bs.generate
-
-function #bs.generate:shape_2d {width:2,height:2,run:"setblock ~ ~ ~ minecraft:stone",with:{direction:"xz"}}
-
-assert block ~ ~ ~ minecraft:stone
-assert block ~1 ~ ~ minecraft:stone
-assert block ~ ~ ~1 minecraft:stone
-assert block ~1 ~ ~1 minecraft:stone
diff --git a/datapacks/Bookshelf/data/bs.generate/test/shape_2d/plane_zy.mcfunction b/datapacks/Bookshelf/data/bs.generate/test/shape_2d/plane_zy.mcfunction
deleted file mode 100644
index a55b7a8339..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/test/shape_2d/plane_zy.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Check shape 2D zy plane
-# @batch bs.generate
-
-function #bs.generate:shape_2d {width:2,height:2,run:"setblock ~ ~ ~ minecraft:stone",with:{direction:"zy"}}
-
-assert block ~ ~ ~ minecraft:stone
-assert block ~ ~1 ~ minecraft:stone
-assert block ~ ~ ~1 minecraft:stone
-assert block ~ ~1 ~1 minecraft:stone
diff --git a/datapacks/Bookshelf/data/bs.generate/test/shape_2d/simplex.mcfunction b/datapacks/Bookshelf/data/bs.generate/test/shape_2d/simplex.mcfunction
deleted file mode 100644
index cfbe368f05..0000000000
--- a/datapacks/Bookshelf/data/bs.generate/test/shape_2d/simplex.mcfunction
+++ /dev/null
@@ -1,6 +0,0 @@
-# Check simplex algorithm
-# @batch bs.generate
-
-scoreboard players reset $random.simplex_noise_2d bs.out
-function #bs.generate:simplex_shape_2d {width:1,height:2,run:"assert score $random.simplex_noise_2d bs.out matches -1000..1000",with:{limit:1}}
-scoreboard players reset $random.simplex_noise_2d bs.out
diff --git a/datapacks/Bookshelf/data/bs.health/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.health/.metadata/generated/features.json
deleted file mode 100644
index 0021d44565..0000000000
--- a/datapacks/Bookshelf/data/bs.health/.metadata/generated/features.json
+++ /dev/null
@@ -1,111 +0,0 @@
-[
- {
- "name": "add_health",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#add-remove",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/15",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/03/19",
- "version": "1.20.4"
- }
- },
- {
- "name": "add_max_health",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#add-remove",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/15",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/03/19",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_health",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#get",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/23",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/03/19",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_max_health",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#get",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/23",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/03/19",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_health",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#set",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/15",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/03/19",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_max_health",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#set",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/15",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/03/19",
- "version": "1.20.4"
- }
- },
- {
- "name": "time_to_live",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#time-to-live",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/07/08",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/11/19",
- "version": "1.20.3"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.health/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.health/.metadata/generated/module.json
deleted file mode 100644
index 5ab0618ecc..0000000000
--- a/datapacks/Bookshelf/data/bs.health/.metadata/generated/module.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "name": "bs.health",
- "display_name": "Health",
- "description": "Efficiently manage the lifecycle and vital aspects of an entity.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "weak_dependencies": [
- "bs.log"
- ],
- "features": [
- "bs.health:add_health",
- "bs.health:add_max_health",
- "bs.health:get_health",
- "bs.health:get_max_health",
- "bs.health:set_health",
- "bs.health:set_max_health",
- "bs.health:time_to_live"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.health/.metadata/module.json b/datapacks/Bookshelf/data/bs.health/.metadata/module.json
deleted file mode 100644
index bbaea51d5c..0000000000
--- a/datapacks/Bookshelf/data/bs.health/.metadata/module.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "bs.health",
- "display_name": "Health",
- "description": "Efficiently manage the lifecycle and vital aspects of an entity.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html",
- "weak_dependencies": [
- "bs.log"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.health/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.health/function/__help__.mcfunction
deleted file mode 100644
index 5fabda5472..0000000000
--- a/datapacks/Bookshelf/data/bs.health/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/health.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.health documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.health/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.health/function/__load__.mcfunction
deleted file mode 100644
index 977324fdb9..0000000000
--- a/datapacks/Bookshelf/data/bs.health/function/__load__.mcfunction
+++ /dev/null
@@ -1,33 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/health.html
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-scoreboard objectives add bs.ttl dummy [{"text":"BS ","color":"dark_gray"},{"text":"Time to Live","color":"aqua"}]
-
-data modify storage bs:const health.point set value 100000
-data modify storage bs:const health.units set value [ \
- {name:"t",scale:1}, \
- {name:"tick",scale:1}, \
- {name:"s",scale:20}, \
- {name:"second",scale:20}, \
- {name:"m",scale:1200}, \
- {name:"minute",scale:1200}, \
- {name:"hour",scale:72000}, \
- {name:"h",scale:72000}, \
-]
-
-execute unless data storage bs:const log.messages[{namespaces: ["bs.health"]}] run data modify storage bs:const log.messages[{namespaces: ["bs"]}].namespaces append value "bs.health"
diff --git a/datapacks/Bookshelf/data/bs.health/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.health/function/__unload__.mcfunction
deleted file mode 100644
index ccd3ae34cd..0000000000
--- a/datapacks/Bookshelf/data/bs.health/function/__unload__.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/health.html
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard objectives remove bs.ctx
-scoreboard objectives remove bs.ttl
-
-data remove storage bs:const health
-data remove storage bs:data health
-data remove storage bs:out health
diff --git a/datapacks/Bookshelf/data/bs.health/function/add/health.mcfunction b/datapacks/Bookshelf/data/bs.health/function/add/health.mcfunction
deleted file mode 100644
index 91eaf306e4..0000000000
--- a/datapacks/Bookshelf/data/bs.health/function/add/health.mcfunction
+++ /dev/null
@@ -1,33 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#add-remove
-# ------------------------------------------------------------------------------------------------------------
-
-# Note: Thanks to XanBelOr for giving the idea to use an advancement to subtick heal the player.
-
-$execute store result score #h bs.ctx run data get storage bs:const health.point $(points)
-
-execute store success score #s bs.ctx run attribute @s minecraft:max_health modifier value get bs.health:limit
-execute if score #s bs.ctx matches 1 store result score #p bs.ctx run attribute @s minecraft:max_health get 100000
-execute if score #s bs.ctx matches 0 store result score #p bs.ctx run data get entity @s Health 100000
-scoreboard players operation #h bs.ctx += #p bs.ctx
-
-execute store result score #m bs.ctx run attribute @s minecraft:max_health get 100000
-execute store result score #a bs.ctx run attribute @s minecraft:max_health modifier value get bs.health:limit 100000
-scoreboard players operation #a bs.ctx -= #m bs.ctx
-execute store result storage bs:ctx x double 0.00001 run scoreboard players operation #a bs.ctx += #h bs.ctx
-execute if score #a bs.ctx matches 1.. run data modify storage bs:ctx x set value 0
-execute if score #p bs.ctx > #h bs.ctx run return run function bs.health:apply/decrease_health with storage bs:ctx
-execute if score #p bs.ctx < #h bs.ctx run return run function bs.health:apply/increase_health with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.health/function/add/max_health.mcfunction b/datapacks/Bookshelf/data/bs.health/function/add/max_health.mcfunction
deleted file mode 100644
index 5db41b818f..0000000000
--- a/datapacks/Bookshelf/data/bs.health/function/add/max_health.mcfunction
+++ /dev/null
@@ -1,29 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#add-remove
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result score #h bs.ctx run data get storage bs:const health.point $(points)
-
-execute store result score #m bs.ctx run attribute @s minecraft:max_health get 100000
-execute store result score #a bs.ctx run attribute @s minecraft:max_health modifier value get bs.health:limit
-scoreboard players operation #m bs.ctx -= #a bs.ctx
-execute store result storage bs:ctx y double 0.00001 run scoreboard players operation #m bs.ctx += #h bs.ctx
-
-execute store success score #s bs.ctx run attribute @s minecraft:max_health modifier value get bs.health:limit
-execute if score #s bs.ctx matches 1 store result storage bs:ctx x double 0.00001 run scoreboard players operation #a bs.ctx -= #h bs.ctx
-execute if score #s bs.ctx matches 1 if score #a bs.ctx matches ..0 run function bs.health:apply/increase_health with storage bs:ctx
-
-function bs.health:apply/set_max_health with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.health/function/get/health.mcfunction b/datapacks/Bookshelf/data/bs.health/function/get/health.mcfunction
deleted file mode 100644
index afeb7ef032..0000000000
--- a/datapacks/Bookshelf/data/bs.health/function/get/health.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#get
-# ------------------------------------------------------------------------------------------------------------
-
-execute store success score #s bs.ctx run attribute @s minecraft:max_health modifier value get bs.health:limit
-execute if score #s bs.ctx matches 1 store result storage bs:out health.get_health double 0.00001 run attribute @s minecraft:max_health get 100000
-execute if score #s bs.ctx matches 0 run data modify storage bs:out health.get_health set from entity @s Health
-$return run data get storage bs:out health.get_health $(scale)
diff --git a/datapacks/Bookshelf/data/bs.health/function/get/max_health.mcfunction b/datapacks/Bookshelf/data/bs.health/function/get/max_health.mcfunction
deleted file mode 100644
index f61f788942..0000000000
--- a/datapacks/Bookshelf/data/bs.health/function/get/max_health.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#get
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #m bs.ctx run attribute @s minecraft:max_health get 100000
-execute store result score #a bs.ctx run attribute @s minecraft:max_health modifier value get bs.health:limit 100000
-execute store result storage bs:out health.get_max_health double 0.00001 run scoreboard players operation #m bs.ctx -= #a bs.ctx
-$return run data get storage bs:out health.get_max_health $(scale)
diff --git a/datapacks/Bookshelf/data/bs.health/function/set/health.mcfunction b/datapacks/Bookshelf/data/bs.health/function/set/health.mcfunction
deleted file mode 100644
index eff1b4c9c1..0000000000
--- a/datapacks/Bookshelf/data/bs.health/function/set/health.mcfunction
+++ /dev/null
@@ -1,30 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#set
-# ------------------------------------------------------------------------------------------------------------
-
-# Note: Thanks to XanBelOr for giving the idea to use an advancement to subtick heal the player.
-
-$execute store result score #h bs.ctx run data get storage bs:const health.point $(points)
-
-execute store result score #m bs.ctx run attribute @s minecraft:max_health get 100000
-execute store result score #a bs.ctx run attribute @s minecraft:max_health modifier value get bs.health:limit 100000
-scoreboard players operation #m bs.ctx -= #a bs.ctx
-
-execute store result score #p bs.ctx run data get entity @s Health 100000
-execute store result storage bs:ctx x double -0.00001 run scoreboard players operation #m bs.ctx -= #h bs.ctx
-execute if score #m bs.ctx matches ..-1 run data modify storage bs:ctx x set value 0
-execute if score #p bs.ctx > #h bs.ctx run return run function bs.health:apply/decrease_health with storage bs:ctx
-execute if score #p bs.ctx < #h bs.ctx run return run function bs.health:apply/increase_health with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.health/function/set/max_health.mcfunction b/datapacks/Bookshelf/data/bs.health/function/set/max_health.mcfunction
deleted file mode 100644
index 2a5c795364..0000000000
--- a/datapacks/Bookshelf/data/bs.health/function/set/max_health.mcfunction
+++ /dev/null
@@ -1,25 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#set
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:ctx y double 0.00001 store result score #h bs.ctx run data get storage bs:const health.point $(points)
-
-execute store success score #s bs.ctx run attribute @s minecraft:max_health modifier value get bs.health:limit
-execute if score #s bs.ctx matches 1 store result score #m bs.ctx run attribute @s minecraft:max_health get 100000
-execute if score #s bs.ctx matches 1 store result storage bs:ctx x double 0.00001 run scoreboard players operation #m bs.ctx -= #h bs.ctx
-execute if score #s bs.ctx matches 1 if score #m bs.ctx matches ..0 run function bs.health:apply/increase_health with storage bs:ctx
-
-function bs.health:apply/set_max_health with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.health/function/time_to_live/time_to_live.mcfunction b/datapacks/Bookshelf/data/bs.health/function/time_to_live/time_to_live.mcfunction
deleted file mode 100644
index 23a929db3b..0000000000
--- a/datapacks/Bookshelf/data/bs.health/function/time_to_live/time_to_live.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#time-to-live
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:ctx _ set value $(with)
-
-execute if data storage bs:ctx _.on_death run function bs.health:time_to_live/register_callback with entity @s
-execute if data storage bs:ctx _.unit run function bs.health:time_to_live/register_unit with storage bs:ctx _
-execute if data storage bs:ctx _.time store result score @s bs.ttl run data get storage bs:ctx _.time
-schedule function bs.health:time_to_live/next_tick 1t
diff --git a/datapacks/Bookshelf/data/bs.health/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.health/tags/function/exclusive_load.json
deleted file mode 100644
index 25c4a4498d..0000000000
--- a/datapacks/Bookshelf/data/bs.health/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.health:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.health/tags/function/help.json b/datapacks/Bookshelf/data/bs.health/tags/function/help.json
deleted file mode 100644
index 8894406356..0000000000
--- a/datapacks/Bookshelf/data/bs.health/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.health:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.health/tags/function/load.json b/datapacks/Bookshelf/data/bs.health/tags/function/load.json
deleted file mode 100644
index 70d8a7a9a1..0000000000
--- a/datapacks/Bookshelf/data/bs.health/tags/function/load.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "values": [
- "bs.health:__load__",
- {
- "id": "#bs.log:load",
- "required": false
- }
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.health/tags/function/unload.json b/datapacks/Bookshelf/data/bs.health/tags/function/unload.json
deleted file mode 100644
index 058158dc75..0000000000
--- a/datapacks/Bookshelf/data/bs.health/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.health:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.health/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.health/test/__boot__.mcfunction
deleted file mode 100644
index 4f92df9e1a..0000000000
--- a/datapacks/Bookshelf/data/bs.health/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.health
-# @beforebatch function #bs.health:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.health/test/add/concurrent.mcfunction b/datapacks/Bookshelf/data/bs.health/test/add/concurrent.mcfunction
deleted file mode 100644
index 1628a642d9..0000000000
--- a/datapacks/Bookshelf/data/bs.health/test/add/concurrent.mcfunction
+++ /dev/null
@@ -1,15 +0,0 @@
-# Max HP and HP are added or removed correctly in a single tick
-# @batch bs.health
-# @dummy
-
-function #bs.health:add_health {points:5.0}
-function #bs.health:add_max_health {points:10.0}
-function #bs.health:add_health {points:5.0}
-function #bs.health:add_health {points:-10.0}
-execute store result score #r bs.ctx run data get entity @s Health
-assert score #r bs.ctx matches 15
-
-function #bs.health:add_health {points:20.0}
-await delay 1t
-execute store result score #r bs.ctx run data get entity @s Health
-assert score #r bs.ctx matches 30
diff --git a/datapacks/Bookshelf/data/bs.health/test/add/health.mcfunction b/datapacks/Bookshelf/data/bs.health/test/add/health.mcfunction
deleted file mode 100644
index 55f39beadb..0000000000
--- a/datapacks/Bookshelf/data/bs.health/test/add/health.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# HP are added or removed correctly
-# @batch bs.health
-# @dummy
-
-function #bs.health:add_health {points:-10}
-execute store result score #r bs.ctx run data get entity @s Health
-assert score #r bs.ctx matches 10
-
-function #bs.health:add_health {points:5}
-await delay 1t
-execute store result score #r bs.ctx run data get entity @s Health
-assert score #r bs.ctx matches 15
diff --git a/datapacks/Bookshelf/data/bs.health/test/add/max_health.mcfunction b/datapacks/Bookshelf/data/bs.health/test/add/max_health.mcfunction
deleted file mode 100644
index 45189f80cf..0000000000
--- a/datapacks/Bookshelf/data/bs.health/test/add/max_health.mcfunction
+++ /dev/null
@@ -1,11 +0,0 @@
-# Max HP are added or removed correctly
-# @batch bs.health
-# @dummy
-
-function #bs.health:add_max_health {points:10}
-execute store result score #r bs.ctx run attribute @s minecraft:max_health get
-assert score #r bs.ctx matches 30
-
-function #bs.health:add_max_health {points:-5}
-execute store result score #r bs.ctx run attribute @s minecraft:max_health get
-assert score #r bs.ctx matches 25
diff --git a/datapacks/Bookshelf/data/bs.health/test/get/health.mcfunction b/datapacks/Bookshelf/data/bs.health/test/get/health.mcfunction
deleted file mode 100644
index 2abd5e3c28..0000000000
--- a/datapacks/Bookshelf/data/bs.health/test/get/health.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Get HP returns correct value
-# @batch bs.health
-# @dummy
-
-execute store result score #r bs.ctx run function #bs.health:get_health {scale:1}
-assert score #r bs.ctx matches 20
-
-attribute @s minecraft:max_health modifier add bs.health:limit -5 add_value
-execute store result score #r bs.ctx run function #bs.health:get_health {scale:1}
-assert score #r bs.ctx matches 15
diff --git a/datapacks/Bookshelf/data/bs.health/test/get/max_health.mcfunction b/datapacks/Bookshelf/data/bs.health/test/get/max_health.mcfunction
deleted file mode 100644
index e762e51afb..0000000000
--- a/datapacks/Bookshelf/data/bs.health/test/get/max_health.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Get Max HP returns correct value
-# @batch bs.health
-# @dummy
-
-execute store result score #r bs.ctx run function #bs.health:get_max_health {scale:1}
-assert score #r bs.ctx matches 20
-
-attribute @s minecraft:max_health modifier add bs.health:limit -10 add_value
-execute store result score #r bs.ctx run function #bs.health:get_max_health {scale:1}
-assert score #r bs.ctx matches 20
diff --git a/datapacks/Bookshelf/data/bs.health/test/set/concurrent.mcfunction b/datapacks/Bookshelf/data/bs.health/test/set/concurrent.mcfunction
deleted file mode 100644
index 0df0adb911..0000000000
--- a/datapacks/Bookshelf/data/bs.health/test/set/concurrent.mcfunction
+++ /dev/null
@@ -1,14 +0,0 @@
-# Max HP and HP are set correctly in a single tick
-# @batch bs.health
-# @dummy
-
-function #bs.health:set_health {points:10.0}
-function #bs.health:set_max_health {points:30.0}
-execute store result score #r bs.ctx run data get entity @s Health
-assert score #r bs.ctx matches 10
-
-function #bs.health:set_max_health {points:20.0}
-function #bs.health:set_health {points:30.0}
-await delay 1t
-execute store result score #r bs.ctx run data get entity @s Health
-assert score #r bs.ctx matches 20
diff --git a/datapacks/Bookshelf/data/bs.health/test/set/health.mcfunction b/datapacks/Bookshelf/data/bs.health/test/set/health.mcfunction
deleted file mode 100644
index 6a07f7ed2a..0000000000
--- a/datapacks/Bookshelf/data/bs.health/test/set/health.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# HP are set correctly
-# @batch bs.health
-# @dummy
-
-function #bs.health:set_health {points:10}
-execute store result score #r bs.ctx run data get entity @s Health
-assert score #r bs.ctx matches 10
-
-function #bs.health:set_health {points:15}
-await delay 1t
-execute store result score #r bs.ctx run data get entity @s Health
-assert score #r bs.ctx matches 15
diff --git a/datapacks/Bookshelf/data/bs.health/test/set/max_health.mcfunction b/datapacks/Bookshelf/data/bs.health/test/set/max_health.mcfunction
deleted file mode 100644
index 17c4183292..0000000000
--- a/datapacks/Bookshelf/data/bs.health/test/set/max_health.mcfunction
+++ /dev/null
@@ -1,11 +0,0 @@
-# Max HP are set correctly
-# @batch bs.health
-# @dummy
-
-function #bs.health:set_max_health {points:10}
-execute store result score #r bs.ctx run attribute @s minecraft:max_health get
-assert score #r bs.ctx matches 10
-
-function #bs.health:set_max_health {points:20}
-execute store result score #r bs.ctx run attribute @s minecraft:max_health get
-assert score #r bs.ctx matches 20
diff --git a/datapacks/Bookshelf/data/bs.health/test/time_to_live.mcfunction b/datapacks/Bookshelf/data/bs.health/test/time_to_live.mcfunction
deleted file mode 100644
index 084cd3972a..0000000000
--- a/datapacks/Bookshelf/data/bs.health/test/time_to_live.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# A callback is run just before killing the entity
-# @batch bs.health
-
-scoreboard players set #t bs.ctx 0
-summon minecraft:armor_stand ~ ~ ~ {Tags:["bs.packtest"]}
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest] run function #bs.health:time_to_live {with:{time:5,on_death:"scoreboard players set #t bs.ctx 1"}}
-await delay 5t
-
-assert score #t bs.ctx matches 1
-assert not entity @e[type=minecraft:armor_stand,distance=..1] inside
diff --git a/datapacks/Bookshelf/data/bs.hitbox/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.hitbox/.metadata/generated/features.json
deleted file mode 100644
index 8cce76e317..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/.metadata/generated/features.json
+++ /dev/null
@@ -1,92 +0,0 @@
-[
- {
- "name": "get_block",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#get",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/11/21",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/09/28",
- "version": "1.21"
- }
- },
- {
- "name": "get_entity",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#get",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/11/21",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/09/28",
- "version": "1.21"
- }
- },
- {
- "name": "is_entity_in_block",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-inside",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/28",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/28",
- "version": "1.21"
- }
- },
- {
- "name": "is_entity_in_blocks",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-inside",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/28",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/28",
- "version": "1.21"
- }
- },
- {
- "name": "is_in_block",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-inside",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/11/21",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/09/28",
- "version": "1.21"
- }
- },
- {
- "name": "is_in_entity",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-inside",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/11/21",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/09/28",
- "version": "1.21"
- }
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.hitbox/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.hitbox/.metadata/generated/module.json
deleted file mode 100644
index 2795c7d012..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/.metadata/generated/module.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "name": "bs.hitbox",
- "display_name": "Hitbox",
- "description": "Get and check the hitboxes of blocks or entities.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html",
- "authors": [
- "Aksiome"
- ],
- "features": [
- "bs.hitbox:get_block",
- "bs.hitbox:get_entity",
- "bs.hitbox:is_entity_in_block",
- "bs.hitbox:is_entity_in_blocks",
- "bs.hitbox:is_in_block",
- "bs.hitbox:is_in_entity"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/.metadata/module.json b/datapacks/Bookshelf/data/bs.hitbox/.metadata/module.json
deleted file mode 100644
index e0ab0de1cb..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.hitbox",
- "display_name": "Hitbox",
- "description": "Get and check the hitboxes of blocks or entities.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html"
-}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/__help__.mcfunction
deleted file mode 100644
index e69e0949a3..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.hitbox documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/__load__.mcfunction
deleted file mode 100644
index 62bcdb4edf..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/__load__.mcfunction
+++ /dev/null
@@ -1,39 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html
-# ------------------------------------------------------------------------------------------------------------
-
-forceload add -30000000 1600
-setblock -30000000 0 1606 minecraft:decorated_pot
-
-scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
-
-scoreboard players set 2 bs.const 2
-scoreboard players set 11 bs.const 11
-scoreboard players set 15 bs.const 15
-scoreboard players set 255 bs.const 255
-scoreboard players set 1000 bs.const 1000
-scoreboard players set 65536 bs.const 65536
-scoreboard players set 3129871 bs.const 3129871
-scoreboard players set 1000000 bs.const 1000000
-scoreboard players set 10000000 bs.const 10000000
-scoreboard players set 16777216 bs.const 16777216
-scoreboard players set 42317861 bs.const 42317861
-scoreboard players set 116129781 bs.const 116129781
-scoreboard players set 268435456 bs.const 268435456
-
-data modify storage bs:data hitbox.offsets set value []
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/__unload__.mcfunction
deleted file mode 100644
index 6d97402e4a..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/__unload__.mcfunction
+++ /dev/null
@@ -1,26 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html
-# ------------------------------------------------------------------------------------------------------------
-
-setblock -30000000 0 1606 minecraft:air
-forceload remove -30000000 1600
-
-scoreboard objectives remove bs.const
-scoreboard objectives remove bs.ctx
-scoreboard objectives remove bs.out
-
-data remove storage bs:out hitbox
-data remove storage bs:data hitbox
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_block/get_block.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/get_block/get_block.mcfunction
deleted file mode 100644
index 088d5944b2..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_block/get_block.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#get
-# ------------------------------------------------------------------------------------------------------------
-
-execute unless block ~ ~ ~ #bs.hitbox:is_composite run \
- return run data modify storage bs:out hitbox set value {shape:[[0.0,0.0,0.0,16.0,16.0,16.0]]}
-
-loot replace block -30000000 0 1606 container.0 loot bs.hitbox:get_block/get
-data modify storage bs:out hitbox set from block -30000000 0 1606 item.components."minecraft:custom_data"
-execute if block ~ ~ ~ #bs.hitbox:has_offset summon minecraft:marker run function bs.hitbox:get_block/offset/get
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_block/offset/compute.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/get_block/offset/compute.mcfunction
deleted file mode 100644
index ceb6bf4d19..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_block/offset/compute.mcfunction
+++ /dev/null
@@ -1,90 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# compute the offset since we only care about bits 16 to 24, overflow of the scoreboard is not an issue
-data modify storage bs:data hitbox.offsets append value {x:0,z:0,k:[0,0]}
-execute store result storage bs:data hitbox.offsets[-1].k[0] int 1 run scoreboard players get #u bs.ctx
-execute store result storage bs:data hitbox.offsets[-1].k[1] int 1 run scoreboard players get #v bs.ctx
-
-# compute i = (x * 3129871) ^ (z * 116129781) - [Triton365 fast bitwise xor (using floating-point errors)]
-execute store result entity @s Pos[1] double .000000007450580596923828125 run scoreboard players operation #u bs.ctx *= 3129871 bs.const
-execute store result entity @s Pos[2] double .000000007450580596923828125 run scoreboard players operation #v bs.ctx *= 116129781 bs.const
-execute at @s \
- positioned -.00000000186264514923095703125 ~33554496 ~33554496 facing ~ ~-.0000000037252902984619140625 ~-.0000000037252902984619140625 positioned ^ ^ ^-.00000000186264514923095703125 \
- positioned ~ ~33554431.9999999962747097015380859375 ~33554431.9999999962747097015380859375 facing ~ ~-.000000007450580596923828125 ~-.000000007450580596923828125 positioned ^ ^ ^-.0000000037252902984619140625 \
- positioned ~ ~67108863.999999992549419403076171875 ~67108863.999999992549419403076171875 facing ~ ~-.00000001490116119384765625 ~-.00000001490116119384765625 positioned ^ ^ ^-.000000007450580596923828125 \
- positioned ~ ~134217727.99999998509883880615234375 ~134217727.99999998509883880615234375 facing ~ ~-.0000000298023223876953125 ~-.0000000298023223876953125 positioned ^ ^ ^-.00000001490116119384765625 \
- positioned ~ ~268435455.9999999701976776123046875 ~268435455.9999999701976776123046875 facing ~ ~-.000000059604644775390625 ~-.000000059604644775390625 positioned ^ ^ ^-.0000000298023223876953125 \
- positioned ~ ~536870911.999999940395355224609375 ~536870911.999999940395355224609375 facing ~ ~-.00000011920928955078125 ~-.00000011920928955078125 positioned ^ ^ ^-.000000059604644775390625 \
- positioned ~ ~1073741823.99999988079071044921875 ~1073741823.99999988079071044921875 facing ~ ~-.0000002384185791015625 ~-.0000002384185791015625 positioned ^ ^ ^-.00000011920928955078125 \
- positioned ~ ~2147483647.9999997615814208984375 ~2147483647.9999997615814208984375 facing ~ ~-.000000476837158203125 ~-.000000476837158203125 positioned ^ ^ ^-.0000002384185791015625 \
- positioned ~ ~4294967295.999999523162841796875 ~4294967295.999999523162841796875 facing ~ ~-.00000095367431640625 ~-.00000095367431640625 positioned ^ ^ ^-.000000476837158203125 \
- positioned ~ ~8589934591.99999904632568359375 ~8589934591.99999904632568359375 facing ~ ~-.0000019073486328125 ~-.0000019073486328125 positioned ^ ^ ^-.00000095367431640625 \
- positioned ~ ~17179869183.9999980926513671875 ~17179869183.9999980926513671875 facing ~ ~-.000003814697265625 ~-.000003814697265625 positioned ^ ^ ^-.0000019073486328125 \
- positioned ~ ~34359738367.999996185302734375 ~34359738367.999996185302734375 facing ~ ~-.00000762939453125 ~-.00000762939453125 positioned ^ ^ ^-.000003814697265625 \
- positioned ~ ~68719476735.99999237060546875 ~68719476735.99999237060546875 facing ~ ~-.0000152587890625 ~-.0000152587890625 positioned ^ ^ ^-.00000762939453125 \
- positioned ~ ~137438953471.9999847412109375 ~137438953471.9999847412109375 facing ~ ~-.000030517578125 ~-.000030517578125 positioned ^ ^ ^-.0000152587890625 \
- positioned ~ ~274877906943.999969482421875 ~274877906943.999969482421875 facing ~ ~-.00006103515625 ~-.00006103515625 positioned ^ ^ ^-.000030517578125 \
- positioned ~ ~549755813887.99993896484375 ~549755813887.99993896484375 facing ~ ~-.0001220703125 ~-.0001220703125 positioned ^ ^ ^-.00006103515625 \
- positioned ~ ~1099511627775.9998779296875 ~1099511627775.9998779296875 facing ~ ~-.000244140625 ~-.000244140625 positioned ^ ^ ^-.0001220703125 \
- positioned ~ ~2199023255551.999755859375 ~2199023255551.999755859375 facing ~ ~-.00048828125 ~-.00048828125 positioned ^ ^ ^-.000244140625 \
- positioned ~ ~4398046511103.99951171875 ~4398046511103.99951171875 facing ~ ~-.0009765625 ~-.0009765625 positioned ^ ^ ^-.00048828125 \
- positioned ~ ~8796093022207.9990234375 ~8796093022207.9990234375 facing ~ ~-.001953125 ~-.001953125 positioned ^ ^ ^-.0009765625 \
- positioned ~ ~17592186044415.998046875 ~17592186044415.998046875 facing ~ ~-.00390625 ~-.00390625 positioned ^ ^ ^-.001953125 \
- positioned ~ ~35184372088831.99609375 ~35184372088831.99609375 facing ~ ~-.0078125 ~-.0078125 positioned ^ ^ ^-.00390625 \
- positioned ~ ~70368744177663.9921875 ~70368744177663.9921875 facing ~ ~-.015625 ~-.015625 positioned ^ ^ ^-.0078125 \
- positioned ~ ~140737488355327.984375 ~140737488355327.984375 facing ~ ~-.03125 ~-.03125 positioned ^ ^ ^-.015625 \
- positioned ~ ~281474976710655.96875 ~281474976710655.96875 facing ~ ~-.0625 ~-.0625 positioned ^ ^ ^-.03125 \
- positioned ~ ~562949953421311.9375 ~562949953421311.9375 facing ~ ~-.125 ~-.125 positioned ^ ^ ^-.0625 \
- positioned ~ ~1125899906842623.875 ~1125899906842623.875 facing ~ ~-.25 ~-.25 positioned ^ ^ ^-.125 \
- positioned ~ ~2251799813685247.75 ~2251799813685247.75 facing ~ ~-.5 ~-.5 positioned ^ ^ ^-.25 \
- positioned ~ ~4503599627370495.5 ~4503599627370495.5 facing ~ ~-1 ~-1 positioned ^ ^ ^-.5 \
- positioned ~ ~9007199254740991 ~9007199254740991 facing ~ ~-2 ~-2 positioned ^ ^ ^-1 \
- positioned ~ ~18014398509481982 ~18014398509481982 facing ~ ~-4 ~-4 positioned ^ ^ ^2 \
- run tp @s ~ 0 0.
-execute store result score #i bs.ctx run data get entity @s Pos[0] 1073741824
-scoreboard players operation #i bs.ctx -= #u bs.ctx
-execute store result score #j bs.ctx run scoreboard players operation #i bs.ctx -= #v bs.ctx
-
-# compute i = (i * i * 42317861) + (i * 11)
-scoreboard players operation #j bs.ctx *= #j bs.ctx
-scoreboard players operation #j bs.ctx *= 42317861 bs.const
-scoreboard players operation #i bs.ctx *= 11 bs.const
-execute store result score #u bs.ctx store result score #v bs.ctx run scoreboard players operation #i bs.ctx += #j bs.ctx
-
-# compute offset x = (((i >> 16 & 15) / 15.0) - 0.5) * 0.5
-scoreboard players operation #u bs.ctx /= 65536 bs.const
-scoreboard players operation #u bs.ctx *= 268435456 bs.const
-scoreboard players operation #u bs.ctx /= 268435456 bs.const
-execute if score #u bs.ctx matches ..-1 run scoreboard players add #u bs.ctx 16
-scoreboard players operation #u bs.ctx *= 10000000 bs.const
-scoreboard players operation #u bs.ctx /= 15 bs.const
-scoreboard players remove #u bs.ctx 5000000
-scoreboard players operation #u bs.ctx /= 2 bs.const
-
-# compute offset z = (((i >> 24 & 15) / 15.0) - 0.5) * 0.5
-scoreboard players operation #v bs.ctx /= 16777216 bs.const
-scoreboard players operation #v bs.ctx *= 268435456 bs.const
-scoreboard players operation #v bs.ctx /= 268435456 bs.const
-execute if score #v bs.ctx matches ..-1 run scoreboard players add #v bs.ctx 16
-scoreboard players operation #v bs.ctx *= 10000000 bs.const
-scoreboard players operation #v bs.ctx /= 15 bs.const
-scoreboard players remove #v bs.ctx 5000000
-scoreboard players operation #v bs.ctx /= 2 bs.const
-
-# cache the result for better performance in future calls
-execute store result storage bs:out hitbox.offset.x double .0000001 run scoreboard players get #u bs.ctx
-execute store result storage bs:out hitbox.offset.z double .0000001 run scoreboard players get #v bs.ctx
-data modify storage bs:data hitbox.offsets[-1] merge from storage bs:out hitbox.offset
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_block/offset/get.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/get_block/offset/get.mcfunction
deleted file mode 100644
index eec06feb37..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_block/offset/get.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #u bs.ctx store result storage bs:ctx x int 1 run data get entity @s Pos[0]
-execute store result score #v bs.ctx store result storage bs:ctx z int 1 run data get entity @s Pos[2]
-
-function bs.hitbox:get_block/offset/fetch with storage bs:ctx
-execute if score #s bs.ctx matches 0 run function bs.hitbox:get_block/offset/compute
-kill @s
-
-execute if block ~ ~ ~ minecraft:pointed_dripstone run function bs.hitbox:get_block/offset/clamp {min:-1250000,max:1250000}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/dispatch.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/dispatch.mcfunction
deleted file mode 100644
index 17934226ad..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/dispatch.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$function bs.hitbox:get_entity/registry/$(y)
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_block/check/check.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_block/check/check.mcfunction
deleted file mode 100644
index 21fe3de2aa..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_block/check/check.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-function #bs.hitbox:get_block
-execute store result score #u bs.ctx run data get storage bs:out hitbox.offset.x 1000000
-execute store result score #v bs.ctx run data get storage bs:out hitbox.offset.z 1000000
-return run function bs.hitbox:is_entity_in_block/check/loop
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_block/check/loop.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_block/check/loop.mcfunction
deleted file mode 100644
index 0308721388..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_block/check/loop.mcfunction
+++ /dev/null
@@ -1,40 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #i bs.ctx run data get storage bs:out hitbox.shape[-1][0] 62500
-execute store result score #j bs.ctx run data get storage bs:out hitbox.shape[-1][1] 62500
-execute store result score #k bs.ctx run data get storage bs:out hitbox.shape[-1][2] 62500
-execute store result score #o bs.ctx run data get storage bs:out hitbox.shape[-1][3] 62500
-execute store result score #p bs.ctx run data get storage bs:out hitbox.shape[-1][4] 62500
-execute store result score #q bs.ctx run data get storage bs:out hitbox.shape[-1][5] 62500
-
-# offset coordinates if needed
-scoreboard players operation #i bs.ctx += #u bs.ctx
-scoreboard players operation #o bs.ctx += #u bs.ctx
-scoreboard players operation #k bs.ctx += #v bs.ctx
-scoreboard players operation #q bs.ctx += #v bs.ctx
-
-# check aabb vs aabb collision
-execute \
- if score #x bs.ctx < #o bs.ctx \
- if score #l bs.ctx >= #i bs.ctx \
- if score #y bs.ctx < #p bs.ctx \
- if score #m bs.ctx >= #j bs.ctx \
- if score #z bs.ctx < #q bs.ctx \
- if score #n bs.ctx >= #k bs.ctx \
-run return 1
-
-data remove storage bs:out hitbox.shape[-1]
-execute if data storage bs:out hitbox.shape[0] run return run function bs.hitbox:is_entity_in_block/check/loop
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_block/shaped.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_block/shaped.mcfunction
deleted file mode 100644
index e9cd014f2c..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_block/shaped.mcfunction
+++ /dev/null
@@ -1,36 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #x bs.ctx run data get storage bs:out hitbox.shape[-1][0] 62500
-execute store result score #y bs.ctx run data get storage bs:out hitbox.shape[-1][1] 62500
-execute store result score #z bs.ctx run data get storage bs:out hitbox.shape[-1][2] 62500
-execute store result score #l bs.ctx run data get storage bs:out hitbox.shape[-1][3] 62500
-execute store result score #m bs.ctx run data get storage bs:out hitbox.shape[-1][4] 62500
-execute store result score #n bs.ctx run data get storage bs:out hitbox.shape[-1][5] 62500
-
-execute summon minecraft:marker run function bs.hitbox:utils/get_negative_pos
-execute at @s align xyz summon minecraft:marker run function bs.hitbox:utils/get_relative_pos with storage bs:ctx
-execute store result score #i bs.ctx run data get storage bs:ctx _[0] 1000000
-execute store result score #j bs.ctx run data get storage bs:ctx _[1] 1000000
-execute store result score #k bs.ctx run data get storage bs:ctx _[2] 1000000
-
-scoreboard players operation #x bs.ctx += #i bs.ctx
-scoreboard players operation #y bs.ctx += #j bs.ctx
-scoreboard players operation #z bs.ctx += #k bs.ctx
-scoreboard players operation #l bs.ctx += #i bs.ctx
-scoreboard players operation #m bs.ctx += #j bs.ctx
-scoreboard players operation #n bs.ctx += #k bs.ctx
-
-return run function bs.hitbox:is_entity_in_block/check/check
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_block/sized.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_block/sized.mcfunction
deleted file mode 100644
index 0be9ba2865..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_block/sized.mcfunction
+++ /dev/null
@@ -1,34 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #h bs.ctx run data get storage bs:out hitbox.height 1000
-execute store result score #w bs.ctx run data get storage bs:out hitbox.width 500
-execute store result score #s bs.ctx run data get storage bs:out hitbox.scale 1000
-scoreboard players operation #h bs.ctx *= #s bs.ctx
-scoreboard players operation #w bs.ctx *= #s bs.ctx
-
-execute summon minecraft:marker run function bs.hitbox:utils/get_negative_pos
-execute at @s summon minecraft:marker run function bs.hitbox:utils/get_relative_pos with storage bs:ctx
-execute store result score #l bs.ctx store result score #x bs.ctx run data get storage bs:ctx _[0] 1000000
-execute store result score #m bs.ctx store result score #y bs.ctx run data get storage bs:ctx _[1] 1000000
-execute store result score #n bs.ctx store result score #z bs.ctx run data get storage bs:ctx _[2] 1000000
-
-scoreboard players operation #x bs.ctx -= #w bs.ctx
-scoreboard players operation #z bs.ctx -= #w bs.ctx
-scoreboard players operation #l bs.ctx += #w bs.ctx
-scoreboard players operation #m bs.ctx += #h bs.ctx
-scoreboard players operation #n bs.ctx += #w bs.ctx
-
-return run function bs.hitbox:is_entity_in_block/check/check
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/check/check.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/check/check.mcfunction
deleted file mode 100644
index 5479e145fd..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/check/check.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-return run function bs.hitbox:is_entity_in_blocks/check/run with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/check/run.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/check/run.mcfunction
deleted file mode 100644
index 07076ac22f..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/check/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute unless block ~ ~ ~ $(ignored_blocks) run return run function bs.hitbox:is_entity_in_block/check/check
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/recurse/init.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/recurse/init.mcfunction
deleted file mode 100644
index fd0617e598..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/recurse/init.mcfunction
+++ /dev/null
@@ -1,31 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation #i bs.ctx /= 1000000 bs.const
-scoreboard players operation #i bs.ctx *= 1000000 bs.const
-scoreboard players operation #x bs.ctx -= #i bs.ctx
-scoreboard players operation #l bs.ctx -= #i bs.ctx
-
-scoreboard players operation #j bs.ctx /= 1000000 bs.const
-scoreboard players operation #j bs.ctx *= 1000000 bs.const
-scoreboard players operation #y bs.ctx -= #j bs.ctx
-scoreboard players operation #m bs.ctx -= #j bs.ctx
-
-scoreboard players operation #k bs.ctx /= 1000000 bs.const
-scoreboard players operation #k bs.ctx *= 1000000 bs.const
-scoreboard players operation #z bs.ctx -= #k bs.ctx
-scoreboard players operation #n bs.ctx -= #k bs.ctx
-
-$execute at @s align xyz positioned ~$(x) ~$(y) ~$(z) run return run function bs.hitbox:is_entity_in_blocks/recurse/x
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/recurse/x.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/recurse/x.mcfunction
deleted file mode 100644
index 1e5518c80d..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/recurse/x.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute if function bs.hitbox:is_entity_in_blocks/recurse/y run return 1
-
-scoreboard players remove #x bs.ctx 1000000
-scoreboard players remove #l bs.ctx 1000000
-execute if score #l bs.ctx matches 1.. positioned ~1 ~ ~ run return run function bs.hitbox:is_entity_in_blocks/recurse/x
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/recurse/y.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/recurse/y.mcfunction
deleted file mode 100644
index 92ba70d82c..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/recurse/y.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute if function bs.hitbox:is_entity_in_blocks/recurse/z run return 1
-
-scoreboard players remove #y bs.ctx 1000000
-scoreboard players remove #m bs.ctx 1000000
-execute if score #m bs.ctx matches 1.. positioned ~ ~1 ~ if function bs.hitbox:is_entity_in_blocks/recurse/y run return 1
-scoreboard players add #y bs.ctx 1000000
-scoreboard players add #m bs.ctx 1000000
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/recurse/z.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/recurse/z.mcfunction
deleted file mode 100644
index ac9d092445..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/recurse/z.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute if function bs.hitbox:is_entity_in_blocks/check/check run return 1
-
-scoreboard players remove #z bs.ctx 1000000
-scoreboard players remove #n bs.ctx 1000000
-execute if score #n bs.ctx matches 1.. positioned ~ ~ ~1 if function bs.hitbox:is_entity_in_blocks/recurse/z run return 1
-scoreboard players add #z bs.ctx 1000000
-scoreboard players add #n bs.ctx 1000000
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/shaped.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/shaped.mcfunction
deleted file mode 100644
index 58bbd03878..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/shaped.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result storage bs:ctx x double .000001 store result score #i bs.ctx store result score #x bs.ctx run data get storage bs:out hitbox.shape[-1][0] 62500
-execute store result storage bs:ctx y double .000001 store result score #j bs.ctx store result score #y bs.ctx run data get storage bs:out hitbox.shape[-1][1] 62500
-execute store result storage bs:ctx z double .000001 store result score #k bs.ctx store result score #z bs.ctx run data get storage bs:out hitbox.shape[-1][2] 62500
-execute store result score #l bs.ctx run data get storage bs:out hitbox.shape[-1][3] 62500
-execute store result score #m bs.ctx run data get storage bs:out hitbox.shape[-1][4] 62500
-execute store result score #n bs.ctx run data get storage bs:out hitbox.shape[-1][5] 62500
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/sized.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/sized.mcfunction
deleted file mode 100644
index 113caacd3e..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/sized.mcfunction
+++ /dev/null
@@ -1,30 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #h bs.ctx run data get storage bs:out hitbox.height 1000
-execute store result score #w bs.ctx run data get storage bs:out hitbox.width 500
-execute store result score #s bs.ctx run data get storage bs:out hitbox.scale 1000
-scoreboard players operation #h bs.ctx *= #s bs.ctx
-scoreboard players operation #w bs.ctx *= #s bs.ctx
-
-execute at @s summon minecraft:marker run function bs.hitbox:utils/get_fract_pos
-execute store result score #l bs.ctx store result score #x bs.ctx run data get storage bs:ctx _[0] 1000000
-execute store result score #n bs.ctx store result score #z bs.ctx run data get storage bs:ctx _[2] 1000000
-execute store result storage bs:ctx y double .000001 store result score #j bs.ctx store result score #m bs.ctx store result score #y bs.ctx run data get storage bs:ctx _[1] 1000000
-scoreboard players operation #l bs.ctx += #w bs.ctx
-scoreboard players operation #n bs.ctx += #w bs.ctx
-scoreboard players operation #m bs.ctx += #h bs.ctx
-execute store result storage bs:ctx x double .000001 store result score #i bs.ctx run scoreboard players operation #x bs.ctx -= #w bs.ctx
-execute store result storage bs:ctx z double .000001 store result score #k bs.ctx run scoreboard players operation #z bs.ctx -= #w bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/is_in_block/check.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/is_in_block/check.mcfunction
deleted file mode 100644
index 22aeabe3f8..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/is_in_block/check.mcfunction
+++ /dev/null
@@ -1,39 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #i bs.ctx run data get storage bs:out hitbox.shape[-1][0] 62500
-execute store result score #j bs.ctx run data get storage bs:out hitbox.shape[-1][1] 62500
-execute store result score #k bs.ctx run data get storage bs:out hitbox.shape[-1][2] 62500
-execute store result score #o bs.ctx run data get storage bs:out hitbox.shape[-1][3] 62500
-execute store result score #p bs.ctx run data get storage bs:out hitbox.shape[-1][4] 62500
-execute store result score #q bs.ctx run data get storage bs:out hitbox.shape[-1][5] 62500
-
-# offset coordinates if needed
-scoreboard players operation #i bs.ctx += #u bs.ctx
-scoreboard players operation #o bs.ctx += #u bs.ctx
-scoreboard players operation #k bs.ctx += #v bs.ctx
-scoreboard players operation #q bs.ctx += #v bs.ctx
-
-execute \
- if score #x bs.ctx >= #i bs.ctx \
- if score #x bs.ctx < #o bs.ctx \
- if score #y bs.ctx >= #j bs.ctx \
- if score #y bs.ctx < #p bs.ctx \
- if score #z bs.ctx >= #k bs.ctx \
- if score #z bs.ctx < #q bs.ctx \
-run return 1
-
-data remove storage bs:out hitbox.shape[-1]
-execute if data storage bs:out hitbox.shape[0] run return run function bs.hitbox:is_in_block/check
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/utils/get_relative_pos.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/function/utils/get_relative_pos.mcfunction
deleted file mode 100644
index 31c69f4de8..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/function/utils/get_relative_pos.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$tp @s ~$(x) ~$(y) ~$(z)
-data modify storage bs:ctx _ set from entity @s Pos
-kill @s
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/1.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/1.json
deleted file mode 100644
index 57ee9039fd..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/1.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,13.0,7.0,9.0,16.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,10.0,7.0,9.0,16.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,7.0,7.0,9.0,16.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,3.0,7.0,9.0,16.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,9.0,16.0,9.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"hanging":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,9.0,16.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,9.0,16.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,9.0,16.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,9.0,16.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,9.0,16.0,9.0]]}"}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/10.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/10.json
deleted file mode 100644
index f97b97409c..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/10.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0],[13.0,0.0,3.0,16.0,1.0,13.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"up"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0],[13.0,0.0,3.0,16.0,1.0,13.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"side"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,13.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,13.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,13.0],[13.0,0.0,3.0,16.0,1.0,13.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"up"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0],[13.0,0.0,3.0,16.0,1.0,13.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"up"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,16.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,16.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,1.0,16.0],[13.0,0.0,3.0,16.0,1.0,13.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"side"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,13.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,13.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,1.0,13.0],[13.0,0.0,3.0,16.0,1.0,13.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"side"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,13.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,13.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,13.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"up"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,13.0,13.0,1.0,16.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,13.0,13.0,1.0,16.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,13.0,13.0,1.0,16.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"side"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,16.0,1.0,13.0],[15.0,1.0,3.0,16.0,16.0,13.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"up"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0],[13.0,0.0,3.0,16.0,1.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"up"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0],[13.0,0.0,3.0,16.0,1.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"side"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,13.0],[13.0,0.0,3.0,16.0,1.0,13.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"up"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0],[13.0,0.0,3.0,16.0,1.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"up"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,1.0,16.0],[13.0,0.0,3.0,16.0,1.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"side"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,1.0,13.0],[13.0,0.0,3.0,16.0,1.0,13.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"side"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,13.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,13.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,13.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"up"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,13.0,13.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,13.0,13.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,16.0,1.0,13.0],[3.0,0.0,13.0,13.0,1.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"side"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,16.0,1.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,16.0,1.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,16.0,1.0,13.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"side"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,13.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,13.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"up"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,13.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,13.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"side"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,13.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,13.0,1.0,13.0],[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,16.0,1.0],[3.0,0.0,1.0,13.0,1.0,13.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"up"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,13.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,13.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"up"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,13.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,13.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,1.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"side"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,13.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,13.0,1.0,13.0],[3.0,0.0,0.0,13.0,1.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,0.0,13.0,1.0,13.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"side"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,13.0,1.0,13.0],[3.0,0.0,13.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,13.0,1.0,13.0],[3.0,0.0,13.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,1.0,16.0],[3.0,1.0,15.0,13.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"up"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,13.0,1.0,13.0],[3.0,0.0,13.0,13.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,13.0,1.0,13.0],[3.0,0.0,13.0,13.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,1.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"side"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,1.0,16.0,13.0],[1.0,0.0,3.0,13.0,1.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,3.0,13.0,1.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"side"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,1.0,13.0]]}"}]}]}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/11.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/11.json
deleted file mode 100644
index ecb1d4c135..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/11.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,2.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,4.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,6.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"4"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,12.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"5"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"6"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/12.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/12.json
deleted file mode 100644
index a7372fe58c..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/12.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,3.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[13.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,13.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,3.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"open":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,13.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,3.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[13.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,3.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"hinge":"left"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[13.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,3.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,3.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,13.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"open":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,13.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,3.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[13.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,3.0,16.0,16.0]]}"}]}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/13.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/13.json
deleted file mode 100644
index 58208b68f4..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/13.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,13.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,3.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[13.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,3.0,16.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/14.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/14.json
deleted file mode 100644
index 6a7dd5c6bc..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/14.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,2.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"north_south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,2.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"east_west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"ascending_east"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"ascending_west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"ascending_north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"ascending_south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,2.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"south_east"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,2.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"south_west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,2.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"north_west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,2.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/15.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/15.json
deleted file mode 100644
index c325463e16..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/15.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,4.5,14.0,16.0,12.5,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,4.5,0.0,16.0,12.5,2.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[14.0,4.5,0.0,16.0,12.5,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,4.5,0.0,2.0,12.5,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/16.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/16.json
deleted file mode 100644
index 34e94bad1b..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/16.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,7.0,15.0,10.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"0"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,1.0,9.0,10.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"4"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"5"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"6"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"7"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,7.0,15.0,10.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"8"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"9"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"10"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"11"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,1.0,9.0,10.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"12"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"13"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"rotation":"14"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/17.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/17.json
deleted file mode 100644
index b1efe1c389..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/17.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,14.0,6.0,16.0,16.0,10.0],[1.0,0.0,7.0,15.0,10.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,14.0,6.0,16.0,16.0,10.0],[1.0,0.0,7.0,15.0,10.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,14.0,0.0,10.0,16.0,16.0],[7.0,0.0,1.0,9.0,10.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,14.0,0.0,10.0,16.0,16.0],[7.0,0.0,1.0,9.0,10.0,15.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/18.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/18.json
deleted file mode 100644
index f9d230de6e..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/18.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,4.0,11.0,6.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,4.0,11.0,6.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,5.0,12.0,6.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,5.0,12.0,6.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"face":"floor"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,4.0,10.0,11.0,12.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,4.0,0.0,11.0,12.0,6.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[10.0,4.0,5.0,16.0,12.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,4.0,5.0,6.0,12.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"face":"wall"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,10.0,4.0,11.0,16.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,10.0,4.0,11.0,16.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,10.0,5.0,12.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,10.0,5.0,12.0,16.0,11.0]]}"}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/19.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/19.json
deleted file mode 100644
index 47234b5b0f..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/19.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,0.5,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"powered":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,1.0,15.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/2.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/2.json
deleted file mode 100644
index 432d659433..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/2.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,3.0,9.0,3.0],[0.0,3.0,3.0,16.0,9.0,16.0],[3.0,3.0,0.0,16.0,9.0,16.0],[13.0,0.0,0.0,16.0,9.0,3.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,13.0,3.0,9.0,16.0],[0.0,3.0,0.0,16.0,9.0,16.0],[13.0,0.0,13.0,16.0,9.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,3.0,9.0,3.0],[0.0,0.0,13.0,3.0,9.0,16.0],[0.0,3.0,3.0,16.0,9.0,16.0],[3.0,3.0,0.0,16.0,9.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,0.0,16.0,9.0,16.0],[13.0,0.0,0.0,16.0,9.0,3.0],[13.0,0.0,13.0,16.0,9.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"part":"head"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,13.0,3.0,9.0,16.0],[0.0,3.0,0.0,16.0,9.0,16.0],[13.0,0.0,13.0,16.0,9.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,3.0,9.0,3.0],[0.0,3.0,3.0,16.0,9.0,16.0],[3.0,3.0,0.0,16.0,9.0,16.0],[13.0,0.0,0.0,16.0,9.0,3.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,0.0,16.0,9.0,16.0],[13.0,0.0,0.0,16.0,9.0,3.0],[13.0,0.0,13.0,16.0,9.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,3.0,9.0,3.0],[0.0,0.0,13.0,3.0,9.0,16.0],[0.0,3.0,3.0,16.0,9.0,16.0],[3.0,3.0,0.0,16.0,9.0,16.0]]}"}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/20.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/20.json
deleted file mode 100644
index 88263f468d..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/20.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,6.0,11.0,1.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,6.0,11.0,1.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,5.0,10.0,1.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,5.0,10.0,1.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"face":"floor"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,6.0,15.0,11.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,6.0,0.0,11.0,10.0,1.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[15.0,6.0,5.0,16.0,10.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,6.0,5.0,1.0,10.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"face":"wall"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,15.0,6.0,11.0,16.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,15.0,6.0,11.0,16.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,15.0,5.0,10.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,15.0,5.0,10.0,16.0,11.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"powered":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,6.0,11.0,2.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,6.0,11.0,2.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,5.0,10.0,2.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,5.0,10.0,2.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"face":"floor"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,6.0,14.0,11.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,6.0,0.0,11.0,10.0,2.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[14.0,6.0,5.0,16.0,10.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,6.0,5.0,2.0,10.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"face":"wall"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,14.0,6.0,11.0,16.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,14.0,6.0,11.0,16.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,14.0,5.0,10.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,14.0,5.0,10.0,16.0,11.0]]}"}]}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/21.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/21.json
deleted file mode 100644
index 3f3926adfe..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/21.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,2.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"layers":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,4.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"layers":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,6.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"layers":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"layers":"4"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"layers":"5"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,12.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"layers":"6"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"layers":"7"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/22.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/22.json
deleted file mode 100644
index 4fab2e1a81..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/22.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,6.0,16.0,16.0,10.0],[6.0,0.0,0.0,10.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,0.0,10.0,16.0,16.0],[10.0,0.0,6.0,16.0,16.0,10.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,6.0,16.0,16.0,10.0],[6.0,0.0,0.0,10.0,16.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,0.0,10.0,16.0,10.0],[10.0,0.0,6.0,16.0,16.0,10.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,6.0,16.0,16.0,10.0],[6.0,0.0,10.0,10.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,6.0,16.0,16.0,10.0],[6.0,0.0,10.0,10.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,6.0,16.0,16.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,6.0,16.0,16.0,10.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,6.0,10.0,16.0,10.0],[6.0,0.0,0.0,10.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,0.0,10.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,6.0,10.0,16.0,10.0],[6.0,0.0,0.0,10.0,16.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,0.0,10.0,16.0,10.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,6.0,10.0,16.0,10.0],[6.0,0.0,10.0,10.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,6.0,10.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,6.0,10.0,16.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,6.0,10.0,16.0,10.0]]}"}]}]}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/23.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/23.json
deleted file mode 100644
index 68dc5ab183..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/23.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,6.0,16.0,16.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"axis":"x"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,0.0,10.0,16.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/24.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/24.json
deleted file mode 100644
index 68bd32eaa3..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/24.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,8.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bites":"0"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,1.0,15.0,8.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bites":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,1.0,15.0,8.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bites":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,1.0,15.0,8.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bites":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[9.0,0.0,1.0,15.0,8.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bites":"4"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[11.0,0.0,1.0,15.0,8.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bites":"5"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[13.0,0.0,1.0,15.0,8.0,15.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/25.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/25.json
deleted file mode 100644
index 2f51cfea51..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/25.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,13.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,3.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[13.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,3.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"open":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,13.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,13.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,13.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,13.0,0.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"half":"top"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,13.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,3.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[13.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,3.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"open":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,3.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,3.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,3.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,3.0,16.0]]}"}]}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/26.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/26.json
deleted file mode 100644
index 451bd1c19d..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/26.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,7.0,16.0,16.0,9.0],[7.0,0.0,0.0,9.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,0.0,9.0,16.0,16.0],[9.0,0.0,7.0,16.0,16.0,9.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,7.0,16.0,16.0,9.0],[7.0,0.0,0.0,9.0,16.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,0.0,9.0,16.0,9.0],[9.0,0.0,7.0,16.0,16.0,9.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,7.0,16.0,16.0,9.0],[7.0,0.0,9.0,9.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,16.0,16.0,9.0],[7.0,0.0,9.0,9.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,7.0,16.0,16.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,16.0,16.0,9.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,7.0,9.0,16.0,9.0],[7.0,0.0,0.0,9.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,0.0,9.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,7.0,9.0,16.0,9.0],[7.0,0.0,0.0,9.0,16.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,0.0,9.0,16.0,9.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,7.0,9.0,16.0,9.0],[7.0,0.0,9.0,9.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,9.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,7.0,9.0,16.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,9.0,16.0,9.0]]}"}]}]}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/27.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/27.json
deleted file mode 100644
index fb3e3576ab..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/27.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,6.5,6.5,16.0,9.5,9.5]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"axis":"x"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.5,0.0,6.5,9.5,16.0,9.5]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"axis":"y"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.5,6.5,0.0,9.5,9.5,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/28.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/28.json
deleted file mode 100644
index e72feacf72..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/28.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,0.0,10.0,10.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,6.0,10.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,6.0,10.0,10.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,6.0,16.0,10.0,10.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/29.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/29.json
deleted file mode 100644
index c9cc4133b1..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/29.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,9.0,2.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,9.0,4.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,9.0,6.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,9.0,8.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,9.0,10.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"4"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,9.0,12.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"5"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,9.0,14.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"6"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,9.0,16.0,9.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/3.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/3.json
deleted file mode 100644
index c9f21aee5b..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/3.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,2.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"north_south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,2.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"east_west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"ascending_east"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"ascending_west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"ascending_north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/30.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/30.json
deleted file mode 100644
index 95a0a8b5b0..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/30.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[1.0,15.0,1.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0],[0.0,15.0,1.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,15.0,1.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,15.0,1.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[1.0,15.0,0.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,16.0,16.0],[0.0,15.0,0.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,15.0,0.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,15.0,0.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[15.0,0.0,0.0,16.0,16.0,16.0]]}"}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[1.0,15.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0],[0.0,15.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,15.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,15.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[1.0,15.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,16.0,16.0],[0.0,15.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,15.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,15.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,16.0]]}"}]}]}]}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/31.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/31.json
deleted file mode 100644
index 3c18599ba8..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/31.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[1.0,15.0,1.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,16.0,16.0],[0.0,15.0,1.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,15.0,1.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,15.0,1.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[1.0,15.0,0.0,16.0,16.0,16.0],[15.0,1.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,16.0,16.0],[0.0,15.0,0.0,16.0,16.0,16.0],[15.0,1.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,0.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,15.0,0.0,16.0,16.0,16.0],[15.0,1.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0],[0.0,15.0,0.0,16.0,16.0,16.0],[15.0,1.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[15.0,1.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0],[15.0,1.0,0.0,16.0,16.0,16.0]]}"}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[1.0,15.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,16.0,16.0],[0.0,15.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,15.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,15.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[1.0,15.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,16.0,16.0],[0.0,15.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,15.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0],[0.0,15.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0]]}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"down":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[1.0,15.0,1.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0],[0.0,15.0,1.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,15.0,1.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,15.0,1.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[1.0,15.0,0.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,16.0,16.0],[0.0,15.0,0.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,15.0,0.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,15.0,0.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[15.0,0.0,0.0,16.0,16.0,16.0]]}"}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[1.0,15.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0],[0.0,15.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,15.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,15.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[1.0,15.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,16.0,16.0],[0.0,15.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,15.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,15.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,16.0]]}"}]}]}]}]}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/32.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/32.json
deleted file mode 100644
index d5f51df77e..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/32.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,6.0,16.0,13.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,6.0,16.0,13.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,0.0,10.0,13.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,0.0,10.0,13.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"in_wall":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,6.0,16.0,16.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,6.0,16.0,16.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,0.0,10.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,0.0,10.0,16.0,16.0]]}"}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/33.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/33.json
deleted file mode 100644
index 54cfeec61d..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/33.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,5.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,11.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,14.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/34.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/34.json
deleted file mode 100644
index f68e06b229..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/34.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,13.0,16.0],[4.0,13.0,4.0,12.0,16.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"eye":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,13.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/35.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/35.json
deleted file mode 100644
index 2251badf6a..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/35.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,7.0,1.0,10.0,12.0,5.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,7.0,11.0,10.0,12.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,7.0,6.0,5.0,12.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[11.0,7.0,6.0,15.0,12.0,10.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,5.0,1.0,11.0,12.0,7.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,5.0,9.0,11.0,12.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,5.0,5.0,7.0,12.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[9.0,5.0,5.0,15.0,12.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,3.0,1.0,12.0,12.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,3.0,7.0,12.0,12.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,3.0,4.0,9.0,12.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,3.0,4.0,15.0,12.0,12.0]]}"}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/36.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/36.json
deleted file mode 100644
index 666096b614..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/36.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,10.0,11.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,10.0,6.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[10.0,0.0,5.0,16.0,10.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,6.0,10.0,11.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/37.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/37.json
deleted file mode 100644
index ca55e59321..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/37.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,1.0,0.0,16.0,2.5,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"attached":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/38.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/38.json
deleted file mode 100644
index 1e59358b1d..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/38.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"none"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,12.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,12.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,12.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,12.0,11.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"low"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,16.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"none"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,16.0,16.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,16.0,16.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"none"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,12.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,12.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,12.0,11.0,16.0,16.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,12.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,12.0,11.0,16.0,16.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"low"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,16.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,12.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,16.0],[12.0,0.0,5.0,16.0,14.0,11.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"low"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[12.0,0.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[12.0,14.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0],[12.0,0.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0],[12.0,14.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,16.0,16.0],[12.0,0.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,16.0,16.0],[12.0,14.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,12.0,11.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"none"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,12.0],[12.0,0.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,12.0],[12.0,14.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,12.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0],[12.0,0.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0],[12.0,14.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,12.0,11.0,16.0,16.0],[12.0,0.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,12.0,11.0,16.0,16.0],[12.0,14.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,12.0,11.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"low"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0],[12.0,0.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0],[12.0,14.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0],[12.0,0.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0],[12.0,14.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,12.0],[5.0,0.0,12.0,11.0,14.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,16.0],[12.0,0.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,16.0],[12.0,14.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0],[4.0,0.0,4.0,12.0,16.0,12.0],[5.0,0.0,0.0,11.0,16.0,16.0]]}"}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,14.0,11.0],[5.0,0.0,11.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0],[5.0,0.0,11.0,11.0,14.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,14.0,11.0],[5.0,0.0,11.0,11.0,16.0,16.0],[5.0,14.0,5.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0],[5.0,0.0,11.0,11.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"none"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,14.0,11.0],[5.0,0.0,0.0,11.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0],[5.0,0.0,0.0,11.0,14.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,14.0,11.0],[5.0,0.0,0.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0],[5.0,0.0,0.0,11.0,14.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,5.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,14.0,11.0],[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,5.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0],[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,11.0,11.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"low"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,14.0,11.0],[5.0,0.0,0.0,11.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0],[5.0,0.0,0.0,11.0,16.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,16.0,11.0],[5.0,0.0,11.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,14.0,11.0],[5.0,0.0,0.0,11.0,16.0,11.0],[5.0,0.0,11.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0],[5.0,0.0,0.0,11.0,16.0,11.0],[5.0,0.0,11.0,11.0,14.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,14.0,11.0],[5.0,0.0,0.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0],[5.0,0.0,0.0,11.0,16.0,16.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"none"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0],[11.0,0.0,5.0,16.0,14.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,16.0,14.0,11.0],[5.0,0.0,11.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[5.0,0.0,11.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0],[5.0,0.0,11.0,11.0,14.0,16.0],[11.0,0.0,5.0,16.0,14.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,11.0,16.0,16.0],[11.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[5.0,0.0,11.0,11.0,16.0,16.0],[5.0,14.0,5.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0],[5.0,0.0,11.0,11.0,16.0,16.0],[11.0,0.0,5.0,16.0,14.0,11.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"none"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,14.0,11.0],[11.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[5.0,0.0,0.0,11.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0],[5.0,0.0,0.0,11.0,14.0,11.0],[11.0,0.0,5.0,16.0,14.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,14.0,16.0],[11.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[5.0,0.0,0.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0],[5.0,0.0,0.0,11.0,14.0,16.0],[11.0,0.0,5.0,16.0,14.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,5.0,11.0,16.0,16.0],[11.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,5.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0],[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,11.0,11.0,16.0,16.0],[11.0,0.0,5.0,16.0,14.0,11.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"low"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,16.0,11.0],[11.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[5.0,0.0,0.0,11.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0],[5.0,0.0,0.0,11.0,16.0,11.0],[11.0,0.0,5.0,16.0,14.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,16.0,11.0],[5.0,0.0,11.0,11.0,14.0,16.0],[11.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[5.0,0.0,0.0,11.0,16.0,11.0],[5.0,0.0,11.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0],[5.0,0.0,0.0,11.0,16.0,11.0],[5.0,0.0,11.0,11.0,14.0,16.0],[11.0,0.0,5.0,16.0,14.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,16.0,16.0],[11.0,0.0,5.0,16.0,14.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[5.0,0.0,0.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,11.0,16.0,11.0],[5.0,0.0,0.0,11.0,16.0,16.0],[11.0,0.0,5.0,16.0,14.0,11.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"low"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[5.0,14.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,16.0,16.0,11.0],[5.0,0.0,11.0,11.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[5.0,0.0,11.0,11.0,14.0,16.0],[5.0,14.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0],[5.0,0.0,11.0,11.0,14.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,16.0,16.0,11.0],[5.0,0.0,11.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[5.0,0.0,11.0,11.0,16.0,16.0],[5.0,14.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0],[5.0,0.0,11.0,11.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"none"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,14.0,11.0],[5.0,14.0,5.0,16.0,16.0,11.0],[11.0,0.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[5.0,0.0,0.0,11.0,14.0,11.0],[5.0,14.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0],[5.0,0.0,0.0,11.0,14.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,5.0,16.0,16.0,11.0],[11.0,0.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0],[5.0,0.0,0.0,11.0,14.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,5.0,16.0,16.0,11.0],[5.0,14.0,11.0,11.0,16.0,16.0],[11.0,0.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,5.0,16.0,16.0,11.0],[5.0,14.0,11.0,11.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0],[5.0,0.0,0.0,11.0,14.0,16.0],[5.0,14.0,11.0,11.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"low"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,16.0,11.0],[11.0,0.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[5.0,0.0,0.0,11.0,16.0,11.0],[11.0,14.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0],[5.0,0.0,0.0,11.0,16.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,16.0,11.0],[5.0,0.0,11.0,11.0,14.0,16.0],[11.0,0.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[5.0,0.0,0.0,11.0,16.0,11.0],[5.0,0.0,11.0,11.0,14.0,16.0],[11.0,14.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0],[5.0,0.0,0.0,11.0,16.0,11.0],[5.0,0.0,11.0,11.0,14.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,0.0,11.0,16.0,16.0],[11.0,0.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,14.0,11.0],[5.0,0.0,0.0,11.0,16.0,16.0],[11.0,14.0,5.0,16.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,5.0,16.0,16.0,11.0],[5.0,0.0,0.0,11.0,16.0,16.0]]}"}]}]}]}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/39.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/39.json
deleted file mode 100644
index 7977396115..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/39.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,2.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,3.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,4.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,5.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,6.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"4"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,7.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"5"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"6"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,9.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/4.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/4.json
deleted file mode 100644
index 471df332f1..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/4.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,4.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,12.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"east"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,12.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,4.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"extended":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"east"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,16.0]]}"}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/40.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/40.json
deleted file mode 100644
index e41ad5d183..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/40.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,4.0,8.0,12.0,12.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,4.0,0.0,12.0,12.0,8.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[8.0,4.0,4.0,16.0,12.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,4.0,4.0,8.0,12.0,12.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/41.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/41.json
deleted file mode 100644
index 26a2dc96e8..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/41.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,4.0,8.0,13.0,12.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,4.0,0.0,13.0,12.0,8.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[8.0,4.0,3.0,16.0,12.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,4.0,3.0,8.0,12.0,13.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/42.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/42.json
deleted file mode 100644
index 808a7d9243..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/42.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,0.0,2.0,14.0,4.0,14.0],[3.0,10.0,0.0,13.0,16.0,16.0],[4.0,4.0,3.0,12.0,5.0,13.0],[6.0,5.0,4.0,10.0,16.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,0.0,2.0,14.0,4.0,14.0],[3.0,10.0,0.0,13.0,16.0,16.0],[4.0,4.0,3.0,12.0,5.0,13.0],[6.0,5.0,4.0,10.0,16.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,10.0,3.0,16.0,16.0,13.0],[2.0,0.0,2.0,14.0,4.0,14.0],[3.0,4.0,4.0,13.0,5.0,12.0],[4.0,5.0,6.0,12.0,16.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,10.0,3.0,16.0,16.0,13.0],[2.0,0.0,2.0,14.0,4.0,14.0],[3.0,4.0,4.0,13.0,5.0,12.0],[4.0,5.0,6.0,12.0,16.0,10.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/43.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/43.json
deleted file mode 100644
index e4b7eb4ae3..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/43.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,1.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"0"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,0.5,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,0.5,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,0.5,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,0.5,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"4"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,0.5,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"5"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,0.5,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"6"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,0.5,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"7"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,0.5,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"8"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,0.5,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"9"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,0.5,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"10"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,0.5,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"11"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,0.5,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"12"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,0.5,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"13"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,0.5,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"power":"14"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,0.5,15.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/44.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/44.json
deleted file mode 100644
index ace4cc64b3..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/44.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,10.0,0.0,16.0,16.0,2.0],[0.0,10.0,2.0,2.0,16.0,16.0],[2.0,10.0,2.0,16.0,11.0,16.0],[2.0,11.0,14.0,16.0,16.0,16.0],[4.0,4.0,4.0,12.0,11.0,12.0],[6.0,0.0,6.0,10.0,11.0,10.0],[14.0,11.0,2.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"down"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,10.0,0.0,16.0,16.0,2.0],[0.0,10.0,2.0,2.0,16.0,16.0],[2.0,10.0,2.0,16.0,11.0,16.0],[2.0,11.0,14.0,16.0,16.0,16.0],[4.0,4.0,4.0,12.0,11.0,12.0],[6.0,4.0,0.0,10.0,8.0,12.0],[14.0,11.0,2.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,10.0,0.0,16.0,16.0,2.0],[0.0,10.0,2.0,2.0,16.0,16.0],[2.0,10.0,2.0,16.0,11.0,16.0],[2.0,11.0,14.0,16.0,16.0,16.0],[4.0,4.0,4.0,12.0,11.0,12.0],[6.0,4.0,12.0,10.0,8.0,16.0],[14.0,11.0,2.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,4.0,6.0,12.0,8.0,10.0],[0.0,10.0,0.0,16.0,16.0,2.0],[0.0,10.0,2.0,2.0,16.0,16.0],[2.0,10.0,2.0,16.0,11.0,16.0],[2.0,11.0,14.0,16.0,16.0,16.0],[4.0,4.0,4.0,12.0,11.0,12.0],[14.0,11.0,2.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,10.0,0.0,16.0,16.0,2.0],[0.0,10.0,2.0,2.0,16.0,16.0],[2.0,10.0,2.0,16.0,11.0,16.0],[2.0,11.0,14.0,16.0,16.0,16.0],[4.0,4.0,4.0,12.0,11.0,12.0],[12.0,4.0,6.0,16.0,8.0,10.0],[14.0,11.0,2.0,16.0,16.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/45.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/45.json
deleted file mode 100644
index 4db6c10287..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/45.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,8.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"type":"top"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"type":"bottom"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/46.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/46.json
deleted file mode 100644
index 1c5c8e55ce..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/46.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,14.0,16.0,12.5,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,12.5,2.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[14.0,0.0,0.0,16.0,12.5,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,2.0,12.5,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/47.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/47.json
deleted file mode 100644
index e32ced0281..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/47.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,6.0,0.0,10.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,6.0,6.0,16.0,10.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"east"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,6.0,0.0,10.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,6.0,6.0,16.0,10.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,6.0,10.0,16.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,6.0,10.0,16.0,10.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/48.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/48.json
deleted file mode 100644
index 7a2494640f..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/48.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,16.0,13.0,13.0],[3.0,0.0,3.0,13.0,16.0,13.0],[3.0,3.0,0.0,13.0,13.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0],[3.0,3.0,0.0,13.0,13.0,16.0],[13.0,3.0,3.0,16.0,13.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,16.0,13.0,13.0],[3.0,0.0,3.0,13.0,13.0,13.0],[3.0,3.0,0.0,13.0,13.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,13.0,13.0],[3.0,3.0,0.0,13.0,13.0,16.0],[13.0,3.0,3.0,16.0,13.0,13.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,16.0,13.0,13.0],[3.0,0.0,3.0,13.0,16.0,13.0],[3.0,3.0,0.0,13.0,13.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0],[3.0,3.0,0.0,13.0,13.0,13.0],[13.0,3.0,3.0,16.0,13.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,16.0,13.0,13.0],[3.0,0.0,3.0,13.0,13.0,13.0],[3.0,3.0,0.0,13.0,13.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,13.0,13.0],[3.0,3.0,0.0,13.0,13.0,13.0],[13.0,3.0,3.0,16.0,13.0,13.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,16.0,13.0,13.0],[3.0,0.0,3.0,13.0,16.0,13.0],[3.0,3.0,13.0,13.0,13.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0],[3.0,3.0,13.0,13.0,13.0,16.0],[13.0,3.0,3.0,16.0,13.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,16.0,13.0,13.0],[3.0,0.0,3.0,13.0,13.0,13.0],[3.0,3.0,13.0,13.0,13.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,13.0,13.0],[3.0,3.0,13.0,13.0,13.0,16.0],[13.0,3.0,3.0,16.0,13.0,13.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,16.0,13.0,13.0],[3.0,0.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0],[13.0,3.0,3.0,16.0,13.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,16.0,13.0,13.0],[3.0,0.0,3.0,13.0,13.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,13.0,13.0],[13.0,3.0,3.0,16.0,13.0,13.0]]}"}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,13.0,13.0,13.0],[3.0,0.0,3.0,13.0,16.0,13.0],[3.0,3.0,0.0,13.0,13.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0],[3.0,3.0,0.0,13.0,13.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,13.0,13.0,13.0],[3.0,0.0,3.0,13.0,13.0,13.0],[3.0,3.0,0.0,13.0,13.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,13.0,13.0],[3.0,3.0,0.0,13.0,13.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,13.0,13.0,13.0],[3.0,0.0,3.0,13.0,16.0,13.0],[3.0,3.0,0.0,13.0,13.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0],[3.0,3.0,0.0,13.0,13.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,13.0,13.0,13.0],[3.0,0.0,3.0,13.0,13.0,13.0],[3.0,3.0,0.0,13.0,13.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,13.0,13.0],[3.0,3.0,0.0,13.0,13.0,13.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,13.0,13.0,13.0],[3.0,0.0,3.0,13.0,16.0,13.0],[3.0,3.0,13.0,13.0,13.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0],[3.0,3.0,13.0,13.0,13.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,13.0,13.0,13.0],[3.0,0.0,3.0,13.0,13.0,13.0],[3.0,3.0,13.0,13.0,13.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,13.0,13.0],[3.0,3.0,13.0,13.0,13.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,13.0,13.0,13.0],[3.0,0.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,13.0,13.0,13.0],[3.0,0.0,3.0,13.0,13.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,13.0,13.0]]}"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"down":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,16.0,13.0,13.0],[3.0,3.0,0.0,13.0,13.0,16.0],[3.0,13.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,0.0,13.0,13.0,16.0],[3.0,13.0,3.0,13.0,16.0,13.0],[13.0,3.0,3.0,16.0,13.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,16.0,13.0,13.0],[3.0,3.0,0.0,13.0,13.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,0.0,13.0,13.0,16.0],[13.0,3.0,3.0,16.0,13.0,13.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,16.0,13.0,13.0],[3.0,3.0,0.0,13.0,13.0,13.0],[3.0,13.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,0.0,13.0,13.0,13.0],[3.0,13.0,3.0,13.0,16.0,13.0],[13.0,3.0,3.0,16.0,13.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,16.0,13.0,13.0],[3.0,3.0,0.0,13.0,13.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,0.0,13.0,13.0,13.0],[13.0,3.0,3.0,16.0,13.0,13.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,16.0,13.0,13.0],[3.0,3.0,13.0,13.0,13.0,16.0],[3.0,13.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,3.0,13.0,16.0,13.0],[3.0,3.0,13.0,13.0,13.0,16.0],[13.0,3.0,3.0,16.0,13.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,16.0,13.0,13.0],[3.0,3.0,13.0,13.0,13.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,3.0,16.0,13.0,13.0],[3.0,3.0,13.0,13.0,13.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,16.0,13.0,13.0],[3.0,13.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,3.0,13.0,16.0,13.0],[13.0,3.0,3.0,16.0,13.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,16.0,13.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,3.0,16.0,13.0,13.0]]}"}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,13.0,13.0,13.0],[3.0,3.0,0.0,13.0,13.0,16.0],[3.0,13.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,0.0,13.0,13.0,16.0],[3.0,13.0,3.0,13.0,16.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,13.0,13.0,13.0],[3.0,3.0,0.0,13.0,13.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,0.0,13.0,13.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,13.0,13.0,13.0],[3.0,3.0,0.0,13.0,13.0,13.0],[3.0,13.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,0.0,13.0,13.0,13.0],[3.0,13.0,3.0,13.0,16.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,13.0,13.0,13.0],[3.0,3.0,0.0,13.0,13.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,0.0,13.0,13.0,13.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,13.0,13.0,13.0],[3.0,3.0,13.0,13.0,13.0,16.0],[3.0,13.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,3.0,13.0,16.0,13.0],[3.0,3.0,13.0,13.0,13.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,13.0,13.0,13.0],[3.0,3.0,13.0,13.0,13.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,3.0,13.0,13.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,13.0,13.0,13.0],[3.0,13.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,3.0,13.0,16.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,13.0,13.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,3.0,13.0,13.0,13.0]]}"}]}]}]}]}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/49.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/49.json
deleted file mode 100644
index 57350adce9..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/49.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,11.0,6.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,11.0,10.0,11.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/5.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/5.json
deleted file mode 100644
index b112c3e5d1..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/5.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,4.0],[6.0,6.0,4.0,10.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,6.0,6.0,16.0,10.0,10.0],[12.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"east"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,12.0,16.0,16.0,16.0],[6.0,6.0,0.0,10.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,4.0,16.0,16.0],[4.0,6.0,6.0,16.0,10.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,12.0,0.0,16.0,16.0,16.0],[6.0,0.0,6.0,10.0,16.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,4.0,16.0],[6.0,4.0,6.0,10.0,16.0,10.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/50.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/50.json
deleted file mode 100644
index 144fce4e99..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/50.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,15.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,15.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,15.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,11.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,15.0,13.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"half":"upper"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,11.0,3.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,14.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/51.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/51.json
deleted file mode 100644
index e2897d2089..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/51.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,2.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,4.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,6.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/52.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/52.json
deleted file mode 100644
index 73cd446220..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/52.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,12.0,7.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"eggs":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,7.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"eggs":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,7.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"eggs":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,7.0,15.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/53.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/53.json
deleted file mode 100644
index 38ba55777b..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/53.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,4.0,5.0,16.0,12.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,4.0,0.0,16.0,12.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,4.0,0.0,16.0,12.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,4.0,0.0,11.0,12.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/54.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/54.json
deleted file mode 100644
index ab57f8d463..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/54.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,6.0,10.0,6.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"pickles":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,6.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"pickles":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,0.0,2.0,14.0,6.0,14.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"pickles":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,0.0,2.0,14.0,7.0,14.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/55.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/55.json
deleted file mode 100644
index c67fb5b927..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/55.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,11.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"leaves":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,11.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"leaves":"small"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/56.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/56.json
deleted file mode 100644
index dc9dbe5870..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/56.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,2.0,16.0,2.0],[0.0,0.0,2.0,16.0,2.0,16.0],[0.0,2.0,14.0,2.0,16.0,16.0],[0.0,14.0,2.0,16.0,16.0,16.0],[2.0,0.0,0.0,16.0,2.0,16.0],[2.0,14.0,0.0,16.0,16.0,16.0],[14.0,2.0,0.0,16.0,16.0,2.0],[14.0,2.0,14.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bottom":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,2.0,16.0,2.0],[0.0,0.0,14.0,2.0,16.0,16.0],[0.0,14.0,2.0,16.0,16.0,16.0],[2.0,14.0,0.0,16.0,16.0,16.0],[14.0,0.0,0.0,16.0,16.0,2.0],[14.0,0.0,14.0,16.0,16.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/57.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/57.json
deleted file mode 100644
index 83b0fd1bd3..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/57.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,0.0,6.0,4.0,13.0,10.0],[2.0,7.0,5.0,14.0,13.0,11.0],[4.0,4.0,2.0,12.0,16.0,14.0],[12.0,0.0,6.0,14.0,13.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,0.0,6.0,4.0,13.0,10.0],[2.0,7.0,5.0,14.0,13.0,11.0],[4.0,4.0,2.0,12.0,16.0,14.0],[12.0,0.0,6.0,14.0,13.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,4.0,4.0,14.0,16.0,12.0],[5.0,7.0,2.0,11.0,13.0,14.0],[6.0,0.0,2.0,10.0,13.0,4.0],[6.0,0.0,12.0,10.0,13.0,14.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,4.0,4.0,14.0,16.0,12.0],[5.0,7.0,2.0,11.0,13.0,14.0],[6.0,0.0,2.0,10.0,13.0,4.0],[6.0,0.0,12.0,10.0,13.0,14.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"face":"floor"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,5.0,3.0,14.0,11.0,9.0],[2.0,6.0,9.0,14.0,10.0,12.0],[2.0,6.0,12.0,4.0,10.0,16.0],[4.0,2.0,0.0,12.0,14.0,12.0],[12.0,6.0,12.0,14.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,5.0,7.0,14.0,11.0,13.0],[2.0,6.0,0.0,4.0,10.0,13.0],[4.0,2.0,4.0,12.0,14.0,16.0],[12.0,6.0,0.0,14.0,10.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,2.0,4.0,12.0,14.0,12.0],[3.0,5.0,2.0,9.0,11.0,14.0],[9.0,6.0,2.0,16.0,10.0,4.0],[9.0,6.0,12.0,16.0,10.0,14.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,6.0,2.0,13.0,10.0,4.0],[0.0,6.0,12.0,13.0,10.0,14.0],[4.0,2.0,4.0,16.0,14.0,12.0],[7.0,5.0,2.0,13.0,11.0,14.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"face":"wall"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,3.0,5.0,14.0,9.0,11.0],[2.0,9.0,6.0,4.0,16.0,10.0],[4.0,0.0,2.0,12.0,12.0,14.0],[12.0,9.0,6.0,14.0,16.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,3.0,5.0,14.0,9.0,11.0],[2.0,9.0,6.0,4.0,16.0,10.0],[4.0,0.0,2.0,12.0,12.0,14.0],[12.0,9.0,6.0,14.0,16.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,0.0,4.0,14.0,12.0,12.0],[5.0,3.0,2.0,11.0,9.0,14.0],[6.0,9.0,2.0,10.0,16.0,4.0],[6.0,9.0,12.0,10.0,16.0,14.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,0.0,4.0,14.0,12.0,12.0],[5.0,3.0,2.0,11.0,9.0,14.0],[6.0,9.0,2.0,10.0,16.0,4.0],[6.0,9.0,12.0,10.0,16.0,14.0]]}"}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/58.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/58.json
deleted file mode 100644
index 67a3b31b2a..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/58.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,2.0,16.0],[0.0,10.0,1.0,16.0,14.0,5.25],[0.0,12.0,5.25,16.0,16.0,9.5],[0.0,14.0,9.5,16.0,16.0,14.0],[4.0,2.0,4.0,12.0,14.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,2.0,16.0],[0.0,10.0,10.5,16.0,14.0,15.0],[0.0,12.0,6.25,16.0,16.0,10.5],[0.0,14.0,2.0,16.0,16.0,10.5],[4.0,2.0,4.0,12.0,16.0,10.5],[4.0,2.0,10.5,12.0,14.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,2.0,16.0],[1.0,10.0,0.0,5.25,14.0,16.0],[4.0,2.0,4.0,12.0,14.0,12.0],[5.25,12.0,0.0,9.5,16.0,16.0],[9.5,14.0,0.0,14.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,2.0,16.0],[2.0,14.0,0.0,10.5,16.0,16.0],[4.0,2.0,4.0,10.5,16.0,12.0],[6.25,12.0,0.0,10.5,16.0,16.0],[10.5,2.0,4.0,12.0,14.0,12.0],[10.5,10.0,0.0,15.0,14.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/59.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/59.json
deleted file mode 100644
index fab4a04391..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/59.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,4.0,16.0,16.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,4.0,16.0,16.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,0.0,12.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,0.0,12.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"attachment":"floor"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,4.0,4.0,12.0,6.0,12.0],[5.0,6.0,5.0,11.0,13.0,11.0],[7.0,13.0,7.0,9.0,16.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,4.0,4.0,12.0,6.0,12.0],[5.0,6.0,5.0,11.0,13.0,11.0],[7.0,13.0,7.0,9.0,16.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,4.0,4.0,12.0,6.0,12.0],[5.0,6.0,5.0,11.0,13.0,11.0],[7.0,13.0,7.0,9.0,16.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,4.0,4.0,12.0,6.0,12.0],[5.0,6.0,5.0,11.0,13.0,11.0],[7.0,13.0,7.0,9.0,16.0,9.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"attachment":"ceiling"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,4.0,4.0,12.0,6.0,12.0],[5.0,6.0,5.0,11.0,13.0,11.0],[7.0,13.0,0.0,9.0,15.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,4.0,4.0,12.0,6.0,12.0],[5.0,6.0,5.0,11.0,13.0,11.0],[7.0,13.0,3.0,9.0,15.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,13.0,7.0,13.0,15.0,9.0],[4.0,4.0,4.0,12.0,6.0,12.0],[5.0,6.0,5.0,11.0,13.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,13.0,7.0,16.0,15.0,9.0],[4.0,4.0,4.0,12.0,6.0,12.0],[5.0,6.0,5.0,11.0,13.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"attachment":"single_wall"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,4.0,4.0,12.0,6.0,12.0],[5.0,6.0,5.0,11.0,13.0,11.0],[7.0,13.0,0.0,9.0,15.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,4.0,4.0,12.0,6.0,12.0],[5.0,6.0,5.0,11.0,13.0,11.0],[7.0,13.0,0.0,9.0,15.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,13.0,7.0,16.0,15.0,9.0],[4.0,4.0,4.0,12.0,6.0,12.0],[5.0,6.0,5.0,11.0,13.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,13.0,7.0,16.0,15.0,9.0],[4.0,4.0,4.0,12.0,6.0,12.0],[5.0,6.0,5.0,11.0,13.0,11.0]]}"}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/6.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/6.json
deleted file mode 100644
index 3b1de727ba..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/6.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.5,3.0,11.0,10.5,13.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.5,3.0,0.0,10.5,13.0,5.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[11.0,3.0,5.5,16.0,13.0,10.5]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,5.5,5.0,13.0,10.5]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/60.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/60.json
deleted file mode 100644
index 239e242dec..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/60.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,1.0,5.0,11.0,8.0,11.0],[6.0,8.0,6.0,10.0,10.0,10.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"hanging":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,11.0,7.0,11.0],[6.0,7.0,6.0,10.0,9.0,10.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/61.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/61.json
deleted file mode 100644
index 106dcd76c5..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/61.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,8.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"0"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,16.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,16.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"age":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/62.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/62.json
deleted file mode 100644
index 9244a62626..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/62.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,2.0],[0.0,0.0,2.0,2.0,16.0,16.0],[2.0,0.0,2.0,16.0,2.0,16.0],[2.0,2.0,14.0,16.0,16.0,16.0],[14.0,2.0,2.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"0"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,2.0],[0.0,0.0,2.0,2.0,16.0,16.0],[2.0,0.0,2.0,16.0,3.0,16.0],[2.0,3.0,14.0,16.0,16.0,16.0],[14.0,3.0,2.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,2.0],[0.0,0.0,2.0,2.0,16.0,16.0],[2.0,0.0,2.0,16.0,5.0,16.0],[2.0,5.0,14.0,16.0,16.0,16.0],[14.0,5.0,2.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,2.0],[0.0,0.0,2.0,2.0,16.0,16.0],[2.0,0.0,2.0,16.0,7.0,16.0],[2.0,7.0,14.0,16.0,16.0,16.0],[14.0,7.0,2.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,2.0],[0.0,0.0,2.0,2.0,16.0,16.0],[2.0,0.0,2.0,16.0,9.0,16.0],[2.0,9.0,14.0,16.0,16.0,16.0],[14.0,9.0,2.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"4"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,2.0],[0.0,0.0,2.0,2.0,16.0,16.0],[2.0,0.0,2.0,16.0,11.0,16.0],[2.0,11.0,14.0,16.0,16.0,16.0],[14.0,11.0,2.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"5"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,2.0],[0.0,0.0,2.0,2.0,16.0,16.0],[2.0,0.0,2.0,16.0,13.0,16.0],[2.0,13.0,14.0,16.0,16.0,16.0],[14.0,13.0,2.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"6"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,2.0],[0.0,0.0,2.0,2.0,16.0,16.0],[2.0,0.0,2.0,16.0,15.0,16.0],[2.0,15.0,14.0,16.0,16.0,16.0],[14.0,15.0,2.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"level":"7"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,2.0],[0.0,0.0,2.0,2.0,16.0,16.0],[2.0,0.0,2.0,16.0,15.0,16.0],[2.0,15.0,14.0,16.0,16.0,16.0],[14.0,15.0,2.0,16.0,16.0,16.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/63.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/63.json
deleted file mode 100644
index da12fbc180..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/63.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[7.0,0.0,7.0,9.0,6.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"candles":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,6.0,11.0,6.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"candles":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,6.0,10.0,6.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"candles":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,11.0,6.0,10.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/64.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/64.json
deleted file mode 100644
index 0d8d7ea199..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/64.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,9.0,13.0,13.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,7.0,13.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"east"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,0.0,13.0,13.0,7.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[9.0,3.0,3.0,16.0,13.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,7.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,9.0,3.0,13.0,16.0,13.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/65.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/65.json
deleted file mode 100644
index bce122c40a..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/65.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,11.0,13.0,13.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,5.0,13.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"east"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,0.0,13.0,13.0,5.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[11.0,3.0,3.0,16.0,13.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,5.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,11.0,3.0,13.0,16.0,13.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/66.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/66.json
deleted file mode 100644
index d2328c89ef..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/66.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,12.0,13.0,13.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,3.0,3.0,4.0,13.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"east"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,3.0,0.0,13.0,13.0,4.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[12.0,3.0,3.0,16.0,13.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,4.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,12.0,3.0,13.0,16.0,13.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/67.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/67.json
deleted file mode 100644
index d8a2cb991c..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/67.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,4.0,13.0,12.0,12.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,4.0,4.0,3.0,12.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"east"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,4.0,0.0,12.0,12.0,3.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[13.0,4.0,4.0,16.0,12.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,3.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"up"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,13.0,4.0,12.0,16.0,12.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/68.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/68.json
deleted file mode 100644
index eeb0f9a484..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/68.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,11.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"thickness":"tip_merge"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,11.0,11.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"thickness":"tip"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"thickness":"frustum"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"thickness":"middle"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,0.0,2.0,14.0,16.0,14.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"vertical_direction":"up"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,11.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"thickness":"tip_merge"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,5.0,5.0,11.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"thickness":"tip"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"thickness":"frustum"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,16.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"thickness":"middle"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,0.0,2.0,14.0,16.0,14.0]]}"}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/69.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/69.json
deleted file mode 100644
index 2ddb267e28..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/69.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,8.0,3.0,8.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"flower_amount":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,8.0,3.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"flower_amount":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,3.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"flower_amount":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,3.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[8.0,0.0,8.0,16.0,3.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"flower_amount":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[8.0,0.0,0.0,16.0,3.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"flower_amount":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,3.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"flower_amount":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,3.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,8.0,8.0,3.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"flower_amount":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,8.0,16.0,3.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"flower_amount":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,3.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"flower_amount":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,3.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[8.0,0.0,0.0,16.0,3.0,8.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"flower_amount":"1"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,3.0,8.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"flower_amount":"2"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,3.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"flower_amount":"3"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,3.0,16.0]]}"}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/7.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/7.json
deleted file mode 100644
index 08abcde37c..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/7.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[1.0,15.0,1.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0],[0.0,15.0,1.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,15.0,1.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,15.0,1.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[1.0,15.0,0.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,16.0,16.0],[0.0,15.0,0.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,15.0,0.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,15.0,0.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[15.0,0.0,0.0,16.0,16.0,16.0]]}"}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[1.0,15.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0],[0.0,15.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,15.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,15.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[1.0,15.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,16.0,16.0],[0.0,15.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,15.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,15.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"up":"true"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0]]}"}]}]}]}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/70.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/70.json
deleted file mode 100644
index c2562723b6..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/70.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,11.0,0.0,16.0,15.0,16.0],[5.0,0.0,9.0,11.0,15.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tilt":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,11.0,0.0,16.0,15.0,16.0],[5.0,0.0,9.0,11.0,15.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tilt":"unstable"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,11.0,0.0,16.0,13.0,16.0],[5.0,0.0,9.0,11.0,13.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tilt":"partial"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,9.0,11.0,13.0,15.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,11.0,0.0,16.0,15.0,16.0],[5.0,0.0,1.0,11.0,15.0,7.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tilt":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,11.0,0.0,16.0,15.0,16.0],[5.0,0.0,1.0,11.0,15.0,7.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tilt":"unstable"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,11.0,0.0,16.0,13.0,16.0],[5.0,0.0,1.0,11.0,13.0,7.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tilt":"partial"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,1.0,11.0,13.0,7.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,11.0,0.0,16.0,15.0,16.0],[9.0,0.0,5.0,15.0,15.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tilt":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,11.0,0.0,16.0,15.0,16.0],[9.0,0.0,5.0,15.0,15.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tilt":"unstable"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,11.0,0.0,16.0,13.0,16.0],[9.0,0.0,5.0,15.0,13.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tilt":"partial"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[9.0,0.0,5.0,15.0,13.0,11.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,11.0,0.0,16.0,15.0,16.0],[1.0,0.0,5.0,7.0,15.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tilt":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,11.0,0.0,16.0,15.0,16.0],[1.0,0.0,5.0,7.0,15.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tilt":"unstable"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,11.0,0.0,16.0,13.0,16.0],[1.0,0.0,5.0,7.0,13.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tilt":"partial"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,5.0,7.0,13.0,11.0]]}"}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/71.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/71.json
deleted file mode 100644
index 31ba382967..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/71.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,9.0,11.0,16.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,1.0,11.0,16.0,7.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[9.0,0.0,5.0,15.0,16.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,5.0,7.0,16.0,11.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/72.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/72.json
deleted file mode 100644
index 03ef0e426a..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/72.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"none"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0],[1.0,0.0,1.0,16.0,1.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"low"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"none"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0],[15.0,1.0,0.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[15.0,1.0,0.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[15.0,1.0,0.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,0.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,0.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,0.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,0.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,0.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,0.0,16.0,10.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"none"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0],[1.0,0.0,1.0,16.0,1.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"low"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,10.0,16.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"low"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0],[15.0,1.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[15.0,1.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[15.0,1.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,0.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"none"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0],[1.0,0.0,1.0,16.0,1.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"low"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,10.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,16.0,1.0,16.0],[0.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,1.0,16.0,1.0,16.0],[1.0,1.0,15.0,16.0,16.0,16.0],[15.0,1.0,1.0,16.0,16.0,16.0]]}"}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"bottom":"true"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0],[1.0,0.0,15.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"none"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,15.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,15.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0],[1.0,0.0,15.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0],[1.0,0.0,15.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"low"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,15.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"none"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[15.0,0.0,0.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0],[15.0,0.0,0.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[15.0,0.0,0.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,0.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0],[1.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,0.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,0.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,10.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"none"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0],[1.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"low"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,10.0,16.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"east":"low"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0],[1.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,0.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"none"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[15.0,0.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0],[15.0,0.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0],[1.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,10.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,1.0,16.0,16.0],[1.0,0.0,0.0,16.0,10.0,1.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0],[15.0,10.0,0.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"north":"low"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"none"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[1.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,10.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"south":"low"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"none"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,10.0,16.0],[0.0,10.0,15.0,16.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"west":"low"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,1.0],[0.0,0.0,1.0,1.0,16.0,16.0],[1.0,0.0,15.0,16.0,16.0,16.0],[15.0,0.0,1.0,16.0,16.0,16.0]]}"}]}]}]}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/73.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/73.json
deleted file mode 100644
index d01e1b6acb..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/73.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,2.0,1.0,15.0,16.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"tip":"true"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,16.0,15.0]]}"}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/8.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/8.json
deleted file mode 100644
index adb644daf0..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/8.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,8.0],[0.0,8.0,8.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"straight"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,8.0],[0.0,0.0,8.0,8.0,16.0,16.0],[8.0,8.0,8.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_left"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,8.0],[0.0,8.0,8.0,16.0,16.0,16.0],[8.0,0.0,8.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_right"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,8.0,16.0,8.0],[0.0,8.0,8.0,16.0,16.0,16.0],[8.0,8.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"outer_left"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,8.0,0.0,16.0,16.0,16.0],[8.0,0.0,0.0,16.0,16.0,8.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,8.0,16.0,16.0,16.0],[0.0,8.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"straight"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,8.0,16.0,16.0,16.0],[0.0,8.0,0.0,16.0,16.0,16.0],[8.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_left"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,8.0,16.0,16.0],[8.0,0.0,8.0,16.0,16.0,16.0],[8.0,8.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_right"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,8.0,0.0,16.0,16.0,16.0],[8.0,0.0,8.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"outer_left"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,8.0,8.0,16.0,16.0],[0.0,8.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,8.0,16.0,16.0],[8.0,8.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"straight"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,8.0,16.0,16.0],[8.0,0.0,8.0,16.0,16.0,16.0],[8.0,8.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_left"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,8.0],[0.0,0.0,8.0,8.0,16.0,16.0],[8.0,8.0,8.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_right"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,8.0,8.0,16.0,16.0],[0.0,8.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"outer_left"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,8.0,16.0,8.0],[0.0,8.0,8.0,16.0,16.0,16.0],[8.0,8.0,0.0,16.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,8.0,0.0,16.0,16.0,16.0],[8.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"straight"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,8.0],[0.0,8.0,8.0,16.0,16.0,16.0],[8.0,0.0,8.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_left"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,8.0,16.0,16.0,16.0],[0.0,8.0,0.0,16.0,16.0,16.0],[8.0,0.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_right"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,8.0,0.0,16.0,16.0,16.0],[8.0,0.0,0.0,16.0,16.0,8.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"outer_left"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,8.0,0.0,16.0,16.0,16.0],[8.0,0.0,8.0,16.0,16.0,16.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"half":"top"}}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,8.0],[0.0,0.0,8.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"straight"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,8.0],[0.0,0.0,8.0,8.0,16.0,16.0],[8.0,0.0,8.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_left"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,8.0],[0.0,0.0,8.0,16.0,8.0,16.0],[8.0,8.0,8.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_right"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,8.0,16.0,8.0],[0.0,0.0,8.0,16.0,8.0,16.0],[8.0,0.0,0.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"outer_left"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0],[8.0,8.0,0.0,16.0,16.0,8.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0],[0.0,8.0,8.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"straight"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0],[0.0,8.0,8.0,16.0,16.0,16.0],[8.0,8.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_left"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,8.0,16.0,16.0],[8.0,0.0,0.0,16.0,8.0,16.0],[8.0,8.0,8.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_right"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0],[8.0,8.0,8.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"outer_left"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0],[0.0,8.0,8.0,8.0,16.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,8.0,16.0,16.0],[8.0,0.0,0.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"straight"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,8.0,16.0,16.0],[8.0,0.0,0.0,16.0,8.0,16.0],[8.0,8.0,8.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_left"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,8.0],[0.0,0.0,8.0,8.0,16.0,16.0],[8.0,0.0,8.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_right"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0],[0.0,8.0,8.0,8.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"outer_left"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,8.0,16.0,8.0],[0.0,0.0,8.0,16.0,8.0,16.0],[8.0,0.0,0.0,16.0,8.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0],[8.0,8.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"straight"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,16.0,8.0],[0.0,0.0,8.0,16.0,8.0,16.0],[8.0,8.0,8.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_left"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0],[0.0,8.0,8.0,16.0,16.0,16.0],[8.0,8.0,0.0,16.0,16.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"inner_right"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0],[8.0,8.0,0.0,16.0,16.0,8.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"shape":"outer_left"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0],[8.0,8.0,8.0,16.0,16.0,16.0]]}"}]}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/9.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/9.json
deleted file mode 100644
index e97d9da734..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/9.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,14.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,14.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,14.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,14.0,15.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"type":"single"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,16.0,14.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,1.0,15.0,14.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,0.0,15.0,14.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,14.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"type":"left"}}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,1.0,15.0,14.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"north"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,16.0,14.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"south"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,14.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"state":{"facing":"west"}}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,0.0,15.0,14.0,15.0]]}"}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/get.json b/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/get.json
deleted file mode 100644
index 3f5b3b9610..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/loot_table/get_block/get.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,0.0,2.0,14.0,12.0,14.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_sapling","spruce_sapling","birch_sapling","jungle_sapling","acacia_sapling","cherry_sapling","dark_oak_sapling","pale_oak_sapling","seagrass"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/1","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["mangrove_propagule"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/2"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_sapling","spruce_sapling","birch_sapling","jungle_sapling","acacia_sapling","cherry_sapling","dark_oak_sapling","pale_oak_sapling","seagrass","mangrove_propagule","white_bed","orange_bed","magenta_bed","light_blue_bed","yellow_bed","lime_bed","pink_bed","gray_bed","light_gray_bed","cyan_bed","purple_bed","blue_bed","brown_bed","green_bed","red_bed","black_bed"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/3","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["powered_rail","detector_rail","activator_rail"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/4","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sticky_piston","piston"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,0.0,2.0,14.0,13.0,14.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_sapling","spruce_sapling","birch_sapling","jungle_sapling","acacia_sapling","cherry_sapling","dark_oak_sapling","pale_oak_sapling","seagrass","mangrove_propagule","white_bed","orange_bed","magenta_bed","light_blue_bed","yellow_bed","lime_bed","pink_bed","gray_bed","light_gray_bed","cyan_bed","purple_bed","blue_bed","brown_bed","green_bed","red_bed","black_bed","powered_rail","detector_rail","activator_rail","sticky_piston","piston","short_grass","fern","dead_bush","warped_roots","crimson_roots","small_dripleaf"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,0.0,2.0,14.0,16.0,14.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["tall_seagrass","sugar_cane"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/5","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["piston_head"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,11.0,10.0,11.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["tall_seagrass","sugar_cane","piston_head","dandelion","torchflower","poppy","blue_orchid","allium","azure_bluet","red_tulip","orange_tulip","white_tulip","pink_tulip","oxeye_daisy","cornflower","wither_rose","lily_of_the_valley"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,0.0,5.0,11.0,6.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brown_mushroom","red_mushroom","flower_pot","potted_torchflower","potted_oak_sapling","potted_spruce_sapling","potted_birch_sapling","potted_jungle_sapling","potted_acacia_sapling","potted_cherry_sapling","potted_dark_oak_sapling","potted_pale_oak_sapling","potted_mangrove_propagule","potted_fern","potted_dandelion","potted_poppy","potted_blue_orchid","potted_allium","potted_azure_bluet","potted_red_tulip","potted_orange_tulip","potted_white_tulip","potted_pink_tulip","potted_oxeye_daisy","potted_cornflower","potted_lily_of_the_valley","potted_wither_rose","potted_red_mushroom","potted_brown_mushroom","potted_dead_bush","potted_cactus","potted_bamboo","potted_crimson_fungus","potted_warped_fungus","potted_crimson_roots","potted_warped_roots","potted_azalea_bush","potted_flowering_azalea_bush"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[6.0,0.0,6.0,10.0,10.0,10.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brown_mushroom","red_mushroom","flower_pot","potted_torchflower","potted_oak_sapling","potted_spruce_sapling","potted_birch_sapling","potted_jungle_sapling","potted_acacia_sapling","potted_cherry_sapling","potted_dark_oak_sapling","potted_pale_oak_sapling","potted_mangrove_propagule","potted_fern","potted_dandelion","potted_poppy","potted_blue_orchid","potted_allium","potted_azure_bluet","potted_red_tulip","potted_orange_tulip","potted_white_tulip","potted_pink_tulip","potted_oxeye_daisy","potted_cornflower","potted_lily_of_the_valley","potted_wither_rose","potted_red_mushroom","potted_brown_mushroom","potted_dead_bush","potted_cactus","potted_bamboo","potted_crimson_fungus","potted_warped_fungus","potted_crimson_roots","potted_warped_roots","potted_azalea_bush","potted_flowering_azalea_bush","torch","redstone_torch","soul_torch"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/6","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["wall_torch","redstone_wall_torch","soul_wall_torch"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/7"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_sapling","spruce_sapling","birch_sapling","jungle_sapling","acacia_sapling","cherry_sapling","dark_oak_sapling","pale_oak_sapling","seagrass","mangrove_propagule","white_bed","orange_bed","magenta_bed","light_blue_bed","yellow_bed","lime_bed","pink_bed","gray_bed","light_gray_bed","cyan_bed","purple_bed","blue_bed","brown_bed","green_bed","red_bed","black_bed","powered_rail","detector_rail","activator_rail","sticky_piston","piston","short_grass","fern","dead_bush","warped_roots","crimson_roots","small_dripleaf","tall_seagrass","sugar_cane","piston_head","dandelion","torchflower","poppy","blue_orchid","allium","azure_bluet","red_tulip","orange_tulip","white_tulip","pink_tulip","oxeye_daisy","cornflower","wither_rose","lily_of_the_valley","brown_mushroom","red_mushroom","flower_pot","potted_torchflower","potted_oak_sapling","potted_spruce_sapling","potted_birch_sapling","potted_jungle_sapling","potted_acacia_sapling","potted_cherry_sapling","potted_dark_oak_sapling","potted_pale_oak_sapling","potted_mangrove_propagule","potted_fern","potted_dandelion","potted_poppy","potted_blue_orchid","potted_allium","potted_azure_bluet","potted_red_tulip","potted_orange_tulip","potted_white_tulip","potted_pink_tulip","potted_oxeye_daisy","potted_cornflower","potted_lily_of_the_valley","potted_wither_rose","potted_red_mushroom","potted_brown_mushroom","potted_dead_bush","potted_cactus","potted_bamboo","potted_crimson_fungus","potted_warped_fungus","potted_crimson_roots","potted_warped_roots","potted_azalea_bush","potted_flowering_azalea_bush","torch","redstone_torch","soul_torch","wall_torch","redstone_wall_torch","soul_wall_torch","fire"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["soul_fire","white_carpet","orange_carpet","magenta_carpet","light_blue_carpet","yellow_carpet","lime_carpet","pink_carpet","gray_carpet","light_gray_carpet","cyan_carpet","purple_carpet","blue_carpet","brown_carpet","green_carpet","red_carpet","black_carpet","moss_carpet"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/8","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_stairs","cobblestone_stairs","brick_stairs","stone_brick_stairs","mud_brick_stairs","nether_brick_stairs","sandstone_stairs","spruce_stairs","birch_stairs","jungle_stairs","quartz_stairs","acacia_stairs","cherry_stairs","dark_oak_stairs","pale_oak_stairs","mangrove_stairs","bamboo_stairs","bamboo_mosaic_stairs","prismarine_stairs","prismarine_brick_stairs","dark_prismarine_stairs","red_sandstone_stairs","purpur_stairs","polished_granite_stairs","smooth_red_sandstone_stairs","mossy_stone_brick_stairs","polished_diorite_stairs","mossy_cobblestone_stairs","end_stone_brick_stairs","stone_stairs","smooth_sandstone_stairs","smooth_quartz_stairs","granite_stairs","andesite_stairs","red_nether_brick_stairs","polished_andesite_stairs","diorite_stairs","crimson_stairs","warped_stairs","blackstone_stairs","polished_blackstone_brick_stairs","polished_blackstone_stairs","tuff_stairs","polished_tuff_stairs","tuff_brick_stairs","oxidized_cut_copper_stairs","weathered_cut_copper_stairs","exposed_cut_copper_stairs","cut_copper_stairs","waxed_oxidized_cut_copper_stairs","waxed_weathered_cut_copper_stairs","waxed_exposed_cut_copper_stairs","waxed_cut_copper_stairs","cobbled_deepslate_stairs","polished_deepslate_stairs","deepslate_tile_stairs","deepslate_brick_stairs"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/9"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["soul_fire","white_carpet","orange_carpet","magenta_carpet","light_blue_carpet","yellow_carpet","lime_carpet","pink_carpet","gray_carpet","light_gray_carpet","cyan_carpet","purple_carpet","blue_carpet","brown_carpet","green_carpet","red_carpet","black_carpet","moss_carpet","oak_stairs","cobblestone_stairs","brick_stairs","stone_brick_stairs","mud_brick_stairs","nether_brick_stairs","sandstone_stairs","spruce_stairs","birch_stairs","jungle_stairs","quartz_stairs","acacia_stairs","cherry_stairs","dark_oak_stairs","pale_oak_stairs","mangrove_stairs","bamboo_stairs","bamboo_mosaic_stairs","prismarine_stairs","prismarine_brick_stairs","dark_prismarine_stairs","red_sandstone_stairs","purpur_stairs","polished_granite_stairs","smooth_red_sandstone_stairs","mossy_stone_brick_stairs","polished_diorite_stairs","mossy_cobblestone_stairs","end_stone_brick_stairs","stone_stairs","smooth_sandstone_stairs","smooth_quartz_stairs","granite_stairs","andesite_stairs","red_nether_brick_stairs","polished_andesite_stairs","diorite_stairs","crimson_stairs","warped_stairs","blackstone_stairs","polished_blackstone_brick_stairs","polished_blackstone_stairs","tuff_stairs","polished_tuff_stairs","tuff_brick_stairs","oxidized_cut_copper_stairs","weathered_cut_copper_stairs","exposed_cut_copper_stairs","cut_copper_stairs","waxed_oxidized_cut_copper_stairs","waxed_weathered_cut_copper_stairs","waxed_exposed_cut_copper_stairs","waxed_cut_copper_stairs","cobbled_deepslate_stairs","polished_deepslate_stairs","deepslate_tile_stairs","deepslate_brick_stairs","chest","trapped_chest"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/10","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["redstone_wire"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/11"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["redstone_wire","wheat"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,15.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["farmland","dirt_path"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,16.0,12.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["soul_fire","white_carpet","orange_carpet","magenta_carpet","light_blue_carpet","yellow_carpet","lime_carpet","pink_carpet","gray_carpet","light_gray_carpet","cyan_carpet","purple_carpet","blue_carpet","brown_carpet","green_carpet","red_carpet","black_carpet","moss_carpet","oak_stairs","cobblestone_stairs","brick_stairs","stone_brick_stairs","mud_brick_stairs","nether_brick_stairs","sandstone_stairs","spruce_stairs","birch_stairs","jungle_stairs","quartz_stairs","acacia_stairs","cherry_stairs","dark_oak_stairs","pale_oak_stairs","mangrove_stairs","bamboo_stairs","bamboo_mosaic_stairs","prismarine_stairs","prismarine_brick_stairs","dark_prismarine_stairs","red_sandstone_stairs","purpur_stairs","polished_granite_stairs","smooth_red_sandstone_stairs","mossy_stone_brick_stairs","polished_diorite_stairs","mossy_cobblestone_stairs","end_stone_brick_stairs","stone_stairs","smooth_sandstone_stairs","smooth_quartz_stairs","granite_stairs","andesite_stairs","red_nether_brick_stairs","polished_andesite_stairs","diorite_stairs","crimson_stairs","warped_stairs","blackstone_stairs","polished_blackstone_brick_stairs","polished_blackstone_stairs","tuff_stairs","polished_tuff_stairs","tuff_brick_stairs","oxidized_cut_copper_stairs","weathered_cut_copper_stairs","exposed_cut_copper_stairs","cut_copper_stairs","waxed_oxidized_cut_copper_stairs","waxed_weathered_cut_copper_stairs","waxed_exposed_cut_copper_stairs","waxed_cut_copper_stairs","cobbled_deepslate_stairs","polished_deepslate_stairs","deepslate_tile_stairs","deepslate_brick_stairs","chest","trapped_chest","redstone_wire","wheat","farmland","dirt_path","oak_sign","spruce_sign","birch_sign","acacia_sign","cherry_sign","jungle_sign","dark_oak_sign","pale_oak_sign","mangrove_sign","bamboo_sign","white_banner","orange_banner","magenta_banner","light_blue_banner","yellow_banner","lime_banner","pink_banner","gray_banner","light_gray_banner","cyan_banner","purple_banner","blue_banner","brown_banner","green_banner","red_banner","black_banner","twisting_vines_plant","crimson_sign","warped_sign"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/12","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_door","iron_door","spruce_door","birch_door","jungle_door","acacia_door","cherry_door","dark_oak_door","pale_oak_door","mangrove_door","bamboo_door","crimson_door","warped_door","copper_door","exposed_copper_door","oxidized_copper_door","weathered_copper_door","waxed_copper_door","waxed_exposed_copper_door","waxed_oxidized_copper_door","waxed_weathered_copper_door"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/13","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["ladder"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/14"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_door","iron_door","spruce_door","birch_door","jungle_door","acacia_door","cherry_door","dark_oak_door","pale_oak_door","mangrove_door","bamboo_door","crimson_door","warped_door","copper_door","exposed_copper_door","oxidized_copper_door","weathered_copper_door","waxed_copper_door","waxed_exposed_copper_door","waxed_oxidized_copper_door","waxed_weathered_copper_door","ladder","rail"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/15","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_wall_sign","spruce_wall_sign","birch_wall_sign","acacia_wall_sign","cherry_wall_sign","jungle_wall_sign","dark_oak_wall_sign","pale_oak_wall_sign","mangrove_wall_sign","bamboo_wall_sign","crimson_wall_sign","warped_wall_sign"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/16"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_wall_sign","spruce_wall_sign","birch_wall_sign","acacia_wall_sign","cherry_wall_sign","jungle_wall_sign","dark_oak_wall_sign","pale_oak_wall_sign","mangrove_wall_sign","bamboo_wall_sign","crimson_wall_sign","warped_wall_sign","oak_hanging_sign","spruce_hanging_sign","birch_hanging_sign","acacia_hanging_sign","cherry_hanging_sign","jungle_hanging_sign","dark_oak_hanging_sign","pale_oak_hanging_sign","crimson_hanging_sign","warped_hanging_sign","mangrove_hanging_sign","bamboo_hanging_sign"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/17","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_wall_hanging_sign","spruce_wall_hanging_sign","birch_wall_hanging_sign","acacia_wall_hanging_sign","cherry_wall_hanging_sign","jungle_wall_hanging_sign","dark_oak_wall_hanging_sign","pale_oak_wall_hanging_sign","mangrove_wall_hanging_sign","crimson_wall_hanging_sign","warped_wall_hanging_sign","bamboo_wall_hanging_sign"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/18"}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_sapling","spruce_sapling","birch_sapling","jungle_sapling","acacia_sapling","cherry_sapling","dark_oak_sapling","pale_oak_sapling","seagrass","mangrove_propagule","white_bed","orange_bed","magenta_bed","light_blue_bed","yellow_bed","lime_bed","pink_bed","gray_bed","light_gray_bed","cyan_bed","purple_bed","blue_bed","brown_bed","green_bed","red_bed","black_bed","powered_rail","detector_rail","activator_rail","sticky_piston","piston","short_grass","fern","dead_bush","warped_roots","crimson_roots","small_dripleaf","tall_seagrass","sugar_cane","piston_head","dandelion","torchflower","poppy","blue_orchid","allium","azure_bluet","red_tulip","orange_tulip","white_tulip","pink_tulip","oxeye_daisy","cornflower","wither_rose","lily_of_the_valley","brown_mushroom","red_mushroom","flower_pot","potted_torchflower","potted_oak_sapling","potted_spruce_sapling","potted_birch_sapling","potted_jungle_sapling","potted_acacia_sapling","potted_cherry_sapling","potted_dark_oak_sapling","potted_pale_oak_sapling","potted_mangrove_propagule","potted_fern","potted_dandelion","potted_poppy","potted_blue_orchid","potted_allium","potted_azure_bluet","potted_red_tulip","potted_orange_tulip","potted_white_tulip","potted_pink_tulip","potted_oxeye_daisy","potted_cornflower","potted_lily_of_the_valley","potted_wither_rose","potted_red_mushroom","potted_brown_mushroom","potted_dead_bush","potted_cactus","potted_bamboo","potted_crimson_fungus","potted_warped_fungus","potted_crimson_roots","potted_warped_roots","potted_azalea_bush","potted_flowering_azalea_bush","torch","redstone_torch","soul_torch","wall_torch","redstone_wall_torch","soul_wall_torch","fire","soul_fire","white_carpet","orange_carpet","magenta_carpet","light_blue_carpet","yellow_carpet","lime_carpet","pink_carpet","gray_carpet","light_gray_carpet","cyan_carpet","purple_carpet","blue_carpet","brown_carpet","green_carpet","red_carpet","black_carpet","moss_carpet","oak_stairs","cobblestone_stairs","brick_stairs","stone_brick_stairs","mud_brick_stairs","nether_brick_stairs","sandstone_stairs","spruce_stairs","birch_stairs","jungle_stairs","quartz_stairs","acacia_stairs","cherry_stairs","dark_oak_stairs","pale_oak_stairs","mangrove_stairs","bamboo_stairs","bamboo_mosaic_stairs","prismarine_stairs","prismarine_brick_stairs","dark_prismarine_stairs","red_sandstone_stairs","purpur_stairs","polished_granite_stairs","smooth_red_sandstone_stairs","mossy_stone_brick_stairs","polished_diorite_stairs","mossy_cobblestone_stairs","end_stone_brick_stairs","stone_stairs","smooth_sandstone_stairs","smooth_quartz_stairs","granite_stairs","andesite_stairs","red_nether_brick_stairs","polished_andesite_stairs","diorite_stairs","crimson_stairs","warped_stairs","blackstone_stairs","polished_blackstone_brick_stairs","polished_blackstone_stairs","tuff_stairs","polished_tuff_stairs","tuff_brick_stairs","oxidized_cut_copper_stairs","weathered_cut_copper_stairs","exposed_cut_copper_stairs","cut_copper_stairs","waxed_oxidized_cut_copper_stairs","waxed_weathered_cut_copper_stairs","waxed_exposed_cut_copper_stairs","waxed_cut_copper_stairs","cobbled_deepslate_stairs","polished_deepslate_stairs","deepslate_tile_stairs","deepslate_brick_stairs","chest","trapped_chest","redstone_wire","wheat","farmland","dirt_path","oak_sign","spruce_sign","birch_sign","acacia_sign","cherry_sign","jungle_sign","dark_oak_sign","pale_oak_sign","mangrove_sign","bamboo_sign","white_banner","orange_banner","magenta_banner","light_blue_banner","yellow_banner","lime_banner","pink_banner","gray_banner","light_gray_banner","cyan_banner","purple_banner","blue_banner","brown_banner","green_banner","red_banner","black_banner","twisting_vines_plant","crimson_sign","warped_sign","oak_door","iron_door","spruce_door","birch_door","jungle_door","acacia_door","cherry_door","dark_oak_door","pale_oak_door","mangrove_door","bamboo_door","crimson_door","warped_door","copper_door","exposed_copper_door","oxidized_copper_door","weathered_copper_door","waxed_copper_door","waxed_exposed_copper_door","waxed_oxidized_copper_door","waxed_weathered_copper_door","ladder","rail","oak_wall_sign","spruce_wall_sign","birch_wall_sign","acacia_wall_sign","cherry_wall_sign","jungle_wall_sign","dark_oak_wall_sign","pale_oak_wall_sign","mangrove_wall_sign","bamboo_wall_sign","crimson_wall_sign","warped_wall_sign","oak_hanging_sign","spruce_hanging_sign","birch_hanging_sign","acacia_hanging_sign","cherry_hanging_sign","jungle_hanging_sign","dark_oak_hanging_sign","pale_oak_hanging_sign","crimson_hanging_sign","warped_hanging_sign","mangrove_hanging_sign","bamboo_hanging_sign","oak_wall_hanging_sign","spruce_wall_hanging_sign","birch_wall_hanging_sign","acacia_wall_hanging_sign","cherry_wall_hanging_sign","jungle_wall_hanging_sign","dark_oak_wall_hanging_sign","pale_oak_wall_hanging_sign","mangrove_wall_hanging_sign","crimson_wall_hanging_sign","warped_wall_hanging_sign","bamboo_wall_hanging_sign","lever"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/19","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stone_pressure_plate","oak_pressure_plate","spruce_pressure_plate","birch_pressure_plate","jungle_pressure_plate","acacia_pressure_plate","cherry_pressure_plate","dark_oak_pressure_plate","pale_oak_pressure_plate","mangrove_pressure_plate","bamboo_pressure_plate","crimson_pressure_plate","warped_pressure_plate","polished_blackstone_pressure_plate"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/20","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stone_button","oak_button","spruce_button","birch_button","jungle_button","acacia_button","cherry_button","dark_oak_button","pale_oak_button","mangrove_button","bamboo_button","crimson_button","warped_button","polished_blackstone_button"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/21"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stone_pressure_plate","oak_pressure_plate","spruce_pressure_plate","birch_pressure_plate","jungle_pressure_plate","acacia_pressure_plate","cherry_pressure_plate","dark_oak_pressure_plate","pale_oak_pressure_plate","mangrove_pressure_plate","bamboo_pressure_plate","crimson_pressure_plate","warped_pressure_plate","polished_blackstone_pressure_plate","stone_button","oak_button","spruce_button","birch_button","jungle_button","acacia_button","cherry_button","dark_oak_button","pale_oak_button","mangrove_button","bamboo_button","crimson_button","warped_button","polished_blackstone_button","snow"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,16.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cactus","dragon_egg","weeping_vines_plant","cave_vines","cave_vines_plant","decorated_pot"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/22"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["cactus","dragon_egg","weeping_vines_plant","cave_vines","cave_vines_plant","decorated_pot","oak_fence","nether_brick_fence","spruce_fence","birch_fence","jungle_fence","acacia_fence","cherry_fence","dark_oak_fence","pale_oak_fence","mangrove_fence","bamboo_fence","crimson_fence","warped_fence"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/23","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_portal"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/24"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stone_pressure_plate","oak_pressure_plate","spruce_pressure_plate","birch_pressure_plate","jungle_pressure_plate","acacia_pressure_plate","cherry_pressure_plate","dark_oak_pressure_plate","pale_oak_pressure_plate","mangrove_pressure_plate","bamboo_pressure_plate","crimson_pressure_plate","warped_pressure_plate","polished_blackstone_pressure_plate","stone_button","oak_button","spruce_button","birch_button","jungle_button","acacia_button","cherry_button","dark_oak_button","pale_oak_button","mangrove_button","bamboo_button","crimson_button","warped_button","polished_blackstone_button","snow","cactus","dragon_egg","weeping_vines_plant","cave_vines","cave_vines_plant","decorated_pot","oak_fence","nether_brick_fence","spruce_fence","birch_fence","jungle_fence","acacia_fence","cherry_fence","dark_oak_fence","pale_oak_fence","mangrove_fence","bamboo_fence","crimson_fence","warped_fence","nether_portal","cake"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,2.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["repeater","comparator"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/25","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_trapdoor","spruce_trapdoor","birch_trapdoor","jungle_trapdoor","acacia_trapdoor","cherry_trapdoor","dark_oak_trapdoor","pale_oak_trapdoor","mangrove_trapdoor","bamboo_trapdoor","iron_trapdoor","crimson_trapdoor","warped_trapdoor","copper_trapdoor","exposed_copper_trapdoor","oxidized_copper_trapdoor","weathered_copper_trapdoor","waxed_copper_trapdoor","waxed_exposed_copper_trapdoor","waxed_oxidized_copper_trapdoor","waxed_weathered_copper_trapdoor"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/26"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["repeater","comparator","oak_trapdoor","spruce_trapdoor","birch_trapdoor","jungle_trapdoor","acacia_trapdoor","cherry_trapdoor","dark_oak_trapdoor","pale_oak_trapdoor","mangrove_trapdoor","bamboo_trapdoor","iron_trapdoor","crimson_trapdoor","warped_trapdoor","copper_trapdoor","exposed_copper_trapdoor","oxidized_copper_trapdoor","weathered_copper_trapdoor","waxed_copper_trapdoor","waxed_exposed_copper_trapdoor","waxed_oxidized_copper_trapdoor","waxed_weathered_copper_trapdoor","iron_bars","glass_pane","white_stained_glass_pane","orange_stained_glass_pane","magenta_stained_glass_pane","light_blue_stained_glass_pane","yellow_stained_glass_pane","lime_stained_glass_pane","pink_stained_glass_pane","gray_stained_glass_pane","light_gray_stained_glass_pane","cyan_stained_glass_pane","purple_stained_glass_pane","blue_stained_glass_pane","brown_stained_glass_pane","green_stained_glass_pane","red_stained_glass_pane","black_stained_glass_pane"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/27","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["chain"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/28"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["chain","attached_pumpkin_stem","attached_melon_stem"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/29","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pumpkin_stem","melon_stem"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/30"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["stone_pressure_plate","oak_pressure_plate","spruce_pressure_plate","birch_pressure_plate","jungle_pressure_plate","acacia_pressure_plate","cherry_pressure_plate","dark_oak_pressure_plate","pale_oak_pressure_plate","mangrove_pressure_plate","bamboo_pressure_plate","crimson_pressure_plate","warped_pressure_plate","polished_blackstone_pressure_plate","stone_button","oak_button","spruce_button","birch_button","jungle_button","acacia_button","cherry_button","dark_oak_button","pale_oak_button","mangrove_button","bamboo_button","crimson_button","warped_button","polished_blackstone_button","snow","cactus","dragon_egg","weeping_vines_plant","cave_vines","cave_vines_plant","decorated_pot","oak_fence","nether_brick_fence","spruce_fence","birch_fence","jungle_fence","acacia_fence","cherry_fence","dark_oak_fence","pale_oak_fence","mangrove_fence","bamboo_fence","crimson_fence","warped_fence","nether_portal","cake","repeater","comparator","oak_trapdoor","spruce_trapdoor","birch_trapdoor","jungle_trapdoor","acacia_trapdoor","cherry_trapdoor","dark_oak_trapdoor","pale_oak_trapdoor","mangrove_trapdoor","bamboo_trapdoor","iron_trapdoor","crimson_trapdoor","warped_trapdoor","copper_trapdoor","exposed_copper_trapdoor","oxidized_copper_trapdoor","weathered_copper_trapdoor","waxed_copper_trapdoor","waxed_exposed_copper_trapdoor","waxed_oxidized_copper_trapdoor","waxed_weathered_copper_trapdoor","iron_bars","glass_pane","white_stained_glass_pane","orange_stained_glass_pane","magenta_stained_glass_pane","light_blue_stained_glass_pane","yellow_stained_glass_pane","lime_stained_glass_pane","pink_stained_glass_pane","gray_stained_glass_pane","light_gray_stained_glass_pane","cyan_stained_glass_pane","purple_stained_glass_pane","blue_stained_glass_pane","brown_stained_glass_pane","green_stained_glass_pane","red_stained_glass_pane","black_stained_glass_pane","chain","attached_pumpkin_stem","attached_melon_stem","pumpkin_stem","melon_stem","vine"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/31","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["glow_lichen","sculk_vein"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/32","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_fence_gate","spruce_fence_gate","birch_fence_gate","jungle_fence_gate","acacia_fence_gate","cherry_fence_gate","dark_oak_fence_gate","pale_oak_fence_gate","mangrove_fence_gate","bamboo_fence_gate","crimson_fence_gate","warped_fence_gate"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,1.5,15.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["glow_lichen","sculk_vein","oak_fence_gate","spruce_fence_gate","birch_fence_gate","jungle_fence_gate","acacia_fence_gate","cherry_fence_gate","dark_oak_fence_gate","pale_oak_fence_gate","mangrove_fence_gate","bamboo_fence_gate","crimson_fence_gate","warped_fence_gate","lily_pad"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/33","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_wart"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,12.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_wart","enchanting_table"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,2.0,15.0],[7.0,2.0,7.0,9.0,14.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["brewing_stand"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,4.0,16.0,2.0],[0.0,0.0,2.0,2.0,16.0,4.0],[0.0,0.0,12.0,2.0,16.0,16.0],[0.0,3.0,4.0,2.0,16.0,16.0],[2.0,0.0,14.0,4.0,16.0,16.0],[2.0,3.0,2.0,16.0,4.0,16.0],[4.0,3.0,0.0,16.0,16.0,2.0],[4.0,4.0,14.0,16.0,16.0,16.0],[12.0,0.0,0.0,16.0,16.0,2.0],[12.0,0.0,14.0,16.0,16.0,16.0],[14.0,0.0,2.0,16.0,16.0,4.0],[14.0,0.0,12.0,16.0,16.0,16.0],[14.0,4.0,4.0,16.0,16.0,16.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["glow_lichen","sculk_vein","oak_fence_gate","spruce_fence_gate","birch_fence_gate","jungle_fence_gate","acacia_fence_gate","cherry_fence_gate","dark_oak_fence_gate","pale_oak_fence_gate","mangrove_fence_gate","bamboo_fence_gate","crimson_fence_gate","warped_fence_gate","lily_pad","nether_wart","enchanting_table","brewing_stand","cauldron","water_cauldron","lava_cauldron","powder_snow_cauldron"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,6.0,0.0,16.0,12.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["end_portal"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/34","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["end_portal_frame"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/35"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["end_portal","end_portal_frame","cocoa"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,14.0,15.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["ender_chest"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/36"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["ender_chest","tripwire_hook"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/37","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["tripwire"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/38"}]}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["oak_sapling","spruce_sapling","birch_sapling","jungle_sapling","acacia_sapling","cherry_sapling","dark_oak_sapling","pale_oak_sapling","seagrass","mangrove_propagule","white_bed","orange_bed","magenta_bed","light_blue_bed","yellow_bed","lime_bed","pink_bed","gray_bed","light_gray_bed","cyan_bed","purple_bed","blue_bed","brown_bed","green_bed","red_bed","black_bed","powered_rail","detector_rail","activator_rail","sticky_piston","piston","short_grass","fern","dead_bush","warped_roots","crimson_roots","small_dripleaf","tall_seagrass","sugar_cane","piston_head","dandelion","torchflower","poppy","blue_orchid","allium","azure_bluet","red_tulip","orange_tulip","white_tulip","pink_tulip","oxeye_daisy","cornflower","wither_rose","lily_of_the_valley","brown_mushroom","red_mushroom","flower_pot","potted_torchflower","potted_oak_sapling","potted_spruce_sapling","potted_birch_sapling","potted_jungle_sapling","potted_acacia_sapling","potted_cherry_sapling","potted_dark_oak_sapling","potted_pale_oak_sapling","potted_mangrove_propagule","potted_fern","potted_dandelion","potted_poppy","potted_blue_orchid","potted_allium","potted_azure_bluet","potted_red_tulip","potted_orange_tulip","potted_white_tulip","potted_pink_tulip","potted_oxeye_daisy","potted_cornflower","potted_lily_of_the_valley","potted_wither_rose","potted_red_mushroom","potted_brown_mushroom","potted_dead_bush","potted_cactus","potted_bamboo","potted_crimson_fungus","potted_warped_fungus","potted_crimson_roots","potted_warped_roots","potted_azalea_bush","potted_flowering_azalea_bush","torch","redstone_torch","soul_torch","wall_torch","redstone_wall_torch","soul_wall_torch","fire","soul_fire","white_carpet","orange_carpet","magenta_carpet","light_blue_carpet","yellow_carpet","lime_carpet","pink_carpet","gray_carpet","light_gray_carpet","cyan_carpet","purple_carpet","blue_carpet","brown_carpet","green_carpet","red_carpet","black_carpet","moss_carpet","oak_stairs","cobblestone_stairs","brick_stairs","stone_brick_stairs","mud_brick_stairs","nether_brick_stairs","sandstone_stairs","spruce_stairs","birch_stairs","jungle_stairs","quartz_stairs","acacia_stairs","cherry_stairs","dark_oak_stairs","pale_oak_stairs","mangrove_stairs","bamboo_stairs","bamboo_mosaic_stairs","prismarine_stairs","prismarine_brick_stairs","dark_prismarine_stairs","red_sandstone_stairs","purpur_stairs","polished_granite_stairs","smooth_red_sandstone_stairs","mossy_stone_brick_stairs","polished_diorite_stairs","mossy_cobblestone_stairs","end_stone_brick_stairs","stone_stairs","smooth_sandstone_stairs","smooth_quartz_stairs","granite_stairs","andesite_stairs","red_nether_brick_stairs","polished_andesite_stairs","diorite_stairs","crimson_stairs","warped_stairs","blackstone_stairs","polished_blackstone_brick_stairs","polished_blackstone_stairs","tuff_stairs","polished_tuff_stairs","tuff_brick_stairs","oxidized_cut_copper_stairs","weathered_cut_copper_stairs","exposed_cut_copper_stairs","cut_copper_stairs","waxed_oxidized_cut_copper_stairs","waxed_weathered_cut_copper_stairs","waxed_exposed_cut_copper_stairs","waxed_cut_copper_stairs","cobbled_deepslate_stairs","polished_deepslate_stairs","deepslate_tile_stairs","deepslate_brick_stairs","chest","trapped_chest","redstone_wire","wheat","farmland","dirt_path","oak_sign","spruce_sign","birch_sign","acacia_sign","cherry_sign","jungle_sign","dark_oak_sign","pale_oak_sign","mangrove_sign","bamboo_sign","white_banner","orange_banner","magenta_banner","light_blue_banner","yellow_banner","lime_banner","pink_banner","gray_banner","light_gray_banner","cyan_banner","purple_banner","blue_banner","brown_banner","green_banner","red_banner","black_banner","twisting_vines_plant","crimson_sign","warped_sign","oak_door","iron_door","spruce_door","birch_door","jungle_door","acacia_door","cherry_door","dark_oak_door","pale_oak_door","mangrove_door","bamboo_door","crimson_door","warped_door","copper_door","exposed_copper_door","oxidized_copper_door","weathered_copper_door","waxed_copper_door","waxed_exposed_copper_door","waxed_oxidized_copper_door","waxed_weathered_copper_door","ladder","rail","oak_wall_sign","spruce_wall_sign","birch_wall_sign","acacia_wall_sign","cherry_wall_sign","jungle_wall_sign","dark_oak_wall_sign","pale_oak_wall_sign","mangrove_wall_sign","bamboo_wall_sign","crimson_wall_sign","warped_wall_sign","oak_hanging_sign","spruce_hanging_sign","birch_hanging_sign","acacia_hanging_sign","cherry_hanging_sign","jungle_hanging_sign","dark_oak_hanging_sign","pale_oak_hanging_sign","crimson_hanging_sign","warped_hanging_sign","mangrove_hanging_sign","bamboo_hanging_sign","oak_wall_hanging_sign","spruce_wall_hanging_sign","birch_wall_hanging_sign","acacia_wall_hanging_sign","cherry_wall_hanging_sign","jungle_wall_hanging_sign","dark_oak_wall_hanging_sign","pale_oak_wall_hanging_sign","mangrove_wall_hanging_sign","crimson_wall_hanging_sign","warped_wall_hanging_sign","bamboo_wall_hanging_sign","lever","stone_pressure_plate","oak_pressure_plate","spruce_pressure_plate","birch_pressure_plate","jungle_pressure_plate","acacia_pressure_plate","cherry_pressure_plate","dark_oak_pressure_plate","pale_oak_pressure_plate","mangrove_pressure_plate","bamboo_pressure_plate","crimson_pressure_plate","warped_pressure_plate","polished_blackstone_pressure_plate","stone_button","oak_button","spruce_button","birch_button","jungle_button","acacia_button","cherry_button","dark_oak_button","pale_oak_button","mangrove_button","bamboo_button","crimson_button","warped_button","polished_blackstone_button","snow","cactus","dragon_egg","weeping_vines_plant","cave_vines","cave_vines_plant","decorated_pot","oak_fence","nether_brick_fence","spruce_fence","birch_fence","jungle_fence","acacia_fence","cherry_fence","dark_oak_fence","pale_oak_fence","mangrove_fence","bamboo_fence","crimson_fence","warped_fence","nether_portal","cake","repeater","comparator","oak_trapdoor","spruce_trapdoor","birch_trapdoor","jungle_trapdoor","acacia_trapdoor","cherry_trapdoor","dark_oak_trapdoor","pale_oak_trapdoor","mangrove_trapdoor","bamboo_trapdoor","iron_trapdoor","crimson_trapdoor","warped_trapdoor","copper_trapdoor","exposed_copper_trapdoor","oxidized_copper_trapdoor","weathered_copper_trapdoor","waxed_copper_trapdoor","waxed_exposed_copper_trapdoor","waxed_oxidized_copper_trapdoor","waxed_weathered_copper_trapdoor","iron_bars","glass_pane","white_stained_glass_pane","orange_stained_glass_pane","magenta_stained_glass_pane","light_blue_stained_glass_pane","yellow_stained_glass_pane","lime_stained_glass_pane","pink_stained_glass_pane","gray_stained_glass_pane","light_gray_stained_glass_pane","cyan_stained_glass_pane","purple_stained_glass_pane","blue_stained_glass_pane","brown_stained_glass_pane","green_stained_glass_pane","red_stained_glass_pane","black_stained_glass_pane","chain","attached_pumpkin_stem","attached_melon_stem","pumpkin_stem","melon_stem","vine","glow_lichen","sculk_vein","oak_fence_gate","spruce_fence_gate","birch_fence_gate","jungle_fence_gate","acacia_fence_gate","cherry_fence_gate","dark_oak_fence_gate","pale_oak_fence_gate","mangrove_fence_gate","bamboo_fence_gate","crimson_fence_gate","warped_fence_gate","lily_pad","nether_wart","enchanting_table","brewing_stand","cauldron","water_cauldron","lava_cauldron","powder_snow_cauldron","end_portal","end_portal_frame","cocoa","ender_chest","tripwire_hook","tripwire","cobblestone_wall","mossy_cobblestone_wall","brick_wall","prismarine_wall","red_sandstone_wall","mossy_stone_brick_wall","granite_wall","stone_brick_wall","mud_brick_wall","nether_brick_wall","andesite_wall","red_nether_brick_wall","sandstone_wall","end_stone_brick_wall","diorite_wall","blackstone_wall","polished_blackstone_brick_wall","polished_blackstone_wall","tuff_wall","polished_tuff_wall","tuff_brick_wall","cobbled_deepslate_wall","polished_deepslate_wall","deepslate_tile_wall","deepslate_brick_wall"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/39","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["carrots","potatoes"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,8.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["skeleton_skull","wither_skeleton_skull","zombie_head","player_head","creeper_head","dragon_head","heavy_core"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/40"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["carrots","potatoes","skeleton_skull","wither_skeleton_skull","zombie_head","player_head","creeper_head","dragon_head","heavy_core","skeleton_wall_skull","wither_skeleton_wall_skull","zombie_wall_head","player_wall_head","creeper_wall_head","dragon_wall_head"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[3.0,0.0,3.0,13.0,8.0,13.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["piglin_head"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/41","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["piglin_wall_head"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/42"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["carrots","potatoes","skeleton_skull","wither_skeleton_skull","zombie_head","player_head","creeper_head","dragon_head","heavy_core","skeleton_wall_skull","wither_skeleton_wall_skull","zombie_wall_head","player_wall_head","creeper_wall_head","dragon_wall_head","piglin_head","piglin_wall_head","anvil","chipped_anvil","damaged_anvil"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/43","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_weighted_pressure_plate","heavy_weighted_pressure_plate"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,6.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["daylight_detector"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/44"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["light_weighted_pressure_plate","heavy_weighted_pressure_plate","daylight_detector","hopper"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/45","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["prismarine_slab","prismarine_brick_slab","dark_prismarine_slab","oak_slab","spruce_slab","birch_slab","jungle_slab","acacia_slab","cherry_slab","dark_oak_slab","pale_oak_slab","mangrove_slab","bamboo_slab","bamboo_mosaic_slab","stone_slab","smooth_stone_slab","sandstone_slab","cut_sandstone_slab","petrified_oak_slab","cobblestone_slab","brick_slab","stone_brick_slab","mud_brick_slab","nether_brick_slab","quartz_slab","red_sandstone_slab","cut_red_sandstone_slab","purpur_slab","polished_granite_slab","smooth_red_sandstone_slab","mossy_stone_brick_slab","polished_diorite_slab","mossy_cobblestone_slab","end_stone_brick_slab","smooth_sandstone_slab","smooth_quartz_slab","granite_slab","andesite_slab","red_nether_brick_slab","polished_andesite_slab","diorite_slab","crimson_slab","warped_slab","blackstone_slab","polished_blackstone_brick_slab","polished_blackstone_slab","tuff_slab","polished_tuff_slab","tuff_brick_slab","oxidized_cut_copper_slab","weathered_cut_copper_slab","exposed_cut_copper_slab","cut_copper_slab","waxed_oxidized_cut_copper_slab","waxed_weathered_cut_copper_slab","waxed_exposed_cut_copper_slab","waxed_cut_copper_slab","cobbled_deepslate_slab","polished_deepslate_slab","deepslate_tile_slab","deepslate_brick_slab"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/46"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["prismarine_slab","prismarine_brick_slab","dark_prismarine_slab","oak_slab","spruce_slab","birch_slab","jungle_slab","acacia_slab","cherry_slab","dark_oak_slab","pale_oak_slab","mangrove_slab","bamboo_slab","bamboo_mosaic_slab","stone_slab","smooth_stone_slab","sandstone_slab","cut_sandstone_slab","petrified_oak_slab","cobblestone_slab","brick_slab","stone_brick_slab","mud_brick_slab","nether_brick_slab","quartz_slab","red_sandstone_slab","cut_red_sandstone_slab","purpur_slab","polished_granite_slab","smooth_red_sandstone_slab","mossy_stone_brick_slab","polished_diorite_slab","mossy_cobblestone_slab","end_stone_brick_slab","smooth_sandstone_slab","smooth_quartz_slab","granite_slab","andesite_slab","red_nether_brick_slab","polished_andesite_slab","diorite_slab","crimson_slab","warped_slab","blackstone_slab","polished_blackstone_brick_slab","polished_blackstone_slab","tuff_slab","polished_tuff_slab","tuff_brick_slab","oxidized_cut_copper_slab","weathered_cut_copper_slab","exposed_cut_copper_slab","cut_copper_slab","waxed_oxidized_cut_copper_slab","waxed_weathered_cut_copper_slab","waxed_exposed_cut_copper_slab","waxed_cut_copper_slab","cobbled_deepslate_slab","polished_deepslate_slab","deepslate_tile_slab","deepslate_brick_slab","white_wall_banner","orange_wall_banner","magenta_wall_banner","light_blue_wall_banner","yellow_wall_banner","lime_wall_banner","pink_wall_banner","gray_wall_banner","light_gray_wall_banner","cyan_wall_banner","purple_wall_banner","blue_wall_banner","brown_wall_banner","green_wall_banner","red_wall_banner","black_wall_banner"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/47","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["end_rod","lightning_rod"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/48"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["carrots","potatoes","skeleton_skull","wither_skeleton_skull","zombie_head","player_head","creeper_head","dragon_head","heavy_core","skeleton_wall_skull","wither_skeleton_wall_skull","zombie_wall_head","player_wall_head","creeper_wall_head","dragon_wall_head","piglin_head","piglin_wall_head","anvil","chipped_anvil","damaged_anvil","light_weighted_pressure_plate","heavy_weighted_pressure_plate","daylight_detector","hopper","prismarine_slab","prismarine_brick_slab","dark_prismarine_slab","oak_slab","spruce_slab","birch_slab","jungle_slab","acacia_slab","cherry_slab","dark_oak_slab","pale_oak_slab","mangrove_slab","bamboo_slab","bamboo_mosaic_slab","stone_slab","smooth_stone_slab","sandstone_slab","cut_sandstone_slab","petrified_oak_slab","cobblestone_slab","brick_slab","stone_brick_slab","mud_brick_slab","nether_brick_slab","quartz_slab","red_sandstone_slab","cut_red_sandstone_slab","purpur_slab","polished_granite_slab","smooth_red_sandstone_slab","mossy_stone_brick_slab","polished_diorite_slab","mossy_cobblestone_slab","end_stone_brick_slab","smooth_sandstone_slab","smooth_quartz_slab","granite_slab","andesite_slab","red_nether_brick_slab","polished_andesite_slab","diorite_slab","crimson_slab","warped_slab","blackstone_slab","polished_blackstone_brick_slab","polished_blackstone_slab","tuff_slab","polished_tuff_slab","tuff_brick_slab","oxidized_cut_copper_slab","weathered_cut_copper_slab","exposed_cut_copper_slab","cut_copper_slab","waxed_oxidized_cut_copper_slab","waxed_weathered_cut_copper_slab","waxed_exposed_cut_copper_slab","waxed_cut_copper_slab","cobbled_deepslate_slab","polished_deepslate_slab","deepslate_tile_slab","deepslate_brick_slab","white_wall_banner","orange_wall_banner","magenta_wall_banner","light_blue_wall_banner","yellow_wall_banner","lime_wall_banner","pink_wall_banner","gray_wall_banner","light_gray_wall_banner","cyan_wall_banner","purple_wall_banner","blue_wall_banner","brown_wall_banner","green_wall_banner","red_wall_banner","black_wall_banner","end_rod","lightning_rod","chorus_plant"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/49","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["torchflower_crop"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/50","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pitcher_crop"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/51"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["torchflower_crop","pitcher_crop","beetroots"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[5.0,5.0,5.0,11.0,11.0,11.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["structure_void","conduit"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,9.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["structure_void","conduit","kelp","stonecutter"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/52","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["turtle_egg"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,2.0,15.0,16.0,14.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["torchflower_crop","pitcher_crop","beetroots","structure_void","conduit","kelp","stonecutter","turtle_egg","sniffer_egg"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,0.0,2.0,14.0,15.0,14.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_tube_coral","dead_brain_coral","dead_bubble_coral","dead_fire_coral","dead_horn_coral","tube_coral","brain_coral","bubble_coral","fire_coral","horn_coral"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,0.0,2.0,14.0,4.0,14.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_tube_coral_fan","dead_brain_coral_fan","dead_bubble_coral_fan","dead_fire_coral_fan","dead_horn_coral_fan","tube_coral_fan","brain_coral_fan","bubble_coral_fan","fire_coral_fan","horn_coral_fan"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/53"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["dead_tube_coral","dead_brain_coral","dead_bubble_coral","dead_fire_coral","dead_horn_coral","tube_coral","brain_coral","bubble_coral","fire_coral","horn_coral","dead_tube_coral_fan","dead_brain_coral_fan","dead_bubble_coral_fan","dead_fire_coral_fan","dead_horn_coral_fan","tube_coral_fan","brain_coral_fan","bubble_coral_fan","fire_coral_fan","horn_coral_fan","dead_tube_coral_wall_fan","dead_brain_coral_wall_fan","dead_bubble_coral_wall_fan","dead_fire_coral_wall_fan","dead_horn_coral_wall_fan","tube_coral_wall_fan","brain_coral_wall_fan","bubble_coral_wall_fan","fire_coral_wall_fan","horn_coral_wall_fan"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/54","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sea_pickle"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,12.0,12.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sea_pickle","bamboo_sapling"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/55","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["bamboo"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/56"}]}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["carrots","potatoes","skeleton_skull","wither_skeleton_skull","zombie_head","player_head","creeper_head","dragon_head","heavy_core","skeleton_wall_skull","wither_skeleton_wall_skull","zombie_wall_head","player_wall_head","creeper_wall_head","dragon_wall_head","piglin_head","piglin_wall_head","anvil","chipped_anvil","damaged_anvil","light_weighted_pressure_plate","heavy_weighted_pressure_plate","daylight_detector","hopper","prismarine_slab","prismarine_brick_slab","dark_prismarine_slab","oak_slab","spruce_slab","birch_slab","jungle_slab","acacia_slab","cherry_slab","dark_oak_slab","pale_oak_slab","mangrove_slab","bamboo_slab","bamboo_mosaic_slab","stone_slab","smooth_stone_slab","sandstone_slab","cut_sandstone_slab","petrified_oak_slab","cobblestone_slab","brick_slab","stone_brick_slab","mud_brick_slab","nether_brick_slab","quartz_slab","red_sandstone_slab","cut_red_sandstone_slab","purpur_slab","polished_granite_slab","smooth_red_sandstone_slab","mossy_stone_brick_slab","polished_diorite_slab","mossy_cobblestone_slab","end_stone_brick_slab","smooth_sandstone_slab","smooth_quartz_slab","granite_slab","andesite_slab","red_nether_brick_slab","polished_andesite_slab","diorite_slab","crimson_slab","warped_slab","blackstone_slab","polished_blackstone_brick_slab","polished_blackstone_slab","tuff_slab","polished_tuff_slab","tuff_brick_slab","oxidized_cut_copper_slab","weathered_cut_copper_slab","exposed_cut_copper_slab","cut_copper_slab","waxed_oxidized_cut_copper_slab","waxed_weathered_cut_copper_slab","waxed_exposed_cut_copper_slab","waxed_cut_copper_slab","cobbled_deepslate_slab","polished_deepslate_slab","deepslate_tile_slab","deepslate_brick_slab","white_wall_banner","orange_wall_banner","magenta_wall_banner","light_blue_wall_banner","yellow_wall_banner","lime_wall_banner","pink_wall_banner","gray_wall_banner","light_gray_wall_banner","cyan_wall_banner","purple_wall_banner","blue_wall_banner","brown_wall_banner","green_wall_banner","red_wall_banner","black_wall_banner","end_rod","lightning_rod","chorus_plant","torchflower_crop","pitcher_crop","beetroots","structure_void","conduit","kelp","stonecutter","turtle_egg","sniffer_egg","dead_tube_coral","dead_brain_coral","dead_bubble_coral","dead_fire_coral","dead_horn_coral","tube_coral","brain_coral","bubble_coral","fire_coral","horn_coral","dead_tube_coral_fan","dead_brain_coral_fan","dead_bubble_coral_fan","dead_fire_coral_fan","dead_horn_coral_fan","tube_coral_fan","brain_coral_fan","bubble_coral_fan","fire_coral_fan","horn_coral_fan","dead_tube_coral_wall_fan","dead_brain_coral_wall_fan","dead_bubble_coral_wall_fan","dead_fire_coral_wall_fan","dead_horn_coral_wall_fan","tube_coral_wall_fan","brain_coral_wall_fan","bubble_coral_wall_fan","fire_coral_wall_fan","horn_coral_wall_fan","sea_pickle","bamboo_sapling","bamboo","scaffolding"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/57","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["grindstone"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/58","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lectern"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/59"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["grindstone","lectern","bell"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/60","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lantern","soul_lantern"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,7.0,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["lantern","soul_lantern","campfire","soul_campfire"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/61","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sweet_berry_bush"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,9.0,12.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["grindstone","lectern","bell","lantern","soul_lantern","campfire","soul_campfire","sweet_berry_bush","warped_fungus","crimson_fungus"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,0.0,2.0,14.0,3.0,14.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_sprouts"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,9.0,4.0,12.0,16.0,12.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["weeping_vines"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[4.0,0.0,4.0,12.0,15.0,12.0]]}"}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["nether_sprouts","weeping_vines","twisting_vines"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/62","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["composter"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/63"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["composter","candle","white_candle","orange_candle","magenta_candle","light_blue_candle","yellow_candle","lime_candle","pink_candle","gray_candle","light_gray_candle","cyan_candle","purple_candle","blue_candle","brown_candle","green_candle","red_candle","black_candle"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[1.0,0.0,1.0,15.0,8.0,15.0],[7.0,8.0,7.0,9.0,14.0,9.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["candle_cake","white_candle_cake","orange_candle_cake","magenta_candle_cake","light_blue_candle_cake","yellow_candle_cake","lime_candle_cake","pink_candle_cake","gray_candle_cake","light_gray_candle_cake","cyan_candle_cake","purple_candle_cake","blue_candle_cake","brown_candle_cake","green_candle_cake","red_candle_cake","black_candle_cake"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/64"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["grindstone","lectern","bell","lantern","soul_lantern","campfire","soul_campfire","sweet_berry_bush","warped_fungus","crimson_fungus","nether_sprouts","weeping_vines","twisting_vines","composter","candle","white_candle","orange_candle","magenta_candle","light_blue_candle","yellow_candle","lime_candle","pink_candle","gray_candle","light_gray_candle","cyan_candle","purple_candle","blue_candle","brown_candle","green_candle","red_candle","black_candle","candle_cake","white_candle_cake","orange_candle_cake","magenta_candle_cake","light_blue_candle_cake","yellow_candle_cake","lime_candle_cake","pink_candle_cake","gray_candle_cake","light_gray_candle_cake","cyan_candle_cake","purple_candle_cake","blue_candle_cake","brown_candle_cake","green_candle_cake","red_candle_cake","black_candle_cake","amethyst_cluster"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/65","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["large_amethyst_bud"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/66","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["medium_amethyst_bud"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/67"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["large_amethyst_bud","medium_amethyst_bud","small_amethyst_bud"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,8.0,16.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sculk_sensor","calibrated_sculk_sensor"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/68"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["sculk_sensor","calibrated_sculk_sensor","pointed_dripstone"]}}}]},{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,13.0,2.0,14.0,16.0,14.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["spore_blossom"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,8.0,0.0,16.0,16.0,16.0],[6.0,0.0,6.0,10.0,16.0,10.0]]}"}]}]}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["large_amethyst_bud","medium_amethyst_bud","small_amethyst_bud","sculk_sensor","calibrated_sculk_sensor","pointed_dripstone","spore_blossom","azalea","flowering_azalea"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/69","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pink_petals"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/70","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["big_dripleaf"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/71"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pink_petals","big_dripleaf","big_dripleaf_stem"]}}}]},{"type":"alternatives","children":[{"type":"alternatives","children":[{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[2.0,10.0,2.0,14.0,16.0,14.0]]}"}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["hanging_roots"]}}}]},{"type":"item","name":"egg","functions":[{"function":"set_custom_data","tag":"{shape:[[0.0,0.0,0.0,16.0,1.5,16.0]]}"}]}],"conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["hanging_roots","frogspawn"]}}}]},{"type":"alternatives","children":[{"type":"loot_table","value":"bs.hitbox:get_block/72","conditions":[{"condition":"location_check","predicate":{"block":{"blocks":["pale_moss_carpet"]}}}]},{"type":"loot_table","value":"bs.hitbox:get_block/73"}]}]}]}]}]}]}]}]}]}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/block/has_offset.json b/datapacks/Bookshelf/data/bs.hitbox/tags/block/has_offset.json
deleted file mode 100644
index f64d7a59dc..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/tags/block/has_offset.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#has-offset",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/28",
- "minecraft_version": "1.21"
- },
- "updated": {
- "date": "2024/10/24",
- "minecraft_version": "1.21.2"
- }
- },
- "values": [
- "minecraft:allium",
- "minecraft:azure_bluet",
- "minecraft:bamboo",
- "minecraft:bamboo_sapling",
- "minecraft:blue_orchid",
- "minecraft:cornflower",
- "minecraft:dandelion",
- "minecraft:lily_of_the_valley",
- "minecraft:mangrove_propagule",
- "minecraft:orange_tulip",
- "minecraft:oxeye_daisy",
- "minecraft:pink_tulip",
- "minecraft:pointed_dripstone",
- "minecraft:poppy",
- "minecraft:red_tulip",
- "minecraft:torchflower",
- "minecraft:white_tulip",
- "minecraft:wither_rose"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/block/intangible.json b/datapacks/Bookshelf/data/bs.hitbox/tags/block/intangible.json
deleted file mode 100644
index 7c11ee156c..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/tags/block/intangible.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#intangible",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/28",
- "minecraft_version": "1.21"
- },
- "updated": {
- "date": "2024/09/28",
- "minecraft_version": "1.21"
- }
- },
- "values": [
- "minecraft:air",
- "minecraft:cave_air",
- "minecraft:lava",
- "minecraft:light",
- "minecraft:structure_void",
- "minecraft:void_air",
- "minecraft:water"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/block/is_composite.json b/datapacks/Bookshelf/data/bs.hitbox/tags/block/is_composite.json
deleted file mode 100644
index 293ea362bd..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/tags/block/is_composite.json
+++ /dev/null
@@ -1,650 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-composite",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/28",
- "minecraft_version": "1.21"
- },
- "updated": {
- "date": "2024/10/24",
- "minecraft_version": "1.21.2"
- }
- },
- "values": [
- "minecraft:acacia_button",
- "minecraft:acacia_door",
- "minecraft:acacia_fence",
- "minecraft:acacia_fence_gate",
- "minecraft:acacia_hanging_sign",
- "minecraft:acacia_pressure_plate",
- "minecraft:acacia_sapling",
- "minecraft:acacia_sign",
- "minecraft:acacia_slab",
- "minecraft:acacia_stairs",
- "minecraft:acacia_trapdoor",
- "minecraft:acacia_wall_hanging_sign",
- "minecraft:acacia_wall_sign",
- "minecraft:activator_rail",
- "minecraft:allium",
- "minecraft:amethyst_cluster",
- "minecraft:andesite_slab",
- "minecraft:andesite_stairs",
- "minecraft:andesite_wall",
- "minecraft:anvil",
- "minecraft:attached_melon_stem",
- "minecraft:attached_pumpkin_stem",
- "minecraft:azalea",
- "minecraft:azure_bluet",
- "minecraft:bamboo",
- "minecraft:bamboo_button",
- "minecraft:bamboo_door",
- "minecraft:bamboo_fence",
- "minecraft:bamboo_fence_gate",
- "minecraft:bamboo_hanging_sign",
- "minecraft:bamboo_mosaic_slab",
- "minecraft:bamboo_mosaic_stairs",
- "minecraft:bamboo_pressure_plate",
- "minecraft:bamboo_sapling",
- "minecraft:bamboo_sign",
- "minecraft:bamboo_slab",
- "minecraft:bamboo_stairs",
- "minecraft:bamboo_trapdoor",
- "minecraft:bamboo_wall_hanging_sign",
- "minecraft:bamboo_wall_sign",
- "minecraft:beetroots",
- "minecraft:bell",
- "minecraft:big_dripleaf",
- "minecraft:big_dripleaf_stem",
- "minecraft:birch_button",
- "minecraft:birch_door",
- "minecraft:birch_fence",
- "minecraft:birch_fence_gate",
- "minecraft:birch_hanging_sign",
- "minecraft:birch_pressure_plate",
- "minecraft:birch_sapling",
- "minecraft:birch_sign",
- "minecraft:birch_slab",
- "minecraft:birch_stairs",
- "minecraft:birch_trapdoor",
- "minecraft:birch_wall_hanging_sign",
- "minecraft:birch_wall_sign",
- "minecraft:black_banner",
- "minecraft:black_bed",
- "minecraft:black_candle",
- "minecraft:black_candle_cake",
- "minecraft:black_carpet",
- "minecraft:black_stained_glass_pane",
- "minecraft:black_wall_banner",
- "minecraft:blackstone_slab",
- "minecraft:blackstone_stairs",
- "minecraft:blackstone_wall",
- "minecraft:blue_banner",
- "minecraft:blue_bed",
- "minecraft:blue_candle",
- "minecraft:blue_candle_cake",
- "minecraft:blue_carpet",
- "minecraft:blue_orchid",
- "minecraft:blue_stained_glass_pane",
- "minecraft:blue_wall_banner",
- "minecraft:brain_coral",
- "minecraft:brain_coral_fan",
- "minecraft:brain_coral_wall_fan",
- "minecraft:brewing_stand",
- "minecraft:brick_slab",
- "minecraft:brick_stairs",
- "minecraft:brick_wall",
- "minecraft:brown_banner",
- "minecraft:brown_bed",
- "minecraft:brown_candle",
- "minecraft:brown_candle_cake",
- "minecraft:brown_carpet",
- "minecraft:brown_mushroom",
- "minecraft:brown_stained_glass_pane",
- "minecraft:brown_wall_banner",
- "minecraft:bubble_coral",
- "minecraft:bubble_coral_fan",
- "minecraft:bubble_coral_wall_fan",
- "minecraft:cactus",
- "minecraft:cake",
- "minecraft:calibrated_sculk_sensor",
- "minecraft:campfire",
- "minecraft:candle",
- "minecraft:candle_cake",
- "minecraft:carrots",
- "minecraft:cauldron",
- "minecraft:cave_vines",
- "minecraft:cave_vines_plant",
- "minecraft:chain",
- "minecraft:cherry_button",
- "minecraft:cherry_door",
- "minecraft:cherry_fence",
- "minecraft:cherry_fence_gate",
- "minecraft:cherry_hanging_sign",
- "minecraft:cherry_pressure_plate",
- "minecraft:cherry_sapling",
- "minecraft:cherry_sign",
- "minecraft:cherry_slab",
- "minecraft:cherry_stairs",
- "minecraft:cherry_trapdoor",
- "minecraft:cherry_wall_hanging_sign",
- "minecraft:cherry_wall_sign",
- "minecraft:chest",
- "minecraft:chipped_anvil",
- "minecraft:chorus_plant",
- "minecraft:cobbled_deepslate_slab",
- "minecraft:cobbled_deepslate_stairs",
- "minecraft:cobbled_deepslate_wall",
- "minecraft:cobblestone_slab",
- "minecraft:cobblestone_stairs",
- "minecraft:cobblestone_wall",
- "minecraft:cocoa",
- "minecraft:comparator",
- "minecraft:composter",
- "minecraft:conduit",
- "minecraft:copper_door",
- "minecraft:copper_trapdoor",
- "minecraft:cornflower",
- "minecraft:creeper_head",
- "minecraft:creeper_wall_head",
- "minecraft:crimson_button",
- "minecraft:crimson_door",
- "minecraft:crimson_fence",
- "minecraft:crimson_fence_gate",
- "minecraft:crimson_fungus",
- "minecraft:crimson_hanging_sign",
- "minecraft:crimson_pressure_plate",
- "minecraft:crimson_roots",
- "minecraft:crimson_sign",
- "minecraft:crimson_slab",
- "minecraft:crimson_stairs",
- "minecraft:crimson_trapdoor",
- "minecraft:crimson_wall_hanging_sign",
- "minecraft:crimson_wall_sign",
- "minecraft:cut_copper_slab",
- "minecraft:cut_copper_stairs",
- "minecraft:cut_red_sandstone_slab",
- "minecraft:cut_sandstone_slab",
- "minecraft:cyan_banner",
- "minecraft:cyan_bed",
- "minecraft:cyan_candle",
- "minecraft:cyan_candle_cake",
- "minecraft:cyan_carpet",
- "minecraft:cyan_stained_glass_pane",
- "minecraft:cyan_wall_banner",
- "minecraft:damaged_anvil",
- "minecraft:dandelion",
- "minecraft:dark_oak_button",
- "minecraft:dark_oak_door",
- "minecraft:dark_oak_fence",
- "minecraft:dark_oak_fence_gate",
- "minecraft:dark_oak_hanging_sign",
- "minecraft:dark_oak_pressure_plate",
- "minecraft:dark_oak_sapling",
- "minecraft:dark_oak_sign",
- "minecraft:dark_oak_slab",
- "minecraft:dark_oak_stairs",
- "minecraft:dark_oak_trapdoor",
- "minecraft:dark_oak_wall_hanging_sign",
- "minecraft:dark_oak_wall_sign",
- "minecraft:dark_prismarine_slab",
- "minecraft:dark_prismarine_stairs",
- "minecraft:daylight_detector",
- "minecraft:dead_brain_coral",
- "minecraft:dead_brain_coral_fan",
- "minecraft:dead_brain_coral_wall_fan",
- "minecraft:dead_bubble_coral",
- "minecraft:dead_bubble_coral_fan",
- "minecraft:dead_bubble_coral_wall_fan",
- "minecraft:dead_bush",
- "minecraft:dead_fire_coral",
- "minecraft:dead_fire_coral_fan",
- "minecraft:dead_fire_coral_wall_fan",
- "minecraft:dead_horn_coral",
- "minecraft:dead_horn_coral_fan",
- "minecraft:dead_horn_coral_wall_fan",
- "minecraft:dead_tube_coral",
- "minecraft:dead_tube_coral_fan",
- "minecraft:dead_tube_coral_wall_fan",
- "minecraft:decorated_pot",
- "minecraft:deepslate_brick_slab",
- "minecraft:deepslate_brick_stairs",
- "minecraft:deepslate_brick_wall",
- "minecraft:deepslate_tile_slab",
- "minecraft:deepslate_tile_stairs",
- "minecraft:deepslate_tile_wall",
- "minecraft:detector_rail",
- "minecraft:diorite_slab",
- "minecraft:diorite_stairs",
- "minecraft:diorite_wall",
- "minecraft:dirt_path",
- "minecraft:dragon_egg",
- "minecraft:dragon_head",
- "minecraft:dragon_wall_head",
- "minecraft:enchanting_table",
- "minecraft:end_portal",
- "minecraft:end_portal_frame",
- "minecraft:end_rod",
- "minecraft:end_stone_brick_slab",
- "minecraft:end_stone_brick_stairs",
- "minecraft:end_stone_brick_wall",
- "minecraft:ender_chest",
- "minecraft:exposed_copper_door",
- "minecraft:exposed_copper_trapdoor",
- "minecraft:exposed_cut_copper_slab",
- "minecraft:exposed_cut_copper_stairs",
- "minecraft:farmland",
- "minecraft:fern",
- "minecraft:fire",
- "minecraft:fire_coral",
- "minecraft:fire_coral_fan",
- "minecraft:fire_coral_wall_fan",
- "minecraft:flower_pot",
- "minecraft:flowering_azalea",
- "minecraft:frogspawn",
- "minecraft:glass_pane",
- "minecraft:glow_lichen",
- "minecraft:granite_slab",
- "minecraft:granite_stairs",
- "minecraft:granite_wall",
- "minecraft:gray_banner",
- "minecraft:gray_bed",
- "minecraft:gray_candle",
- "minecraft:gray_candle_cake",
- "minecraft:gray_carpet",
- "minecraft:gray_stained_glass_pane",
- "minecraft:gray_wall_banner",
- "minecraft:green_banner",
- "minecraft:green_bed",
- "minecraft:green_candle",
- "minecraft:green_candle_cake",
- "minecraft:green_carpet",
- "minecraft:green_stained_glass_pane",
- "minecraft:green_wall_banner",
- "minecraft:grindstone",
- "minecraft:hanging_roots",
- "minecraft:heavy_core",
- "minecraft:heavy_weighted_pressure_plate",
- "minecraft:hopper",
- "minecraft:horn_coral",
- "minecraft:horn_coral_fan",
- "minecraft:horn_coral_wall_fan",
- "minecraft:iron_bars",
- "minecraft:iron_door",
- "minecraft:iron_trapdoor",
- "minecraft:jungle_button",
- "minecraft:jungle_door",
- "minecraft:jungle_fence",
- "minecraft:jungle_fence_gate",
- "minecraft:jungle_hanging_sign",
- "minecraft:jungle_pressure_plate",
- "minecraft:jungle_sapling",
- "minecraft:jungle_sign",
- "minecraft:jungle_slab",
- "minecraft:jungle_stairs",
- "minecraft:jungle_trapdoor",
- "minecraft:jungle_wall_hanging_sign",
- "minecraft:jungle_wall_sign",
- "minecraft:kelp",
- "minecraft:ladder",
- "minecraft:lantern",
- "minecraft:large_amethyst_bud",
- "minecraft:lava_cauldron",
- "minecraft:lectern",
- "minecraft:lever",
- "minecraft:light_blue_banner",
- "minecraft:light_blue_bed",
- "minecraft:light_blue_candle",
- "minecraft:light_blue_candle_cake",
- "minecraft:light_blue_carpet",
- "minecraft:light_blue_stained_glass_pane",
- "minecraft:light_blue_wall_banner",
- "minecraft:light_gray_banner",
- "minecraft:light_gray_bed",
- "minecraft:light_gray_candle",
- "minecraft:light_gray_candle_cake",
- "minecraft:light_gray_carpet",
- "minecraft:light_gray_stained_glass_pane",
- "minecraft:light_gray_wall_banner",
- "minecraft:light_weighted_pressure_plate",
- "minecraft:lightning_rod",
- "minecraft:lily_of_the_valley",
- "minecraft:lily_pad",
- "minecraft:lime_banner",
- "minecraft:lime_bed",
- "minecraft:lime_candle",
- "minecraft:lime_candle_cake",
- "minecraft:lime_carpet",
- "minecraft:lime_stained_glass_pane",
- "minecraft:lime_wall_banner",
- "minecraft:magenta_banner",
- "minecraft:magenta_bed",
- "minecraft:magenta_candle",
- "minecraft:magenta_candle_cake",
- "minecraft:magenta_carpet",
- "minecraft:magenta_stained_glass_pane",
- "minecraft:magenta_wall_banner",
- "minecraft:mangrove_button",
- "minecraft:mangrove_door",
- "minecraft:mangrove_fence",
- "minecraft:mangrove_fence_gate",
- "minecraft:mangrove_hanging_sign",
- "minecraft:mangrove_pressure_plate",
- "minecraft:mangrove_propagule",
- "minecraft:mangrove_sign",
- "minecraft:mangrove_slab",
- "minecraft:mangrove_stairs",
- "minecraft:mangrove_trapdoor",
- "minecraft:mangrove_wall_hanging_sign",
- "minecraft:mangrove_wall_sign",
- "minecraft:medium_amethyst_bud",
- "minecraft:melon_stem",
- "minecraft:moss_carpet",
- "minecraft:mossy_cobblestone_slab",
- "minecraft:mossy_cobblestone_stairs",
- "minecraft:mossy_cobblestone_wall",
- "minecraft:mossy_stone_brick_slab",
- "minecraft:mossy_stone_brick_stairs",
- "minecraft:mossy_stone_brick_wall",
- "minecraft:mud_brick_slab",
- "minecraft:mud_brick_stairs",
- "minecraft:mud_brick_wall",
- "minecraft:nether_brick_fence",
- "minecraft:nether_brick_slab",
- "minecraft:nether_brick_stairs",
- "minecraft:nether_brick_wall",
- "minecraft:nether_portal",
- "minecraft:nether_sprouts",
- "minecraft:nether_wart",
- "minecraft:oak_button",
- "minecraft:oak_door",
- "minecraft:oak_fence",
- "minecraft:oak_fence_gate",
- "minecraft:oak_hanging_sign",
- "minecraft:oak_pressure_plate",
- "minecraft:oak_sapling",
- "minecraft:oak_sign",
- "minecraft:oak_slab",
- "minecraft:oak_stairs",
- "minecraft:oak_trapdoor",
- "minecraft:oak_wall_hanging_sign",
- "minecraft:oak_wall_sign",
- "minecraft:orange_banner",
- "minecraft:orange_bed",
- "minecraft:orange_candle",
- "minecraft:orange_candle_cake",
- "minecraft:orange_carpet",
- "minecraft:orange_stained_glass_pane",
- "minecraft:orange_tulip",
- "minecraft:orange_wall_banner",
- "minecraft:oxeye_daisy",
- "minecraft:oxidized_copper_door",
- "minecraft:oxidized_copper_trapdoor",
- "minecraft:oxidized_cut_copper_slab",
- "minecraft:oxidized_cut_copper_stairs",
- "minecraft:pale_hanging_moss",
- "minecraft:pale_moss_carpet",
- "minecraft:pale_oak_button",
- "minecraft:pale_oak_door",
- "minecraft:pale_oak_fence",
- "minecraft:pale_oak_fence_gate",
- "minecraft:pale_oak_hanging_sign",
- "minecraft:pale_oak_pressure_plate",
- "minecraft:pale_oak_sapling",
- "minecraft:pale_oak_sign",
- "minecraft:pale_oak_slab",
- "minecraft:pale_oak_stairs",
- "minecraft:pale_oak_trapdoor",
- "minecraft:pale_oak_wall_hanging_sign",
- "minecraft:pale_oak_wall_sign",
- "minecraft:petrified_oak_slab",
- "minecraft:piglin_head",
- "minecraft:piglin_wall_head",
- "minecraft:pink_banner",
- "minecraft:pink_bed",
- "minecraft:pink_candle",
- "minecraft:pink_candle_cake",
- "minecraft:pink_carpet",
- "minecraft:pink_petals",
- "minecraft:pink_stained_glass_pane",
- "minecraft:pink_tulip",
- "minecraft:pink_wall_banner",
- "minecraft:piston",
- "minecraft:piston_head",
- "minecraft:pitcher_crop",
- "minecraft:player_head",
- "minecraft:player_wall_head",
- "minecraft:pointed_dripstone",
- "minecraft:polished_andesite_slab",
- "minecraft:polished_andesite_stairs",
- "minecraft:polished_blackstone_brick_slab",
- "minecraft:polished_blackstone_brick_stairs",
- "minecraft:polished_blackstone_brick_wall",
- "minecraft:polished_blackstone_button",
- "minecraft:polished_blackstone_pressure_plate",
- "minecraft:polished_blackstone_slab",
- "minecraft:polished_blackstone_stairs",
- "minecraft:polished_blackstone_wall",
- "minecraft:polished_deepslate_slab",
- "minecraft:polished_deepslate_stairs",
- "minecraft:polished_deepslate_wall",
- "minecraft:polished_diorite_slab",
- "minecraft:polished_diorite_stairs",
- "minecraft:polished_granite_slab",
- "minecraft:polished_granite_stairs",
- "minecraft:polished_tuff_slab",
- "minecraft:polished_tuff_stairs",
- "minecraft:polished_tuff_wall",
- "minecraft:poppy",
- "minecraft:potatoes",
- "minecraft:potted_acacia_sapling",
- "minecraft:potted_allium",
- "minecraft:potted_azalea_bush",
- "minecraft:potted_azure_bluet",
- "minecraft:potted_bamboo",
- "minecraft:potted_birch_sapling",
- "minecraft:potted_blue_orchid",
- "minecraft:potted_brown_mushroom",
- "minecraft:potted_cactus",
- "minecraft:potted_cherry_sapling",
- "minecraft:potted_cornflower",
- "minecraft:potted_crimson_fungus",
- "minecraft:potted_crimson_roots",
- "minecraft:potted_dandelion",
- "minecraft:potted_dark_oak_sapling",
- "minecraft:potted_dead_bush",
- "minecraft:potted_fern",
- "minecraft:potted_flowering_azalea_bush",
- "minecraft:potted_jungle_sapling",
- "minecraft:potted_lily_of_the_valley",
- "minecraft:potted_mangrove_propagule",
- "minecraft:potted_oak_sapling",
- "minecraft:potted_orange_tulip",
- "minecraft:potted_oxeye_daisy",
- "minecraft:potted_pale_oak_sapling",
- "minecraft:potted_pink_tulip",
- "minecraft:potted_poppy",
- "minecraft:potted_red_mushroom",
- "minecraft:potted_red_tulip",
- "minecraft:potted_spruce_sapling",
- "minecraft:potted_torchflower",
- "minecraft:potted_warped_fungus",
- "minecraft:potted_warped_roots",
- "minecraft:potted_white_tulip",
- "minecraft:potted_wither_rose",
- "minecraft:powder_snow_cauldron",
- "minecraft:powered_rail",
- "minecraft:prismarine_brick_slab",
- "minecraft:prismarine_brick_stairs",
- "minecraft:prismarine_slab",
- "minecraft:prismarine_stairs",
- "minecraft:prismarine_wall",
- "minecraft:pumpkin_stem",
- "minecraft:purple_banner",
- "minecraft:purple_bed",
- "minecraft:purple_candle",
- "minecraft:purple_candle_cake",
- "minecraft:purple_carpet",
- "minecraft:purple_stained_glass_pane",
- "minecraft:purple_wall_banner",
- "minecraft:purpur_slab",
- "minecraft:purpur_stairs",
- "minecraft:quartz_slab",
- "minecraft:quartz_stairs",
- "minecraft:rail",
- "minecraft:red_banner",
- "minecraft:red_bed",
- "minecraft:red_candle",
- "minecraft:red_candle_cake",
- "minecraft:red_carpet",
- "minecraft:red_mushroom",
- "minecraft:red_nether_brick_slab",
- "minecraft:red_nether_brick_stairs",
- "minecraft:red_nether_brick_wall",
- "minecraft:red_sandstone_slab",
- "minecraft:red_sandstone_stairs",
- "minecraft:red_sandstone_wall",
- "minecraft:red_stained_glass_pane",
- "minecraft:red_tulip",
- "minecraft:red_wall_banner",
- "minecraft:redstone_torch",
- "minecraft:redstone_wall_torch",
- "minecraft:redstone_wire",
- "minecraft:repeater",
- "minecraft:sandstone_slab",
- "minecraft:sandstone_stairs",
- "minecraft:sandstone_wall",
- "minecraft:scaffolding",
- "minecraft:sculk_sensor",
- "minecraft:sculk_vein",
- "minecraft:sea_pickle",
- "minecraft:seagrass",
- "minecraft:short_grass",
- "minecraft:skeleton_skull",
- "minecraft:skeleton_wall_skull",
- "minecraft:small_amethyst_bud",
- "minecraft:small_dripleaf",
- "minecraft:smooth_quartz_slab",
- "minecraft:smooth_quartz_stairs",
- "minecraft:smooth_red_sandstone_slab",
- "minecraft:smooth_red_sandstone_stairs",
- "minecraft:smooth_sandstone_slab",
- "minecraft:smooth_sandstone_stairs",
- "minecraft:smooth_stone_slab",
- "minecraft:sniffer_egg",
- "minecraft:snow",
- "minecraft:soul_campfire",
- "minecraft:soul_fire",
- "minecraft:soul_lantern",
- "minecraft:soul_torch",
- "minecraft:soul_wall_torch",
- "minecraft:spore_blossom",
- "minecraft:spruce_button",
- "minecraft:spruce_door",
- "minecraft:spruce_fence",
- "minecraft:spruce_fence_gate",
- "minecraft:spruce_hanging_sign",
- "minecraft:spruce_pressure_plate",
- "minecraft:spruce_sapling",
- "minecraft:spruce_sign",
- "minecraft:spruce_slab",
- "minecraft:spruce_stairs",
- "minecraft:spruce_trapdoor",
- "minecraft:spruce_wall_hanging_sign",
- "minecraft:spruce_wall_sign",
- "minecraft:sticky_piston",
- "minecraft:stone_brick_slab",
- "minecraft:stone_brick_stairs",
- "minecraft:stone_brick_wall",
- "minecraft:stone_button",
- "minecraft:stone_pressure_plate",
- "minecraft:stone_slab",
- "minecraft:stone_stairs",
- "minecraft:stonecutter",
- "minecraft:structure_void",
- "minecraft:sugar_cane",
- "minecraft:sweet_berry_bush",
- "minecraft:tall_seagrass",
- "minecraft:torch",
- "minecraft:torchflower",
- "minecraft:torchflower_crop",
- "minecraft:trapped_chest",
- "minecraft:tripwire",
- "minecraft:tripwire_hook",
- "minecraft:tube_coral",
- "minecraft:tube_coral_fan",
- "minecraft:tube_coral_wall_fan",
- "minecraft:tuff_brick_slab",
- "minecraft:tuff_brick_stairs",
- "minecraft:tuff_brick_wall",
- "minecraft:tuff_slab",
- "minecraft:tuff_stairs",
- "minecraft:tuff_wall",
- "minecraft:turtle_egg",
- "minecraft:twisting_vines",
- "minecraft:twisting_vines_plant",
- "minecraft:vine",
- "minecraft:wall_torch",
- "minecraft:warped_button",
- "minecraft:warped_door",
- "minecraft:warped_fence",
- "minecraft:warped_fence_gate",
- "minecraft:warped_fungus",
- "minecraft:warped_hanging_sign",
- "minecraft:warped_pressure_plate",
- "minecraft:warped_roots",
- "minecraft:warped_sign",
- "minecraft:warped_slab",
- "minecraft:warped_stairs",
- "minecraft:warped_trapdoor",
- "minecraft:warped_wall_hanging_sign",
- "minecraft:warped_wall_sign",
- "minecraft:water_cauldron",
- "minecraft:waxed_copper_door",
- "minecraft:waxed_copper_trapdoor",
- "minecraft:waxed_cut_copper_slab",
- "minecraft:waxed_cut_copper_stairs",
- "minecraft:waxed_exposed_copper_door",
- "minecraft:waxed_exposed_copper_trapdoor",
- "minecraft:waxed_exposed_cut_copper_slab",
- "minecraft:waxed_exposed_cut_copper_stairs",
- "minecraft:waxed_oxidized_copper_door",
- "minecraft:waxed_oxidized_copper_trapdoor",
- "minecraft:waxed_oxidized_cut_copper_slab",
- "minecraft:waxed_oxidized_cut_copper_stairs",
- "minecraft:waxed_weathered_copper_door",
- "minecraft:waxed_weathered_copper_trapdoor",
- "minecraft:waxed_weathered_cut_copper_slab",
- "minecraft:waxed_weathered_cut_copper_stairs",
- "minecraft:weathered_copper_door",
- "minecraft:weathered_copper_trapdoor",
- "minecraft:weathered_cut_copper_slab",
- "minecraft:weathered_cut_copper_stairs",
- "minecraft:weeping_vines",
- "minecraft:weeping_vines_plant",
- "minecraft:wheat",
- "minecraft:white_banner",
- "minecraft:white_bed",
- "minecraft:white_candle",
- "minecraft:white_candle_cake",
- "minecraft:white_carpet",
- "minecraft:white_stained_glass_pane",
- "minecraft:white_tulip",
- "minecraft:white_wall_banner",
- "minecraft:wither_rose",
- "minecraft:wither_skeleton_skull",
- "minecraft:wither_skeleton_wall_skull",
- "minecraft:yellow_banner",
- "minecraft:yellow_bed",
- "minecraft:yellow_candle",
- "minecraft:yellow_candle_cake",
- "minecraft:yellow_carpet",
- "minecraft:yellow_stained_glass_pane",
- "minecraft:yellow_wall_banner",
- "minecraft:zombie_head",
- "minecraft:zombie_wall_head"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/intangible.json b/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/intangible.json
deleted file mode 100644
index bd2e52e7f9..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/intangible.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#intangible",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/28",
- "minecraft_version": "1.21"
- },
- "updated": {
- "date": "2024/09/28",
- "minecraft_version": "1.21"
- }
- },
- "values": [
- "minecraft:area_effect_cloud",
- "minecraft:arrow",
- "minecraft:block_display",
- "minecraft:dragon_fireball",
- "minecraft:egg",
- "minecraft:ender_pearl",
- "minecraft:evoker_fangs",
- "minecraft:experience_bottle",
- "minecraft:experience_orb",
- "minecraft:eye_of_ender",
- "minecraft:firework_rocket",
- "minecraft:fishing_bobber",
- "minecraft:item",
- "minecraft:item_display",
- "minecraft:llama_spit",
- "minecraft:marker",
- "minecraft:potion",
- "minecraft:small_fireball",
- "minecraft:snowball",
- "minecraft:spectral_arrow",
- "minecraft:text_display",
- "minecraft:tnt",
- "minecraft:trident",
- "minecraft:wither_skull"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.hitbox/tags/function/exclusive_load.json
deleted file mode 100644
index 90c5d360aa..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.hitbox:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/function/get_block.json b/datapacks/Bookshelf/data/bs.hitbox/tags/function/get_block.json
deleted file mode 100644
index 96714895b6..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/tags/function/get_block.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#get",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/11/21",
- "minecraft_version": "1.20.3"
- },
- "updated": {
- "date": "2024/09/28",
- "minecraft_version": "1.21"
- }
- },
- "values": [
- "bs.hitbox:get_block/get_block"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/function/help.json b/datapacks/Bookshelf/data/bs.hitbox/tags/function/help.json
deleted file mode 100644
index f0a5aa2bc2..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.hitbox:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/function/load.json b/datapacks/Bookshelf/data/bs.hitbox/tags/function/load.json
deleted file mode 100644
index 5483a49b48..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/tags/function/load.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.hitbox:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/function/unload.json b/datapacks/Bookshelf/data/bs.hitbox/tags/function/unload.json
deleted file mode 100644
index e65c5d42ca..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.hitbox:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/test/__boot__.mcfunction
deleted file mode 100644
index 383db6feab..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.hitbox
-# @beforebatch function #bs.hitbox:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.hitbox/test/block_offset.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/test/block_offset.mcfunction
deleted file mode 100644
index ec724c0df2..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/test/block_offset.mcfunction
+++ /dev/null
@@ -1,11 +0,0 @@
-# @batch bs.hitbox
-
-## |TEST CASE|: Block with no offset
-setblock ~ ~ ~ minecraft:poppy
-function #bs.hitbox:get_block
-assert not data storage bs:out hitbox{ offset: { x: 0.0, z: 0.0 } }
-
-## |TEST CASE|: Block with offset
-setblock 0 0 0 minecraft:poppy
-execute positioned 0 0 0 run function #bs.hitbox:get_block
-assert data storage bs:out hitbox{ shape: [[5.0, 0.0, 5.0, 11.0, 10.0, 11.0]], offset: { x: -0.25, z: -0.25 } }
diff --git a/datapacks/Bookshelf/data/bs.hitbox/test/block_shape.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/test/block_shape.mcfunction
deleted file mode 100644
index 047ef73574..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/test/block_shape.mcfunction
+++ /dev/null
@@ -1,11 +0,0 @@
-# @batch bs.hitbox
-
-## |TEST CASE|: Bottom stone slab
-setblock ~ ~ ~ minecraft:stone_slab[type=bottom]
-function #bs.hitbox:get_block
-assert data storage bs:out hitbox{ shape: [[0.0, 0.0, 0.0, 16.0, 8.0, 16.0]] }
-
-## |TEST CASE|: Top stone slab
-setblock ~ ~ ~ minecraft:stone_slab[type=top]
-function #bs.hitbox:get_block
-assert data storage bs:out hitbox{ shape: [[0.0, 8.0, 0.0, 16.0, 16.0, 16.0]] }
diff --git a/datapacks/Bookshelf/data/bs.hitbox/test/entity_in_block.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/test/entity_in_block.mcfunction
deleted file mode 100644
index 7ed53ee891..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/test/entity_in_block.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# @batch bs.hitbox
-# @dummy
-
-fill ~-1 ~-1 ~-1 ~1 ~1 ~1 minecraft:air replace minecraft:barrier
-setblock ~ ~ ~ minecraft:stone_slab[type=bottom]
-
-## |TEST CASE|: Entity is not inside the block
-tp @s ~.5 ~.75 ~.5
-execute if function #bs.hitbox:is_entity_in_block run fail "Entity should not be inside the slab"
-tp @s ~-.3 ~ ~-.3
-await delay 5t
-execute if function #bs.hitbox:is_entity_in_block run fail "Entity should not be inside the slab"
-
-## |TEST CASE|: Entity is inside the block
-tp @s ~.5 ~-1 ~.5
-execute unless function #bs.hitbox:is_entity_in_block run fail "Entity should be inside the slab"
-tp @s ~-.29 ~ ~-.29
-execute unless function #bs.hitbox:is_entity_in_block run fail "Entity should be inside the slab"
diff --git a/datapacks/Bookshelf/data/bs.hitbox/test/entity_in_blocks.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/test/entity_in_blocks.mcfunction
deleted file mode 100644
index aa969dbdbd..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/test/entity_in_blocks.mcfunction
+++ /dev/null
@@ -1,14 +0,0 @@
-# @batch bs.hitbox
-# @dummy
-
-fill ~-1 ~-1 ~-1 ~1 ~1 ~1 minecraft:air replace minecraft:barrier
-setblock ~-1 ~ ~-1 minecraft:bookshelf
-
-## |TEST CASE|: Entity is not inside a block
-execute store result score #s bs.ctx run function #bs.hitbox:is_entity_in_blocks {with:{}}
-assert score #s bs.ctx matches 0
-
-## |TEST CASE|: Entity not inside a block
-tp @s ~ ~ ~
-execute store result score #s bs.ctx run function #bs.hitbox:is_entity_in_blocks {with:{}}
-assert score #s bs.ctx matches 1
diff --git a/datapacks/Bookshelf/data/bs.hitbox/test/entity_scale.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/test/entity_scale.mcfunction
deleted file mode 100644
index 28c3e73978..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/test/entity_scale.mcfunction
+++ /dev/null
@@ -1,11 +0,0 @@
-# @batch bs.hitbox
-# @dummy
-
-## |TEST CASE|: Default entity scale
-function #bs.hitbox:get_entity
-assert data storage bs:out hitbox{ scale: 1.0 }
-
-## |TEST CASE|: Custom entity scale
-attribute @s minecraft:scale base set 0.42
-function #bs.hitbox:get_entity
-assert data storage bs:out hitbox{ scale: 0.42 }
diff --git a/datapacks/Bookshelf/data/bs.hitbox/test/entity_size.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/test/entity_size.mcfunction
deleted file mode 100644
index 13174d1e8a..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/test/entity_size.mcfunction
+++ /dev/null
@@ -1,6 +0,0 @@
-# @batch bs.hitbox
-# @dummy
-
-## |TEST CASE|: Entity size (width and height)
-function #bs.hitbox:get_entity
-assert data storage bs:out hitbox{ width: 0.6, height: 1.8 }
diff --git a/datapacks/Bookshelf/data/bs.hitbox/test/in_block.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/test/in_block.mcfunction
deleted file mode 100644
index 3204963da6..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/test/in_block.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# @batch bs.hitbox
-
-## |TEST CASE|: Player should not be inside the slab
-setblock ~ ~ ~ minecraft:stone_slab
-execute positioned ~.5 ~.5 ~.5 if function #bs.hitbox:is_in_block run fail "Should not be inside the slab"
-
-## |TEST CASE|: Player should be inside the block
-setblock ~ ~ ~ minecraft:bookshelf
-execute positioned ~.5 ~.5 ~.5 unless function #bs.hitbox:is_in_block run fail "Should be inside the block"
diff --git a/datapacks/Bookshelf/data/bs.hitbox/test/in_entity.mcfunction b/datapacks/Bookshelf/data/bs.hitbox/test/in_entity.mcfunction
deleted file mode 100644
index da227e43ec..0000000000
--- a/datapacks/Bookshelf/data/bs.hitbox/test/in_entity.mcfunction
+++ /dev/null
@@ -1,11 +0,0 @@
-# @batch bs.hitbox
-# @dummy
-
-## |TEST CASE|: Player should not be inside the entity
-execute positioned ~.5 ~2 ~.5 if function #bs.hitbox:is_in_entity run fail "Should not be inside the entity"
-
-## |TEST CASE|: Player should be inside the entity at various positions
-execute positioned ~.5 ~1.5 ~.5 unless function #bs.hitbox:is_in_entity run fail "Should be inside the entity"
-execute positioned ~.5 ~ ~.5 unless function #bs.hitbox:is_in_entity run fail "Should be inside the entity"
-
-dummy @s leave
diff --git a/datapacks/Bookshelf/data/bs.id/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.id/.metadata/generated/features.json
deleted file mode 100644
index bff009d2d2..0000000000
--- a/datapacks/Bookshelf/data/bs.id/.metadata/generated/features.json
+++ /dev/null
@@ -1,50 +0,0 @@
-[
- {
- "name": "give_cuid",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/id.html#give-chain-unique-id",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2017/10/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/08/28",
- "version": "23w33a"
- }
- },
- {
- "name": "give_suid",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/id.html#give-simple-unique-id",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2017/10/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/08/28",
- "version": "23w33a"
- }
- },
- {
- "name": "update_cuids",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/id.html#update-chain-unique-id",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2017/10/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/08/28",
- "version": "23w33a"
- }
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.id/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.id/.metadata/generated/module.json
deleted file mode 100644
index 2d9cbc0f00..0000000000
--- a/datapacks/Bookshelf/data/bs.id/.metadata/generated/module.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": "bs.id",
- "display_name": "ID",
- "description": "Manage entity IDs, essential in scenarios like shooting games where you need to track who is targeting whom.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/id.html",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "features": [
- "bs.id:give_cuid",
- "bs.id:give_suid",
- "bs.id:update_cuids"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.id/.metadata/module.json b/datapacks/Bookshelf/data/bs.id/.metadata/module.json
deleted file mode 100644
index e5b7c9849d..0000000000
--- a/datapacks/Bookshelf/data/bs.id/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.id",
- "display_name": "ID",
- "description": "Manage entity IDs, essential in scenarios like shooting games where you need to track who is targeting whom.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/id.html"
-}
diff --git a/datapacks/Bookshelf/data/bs.id/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.id/function/__help__.mcfunction
deleted file mode 100644
index 0d660bf289..0000000000
--- a/datapacks/Bookshelf/data/bs.id/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/id.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.id documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/id.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.id/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.id/function/__load__.mcfunction
deleted file mode 100644
index 6641095bfc..0000000000
--- a/datapacks/Bookshelf/data/bs.id/function/__load__.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/id.html
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard objectives add bs.in dummy [{"text":"BS ","color":"dark_gray"},{"text":"Input","color":"aqua"}]
-scoreboard objectives add bs.id dummy [{"text":"BS ","color":"dark_gray"},{"text":"ID","color":"aqua"}]
-scoreboard objectives add bs.cid dummy [{"text":"BS ","color":"dark_gray"},{"text":"Chain ID","color":"aqua"}]
diff --git a/datapacks/Bookshelf/data/bs.id/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.id/function/__unload__.mcfunction
deleted file mode 100644
index 63ed9cefe4..0000000000
--- a/datapacks/Bookshelf/data/bs.id/function/__unload__.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/id.html
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard objectives remove bs.in
-scoreboard objectives remove bs.id
-scoreboard objectives remove bs.cid
diff --git a/datapacks/Bookshelf/data/bs.id/function/update_cuids/loop.mcfunction b/datapacks/Bookshelf/data/bs.id/function/update_cuids/loop.mcfunction
deleted file mode 100644
index 08d16893d6..0000000000
--- a/datapacks/Bookshelf/data/bs.id/function/update_cuids/loop.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players add $id.cuid bs.in 1
-execute unless entity @n[predicate=bs.id:cuid_equal,sort=arbitrary] run function bs.id:update_cuids/shift
-execute if score #size bs.cid < #counter bs.cid run function bs.id:update_cuids/loop
diff --git a/datapacks/Bookshelf/data/bs.id/function/update_cuids/update_cuids.mcfunction b/datapacks/Bookshelf/data/bs.id/function/update_cuids/update_cuids.mcfunction
deleted file mode 100644
index 77144ee7d1..0000000000
--- a/datapacks/Bookshelf/data/bs.id/function/update_cuids/update_cuids.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/id.html#update-chain-unique-id
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #size bs.cid if entity @e[scores={bs.cid=1..}]
-execute if score #size bs.cid < #counter bs.cid run scoreboard players set $id.cuid.check bs.in 0
-execute if score #size bs.cid < #counter bs.cid run function bs.id:update_cuids/loop
diff --git a/datapacks/Bookshelf/data/bs.id/predicate/cuid_equal.json b/datapacks/Bookshelf/data/bs.id/predicate/cuid_equal.json
deleted file mode 100644
index 648682dc7a..0000000000
--- a/datapacks/Bookshelf/data/bs.id/predicate/cuid_equal.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "condition": "minecraft:entity_scores",
- "entity": "this",
- "scores": {
- "bs.cid": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$id.cuid"
- },
- "score": "bs.in"
- },
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$id.cuid"
- },
- "score": "bs.in"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.id/predicate/cuid_lower.json b/datapacks/Bookshelf/data/bs.id/predicate/cuid_lower.json
deleted file mode 100644
index 5ad4132117..0000000000
--- a/datapacks/Bookshelf/data/bs.id/predicate/cuid_lower.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "condition": "minecraft:entity_scores",
- "entity": "this",
- "scores": {
- "bs.cid": {
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$id.cuid"
- },
- "score": "bs.in"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.id/predicate/cuid_match.json b/datapacks/Bookshelf/data/bs.id/predicate/cuid_match.json
deleted file mode 100644
index 74dc2dace6..0000000000
--- a/datapacks/Bookshelf/data/bs.id/predicate/cuid_match.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "condition": "minecraft:entity_scores",
- "entity": "this",
- "scores": {
- "bs.cid": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$id.cuid.min"
- },
- "score": "bs.in"
- },
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$id.cuid.max"
- },
- "score": "bs.in"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.id/predicate/cuid_upper.json b/datapacks/Bookshelf/data/bs.id/predicate/cuid_upper.json
deleted file mode 100644
index d40fc3f51e..0000000000
--- a/datapacks/Bookshelf/data/bs.id/predicate/cuid_upper.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "condition": "minecraft:entity_scores",
- "entity": "this",
- "scores": {
- "bs.cid": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$id.cuid"
- },
- "score": "bs.in"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.id/predicate/has_cuid.json b/datapacks/Bookshelf/data/bs.id/predicate/has_cuid.json
deleted file mode 100644
index 99f8864e06..0000000000
--- a/datapacks/Bookshelf/data/bs.id/predicate/has_cuid.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "condition": "minecraft:entity_scores",
- "entity": "this",
- "scores": {
- "bs.cid": {}
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.id/predicate/has_suid.json b/datapacks/Bookshelf/data/bs.id/predicate/has_suid.json
deleted file mode 100644
index ceedd4dcdb..0000000000
--- a/datapacks/Bookshelf/data/bs.id/predicate/has_suid.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "condition": "minecraft:entity_scores",
- "entity": "this",
- "scores": {
- "bs.id": {}
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.id/predicate/suid_equal.json b/datapacks/Bookshelf/data/bs.id/predicate/suid_equal.json
deleted file mode 100644
index da943586d3..0000000000
--- a/datapacks/Bookshelf/data/bs.id/predicate/suid_equal.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "condition": "minecraft:entity_scores",
- "entity": "this",
- "scores": {
- "bs.id": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$id.suid"
- },
- "score": "bs.in"
- },
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$id.suid"
- },
- "score": "bs.in"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.id/predicate/suid_lower.json b/datapacks/Bookshelf/data/bs.id/predicate/suid_lower.json
deleted file mode 100644
index bb6717940f..0000000000
--- a/datapacks/Bookshelf/data/bs.id/predicate/suid_lower.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "condition": "minecraft:entity_scores",
- "entity": "this",
- "scores": {
- "bs.id": {
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$id.suid"
- },
- "score": "bs.in"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.id/predicate/suid_match.json b/datapacks/Bookshelf/data/bs.id/predicate/suid_match.json
deleted file mode 100644
index 9d66e3efdd..0000000000
--- a/datapacks/Bookshelf/data/bs.id/predicate/suid_match.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "condition": "minecraft:entity_scores",
- "entity": "this",
- "scores": {
- "bs.id": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$id.suid.min"
- },
- "score": "bs.in"
- },
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$id.suid.max"
- },
- "score": "bs.in"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.id/predicate/suid_upper.json b/datapacks/Bookshelf/data/bs.id/predicate/suid_upper.json
deleted file mode 100644
index fe7873355f..0000000000
--- a/datapacks/Bookshelf/data/bs.id/predicate/suid_upper.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "condition": "minecraft:entity_scores",
- "entity": "this",
- "scores": {
- "bs.id": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$id.suid"
- },
- "score": "bs.in"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.id/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.id/tags/function/exclusive_load.json
deleted file mode 100644
index fc41052a85..0000000000
--- a/datapacks/Bookshelf/data/bs.id/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.id:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.id/tags/function/give_suid.json b/datapacks/Bookshelf/data/bs.id/tags/function/give_suid.json
deleted file mode 100644
index c835218c64..0000000000
--- a/datapacks/Bookshelf/data/bs.id/tags/function/give_suid.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/id.html#give-simple-unique-id",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2017/10/29",
- "minecraft_version": "1.13"
- },
- "updated": {
- "date": "2023/08/28",
- "minecraft_version": "23w33a"
- }
- },
- "values": [
- "bs.id:give_suid"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.id/tags/function/help.json b/datapacks/Bookshelf/data/bs.id/tags/function/help.json
deleted file mode 100644
index 72fb335f28..0000000000
--- a/datapacks/Bookshelf/data/bs.id/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.id:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.id/tags/function/load.json b/datapacks/Bookshelf/data/bs.id/tags/function/load.json
deleted file mode 100644
index e96a219be1..0000000000
--- a/datapacks/Bookshelf/data/bs.id/tags/function/load.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.id:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.id/tags/function/unload.json b/datapacks/Bookshelf/data/bs.id/tags/function/unload.json
deleted file mode 100644
index 53c5166f7a..0000000000
--- a/datapacks/Bookshelf/data/bs.id/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.id:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.id/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.id/test/__boot__.mcfunction
deleted file mode 100644
index b4835d2e11..0000000000
--- a/datapacks/Bookshelf/data/bs.id/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.id
-# @beforebatch function #bs.id:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.id/test/update_cuids.mcfunction b/datapacks/Bookshelf/data/bs.id/test/update_cuids.mcfunction
deleted file mode 100644
index 1915815063..0000000000
--- a/datapacks/Bookshelf/data/bs.id/test/update_cuids.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# Updating cuids always returns a continuous chain
-# @batch bs.id
-
-execute summon minecraft:marker run function #bs.id:give_cuid
-execute summon minecraft:armor_stand run function #bs.id:give_cuid
-execute summon minecraft:armor_stand run function #bs.id:give_cuid
-execute summon minecraft:marker run function #bs.id:give_cuid
-execute summon minecraft:marker run function #bs.id:give_cuid
-execute summon minecraft:armor_stand run function #bs.id:give_cuid
-execute summon minecraft:marker run function #bs.id:give_cuid
-kill @e[type=minecraft:armor_stand,distance=..1]
-
-function #bs.id:update_cuids
-scoreboard players set #packtest.i bs.cid 0
-execute store result score #packtest bs.cid run scoreboard players operation #packtest.i bs.cid > @e bs.cid
-execute as @e[type=minecraft:marker] if score @s bs.cid = #packtest.i bs.cid run scoreboard players remove #packtest.i bs.cid 1
-execute as @e[type=minecraft:marker] if score @s bs.cid = #packtest.i bs.cid run scoreboard players remove #packtest.i bs.cid 1
-execute as @e[type=minecraft:marker] if score @s bs.cid = #packtest.i bs.cid run scoreboard players remove #packtest.i bs.cid 1
-execute as @e[type=minecraft:marker] if score @s bs.cid = #packtest.i bs.cid run scoreboard players remove #packtest.i bs.cid 1
-scoreboard players operation #packtest bs.cid -= #packtest.i bs.cid
-kill @e[type=minecraft:marker,distance=..1]
-assert score #packtest bs.cid matches 4
diff --git a/datapacks/Bookshelf/data/bs.interaction/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.interaction/.metadata/generated/features.json
deleted file mode 100644
index 26a575646e..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/.metadata/generated/features.json
+++ /dev/null
@@ -1,112 +0,0 @@
-[
- {
- "name": "clear_events",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#clear-events",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/11/01",
- "version": "1.21.3"
- },
- "updated": {
- "date": "2024/11/01",
- "version": "1.21.3"
- }
- },
- {
- "name": "on_hover",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/03/30",
- "version": "24w13a"
- },
- "updated": {
- "date": "2024/11/01",
- "version": "1.21.3"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "on_hover_enter",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/03/30",
- "version": "24w13a"
- },
- "updated": {
- "date": "2024/11/01",
- "version": "1.21.3"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "on_hover_leave",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/03/30",
- "version": "24w13a"
- },
- "updated": {
- "date": "2024/11/01",
- "version": "1.21.3"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "on_left_click",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/03/30",
- "version": "24w13a"
- },
- "updated": {
- "date": "2024/11/01",
- "version": "1.21.3"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "on_right_click",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/03/30",
- "version": "24w13a"
- },
- "updated": {
- "date": "2024/11/01",
- "version": "1.21.3"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.interaction/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.interaction/.metadata/generated/module.json
deleted file mode 100644
index 5dbb0f2b40..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/.metadata/generated/module.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "name": "bs.interaction",
- "display_name": "Interaction",
- "description": "A low-level API to create GUI based on Interaction entity by binding events to it.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "weak_dependencies": [
- "bs.log"
- ],
- "features": [
- "bs.interaction:clear_events",
- "bs.interaction:on_hover",
- "bs.interaction:on_hover_enter",
- "bs.interaction:on_hover_leave",
- "bs.interaction:on_left_click",
- "bs.interaction:on_right_click"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.interaction/.metadata/module.json b/datapacks/Bookshelf/data/bs.interaction/.metadata/module.json
deleted file mode 100644
index 97fed51176..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/.metadata/module.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "bs.interaction",
- "display_name": "Interaction",
- "description": "A low-level API to create GUI based on Interaction entity by binding events to it.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html",
- "weak_dependencies": [
- "bs.log"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/__help__.mcfunction
deleted file mode 100644
index 7bd82aece6..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.interaction documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/__load__.mcfunction
deleted file mode 100644
index 108c2edcd8..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/__load__.mcfunction
+++ /dev/null
@@ -1,27 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-forceload add -30000000 1600
-execute unless entity B5-0-0-0-2 run summon minecraft:text_display -30000000 0 1600 {UUID:[I;181,0,0,2],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],view_range:0f}
-
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
-scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
-
-scoreboard objectives add bs.interaction.id dummy [{"text":"BS ","color":"dark_gray"},{"text":"Interaction ID","color":"aqua"}]
-scoreboard objectives add bs.interaction.hover dummy [{"text":"BS ","color":"dark_gray"},{"text":"Interaction Hover","color":"aqua"}]
-scoreboard objectives add bs.interaction.logout minecraft.custom:leave_game [{"text":"BS ","color":"dark_gray"},{"text":"Interaction Logout","color":"aqua"}]
-
-scoreboard players set 2 bs.const 2
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/__unload__.mcfunction
deleted file mode 100644
index a769e2a638..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/__unload__.mcfunction
+++ /dev/null
@@ -1,27 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-kill B5-0-0-0-2
-forceload remove -30000000 1600
-
-execute as @e[type=minecraft:interaction] run function #bs.interaction:clear_events {with:{}}
-
-scoreboard objectives remove bs.interaction.id
-
-scoreboard objectives remove bs.ctx
-scoreboard objectives remove bs.data
-scoreboard objectives remove bs.const
-
-data remove storage bs:data interaction
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/callback/none.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/callback/none.mcfunction
deleted file mode 100644
index 1833eb26b2..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/callback/none.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#default-callback
-# ------------------------------------------------------------------------------------------------------------
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/clear_events/clear_events.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/clear_events/clear_events.mcfunction
deleted file mode 100644
index d10159c812..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/clear_events/clear_events.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#clear-events
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:ctx _ set value $(with)
-execute store result storage bs:ctx y int 1 run scoreboard players get @s bs.interaction.id
-return run function bs.interaction:clear_events/remove_matching with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover/as_target.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover/as_target.mcfunction
deleted file mode 100644
index 1460dd1a25..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover/as_target.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute if entity @s[tag=bs.interaction.listen_hover] run function bs.interaction:on_event/hover/dispatch with storage bs:ctx
-tag @s remove bs.interaction.target
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover/dispatch.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover/dispatch.mcfunction
deleted file mode 100644
index c3cb8db976..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover/dispatch.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data interaction.run set value []
-$data modify storage bs:data interaction.run append from storage bs:data interaction.$(y)[{type:"hover"}]
-execute if data storage bs:data interaction.run[-1] run function bs.interaction:on_event/run with storage bs:data interaction.run[-1]
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover/hover.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover/hover.mcfunction
deleted file mode 100644
index d8b9523e38..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover/hover.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# Check only the interaction that the player was looking at.
-# If the player is not looking at any interaction, return the hover leave event and restart the whole cycle.
-
-tag @s add bs.interaction.source
-execute store result storage bs:ctx y int 1 run scoreboard players get @s bs.interaction.id
-execute as @n[type=minecraft:interaction,predicate=bs.interaction:check_id] run tag @s add bs.interaction.target
-$execute unless predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"minecraft:player","looking_at":{"type":"minecraft:interaction","nbt":"{\"Tags\":[\"bs.interaction.target\"]}","distance":{"absolute":{"max":$(y)}}}}}} run return run function bs.interaction:on_event/hover_leave/hover_leave
-execute as @n[type=minecraft:interaction,tag=bs.interaction.target,distance=..24] run function bs.interaction:on_event/hover/as_target
-tag @s remove bs.interaction.source
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_enter/as_target.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_enter/as_target.mcfunction
deleted file mode 100644
index b383827905..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_enter/as_target.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players add @s bs.interaction.hover 1
-scoreboard players add #interaction.active_hover bs.data 1
-execute store result storage bs:ctx y int 1 run scoreboard players operation @p[distance=0,tag=bs.interaction.source] bs.interaction.id = @s bs.interaction.id
-execute if entity @s[tag=bs.interaction.listen_hover_enter] run function bs.interaction:on_event/hover_enter/dispatch with storage bs:ctx
-execute if entity @s[tag=bs.interaction.listen_hover] run function bs.interaction:on_event/hover/dispatch with storage bs:ctx
-tag @s remove bs.interaction.target
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_enter/dispatch.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_enter/dispatch.mcfunction
deleted file mode 100644
index 83bf978830..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_enter/dispatch.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data interaction.run set value []
-$data modify storage bs:data interaction.run append from storage bs:data interaction.$(y)[{type:"hover_enter"}]
-execute if data storage bs:data interaction.run[-1] run function bs.interaction:on_event/run with storage bs:data interaction.run[-1]
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_enter/hover_enter.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_enter/hover_enter.mcfunction
deleted file mode 100644
index 166c787631..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_enter/hover_enter.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute unless predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"minecraft:player","looking_at":{"type":"minecraft:interaction","nbt":"{\"Tags\":[\"bs.interaction.is_hoverable\"]}","distance":{"absolute":{"max":$(y)}}}}}} run return fail
-
-tag @s add bs.interaction.source
-tag @n[type=minecraft:interaction,tag=bs.interaction.is_hoverable,distance=..24,limit=2147483647] add bs.interaction.target
-function bs.interaction:on_event/hover_enter/get_target/filter
-execute as @n[type=minecraft:interaction,tag=bs.interaction.target,distance=..24] run function bs.interaction:on_event/hover_enter/as_target
-tag @s remove bs.interaction.source
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_leave/as_target.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_leave/as_target.mcfunction
deleted file mode 100644
index 7f05b361c1..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_leave/as_target.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-tag @s add bs.interaction.target
-scoreboard players remove @s bs.interaction.hover 1
-scoreboard players remove #interaction.active_hover bs.data 1
-execute if entity @s[tag=bs.interaction.listen_hover_leave] run function bs.interaction:on_event/hover_leave/dispatch with storage bs:ctx
-tag @s remove bs.interaction.target
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_leave/dispatch.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_leave/dispatch.mcfunction
deleted file mode 100644
index 38061effd2..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_leave/dispatch.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data interaction.run set value []
-$data modify storage bs:data interaction.run append from storage bs:data interaction.$(y)[{type:"hover_leave"}]
-execute if data storage bs:data interaction.run[-1] run function bs.interaction:on_event/run with storage bs:data interaction.run[-1]
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_leave/hover_leave.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_leave/hover_leave.mcfunction
deleted file mode 100644
index 0d75462034..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_leave/hover_leave.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute as @n[type=minecraft:interaction,tag=bs.interaction.target] run function bs.interaction:on_event/hover_leave/as_target
-tag @s remove bs.interaction.source
-scoreboard players reset @s bs.interaction.id
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/left_click/as_target.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/on_event/left_click/as_target.mcfunction
deleted file mode 100644
index 0a80e9ab98..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/left_click/as_target.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute on attacker unless entity @s[tag=bs.interaction.source] run return fail
-tag @s add bs.interaction.target
-execute store result storage bs:ctx y int 1 run scoreboard players get @s bs.interaction.id
-function bs.interaction:on_event/left_click/dispatch with storage bs:ctx
-tag @s remove bs.interaction.target
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/left_click/dispatch.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/on_event/left_click/dispatch.mcfunction
deleted file mode 100644
index 81ad875d50..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/left_click/dispatch.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data interaction.run set value []
-$data modify storage bs:data interaction.run append from storage bs:data interaction.$(y)[{type:"left_click"}]
-execute if data storage bs:data interaction.run[-1] run function bs.interaction:on_event/run with storage bs:data interaction.run[-1]
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/left_click/left_click.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/on_event/left_click/left_click.mcfunction
deleted file mode 100644
index 2a650b8c9f..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/left_click/left_click.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# Note:
-# Function called when a left click is done on a left click listener.
-
-advancement revoke @s only bs.interaction:left_click
-tag @s add bs.interaction.source
-execute as @n[type=minecraft:interaction,tag=bs.interaction.listen_left_click,distance=..24,limit=2147483647] run function bs.interaction:on_event/left_click/as_target
-tag @s remove bs.interaction.source
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/right_click/as_target.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/on_event/right_click/as_target.mcfunction
deleted file mode 100644
index e1bdedd4ab..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/right_click/as_target.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute on target unless entity @s[tag=bs.interaction.source] run return fail
-tag @s add bs.interaction.target
-execute store result storage bs:ctx y int 1 run scoreboard players get @s bs.interaction.id
-function bs.interaction:on_event/right_click/dispatch with storage bs:ctx
-tag @s remove bs.interaction.target
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/right_click/dispatch.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/on_event/right_click/dispatch.mcfunction
deleted file mode 100644
index 00db1526e2..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/right_click/dispatch.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data interaction.run set value []
-$data modify storage bs:data interaction.run append from storage bs:data interaction.$(y)[{type:"right_click"}]
-execute if data storage bs:data interaction.run[-1] run function bs.interaction:on_event/run with storage bs:data interaction.run[-1]
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/right_click/right_click.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/on_event/right_click/right_click.mcfunction
deleted file mode 100644
index cdf133f6c5..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/right_click/right_click.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# Note:
-# Function called when a right click is done on a right click listener.
-
-advancement revoke @s only bs.interaction:right_click
-tag @s add bs.interaction.source
-execute as @n[type=minecraft:interaction,tag=bs.interaction.listen_right_click,distance=..24,limit=2147483647] run function bs.interaction:on_event/right_click/as_target
-tag @s remove bs.interaction.source
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/run.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/on_event/run.mcfunction
deleted file mode 100644
index 4a090ff25a..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/run.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute as $(executor) run $(run)
-data remove storage bs:data interaction.run[-1]
-execute if data storage bs:data interaction.run[-1] run function bs.interaction:on_event/run with storage bs:data interaction.run[-1]
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/register/hover.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/register/hover.mcfunction
deleted file mode 100644
index 4f78d09631..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/register/hover.mcfunction
+++ /dev/null
@@ -1,61 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event
-# ------------------------------------------------------------------------------------------------------------
-
-# Note:
-# Add a new command to trigger continuously when the current interaction is hovered.
-#
-# Input:
-# - macro variable { run: , executor: target|source| | { selector: , lazy: true|false } }
-# Output:
-# - Fail if the current entity is not an interaction.
-
-execute unless entity @s[type=interaction] run return run function #bs.log:error { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_hover", \
- tag: "on_hover", \
- message: '"The current entity is not an interaction."', \
-}
-$data modify storage bs:ctx _ set value { run: '$(run)', executor: $(executor), type: "hover" }
-
-execute store success score #s bs.ctx run function bs.interaction:register/utils/check_command with storage bs:ctx _
-execute unless score #s bs.ctx matches 1 run return run function #bs.log:error { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_hover", \
- tag: "on_hover", \
- message: '"The command is not valid."', \
-}
-
-execute unless function bs.interaction:register/utils/executor/setup \
- run return run function #bs.log:error { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_hover", \
- tag: "on_hover", \
- message: '"The executor is not valid or cannot be interpreted."', \
- }
-
-execute if score #i bs.ctx matches 2.. run function #bs.log:warn { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_hover", \
- tag: "on_hover", \
- message: '"The selector points to multiple entities. Only the first one is selected."' \
-}
-
-tag @s add bs.interaction.is_hoverable
-tag @s add bs.interaction.listen_hover
-scoreboard players set #interaction.process bs.data 1
-schedule function bs.interaction:on_event/process 1t replace
-return run function bs.interaction:register/utils/setup_listener
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/register/hover_enter.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/register/hover_enter.mcfunction
deleted file mode 100644
index 47cca608c3..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/register/hover_enter.mcfunction
+++ /dev/null
@@ -1,61 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event
-# ------------------------------------------------------------------------------------------------------------
-
-# Note:
-# Add a new command to trigger when the current interaction is hovered.
-#
-# Input:
-# - macro variable { run: , executor: target|source| | { selector: , lazy: true|false } }
-# Output:
-# - Fail if the current entity is not an interaction.
-
-execute unless entity @s[type=interaction] run return run function #bs.log:error { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_hover_enter", \
- tag: "on_hover_enter", \
- message: '"The current entity is not an interaction."', \
-}
-$data modify storage bs:ctx _ set value { run: '$(run)', executor: $(executor), type: "hover_enter" }
-
-execute store success score #s bs.ctx run function bs.interaction:register/utils/check_command with storage bs:ctx _
-execute unless score #s bs.ctx matches 1 run return run function #bs.log:error { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_hover_enter", \
- tag: "on_hover_enter", \
- message: '"The command is not valid."', \
-}
-
-execute unless function bs.interaction:register/utils/executor/setup \
- run return run function #bs.log:error { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_hover_enter", \
- tag: "on_hover_enter", \
- message: '"The executor is not valid or cannot be interpreted."', \
- }
-
-execute if score #i bs.ctx matches 2.. run function #bs.log:warn { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_hover_enter", \
- tag: "on_hover_enter", \
- message: '"The selector points to multiple entities. Only the first one is selected."' \
-}
-
-tag @s add bs.interaction.is_hoverable
-tag @s add bs.interaction.listen_hover_enter
-scoreboard players set #interaction.process bs.data 1
-schedule function bs.interaction:on_event/process 1t replace
-return run function bs.interaction:register/utils/setup_listener
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/register/hover_leave.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/register/hover_leave.mcfunction
deleted file mode 100644
index 16d8f26a80..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/register/hover_leave.mcfunction
+++ /dev/null
@@ -1,61 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event
-# ------------------------------------------------------------------------------------------------------------
-
-# Note:
-# Add a new command to trigger when the current interaction is no longer hovered.
-#
-# Input:
-# - macro variable { run: , executor: target|source| | { selector: , lazy: true|false } }
-# Output:
-# - Fail if the current entity is not an interaction.
-
-execute unless entity @s[type=interaction] run return run function #bs.log:error { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_hover_leave", \
- tag: "on_hover_leave", \
- message: '"The current entity is not an interaction."', \
-}
-$data modify storage bs:ctx _ set value { run: '$(run)', executor: $(executor), type: "hover_leave" }
-
-execute store success score #s bs.ctx run function bs.interaction:register/utils/check_command with storage bs:ctx _
-execute unless score #s bs.ctx matches 1 run return run function #bs.log:error { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_hover_leave", \
- tag: "on_hover_leave", \
- message: '"The command is not valid."', \
-}
-
-execute unless function bs.interaction:register/utils/executor/setup \
- run return run function #bs.log:error { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_hover_leave", \
- tag: "on_hover_leave", \
- message: '"The executor is not valid or cannot be interpreted."', \
- }
-
-execute if score #i bs.ctx matches 2.. run function #bs.log:warn { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_hover_leave", \
- tag: "on_hover_leave", \
- message: '"The selector points to multiple entities. Only the first one is selected."' \
-}
-
-tag @s add bs.interaction.is_hoverable
-tag @s add bs.interaction.listen_hover_leave
-scoreboard players set #interaction.process bs.data 1
-schedule function bs.interaction:on_event/process 1t replace
-return run function bs.interaction:register/utils/setup_listener
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/register/left_click.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/register/left_click.mcfunction
deleted file mode 100644
index a4a6b2d72d..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/register/left_click.mcfunction
+++ /dev/null
@@ -1,58 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event
-# ------------------------------------------------------------------------------------------------------------
-
-# Note:
-# Add a new command to trigger when the current interaction is left clicked.
-#
-# Input:
-# - macro variable { run: , executor: target|source| | { selector: , lazy: true|false } }
-# Output:
-# - Fail if the current entity is not an interaction.
-
-execute unless entity @s[type=interaction] run return run function #bs.log:error { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_left_click", \
- tag: "on_left_click", \
- message: '"The current entity is not an interaction."', \
-}
-$data modify storage bs:ctx _ set value { run: '$(run)', executor: $(executor), type: "left_click" }
-
-execute store success score #s bs.ctx run function bs.interaction:register/utils/check_command with storage bs:ctx _
-execute unless score #s bs.ctx matches 1 run return run function #bs.log:error { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_left_click", \
- tag: "on_left_click", \
- message: '"The command is not valid."', \
-}
-
-execute unless function bs.interaction:register/utils/executor/setup \
- run return run function #bs.log:error { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_left_click", \
- tag: "on_left_click", \
- message: '"The executor is not valid or cannot be interpreted."', \
- }
-
-execute if score #i bs.ctx matches 2.. run function #bs.log:warn { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_left_click", \
- tag: "on_left_click", \
- message: '"The selector points to multiple entities. Only the first one is selected."' \
-}
-
-tag @s add bs.interaction.listen_left_click
-return run function bs.interaction:register/utils/setup_listener
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/register/right_click.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/register/right_click.mcfunction
deleted file mode 100644
index 3d59be625c..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/register/right_click.mcfunction
+++ /dev/null
@@ -1,58 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event
-# ------------------------------------------------------------------------------------------------------------
-
-# Note:
-# Add a new command to trigger when the current interaction is right clicked.
-#
-# Input:
-# - macro variable { run: , executor: target|source| | { selector: , lazy: true|false } }
-# Output:
-# - Fail if the current entity is not an interaction.
-
-execute unless entity @s[type=interaction] run return run function #bs.log:error { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_right_click", \
- tag: "on_right_click", \
- message: '"The current entity is not an interaction."', \
-}
-$data modify storage bs:ctx _ set value { run: '$(run)', executor: $(executor), type: "right_click" }
-
-execute store success score #s bs.ctx run function bs.interaction:register/utils/check_command with storage bs:ctx _
-execute unless score #s bs.ctx matches 1 run return run function #bs.log:error { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_right_click", \
- tag: "on_right_click", \
- message: '"The command is not valid."', \
-}
-
-execute unless function bs.interaction:register/utils/executor/setup \
- run return run function #bs.log:error { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_right_click", \
- tag: "on_right_click", \
- message: '"The executor is not valid or cannot be interpreted."', \
- }
-
-execute if score #i bs.ctx matches 2.. run function #bs.log:warn { \
- namespace: bs.interaction, \
- path: "#bs.interaction:on_right_click", \
- tag: "on_right_click", \
- message: '"The selector points to multiple entities. Only the first one is selected."' \
-}
-
-tag @s add bs.interaction.listen_right_click
-return run function bs.interaction:register/utils/setup_listener
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/register/utils/executor/check.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/register/utils/executor/check.mcfunction
deleted file mode 100644
index 61ad144fa7..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/register/utils/executor/check.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-return 1
-$execute if entity $(executor)
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/register/utils/executor/setup.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/register/utils/executor/setup.mcfunction
deleted file mode 100644
index 6b6268ffb5..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/register/utils/executor/setup.mcfunction
+++ /dev/null
@@ -1,25 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# Set the executor to the target or the source
-execute if data storage bs:ctx _{executor: "target"} run data modify storage bs:ctx _.executor set value "@s"
-execute if data storage bs:ctx _{executor: "source"} run data modify storage bs:ctx _.executor set value "@p[distance=0,tag=bs.interaction.source]"
-# The executor should be interpreted now only if lazy is set to false
-execute if data storage bs:ctx _.executor{lazy: false} run function bs.interaction:register/utils/executor/interpret with storage bs:ctx _.executor
-# If executor is still an object, replace the executor by the internal selector
-data modify storage bs:ctx _.executor set from storage bs:ctx _.executor.selector
-# Check if the executor is a valid selector
-execute store success score #s bs.ctx run function bs.interaction:register/utils/executor/check with storage bs:ctx _
-return run scoreboard players get #s bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/register/utils/executor/unquote.mcfunction b/datapacks/Bookshelf/data/bs.interaction/function/register/utils/executor/unquote.mcfunction
deleted file mode 100644
index ae62c7617a..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/function/register/utils/executor/unquote.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:ctx _.executor set value $(text)
diff --git a/datapacks/Bookshelf/data/bs.interaction/tags/function/callback/glow.json b/datapacks/Bookshelf/data/bs.interaction/tags/function/callback/glow.json
deleted file mode 100644
index 12f247bdc4..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/tags/function/callback/glow.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.interaction:callback/glow"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.interaction/tags/function/callback/none.json b/datapacks/Bookshelf/data/bs.interaction/tags/function/callback/none.json
deleted file mode 100644
index 9b51471287..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/tags/function/callback/none.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.interaction:callback/none"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.interaction/tags/function/callback/unglow.json b/datapacks/Bookshelf/data/bs.interaction/tags/function/callback/unglow.json
deleted file mode 100644
index d24bbd1204..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/tags/function/callback/unglow.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.interaction:callback/unglow"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.interaction/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.interaction/tags/function/exclusive_load.json
deleted file mode 100644
index a5c9e84a65..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.interaction:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.interaction/tags/function/help.json b/datapacks/Bookshelf/data/bs.interaction/tags/function/help.json
deleted file mode 100644
index 01402355ec..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.interaction:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.interaction/tags/function/load.json b/datapacks/Bookshelf/data/bs.interaction/tags/function/load.json
deleted file mode 100644
index 4a6319cb76..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/tags/function/load.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.interaction:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.interaction/tags/function/unload.json b/datapacks/Bookshelf/data/bs.interaction/tags/function/unload.json
deleted file mode 100644
index 80650d1381..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.interaction:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.interaction/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.interaction/test/__boot__.mcfunction
deleted file mode 100644
index 9c7b51a2b0..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.interaction
-# @beforebatch function #bs.interaction:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.interaction/test/clear_events.mcfunction b/datapacks/Bookshelf/data/bs.interaction/test/clear_events.mcfunction
deleted file mode 100644
index 2df40c5755..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/test/clear_events.mcfunction
+++ /dev/null
@@ -1,78 +0,0 @@
-# @batch bs.interaction
-
-## === SETUP ===
-
-summon minecraft:interaction ~.5 ~ ~.5 {Tags: ["bs.packtest","bs.packtest.executor"], width: 1.0, height: 2.0}
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_left_click { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_left_click { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_right_click { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_right_click { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover_enter { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover_enter { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover_leave { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover_leave { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover { run: "help", executor: "target" }
-data modify storage bs:data packtest set value {with:{}}
-
-## === EXPECTED BEHAVIORS (CLEAR LEFT CLICK) ===
-
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result storage bs:data packtest.with.id int 1 run function #bs.interaction:on_left_click { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events with storage bs:data packtest
-execute unless score #i bs.ctx matches 1 run fail "Clear events should clear a single event when using the id"
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events { with: { type: "left_click" } }
-execute unless score #i bs.ctx matches 2 run fail "Clear events should clear all events when using the type"
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] if entity @s[tag=bs.interaction.listen_left_click] run fail "Interaction should stop listening to left_click events when they are cleared"
-
-## === EXPECTED BEHAVIORS (CLEAR RIGHT CLICK) ===
-
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result storage bs:data packtest.with.id int 1 run function #bs.interaction:on_right_click { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events with storage bs:data packtest
-execute unless score #i bs.ctx matches 1 run fail "Clear events should clear a single event when using the id"
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events { with: { type: "right_click" } }
-execute unless score #i bs.ctx matches 2 run fail "Clear events should clear all events when using the type"
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] if entity @s[tag=bs.interaction.listen_right_click] run fail "Interaction should stop listening to right_click events when they are cleared"
-
-## === EXPECTED BEHAVIORS (CLEAR HOVER ENTER) ===
-
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result storage bs:data packtest.with.id int 1 run function #bs.interaction:on_hover_enter { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events with storage bs:data packtest
-execute unless score #i bs.ctx matches 1 run fail "Clear events should clear a single event when using the id"
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events { with: { type: "hover_enter" } }
-execute unless score #i bs.ctx matches 2 run fail "Clear events should clear all events when using the type"
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] if entity @s[tag=bs.interaction.listen_hover_enter] run fail "Interaction should stop listening to hover_enter events when they are cleared"
-
-## === EXPECTED BEHAVIORS (CLEAR HOVER LEAVE) ===
-
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result storage bs:data packtest.with.id int 1 run function #bs.interaction:on_hover_leave { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events with storage bs:data packtest
-execute unless score #i bs.ctx matches 1 run fail "Clear events should clear a single event when using the id"
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events { with: { type: "hover_leave" } }
-execute unless score #i bs.ctx matches 2 run fail "Clear events should clear all events when using the type"
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] if entity @s[tag=bs.interaction.listen_hover_leave] run fail "Interaction should stop listening to hover_leave events when they are cleared"
-
-## === EXPECTED BEHAVIORS (CLEAR HOVER) ===
-
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result storage bs:data packtest.with.id int 1 run function #bs.interaction:on_hover { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events with storage bs:data packtest
-execute unless score #i bs.ctx matches 1 run fail "Clear events should clear a single event when using the id"
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events { with: { type: "hover" } }
-execute unless score #i bs.ctx matches 2 run fail "Clear events should clear all events when using the type"
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] if entity @s[tag=bs.interaction.listen_hover] run fail "Interaction should stop listening to hover events when they are cleared"
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] if entity @s[tag=bs.interaction.is_hoverable] run fail "Interaction should stop listening to all hover events when they are cleared"
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] if score @s bs.interaction.id matches 1.. run fail "Clear events should reset the interaction id when all events are cleared"
-
-## === EXPECTED BEHAVIORS (CLEAR ALL) ===
-
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_left_click { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_right_click { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover_enter { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover_leave { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover { run: "help", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events { with: {} }
-execute unless score #i bs.ctx matches 5 run fail "Clear events should clear all events when using an empty object"
-
-## === EXPECTED BEHAVIORS (CLEAR NONE) ===
-
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events { with: {} }
-execute unless score #i bs.ctx matches 0 run fail "Clear events should return 0 when no events are registered"
diff --git a/datapacks/Bookshelf/data/bs.interaction/test/on_hover_logout.mcfunction b/datapacks/Bookshelf/data/bs.interaction/test/on_hover_logout.mcfunction
deleted file mode 100644
index b212222b63..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/test/on_hover_logout.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# @batch bs.interaction
-# @dummy
-
-## === SETUP ===
-fill ~-1 ~-1 ~-1 ~1 ~1 ~1 minecraft:air replace minecraft:barrier
-summon minecraft:interaction ~.5 ~ ~1.5 {Tags: ["bs.packtest"], width: 1.0, height: 2.0}
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover_enter { run: "scoreboard players add #packtest.interaction_hover_count bs.data 1", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover_leave { run: "scoreboard players remove #packtest.interaction_hover_count bs.data 1", executor: "target" }
-scoreboard players set #packtest.interaction_hover_count bs.data 0
-
-## === EXPECTED BEHAVIORS ===
-
-execute positioned ~.5 ~ ~.5 run dummy on_hover_logout spawn
-await delay 2t
-assert score #packtest.interaction_hover_count bs.data matches 2
-dummy on_hover_logout leave
-await delay 1t
-assert score #packtest.interaction_hover_count bs.data matches 1
diff --git a/datapacks/Bookshelf/data/bs.interaction/test/on_hover_swap.mcfunction b/datapacks/Bookshelf/data/bs.interaction/test/on_hover_swap.mcfunction
deleted file mode 100644
index d00c15f4cd..0000000000
--- a/datapacks/Bookshelf/data/bs.interaction/test/on_hover_swap.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# @batch bs.interaction
-# @dummy
-
-## === SETUP ===
-
-fill ~-1 ~-1 ~-1 ~1 ~1 ~1 minecraft:air replace minecraft:barrier
-summon minecraft:interaction ~ ~ ~1.5 {Tags: ["bs.packtest","bs.packtest.1"], width: 1.0, height: 2.0}
-summon minecraft:interaction ~1 ~ ~1.5 {Tags: ["bs.packtest","bs.packtest.2"], width: 1.0, height: 2.0}
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..3,limit=2] run function #bs.interaction:on_hover_enter { run: "tag @s add bs.packtest.target", executor: "target" }
-execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..3,limit=2] run function #bs.interaction:on_hover_leave { run: "tag @s remove bs.packtest.target", executor: "target" }
-
-## === EXPECTED BEHAVIORS ===
-
-tp @s ~.5 ~ ~.5 45 0
-await delay 2t
-execute unless entity @n[type=minecraft:interaction,tag=bs.packtest.1,tag=bs.packtest.target,distance=..2] run fail "Failed to run callback on target entity"
-tp @s ~.5 ~ ~.5 -45 0
-await delay 2t
-execute if entity @n[type=minecraft:interaction,tag=bs.packtest.1,tag=bs.packtest.target,distance=..2] run fail "Failed to swap hover to an other target entity"
-execute unless entity @n[type=minecraft:interaction,tag=bs.packtest.2,tag=bs.packtest.target,distance=..2] run fail "Failed to swap hover to an other target entity"
diff --git a/datapacks/Bookshelf/data/bs.link/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.link/.metadata/generated/features.json
deleted file mode 100644
index 1b72a86cb4..0000000000
--- a/datapacks/Bookshelf/data/bs.link/.metadata/generated/features.json
+++ /dev/null
@@ -1,435 +0,0 @@
-[
- {
- "name": "as_children",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#relationships",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/07",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/07",
- "version": "1.21"
- }
- },
- {
- "name": "as_parent",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#relationships",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/07",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/07",
- "version": "1.21"
- }
- },
- {
- "name": "at_children",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#relationships",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/07",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/07",
- "version": "1.21"
- }
- },
- {
- "name": "at_parent",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#relationships",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/07",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/07",
- "version": "1.21"
- }
- },
- {
- "name": "create_link_ata",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#create-link",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2020/05/16",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.15"
- },
- "dependencies": [
- "bs.id"
- ]
- },
- {
- "name": "imitate_pos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "imitate_pos_and_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/09/09",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "imitate_pos_x",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "imitate_pos_y",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "imitate_pos_z",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "imitate_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "imitate_rot_h",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "imitate_rot_v",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "keep_local_pos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#keep-local-position",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2019/07/13",
- "version": "1.14"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.1"
- }
- },
- {
- "name": "mirror_point_ata",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#mirror-point",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/10",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.1"
- },
- "dependencies": [
- "bs.position"
- ]
- },
- {
- "name": "mirror_x_plane",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#mirror-plane",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/10",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.1"
- }
- },
- {
- "name": "mirror_z_plane",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#mirror-plane",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/10",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.1"
- }
- },
- {
- "name": "remove_link",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#remove-link",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/07",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/07",
- "version": "1.21"
- }
- },
- {
- "name": "reverse_pos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "reverse_pos_and_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "reverse_pos_x",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "reverse_pos_y",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "reverse_pos_z",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "reverse_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "reverse_rot_h",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "reverse_rot_v",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "update_link",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#update-link",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/10/20",
- "version": "1.20.2"
- },
- "dependencies": [
- "bs.position"
- ]
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.link/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.link/.metadata/generated/module.json
deleted file mode 100644
index 0555d2ae92..0000000000
--- a/datapacks/Bookshelf/data/bs.link/.metadata/generated/module.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "name": "bs.link",
- "display_name": "Link",
- "description": "Construct coherent entity structures by linking entities’ positions and rotations.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "dependencies": [
- "bs.id",
- "bs.position"
- ],
- "features": [
- "bs.link:as_children",
- "bs.link:as_parent",
- "bs.link:at_children",
- "bs.link:at_parent",
- "bs.link:create_link_ata",
- "bs.link:imitate_pos",
- "bs.link:imitate_pos_and_rot",
- "bs.link:imitate_pos_x",
- "bs.link:imitate_pos_y",
- "bs.link:imitate_pos_z",
- "bs.link:imitate_rot",
- "bs.link:imitate_rot_h",
- "bs.link:imitate_rot_v",
- "bs.link:keep_local_pos",
- "bs.link:mirror_point_ata",
- "bs.link:mirror_x_plane",
- "bs.link:mirror_z_plane",
- "bs.link:remove_link",
- "bs.link:reverse_pos",
- "bs.link:reverse_pos_and_rot",
- "bs.link:reverse_pos_x",
- "bs.link:reverse_pos_y",
- "bs.link:reverse_pos_z",
- "bs.link:reverse_rot",
- "bs.link:reverse_rot_h",
- "bs.link:reverse_rot_v",
- "bs.link:update_link"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/.metadata/module.json b/datapacks/Bookshelf/data/bs.link/.metadata/module.json
deleted file mode 100644
index 883d9bd5ba..0000000000
--- a/datapacks/Bookshelf/data/bs.link/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.link",
- "display_name": "Link",
- "description": "Construct coherent entity structures by linking entities’ positions and rotations.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html"
-}
diff --git a/datapacks/Bookshelf/data/bs.link/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.link/function/__help__.mcfunction
deleted file mode 100644
index a5b86249b1..0000000000
--- a/datapacks/Bookshelf/data/bs.link/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.link documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.link/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.link/function/__load__.mcfunction
deleted file mode 100644
index 2668522107..0000000000
--- a/datapacks/Bookshelf/data/bs.link/function/__load__.mcfunction
+++ /dev/null
@@ -1,34 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-
-scoreboard objectives add bs.link.rx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Link relative X","color":"aqua"}]
-scoreboard objectives add bs.link.ry dummy [{"text":"BS ","color":"dark_gray"},{"text":"Link relative Y","color":"aqua"}]
-scoreboard objectives add bs.link.rz dummy [{"text":"BS ","color":"dark_gray"},{"text":"Link relative Z","color":"aqua"}]
-scoreboard objectives add bs.link.lx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Link local X","color":"aqua"}]
-scoreboard objectives add bs.link.ly dummy [{"text":"BS ","color":"dark_gray"},{"text":"Link local Y","color":"aqua"}]
-scoreboard objectives add bs.link.lz dummy [{"text":"BS ","color":"dark_gray"},{"text":"Link local Z","color":"aqua"}]
-scoreboard objectives add bs.link.lv dummy [{"text":"BS ","color":"dark_gray"},{"text":"Link local V","color":"aqua"}]
-scoreboard objectives add bs.link.lh dummy [{"text":"BS ","color":"dark_gray"},{"text":"Link local H","color":"aqua"}]
-scoreboard objectives add bs.link.to dummy [{"text":"BS ","color":"dark_gray"},{"text":"Linked to","color":"aqua"}]
-
-scoreboard players set 10 bs.const 10
-
-execute store result score #w bs.ctx run worldborder get
-execute if score #w bs.ctx matches 2147484.. run worldborder set 2147483 0
diff --git a/datapacks/Bookshelf/data/bs.link/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.link/function/__unload__.mcfunction
deleted file mode 100644
index eb0a32bae9..0000000000
--- a/datapacks/Bookshelf/data/bs.link/function/__unload__.mcfunction
+++ /dev/null
@@ -1,32 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard objectives remove bs.const
-scoreboard objectives remove bs.ctx
-
-scoreboard objectives remove bs.link.rx
-scoreboard objectives remove bs.link.ry
-scoreboard objectives remove bs.link.rz
-
-scoreboard objectives remove bs.link.lx
-scoreboard objectives remove bs.link.ly
-scoreboard objectives remove bs.link.lz
-
-scoreboard objectives remove bs.link.lv
-scoreboard objectives remove bs.link.lh
-
-scoreboard objectives remove bs.link.to
diff --git a/datapacks/Bookshelf/data/bs.link/function/as_children.mcfunction b/datapacks/Bookshelf/data/bs.link/function/as_children.mcfunction
deleted file mode 100644
index 667f17581b..0000000000
--- a/datapacks/Bookshelf/data/bs.link/function/as_children.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#relationships
-# ------------------------------------------------------------------------------------------------------------
-
-execute unless predicate bs.id:has_suid run return fail
-
-scoreboard players operation $link.to bs.in = @s bs.id
-$execute as @e[predicate=bs.link:link_equal] run $(run)
diff --git a/datapacks/Bookshelf/data/bs.link/function/as_parent.mcfunction b/datapacks/Bookshelf/data/bs.link/function/as_parent.mcfunction
deleted file mode 100644
index 0ae456ed0c..0000000000
--- a/datapacks/Bookshelf/data/bs.link/function/as_parent.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#relationships
-# ------------------------------------------------------------------------------------------------------------
-
-execute unless predicate bs.link:has_link run return fail
-
-scoreboard players operation $id.suid bs.in = @s bs.link.to
-$execute as @n[predicate=bs.id:suid_equal,sort=arbitrary] run $(run)
diff --git a/datapacks/Bookshelf/data/bs.link/function/at_children.mcfunction b/datapacks/Bookshelf/data/bs.link/function/at_children.mcfunction
deleted file mode 100644
index dd6ae76dbb..0000000000
--- a/datapacks/Bookshelf/data/bs.link/function/at_children.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#relationships
-# ------------------------------------------------------------------------------------------------------------
-
-execute unless predicate bs.id:has_suid run return fail
-
-scoreboard players operation $link.to bs.in = @s bs.id
-$execute at @e[predicate=bs.link:link_equal] run $(run)
diff --git a/datapacks/Bookshelf/data/bs.link/function/at_parent.mcfunction b/datapacks/Bookshelf/data/bs.link/function/at_parent.mcfunction
deleted file mode 100644
index 408cab5851..0000000000
--- a/datapacks/Bookshelf/data/bs.link/function/at_parent.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#relationships
-# ------------------------------------------------------------------------------------------------------------
-
-execute unless predicate bs.link:has_link run return fail
-
-scoreboard players operation $id.suid bs.in = @s bs.link.to
-$execute at @n[predicate=bs.id:suid_equal,sort=arbitrary] run $(run)
diff --git a/datapacks/Bookshelf/data/bs.link/function/behaviors/apply.mcfunction b/datapacks/Bookshelf/data/bs.link/function/behaviors/apply.mcfunction
deleted file mode 100644
index 1d1432f3dd..0000000000
--- a/datapacks/Bookshelf/data/bs.link/function/behaviors/apply.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#custom-behaviors
-# ------------------------------------------------------------------------------------------------------------
-
-function #bs.position:set_pos_and_rot {scale:0.001}
diff --git a/datapacks/Bookshelf/data/bs.link/function/behaviors/setup.mcfunction b/datapacks/Bookshelf/data/bs.link/function/behaviors/setup.mcfunction
deleted file mode 100644
index 03a84ee245..0000000000
--- a/datapacks/Bookshelf/data/bs.link/function/behaviors/setup.mcfunction
+++ /dev/null
@@ -1,31 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#custom-behaviors
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation $id.suid bs.in = @s bs.link.to
-execute at @n[predicate=bs.id:suid_equal,sort=arbitrary] run function #bs.position:get_pos_and_rot {scale:1000}
-
-scoreboard players operation #x bs.ctx = @s bs.pos.x
-scoreboard players operation #y bs.ctx = @s bs.pos.y
-scoreboard players operation #z bs.ctx = @s bs.pos.z
-scoreboard players operation #h bs.ctx = @s bs.rot.h
-scoreboard players operation #v bs.ctx = @s bs.rot.v
-
-execute store result score @s bs.pos.x run data get entity @s Pos[0] 1000
-execute store result score @s bs.pos.y run data get entity @s Pos[1] 1000
-execute store result score @s bs.pos.z run data get entity @s Pos[2] 1000
-execute store result score @s bs.rot.h run data get entity @s Rotation[0] 1000
-execute store result score @s bs.rot.v run data get entity @s Rotation[1] 1000
diff --git a/datapacks/Bookshelf/data/bs.link/function/create_link_ata.mcfunction b/datapacks/Bookshelf/data/bs.link/function/create_link_ata.mcfunction
deleted file mode 100644
index fe5e948e59..0000000000
--- a/datapacks/Bookshelf/data/bs.link/function/create_link_ata.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#create-link
-# ------------------------------------------------------------------------------------------------------------
-
-tag @s add bs.link.this
-execute as @n[tag=!bs.link.this] unless predicate bs.id:has_suid run function #bs.id:give_suid
-scoreboard players operation @s bs.link.to = @n[tag=!bs.link.this] bs.id
-tag @s remove bs.link.this
-function #bs.link:update_link
diff --git a/datapacks/Bookshelf/data/bs.link/function/keep_local_pos/apply.mcfunction b/datapacks/Bookshelf/data/bs.link/function/keep_local_pos/apply.mcfunction
deleted file mode 100644
index 02edb847c6..0000000000
--- a/datapacks/Bookshelf/data/bs.link/function/keep_local_pos/apply.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$tp @s ^$(x) ^$(y) ^$(z)
diff --git a/datapacks/Bookshelf/data/bs.link/function/keep_local_pos/keep_local_pos.mcfunction b/datapacks/Bookshelf/data/bs.link/function/keep_local_pos/keep_local_pos.mcfunction
deleted file mode 100644
index e94bd74b27..0000000000
--- a/datapacks/Bookshelf/data/bs.link/function/keep_local_pos/keep_local_pos.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#keep-local-position
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result storage bs:ctx x double 0.001 run scoreboard players get @s bs.link.lx
-execute store result storage bs:ctx y double 0.001 run scoreboard players get @s bs.link.ly
-execute store result storage bs:ctx z double 0.001 run scoreboard players get @s bs.link.lz
-
-scoreboard players operation $id.suid bs.in = @s bs.link.to
-execute at @n[predicate=bs.id:suid_equal,sort=arbitrary] run function bs.link:keep_local_pos/apply with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.link/function/mirror_point_ata/apply.mcfunction b/datapacks/Bookshelf/data/bs.link/function/mirror_point_ata/apply.mcfunction
deleted file mode 100644
index 00a92884f8..0000000000
--- a/datapacks/Bookshelf/data/bs.link/function/mirror_point_ata/apply.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$tp @s ^ ^ ^$(z) ~$(x) $(y)
diff --git a/datapacks/Bookshelf/data/bs.link/function/mirror_point_ata/mirror_point_ata.mcfunction b/datapacks/Bookshelf/data/bs.link/function/mirror_point_ata/mirror_point_ata.mcfunction
deleted file mode 100644
index 6fc77a8852..0000000000
--- a/datapacks/Bookshelf/data/bs.link/function/mirror_point_ata/mirror_point_ata.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#mirror-point
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation $id.suid bs.in = @s bs.link.to
-execute as @n[predicate=bs.id:suid_equal,sort=arbitrary] run function bs.link:mirror_point_ata/as_origin
-execute facing entity @n[predicate=bs.id:suid_equal,sort=arbitrary] feet run function bs.link:mirror_point_ata/apply with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.link/function/remove_link.mcfunction b/datapacks/Bookshelf/data/bs.link/function/remove_link.mcfunction
deleted file mode 100644
index 785053bbd9..0000000000
--- a/datapacks/Bookshelf/data/bs.link/function/remove_link.mcfunction
+++ /dev/null
@@ -1,29 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#remove-link
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players reset @s bs.link.to
-scoreboard players reset @s bs.link.rx
-scoreboard players reset @s bs.link.ry
-scoreboard players reset @s bs.link.rz
-scoreboard players reset @s bs.link.lx
-scoreboard players reset @s bs.link.ly
-scoreboard players reset @s bs.link.lz
-scoreboard players reset @s bs.link.lh
-scoreboard players reset @s bs.link.lv
-
-scoreboard players operation $link.to bs.in = @s bs.id
-execute if predicate bs.id:has_suid as @e[predicate=bs.link:link_equal] run function #bs.link:remove_link
diff --git a/datapacks/Bookshelf/data/bs.link/function/update_link/at_parent.mcfunction b/datapacks/Bookshelf/data/bs.link/function/update_link/at_parent.mcfunction
deleted file mode 100644
index 3edf10ad9d..0000000000
--- a/datapacks/Bookshelf/data/bs.link/function/update_link/at_parent.mcfunction
+++ /dev/null
@@ -1,30 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-function #bs.position:get_relative_ata {scale:1000}
-scoreboard players operation @s bs.link.rx = @s bs.pos.x
-scoreboard players operation @s bs.link.ry = @s bs.pos.y
-scoreboard players operation @s bs.link.rz = @s bs.pos.z
-
-function #bs.position:canonical_to_local
-scoreboard players operation @s bs.link.lx = @s bs.pos.x
-scoreboard players operation @s bs.link.ly = @s bs.pos.y
-scoreboard players operation @s bs.link.lz = @s bs.pos.z
-
-execute store result score @s bs.link.lh run data get entity @s Rotation[0] 1000
-execute store result score @s bs.link.lv run data get entity @s Rotation[1] 1000
-function #bs.position:get_rot {scale:1000}
-scoreboard players operation @s bs.link.lh -= @s bs.rot.h
-scoreboard players operation @s bs.link.lv -= @s bs.rot.v
diff --git a/datapacks/Bookshelf/data/bs.link/function/update_link/update_link.mcfunction b/datapacks/Bookshelf/data/bs.link/function/update_link/update_link.mcfunction
deleted file mode 100644
index 341b527bf7..0000000000
--- a/datapacks/Bookshelf/data/bs.link/function/update_link/update_link.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#update-link
-# ------------------------------------------------------------------------------------------------------------
-scoreboard players operation $id.suid bs.in = @s bs.link.to
-execute at @n[predicate=bs.id:suid_equal,sort=arbitrary] run function bs.link:update_link/at_parent
diff --git a/datapacks/Bookshelf/data/bs.link/predicate/has_link.json b/datapacks/Bookshelf/data/bs.link/predicate/has_link.json
deleted file mode 100644
index e87ca6f88c..0000000000
--- a/datapacks/Bookshelf/data/bs.link/predicate/has_link.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "condition": "minecraft:entity_scores",
- "entity": "this",
- "scores": {
- "bs.link.to": {}
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.link/predicate/link_equal.json b/datapacks/Bookshelf/data/bs.link/predicate/link_equal.json
deleted file mode 100644
index c1c9da07fb..0000000000
--- a/datapacks/Bookshelf/data/bs.link/predicate/link_equal.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "condition": "minecraft:entity_scores",
- "entity": "this",
- "scores": {
- "bs.link.to": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$link.to"
- },
- "score": "bs.in"
- },
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$link.to"
- },
- "score": "bs.in"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/as_children.json b/datapacks/Bookshelf/data/bs.link/tags/function/as_children.json
deleted file mode 100644
index d147f176bf..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/as_children.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#relationships",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/07",
- "minecraft_version": "1.21"
- },
- "updated": {
- "date": "2024/09/07",
- "minecraft_version": "1.21"
- }
- },
- "values": [
- "bs.link:as_children"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/as_parent.json b/datapacks/Bookshelf/data/bs.link/tags/function/as_parent.json
deleted file mode 100644
index 4f61ff0feb..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/as_parent.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#relationships",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/07",
- "minecraft_version": "1.21"
- },
- "updated": {
- "date": "2024/09/07",
- "minecraft_version": "1.21"
- }
- },
- "values": [
- "bs.link:as_parent"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/at_children.json b/datapacks/Bookshelf/data/bs.link/tags/function/at_children.json
deleted file mode 100644
index 95d63f6bfc..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/at_children.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#relationships",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/07",
- "minecraft_version": "1.21"
- },
- "updated": {
- "date": "2024/09/07",
- "minecraft_version": "1.21"
- }
- },
- "values": [
- "bs.link:at_children"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/at_parent.json b/datapacks/Bookshelf/data/bs.link/tags/function/at_parent.json
deleted file mode 100644
index 6c046677ac..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/at_parent.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#relationships",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/07",
- "minecraft_version": "1.21"
- },
- "updated": {
- "date": "2024/09/07",
- "minecraft_version": "1.21"
- }
- },
- "values": [
- "bs.link:at_parent"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/apply.json b/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/apply.json
deleted file mode 100644
index 2f7117a4a2..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/apply.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.link:behaviors/apply"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/imitate_pos_x.json b/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/imitate_pos_x.json
deleted file mode 100644
index e2a0626df4..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/imitate_pos_x.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.link:behaviors/imitate_pos_x"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/imitate_pos_y.json b/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/imitate_pos_y.json
deleted file mode 100644
index 08703f2a7e..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/imitate_pos_y.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.link:behaviors/imitate_pos_y"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/imitate_pos_z.json b/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/imitate_pos_z.json
deleted file mode 100644
index 8fe8095f14..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/imitate_pos_z.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.link:behaviors/imitate_pos_z"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/imitate_rot_h.json b/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/imitate_rot_h.json
deleted file mode 100644
index 26fe5e8784..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/imitate_rot_h.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.link:behaviors/imitate_rot_h"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/imitate_rot_v.json b/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/imitate_rot_v.json
deleted file mode 100644
index b6573b9795..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/imitate_rot_v.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.link:behaviors/imitate_rot_v"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/reverse_pos_x.json b/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/reverse_pos_x.json
deleted file mode 100644
index b139e649c2..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/reverse_pos_x.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.link:behaviors/reverse_pos_x"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/reverse_pos_y.json b/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/reverse_pos_y.json
deleted file mode 100644
index 52c3d1368d..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/reverse_pos_y.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.link:behaviors/reverse_pos_y"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/reverse_pos_z.json b/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/reverse_pos_z.json
deleted file mode 100644
index 4199004aa4..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/reverse_pos_z.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.link:behaviors/reverse_pos_z"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/reverse_rot_h.json b/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/reverse_rot_h.json
deleted file mode 100644
index eb4aa56ae1..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/reverse_rot_h.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.link:behaviors/reverse_rot_h"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/reverse_rot_v.json b/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/reverse_rot_v.json
deleted file mode 100644
index a4f6197a5a..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/reverse_rot_v.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.link:behaviors/reverse_rot_v"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/setup.json b/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/setup.json
deleted file mode 100644
index 7e230f30bb..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/behaviors/setup.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.link:behaviors/setup"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.link/tags/function/exclusive_load.json
deleted file mode 100644
index 8d1cdc4457..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.link:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/help.json b/datapacks/Bookshelf/data/bs.link/tags/function/help.json
deleted file mode 100644
index 7b7dbe4bba..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.link:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/imitate_pos_x.json b/datapacks/Bookshelf/data/bs.link/tags/function/imitate_pos_x.json
deleted file mode 100644
index c7d382994a..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/imitate_pos_x.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "minecraft_version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "#bs.link:behaviors/setup",
- "#bs.link:behaviors/imitate_pos_x",
- "#bs.link:behaviors/apply"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/imitate_pos_y.json b/datapacks/Bookshelf/data/bs.link/tags/function/imitate_pos_y.json
deleted file mode 100644
index f09a36fd64..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/imitate_pos_y.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "minecraft_version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "#bs.link:behaviors/setup",
- "#bs.link:behaviors/imitate_pos_y",
- "#bs.link:behaviors/apply"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/imitate_pos_z.json b/datapacks/Bookshelf/data/bs.link/tags/function/imitate_pos_z.json
deleted file mode 100644
index 7a08fabf0f..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/imitate_pos_z.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "minecraft_version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "#bs.link:behaviors/setup",
- "#bs.link:behaviors/imitate_pos_z",
- "#bs.link:behaviors/apply"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/imitate_rot_h.json b/datapacks/Bookshelf/data/bs.link/tags/function/imitate_rot_h.json
deleted file mode 100644
index 811f4a981f..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/imitate_rot_h.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "minecraft_version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "#bs.link:behaviors/setup",
- "#bs.link:behaviors/imitate_rot_h",
- "#bs.link:behaviors/apply"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/imitate_rot_v.json b/datapacks/Bookshelf/data/bs.link/tags/function/imitate_rot_v.json
deleted file mode 100644
index ddb7e79099..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/imitate_rot_v.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "minecraft_version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "#bs.link:behaviors/setup",
- "#bs.link:behaviors/imitate_rot_v",
- "#bs.link:behaviors/apply"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/load.json b/datapacks/Bookshelf/data/bs.link/tags/function/load.json
deleted file mode 100644
index ee8b505295..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/load.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "values": [
- "#bs.id:load",
- "#bs.position:load",
- "bs.link:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/mirror_z_plane.json b/datapacks/Bookshelf/data/bs.link/tags/function/mirror_z_plane.json
deleted file mode 100644
index cb8e88ea3c..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/mirror_z_plane.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#mirror-plane",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/10",
- "minecraft_version": "1.20.1"
- },
- "updated": {
- "date": "2023/09/11",
- "minecraft_version": "1.20.1"
- }
- },
- "values": [
- "#bs.link:behaviors/setup",
- "#bs.link:behaviors/imitate_pos_x",
- "#bs.link:behaviors/imitate_pos_y",
- "#bs.link:behaviors/reverse_pos_z",
- "#bs.link:behaviors/reverse_rot_h",
- "#bs.link:behaviors/imitate_rot_v",
- "#bs.link:behaviors/apply"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/remove_link.json b/datapacks/Bookshelf/data/bs.link/tags/function/remove_link.json
deleted file mode 100644
index 106307149c..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/remove_link.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#remove-link",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/07",
- "minecraft_version": "1.21"
- },
- "updated": {
- "date": "2024/09/07",
- "minecraft_version": "1.21"
- }
- },
- "values": [
- "bs.link:remove_link"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/reverse_pos_x.json b/datapacks/Bookshelf/data/bs.link/tags/function/reverse_pos_x.json
deleted file mode 100644
index 260a253694..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/reverse_pos_x.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "minecraft_version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "#bs.link:behaviors/setup",
- "#bs.link:behaviors/reverse_pos_x",
- "#bs.link:behaviors/apply"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/reverse_pos_y.json b/datapacks/Bookshelf/data/bs.link/tags/function/reverse_pos_y.json
deleted file mode 100644
index bc2801f604..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/reverse_pos_y.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "minecraft_version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "#bs.link:behaviors/setup",
- "#bs.link:behaviors/reverse_pos_y",
- "#bs.link:behaviors/apply"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/reverse_pos_z.json b/datapacks/Bookshelf/data/bs.link/tags/function/reverse_pos_z.json
deleted file mode 100644
index 73ca8b0766..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/reverse_pos_z.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "minecraft_version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "#bs.link:behaviors/setup",
- "#bs.link:behaviors/reverse_pos_z",
- "#bs.link:behaviors/apply"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/reverse_rot_h.json b/datapacks/Bookshelf/data/bs.link/tags/function/reverse_rot_h.json
deleted file mode 100644
index bd43689199..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/reverse_rot_h.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "minecraft_version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "#bs.link:behaviors/setup",
- "#bs.link:behaviors/reverse_rot_h",
- "#bs.link:behaviors/apply"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/reverse_rot_v.json b/datapacks/Bookshelf/data/bs.link/tags/function/reverse_rot_v.json
deleted file mode 100644
index c8fc12e0c7..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/reverse_rot_v.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "minecraft_version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "#bs.link:behaviors/setup",
- "#bs.link:behaviors/reverse_rot_v",
- "#bs.link:behaviors/apply"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/unload.json b/datapacks/Bookshelf/data/bs.link/tags/function/unload.json
deleted file mode 100644
index a44ec3ddb2..0000000000
--- a/datapacks/Bookshelf/data/bs.link/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.link:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.link/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.link/test/__boot__.mcfunction
deleted file mode 100644
index db654a992a..0000000000
--- a/datapacks/Bookshelf/data/bs.link/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.link
-# @beforebatch function #bs.link:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.link/test/as_children.mcfunction b/datapacks/Bookshelf/data/bs.link/test/as_children.mcfunction
deleted file mode 100644
index deb7ddede5..0000000000
--- a/datapacks/Bookshelf/data/bs.link/test/as_children.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Check as children relationship
-# @batch bs.link
-
-summon minecraft:armor_stand ~ ~ ~ {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
-summon minecraft:armor_stand ~ ~1 ~ {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
-
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:as_children {run:"tag @s add bs.packtest.check"}
-assert entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,tag=bs.packtest.check]
diff --git a/datapacks/Bookshelf/data/bs.link/test/as_parent.mcfunction b/datapacks/Bookshelf/data/bs.link/test/as_parent.mcfunction
deleted file mode 100644
index 0824dc7d74..0000000000
--- a/datapacks/Bookshelf/data/bs.link/test/as_parent.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Check as parent relationship
-# @batch bs.link
-
-summon minecraft:armor_stand ~ ~ ~ {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
-summon minecraft:armor_stand ~ ~1 ~ {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
-
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] run function #bs.link:as_parent {run:"tag @s add bs.packtest.check"}
-assert entity @e[type=minecraft:armor_stand,tag=bs.packtest.1,tag=bs.packtest.check]
diff --git a/datapacks/Bookshelf/data/bs.link/test/at_children.mcfunction b/datapacks/Bookshelf/data/bs.link/test/at_children.mcfunction
deleted file mode 100644
index 6aa1bea1fc..0000000000
--- a/datapacks/Bookshelf/data/bs.link/test/at_children.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Check at children relationship
-# @batch bs.link
-
-summon minecraft:armor_stand ~ ~ ~ {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
-summon minecraft:armor_stand ~ ~1 ~ {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
-
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:at_children {run:"tag @n add bs.packtest.check"}
-assert entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,tag=bs.packtest.check]
diff --git a/datapacks/Bookshelf/data/bs.link/test/at_parent.mcfunction b/datapacks/Bookshelf/data/bs.link/test/at_parent.mcfunction
deleted file mode 100644
index 6c2cb78ea0..0000000000
--- a/datapacks/Bookshelf/data/bs.link/test/at_parent.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Check at parent relationship
-# @batch bs.link
-
-summon minecraft:armor_stand ~ ~ ~ {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
-summon minecraft:armor_stand ~ ~1 ~ {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
-
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] run function #bs.link:at_parent {run:"tag @n add bs.packtest.check"}
-assert entity @e[type=minecraft:armor_stand,tag=bs.packtest.1,tag=bs.packtest.check]
diff --git a/datapacks/Bookshelf/data/bs.link/test/create_link_ata.mcfunction b/datapacks/Bookshelf/data/bs.link/test/create_link_ata.mcfunction
deleted file mode 100644
index 49b2b5e810..0000000000
--- a/datapacks/Bookshelf/data/bs.link/test/create_link_ata.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# Linking entities together
-# @batch bs.link
-
-summon minecraft:armor_stand 0.0 0.0 0.0 {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
-summon minecraft:armor_stand 0.5 0.2 1.0 {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
-
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
-
-assert entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,predicate=bs.link:has_link]
-assert score @e[type=minecraft:armor_stand,tag=bs.packtest.1,limit=1] bs.id = @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.to
-assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.rx matches 499..501
-assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.ry matches 199..201
-assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.rz matches 999..1001
-assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.lx matches 499..501
-assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.ly matches 199..201
-assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.lz matches 999..1001
-
-kill @e[type=minecraft:armor_stand,tag=bs.packtest]
diff --git a/datapacks/Bookshelf/data/bs.link/test/keep_local_pos.mcfunction b/datapacks/Bookshelf/data/bs.link/test/keep_local_pos.mcfunction
deleted file mode 100644
index d03cbe9205..0000000000
--- a/datapacks/Bookshelf/data/bs.link/test/keep_local_pos.mcfunction
+++ /dev/null
@@ -1,13 +0,0 @@
-# Keep the local position
-# @batch bs.link
-
-summon minecraft:armor_stand 0.0 0.0 0.0 {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
-summon minecraft:armor_stand 0.0 0.0 1.0 {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
-
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
-tp @e[type=minecraft:armor_stand,tag=bs.packtest.1] 0.0 0.0 0.0 52 -12
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] run function #bs.link:keep_local_pos
-
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.1] at @s positioned ^ ^ ^1 run assert entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,distance=..0.002]
-
-kill @e[type=minecraft:armor_stand,tag=bs.packtest]
diff --git a/datapacks/Bookshelf/data/bs.link/test/mirror_point_ata.mcfunction b/datapacks/Bookshelf/data/bs.link/test/mirror_point_ata.mcfunction
deleted file mode 100644
index 593b5daa96..0000000000
--- a/datapacks/Bookshelf/data/bs.link/test/mirror_point_ata.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# Mirror around a point
-# @batch bs.link
-
-summon minecraft:armor_stand 0.0 0.0 0.0 {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b,Rotation:[75f,12f]}
-summon minecraft:armor_stand 0.0 0.0 0.0 {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b,Rotation:[0f,0f]}
-
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] positioned .5 .5 .5 run function #bs.link:mirror_point_ata
-
-execute store result score #x bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Pos[0] 1000
-execute store result score #y bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Pos[1] 1000
-execute store result score #z bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Pos[2] 1000
-execute store result score #h bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Rotation[0] 1000
-execute store result score #v bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Rotation[1] 1000
-
-kill @e[type=minecraft:armor_stand,tag=bs.packtest]
-
-assert score #x bs.ctx matches 999..1001
-assert score #y bs.ctx matches 999..1001
-assert score #z bs.ctx matches 999..1001
-assert score #h bs.ctx matches -105001..-104999
-assert score #v bs.ctx matches -12001..-11999
diff --git a/datapacks/Bookshelf/data/bs.link/test/remove_link.mcfunction b/datapacks/Bookshelf/data/bs.link/test/remove_link.mcfunction
deleted file mode 100644
index abe003c36a..0000000000
--- a/datapacks/Bookshelf/data/bs.link/test/remove_link.mcfunction
+++ /dev/null
@@ -1,15 +0,0 @@
-# Check link removal
-# @batch bs.link
-
-summon minecraft:armor_stand ~ ~ ~ {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
-summon minecraft:armor_stand ~ ~1 ~ {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
-
-# from parent
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:remove_link
-assert not entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,predicate=bs.link:has_link]
-
-# from child
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] run function #bs.link:remove_link
-assert not entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,predicate=bs.link:has_link]
diff --git a/datapacks/Bookshelf/data/bs.link/test/reverse_pos_and_rot.mcfunction b/datapacks/Bookshelf/data/bs.link/test/reverse_pos_and_rot.mcfunction
deleted file mode 100644
index 63a4a0ad24..0000000000
--- a/datapacks/Bookshelf/data/bs.link/test/reverse_pos_and_rot.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# Reverse position and rotation
-# @batch bs.link
-
-summon minecraft:armor_stand 0.0 0.0 1.0 {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
-summon minecraft:armor_stand 0.0 0.0 0.0 {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
-
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
-
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.1] at @s run tp @s ~1 ~1 ~1 ~42 ~42
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] run function #bs.link:reverse_pos_and_rot
-
-execute store result score #x bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Pos[0] 1000
-execute store result score #y bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Pos[1] 1000
-execute store result score #z bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Pos[2] 1000
-execute store result score #h bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Rotation[0] 1000
-execute store result score #v bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Rotation[1] 1000
-
-kill @e[type=minecraft:armor_stand,tag=bs.packtest]
-
-assert score #x bs.ctx matches -1001..-999
-assert score #y bs.ctx matches -1001..-999
-assert score #z bs.ctx matches -1001..-999
-assert score #h bs.ctx matches -42001..-41999
-assert score #v bs.ctx matches -42001..-41999
diff --git a/datapacks/Bookshelf/data/bs.link/test/update_link.mcfunction b/datapacks/Bookshelf/data/bs.link/test/update_link.mcfunction
deleted file mode 100644
index 9f7269f5ab..0000000000
--- a/datapacks/Bookshelf/data/bs.link/test/update_link.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# Update the link
-# @batch bs.link
-
-summon minecraft:armor_stand 0.0 0.0 0.0 {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
-summon minecraft:armor_stand 0.5 0.2 1.0 {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
-
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.id:give_suid
-scoreboard players operation @e[type=minecraft:armor_stand,tag=bs.packtest.2] bs.link.to = @e[type=minecraft:armor_stand,tag=bs.packtest.1] bs.id
-execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] run function #bs.link:update_link
-
-assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.rx matches 499..501
-assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.ry matches 199..201
-assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.rz matches 999..1001
-assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.lx matches 499..501
-assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.ly matches 199..201
-assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.lz matches 999..1001
-
-kill @e[type=minecraft:armor_stand,tag=bs.packtest]
diff --git a/datapacks/Bookshelf/data/bs.math/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.math/.metadata/generated/features.json
deleted file mode 100644
index 682b183aa3..0000000000
--- a/datapacks/Bookshelf/data/bs.math/.metadata/generated/features.json
+++ /dev/null
@@ -1,388 +0,0 @@
-[
- {
- "name": "acos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2017/09/04",
- "version": "1.12.1"
- },
- "updated": {
- "date": "2023/09/05",
- "version": "23w33a"
- }
- },
- {
- "name": "asin",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2017/08/24",
- "version": "1.12"
- },
- "updated": {
- "date": "2023/09/05",
- "version": "23w33a"
- }
- },
- {
- "name": "atan",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/10/01",
- "version": "1.13.2"
- },
- "updated": {
- "date": "2023/09/05",
- "version": "23w33a"
- }
- },
- {
- "name": "atan2",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2023/09/05",
- "version": "23w33a"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "combine",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#combine",
- "authors": [
- "Ethanout"
- ],
- "created": {
- "date": "2023/08/13",
- "version": "23w31a"
- },
- "updated": {
- "date": "2023/08/13",
- "version": "23w31a"
- }
- },
- {
- "name": "cos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#trigonometry",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/15",
- "version": "1.12"
- },
- "updated": {
- "date": "2023/08/31",
- "version": "23w33a"
- }
- },
- {
- "name": "divide",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#rounded-division",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2017/08/26",
- "version": "1.12"
- },
- "updated": {
- "date": "2023/09/01",
- "version": "23w33a"
- }
- },
- {
- "name": "exp",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#exponential",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2018/12/25",
- "version": "1.13.2"
- },
- "updated": {
- "date": "2024/01/31",
- "version": "1.20.4"
- }
- },
- {
- "name": "exp2",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#exponential",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/31",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/31",
- "version": "1.20.4"
- }
- },
- {
- "name": "factorial",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#factorial",
- "authors": [
- "Aksiome",
- "KubbyDev",
- "SBtree-bit"
- ],
- "contributors": [
- "tryashtar"
- ],
- "created": {
- "date": "2017/09/08",
- "version": "1.12.1"
- },
- "updated": {
- "date": "2023/08/31",
- "version": "23w33a"
- }
- },
- {
- "name": "frexp",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#float-manipulation",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/02",
- "version": "23w33a"
- },
- "updated": {
- "date": "2024/01/31",
- "version": "1.20.4"
- }
- },
- {
- "name": "gcd",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#greatest-common-denominator",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/10/28",
- "version": "1.12.2"
- },
- "updated": {
- "date": "2023/08/03",
- "version": "23w33a"
- }
- },
- {
- "name": "ipow",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#power",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/01/29",
- "version": "1.20.4"
- }
- },
- {
- "name": "isqrt",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#square-root",
- "authors": [
- "Ethanout",
- "Triton365",
- "xiaodou123"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2023/01/26",
- "version": "1.20.4"
- }
- },
- {
- "name": "ldexp",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#float-manipulation",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/28",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/28",
- "version": "1.20.4"
- }
- },
- {
- "name": "log",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#logarithm",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2019/01/06",
- "version": "1.13.2"
- },
- "updated": {
- "date": "2024/01/29",
- "version": "1.20.4"
- }
- },
- {
- "name": "log10",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#logarithm",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2019/01/07",
- "version": "1.13.2"
- },
- "updated": {
- "date": "2024/01/29",
- "version": "1.20.4"
- }
- },
- {
- "name": "log2",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#logarithm",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2019/01/07",
- "version": "1.13.2"
- },
- "updated": {
- "date": "2024/01/29",
- "version": "1.20.4"
- }
- },
- {
- "name": "loga",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#logarithm",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2019/01/07",
- "version": "1.13.2"
- },
- "updated": {
- "date": "2024/01/29",
- "version": "1.20.4"
- }
- },
- {
- "name": "pow",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#pow",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/30",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/30",
- "version": "1.20.4"
- }
- },
- {
- "name": "sin",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#trigonometry",
- "authors": [
- "Leirof"
- ],
- "contributors": [
- "Aksiome"
- ],
- "created": {
- "date": "2017/05/16",
- "version": "1.12"
- },
- "updated": {
- "date": "2023/08/31",
- "version": "23w33a"
- }
- },
- {
- "name": "sincos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#trigonometry",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/05",
- "version": "23w33a"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "sqrt",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#square-root",
- "authors": [
- "Aksiome",
- "Ethanout",
- "theogiraudet"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/01/28",
- "version": "1.20.4"
- }
- },
- {
- "name": "tan",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#trigonometry",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2018/10/01",
- "version": "1.13.2"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.math/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.math/.metadata/generated/module.json
deleted file mode 100644
index 816fffeb60..0000000000
--- a/datapacks/Bookshelf/data/bs.math/.metadata/generated/module.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "name": "bs.math",
- "display_name": "Math",
- "description": "The beatifull world of mathematics… in Minecraft!",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html",
- "authors": [
- "Aksiome",
- "Ethanout",
- "KubbyDev",
- "Leirof",
- "SBtree-bit",
- "Triton365",
- "theogiraudet",
- "xiaodou123"
- ],
- "contributors": [
- "Aksiome",
- "tryashtar"
- ],
- "features": [
- "bs.math:acos",
- "bs.math:asin",
- "bs.math:atan",
- "bs.math:atan2",
- "bs.math:combine",
- "bs.math:cos",
- "bs.math:divide",
- "bs.math:exp",
- "bs.math:exp2",
- "bs.math:factorial",
- "bs.math:frexp",
- "bs.math:gcd",
- "bs.math:ipow",
- "bs.math:isqrt",
- "bs.math:ldexp",
- "bs.math:log",
- "bs.math:log10",
- "bs.math:log2",
- "bs.math:loga",
- "bs.math:pow",
- "bs.math:sin",
- "bs.math:sincos",
- "bs.math:sqrt",
- "bs.math:tan"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.math/.metadata/module.json b/datapacks/Bookshelf/data/bs.math/.metadata/module.json
deleted file mode 100644
index c4ae4f73e6..0000000000
--- a/datapacks/Bookshelf/data/bs.math/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.math",
- "display_name": "Math",
- "description": "The beatifull world of mathematics… in Minecraft!",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html"
-}
diff --git a/datapacks/Bookshelf/data/bs.math/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.math/function/__help__.mcfunction
deleted file mode 100644
index b6acf07a23..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.math documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.math/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.math/function/__load__.mcfunction
deleted file mode 100644
index c5147e1b3d..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/__load__.mcfunction
+++ /dev/null
@@ -1,44 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html
-# ------------------------------------------------------------------------------------------------------------
-
-forceload add -30000000 1600
-execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
-
-scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
-scoreboard objectives add bs.in dummy [{"text":"BS ","color":"dark_gray"},{"text":"Input","color":"aqua"}]
-
-scoreboard players set -100000 bs.const -100000
-scoreboard players set -4 bs.const -4
-scoreboard players set -2 bs.const -2
-scoreboard players set -1 bs.const -1
-scoreboard players set 2 bs.const 2
-scoreboard players set 10 bs.const 10
-scoreboard players set 100 bs.const 100
-scoreboard players set 559 bs.const 559
-scoreboard players set 1000 bs.const 1000
-scoreboard players set 10000 bs.const 10000
-scoreboard players set 16384 bs.const 16384
-scoreboard players set 32768 bs.const 32768
-scoreboard players set 36000 bs.const 36000
-scoreboard players set 79249 bs.const 79249
-scoreboard players set 100000 bs.const 100000
-scoreboard players set 10000000 bs.const 10000000
-scoreboard players set 16777216 bs.const 16777216
-
-data modify storage bs:const math.ldexp set value [3.503246160812043E-46,7.006492321624085E-46,1.401298464324817E-45,2.802596928649634E-45,5.605193857299268E-45,1.1210387714598537E-44,2.2420775429197073E-44,4.484155085839415E-44,8.96831017167883E-44,1.793662034335766E-43,3.587324068671532E-43,7.174648137343064E-43,1.4349296274686127E-42,2.8698592549372254E-42,5.739718509874451E-42,1.1479437019748901E-41,2.2958874039497803E-41,4.591774807899561E-41,9.183549615799121E-41,1.8367099231598242E-40,3.6734198463196485E-40,7.346839692639297E-40,1.4693679385278594E-39,2.938735877055719E-39,5.877471754111438E-39,1.1754943508222875E-38,2.350988701644575E-38,4.70197740328915E-38,9.4039548065783E-38,1.88079096131566E-37,3.76158192263132E-37,7.52316384526264E-37,1.504632769052528E-36,3.009265538105056E-36,6.018531076210112E-36,1.2037062152420224E-35,2.407412430484045E-35,4.81482486096809E-35,9.62964972193618E-35,1.925929944387236E-34,3.851859888774472E-34,7.703719777548943E-34,1.5407439555097887E-33,3.0814879110195774E-33,6.162975822039155E-33,1.232595164407831E-32,2.465190328815662E-32,4.930380657631324E-32,9.860761315262648E-32,1.9721522630525295E-31,3.944304526105059E-31,7.888609052210118E-31,1.5777218104420236E-30,3.1554436208840472E-30,6.310887241768095E-30,1.262177448353619E-29,2.524354896707238E-29,5.048709793414476E-29,1.0097419586828951E-28,2.0194839173657902E-28,4.0389678347315804E-28,8.077935669463161E-28,1.6155871338926322E-27,3.2311742677852644E-27,6.462348535570529E-27,1.2924697071141057E-26,2.5849394142282115E-26,5.169878828456423E-26,1.0339757656912846E-25,2.0679515313825692E-25,4.1359030627651384E-25,8.271806125530277E-25,1.6543612251060553E-24,3.308722450212111E-24,6.617444900424222E-24,1.3234889800848443E-23,2.6469779601696886E-23,5.293955920339377E-23,1.0587911840678754E-22,2.117582368135751E-22,4.235164736271502E-22,8.470329472543003E-22,1.6940658945086007E-21,3.3881317890172014E-21,6.776263578034403E-21,1.3552527156068805E-20,2.710505431213761E-20,5.421010862427522E-20,1.0842021724855044E-19,2.168404344971009E-19,4.336808689942018E-19,8.673617379884035E-19,1.734723475976807E-18,3.469446951953614E-18,6.938893903907228E-18,1.3877787807814457E-17,2.7755575615628914E-17,5.551115123125783E-17,1.1102230246251565E-16,2.220446049250313E-16,4.440892098500626E-16,8.881784197001252E-16,1.7763568394002505E-15,3.552713678800501E-15,7.105427357601002E-15,1.4210854715202004E-14,2.842170943040401E-14,5.684341886080802E-14,1.1368683772161603E-13,2.2737367544323206E-13,4.547473508864641E-13,9.094947017729282E-13,1.8189894035458565E-12,3.637978807091713E-12,7.275957614183426E-12,1.4551915228366852E-11,2.9103830456733704E-11,5.820766091346741E-11,1.1641532182693481E-10,2.3283064365386963E-10,4.656612873077393E-10,9.313225746154785E-10,1.862645149230957E-09,3.725290298461914E-09,7.450580596923828E-09,1.4901161193847656E-08,2.9802322387695312E-08,5.960464477539063E-08,1.1920928955078125E-07,2.384185791015625E-07,4.76837158203125E-07,9.5367431640625E-07,1.9073486328125E-06,3.814697265625E-06,7.62939453125E-06,1.52587890625E-05,3.0517578125E-05,6.103515625E-05,0.0001220703125,0.000244140625,0.00048828125,0.0009765625,0.001953125,0.00390625,0.0078125,0.015625,0.03125,0.0625,0.125,0.25,0.5,1.0,2.0,4.0,8.0,16.0,32.0,64.0,128.0,256.0,512.0,1024.0,2048.0,4096.0,8192.0,16384.0,32768.0,65536.0,131072.0,262144.0,524288.0,1048576.0,2097152.0,4194304.0,8388608.0,16777216.0,33554432.0,67108864.0,134217728.0,268435456.0,536870912.0,1073741824.0,2147483648.0,4294967296.0,8589934592.0,17179869184.0,34359738368.0,68719476736.0,137438953472.0,274877906944.0,549755813888.0,1099511627776.0,2199023255552.0,4398046511104.0,8796093022208.0,17592186044416.0,35184372088832.0,70368744177664.0,140737488355328.0,281474976710656.0,562949953421312.0,1125899906842624.0,2251799813685248.0,4503599627370496.0,9007199254740992.0,1.8014398509481984E16,3.602879701896397E16,7.205759403792794E16,1.4411518807585587E17,2.8823037615171174E17,5.764607523034235E17,1.152921504606847E18,2.305843009213694E18,4.611686018427388E18,9.223372036854776E18,1.8446744073709552E19,3.6893488147419103E19,7.378697629483821E19,1.4757395258967641E20,2.9514790517935283E20,5.902958103587057E20,1.1805916207174113E21,2.3611832414348226E21,4.722366482869645E21,9.44473296573929E21,1.888946593147858E22,3.777893186295716E22,7.555786372591432E22,1.5111572745182865E23,3.022314549036573E23,6.044629098073146E23,1.2089258196146292E24,2.4178516392292583E24,4.835703278458517E24,9.671406556917033E24,1.9342813113834067E25,3.8685626227668134E25,7.737125245533627E25,1.5474250491067253E26,3.094850098213451E26,6.189700196426902E26,1.2379400392853803E27,2.4758800785707605E27,4.951760157141521E27,9.903520314283042E27,1.9807040628566084E28,3.961408125713217E28,7.922816251426434E28,1.5845632502852868E29,3.1691265005705735E29,6.338253001141147E29,1.2676506002282294E30,2.535301200456459E30,5.070602400912918E30]
diff --git a/datapacks/Bookshelf/data/bs.math/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.math/function/__unload__.mcfunction
deleted file mode 100644
index 5e39be48f1..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/__unload__.mcfunction
+++ /dev/null
@@ -1,28 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html
-# ------------------------------------------------------------------------------------------------------------
-
-kill B5-0-0-0-1
-forceload remove -30000000 1600
-
-scoreboard objectives remove bs.const
-scoreboard objectives remove bs.ctx
-scoreboard objectives remove bs.out
-scoreboard objectives remove bs.in
-
-data remove storage bs:in math
-data remove storage bs:out math
-data remove storage bs:const math
diff --git a/datapacks/Bookshelf/data/bs.math/function/acos.mcfunction b/datapacks/Bookshelf/data/bs.math/function/acos.mcfunction
deleted file mode 100644
index 458109c8f1..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/acos.mcfunction
+++ /dev/null
@@ -1,46 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry
-# ------------------------------------------------------------------------------------------------------------
-
-# Note: This algorithm is taken from the Handbook of Mathematical Functions (M. Abramowitz and I.A. Stegun, Ed.)
-
-scoreboard players operation #x bs.ctx = $math.acos.x bs.in
-execute if score $math.acos.x bs.in matches ..-1 run scoreboard players operation #x bs.ctx *= -1 bs.const
-
-scoreboard players set $math.acos bs.out 107311
-scoreboard players operation $math.acos bs.out *= #x bs.ctx
-scoreboard players operation $math.acos bs.out /= 1000 bs.const
-scoreboard players remove $math.acos bs.out 425484
-scoreboard players operation $math.acos bs.out *= #x bs.ctx
-scoreboard players operation $math.acos bs.out /= 1000 bs.const
-scoreboard players add $math.acos bs.out 1215325
-scoreboard players operation $math.acos bs.out *= #x bs.ctx
-scoreboard players operation $math.acos bs.out /= 1000 bs.const
-scoreboard players remove $math.acos bs.out 9000000
-scoreboard players operation $math.acos bs.out /= 100 bs.const
-
-scoreboard players operation $math.isqrt.x bs.in >< #x bs.ctx
-scoreboard players operation $math.isqrt.x bs.in *= -100000 bs.const
-scoreboard players add $math.isqrt.x bs.in 100000000
-function #bs.math:isqrt
-scoreboard players operation $math.isqrt.x bs.in >< #x bs.ctx
-scoreboard players operation $math.acos bs.out *= $math.isqrt bs.out
-scoreboard players operation $math.acos bs.out /= 100000 bs.const
-
-execute if score $math.acos.x bs.in matches 0.. run scoreboard players operation $math.acos bs.out *= -1 bs.const
-execute if score $math.acos.x bs.in matches ..-1 run scoreboard players add $math.acos bs.out 18000
-
-return run scoreboard players get $math.acos bs.out
diff --git a/datapacks/Bookshelf/data/bs.math/function/asin.mcfunction b/datapacks/Bookshelf/data/bs.math/function/asin.mcfunction
deleted file mode 100644
index 5f078349ae..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/asin.mcfunction
+++ /dev/null
@@ -1,46 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry
-# ------------------------------------------------------------------------------------------------------------
-
-# Note: This algorithm is taken from the Handbook of Mathematical Functions (M. Abramowitz and I.A. Stegun, Ed.)
-
-scoreboard players operation #x bs.ctx = $math.asin.x bs.in
-execute if score $math.asin.x bs.in matches ..-1 run scoreboard players operation #x bs.ctx *= -1 bs.const
-
-scoreboard players set $math.asin bs.out 107311
-scoreboard players operation $math.asin bs.out *= #x bs.ctx
-scoreboard players operation $math.asin bs.out /= 1000 bs.const
-scoreboard players remove $math.asin bs.out 425484
-scoreboard players operation $math.asin bs.out *= #x bs.ctx
-scoreboard players operation $math.asin bs.out /= 1000 bs.const
-scoreboard players add $math.asin bs.out 1215325
-scoreboard players operation $math.asin bs.out *= #x bs.ctx
-scoreboard players operation $math.asin bs.out /= 1000 bs.const
-scoreboard players remove $math.asin bs.out 9000000
-scoreboard players operation $math.asin bs.out /= 100 bs.const
-
-scoreboard players operation $math.isqrt.x bs.in >< #x bs.ctx
-scoreboard players operation $math.isqrt.x bs.in *= -100000 bs.const
-scoreboard players add $math.isqrt.x bs.in 100000000
-function #bs.math:isqrt
-scoreboard players operation $math.isqrt.x bs.in >< #x bs.ctx
-scoreboard players operation $math.asin bs.out *= $math.isqrt bs.out
-scoreboard players operation $math.asin bs.out /= 100000 bs.const
-
-scoreboard players add $math.asin bs.out 9000
-execute if score $math.asin.x bs.in matches ..-1 run scoreboard players operation $math.asin bs.out *= -1 bs.const
-
-return run scoreboard players get $math.asin bs.out
diff --git a/datapacks/Bookshelf/data/bs.math/function/atan/atan.mcfunction b/datapacks/Bookshelf/data/bs.math/function/atan/atan.mcfunction
deleted file mode 100644
index bec51af0c2..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/atan/atan.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry
-# ------------------------------------------------------------------------------------------------------------
-
-return run execute in minecraft:overworld as B5-0-0-0-1 run function bs.math:atan/run
diff --git a/datapacks/Bookshelf/data/bs.math/function/atan/run.mcfunction b/datapacks/Bookshelf/data/bs.math/function/atan/run.mcfunction
deleted file mode 100644
index 263a5de29e..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/atan/run.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result entity @s Pos[0] double 0.001 run scoreboard players get $math.atan.x bs.in
-data modify entity @s Pos[2] set value 1.0
-execute positioned 0.0 0.0 0.0 facing entity @s feet rotated ~ 0.0 run tp @s -30000000 0 1600 ~ ~
-execute store result score $math.atan bs.out run data get entity @s Rotation[0] -100
-execute if score $math.atan bs.out matches ..-18000 run scoreboard players add $math.atan bs.out 36000
-execute if score $math.atan bs.out matches 18001.. run scoreboard players remove $math.atan bs.out 36000
-return run scoreboard players get $math.atan bs.out
diff --git a/datapacks/Bookshelf/data/bs.math/function/atan2/atan2.mcfunction b/datapacks/Bookshelf/data/bs.math/function/atan2/atan2.mcfunction
deleted file mode 100644
index cf6317b243..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/atan2/atan2.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry
-# ------------------------------------------------------------------------------------------------------------
-
-return run execute in minecraft:overworld as B5-0-0-0-1 run function bs.math:atan2/run
diff --git a/datapacks/Bookshelf/data/bs.math/function/atan2/run.mcfunction b/datapacks/Bookshelf/data/bs.math/function/atan2/run.mcfunction
deleted file mode 100644
index b87a26aec0..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/atan2/run.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result entity @s Pos[0] double 0.001 run scoreboard players get $math.atan2.y bs.in
-execute store result entity @s Pos[2] double 0.001 run scoreboard players get $math.atan2.x bs.in
-execute positioned 0.0 0.0 0.0 facing entity @s feet rotated ~ 0.0 run tp @s -30000000 0 1600 ~ ~
-execute store result score $math.atan2 bs.out run data get entity @s Rotation[0] -100
-execute if score $math.atan2 bs.out matches ..-18000 run scoreboard players add $math.atan2 bs.out 36000
-execute if score $math.atan2 bs.out matches 18001.. run scoreboard players remove $math.atan2 bs.out 36000
-return run scoreboard players get $math.atan2 bs.out
diff --git a/datapacks/Bookshelf/data/bs.math/function/combine/combine.mcfunction b/datapacks/Bookshelf/data/bs.math/function/combine/combine.mcfunction
deleted file mode 100644
index 7ceda46ad3..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/combine/combine.mcfunction
+++ /dev/null
@@ -1,34 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#combine
-# ------------------------------------------------------------------------------------------------------------
-
-# Note: the larger bs.in must be smaller than 46342
-
-# keep n, k > 0 & n <= k
-execute store result score #n bs.ctx run scoreboard players set #k bs.ctx 0
-execute if score $math.combine.n bs.in matches 0.. run scoreboard players operation #n bs.ctx = $math.combine.n bs.in
-execute if score $math.combine.k bs.in matches 0.. run scoreboard players operation #k bs.ctx = $math.combine.k bs.in
-execute if score #n bs.ctx > #k bs.ctx run scoreboard players operation #n bs.ctx >< #k bs.ctx
-
-# get smaller n
-scoreboard players operation #t bs.ctx = #k bs.ctx
-scoreboard players operation #t bs.ctx -= #n bs.ctx
-scoreboard players operation #n bs.ctx < #t bs.ctx
-
-# break if n is special
-execute if score #n bs.ctx matches 0 run return run scoreboard players set $math.combine bs.out 1
-execute if score #n bs.ctx matches 1 run return run scoreboard players operation $math.combine bs.out = #k bs.ctx
-execute if score #n bs.ctx matches 2.. run return run function bs.math:combine/recurse/init
diff --git a/datapacks/Bookshelf/data/bs.math/function/combine/recurse/init.mcfunction b/datapacks/Bookshelf/data/bs.math/function/combine/recurse/init.mcfunction
deleted file mode 100644
index 407f1ab086..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/combine/recurse/init.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# ((k-n+1)(k-n+2)...(k-2)(k-1)k) / (1*2*3*...*(n-1)*n)
-scoreboard players operation #k bs.ctx -= #n bs.ctx
-scoreboard players set #i bs.ctx 0
-execute store result score #m bs.ctx run scoreboard players set $math.combine bs.out 1
-function bs.math:combine/recurse/next
-return run scoreboard players get $math.combine bs.out
diff --git a/datapacks/Bookshelf/data/bs.math/function/combine/recurse/next.mcfunction b/datapacks/Bookshelf/data/bs.math/function/combine/recurse/next.mcfunction
deleted file mode 100644
index 24eacbc6da..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/combine/recurse/next.mcfunction
+++ /dev/null
@@ -1,27 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players add #k bs.ctx 1
-scoreboard players add #i bs.ctx 1
-
-scoreboard players operation $math.combine bs.out /= #i bs.ctx
-scoreboard players operation $math.combine bs.out *= #k bs.ctx
-
-scoreboard players operation #m bs.ctx %= #i bs.ctx
-scoreboard players operation #m bs.ctx *= #k bs.ctx
-scoreboard players operation #m bs.ctx /= #i bs.ctx
-execute store result score #m bs.ctx run scoreboard players operation $math.combine bs.out += #m bs.ctx
-
-execute if score #i bs.ctx < #n bs.ctx run function bs.math:combine/recurse/next
diff --git a/datapacks/Bookshelf/data/bs.math/function/cos.mcfunction b/datapacks/Bookshelf/data/bs.math/function/cos.mcfunction
deleted file mode 100644
index 38dc738262..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/cos.mcfunction
+++ /dev/null
@@ -1,31 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#trigonometry
-# ------------------------------------------------------------------------------------------------------------
-
-# Normalize angle
-scoreboard players operation $math.cos bs.out = $math.cos.x bs.in
-execute store result score #x bs.ctx run scoreboard players operation $math.cos bs.out %= 36000 bs.const
-execute if score #x bs.ctx matches 9000..27000 run scoreboard players remove $math.cos bs.out 18000
-execute if score #x bs.ctx matches 27001.. run scoreboard players remove $math.cos bs.out 36000
-
-# Compute Bhāskara cosine approximation
-execute store result score #y bs.ctx run scoreboard players operation $math.cos bs.out *= $math.cos bs.out
-scoreboard players operation $math.cos bs.out *= -4 bs.const
-scoreboard players add $math.cos bs.out 324000000
-scoreboard players add #y bs.ctx 324000000
-scoreboard players operation #y bs.ctx /= 1000 bs.const
-execute if score #x bs.ctx matches 9000..27000 run scoreboard players operation #y bs.ctx *= -1 bs.const
-return run scoreboard players operation $math.cos bs.out /= #y bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.math/function/divide.mcfunction b/datapacks/Bookshelf/data/bs.math/function/divide.mcfunction
deleted file mode 100644
index b846c4b82b..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/divide.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#rounded-division
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #x bs.ctx run scoreboard players operation $math.divide bs.out = $math.divide.x bs.in
-scoreboard players operation $math.divide bs.out /= $math.divide.y bs.in
-execute store result score #y bs.ctx run scoreboard players operation #x bs.ctx %= $math.divide.y bs.in
-scoreboard players operation #y bs.ctx -= $math.divide.y bs.in
-scoreboard players operation #y bs.ctx *= -1 bs.const
-execute if score #y bs.ctx < #x bs.ctx run scoreboard players add $math.divide bs.out 1
-return run scoreboard players get $math.divide bs.out
diff --git a/datapacks/Bookshelf/data/bs.math/function/exp.mcfunction b/datapacks/Bookshelf/data/bs.math/function/exp.mcfunction
deleted file mode 100644
index 3ab43f0842..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/exp.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#exponential
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #e bs.ctx store result score #x bs.ctx run data get storage bs:in math.exp.x 24204406.323122970759868621826171875
-function bs.math:exp2/run
-data modify storage bs:out math.exp set from storage bs:ctx x
diff --git a/datapacks/Bookshelf/data/bs.math/function/exp2/exp2.mcfunction b/datapacks/Bookshelf/data/bs.math/function/exp2/exp2.mcfunction
deleted file mode 100644
index 3549788a33..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/exp2/exp2.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#exponential
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #e bs.ctx store result score #x bs.ctx run data get storage bs:in math.exp2.x 16777216
-function bs.math:exp2/run
-data modify storage bs:out math.exp2 set from storage bs:ctx x
diff --git a/datapacks/Bookshelf/data/bs.math/function/exp2/fract.mcfunction b/datapacks/Bookshelf/data/bs.math/function/exp2/fract.mcfunction
deleted file mode 100644
index cbfecfc6c5..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/exp2/fract.mcfunction
+++ /dev/null
@@ -1,35 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# polynomial used to approximate exp2(x):
-
-# c0: 1.87757667737929755981396429120877655805088579654694e-3
-# c1: 8.9893400854928091903150999542049248702824115753174e-3
-# c2: 5.5826318057013192552862079764963709749281406402588e-2
-# c3: 0.240153617043478234682751804029976483434438705444336
-# c4: 0.69315307320016572578680325023015029728412628173828
-# c5: 0.99999992506352930465851613917038775980472564697266
-
-$execute store result storage bs:ctx x float $(x) run scoreboard players set #x bs.ctx 31500
-execute store result score #x bs.ctx run data get storage bs:ctx x
-$execute store result storage bs:ctx x float $(x) run scoreboard players add #x bs.ctx 150816
-execute store result score #x bs.ctx run data get storage bs:ctx x
-$execute store result storage bs:ctx x float $(x) run scoreboard players add #x bs.ctx 936610
-execute store result score #x bs.ctx run data get storage bs:ctx x
-$execute store result storage bs:ctx x float $(x) run scoreboard players add #x bs.ctx 4029109
-execute store result score #x bs.ctx run data get storage bs:ctx x
-$execute store result storage bs:ctx x float $(x) run scoreboard players add #x bs.ctx 11629179
-execute store result score #x bs.ctx run data get storage bs:ctx x
-execute store result storage bs:ctx x float .000000059604644775390625 run scoreboard players add #x bs.ctx 16777215
diff --git a/datapacks/Bookshelf/data/bs.math/function/exp2/run.mcfunction b/datapacks/Bookshelf/data/bs.math/function/exp2/run.mcfunction
deleted file mode 100644
index 7a9683f588..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/exp2/run.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# exp2(x) = exp2(i) * exp2(f)
-scoreboard players operation #e bs.ctx /= 16777216 bs.const
-execute store result storage bs:ctx x float .000000059604644775390625 run scoreboard players operation #x bs.ctx %= 16777216 bs.const
-execute unless score #x bs.ctx matches 0 run function bs.math:exp2/fract with storage bs:ctx
-execute if score #x bs.ctx matches 0 run data modify storage bs:ctx x set value 1.0
-function bs.math:ldexp/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.math/function/factorial/factorial.mcfunction b/datapacks/Bookshelf/data/bs.math/function/factorial/factorial.mcfunction
deleted file mode 100644
index ea30676f3f..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/factorial/factorial.mcfunction
+++ /dev/null
@@ -1,36 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#factorial
-# ------------------------------------------------------------------------------------------------------------
-
-# Note: Warning, this function does not work properly if the input is greater than 12 (because the result is greater than 2^31, the limit value of scoreboards)
-
-execute if score $math.factorial.n bs.in matches 0 run return run scoreboard players set $math.factorial bs.out 1
-execute if score $math.factorial.n bs.in matches 1 run return run scoreboard players set $math.factorial bs.out 1
-execute if score $math.factorial.n bs.in matches 2 run return run scoreboard players set $math.factorial bs.out 2
-execute if score $math.factorial.n bs.in matches 3 run return run scoreboard players set $math.factorial bs.out 6
-execute if score $math.factorial.n bs.in matches 4 run return run scoreboard players set $math.factorial bs.out 24
-execute if score $math.factorial.n bs.in matches 5 run return run scoreboard players set $math.factorial bs.out 120
-execute if score $math.factorial.n bs.in matches 6 run return run scoreboard players set $math.factorial bs.out 720
-execute if score $math.factorial.n bs.in matches 7 run return run scoreboard players set $math.factorial bs.out 5040
-execute if score $math.factorial.n bs.in matches 8 run return run scoreboard players set $math.factorial bs.out 40320
-execute if score $math.factorial.n bs.in matches 9 run return run scoreboard players set $math.factorial bs.out 362880
-execute if score $math.factorial.n bs.in matches 10 run return run scoreboard players set $math.factorial bs.out 3628800
-execute if score $math.factorial.n bs.in matches 11 run return run scoreboard players set $math.factorial bs.out 39916800
-execute if score $math.factorial.n bs.in matches 12 run return run scoreboard players set $math.factorial bs.out 479001600
-
-execute store result score #i bs.ctx run scoreboard players operation $math.factorial bs.out = $math.factorial.n bs.in
-function bs.math:factorial/loop
-return run scoreboard players get $math.factorial bs.out
diff --git a/datapacks/Bookshelf/data/bs.math/function/factorial/loop.mcfunction b/datapacks/Bookshelf/data/bs.math/function/factorial/loop.mcfunction
deleted file mode 100644
index a18b617d3e..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/factorial/loop.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players remove #i bs.ctx 1
-scoreboard players operation $math.factorial bs.out *= #i bs.ctx
-execute if score #i bs.ctx matches 3.. run function bs.math:factorial/loop
diff --git a/datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/range_1.mcfunction b/datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/range_1.mcfunction
deleted file mode 100644
index 1cacee1b95..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/range_1.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #x bs.ctx run data get storage bs:ctx x .000000000000000000000000000012621774483536188886587657044524579674771302961744368076324462890625
-execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 120
-execute store result score #x bs.ctx run data get storage bs:ctx x .0000000000000000000000000032311742677852643549664402033982923967414535582065582275390625
-execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 112
-execute store result score #x bs.ctx run data get storage bs:ctx x .00000000000000000000000082718061255302767487140869206996285356581211090087890625
-execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 104
-execute store result score #x bs.ctx run data get storage bs:ctx x .000000000000000000000211758236813575084767080625169910490512847900390625
-execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 96
diff --git a/datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/range_2.mcfunction b/datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/range_2.mcfunction
deleted file mode 100644
index d18270aa32..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/range_2.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #x bs.ctx run data get storage bs:ctx x .0000000000000000000542101086242752217003726400434970855712890625
-execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 88
-execute store result score #x bs.ctx run data get storage bs:ctx x .00000000000000001387778780781445675529539585113525390625
-execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 80
-execute store result score #x bs.ctx run data get storage bs:ctx x .000000000000003552713678800500929355621337890625
-execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 72
-execute store result score #x bs.ctx run data get storage bs:ctx x .0000000000009094947017729282379150390625
-execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 64
diff --git a/datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/range_3.mcfunction b/datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/range_3.mcfunction
deleted file mode 100644
index 2f639b214d..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/range_3.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #x bs.ctx run data get storage bs:ctx x .00000000023283064365386962890625
-execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 56
-execute store result score #x bs.ctx run data get storage bs:ctx x .000000059604644775390625
-execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 48
-execute store result score #x bs.ctx run data get storage bs:ctx x .0000152587890625
-execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 40
-execute store result score #x bs.ctx run data get storage bs:ctx x .00390625
-execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 32
diff --git a/datapacks/Bookshelf/data/bs.math/function/frexp/frexp.mcfunction b/datapacks/Bookshelf/data/bs.math/function/frexp/frexp.mcfunction
deleted file mode 100644
index d61310c157..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/frexp/frexp.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#float-manipulation
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx x set from storage bs:in math.frexp.x
-function bs.math:frexp/run
-execute store result storage bs:out math.frexp.e int 1 run scoreboard players get #e bs.ctx
-data modify storage bs:out math.frexp.x set from storage bs:ctx x
diff --git a/datapacks/Bookshelf/data/bs.math/function/frexp/run.mcfunction b/datapacks/Bookshelf/data/bs.math/function/frexp/run.mcfunction
deleted file mode 100644
index 2ae926e562..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/frexp/run.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #f bs.ctx run data get storage bs:ctx x
-execute unless score #f bs.ctx matches 0 run function bs.math:frexp/e_pos/split
-execute unless score #f bs.ctx matches 0 run function bs.math:frexp/e_pos/chunk
-execute if score #f bs.ctx matches 0 run function bs.math:frexp/e_neg
diff --git a/datapacks/Bookshelf/data/bs.math/function/gcd/gcd.mcfunction b/datapacks/Bookshelf/data/bs.math/function/gcd/gcd.mcfunction
deleted file mode 100644
index 35888a6904..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/gcd/gcd.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#greatest-common-denominator
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation $math.gcd bs.out = $math.gcd.a bs.in
-scoreboard players operation #t bs.ctx = $math.gcd.b bs.in
-function bs.math:gcd/loop
-return run scoreboard players get $math.gcd bs.out
diff --git a/datapacks/Bookshelf/data/bs.math/function/gcd/loop.mcfunction b/datapacks/Bookshelf/data/bs.math/function/gcd/loop.mcfunction
deleted file mode 100644
index 4db04bd693..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/gcd/loop.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation $math.gcd bs.out %= #t bs.ctx
-scoreboard players operation $math.gcd bs.out >< #t bs.ctx
-execute unless score #t bs.ctx matches 0 run function bs.math:gcd/loop
diff --git a/datapacks/Bookshelf/data/bs.math/function/ipow.mcfunction b/datapacks/Bookshelf/data/bs.math/function/ipow.mcfunction
deleted file mode 100644
index d357dc568b..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/ipow.mcfunction
+++ /dev/null
@@ -1,36 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#power
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players set $math.ipow bs.out 1
-execute if score $math.ipow.y bs.in matches 1.. store result score #j bs.ctx run scoreboard players operation #i bs.ctx = $math.ipow.x bs.in
-execute if score $math.ipow.y bs.in matches 2.. store result score #k bs.ctx run scoreboard players operation #j bs.ctx *= #j bs.ctx
-execute if score $math.ipow.y bs.in matches 4.. store result score #l bs.ctx run scoreboard players operation #k bs.ctx *= #k bs.ctx
-execute if score $math.ipow.y bs.in matches 8.. store result score #m bs.ctx run scoreboard players operation #l bs.ctx *= #l bs.ctx
-execute if score $math.ipow.y bs.in matches 16.. run scoreboard players operation #m bs.ctx *= #m bs.ctx
-
-scoreboard players operation #y bs.ctx = $math.ipow.y bs.in
-execute if score #y bs.ctx matches 16.. run scoreboard players operation $math.ipow bs.out *= #m bs.ctx
-execute if score #y bs.ctx matches 16.. run scoreboard players remove #y bs.ctx 16
-execute if score #y bs.ctx matches 8.. run scoreboard players operation $math.ipow bs.out *= #l bs.ctx
-execute if score #y bs.ctx matches 8.. run scoreboard players remove #y bs.ctx 8
-execute if score #y bs.ctx matches 4.. run scoreboard players operation $math.ipow bs.out *= #k bs.ctx
-execute if score #y bs.ctx matches 4.. run scoreboard players remove #y bs.ctx 4
-execute if score #y bs.ctx matches 2.. run scoreboard players operation $math.ipow bs.out *= #j bs.ctx
-execute if score #y bs.ctx matches 2.. run scoreboard players remove #y bs.ctx 2
-execute if score #y bs.ctx matches 1.. run scoreboard players operation $math.ipow bs.out *= #i bs.ctx
-
-return run scoreboard players get $math.ipow bs.out
diff --git a/datapacks/Bookshelf/data/bs.math/function/isqrt.mcfunction b/datapacks/Bookshelf/data/bs.math/function/isqrt.mcfunction
deleted file mode 100644
index 76be7d1bcf..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/isqrt.mcfunction
+++ /dev/null
@@ -1,39 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#square-root
-# ------------------------------------------------------------------------------------------------------------
-
-# Note: Thanks to the Minecraft Commands' discord server for the help provided (https://discord.gg/QAFXFtZ)
-
-execute store result score #s bs.ctx store result score #t bs.ctx store result score #u bs.ctx store result score #v bs.ctx run scoreboard players operation $math.isqrt bs.out = $math.isqrt.x bs.in
-
-execute if score $math.isqrt.x bs.in matches 0..1515359 run scoreboard players operation $math.isqrt bs.out /= 559 bs.const
-execute if score $math.isqrt.x bs.in matches 0..1515359 run scoreboard players add $math.isqrt bs.out 15
-execute if score $math.isqrt.x bs.in matches 1515360.. run scoreboard players operation $math.isqrt bs.out /= 32768 bs.const
-execute if score $math.isqrt.x bs.in matches 1515360.. run scoreboard players add $math.isqrt bs.out 2456
-
-scoreboard players operation #s bs.ctx /= $math.isqrt bs.out
-scoreboard players operation $math.isqrt bs.out += #s bs.ctx
-scoreboard players operation $math.isqrt bs.out /= 2 bs.const
-scoreboard players operation #t bs.ctx /= $math.isqrt bs.out
-scoreboard players operation $math.isqrt bs.out += #t bs.ctx
-scoreboard players operation $math.isqrt bs.out /= 2 bs.const
-scoreboard players operation #u bs.ctx /= $math.isqrt bs.out
-scoreboard players operation $math.isqrt bs.out += #u bs.ctx
-scoreboard players operation $math.isqrt bs.out /= 2 bs.const
-
-scoreboard players operation #v bs.ctx /= $math.isqrt bs.out
-execute if score $math.isqrt bs.out > #v bs.ctx run scoreboard players remove $math.isqrt bs.out 1
-return run scoreboard players get $math.isqrt bs.out
diff --git a/datapacks/Bookshelf/data/bs.math/function/ldexp/ldexp.mcfunction b/datapacks/Bookshelf/data/bs.math/function/ldexp/ldexp.mcfunction
deleted file mode 100644
index 04d1646379..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/ldexp/ldexp.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#float-manipulation
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx x set from storage bs:in math.ldexp.x
-execute store result score #e bs.ctx run data get storage bs:in math.ldexp.e
-function bs.math:ldexp/run
-data modify storage bs:out math.ldexp set from storage bs:ctx x
diff --git a/datapacks/Bookshelf/data/bs.math/function/ldexp/mul.mcfunction b/datapacks/Bookshelf/data/bs.math/function/ldexp/mul.mcfunction
deleted file mode 100644
index fe10b49aaa..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/ldexp/mul.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:ctx x float $(y) run data get storage bs:ctx x 16777216
diff --git a/datapacks/Bookshelf/data/bs.math/function/ldexp/run.mcfunction b/datapacks/Bookshelf/data/bs.math/function/ldexp/run.mcfunction
deleted file mode 100644
index dba4430646..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/ldexp/run.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result storage bs:ctx y int 1 run scoreboard players add #e bs.ctx 127
-function bs.math:ldexp/table with storage bs:ctx
-function bs.math:ldexp/mul with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.math/function/log.mcfunction b/datapacks/Bookshelf/data/bs.math/function/log.mcfunction
deleted file mode 100644
index 3f90cab210..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/log.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#logarithm
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx x set from storage bs:in math.log.x
-function bs.math:log2/run
-execute store result storage bs:out math.log float .000000059604644775390625 run data get storage bs:ctx x 11629079.96804520301520824432373046875
diff --git a/datapacks/Bookshelf/data/bs.math/function/log10.mcfunction b/datapacks/Bookshelf/data/bs.math/function/log10.mcfunction
deleted file mode 100644
index f432c6e5f9..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/log10.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#logarithm
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx x set from storage bs:in math.log10.x
-function bs.math:log2/run
-execute store result storage bs:out math.log10 float .000000059604644775390625 run data get storage bs:ctx x 5050445.259733675979077816009521484375
diff --git a/datapacks/Bookshelf/data/bs.math/function/log2/fract.mcfunction b/datapacks/Bookshelf/data/bs.math/function/log2/fract.mcfunction
deleted file mode 100644
index 659ff12846..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/log2/fract.mcfunction
+++ /dev/null
@@ -1,44 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# polynomial used to approximate log2(x):
-
-# c0: -1.71360049568838679334703556378372013568878173828125
-# c1: 12.140772751442813870426107314415276050567626953125
-# c2: -38.14350757032898542320253909565508365631103515625
-# c3: 69.9190874943370630489880568347871303558349609375
-# c4: -82.8110616548526223823500913567841053009033203125
-# c5: 66.436833597743998325313441455364227294921875
-# c6: -37.1792086028527819507871754467487335205078125
-# c7: 15.723860485552176413648339803330600261688232421875
-# c8: -4.3731760053578137004137715848628431558609008789062
-
-$execute store result storage bs:ctx x float $(x) run scoreboard players set #x bs.ctx -28749446
-execute store result score #x bs.ctx run data get storage bs:ctx x
-$execute store result storage bs:ctx x float $(x) run scoreboard players add #x bs.ctx 203688367
-execute store result score #x bs.ctx run data get storage bs:ctx x
-$execute store result storage bs:ctx x float $(x) run scoreboard players remove #x bs.ctx 639941865
-execute store result score #x bs.ctx run data get storage bs:ctx x
-$execute store result storage bs:ctx x float $(x) run scoreboard players add #x bs.ctx 1173047633
-execute store result score #x bs.ctx run data get storage bs:ctx x
-$execute store result storage bs:ctx x float $(x) run scoreboard players remove #x bs.ctx 1389339069
-execute store result score #x bs.ctx run data get storage bs:ctx x
-$execute store result storage bs:ctx x float $(x) run scoreboard players add #x bs.ctx 1114625108
-execute store result score #x bs.ctx run data get storage bs:ctx x
-$execute store result storage bs:ctx x float $(x) run scoreboard players remove #x bs.ctx 623763613
-execute store result score #x bs.ctx run data get storage bs:ctx x
-$execute store result storage bs:ctx x float $(x) run scoreboard players add #x bs.ctx 263802604
-execute store result score #x bs.ctx run data get storage bs:ctx x
-scoreboard players remove #x bs.ctx 73369718
diff --git a/datapacks/Bookshelf/data/bs.math/function/log2/log2.mcfunction b/datapacks/Bookshelf/data/bs.math/function/log2/log2.mcfunction
deleted file mode 100644
index 3d83a93df5..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/log2/log2.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#logarithm
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx x set from storage bs:in math.log2.x
-function bs.math:log2/run
-data modify storage bs:out math.log2 set from storage bs:ctx x
diff --git a/datapacks/Bookshelf/data/bs.math/function/log2/run.mcfunction b/datapacks/Bookshelf/data/bs.math/function/log2/run.mcfunction
deleted file mode 100644
index e3c4d4f69c..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/log2/run.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# decompose x into a normalized fraction and an integral power of two [log2(x) = log2(frexp.x) + frexp.e]
-function bs.math:frexp/run
-function bs.math:log2/fract with storage bs:ctx
-scoreboard players operation #e bs.ctx *= 16777216 bs.const
-execute store result storage bs:ctx x float .000000059604644775390625 run scoreboard players operation #x bs.ctx += #e bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.math/function/loga/loga.mcfunction b/datapacks/Bookshelf/data/bs.math/function/loga/loga.mcfunction
deleted file mode 100644
index 4cf878e849..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/loga/loga.mcfunction
+++ /dev/null
@@ -1,27 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#logarithm
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx x set from storage bs:in math.loga.a
-function bs.math:log2/run
-
-scoreboard players set #a bs.ctx 2000000000
-execute store result score #b bs.ctx run data get storage bs:ctx x 20000
-execute store result storage bs:ctx y double 1 run scoreboard players operation #a bs.ctx /= #b bs.ctx
-
-data modify storage bs:ctx x set from storage bs:in math.loga.x
-function bs.math:log2/run
-function bs.math:loga/mul with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.math/function/loga/mul.mcfunction b/datapacks/Bookshelf/data/bs.math/function/loga/mul.mcfunction
deleted file mode 100644
index 99eed3548d..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/loga/mul.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:out math.loga float .00001 run data get storage bs:ctx x $(y)
diff --git a/datapacks/Bookshelf/data/bs.math/function/pow/mul.mcfunction b/datapacks/Bookshelf/data/bs.math/function/pow/mul.mcfunction
deleted file mode 100644
index 3846380092..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/pow/mul.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:ctx x float $(y) run scoreboard players operation #x bs.ctx += #e bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.math/function/pow/pow.mcfunction b/datapacks/Bookshelf/data/bs.math/function/pow/pow.mcfunction
deleted file mode 100644
index 4d1167fdbc..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/pow/pow.mcfunction
+++ /dev/null
@@ -1,29 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#pow
-# ------------------------------------------------------------------------------------------------------------
-
-# pow(x,y) = exp2(y * log2(x))
-data modify storage bs:ctx x set from storage bs:in math.pow.x
-data modify storage bs:ctx y set from storage bs:in math.pow.y
-
-function bs.math:frexp/run
-function bs.math:log2/fract with storage bs:ctx
-scoreboard players operation #e bs.ctx *= 16777216 bs.const
-function bs.math:pow/mul with storage bs:ctx
-
-execute store result score #e bs.ctx store result score #x bs.ctx run data get storage bs:ctx x
-function bs.math:exp2/run
-data modify storage bs:out math.pow set from storage bs:ctx x
diff --git a/datapacks/Bookshelf/data/bs.math/function/sin.mcfunction b/datapacks/Bookshelf/data/bs.math/function/sin.mcfunction
deleted file mode 100644
index fc3c0c64c2..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/sin.mcfunction
+++ /dev/null
@@ -1,31 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#trigonometry
-# ------------------------------------------------------------------------------------------------------------
-
-# Normalize angle
-scoreboard players operation $math.sin bs.out = $math.sin.x bs.in
-execute store result score #x bs.ctx run scoreboard players operation $math.sin bs.out %= 36000 bs.const
-execute if score #x bs.ctx matches ..18000 run scoreboard players remove $math.sin bs.out 9000
-execute if score #x bs.ctx matches 18001.. run scoreboard players remove $math.sin bs.out 27000
-
-# Compute Bhāskara sinine approximation
-execute store result score #y bs.ctx run scoreboard players operation $math.sin bs.out *= $math.sin bs.out
-scoreboard players operation $math.sin bs.out *= -4 bs.const
-scoreboard players add $math.sin bs.out 324000000
-scoreboard players add #y bs.ctx 324000000
-scoreboard players operation #y bs.ctx /= 1000 bs.const
-execute if score #x bs.ctx matches 18000.. run scoreboard players operation #y bs.ctx *= -1 bs.const
-return run scoreboard players operation $math.sin bs.out /= #y bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.math/function/sincos/run.mcfunction b/datapacks/Bookshelf/data/bs.math/function/sincos/run.mcfunction
deleted file mode 100644
index 495b0d6e2c..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/sincos/run.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result entity @s Rotation[0] float -0.01 run scoreboard players get $math.sincos.x bs.in
-execute at @s positioned 0.0 0.0 0.0 rotated ~ 0.0 run tp @s ^ ^ ^10.0
-execute store result score $math.sincos.cos bs.out run data get entity @s Pos[2] 100
-execute store result score $math.sincos.sin bs.out run data get entity @s Pos[0] 100
-tp @s -30000000 0 1600
diff --git a/datapacks/Bookshelf/data/bs.math/function/sincos/sincos.mcfunction b/datapacks/Bookshelf/data/bs.math/function/sincos/sincos.mcfunction
deleted file mode 100644
index 02f5be997f..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/sincos/sincos.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#trigonometry
-# ------------------------------------------------------------------------------------------------------------
-
-execute in minecraft:overworld as B5-0-0-0-1 run function bs.math:sincos/run
diff --git a/datapacks/Bookshelf/data/bs.math/function/sqrt.mcfunction b/datapacks/Bookshelf/data/bs.math/function/sqrt.mcfunction
deleted file mode 100644
index 2ac88ff911..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/sqrt.mcfunction
+++ /dev/null
@@ -1,48 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#square-root
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx x set from storage bs:in math.sqrt.x
-function bs.math:frexp/run
-
-# secant approximation (x / 79249 + 19750 => 2 iters)
-execute store result score #x bs.ctx store result score #y bs.ctx store result score #i bs.ctx store result score #j bs.ctx run data get storage bs:ctx x 1073741824
-scoreboard players operation #x bs.ctx /= 79249 bs.const
-scoreboard players add #x bs.ctx 19750
-scoreboard players operation #i bs.ctx /= #x bs.ctx
-scoreboard players operation #x bs.ctx += #i bs.ctx
-scoreboard players operation #x bs.ctx /= 2 bs.const
-scoreboard players operation #j bs.ctx /= #x bs.ctx
-scoreboard players operation #x bs.ctx += #j bs.ctx
-execute store result score #i bs.ctx store result score #j bs.ctx run scoreboard players operation #x bs.ctx /= 2 bs.const
-
-# secant approximation (x - isqrt(x)^2) / (isqrt(x) * 2 + 1)
-scoreboard players operation #i bs.ctx *= 2 bs.const
-scoreboard players add #i bs.ctx 1
-scoreboard players operation #j bs.ctx *= #j bs.ctx
-scoreboard players operation #y bs.ctx -= #j bs.ctx
-scoreboard players operation #y bs.ctx *= 32768 bs.const
-scoreboard players operation #y bs.ctx /= #i bs.ctx
-scoreboard players operation #x bs.ctx *= 32768 bs.const
-
-scoreboard players operation #t bs.ctx = #e bs.ctx
-scoreboard players operation #t bs.ctx %= 2 bs.const
-scoreboard players operation #e bs.ctx += #t bs.ctx
-scoreboard players operation #e bs.ctx /= 2 bs.const
-execute if score #t bs.ctx matches 0 store result storage bs:ctx x float .000000000931322574615478515625 run scoreboard players operation #x bs.ctx += #y bs.ctx
-execute if score #t bs.ctx matches 1 store result storage bs:ctx x float .00000000065854450798271929168823261686546190196711592079736874438822269439697265625 run scoreboard players operation #x bs.ctx += #y bs.ctx
-function bs.math:ldexp/run
-data modify storage bs:out math.sqrt set from storage bs:ctx x
diff --git a/datapacks/Bookshelf/data/bs.math/function/tan/run.mcfunction b/datapacks/Bookshelf/data/bs.math/function/tan/run.mcfunction
deleted file mode 100644
index c7df6d2064..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/tan/run.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result entity @s Rotation[0] float -0.01 run scoreboard players get $math.tan.x bs.in
-execute at @s positioned 0.0 0.0 0.0 rotated ~ 0.0 run tp @s ^ ^ ^10.0
-execute store result score $math.tan bs.out run data get entity @s Pos[0] 100
-execute store result score #t bs.ctx run data get entity @s Pos[2] 100
-tp @s -30000000 0 1600
-scoreboard players operation $math.tan bs.out *= 1000 bs.const
-return run scoreboard players operation $math.tan bs.out /= #t bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.math/function/tan/tan.mcfunction b/datapacks/Bookshelf/data/bs.math/function/tan/tan.mcfunction
deleted file mode 100644
index e482d27185..0000000000
--- a/datapacks/Bookshelf/data/bs.math/function/tan/tan.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#trigonometry
-# ------------------------------------------------------------------------------------------------------------
-
-return run execute in minecraft:overworld as B5-0-0-0-1 run function bs.math:tan/run
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/acos.json b/datapacks/Bookshelf/data/bs.math/tags/function/acos.json
deleted file mode 100644
index 446782da4e..0000000000
--- a/datapacks/Bookshelf/data/bs.math/tags/function/acos.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2017/09/04",
- "minecraft_version": "1.12.1"
- },
- "updated": {
- "date": "2023/09/05",
- "minecraft_version": "23w33a"
- }
- },
- "values": [
- "bs.math:acos"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/asin.json b/datapacks/Bookshelf/data/bs.math/tags/function/asin.json
deleted file mode 100644
index 4590fb31ea..0000000000
--- a/datapacks/Bookshelf/data/bs.math/tags/function/asin.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2017/08/24",
- "minecraft_version": "1.12"
- },
- "updated": {
- "date": "2023/09/05",
- "minecraft_version": "23w33a"
- }
- },
- "values": [
- "bs.math:asin"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/atan.json b/datapacks/Bookshelf/data/bs.math/tags/function/atan.json
deleted file mode 100644
index ec90ecf128..0000000000
--- a/datapacks/Bookshelf/data/bs.math/tags/function/atan.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/10/01",
- "minecraft_version": "1.13.2"
- },
- "updated": {
- "date": "2023/09/05",
- "minecraft_version": "23w33a"
- }
- },
- "values": [
- "bs.math:atan/atan"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.math/tags/function/exclusive_load.json
deleted file mode 100644
index 6a034e3b39..0000000000
--- a/datapacks/Bookshelf/data/bs.math/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.math:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/frexp.json b/datapacks/Bookshelf/data/bs.math/tags/function/frexp.json
deleted file mode 100644
index 4f62e64a8b..0000000000
--- a/datapacks/Bookshelf/data/bs.math/tags/function/frexp.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#float-manipulation",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/02",
- "minecraft_version": "23w33a"
- },
- "updated": {
- "date": "2024/01/31",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.math:frexp/frexp"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/gcd.json b/datapacks/Bookshelf/data/bs.math/tags/function/gcd.json
deleted file mode 100644
index 828c3f0450..0000000000
--- a/datapacks/Bookshelf/data/bs.math/tags/function/gcd.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#greatest-common-denominator",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/10/28",
- "minecraft_version": "1.12.2"
- },
- "updated": {
- "date": "2023/08/03",
- "minecraft_version": "23w33a"
- }
- },
- "values": [
- "bs.math:gcd/gcd"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/help.json b/datapacks/Bookshelf/data/bs.math/tags/function/help.json
deleted file mode 100644
index ba3a0110a4..0000000000
--- a/datapacks/Bookshelf/data/bs.math/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.math:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/ldexp.json b/datapacks/Bookshelf/data/bs.math/tags/function/ldexp.json
deleted file mode 100644
index 445440f88f..0000000000
--- a/datapacks/Bookshelf/data/bs.math/tags/function/ldexp.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#float-manipulation",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/28",
- "minecraft_version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/28",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.math:ldexp/ldexp"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/load.json b/datapacks/Bookshelf/data/bs.math/tags/function/load.json
deleted file mode 100644
index 8c72151852..0000000000
--- a/datapacks/Bookshelf/data/bs.math/tags/function/load.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.math:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/unload.json b/datapacks/Bookshelf/data/bs.math/tags/function/unload.json
deleted file mode 100644
index 9f92da2353..0000000000
--- a/datapacks/Bookshelf/data/bs.math/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.math:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.math/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.math/test/__boot__.mcfunction
deleted file mode 100644
index 0a54ea02d5..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.math
-# @beforebatch function #bs.math:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.math/test/acos.mcfunction b/datapacks/Bookshelf/data/bs.math/test/acos.mcfunction
deleted file mode 100644
index c546622536..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/acos.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# acos returns the correct values
-# @batch bs.math
-
-scoreboard players set $math.acos.x bs.in 420
-function #bs.math:acos
-assert score $math.acos bs.out matches 6515..6517
-
-scoreboard players set $math.acos.x bs.in -826
-function #bs.math:acos
-assert score $math.acos bs.out matches 14568..14570
diff --git a/datapacks/Bookshelf/data/bs.math/test/asin.mcfunction b/datapacks/Bookshelf/data/bs.math/test/asin.mcfunction
deleted file mode 100644
index c0a022d7ce..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/asin.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# asin returns the correct values
-# @batch bs.math
-
-scoreboard players set $math.asin.x bs.in 420
-function #bs.math:asin
-assert score $math.asin bs.out matches 2482..2484
-
-scoreboard players set $math.asin.x bs.in -826
-function #bs.math:asin
-assert score $math.asin bs.out matches -5570..-5568
diff --git a/datapacks/Bookshelf/data/bs.math/test/atan.mcfunction b/datapacks/Bookshelf/data/bs.math/test/atan.mcfunction
deleted file mode 100644
index 62e8234724..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/atan.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# atan returns the correct values
-# @batch bs.math
-
-scoreboard players set $math.atan.x bs.in 420
-function #bs.math:atan
-assert score $math.atan bs.out matches 2277..2279
-
-scoreboard players set $math.atan.x bs.in -826
-function #bs.math:atan
-assert score $math.atan bs.out matches -3956..-3954
diff --git a/datapacks/Bookshelf/data/bs.math/test/atan2.mcfunction b/datapacks/Bookshelf/data/bs.math/test/atan2.mcfunction
deleted file mode 100644
index 007a851f23..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/atan2.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# atan2 returns the correct values
-# @batch bs.math
-
-scoreboard players set $math.atan2.y bs.in 420
-scoreboard players set $math.atan2.x bs.in -700
-function #bs.math:atan2
-assert score $math.atan2 bs.out matches 14902..14904
-
-scoreboard players set $math.atan2.y bs.in -826
-scoreboard players set $math.atan2.x bs.in 200
-function #bs.math:atan2
-assert score $math.atan2 bs.out matches -7639..-7637
diff --git a/datapacks/Bookshelf/data/bs.math/test/combine.mcfunction b/datapacks/Bookshelf/data/bs.math/test/combine.mcfunction
deleted file mode 100644
index ff819dcd0a..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/combine.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# combine returns the correct values
-# @batch bs.math
-
-scoreboard players set $math.combine.n bs.in 42
-scoreboard players set $math.combine.k bs.in 7
-function #bs.math:combine
-assert score $math.combine bs.out matches 26978328
-
-scoreboard players set $math.combine.n bs.in 128
-scoreboard players set $math.combine.k bs.in 3
-function #bs.math:combine
-assert score $math.combine bs.out matches 341376
-
-scoreboard players set $math.combine.n bs.in 42
-scoreboard players set $math.combine.k bs.in 9
-function #bs.math:combine
-assert score $math.combine bs.out matches 445891810
diff --git a/datapacks/Bookshelf/data/bs.math/test/cos.mcfunction b/datapacks/Bookshelf/data/bs.math/test/cos.mcfunction
deleted file mode 100644
index c403a5b426..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/cos.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# cos returns the correct values
-# @batch bs.math
-
-scoreboard players set $math.cos.x bs.in 6442
-function #bs.math:cos
-assert score $math.cos bs.out matches 430..432
-
-scoreboard players set $math.cos.x bs.in -21513
-function #bs.math:cos
-assert score $math.cos bs.out matches -818..-816
diff --git a/datapacks/Bookshelf/data/bs.math/test/divide.mcfunction b/datapacks/Bookshelf/data/bs.math/test/divide.mcfunction
deleted file mode 100644
index 912e357053..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/divide.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# divide returns the correct values
-# @batch bs.math
-
-scoreboard players set $math.divide.x bs.in 9
-scoreboard players set $math.divide.y bs.in 5
-function #bs.math:divide
-assert score $math.divide bs.out matches 2
-
-scoreboard players set $math.divide.x bs.in 11
-scoreboard players set $math.divide.y bs.in 5
-function #bs.math:divide
-assert score $math.divide bs.out matches 2
diff --git a/datapacks/Bookshelf/data/bs.math/test/exp.mcfunction b/datapacks/Bookshelf/data/bs.math/test/exp.mcfunction
deleted file mode 100644
index 7e7a461306..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/exp.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# exp returns the correct values
-# @batch bs.math
-
-data modify storage bs:in math.exp.x set value 3.0
-function #bs.math:exp
-execute store result score #r bs.ctx run data get storage bs:out math.exp 10000
-assert score #r bs.ctx matches 200854..200856
-
-data modify storage bs:in math.exp.x set value 7.25
-function #bs.math:exp
-execute store result score #r bs.ctx run data get storage bs:out math.exp 10000
-assert score #r bs.ctx matches 14081047..14081049
diff --git a/datapacks/Bookshelf/data/bs.math/test/exp2.mcfunction b/datapacks/Bookshelf/data/bs.math/test/exp2.mcfunction
deleted file mode 100644
index 63d9f6187f..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/exp2.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# exp2 returns the correct values
-# @batch bs.math
-
-data modify storage bs:in math.exp2.x set value 3.0
-function #bs.math:exp2
-execute store result score #r bs.ctx run data get storage bs:out math.exp2 10000
-assert score #r bs.ctx matches 80000..80000
-
-data modify storage bs:in math.exp2.x set value 7.25
-function #bs.math:exp2
-execute store result score #r bs.ctx run data get storage bs:out math.exp2 10000
-assert score #r bs.ctx matches 1522184..1522186
diff --git a/datapacks/Bookshelf/data/bs.math/test/factorial.mcfunction b/datapacks/Bookshelf/data/bs.math/test/factorial.mcfunction
deleted file mode 100644
index 3df6c4c9ba..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/factorial.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# factorial returns the correct values
-# @batch bs.math
-
-scoreboard players set $math.factorial.n bs.in 3
-function #bs.math:factorial
-assert score $math.factorial bs.out matches 6
-
-scoreboard players set $math.factorial.n bs.in 11
-function #bs.math:factorial
-assert score $math.factorial bs.out matches 39916800
diff --git a/datapacks/Bookshelf/data/bs.math/test/frexp.mcfunction b/datapacks/Bookshelf/data/bs.math/test/frexp.mcfunction
deleted file mode 100644
index 5f87f2761a..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/frexp.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# frexp returns the correct values
-# @batch bs.math
-
-data modify storage bs:in math.frexp.x set value 5.8
-function #bs.math:frexp
-execute store result score #e bs.ctx run data get storage bs:out math.frexp.e
-execute store result score #x bs.ctx run data get storage bs:out math.frexp.x 1000
-assert score #e bs.ctx matches 3
-assert score #x bs.ctx matches 725
-
-data modify storage bs:in math.frexp.x set value 18238123421.42
-function #bs.math:frexp
-execute store result score #e bs.ctx run data get storage bs:out math.frexp.e
-execute store result score #x bs.ctx run data get storage bs:out math.frexp.x 100000000
-assert score #e bs.ctx matches 35
-assert score #x bs.ctx matches 53079924..53079926
diff --git a/datapacks/Bookshelf/data/bs.math/test/gcd.mcfunction b/datapacks/Bookshelf/data/bs.math/test/gcd.mcfunction
deleted file mode 100644
index dc9371a523..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/gcd.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# gcd returns the correct values
-# @batch bs.math
-
-scoreboard players set $math.gcd.a bs.in 16
-scoreboard players set $math.gcd.b bs.in 12
-function #bs.math:gcd
-assert score $math.gcd bs.out matches 4
-
-scoreboard players set $math.gcd.a bs.in 56616
-scoreboard players set $math.gcd.b bs.in 1568
-function #bs.math:gcd
-assert score $math.gcd bs.out matches 56
diff --git a/datapacks/Bookshelf/data/bs.math/test/ipow.mcfunction b/datapacks/Bookshelf/data/bs.math/test/ipow.mcfunction
deleted file mode 100644
index 060f25f008..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/ipow.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# ipow returns the correct values
-# @batch bs.math
-
-scoreboard players set $math.ipow.x bs.in 12
-scoreboard players set $math.ipow.y bs.in 7
-function #bs.math:ipow
-assert score $math.ipow bs.out matches 35831808
-
-scoreboard players set $math.ipow.x bs.in 42
-scoreboard players set $math.ipow.y bs.in 3
-function #bs.math:ipow
-assert score $math.ipow bs.out matches 74088
diff --git a/datapacks/Bookshelf/data/bs.math/test/isqrt.mcfunction b/datapacks/Bookshelf/data/bs.math/test/isqrt.mcfunction
deleted file mode 100644
index 90c72e3525..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/isqrt.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# isqrt returns the correct values
-# @batch bs.math
-
-scoreboard players set $math.isqrt.x bs.in 49
-function #bs.math:isqrt
-assert score $math.isqrt bs.out matches 7
-
-scoreboard players set $math.isqrt.x bs.in 48
-function #bs.math:isqrt
-assert score $math.isqrt bs.out matches 6
diff --git a/datapacks/Bookshelf/data/bs.math/test/ldexp.mcfunction b/datapacks/Bookshelf/data/bs.math/test/ldexp.mcfunction
deleted file mode 100644
index 86bdc2fbfc..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/ldexp.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# ldexp returns the correct values
-# @batch bs.math
-
-data modify storage bs:in math.ldexp set value {x:.652,e:-3}
-function #bs.math:ldexp
-execute store result score #r bs.ctx run data get storage bs:out math.ldexp 10000
-assert score #r bs.ctx matches 814..816
-
-data modify storage bs:in math.ldexp set value {x:-.725,e:3}
-function #bs.math:ldexp
-execute store result score #r bs.ctx run data get storage bs:out math.ldexp
-assert score #r bs.ctx matches -6
-
-data modify storage bs:in math.ldexp set value {x:.85,e:11}
-function #bs.math:ldexp
-execute store result score #r bs.ctx run data get storage bs:out math.ldexp 10000
-assert score #r bs.ctx matches 17407999..17408001
diff --git a/datapacks/Bookshelf/data/bs.math/test/log.mcfunction b/datapacks/Bookshelf/data/bs.math/test/log.mcfunction
deleted file mode 100644
index c604c90bc0..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/log.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# log returns the correct values
-# @batch bs.math
-
-data modify storage bs:in math.log.x set value 28.0
-function #bs.math:log
-execute store result score #r bs.ctx run data get storage bs:out math.log 100000
-assert score #r bs.ctx matches 333219..333221
-
-data modify storage bs:in math.log.x set value 123456789.0
-function #bs.math:log
-execute store result score #r bs.ctx run data get storage bs:out math.log 100000
-assert score #r bs.ctx matches 1863139..1863141
-
-data modify storage bs:in math.log.x set value 1234.4321
-function #bs.math:log
-execute store result score #r bs.ctx run data get storage bs:out math.log 100000
-assert score #r bs.ctx matches 711835..711837
diff --git a/datapacks/Bookshelf/data/bs.math/test/log10.mcfunction b/datapacks/Bookshelf/data/bs.math/test/log10.mcfunction
deleted file mode 100644
index 47619f0d7c..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/log10.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# log10 returns the correct values
-# @batch bs.math
-
-data modify storage bs:in math.log10.x set value 28.0
-function #bs.math:log10
-execute store result score #r bs.ctx run data get storage bs:out math.log10 100000
-assert score #r bs.ctx matches 144714..144716
-
-data modify storage bs:in math.log10.x set value 123456789.0
-function #bs.math:log10
-execute store result score #r bs.ctx run data get storage bs:out math.log10 100000
-assert score #r bs.ctx matches 809150..809152
-
-data modify storage bs:in math.log10.x set value 1234.4321
-function #bs.math:log10
-execute store result score #r bs.ctx run data get storage bs:out math.log10 100000
-assert score #r bs.ctx matches 309145..309147
diff --git a/datapacks/Bookshelf/data/bs.math/test/log2.mcfunction b/datapacks/Bookshelf/data/bs.math/test/log2.mcfunction
deleted file mode 100644
index bde8c5b3f7..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/log2.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# log2 returns the correct values
-# @batch bs.math
-
-data modify storage bs:in math.log2.x set value 28.0
-function #bs.math:log2
-execute store result score #r bs.ctx run data get storage bs:out math.log2 100000
-assert score #r bs.ctx matches 480734..480736
-
-data modify storage bs:in math.log2.x set value 123456789.0
-function #bs.math:log2
-execute store result score #r bs.ctx run data get storage bs:out math.log2 100000
-assert score #r bs.ctx matches 2687942..2687944
-
-data modify storage bs:in math.log2.x set value 1234.4321
-function #bs.math:log2
-execute store result score #r bs.ctx run data get storage bs:out math.log2 100000
-assert score #r bs.ctx matches 1026962..1026964
diff --git a/datapacks/Bookshelf/data/bs.math/test/loga.mcfunction b/datapacks/Bookshelf/data/bs.math/test/loga.mcfunction
deleted file mode 100644
index c48a788a13..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/loga.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# loga returns the correct values
-# @batch bs.math
-
-data modify storage bs:in math.loga set value {x:28.0,a:5}
-function #bs.math:loga
-execute store result score #r bs.ctx run data get storage bs:out math.loga 10000
-assert score #r bs.ctx matches 20703..20705
-
-data modify storage bs:in math.loga set value {x:123456789.0,a:3}
-function #bs.math:loga
-execute store result score #r bs.ctx run data get storage bs:out math.loga 10000
-assert score #r bs.ctx matches 169589..169591
-
-data modify storage bs:in math.loga set value {x:1234.4321,a:9}
-function #bs.math:loga
-execute store result score #r bs.ctx run data get storage bs:out math.loga 10000
-assert score #r bs.ctx matches 32396..32398
diff --git a/datapacks/Bookshelf/data/bs.math/test/pow.mcfunction b/datapacks/Bookshelf/data/bs.math/test/pow.mcfunction
deleted file mode 100644
index 9e56a2fa1f..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/pow.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# pow returns the correct values
-# @batch bs.math
-
-data modify storage bs:in math.pow set value {x:3.5,y:5}
-function #bs.math:pow
-execute store result score #r bs.ctx run data get storage bs:out math.pow 1000
-assert score #r bs.ctx matches 525217..525219
-
-data modify storage bs:in math.pow set value {x:18.125,y:2.5}
-function #bs.math:pow
-execute store result score #r bs.ctx run data get storage bs:out math.pow 1000
-assert score #r bs.ctx matches 1398603..1398605
-
-data modify storage bs:in math.pow set value {x:49,y:.5}
-function #bs.math:pow
-execute store result score #r bs.ctx run data get storage bs:out math.pow 1000
-assert score #r bs.ctx matches 6999..7001
diff --git a/datapacks/Bookshelf/data/bs.math/test/sin.mcfunction b/datapacks/Bookshelf/data/bs.math/test/sin.mcfunction
deleted file mode 100644
index 214b5a9510..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/sin.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# sin returns the correct values
-# @batch bs.math
-
-scoreboard players set $math.sin.x bs.in 6442
-function #bs.math:sin
-assert score $math.sin bs.out matches 900..902
-
-scoreboard players set $math.sin.x bs.in -21513
-function #bs.math:sin
-assert score $math.sin bs.out matches 574..576
diff --git a/datapacks/Bookshelf/data/bs.math/test/sincos.mcfunction b/datapacks/Bookshelf/data/bs.math/test/sincos.mcfunction
deleted file mode 100644
index 5487cd385b..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/sincos.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# sincos returns the correct values
-# @batch bs.math
-
-scoreboard players set $math.sincos.x bs.in 6442
-function #bs.math:sincos
-assert score $math.sincos.cos bs.out matches 430..432
-assert score $math.sincos.sin bs.out matches 900..902
-
-scoreboard players set $math.sincos.x bs.in -21513
-function #bs.math:sincos
-assert score $math.sincos.cos bs.out matches -818..-816
-assert score $math.sincos.sin bs.out matches 574..576
diff --git a/datapacks/Bookshelf/data/bs.math/test/sqrt.mcfunction b/datapacks/Bookshelf/data/bs.math/test/sqrt.mcfunction
deleted file mode 100644
index 92c87573ac..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/sqrt.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# sqrt returns the correct values
-# @batch bs.math
-
-data modify storage bs:in math.sqrt.x set value 1234.56789
-function #bs.math:sqrt
-execute store result score #r bs.ctx run data get storage bs:out math.sqrt 100000
-assert score #r bs.ctx matches 3513640..3513642
-
-data modify storage bs:in math.sqrt.x set value 98765.56789
-function #bs.math:sqrt
-execute store result score #r bs.ctx run data get storage bs:out math.sqrt 100000
-assert score #r bs.ctx matches 31426988..31426990
diff --git a/datapacks/Bookshelf/data/bs.math/test/tan.mcfunction b/datapacks/Bookshelf/data/bs.math/test/tan.mcfunction
deleted file mode 100644
index a3295f5e60..0000000000
--- a/datapacks/Bookshelf/data/bs.math/test/tan.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# tan returns the correct values
-# @batch bs.math
-
-scoreboard players set $math.tan.x bs.in 4250
-function #bs.math:tan
-assert score $math.tan bs.out matches 915..917
-
-scoreboard players set $math.tan.x bs.in -21513
-function #bs.math:tan
-assert score $math.tan bs.out matches -704..-702
diff --git a/datapacks/Bookshelf/data/bs.move/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.move/.metadata/generated/features.json
deleted file mode 100644
index e8e792cbdb..0000000000
--- a/datapacks/Bookshelf/data/bs.move/.metadata/generated/features.json
+++ /dev/null
@@ -1,86 +0,0 @@
-[
- {
- "name": "apply_local_vel",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#apply-velocity",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/05/28",
- "version": "1.13"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- },
- {
- "name": "apply_vel",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#apply-velocity",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/05/24",
- "version": "1.13"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- },
- {
- "name": "canonical_to_local",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#canonical-to-local",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/12/25",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "local_to_canonical",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#local-to-canonical",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/12/25",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/04/19",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_motion",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#set-motion",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2019/07/10",
- "version": "1.14.3"
- },
- "updated": {
- "date": "2023/12/13",
- "version": "1.20.4"
- }
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.move/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.move/.metadata/generated/module.json
deleted file mode 100644
index 7127c8ee34..0000000000
--- a/datapacks/Bookshelf/data/bs.move/.metadata/generated/module.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "name": "bs.move",
- "display_name": "Move",
- "description": "Make your entity move exactly the way you want them to!",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "dependencies": [
- "bs.hitbox"
- ],
- "features": [
- "bs.move:apply_local_vel",
- "bs.move:apply_vel",
- "bs.move:canonical_to_local",
- "bs.move:local_to_canonical",
- "bs.move:set_motion"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.move/.metadata/module.json b/datapacks/Bookshelf/data/bs.move/.metadata/module.json
deleted file mode 100644
index 3f95743d05..0000000000
--- a/datapacks/Bookshelf/data/bs.move/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.move",
- "display_name": "Move",
- "description": "Make your entity move exactly the way you want them to!",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html"
-}
diff --git a/datapacks/Bookshelf/data/bs.move/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.move/function/__help__.mcfunction
deleted file mode 100644
index 3497a90d10..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/move.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.move documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.move/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.move/function/__load__.mcfunction
deleted file mode 100644
index 7bf84a311b..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/__load__.mcfunction
+++ /dev/null
@@ -1,38 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/move.html
-# ------------------------------------------------------------------------------------------------------------
-
-forceload add -30000000 1600
-execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
-
-scoreboard objectives add bs.in dummy [{"text":"BS ","color":"dark_gray"},{"text":"Input","color":"aqua"}]
-scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
-scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-scoreboard objectives add bs.vel.x dummy [{"text":"BS ","color":"dark_gray"},{"text":"Velocity X","color":"aqua"}]
-scoreboard objectives add bs.vel.y dummy [{"text":"BS ","color":"dark_gray"},{"text":"Velocity Y","color":"aqua"}]
-scoreboard objectives add bs.vel.z dummy [{"text":"BS ","color":"dark_gray"},{"text":"Velocity Z","color":"aqua"}]
-
-scoreboard players set -10000000 bs.const -10000000
-scoreboard players set -10000 bs.const -10000
-scoreboard players set -1000 bs.const -1000
-scoreboard players set -2 bs.const -2
-scoreboard players set -1 bs.const -1
-scoreboard players set 2 bs.const 2
-scoreboard players set 500 bs.const 500
-scoreboard players set 1000 bs.const 1000
-scoreboard players set 10000 bs.const 10000
-scoreboard players set 10000000 bs.const 10000000
diff --git a/datapacks/Bookshelf/data/bs.move/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.move/function/__unload__.mcfunction
deleted file mode 100644
index 7ed52cf9f2..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/__unload__.mcfunction
+++ /dev/null
@@ -1,29 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/move.html
-# ------------------------------------------------------------------------------------------------------------
-
-kill B5-0-0-0-1
-forceload remove -30000000 1600
-
-scoreboard objectives remove bs.in
-scoreboard objectives remove bs.data
-scoreboard objectives remove bs.const
-scoreboard objectives remove bs.ctx
-scoreboard objectives remove bs.vel.x
-scoreboard objectives remove bs.vel.y
-scoreboard objectives remove bs.vel.z
-
-data remove storage bs:data move
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/check/block/any.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/check/block/any.mcfunction
deleted file mode 100644
index e3732f3200..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/check/block/any.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute unless block ~ ~ ~ #bs.hitbox:is_composite run return run function bs.move:collision/check/block/cube
-
-function #bs.hitbox:get_block
-execute store result score #move.ox bs.data run data get storage bs:out hitbox.offset.x 10000000
-execute store result score #move.oz bs.data run data get storage bs:out hitbox.offset.z 10000000
-scoreboard players operation #move.ox bs.data += #move.x bs.data
-scoreboard players operation #move.oz bs.data += #move.z bs.data
-function bs.move:collision/check/block/shape
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/check/block/cube.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/check/block/cube.mcfunction
deleted file mode 100644
index 3154ba4fb5..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/check/block/cube.mcfunction
+++ /dev/null
@@ -1,54 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# get cube hitbox coordinates
-execute store result score #i bs.ctx run scoreboard players operation #x bs.ctx = #move.x bs.data
-execute store result score #j bs.ctx run scoreboard players operation #y bs.ctx = #move.y bs.data
-execute store result score #k bs.ctx run scoreboard players operation #z bs.ctx = #move.z bs.data
-scoreboard players add #i bs.ctx 10000000
-scoreboard players add #j bs.ctx 10000000
-scoreboard players add #k bs.ctx 10000000
-
-# add the moving entity size to the hitbox
-scoreboard players operation #x bs.ctx -= #move.w bs.data
-scoreboard players operation #y bs.ctx -= #move.h bs.data
-scoreboard players operation #z bs.ctx -= #move.w bs.data
-scoreboard players operation #i bs.ctx += #move.w bs.data
-scoreboard players operation #k bs.ctx += #move.w bs.data
-
-# when step is negative, points are negative so we get the absolute value
-scoreboard players operation #x bs.ctx /= #move.vx bs.data
-scoreboard players operation #i bs.ctx /= #move.vx bs.data
-scoreboard players operation #y bs.ctx /= #move.vy bs.data
-scoreboard players operation #j bs.ctx /= #move.vy bs.data
-scoreboard players operation #z bs.ctx /= #move.vz bs.data
-scoreboard players operation #k bs.ctx /= #move.vz bs.data
-
-# when step is negative we need to reverse near and far points
-execute if score #move.vx bs.data matches ..-1 run scoreboard players operation #x bs.ctx >< #i bs.ctx
-execute if score #move.vy bs.data matches ..-1 run scoreboard players operation #y bs.ctx >< #j bs.ctx
-execute if score #move.vz bs.data matches ..-1 run scoreboard players operation #z bs.ctx >< #k bs.ctx
-
-# compute near and far points for AABB collision
-scoreboard players operation #x bs.ctx > #y bs.ctx
-scoreboard players operation #x bs.ctx > #z bs.ctx
-scoreboard players operation #i bs.ctx < #j bs.ctx
-scoreboard players operation #i bs.ctx < #k bs.ctx
-
-# if min_x <= max_x, ray is intersecting with AABB, if max_x < 0, ray is intersecting AABB, but the whole AABB is behind
-execute if score #i bs.ctx matches 0.. \
- if score #x bs.ctx <= #i bs.ctx \
- if score #move.ctime bs.data > #x bs.ctx \
- run function bs.move:collision/collide
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/check/block/shape.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/check/block/shape.mcfunction
deleted file mode 100644
index 65ff5a989c..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/check/block/shape.mcfunction
+++ /dev/null
@@ -1,65 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# get hitbox coordinates
-execute store result score #x bs.ctx run data get storage bs:out hitbox.shape[-1][0] 625000
-execute store result score #y bs.ctx run data get storage bs:out hitbox.shape[-1][1] 625000
-execute store result score #z bs.ctx run data get storage bs:out hitbox.shape[-1][2] 625000
-execute store result score #i bs.ctx run data get storage bs:out hitbox.shape[-1][3] 625000
-execute store result score #j bs.ctx run data get storage bs:out hitbox.shape[-1][4] 625000
-execute store result score #k bs.ctx run data get storage bs:out hitbox.shape[-1][5] 625000
-data remove storage bs:out hitbox.shape[-1]
-
-# add the relative coordinates to the hitbox
-scoreboard players operation #x bs.ctx += #move.ox bs.data
-scoreboard players operation #y bs.ctx += #move.y bs.data
-scoreboard players operation #z bs.ctx += #move.oz bs.data
-scoreboard players operation #i bs.ctx += #move.ox bs.data
-scoreboard players operation #j bs.ctx += #move.y bs.data
-scoreboard players operation #k bs.ctx += #move.oz bs.data
-
-# add the moving entity size to the hitbox
-scoreboard players operation #x bs.ctx -= #move.w bs.data
-scoreboard players operation #y bs.ctx -= #move.h bs.data
-scoreboard players operation #z bs.ctx -= #move.w bs.data
-scoreboard players operation #i bs.ctx += #move.w bs.data
-scoreboard players operation #k bs.ctx += #move.w bs.data
-
-# when step is negative, points are negative so we get the absolute value
-scoreboard players operation #x bs.ctx /= #move.vx bs.data
-scoreboard players operation #i bs.ctx /= #move.vx bs.data
-scoreboard players operation #y bs.ctx /= #move.vy bs.data
-scoreboard players operation #j bs.ctx /= #move.vy bs.data
-scoreboard players operation #z bs.ctx /= #move.vz bs.data
-scoreboard players operation #k bs.ctx /= #move.vz bs.data
-
-# when step is negative we need to reverse near and far points
-execute if score #move.vx bs.data matches ..-1 run scoreboard players operation #x bs.ctx >< #i bs.ctx
-execute if score #move.vy bs.data matches ..-1 run scoreboard players operation #y bs.ctx >< #j bs.ctx
-execute if score #move.vz bs.data matches ..-1 run scoreboard players operation #z bs.ctx >< #k bs.ctx
-
-# compute near and far points for AABB collision
-scoreboard players operation #x bs.ctx > #y bs.ctx
-scoreboard players operation #x bs.ctx > #z bs.ctx
-scoreboard players operation #i bs.ctx < #j bs.ctx
-scoreboard players operation #i bs.ctx < #k bs.ctx
-
-# if min_x <= max_x, ray is intersecting with AABB, if max_x < 0, ray is intersecting AABB, but the whole AABB is behind
-execute if score #i bs.ctx matches 0.. \
- if score #x bs.ctx <= #i bs.ctx \
- if score #move.ctime bs.data > #x bs.ctx \
- run function bs.move:collision/collide
-
-execute if data storage bs:out hitbox.shape[0] run function bs.move:collision/check/block/shape
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/check/entity/any.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/check/entity/any.mcfunction
deleted file mode 100644
index 9ae8e35dd2..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/check/entity/any.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-function #bs.hitbox:get_entity
-execute if entity @s[type=!#bs.hitbox:is_shaped] run return run function bs.move:collision/check/entity/size
-function bs.move:collision/check/entity/shape
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/check/entity/shape.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/check/entity/shape.mcfunction
deleted file mode 100644
index efe5da4be8..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/check/entity/shape.mcfunction
+++ /dev/null
@@ -1,65 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# get hitbox coordinates
-execute store result score #x bs.ctx run data get storage bs:out hitbox.shape[-1][0] 625000
-execute store result score #y bs.ctx run data get storage bs:out hitbox.shape[-1][1] 625000
-execute store result score #z bs.ctx run data get storage bs:out hitbox.shape[-1][2] 625000
-execute store result score #i bs.ctx run data get storage bs:out hitbox.shape[-1][3] 625000
-execute store result score #j bs.ctx run data get storage bs:out hitbox.shape[-1][4] 625000
-execute store result score #k bs.ctx run data get storage bs:out hitbox.shape[-1][5] 625000
-data remove storage bs:out hitbox.shape[-1]
-
-# add the relative coordinates to the hitbox
-scoreboard players operation #x bs.ctx += #move.x bs.data
-scoreboard players operation #y bs.ctx += #move.y bs.data
-scoreboard players operation #z bs.ctx += #move.z bs.data
-scoreboard players operation #i bs.ctx += #move.x bs.data
-scoreboard players operation #j bs.ctx += #move.y bs.data
-scoreboard players operation #k bs.ctx += #move.z bs.data
-
-# add the moving entity size to the hitbox
-scoreboard players operation #x bs.ctx -= #move.w bs.data
-scoreboard players operation #y bs.ctx -= #move.h bs.data
-scoreboard players operation #z bs.ctx -= #move.w bs.data
-scoreboard players operation #i bs.ctx += #move.w bs.data
-scoreboard players operation #k bs.ctx += #move.w bs.data
-
-# when step is negative, points are negative so we get the absolute value
-scoreboard players operation #x bs.ctx /= #move.vx bs.data
-scoreboard players operation #i bs.ctx /= #move.vx bs.data
-scoreboard players operation #y bs.ctx /= #move.vy bs.data
-scoreboard players operation #j bs.ctx /= #move.vy bs.data
-scoreboard players operation #z bs.ctx /= #move.vz bs.data
-scoreboard players operation #k bs.ctx /= #move.vz bs.data
-
-# when step is negative we need to reverse near and far points
-execute if score #move.vx bs.data matches ..-1 run scoreboard players operation #x bs.ctx >< #i bs.ctx
-execute if score #move.vy bs.data matches ..-1 run scoreboard players operation #y bs.ctx >< #j bs.ctx
-execute if score #move.vz bs.data matches ..-1 run scoreboard players operation #z bs.ctx >< #k bs.ctx
-
-# compute near and far points for AABB collision
-scoreboard players operation #x bs.ctx > #y bs.ctx
-scoreboard players operation #x bs.ctx > #z bs.ctx
-scoreboard players operation #i bs.ctx < #j bs.ctx
-scoreboard players operation #i bs.ctx < #k bs.ctx
-
-# if min_x <= max_x, ray is intersecting with AABB, if max_x < 0, ray is intersecting AABB, but the whole AABB is behind
-execute if score #i bs.ctx matches 0.. \
- if score #x bs.ctx <= #i bs.ctx \
- if score #move.ctime bs.data > #x bs.ctx \
- run function bs.move:collision/collide
-
-execute if data storage bs:out hitbox.shape[0] run function bs.move:collision/check/entity/shape
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/check/entity/size.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/check/entity/size.mcfunction
deleted file mode 100644
index 5718222b9c..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/check/entity/size.mcfunction
+++ /dev/null
@@ -1,64 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-tag @s add bs.move.omit
-
-# get the entity relative coordinates
-execute in minecraft:overworld positioned as @s as B5-0-0-0-1 run function bs.move:collision/utils/get_relative_entity_pos with storage bs:data move
-execute store result score #x bs.ctx run data get storage bs:ctx _[0] 10000000
-execute store result score #y bs.ctx run data get storage bs:ctx _[1] 10000000
-execute store result score #z bs.ctx run data get storage bs:ctx _[2] 10000000
-execute store result score #i bs.ctx run scoreboard players operation #x bs.ctx += #move.sx bs.data
-execute store result score #j bs.ctx run scoreboard players operation #y bs.ctx += #move.sy bs.data
-execute store result score #k bs.ctx run scoreboard players operation #z bs.ctx += #move.sz bs.data
-
-# compute the hitbox using the sizes of the collided entity and the moving entity
-execute store result score #h bs.ctx run data get storage bs:out hitbox.height 10000
-execute store result score #w bs.ctx run data get storage bs:out hitbox.width 5000
-execute store result score #s bs.ctx run data get storage bs:out hitbox.scale 1000
-scoreboard players operation #h bs.ctx *= #s bs.ctx
-scoreboard players operation #w bs.ctx *= #s bs.ctx
-scoreboard players operation #w bs.ctx += #move.w bs.data
-scoreboard players operation #x bs.ctx -= #w bs.ctx
-scoreboard players operation #y bs.ctx -= #move.h bs.data
-scoreboard players operation #z bs.ctx -= #w bs.ctx
-scoreboard players operation #i bs.ctx += #w bs.ctx
-scoreboard players operation #j bs.ctx += #h bs.ctx
-scoreboard players operation #k bs.ctx += #w bs.ctx
-
-# when step is negative, points are negative so we get the absolute value
-scoreboard players operation #x bs.ctx /= #move.vx bs.data
-scoreboard players operation #i bs.ctx /= #move.vx bs.data
-scoreboard players operation #y bs.ctx /= #move.vy bs.data
-scoreboard players operation #j bs.ctx /= #move.vy bs.data
-scoreboard players operation #z bs.ctx /= #move.vz bs.data
-scoreboard players operation #k bs.ctx /= #move.vz bs.data
-
-# when step is negative we need to reverse near and far points
-execute if score #move.vx bs.data matches ..-1 run scoreboard players operation #x bs.ctx >< #i bs.ctx
-execute if score #move.vy bs.data matches ..-1 run scoreboard players operation #y bs.ctx >< #j bs.ctx
-execute if score #move.vz bs.data matches ..-1 run scoreboard players operation #z bs.ctx >< #k bs.ctx
-
-# compute near and far points for AABB collision
-scoreboard players operation #x bs.ctx > #y bs.ctx
-scoreboard players operation #x bs.ctx > #z bs.ctx
-scoreboard players operation #i bs.ctx < #j bs.ctx
-scoreboard players operation #i bs.ctx < #k bs.ctx
-
-# if min_x <= max_x, ray is intersecting with AABB, if max_x < 0, ray is intersecting AABB, but the whole AABB is behind
-execute if score #i bs.ctx matches 0.. \
- if score #x bs.ctx <= #i bs.ctx \
- if score #move.ctime bs.data > #x bs.ctx \
- run function bs.move:collision/collide
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/handle.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/handle.mcfunction
deleted file mode 100644
index 6e2381dffa..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/handle.mcfunction
+++ /dev/null
@@ -1,57 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# get starting position and velocity vector
-data modify storage bs:ctx _ set from entity @s Pos
-execute store result score #move.y bs.data run data get storage bs:ctx _[1] 10000
-execute store result storage bs:data move.x int -1 run data get storage bs:ctx _[0]
-execute store result storage bs:data move.y int -1 run data get storage bs:ctx _[1]
-execute store result storage bs:data move.z int -1 run data get storage bs:ctx _[2]
-execute summon minecraft:marker run function bs.move:collision/utils/get_relative_pos with storage bs:data move
-execute store result score #move.vx bs.data store result score #move.rx bs.data store result score #move.sx bs.data run data get storage bs:ctx _[0] -10000000
-execute store result score #move.vy bs.data store result score #move.ry bs.data store result score #move.sy bs.data run data get storage bs:ctx _[1] -10000000
-execute store result score #move.vz bs.data store result score #move.rz bs.data store result score #move.sz bs.data run data get storage bs:ctx _[2] -10000000
-execute in minecraft:overworld positioned as @s as B5-0-0-0-1 run function bs.move:collision/utils/get_relative_entity_pos with storage bs:data move
-execute store result score #move.nx bs.data run data get storage bs:ctx _[0] -10000000
-execute store result score #move.ny bs.data run data get storage bs:ctx _[1] -10000000
-execute store result score #move.nz bs.data run data get storage bs:ctx _[2] -10000000
-execute store result score #move.nx bs.data run scoreboard players operation #move.vx bs.data -= #move.nx bs.data
-execute store result score #move.ny bs.data run scoreboard players operation #move.vy bs.data -= #move.ny bs.data
-execute store result score #move.nz bs.data run scoreboard players operation #move.vz bs.data -= #move.nz bs.data
-scoreboard players operation #move.rx bs.data %= -10000000 bs.const
-scoreboard players operation #move.ry bs.data %= -10000000 bs.const
-scoreboard players operation #move.rz bs.data %= -10000000 bs.const
-scoreboard players operation #move.vx bs.data /= 10000 bs.const
-scoreboard players operation #move.vy bs.data /= 10000 bs.const
-scoreboard players operation #move.vz bs.data /= 10000 bs.const
-
-# compute a bounding box that encompasses all passengers
-tag @e[tag=bs.move.omit] remove bs.move.omit
-scoreboard players set #move.h bs.data 0
-scoreboard players set #move.w bs.data 0
-function bs.move:collision/utils/get_bounding_box
-
-# check for collisions and resolve them
-scoreboard players set #move.ctime bs.data 10000
-data modify storage bs:data move merge value {sx:"xp",sy:"yp",sz:"zp"}
-execute if score #move.vx bs.data matches ..-1 run data modify storage bs:data move.sx set value "xn"
-execute if score #move.vy bs.data matches ..-1 run data modify storage bs:data move.sy set value "yn"
-execute if score #move.vz bs.data matches ..-1 run data modify storage bs:data move.sz set value "zn"
-execute store result score #move.b bs.data unless data storage bs:data move{blocks:0b}
-execute store result score #move.e bs.data unless data storage bs:data move{entities:0b}
-execute if score #move.e bs.data matches 1 if data storage bs:data move{entities:1b} run data modify storage bs:data move.entities set value "!bs.move.omit"
-execute run function bs.move:collision/recurse/setup/init with storage bs:data move
-execute if score #move.ctime bs.data matches ..-1 run scoreboard players set #move.ctime bs.data 0
-$execute if score #move.ctime bs.data matches 0..9999 run function bs.move:collision/resolvers/any {resolver:$(resolver)}
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/init.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/init.mcfunction
deleted file mode 100644
index 1ad119a856..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/init.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$function bs.move:collision/recurse/setup/$(sx) with storage bs:data move
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/xn.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/xn.mcfunction
deleted file mode 100644
index cbc930aeac..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/xn.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation #move.nx bs.data -= #move.w bs.data
-scoreboard players remove #move.nx bs.data 10000000
-
-$function bs.move:collision/recurse/setup/$(sy) with storage bs:data move
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/xp.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/xp.mcfunction
deleted file mode 100644
index 7979e7229c..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/xp.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation #move.nx bs.data += #move.w bs.data
-
-$function bs.move:collision/recurse/setup/$(sy) with storage bs:data move
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/yn.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/yn.mcfunction
deleted file mode 100644
index 3cd37b89ea..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/yn.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players remove #move.ny bs.data 10000000
-
-$function bs.move:collision/recurse/setup/$(sz) with storage bs:data move
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/yp.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/yp.mcfunction
deleted file mode 100644
index b26d8fade2..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/yp.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation #move.ny bs.data += #move.h bs.data
-
-$function bs.move:collision/recurse/setup/$(sz) with storage bs:data move
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/zn.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/zn.mcfunction
deleted file mode 100644
index 9535eeecde..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/zn.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation #move.nz bs.data -= #move.w bs.data
-scoreboard players remove #move.nz bs.data 10000000
-
-scoreboard players operation #move.x bs.data = #move.rx bs.data
-$function bs.move:collision/recurse/$(sx) with storage bs:data move
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/zp.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/zp.mcfunction
deleted file mode 100644
index 9cccae45cd..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/setup/zp.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation #move.nz bs.data += #move.w bs.data
-
-scoreboard players operation #move.x bs.data = #move.rx bs.data
-$execute align xyz run function bs.move:collision/recurse/$(sx) with storage bs:data move
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/xn.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/recurse/xn.mcfunction
deleted file mode 100644
index aefd13ef62..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/xn.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation #move.y bs.data = #move.ry bs.data
-$function bs.move:collision/recurse/$(sy) with storage bs:data move
-
-scoreboard players remove #move.x bs.data 10000000
-execute if score #move.x bs.data >= #move.nx bs.data positioned ~-1 ~ ~ run function bs.move:collision/recurse/xn with storage bs:data move
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/xp.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/recurse/xp.mcfunction
deleted file mode 100644
index cdaafbbfce..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/xp.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation #move.y bs.data = #move.ry bs.data
-$function bs.move:collision/recurse/$(sy) with storage bs:data move
-
-scoreboard players add #move.x bs.data 10000000
-execute if score #move.x bs.data <= #move.nx bs.data positioned ~1 ~ ~ run function bs.move:collision/recurse/xp with storage bs:data move
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/yn.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/recurse/yn.mcfunction
deleted file mode 100644
index c5e4433d62..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/yn.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation #move.z bs.data = #move.rz bs.data
-$function bs.move:collision/recurse/$(sz) with storage bs:data move
-
-scoreboard players remove #move.y bs.data 10000000
-execute if score #move.y bs.data >= #move.ny bs.data positioned ~ ~-1 ~ run function bs.move:collision/recurse/yn with storage bs:data move
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/yp.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/recurse/yp.mcfunction
deleted file mode 100644
index a1c6970072..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/yp.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation #move.z bs.data = #move.rz bs.data
-$function bs.move:collision/recurse/$(sz) with storage bs:data move
-
-scoreboard players add #move.y bs.data 10000000
-execute if score #move.y bs.data <= #move.ny bs.data positioned ~ ~1 ~ run function bs.move:collision/recurse/yp with storage bs:data move
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/zn.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/recurse/zn.mcfunction
deleted file mode 100644
index 260a9587f3..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/zn.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute if score #move.b bs.data matches 1 unless block ~ ~ ~ $(ignored_blocks) run function bs.move:collision/check/block/any
-$execute if score #move.e bs.data matches 1 as @e[type=!$(ignored_entities),tag=$(entities),tag=!bs.move.omit,dx=0] run function bs.move:collision/check/entity/any
-
-scoreboard players remove #move.z bs.data 10000000
-execute if score #move.z bs.data >= #move.nz bs.data positioned ~ ~ ~-1 run function bs.move:collision/recurse/zn with storage bs:data move
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/zp.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/recurse/zp.mcfunction
deleted file mode 100644
index f8dcc81272..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/recurse/zp.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute if score #move.b bs.data matches 1 unless block ~ ~ ~ $(ignored_blocks) run function bs.move:collision/check/block/any
-$execute if score #move.e bs.data matches 1 as @e[type=!$(ignored_entities),tag=$(entities),tag=!bs.move.omit,dx=0] run function bs.move:collision/check/entity/any
-
-scoreboard players add #move.z bs.data 10000000
-execute if score #move.z bs.data <= #move.nz bs.data positioned ~ ~ ~1 run function bs.move:collision/recurse/zp with storage bs:data move
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/any.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/any.mcfunction
deleted file mode 100644
index 152668a369..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/any.mcfunction
+++ /dev/null
@@ -1,28 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players remove #move.ctime bs.data 10000
-scoreboard players operation #move.ctime bs.data *= -1 bs.const
-execute store result score $move.vel_remaining.x bs.data run scoreboard players operation #move.vx bs.data *= #move.ctime bs.data
-execute store result score $move.vel_remaining.y bs.data run scoreboard players operation #move.vy bs.data *= #move.ctime bs.data
-execute store result score $move.vel_remaining.z bs.data run scoreboard players operation #move.vz bs.data *= #move.ctime bs.data
-execute if score #move.vx bs.data matches 0.. store result storage bs:ctx x double -.0000001 run scoreboard players add #move.vx bs.data 1
-execute if score #move.vy bs.data matches 0.. store result storage bs:ctx y double -.0000001 run scoreboard players add #move.vy bs.data 1
-execute if score #move.vz bs.data matches 0.. store result storage bs:ctx z double -.0000001 run scoreboard players add #move.vz bs.data 1
-execute if score #move.vx bs.data matches ..-1 store result storage bs:ctx x double -.0000001 run scoreboard players remove #move.vx bs.data 1
-execute if score #move.vy bs.data matches ..-1 store result storage bs:ctx y double -.0000001 run scoreboard players remove #move.vy bs.data 1
-execute if score #move.vz bs.data matches ..-1 store result storage bs:ctx z double -.0000001 run scoreboard players remove #move.vz bs.data 1
-execute at @s run function bs.move:collision/utils/tp_relative with storage bs:ctx
-$function bs.move:collision/resolvers/$(resolver) with storage bs:data move
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/canonical.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/canonical.mcfunction
deleted file mode 100644
index ed417c7292..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/canonical.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# resolve collision using the on_collision callback
-$function $(on_collision)
-execute store result storage bs:ctx x double .0000001 run scoreboard players get $move.vel_remaining.x bs.data
-execute store result storage bs:ctx y double .0000001 run scoreboard players get $move.vel_remaining.y bs.data
-execute store result storage bs:ctx z double .0000001 run scoreboard players get $move.vel_remaining.z bs.data
-execute unless data storage bs:ctx {x:0d,y:0d,z:0d} at @s run function bs.move:teleport/canonical/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/local.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/local.mcfunction
deleted file mode 100644
index 1e88a7ed0d..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/local.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# resolve collision using the on_collision callback (ensure the velocity vector is in canonical space for simpler transformation)
-execute rotated as @s run function #bs.move:local_to_canonical
-$function $(on_collision)
-execute store result storage bs:ctx x double .0000001 run scoreboard players get $move.vel_remaining.x bs.data
-execute store result storage bs:ctx y double .0000001 run scoreboard players get $move.vel_remaining.y bs.data
-execute store result storage bs:ctx z double .0000001 run scoreboard players get $move.vel_remaining.z bs.data
-execute unless data storage bs:ctx {x:0d,y:0d,z:0d} at @s run function bs.move:teleport/canonical/run with storage bs:ctx
-execute rotated as @s run function #bs.move:canonical_to_local
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/run.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/run.mcfunction
deleted file mode 100644
index 7b932023e6..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$function $(on_collision)
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/utils/get_relative_pos.mcfunction b/datapacks/Bookshelf/data/bs.move/function/collision/utils/get_relative_pos.mcfunction
deleted file mode 100644
index 31c69f4de8..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/collision/utils/get_relative_pos.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$tp @s ~$(x) ~$(y) ~$(z)
-data modify storage bs:ctx _ set from entity @s Pos
-kill @s
diff --git a/datapacks/Bookshelf/data/bs.move/function/convert/canonical_to_local/canonical_to_local.mcfunction b/datapacks/Bookshelf/data/bs.move/function/convert/canonical_to_local/canonical_to_local.mcfunction
deleted file mode 100644
index ab97053f1a..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/convert/canonical_to_local/canonical_to_local.mcfunction
+++ /dev/null
@@ -1,51 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#canonical-to-local
-# ------------------------------------------------------------------------------------------------------------
-
-# sincos(h: Phi) & sincos(v: Theta)
-execute in minecraft:overworld as B5-0-0-0-1 run function bs.move:convert/canonical_to_local/sincos
-
-# X' = Z * sin(h) + X * cos(h)
-scoreboard players operation #x bs.ctx = @s bs.vel.z
-scoreboard players operation #x bs.ctx *= #j bs.ctx
-scoreboard players operation #t bs.ctx = @s bs.vel.x
-scoreboard players operation #t bs.ctx *= #i bs.ctx
-scoreboard players operation #x bs.ctx += #t bs.ctx
-scoreboard players operation #x bs.ctx /= 1000 bs.const
-
-# Y' = (z * cos(h) - x * sin(h)) * sin(v) + y * cos(v)
-scoreboard players operation #y bs.ctx = @s bs.vel.z
-scoreboard players operation #y bs.ctx *= #i bs.ctx
-scoreboard players operation #t bs.ctx = @s bs.vel.x
-scoreboard players operation #t bs.ctx *= #j bs.ctx
-scoreboard players operation #y bs.ctx -= #t bs.ctx
-execute store result score #z bs.ctx run scoreboard players operation #y bs.ctx /= 1000 bs.const
-scoreboard players operation #y bs.ctx *= #l bs.ctx
-scoreboard players operation #t bs.ctx = @s bs.vel.y
-scoreboard players operation #t bs.ctx *= #k bs.ctx
-scoreboard players operation #y bs.ctx += #t bs.ctx
-scoreboard players operation #y bs.ctx /= 1000 bs.const
-
-# Z' = (z * cos(h) - x * sin(h)) * cos(v) - y * sin(v)
-scoreboard players operation #z bs.ctx *= #k bs.ctx
-scoreboard players operation #t bs.ctx = @s bs.vel.y
-scoreboard players operation #t bs.ctx *= #l bs.ctx
-scoreboard players operation #z bs.ctx -= #t bs.ctx
-scoreboard players operation #z bs.ctx /= 1000 bs.const
-
-scoreboard players operation @s bs.vel.x = #x bs.ctx
-scoreboard players operation @s bs.vel.y = #y bs.ctx
-scoreboard players operation @s bs.vel.z = #z bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.move/function/convert/canonical_to_local/sincos.mcfunction b/datapacks/Bookshelf/data/bs.move/function/convert/canonical_to_local/sincos.mcfunction
deleted file mode 100644
index fa0884fd9b..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/convert/canonical_to_local/sincos.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute positioned 0.0 0.0 0.0 rotated ~ 0.0 run tp @s ^ ^ ^10.0
-execute store result score #i bs.ctx run data get entity @s Pos[2] 100
-execute store result score #j bs.ctx run data get entity @s Pos[0] -100
-execute positioned 0.0 0.0 0.0 rotated 0.0 ~ run tp @s ^ ^ ^10.0
-execute store result score #k bs.ctx run data get entity @s Pos[2] 100
-execute store result score #l bs.ctx run data get entity @s Pos[1] -100
-tp @s -30000000 0 1600
diff --git a/datapacks/Bookshelf/data/bs.move/function/convert/local_to_canonical/compute.mcfunction b/datapacks/Bookshelf/data/bs.move/function/convert/local_to_canonical/compute.mcfunction
deleted file mode 100644
index 6b154fb801..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/convert/local_to_canonical/compute.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute positioned 0.0 0.0 0.0 run tp @s ^$(x) ^$(y) ^$(z)
-data modify storage bs:ctx _ set from entity @s Pos
-tp @s -30000000 0 1600
diff --git a/datapacks/Bookshelf/data/bs.move/function/convert/local_to_canonical/local_to_canonical.mcfunction b/datapacks/Bookshelf/data/bs.move/function/convert/local_to_canonical/local_to_canonical.mcfunction
deleted file mode 100644
index 956c803559..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/convert/local_to_canonical/local_to_canonical.mcfunction
+++ /dev/null
@@ -1,26 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#local-to-canonical
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result storage bs:ctx x int 1 run scoreboard players get @s bs.vel.x
-execute store result storage bs:ctx y int 1 run scoreboard players get @s bs.vel.y
-execute store result storage bs:ctx z int 1 run scoreboard players get @s bs.vel.z
-
-execute in minecraft:overworld as B5-0-0-0-1 run function bs.move:convert/local_to_canonical/compute with storage bs:ctx
-
-execute store result score @s bs.vel.x run data get storage bs:ctx _[0]
-execute store result score @s bs.vel.y run data get storage bs:ctx _[1]
-execute store result score @s bs.vel.z run data get storage bs:ctx _[2]
diff --git a/datapacks/Bookshelf/data/bs.move/function/set_motion.mcfunction b/datapacks/Bookshelf/data/bs.move/function/set_motion.mcfunction
deleted file mode 100644
index 76df64ddf4..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/set_motion.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result entity @s Motion[0] double $(scale) run scoreboard players get @s bs.vel.x
-$execute store result entity @s Motion[1] double $(scale) run scoreboard players get @s bs.vel.y
-$execute store result entity @s Motion[2] double $(scale) run scoreboard players get @s bs.vel.z
diff --git a/datapacks/Bookshelf/data/bs.move/function/teleport/canonical/run.mcfunction b/datapacks/Bookshelf/data/bs.move/function/teleport/canonical/run.mcfunction
deleted file mode 100644
index bb28b8fe99..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/teleport/canonical/run.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$tp @s ~$(x) ~$(y) ~$(z)
-
-execute unless data storage bs:data move{blocks:0b,entities:0b} run function bs.move:collision/handle {resolver:"canonical"}
diff --git a/datapacks/Bookshelf/data/bs.move/function/teleport/local/run.mcfunction b/datapacks/Bookshelf/data/bs.move/function/teleport/local/run.mcfunction
deleted file mode 100644
index 2d955016ff..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/teleport/local/run.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$tp @s ^$(x) ^$(y) ^$(z)
-
-execute unless data storage bs:data move{blocks:0b,entities:0b} run function bs.move:collision/handle {resolver:"local"}
diff --git a/datapacks/Bookshelf/data/bs.move/function/teleport/with.mcfunction b/datapacks/Bookshelf/data/bs.move/function/teleport/with.mcfunction
deleted file mode 100644
index 1c643b8cd4..0000000000
--- a/datapacks/Bookshelf/data/bs.move/function/teleport/with.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data move set value { \
- blocks: true, \
- entities: false, \
- on_collision: "#bs.move:on_collision/bounce", \
- ignored_blocks: "#bs.hitbox:intangible", \
- ignored_entities: "#bs.hitbox:intangible", \
-}
-$data modify storage bs:data move merge value $(with)
diff --git a/datapacks/Bookshelf/data/bs.move/tags/function/canonical_to_local.json b/datapacks/Bookshelf/data/bs.move/tags/function/canonical_to_local.json
deleted file mode 100644
index dc6e0e9c9a..0000000000
--- a/datapacks/Bookshelf/data/bs.move/tags/function/canonical_to_local.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#canonical-to-local",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/12/25",
- "minecraft_version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.move:convert/canonical_to_local/canonical_to_local"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.move/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.move/tags/function/exclusive_load.json
deleted file mode 100644
index afe7a018cb..0000000000
--- a/datapacks/Bookshelf/data/bs.move/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.move:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.move/tags/function/help.json b/datapacks/Bookshelf/data/bs.move/tags/function/help.json
deleted file mode 100644
index a53e576d7e..0000000000
--- a/datapacks/Bookshelf/data/bs.move/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.move:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.move/tags/function/load.json b/datapacks/Bookshelf/data/bs.move/tags/function/load.json
deleted file mode 100644
index 534792c6ba..0000000000
--- a/datapacks/Bookshelf/data/bs.move/tags/function/load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#bs.hitbox:load",
- "bs.move:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.move/tags/function/local_to_canonical.json b/datapacks/Bookshelf/data/bs.move/tags/function/local_to_canonical.json
deleted file mode 100644
index 097be0c3e0..0000000000
--- a/datapacks/Bookshelf/data/bs.move/tags/function/local_to_canonical.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#local-to-canonical",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/12/25",
- "minecraft_version": "1.20.4"
- },
- "updated": {
- "date": "2024/04/19",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.move:convert/local_to_canonical/local_to_canonical"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.move/tags/function/on_collision/bounce.json b/datapacks/Bookshelf/data/bs.move/tags/function/on_collision/bounce.json
deleted file mode 100644
index 573295dc3f..0000000000
--- a/datapacks/Bookshelf/data/bs.move/tags/function/on_collision/bounce.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.move:collision/resolvers/behaviors/bounce"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.move/tags/function/on_collision/damped_bounce.json b/datapacks/Bookshelf/data/bs.move/tags/function/on_collision/damped_bounce.json
deleted file mode 100644
index 2615a0ad22..0000000000
--- a/datapacks/Bookshelf/data/bs.move/tags/function/on_collision/damped_bounce.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.move:collision/resolvers/behaviors/damped_bounce"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.move/tags/function/on_collision/slide.json b/datapacks/Bookshelf/data/bs.move/tags/function/on_collision/slide.json
deleted file mode 100644
index 9e56772917..0000000000
--- a/datapacks/Bookshelf/data/bs.move/tags/function/on_collision/slide.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.move:collision/resolvers/behaviors/slide"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.move/tags/function/on_collision/stick.json b/datapacks/Bookshelf/data/bs.move/tags/function/on_collision/stick.json
deleted file mode 100644
index a2ab4c007e..0000000000
--- a/datapacks/Bookshelf/data/bs.move/tags/function/on_collision/stick.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.move:collision/resolvers/behaviors/stick"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.move/tags/function/unload.json b/datapacks/Bookshelf/data/bs.move/tags/function/unload.json
deleted file mode 100644
index 1873bb2de2..0000000000
--- a/datapacks/Bookshelf/data/bs.move/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.move:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.move/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.move/test/__boot__.mcfunction
deleted file mode 100644
index 09e6bba1b6..0000000000
--- a/datapacks/Bookshelf/data/bs.move/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.move
-# @beforebatch function #bs.move:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.move/test/collision/with_block.mcfunction b/datapacks/Bookshelf/data/bs.move/test/collision/with_block.mcfunction
deleted file mode 100644
index d9bb8a838b..0000000000
--- a/datapacks/Bookshelf/data/bs.move/test/collision/with_block.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# Collision with a block is resolved as expected
-# @batch bs.move
-# @dummy
-
-fill -1 -1 -1 1 1 1 air
-setblock 0 0 0 minecraft:bookshelf
-tp @s -.5 0.0 1.5 0.0 0.0
-
-scoreboard players set @s bs.vel.x 1000
-scoreboard players set @s bs.vel.y 0
-scoreboard players set @s bs.vel.z -1000
-
-function #bs.move:apply_vel {scale:0.001,with:{blocks:true,entities:false,on_collision:"#bs.move:on_collision/stick"}}
-
-execute store result score #packtest.x bs.data run data get entity @s Pos[0] 1000
-execute store result score #packtest.z bs.data run data get entity @s Pos[2] 1000
-
-dummy @s leave
-
-assert score #packtest.x bs.data matches -301..-299
-assert score #packtest.z bs.data matches 1299..1301
diff --git a/datapacks/Bookshelf/data/bs.move/test/collision/with_entity.mcfunction b/datapacks/Bookshelf/data/bs.move/test/collision/with_entity.mcfunction
deleted file mode 100644
index fed84fcb99..0000000000
--- a/datapacks/Bookshelf/data/bs.move/test/collision/with_entity.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# Collision with an entity is resolved as expected
-# @batch bs.move
-# @dummy
-
-summon minecraft:armor_stand .5 0 .5 {Tags:["bs.packtest"]}
-tp @s -.5 0.0 1.5 0.0 0.0
-
-scoreboard players set @s bs.vel.x 1000
-scoreboard players set @s bs.vel.y 0
-scoreboard players set @s bs.vel.z -1000
-
-function #bs.move:apply_vel {scale:0.001,with:{blocks:false,entities:true,on_collision:"#bs.move:on_collision/stick"}}
-
-execute store result score #packtest.x bs.data run data get entity @s Pos[0] 1000
-execute store result score #packtest.z bs.data run data get entity @s Pos[2] 1000
-
-dummy @s leave
-kill @e[type=minecraft:armor_stand,tag=bs.packtest]
-
-assert score #packtest.x bs.data matches -51..-49
-assert score #packtest.z bs.data matches 1049..1051
diff --git a/datapacks/Bookshelf/data/bs.move/test/convert/canonical_to_local.mcfunction b/datapacks/Bookshelf/data/bs.move/test/convert/canonical_to_local.mcfunction
deleted file mode 100644
index b48b9a7e4c..0000000000
--- a/datapacks/Bookshelf/data/bs.move/test/convert/canonical_to_local.mcfunction
+++ /dev/null
@@ -1,13 +0,0 @@
-# Convert canonical to local coordinates
-# @batch bs.move
-# @dummy
-
-scoreboard players set @s bs.vel.x 577
-scoreboard players set @s bs.vel.y 577
-scoreboard players set @s bs.vel.z 577
-
-execute rotated -45 -35.265 run function #bs.move:canonical_to_local
-
-assert score @s bs.vel.x matches -1..1
-assert score @s bs.vel.y matches -1..1
-assert score @s bs.vel.z matches 999..1001
diff --git a/datapacks/Bookshelf/data/bs.move/test/convert/local_to_canonical.mcfunction b/datapacks/Bookshelf/data/bs.move/test/convert/local_to_canonical.mcfunction
deleted file mode 100644
index cd4791edb7..0000000000
--- a/datapacks/Bookshelf/data/bs.move/test/convert/local_to_canonical.mcfunction
+++ /dev/null
@@ -1,13 +0,0 @@
-# Convert canonical to local coordinates
-# @batch bs.move
-# @dummy
-
-scoreboard players set @s bs.vel.x 0
-scoreboard players set @s bs.vel.y 0
-scoreboard players set @s bs.vel.z 1000
-
-execute rotated -45 -35.265 run function #bs.move:local_to_canonical
-
-assert score @s bs.vel.x matches 576..578
-assert score @s bs.vel.y matches 576..578
-assert score @s bs.vel.z matches 576..578
diff --git a/datapacks/Bookshelf/data/bs.move/test/set_motion.mcfunction b/datapacks/Bookshelf/data/bs.move/test/set_motion.mcfunction
deleted file mode 100644
index f9598d2ef4..0000000000
--- a/datapacks/Bookshelf/data/bs.move/test/set_motion.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Set motion using NBTs
-# @batch bs.move
-
-summon minecraft:pig ~ ~ ~ {Tags:["bs.packtest"]}
-scoreboard players set @e[type=minecraft:pig,tag=bs.packtest] bs.vel.x 250
-scoreboard players set @e[type=minecraft:pig,tag=bs.packtest] bs.vel.y 50
-scoreboard players set @e[type=minecraft:pig,tag=bs.packtest] bs.vel.z 0
-execute as @e[type=minecraft:pig,tag=bs.packtest] run function #bs.move:set_motion {scale:0.001}
-assert data entity @n[type=minecraft:pig,tag=bs.packtest] {Motion:[0.25d,0.05d,0.0d]}
diff --git a/datapacks/Bookshelf/data/bs.move/test/teleport/canonical.mcfunction b/datapacks/Bookshelf/data/bs.move/test/teleport/canonical.mcfunction
deleted file mode 100644
index a1aebb6833..0000000000
--- a/datapacks/Bookshelf/data/bs.move/test/teleport/canonical.mcfunction
+++ /dev/null
@@ -1,31 +0,0 @@
-# Teleport an entity by canonical velocity
-# @batch bs.move
-# @dummy
-
-tp @s 0.0 0.0 0.0 0.0 0.0
-
-execute store result score #packtest.x_min bs.data store result score #packtest.x_max bs.data store result score @s bs.vel.x run random value -1000..1000
-execute store result score #packtest.y_min bs.data store result score #packtest.y_max bs.data store result score @s bs.vel.y run random value -1000..1000
-execute store result score #packtest.z_min bs.data store result score #packtest.z_max bs.data store result score @s bs.vel.z run random value -1000..1000
-
-function #bs.move:apply_vel {scale:0.001,with:{blocks:0b,entities:0b}}
-
-execute store result score #packtest.x bs.data run data get entity @s Pos[0] 1000
-execute store result score #packtest.y bs.data run data get entity @s Pos[1] 1000
-execute store result score #packtest.z bs.data run data get entity @s Pos[2] 1000
-
-dummy @s leave
-
-scoreboard players remove #packtest.x_min bs.data 2
-scoreboard players remove #packtest.y_min bs.data 2
-scoreboard players remove #packtest.z_min bs.data 2
-scoreboard players add #packtest.x_max bs.data 2
-scoreboard players add #packtest.y_max bs.data 2
-scoreboard players add #packtest.z_max bs.data 2
-
-assert score #packtest.x_min bs.data < #packtest.x bs.data
-assert score #packtest.y_min bs.data < #packtest.y bs.data
-assert score #packtest.z_min bs.data < #packtest.z bs.data
-assert score #packtest.x_max bs.data > #packtest.x bs.data
-assert score #packtest.y_max bs.data > #packtest.y bs.data
-assert score #packtest.z_max bs.data > #packtest.z bs.data
diff --git a/datapacks/Bookshelf/data/bs.move/test/teleport/local.mcfunction b/datapacks/Bookshelf/data/bs.move/test/teleport/local.mcfunction
deleted file mode 100644
index 1d23a7da68..0000000000
--- a/datapacks/Bookshelf/data/bs.move/test/teleport/local.mcfunction
+++ /dev/null
@@ -1,31 +0,0 @@
-# Teleport an entity by local velocity
-# @batch bs.move
-# @dummy
-
-tp @s 0.0 0.0 0.0 90.0 0.0
-
-execute store result score #packtest.x_min bs.data store result score #packtest.x_max bs.data store result score @s bs.vel.x run random value -1000..1000
-execute store result score #packtest.y_min bs.data store result score #packtest.y_max bs.data store result score @s bs.vel.y run random value -1000..1000
-execute store result score #packtest.z_min bs.data store result score #packtest.z_max bs.data store result score @s bs.vel.z run random value -1000..1000
-
-function #bs.move:apply_local_vel {scale:0.001,with:{blocks:0b,entities:0b}}
-
-execute store result score #packtest.x bs.data run data get entity @s Pos[2] 1000
-execute store result score #packtest.y bs.data run data get entity @s Pos[1] 1000
-execute store result score #packtest.z bs.data run data get entity @s Pos[0] -1000
-
-dummy @s leave
-
-scoreboard players remove #packtest.x_min bs.data 2
-scoreboard players remove #packtest.y_min bs.data 2
-scoreboard players remove #packtest.z_min bs.data 2
-scoreboard players add #packtest.x_max bs.data 2
-scoreboard players add #packtest.y_max bs.data 2
-scoreboard players add #packtest.z_max bs.data 2
-
-assert score #packtest.x_min bs.data < #packtest.x bs.data
-assert score #packtest.y_min bs.data < #packtest.y bs.data
-assert score #packtest.z_min bs.data < #packtest.z bs.data
-assert score #packtest.x_max bs.data > #packtest.x bs.data
-assert score #packtest.y_max bs.data > #packtest.y bs.data
-assert score #packtest.z_max bs.data > #packtest.z bs.data
diff --git a/datapacks/Bookshelf/data/bs.position/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.position/.metadata/generated/features.json
deleted file mode 100644
index a96c95039c..0000000000
--- a/datapacks/Bookshelf/data/bs.position/.metadata/generated/features.json
+++ /dev/null
@@ -1,488 +0,0 @@
-[
- {
- "name": "add_pos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "add_pos_and_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "add_pos_x",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "add_pos_y",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "add_pos_z",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "add_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "add_rot_h",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "add_rot_v",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "canonical_to_local",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#canonical-to-local",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/20",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_distance_ata",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-distance",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "contributors": [
- "Triton365"
- ],
- "created": {
- "date": "2019/07/14",
- "version": "1.14.3"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_distance_squared_ata",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-distance",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2019/07/14",
- "version": "1.14.3"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_pos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_pos_and_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/09/09",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_pos_x",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_pos_y",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_pos_z",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_relative_ata",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-relative",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2019/07/14",
- "version": "1.14.3"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_relative_from_dir",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-relative",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/20",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-rotation",
- "authors": [
- "Aksiome",
- "Leirof",
- "theogiraudet"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_rot_h",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-rotation",
- "authors": [
- "Aksiome",
- "Leirof",
- "theogiraudet"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_rot_v",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-rotation",
- "authors": [
- "Aksiome",
- "Leirof",
- "theogiraudet"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "local_to_canonical",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#local-to-canonical",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/12/25",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/04/12",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_pos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#set-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_pos_and_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/09/09",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_pos_x",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#set-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_pos_y",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#set-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_pos_z",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#set-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#set-rotation",
- "authors": [
- "Aksiome",
- "Leirof",
- "theogiraudet"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_rot_h",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#set-rotation",
- "authors": [
- "Aksiome",
- "Leirof",
- "theogiraudet"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_rot_v",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#set-rotation",
- "authors": [
- "Aksiome",
- "Leirof",
- "theogiraudet"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.position/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.position/.metadata/generated/module.json
deleted file mode 100644
index 85f653114e..0000000000
--- a/datapacks/Bookshelf/data/bs.position/.metadata/generated/module.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "name": "bs.position",
- "display_name": "Position",
- "description": "Manage entity positions and rotations using scores.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html",
- "authors": [
- "Aksiome",
- "Leirof",
- "theogiraudet"
- ],
- "contributors": [
- "Triton365"
- ],
- "features": [
- "bs.position:add_pos",
- "bs.position:add_pos_and_rot",
- "bs.position:add_pos_x",
- "bs.position:add_pos_y",
- "bs.position:add_pos_z",
- "bs.position:add_rot",
- "bs.position:add_rot_h",
- "bs.position:add_rot_v",
- "bs.position:canonical_to_local",
- "bs.position:get_distance_ata",
- "bs.position:get_distance_squared_ata",
- "bs.position:get_pos",
- "bs.position:get_pos_and_rot",
- "bs.position:get_pos_x",
- "bs.position:get_pos_y",
- "bs.position:get_pos_z",
- "bs.position:get_relative_ata",
- "bs.position:get_relative_from_dir",
- "bs.position:get_rot",
- "bs.position:get_rot_h",
- "bs.position:get_rot_v",
- "bs.position:local_to_canonical",
- "bs.position:set_pos",
- "bs.position:set_pos_and_rot",
- "bs.position:set_pos_x",
- "bs.position:set_pos_y",
- "bs.position:set_pos_z",
- "bs.position:set_rot",
- "bs.position:set_rot_h",
- "bs.position:set_rot_v"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/.metadata/module.json b/datapacks/Bookshelf/data/bs.position/.metadata/module.json
deleted file mode 100644
index 410349fd0c..0000000000
--- a/datapacks/Bookshelf/data/bs.position/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.position",
- "display_name": "Position",
- "description": "Manage entity positions and rotations using scores.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html"
-}
diff --git a/datapacks/Bookshelf/data/bs.position/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.position/function/__help__.mcfunction
deleted file mode 100644
index a982ce5969..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.position documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.position/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.position/function/__load__.mcfunction
deleted file mode 100644
index 914c37cb79..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/__load__.mcfunction
+++ /dev/null
@@ -1,34 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html
-# ------------------------------------------------------------------------------------------------------------
-
-forceload add -30000000 1600
-execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
-execute unless entity B5-0-0-0-2 run summon minecraft:text_display -30000000 0 1600 {UUID:[I;181,0,0,2],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],view_range:0f}
-
-scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
-
-scoreboard objectives add bs.pos.x dummy [{"text":"BS ","color":"dark_gray"},{"text":"Position X","color":"aqua"}]
-scoreboard objectives add bs.pos.y dummy [{"text":"BS ","color":"dark_gray"},{"text":"Position Y","color":"aqua"}]
-scoreboard objectives add bs.pos.z dummy [{"text":"BS ","color":"dark_gray"},{"text":"Position Z","color":"aqua"}]
-scoreboard objectives add bs.rot.h dummy [{"text":"BS ","color":"dark_gray"},{"text":"Rotation H","color":"aqua"}]
-scoreboard objectives add bs.rot.v dummy [{"text":"BS ","color":"dark_gray"},{"text":"Rotation V","color":"aqua"}]
-
-scoreboard players set 180 bs.const 180
-scoreboard players set 360 bs.const 360
-scoreboard players set 1000 bs.const 1000
diff --git a/datapacks/Bookshelf/data/bs.position/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.position/function/__unload__.mcfunction
deleted file mode 100644
index 187bba8814..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/__unload__.mcfunction
+++ /dev/null
@@ -1,30 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html
-# ------------------------------------------------------------------------------------------------------------
-
-kill B5-0-0-0-1
-kill B5-0-0-0-2
-forceload remove -30000000 1600
-
-scoreboard objectives remove bs.const
-scoreboard objectives remove bs.ctx
-scoreboard objectives remove bs.out
-
-scoreboard objectives remove bs.pos.x
-scoreboard objectives remove bs.pos.y
-scoreboard objectives remove bs.pos.z
-scoreboard objectives remove bs.rot.h
-scoreboard objectives remove bs.rot.v
diff --git a/datapacks/Bookshelf/data/bs.position/function/add/position/all/all.mcfunction b/datapacks/Bookshelf/data/bs.position/function/add/position/all/all.mcfunction
deleted file mode 100644
index b0b61090a8..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/add/position/all/all.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:ctx x double $(scale) run scoreboard players get @s bs.pos.x
-$execute store result storage bs:ctx y double $(scale) run scoreboard players get @s bs.pos.y
-$execute store result storage bs:ctx z double $(scale) run scoreboard players get @s bs.pos.z
-execute at @s run function bs.position:add/position/all/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.position/function/add/position/all/run.mcfunction b/datapacks/Bookshelf/data/bs.position/function/add/position/all/run.mcfunction
deleted file mode 100644
index 6409a1e85e..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/add/position/all/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$tp @s ~$(x) ~$(y) ~$(z)
diff --git a/datapacks/Bookshelf/data/bs.position/function/add/position/x/run.mcfunction b/datapacks/Bookshelf/data/bs.position/function/add/position/x/run.mcfunction
deleted file mode 100644
index 4802984db5..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/add/position/x/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$tp @s ~$(x) ~ ~
diff --git a/datapacks/Bookshelf/data/bs.position/function/add/position/x/x.mcfunction b/datapacks/Bookshelf/data/bs.position/function/add/position/x/x.mcfunction
deleted file mode 100644
index ea687f97be..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/add/position/x/x.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:ctx x double $(scale) run scoreboard players get @s bs.pos.x
-execute at @s run function bs.position:add/position/x/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.position/function/add/position/y/run.mcfunction b/datapacks/Bookshelf/data/bs.position/function/add/position/y/run.mcfunction
deleted file mode 100644
index 91135edc49..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/add/position/y/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$tp @s ~ ~$(y) ~
diff --git a/datapacks/Bookshelf/data/bs.position/function/add/position/y/y.mcfunction b/datapacks/Bookshelf/data/bs.position/function/add/position/y/y.mcfunction
deleted file mode 100644
index 183aff060e..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/add/position/y/y.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:ctx y double $(scale) run scoreboard players get @s bs.pos.y
-execute at @s run function bs.position:add/position/y/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.position/function/add/position/z/run.mcfunction b/datapacks/Bookshelf/data/bs.position/function/add/position/z/run.mcfunction
deleted file mode 100644
index 7cbf1abfaf..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/add/position/z/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$tp @s ~ ~ ~$(z)
diff --git a/datapacks/Bookshelf/data/bs.position/function/add/position/z/z.mcfunction b/datapacks/Bookshelf/data/bs.position/function/add/position/z/z.mcfunction
deleted file mode 100644
index aa16b7a2c6..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/add/position/z/z.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:ctx z double $(scale) run scoreboard players get @s bs.pos.z
-execute at @s run function bs.position:add/position/z/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.position/function/add/rotation/all/all.mcfunction b/datapacks/Bookshelf/data/bs.position/function/add/rotation/all/all.mcfunction
deleted file mode 100644
index 796cb0ed7e..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/add/rotation/all/all.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#add-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:ctx x double $(scale) run scoreboard players get @s bs.rot.h
-$execute store result storage bs:ctx y double $(scale) run scoreboard players get @s bs.rot.v
-execute at @s run function bs.position:add/rotation/all/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.position/function/add/rotation/all/run.mcfunction b/datapacks/Bookshelf/data/bs.position/function/add/rotation/all/run.mcfunction
deleted file mode 100644
index 16e2ffd668..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/add/rotation/all/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$rotate @s ~$(x) ~$(y)
diff --git a/datapacks/Bookshelf/data/bs.position/function/add/rotation/h/h.mcfunction b/datapacks/Bookshelf/data/bs.position/function/add/rotation/h/h.mcfunction
deleted file mode 100644
index b4d06f9598..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/add/rotation/h/h.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#add-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:ctx x double $(scale) run scoreboard players get @s bs.rot.h
-execute at @s run function bs.position:add/rotation/h/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.position/function/add/rotation/h/run.mcfunction b/datapacks/Bookshelf/data/bs.position/function/add/rotation/h/run.mcfunction
deleted file mode 100644
index f18e8e51ce..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/add/rotation/h/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$rotate @s ~$(x) ~
diff --git a/datapacks/Bookshelf/data/bs.position/function/add/rotation/v/run.mcfunction b/datapacks/Bookshelf/data/bs.position/function/add/rotation/v/run.mcfunction
deleted file mode 100644
index d41495a19e..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/add/rotation/v/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$rotate @s ~ ~$(y)
diff --git a/datapacks/Bookshelf/data/bs.position/function/add/rotation/v/v.mcfunction b/datapacks/Bookshelf/data/bs.position/function/add/rotation/v/v.mcfunction
deleted file mode 100644
index 71c8cdbbc6..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/add/rotation/v/v.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#add-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:ctx y double $(scale) run scoreboard players get @s bs.rot.v
-execute at @s run function bs.position:add/rotation/v/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.position/function/convert/canonical_to_local/canonical_to_local.mcfunction b/datapacks/Bookshelf/data/bs.position/function/convert/canonical_to_local/canonical_to_local.mcfunction
deleted file mode 100644
index 4a3c32c416..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/convert/canonical_to_local/canonical_to_local.mcfunction
+++ /dev/null
@@ -1,51 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#canonical-to-local
-# ------------------------------------------------------------------------------------------------------------
-
-# sincos(h: Phi) & sincos(v: Theta)
-execute in minecraft:overworld as B5-0-0-0-1 run function bs.position:convert/canonical_to_local/sincos
-
-# X' = Z * sin(h) + X * cos(h)
-scoreboard players operation #x bs.ctx = @s bs.pos.z
-scoreboard players operation #x bs.ctx *= #j bs.ctx
-scoreboard players operation #t bs.ctx = @s bs.pos.x
-scoreboard players operation #t bs.ctx *= #i bs.ctx
-scoreboard players operation #x bs.ctx += #t bs.ctx
-scoreboard players operation #x bs.ctx /= 1000 bs.const
-
-# Y' = (z * cos(h) - x * sin(h)) * sin(v) + y * cos(v)
-scoreboard players operation #y bs.ctx = @s bs.pos.z
-scoreboard players operation #y bs.ctx *= #i bs.ctx
-scoreboard players operation #t bs.ctx = @s bs.pos.x
-scoreboard players operation #t bs.ctx *= #j bs.ctx
-scoreboard players operation #y bs.ctx -= #t bs.ctx
-execute store result score #z bs.ctx run scoreboard players operation #y bs.ctx /= 1000 bs.const
-scoreboard players operation #y bs.ctx *= #l bs.ctx
-scoreboard players operation #t bs.ctx = @s bs.pos.y
-scoreboard players operation #t bs.ctx *= #k bs.ctx
-scoreboard players operation #y bs.ctx += #t bs.ctx
-scoreboard players operation #y bs.ctx /= 1000 bs.const
-
-# Z' = (z * cos(h) - x * sin(h)) * cos(v) - y * sin(v)
-scoreboard players operation #z bs.ctx *= #k bs.ctx
-scoreboard players operation #t bs.ctx = @s bs.pos.y
-scoreboard players operation #t bs.ctx *= #l bs.ctx
-scoreboard players operation #z bs.ctx -= #t bs.ctx
-scoreboard players operation #z bs.ctx /= 1000 bs.const
-
-scoreboard players operation @s bs.pos.x = #x bs.ctx
-scoreboard players operation @s bs.pos.y = #y bs.ctx
-scoreboard players operation @s bs.pos.z = #z bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.position/function/convert/canonical_to_local/sincos.mcfunction b/datapacks/Bookshelf/data/bs.position/function/convert/canonical_to_local/sincos.mcfunction
deleted file mode 100644
index fa0884fd9b..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/convert/canonical_to_local/sincos.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute positioned 0.0 0.0 0.0 rotated ~ 0.0 run tp @s ^ ^ ^10.0
-execute store result score #i bs.ctx run data get entity @s Pos[2] 100
-execute store result score #j bs.ctx run data get entity @s Pos[0] -100
-execute positioned 0.0 0.0 0.0 rotated 0.0 ~ run tp @s ^ ^ ^10.0
-execute store result score #k bs.ctx run data get entity @s Pos[2] 100
-execute store result score #l bs.ctx run data get entity @s Pos[1] -100
-tp @s -30000000 0 1600
diff --git a/datapacks/Bookshelf/data/bs.position/function/convert/local_to_canonical/compute.mcfunction b/datapacks/Bookshelf/data/bs.position/function/convert/local_to_canonical/compute.mcfunction
deleted file mode 100644
index 6b154fb801..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/convert/local_to_canonical/compute.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute positioned 0.0 0.0 0.0 run tp @s ^$(x) ^$(y) ^$(z)
-data modify storage bs:ctx _ set from entity @s Pos
-tp @s -30000000 0 1600
diff --git a/datapacks/Bookshelf/data/bs.position/function/convert/local_to_canonical/local_to_canonical.mcfunction b/datapacks/Bookshelf/data/bs.position/function/convert/local_to_canonical/local_to_canonical.mcfunction
deleted file mode 100644
index 28aeaf8c15..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/convert/local_to_canonical/local_to_canonical.mcfunction
+++ /dev/null
@@ -1,26 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#local-to-canonical
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result storage bs:ctx x int 1 run scoreboard players get @s bs.pos.x
-execute store result storage bs:ctx y int 1 run scoreboard players get @s bs.pos.y
-execute store result storage bs:ctx z int 1 run scoreboard players get @s bs.pos.z
-
-execute in minecraft:overworld as B5-0-0-0-1 run function bs.position:convert/local_to_canonical/compute with storage bs:ctx
-
-execute store result score @s bs.pos.x run data get storage bs:ctx _[0]
-execute store result score @s bs.pos.y run data get storage bs:ctx _[1]
-execute store result score @s bs.pos.z run data get storage bs:ctx _[2]
diff --git a/datapacks/Bookshelf/data/bs.position/function/get/distance/compute.mcfunction b/datapacks/Bookshelf/data/bs.position/function/get/distance/compute.mcfunction
deleted file mode 100644
index 23e200173f..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/get/distance/compute.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# compute Euclidean distance: sqrt(x^2+y^2+z^2)
-# Thanks to Triton365 for sharing this trick on the Minecraft Commands discord
-$data modify entity @s transformation set value [$(x)f,0f,0f,0f,$(y)f,0f,0f,0f,$(z)f,0f,0f,0f,0f,0f,0f,1f]
-return run data get entity @s transformation.scale[0]
diff --git a/datapacks/Bookshelf/data/bs.position/function/get/distance/distance_ata.mcfunction b/datapacks/Bookshelf/data/bs.position/function/get/distance/distance_ata.mcfunction
deleted file mode 100644
index 603344fdd3..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/get/distance/distance_ata.mcfunction
+++ /dev/null
@@ -1,30 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-distance
-# ------------------------------------------------------------------------------------------------------------
-
-execute summon minecraft:marker run function bs.position:get/position/ctx
-$execute store result score #x bs.ctx run data get storage bs:ctx _[0] $(scale)
-$execute store result score #y bs.ctx run data get storage bs:ctx _[1] $(scale)
-$execute store result score #z bs.ctx run data get storage bs:ctx _[2] $(scale)
-$execute store result score #u bs.ctx run data get entity @s Pos[0] $(scale)
-$execute store result score #v bs.ctx run data get entity @s Pos[1] $(scale)
-$execute store result score #w bs.ctx run data get entity @s Pos[2] $(scale)
-
-execute store result storage bs:ctx x int 1 run scoreboard players operation #x bs.ctx -= #u bs.ctx
-execute store result storage bs:ctx y int 1 run scoreboard players operation #y bs.ctx -= #v bs.ctx
-execute store result storage bs:ctx z int 1 run scoreboard players operation #z bs.ctx -= #w bs.ctx
-
-execute store result score $position.get_distance_ata bs.out as B5-0-0-0-2 run return run function bs.position:get/distance/compute with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.position/function/get/distance/distance_squared_ata.mcfunction b/datapacks/Bookshelf/data/bs.position/function/get/distance/distance_squared_ata.mcfunction
deleted file mode 100644
index a72cccec82..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/get/distance/distance_squared_ata.mcfunction
+++ /dev/null
@@ -1,34 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-distance
-# ------------------------------------------------------------------------------------------------------------
-
-execute summon minecraft:marker run function bs.position:get/position/ctx
-$execute store result score #x bs.ctx run data get storage bs:ctx _[0] $(scale)
-$execute store result score #y bs.ctx run data get storage bs:ctx _[1] $(scale)
-$execute store result score #z bs.ctx run data get storage bs:ctx _[2] $(scale)
-$execute store result score #u bs.ctx run data get entity @s Pos[0] $(scale)
-$execute store result score #v bs.ctx run data get entity @s Pos[1] $(scale)
-$execute store result score #w bs.ctx run data get entity @s Pos[2] $(scale)
-
-scoreboard players operation #x bs.ctx -= #u bs.ctx
-scoreboard players operation #y bs.ctx -= #v bs.ctx
-scoreboard players operation #z bs.ctx -= #w bs.ctx
-scoreboard players operation #x bs.ctx *= #x bs.ctx
-scoreboard players operation #y bs.ctx *= #y bs.ctx
-scoreboard players operation #z bs.ctx *= #z bs.ctx
-
-scoreboard players operation #x bs.ctx += #y bs.ctx
-execute store result score $position.get_distance_squared_ata bs.out run return run scoreboard players operation #x bs.ctx += #z bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.position/function/get/position/all.mcfunction b/datapacks/Bookshelf/data/bs.position/function/get/position/all.mcfunction
deleted file mode 100644
index d3f1016634..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/get/position/all.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-execute summon minecraft:marker run function bs.position:get/position/ctx
-$execute store result score @s bs.pos.x run data get storage bs:ctx _[0] $(scale)
-$execute store result score @s bs.pos.y run data get storage bs:ctx _[1] $(scale)
-$execute store result score @s bs.pos.z run data get storage bs:ctx _[2] $(scale)
diff --git a/datapacks/Bookshelf/data/bs.position/function/get/position/ctx.mcfunction b/datapacks/Bookshelf/data/bs.position/function/get/position/ctx.mcfunction
deleted file mode 100644
index 979ce61093..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/get/position/ctx.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx _ set from entity @s Pos
-kill @s
diff --git a/datapacks/Bookshelf/data/bs.position/function/get/position/x.mcfunction b/datapacks/Bookshelf/data/bs.position/function/get/position/x.mcfunction
deleted file mode 100644
index d1a4ce080d..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/get/position/x.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-execute summon minecraft:marker run function bs.position:get/position/ctx
-$execute store result score @s bs.pos.x run data get storage bs:ctx _[0] $(scale)
diff --git a/datapacks/Bookshelf/data/bs.position/function/get/position/y.mcfunction b/datapacks/Bookshelf/data/bs.position/function/get/position/y.mcfunction
deleted file mode 100644
index 4988d4e593..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/get/position/y.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-execute summon minecraft:marker run function bs.position:get/position/ctx
-$execute store result score @s bs.pos.y run data get storage bs:ctx _[1] $(scale)
diff --git a/datapacks/Bookshelf/data/bs.position/function/get/position/z.mcfunction b/datapacks/Bookshelf/data/bs.position/function/get/position/z.mcfunction
deleted file mode 100644
index bb744df5a2..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/get/position/z.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-execute summon minecraft:marker run function bs.position:get/position/ctx
-$execute store result score @s bs.pos.z run data get storage bs:ctx _[2] $(scale)
diff --git a/datapacks/Bookshelf/data/bs.position/function/get/relative/relative_ata.mcfunction b/datapacks/Bookshelf/data/bs.position/function/get/relative/relative_ata.mcfunction
deleted file mode 100644
index b6b7f45ba7..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/get/relative/relative_ata.mcfunction
+++ /dev/null
@@ -1,28 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-relative
-# ------------------------------------------------------------------------------------------------------------
-
-execute summon minecraft:marker run function bs.position:get/position/ctx
-$execute store result score #x bs.ctx run data get storage bs:ctx _[0] $(scale)
-$execute store result score #y bs.ctx run data get storage bs:ctx _[1] $(scale)
-$execute store result score #z bs.ctx run data get storage bs:ctx _[2] $(scale)
-
-$execute store result score @s bs.pos.x run data get entity @s Pos[0] $(scale)
-$execute store result score @s bs.pos.y run data get entity @s Pos[1] $(scale)
-$execute store result score @s bs.pos.z run data get entity @s Pos[2] $(scale)
-scoreboard players operation @s bs.pos.x -= #x bs.ctx
-scoreboard players operation @s bs.pos.y -= #y bs.ctx
-scoreboard players operation @s bs.pos.z -= #z bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.position/function/get/relative/relative_from_dir/ctx.mcfunction b/datapacks/Bookshelf/data/bs.position/function/get/relative/relative_from_dir/ctx.mcfunction
deleted file mode 100644
index ba3cdeb89e..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/get/relative/relative_from_dir/ctx.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute positioned 0.0 0.0 0.0 run tp @s ^ ^ ^1
-data modify storage bs:ctx _ set from entity @s Pos
-tp @s -30000000 0 1600
diff --git a/datapacks/Bookshelf/data/bs.position/function/get/relative/relative_from_dir/relative_from_dir.mcfunction b/datapacks/Bookshelf/data/bs.position/function/get/relative/relative_from_dir/relative_from_dir.mcfunction
deleted file mode 100644
index a47216c825..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/get/relative/relative_from_dir/relative_from_dir.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-relative
-# ------------------------------------------------------------------------------------------------------------
-
-execute in minecraft:overworld as B5-0-0-0-1 run function bs.position:get/relative/relative_from_dir/ctx
-$execute store result score @s bs.pos.x run data get storage bs:ctx _[0] $(scale)
-$execute store result score @s bs.pos.y run data get storage bs:ctx _[1] $(scale)
-$execute store result score @s bs.pos.z run data get storage bs:ctx _[2] $(scale)
diff --git a/datapacks/Bookshelf/data/bs.position/function/get/rotation/all.mcfunction b/datapacks/Bookshelf/data/bs.position/function/get/rotation/all.mcfunction
deleted file mode 100644
index 86df98af9b..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/get/rotation/all.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-execute in minecraft:overworld run tp B5-0-0-0-1 -30000000 0 1600 ~ ~
-$execute store result score @s bs.rot.h run data get entity B5-0-0-0-1 Rotation[0] $(scale)
-$execute store result score @s bs.rot.v run data get entity B5-0-0-0-1 Rotation[1] $(scale)
diff --git a/datapacks/Bookshelf/data/bs.position/function/get/rotation/h.mcfunction b/datapacks/Bookshelf/data/bs.position/function/get/rotation/h.mcfunction
deleted file mode 100644
index 3bcfc14f5a..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/get/rotation/h.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-execute in minecraft:overworld run tp B5-0-0-0-1 -30000000 0 1600 ~ ~
-$execute store result score @s bs.rot.h run data get entity B5-0-0-0-1 Rotation[0] $(scale)
diff --git a/datapacks/Bookshelf/data/bs.position/function/get/rotation/v.mcfunction b/datapacks/Bookshelf/data/bs.position/function/get/rotation/v.mcfunction
deleted file mode 100644
index 197f6aedd9..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/get/rotation/v.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-execute in minecraft:overworld run tp B5-0-0-0-1 -30000000 0 1600 ~ ~
-$execute store result score @s bs.rot.v run data get entity B5-0-0-0-1 Rotation[1] $(scale)
diff --git a/datapacks/Bookshelf/data/bs.position/function/set/position/all/all.mcfunction b/datapacks/Bookshelf/data/bs.position/function/set/position/all/all.mcfunction
deleted file mode 100644
index 1bc32b2041..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/set/position/all/all.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/master/modules/position.html#set-position-and-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:ctx x double $(scale) run scoreboard players get @s bs.pos.x
-$execute store result storage bs:ctx y double $(scale) run scoreboard players get @s bs.pos.y
-$execute store result storage bs:ctx z double $(scale) run scoreboard players get @s bs.pos.z
-execute positioned 0.0 0.0 0.0 run function bs.position:set/position/all/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.position/function/set/position/all/run.mcfunction b/datapacks/Bookshelf/data/bs.position/function/set/position/all/run.mcfunction
deleted file mode 100644
index 6409a1e85e..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/set/position/all/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$tp @s ~$(x) ~$(y) ~$(z)
diff --git a/datapacks/Bookshelf/data/bs.position/function/set/position/x/run.mcfunction b/datapacks/Bookshelf/data/bs.position/function/set/position/x/run.mcfunction
deleted file mode 100644
index 4802984db5..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/set/position/x/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$tp @s ~$(x) ~ ~
diff --git a/datapacks/Bookshelf/data/bs.position/function/set/position/x/x.mcfunction b/datapacks/Bookshelf/data/bs.position/function/set/position/x/x.mcfunction
deleted file mode 100644
index 083b62ffde..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/set/position/x/x.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/master/modules/position.html#set-position-and-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:ctx x double $(scale) run scoreboard players get @s bs.pos.x
-execute at @s positioned 0.0 ~ ~ run function bs.position:set/position/x/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.position/function/set/position/y/run.mcfunction b/datapacks/Bookshelf/data/bs.position/function/set/position/y/run.mcfunction
deleted file mode 100644
index 91135edc49..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/set/position/y/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$tp @s ~ ~$(y) ~
diff --git a/datapacks/Bookshelf/data/bs.position/function/set/position/y/y.mcfunction b/datapacks/Bookshelf/data/bs.position/function/set/position/y/y.mcfunction
deleted file mode 100644
index fb528bab06..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/set/position/y/y.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/master/modules/position.html#set-position-and-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:ctx y double $(scale) run scoreboard players get @s bs.pos.y
-execute at @s positioned ~ 0.0 ~ run function bs.position:set/position/y/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.position/function/set/position/z/run.mcfunction b/datapacks/Bookshelf/data/bs.position/function/set/position/z/run.mcfunction
deleted file mode 100644
index 7cbf1abfaf..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/set/position/z/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$tp @s ~ ~ ~$(z)
diff --git a/datapacks/Bookshelf/data/bs.position/function/set/position/z/z.mcfunction b/datapacks/Bookshelf/data/bs.position/function/set/position/z/z.mcfunction
deleted file mode 100644
index 2bd786b6ec..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/set/position/z/z.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/master/modules/position.html#set-position-and-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:ctx z double $(scale) run scoreboard players get @s bs.pos.z
-execute at @s positioned ~ ~ 0.0 run function bs.position:set/position/z/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.position/function/set/rotation/all/all.mcfunction b/datapacks/Bookshelf/data/bs.position/function/set/rotation/all/all.mcfunction
deleted file mode 100644
index 410c30d169..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/set/rotation/all/all.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#set-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:ctx x double $(scale) run scoreboard players get @s bs.rot.h
-$execute store result storage bs:ctx y double $(scale) run scoreboard players get @s bs.rot.v
-function bs.position:set/rotation/all/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.position/function/set/rotation/all/run.mcfunction b/datapacks/Bookshelf/data/bs.position/function/set/rotation/all/run.mcfunction
deleted file mode 100644
index eadfe9ce3e..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/set/rotation/all/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$rotate @s $(x) $(y)
diff --git a/datapacks/Bookshelf/data/bs.position/function/set/rotation/h/h.mcfunction b/datapacks/Bookshelf/data/bs.position/function/set/rotation/h/h.mcfunction
deleted file mode 100644
index 6887c9c883..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/set/rotation/h/h.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#set-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:ctx x double $(scale) run scoreboard players get @s bs.rot.h
-function bs.position:set/rotation/h/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.position/function/set/rotation/h/run.mcfunction b/datapacks/Bookshelf/data/bs.position/function/set/rotation/h/run.mcfunction
deleted file mode 100644
index 172a11c172..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/set/rotation/h/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$rotate @s $(x) ~
diff --git a/datapacks/Bookshelf/data/bs.position/function/set/rotation/v/run.mcfunction b/datapacks/Bookshelf/data/bs.position/function/set/rotation/v/run.mcfunction
deleted file mode 100644
index 66f080e4fe..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/set/rotation/v/run.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$rotate @s ~ $(y)
diff --git a/datapacks/Bookshelf/data/bs.position/function/set/rotation/v/v.mcfunction b/datapacks/Bookshelf/data/bs.position/function/set/rotation/v/v.mcfunction
deleted file mode 100644
index 022f751bf9..0000000000
--- a/datapacks/Bookshelf/data/bs.position/function/set/rotation/v/v.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#set-rotation
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result storage bs:ctx y double $(scale) run scoreboard players get @s bs.rot.v
-function bs.position:set/rotation/v/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/add_pos.json b/datapacks/Bookshelf/data/bs.position/tags/function/add_pos.json
deleted file mode 100644
index acaef47b2b..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/add_pos.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "minecraft_version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.position:add/position/all/all"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/add_pos_x.json b/datapacks/Bookshelf/data/bs.position/tags/function/add_pos_x.json
deleted file mode 100644
index 494a1a2b4b..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/add_pos_x.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "minecraft_version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.position:add/position/x/x"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/add_pos_y.json b/datapacks/Bookshelf/data/bs.position/tags/function/add_pos_y.json
deleted file mode 100644
index 766a4698c3..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/add_pos_y.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "minecraft_version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.position:add/position/y/y"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/add_pos_z.json b/datapacks/Bookshelf/data/bs.position/tags/function/add_pos_z.json
deleted file mode 100644
index 32d7e06711..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/add_pos_z.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "minecraft_version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.position:add/position/z/z"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/add_rot.json b/datapacks/Bookshelf/data/bs.position/tags/function/add_rot.json
deleted file mode 100644
index 1b76120204..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/add_rot.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "minecraft_version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.position:add/rotation/all/all"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/add_rot_h.json b/datapacks/Bookshelf/data/bs.position/tags/function/add_rot_h.json
deleted file mode 100644
index 08a4a558e9..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/add_rot_h.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "minecraft_version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.position:add/rotation/h/h"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/add_rot_v.json b/datapacks/Bookshelf/data/bs.position/tags/function/add_rot_v.json
deleted file mode 100644
index 243205d0e3..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/add_rot_v.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "minecraft_version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.position:add/rotation/v/v"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/canonical_to_local.json b/datapacks/Bookshelf/data/bs.position/tags/function/canonical_to_local.json
deleted file mode 100644
index 303fc04aa1..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/canonical_to_local.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#canonical-to-local",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/20",
- "minecraft_version": "1.20.2"
- },
- "updated": {
- "date": "2024/02/27",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.position:convert/canonical_to_local/canonical_to_local"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.position/tags/function/exclusive_load.json
deleted file mode 100644
index ccb2117375..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.position:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/get_pos.json b/datapacks/Bookshelf/data/bs.position/tags/function/get_pos.json
deleted file mode 100644
index 61ee9b6149..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/get_pos.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "minecraft_version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.position:get/position/all"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/get_pos_x.json b/datapacks/Bookshelf/data/bs.position/tags/function/get_pos_x.json
deleted file mode 100644
index f0932f3f33..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/get_pos_x.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "minecraft_version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.position:get/position/x"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/get_pos_y.json b/datapacks/Bookshelf/data/bs.position/tags/function/get_pos_y.json
deleted file mode 100644
index 919fd528a7..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/get_pos_y.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "minecraft_version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.position:get/position/y"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/get_pos_z.json b/datapacks/Bookshelf/data/bs.position/tags/function/get_pos_z.json
deleted file mode 100644
index a5933ec42f..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/get_pos_z.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "minecraft_version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.position:get/position/z"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/help.json b/datapacks/Bookshelf/data/bs.position/tags/function/help.json
deleted file mode 100644
index d53fcfb0ce..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.position:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/load.json b/datapacks/Bookshelf/data/bs.position/tags/function/load.json
deleted file mode 100644
index 69a0247e4b..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/load.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.position:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/local_to_canonical.json b/datapacks/Bookshelf/data/bs.position/tags/function/local_to_canonical.json
deleted file mode 100644
index 20a5de765e..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/local_to_canonical.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#local-to-canonical",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/12/25",
- "minecraft_version": "1.20.4"
- },
- "updated": {
- "date": "2024/04/12",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.position:convert/local_to_canonical/local_to_canonical"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/set_pos.json b/datapacks/Bookshelf/data/bs.position/tags/function/set_pos.json
deleted file mode 100644
index f0bce7423f..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/set_pos.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#set-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "minecraft_version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.position:set/position/all/all"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/set_pos_x.json b/datapacks/Bookshelf/data/bs.position/tags/function/set_pos_x.json
deleted file mode 100644
index 94dc71390e..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/set_pos_x.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#set-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "minecraft_version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.position:set/position/x/x"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/set_pos_y.json b/datapacks/Bookshelf/data/bs.position/tags/function/set_pos_y.json
deleted file mode 100644
index 8f1668890a..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/set_pos_y.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#set-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "minecraft_version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.position:set/position/y/y"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/set_pos_z.json b/datapacks/Bookshelf/data/bs.position/tags/function/set_pos_z.json
deleted file mode 100644
index cfeadce7e4..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/set_pos_z.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#set-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "minecraft_version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.position:set/position/z/z"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/unload.json b/datapacks/Bookshelf/data/bs.position/tags/function/unload.json
deleted file mode 100644
index 10def5b41c..0000000000
--- a/datapacks/Bookshelf/data/bs.position/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.position:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.position/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.position/test/__boot__.mcfunction
deleted file mode 100644
index 1f4477eae2..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.position
-# @beforebatch function #bs.position:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.position/test/add/pos.mcfunction b/datapacks/Bookshelf/data/bs.position/test/add/pos.mcfunction
deleted file mode 100644
index 76790f00ac..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/add/pos.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# Position is added correctly
-# @batch bs.position
-# @dummy
-
-tp @s 0.0 0.0 0.0 0.0 0.0
-
-execute store result score @s bs.pos.x run random value -10000..10000
-execute store result score @s bs.pos.y run random value -10000..10000
-execute store result score @s bs.pos.z run random value -10000..10000
-function #bs.position:add_pos {scale:.001}
-
-execute store result score #x bs.ctx run data get entity @s Pos[0] 1000
-execute store result score #y bs.ctx run data get entity @s Pos[1] 1000
-execute store result score #z bs.ctx run data get entity @s Pos[2] 1000
-
-scoreboard players operation #x bs.ctx -= @s bs.pos.x
-scoreboard players operation #y bs.ctx -= @s bs.pos.y
-scoreboard players operation #z bs.ctx -= @s bs.pos.z
-
-assert score #x bs.ctx matches -2..2
-assert score #y bs.ctx matches -2..2
-assert score #z bs.ctx matches -2..2
diff --git a/datapacks/Bookshelf/data/bs.position/test/add/pos_and_rot.mcfunction b/datapacks/Bookshelf/data/bs.position/test/add/pos_and_rot.mcfunction
deleted file mode 100644
index ee73fa1133..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/add/pos_and_rot.mcfunction
+++ /dev/null
@@ -1,31 +0,0 @@
-# Position is added correctly
-# @batch bs.position
-
-summon minecraft:marker 0.0 0.0 0.0 {Tags:["bs.packtest"],Rotation:[0.0,0.0]}
-
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.pos.x run random value -10000..10000
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.pos.y run random value -10000..10000
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.pos.z run random value -10000..10000
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h run random value -10000..10000
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v run random value -10000..10000
-execute as @n[type=minecraft:marker,tag=bs.packtest] run function #bs.position:add_pos_and_rot {scale:.001}
-
-execute store result score #x bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Pos[0] 1000
-execute store result score #y bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Pos[1] 1000
-execute store result score #z bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Pos[2] 1000
-execute store result score #h bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[0] 1000
-execute store result score #v bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[1] 1000
-
-scoreboard players operation #x bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.pos.x
-scoreboard players operation #y bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.pos.y
-scoreboard players operation #z bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.pos.z
-scoreboard players operation #h bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h
-scoreboard players operation #v bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v
-
-kill @n[type=minecraft:marker,tag=bs.packtest]
-
-assert score #x bs.ctx matches -2..2
-assert score #y bs.ctx matches -2..2
-assert score #z bs.ctx matches -2..2
-assert score #h bs.ctx matches -2..2
-assert score #v bs.ctx matches -2..2
diff --git a/datapacks/Bookshelf/data/bs.position/test/add/pos_x.mcfunction b/datapacks/Bookshelf/data/bs.position/test/add/pos_x.mcfunction
deleted file mode 100644
index eae31917dd..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/add/pos_x.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# Position is added correctly
-# @batch bs.position
-# @dummy
-
-tp @s 0.0 0.0 0.0 0.0 0.0
-
-execute store result score @s bs.pos.x run random value -10000..10000
-function #bs.position:add_pos_x {scale:.001}
-execute store result score #x bs.ctx run data get entity @s Pos[0] 1000
-scoreboard players operation #x bs.ctx -= @s bs.pos.x
-
-assert score #x bs.ctx matches -2..2
diff --git a/datapacks/Bookshelf/data/bs.position/test/add/pos_y.mcfunction b/datapacks/Bookshelf/data/bs.position/test/add/pos_y.mcfunction
deleted file mode 100644
index c2cea54567..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/add/pos_y.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# Position is added correctly
-# @batch bs.position
-# @dummy
-
-tp @s 0.0 0.0 0.0 0.0 0.0
-
-execute store result score @s bs.pos.y run random value -10000..10000
-function #bs.position:add_pos_y {scale:.001}
-execute store result score #y bs.ctx run data get entity @s Pos[1] 1000
-scoreboard players operation #y bs.ctx -= @s bs.pos.y
-
-assert score #y bs.ctx matches -2..2
diff --git a/datapacks/Bookshelf/data/bs.position/test/add/pos_z.mcfunction b/datapacks/Bookshelf/data/bs.position/test/add/pos_z.mcfunction
deleted file mode 100644
index d92fc97cb9..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/add/pos_z.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# Position is added correctly
-# @batch bs.position
-# @dummy
-
-tp @s 0.0 0.0 0.0 0.0 0.0
-
-execute store result score @s bs.pos.z run random value -10000..10000
-function #bs.position:add_pos_z {scale:.001}
-execute store result score #z bs.ctx run data get entity @s Pos[2] 1000
-scoreboard players operation #z bs.ctx -= @s bs.pos.z
-
-assert score #z bs.ctx matches -2..2
diff --git a/datapacks/Bookshelf/data/bs.position/test/add/rot.mcfunction b/datapacks/Bookshelf/data/bs.position/test/add/rot.mcfunction
deleted file mode 100644
index c14ab4d991..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/add/rot.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# Position is added correctly
-# @batch bs.position
-
-summon minecraft:marker ~ ~ ~ {Tags:["bs.packtest"],Rotation:[0.0,0.0]}
-
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h run random value -10000..10000
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v run random value -10000..10000
-execute as @n[type=minecraft:marker,tag=bs.packtest] run function #bs.position:add_rot {scale:.001}
-
-execute store result score #h bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[0] 1000
-execute store result score #v bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[1] 1000
-
-scoreboard players operation #h bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h
-scoreboard players operation #v bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v
-
-kill @n[type=minecraft:marker,tag=bs.packtest]
-
-assert score #h bs.ctx matches -2..2
-assert score #v bs.ctx matches -2..2
diff --git a/datapacks/Bookshelf/data/bs.position/test/add/rot_h.mcfunction b/datapacks/Bookshelf/data/bs.position/test/add/rot_h.mcfunction
deleted file mode 100644
index 001052eec0..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/add/rot_h.mcfunction
+++ /dev/null
@@ -1,13 +0,0 @@
-# Position is added correctly
-# @batch bs.position
-
-summon minecraft:marker ~ ~ ~ {Tags:["bs.packtest"],Rotation:[0.0,0.0]}
-
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h run random value -10000..10000
-execute as @n[type=minecraft:marker,tag=bs.packtest] run function #bs.position:add_rot_h {scale:.001}
-execute store result score #h bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[0] 1000
-scoreboard players operation #h bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h
-
-kill @n[type=minecraft:marker,tag=bs.packtest]
-
-assert score #h bs.ctx matches -2..2
diff --git a/datapacks/Bookshelf/data/bs.position/test/add/rot_v.mcfunction b/datapacks/Bookshelf/data/bs.position/test/add/rot_v.mcfunction
deleted file mode 100644
index d95188c99c..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/add/rot_v.mcfunction
+++ /dev/null
@@ -1,13 +0,0 @@
-# Position is added correctly
-# @batch bs.position
-
-summon minecraft:marker ~ ~ ~ {Tags:["bs.packtest"],Rotation:[0.0,0.0]}
-
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v run random value -10000..10000
-execute as @n[type=minecraft:marker,tag=bs.packtest] run function #bs.position:add_rot_v {scale:.001}
-execute store result score #v bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[1] 1000
-scoreboard players operation #v bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v
-
-kill @n[type=minecraft:marker,tag=bs.packtest]
-
-assert score #v bs.ctx matches -2..2
diff --git a/datapacks/Bookshelf/data/bs.position/test/convert/canonical_to_local.mcfunction b/datapacks/Bookshelf/data/bs.position/test/convert/canonical_to_local.mcfunction
deleted file mode 100644
index cb731cc2e2..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/convert/canonical_to_local.mcfunction
+++ /dev/null
@@ -1,13 +0,0 @@
-# Convert canonical to local coordinates
-# @batch bs.position
-# @dummy
-
-scoreboard players set @s bs.pos.x 577
-scoreboard players set @s bs.pos.y 577
-scoreboard players set @s bs.pos.z 577
-
-execute rotated -45 -35.265 run function #bs.position:canonical_to_local
-
-assert score @s bs.pos.x matches -1..1
-assert score @s bs.pos.y matches -1..1
-assert score @s bs.pos.z matches 999..1001
diff --git a/datapacks/Bookshelf/data/bs.position/test/convert/local_to_canonical.mcfunction b/datapacks/Bookshelf/data/bs.position/test/convert/local_to_canonical.mcfunction
deleted file mode 100644
index 581e82f2ad..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/convert/local_to_canonical.mcfunction
+++ /dev/null
@@ -1,13 +0,0 @@
-# Convert canonical to local coordinates
-# @batch bs.position
-# @dummy
-
-scoreboard players set @s bs.pos.x 0
-scoreboard players set @s bs.pos.y 0
-scoreboard players set @s bs.pos.z 1000
-
-execute rotated -45 -35.265 run function #bs.position:local_to_canonical
-
-assert score @s bs.pos.x matches 576..578
-assert score @s bs.pos.y matches 576..578
-assert score @s bs.pos.z matches 576..578
diff --git a/datapacks/Bookshelf/data/bs.position/test/get/distance_ata.mcfunction b/datapacks/Bookshelf/data/bs.position/test/get/distance_ata.mcfunction
deleted file mode 100644
index 1d9a242b76..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/get/distance_ata.mcfunction
+++ /dev/null
@@ -1,6 +0,0 @@
-# Distance as to at is correct
-# @batch bs.position
-# @dummy
-
-execute at @s positioned ^ ^ ^7.5 store result score #r bs.ctx run function #bs.position:get_distance_ata {scale:10}
-assert score #r bs.ctx matches 74..76
diff --git a/datapacks/Bookshelf/data/bs.position/test/get/distance_squared_ata.mcfunction b/datapacks/Bookshelf/data/bs.position/test/get/distance_squared_ata.mcfunction
deleted file mode 100644
index 53c4ff0571..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/get/distance_squared_ata.mcfunction
+++ /dev/null
@@ -1,6 +0,0 @@
-# Squared distance as to at is correct
-# @batch bs.position
-# @dummy
-
-execute at @s positioned ^ ^ ^7.5 store result score #r bs.ctx run function #bs.position:get_distance_squared_ata {scale:10}
-assert score #r bs.ctx matches 5624..5626
diff --git a/datapacks/Bookshelf/data/bs.position/test/get/pos.mcfunction b/datapacks/Bookshelf/data/bs.position/test/get/pos.mcfunction
deleted file mode 100644
index 2febf68df5..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/get/pos.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# Pos returns correct values
-# @batch bs.position
-# @dummy
-
-execute at @s positioned ~1 ~1 ~1 run function #bs.position:get_pos {scale:10}
-
-execute store result score #x bs.ctx run data get entity @s Pos[0] 10
-execute store result score #y bs.ctx run data get entity @s Pos[1] 10
-execute store result score #z bs.ctx run data get entity @s Pos[2] 10
-
-scoreboard players operation #x bs.ctx -= @s bs.pos.x
-scoreboard players operation #y bs.ctx -= @s bs.pos.y
-scoreboard players operation #z bs.ctx -= @s bs.pos.z
-
-assert score #x bs.ctx matches -11..-9
-assert score #y bs.ctx matches -11..-9
-assert score #z bs.ctx matches -11..-9
diff --git a/datapacks/Bookshelf/data/bs.position/test/get/pos_and_rot.mcfunction b/datapacks/Bookshelf/data/bs.position/test/get/pos_and_rot.mcfunction
deleted file mode 100644
index 0f32e79e87..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/get/pos_and_rot.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# Pos and rot returns correct values
-# @batch bs.position
-# @dummy
-
-execute at @s positioned ~1 ~1 ~1 rotated ~1 ~1 run function #bs.position:get_pos_and_rot {scale:10}
-
-execute store result score #x bs.ctx run data get entity @s Pos[0] 10
-execute store result score #y bs.ctx run data get entity @s Pos[1] 10
-execute store result score #z bs.ctx run data get entity @s Pos[2] 10
-execute store result score #h bs.ctx run data get entity @s Rotation[0] 10
-execute store result score #v bs.ctx run data get entity @s Rotation[1] 10
-
-scoreboard players operation #x bs.ctx -= @s bs.pos.x
-scoreboard players operation #y bs.ctx -= @s bs.pos.y
-scoreboard players operation #z bs.ctx -= @s bs.pos.z
-scoreboard players operation #h bs.ctx -= @s bs.rot.h
-scoreboard players operation #v bs.ctx -= @s bs.rot.v
-
-assert score #x bs.ctx matches -11..-9
-assert score #y bs.ctx matches -11..-9
-assert score #z bs.ctx matches -11..-9
-assert score #h bs.ctx matches -11..-9
-assert score #v bs.ctx matches -11..-9
diff --git a/datapacks/Bookshelf/data/bs.position/test/get/pos_x.mcfunction b/datapacks/Bookshelf/data/bs.position/test/get/pos_x.mcfunction
deleted file mode 100644
index a0994c5692..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/get/pos_x.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Pos returns correct values
-# @batch bs.position
-# @dummy
-
-execute at @s positioned ~1 ~1 ~1 run function #bs.position:get_pos_x {scale:10}
-
-execute store result score #x bs.ctx run data get entity @s Pos[0] 10
-scoreboard players operation #x bs.ctx -= @s bs.pos.x
-
-assert score #x bs.ctx matches -11..-9
diff --git a/datapacks/Bookshelf/data/bs.position/test/get/pos_y.mcfunction b/datapacks/Bookshelf/data/bs.position/test/get/pos_y.mcfunction
deleted file mode 100644
index d91c7b6103..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/get/pos_y.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Pos returns correct values
-# @batch bs.position
-# @dummy
-
-execute at @s positioned ~1 ~1 ~1 run function #bs.position:get_pos_y {scale:10}
-
-execute store result score #y bs.ctx run data get entity @s Pos[1] 10
-scoreboard players operation #y bs.ctx -= @s bs.pos.y
-
-assert score #y bs.ctx matches -11..-9
diff --git a/datapacks/Bookshelf/data/bs.position/test/get/pos_z.mcfunction b/datapacks/Bookshelf/data/bs.position/test/get/pos_z.mcfunction
deleted file mode 100644
index 6686b757c3..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/get/pos_z.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Pos returns correct values
-# @batch bs.position
-# @dummy
-
-execute at @s positioned ~1 ~1 ~1 run function #bs.position:get_pos_z {scale:10}
-
-execute store result score #z bs.ctx run data get entity @s Pos[2] 10
-scoreboard players operation #z bs.ctx -= @s bs.pos.z
-
-assert score #z bs.ctx matches -11..-9
diff --git a/datapacks/Bookshelf/data/bs.position/test/get/relative_ata.mcfunction b/datapacks/Bookshelf/data/bs.position/test/get/relative_ata.mcfunction
deleted file mode 100644
index 681bd422f6..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/get/relative_ata.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Relative pos as to at returns correct values
-# @batch bs.position
-# @dummy
-
-execute at @s positioned ~-2.7 ~-5.2 ~-3.4 run function #bs.position:get_relative_ata {scale:10}
-
-assert score @s bs.pos.x matches 27
-assert score @s bs.pos.y matches 52
-assert score @s bs.pos.z matches 34
diff --git a/datapacks/Bookshelf/data/bs.position/test/get/relative_from_dir.mcfunction b/datapacks/Bookshelf/data/bs.position/test/get/relative_from_dir.mcfunction
deleted file mode 100644
index d565e9850e..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/get/relative_from_dir.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Relative pos as to at returns correct values
-# @batch bs.position
-# @dummy
-
-execute at @s rotated 35 -18 run function #bs.position:get_relative_from_dir {scale:1000}
-
-assert score @s bs.pos.x matches -546..-544
-assert score @s bs.pos.y matches 307..309
-assert score @s bs.pos.z matches 778..780
diff --git a/datapacks/Bookshelf/data/bs.position/test/get/rot.mcfunction b/datapacks/Bookshelf/data/bs.position/test/get/rot.mcfunction
deleted file mode 100644
index 5b147d3845..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/get/rot.mcfunction
+++ /dev/null
@@ -1,14 +0,0 @@
-# Rot returns correct values
-# @batch bs.position
-# @dummy
-
-execute at @s rotated ~1 ~1 run function #bs.position:get_rot {scale:10}
-
-execute store result score #h bs.ctx run data get entity @s Rotation[0] 10
-execute store result score #v bs.ctx run data get entity @s Rotation[1] 10
-
-scoreboard players operation #h bs.ctx -= @s bs.rot.h
-scoreboard players operation #v bs.ctx -= @s bs.rot.v
-
-assert score #h bs.ctx matches -11..-9
-assert score #v bs.ctx matches -11..-9
diff --git a/datapacks/Bookshelf/data/bs.position/test/get/rot_h.mcfunction b/datapacks/Bookshelf/data/bs.position/test/get/rot_h.mcfunction
deleted file mode 100644
index 26f1f3f8f6..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/get/rot_h.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Rot returns correct values
-# @batch bs.position
-# @dummy
-
-execute at @s rotated ~1 ~1 run function #bs.position:get_rot_h {scale:10}
-
-execute store result score #h bs.ctx run data get entity @s Rotation[0] 10
-scoreboard players operation #h bs.ctx -= @s bs.rot.h
-
-assert score #h bs.ctx matches -11..-9
diff --git a/datapacks/Bookshelf/data/bs.position/test/get/rot_v.mcfunction b/datapacks/Bookshelf/data/bs.position/test/get/rot_v.mcfunction
deleted file mode 100644
index 5ecb3b2bb2..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/get/rot_v.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Rot returns correct values
-# @batch bs.position
-# @dummy
-
-execute at @s rotated ~1 ~1 run function #bs.position:get_rot_v {scale:10}
-
-execute store result score #v bs.ctx run data get entity @s Rotation[1] 10
-scoreboard players operation #v bs.ctx -= @s bs.rot.v
-
-assert score #v bs.ctx matches -11..-9
diff --git a/datapacks/Bookshelf/data/bs.position/test/set/pos.mcfunction b/datapacks/Bookshelf/data/bs.position/test/set/pos.mcfunction
deleted file mode 100644
index 46220e6eef..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/set/pos.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# Position is set correctly
-# @batch bs.position
-# @dummy
-
-execute store result score @s bs.pos.x run random value -10000..10000
-execute store result score @s bs.pos.y run random value -10000..10000
-execute store result score @s bs.pos.z run random value -10000..10000
-function #bs.position:set_pos {scale:.001}
-
-execute store result score #x bs.ctx run data get entity @s Pos[0] 1000
-execute store result score #y bs.ctx run data get entity @s Pos[1] 1000
-execute store result score #z bs.ctx run data get entity @s Pos[2] 1000
-
-scoreboard players operation #x bs.ctx -= @s bs.pos.x
-scoreboard players operation #y bs.ctx -= @s bs.pos.y
-scoreboard players operation #z bs.ctx -= @s bs.pos.z
-
-assert score #x bs.ctx matches -2..2
-assert score #y bs.ctx matches -2..2
-assert score #z bs.ctx matches -2..2
diff --git a/datapacks/Bookshelf/data/bs.position/test/set/pos_and_rot.mcfunction b/datapacks/Bookshelf/data/bs.position/test/set/pos_and_rot.mcfunction
deleted file mode 100644
index 3087ddb787..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/set/pos_and_rot.mcfunction
+++ /dev/null
@@ -1,31 +0,0 @@
-# Position is set correctly
-# @batch bs.position
-
-summon minecraft:marker ~ ~ ~ {Tags:["bs.packtest"]}
-
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.pos.x run random value -10000..10000
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.pos.y run random value -10000..10000
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.pos.z run random value -10000..10000
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h run random value -10000..10000
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v run random value -10000..10000
-execute as @n[type=minecraft:marker,tag=bs.packtest] run function #bs.position:set_pos_and_rot {scale:.001}
-
-execute store result score #x bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Pos[0] 1000
-execute store result score #y bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Pos[1] 1000
-execute store result score #z bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Pos[2] 1000
-execute store result score #h bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[0] 1000
-execute store result score #v bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[1] 1000
-
-scoreboard players operation #x bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.pos.x
-scoreboard players operation #y bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.pos.y
-scoreboard players operation #z bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.pos.z
-scoreboard players operation #h bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h
-scoreboard players operation #v bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v
-
-kill @n[type=minecraft:marker,tag=bs.packtest]
-
-assert score #x bs.ctx matches -2..2
-assert score #y bs.ctx matches -2..2
-assert score #z bs.ctx matches -2..2
-assert score #h bs.ctx matches -2..2
-assert score #v bs.ctx matches -2..2
diff --git a/datapacks/Bookshelf/data/bs.position/test/set/pos_x.mcfunction b/datapacks/Bookshelf/data/bs.position/test/set/pos_x.mcfunction
deleted file mode 100644
index 29299d7824..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/set/pos_x.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Position is set correctly
-# @batch bs.position
-# @dummy
-
-execute store result score @s bs.pos.x run random value -10000..10000
-function #bs.position:set_pos_x {scale:.001}
-execute store result score #x bs.ctx run data get entity @s Pos[0] 1000
-scoreboard players operation #x bs.ctx -= @s bs.pos.x
-
-assert score #x bs.ctx matches -2..2
diff --git a/datapacks/Bookshelf/data/bs.position/test/set/pos_y.mcfunction b/datapacks/Bookshelf/data/bs.position/test/set/pos_y.mcfunction
deleted file mode 100644
index 718c3ca1e8..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/set/pos_y.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Position is set correctly
-# @batch bs.position
-# @dummy
-
-execute store result score @s bs.pos.y run random value -10000..10000
-function #bs.position:set_pos_y {scale:.001}
-execute store result score #y bs.ctx run data get entity @s Pos[1] 1000
-scoreboard players operation #y bs.ctx -= @s bs.pos.y
-
-assert score #y bs.ctx matches -2..2
diff --git a/datapacks/Bookshelf/data/bs.position/test/set/pos_z.mcfunction b/datapacks/Bookshelf/data/bs.position/test/set/pos_z.mcfunction
deleted file mode 100644
index a20272c32c..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/set/pos_z.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Position is set correctly
-# @batch bs.position
-# @dummy
-
-execute store result score @s bs.pos.z run random value -10000..10000
-function #bs.position:set_pos_z {scale:.001}
-execute store result score #z bs.ctx run data get entity @s Pos[2] 1000
-scoreboard players operation #z bs.ctx -= @s bs.pos.z
-
-assert score #z bs.ctx matches -2..2
diff --git a/datapacks/Bookshelf/data/bs.position/test/set/rot.mcfunction b/datapacks/Bookshelf/data/bs.position/test/set/rot.mcfunction
deleted file mode 100644
index c708f314fe..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/set/rot.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# Position is set correctly
-# @batch bs.position
-
-summon minecraft:marker ~ ~ ~ {Tags:["bs.packtest"]}
-
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h run random value -10000..10000
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v run random value -10000..10000
-execute as @n[type=minecraft:marker,tag=bs.packtest] run function #bs.position:set_rot {scale:.001}
-
-execute store result score #h bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[0] 1000
-execute store result score #v bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[1] 1000
-
-scoreboard players operation #h bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h
-scoreboard players operation #v bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v
-
-kill @n[type=minecraft:marker,tag=bs.packtest]
-
-assert score #h bs.ctx matches -2..2
-assert score #v bs.ctx matches -2..2
diff --git a/datapacks/Bookshelf/data/bs.position/test/set/rot_h.mcfunction b/datapacks/Bookshelf/data/bs.position/test/set/rot_h.mcfunction
deleted file mode 100644
index 44c934b7b9..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/set/rot_h.mcfunction
+++ /dev/null
@@ -1,13 +0,0 @@
-# Position is set correctly
-# @batch bs.position
-
-summon minecraft:marker ~ ~ ~ {Tags:["bs.packtest"]}
-
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h run random value -10000..10000
-execute as @n[type=minecraft:marker,tag=bs.packtest] run function #bs.position:set_rot_h {scale:.001}
-execute store result score #h bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[0] 1000
-scoreboard players operation #h bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h
-
-kill @n[type=minecraft:marker,tag=bs.packtest]
-
-assert score #h bs.ctx matches -2..2
diff --git a/datapacks/Bookshelf/data/bs.position/test/set/rot_v.mcfunction b/datapacks/Bookshelf/data/bs.position/test/set/rot_v.mcfunction
deleted file mode 100644
index 117f61b0cf..0000000000
--- a/datapacks/Bookshelf/data/bs.position/test/set/rot_v.mcfunction
+++ /dev/null
@@ -1,13 +0,0 @@
-# Position is set correctly
-# @batch bs.position
-
-summon minecraft:marker ~ ~ ~ {Tags:["bs.packtest"]}
-
-execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v run random value -10000..10000
-execute as @n[type=minecraft:marker,tag=bs.packtest] run function #bs.position:set_rot_v {scale:.001}
-execute store result score #v bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[1] 1000
-scoreboard players operation #v bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v
-
-kill @n[type=minecraft:marker,tag=bs.packtest]
-
-assert score #v bs.ctx matches -2..2
diff --git a/datapacks/Bookshelf/data/bs.random/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.random/.metadata/generated/features.json
deleted file mode 100644
index a5cae3c922..0000000000
--- a/datapacks/Bookshelf/data/bs.random/.metadata/generated/features.json
+++ /dev/null
@@ -1,208 +0,0 @@
-[
- {
- "name": "binomial",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions",
- "authors": [
- "SBtree"
- ],
- "contributors": [
- "Aeldrion"
- ],
- "created": {
- "date": "2024/06/15",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "choice",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-choice",
- "authors": [
- "SBtree"
- ],
- "created": {
- "date": "2024/06/17",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- }
- },
- {
- "name": "fractal_noise_2d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/08/05",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- }
- },
- {
- "name": "fractal_noise_mat_2d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/08/05",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- }
- },
- {
- "name": "geometric",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions",
- "authors": [
- "SBtree"
- ],
- "contributors": [
- "Aeldrion"
- ],
- "created": {
- "date": "2024/06/16",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "poisson",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions",
- "authors": [
- "SBtree"
- ],
- "contributors": [
- "Aeldrion"
- ],
- "created": {
- "date": "2024/06/16",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "simplex_noise_2d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
- "authors": [
- "Aksiome"
- ],
- "contributors": [
- "SBtree"
- ],
- "created": {
- "date": "2024/08/05",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- }
- },
- {
- "name": "simplex_noise_mat_2d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
- "authors": [
- "Aksiome"
- ],
- "contributors": [
- "SBtree"
- ],
- "created": {
- "date": "2024/08/05",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- }
- },
- {
- "name": "uniform",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/06/24",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/06/24",
- "version": "1.21"
- }
- },
- {
- "name": "weighted_choice",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-choice",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/04",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/04",
- "version": "1.21"
- }
- },
- {
- "name": "white_noise_mat_1d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
- "authors": [
- "Aksiome",
- "SBtree"
- ],
- "created": {
- "date": "2024/06/20",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- }
- },
- {
- "name": "white_noise_mat_2d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
- "authors": [
- "Aksiome",
- "SBtree"
- ],
- "created": {
- "date": "2024/06/20",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- }
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.random/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.random/.metadata/generated/module.json
deleted file mode 100644
index 9364ed17af..0000000000
--- a/datapacks/Bookshelf/data/bs.random/.metadata/generated/module.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "name": "bs.random",
- "display_name": "Random",
- "description": "Contains many random functions for different distributions.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html",
- "authors": [
- "Aksiome",
- "SBtree"
- ],
- "contributors": [
- "Aeldrion",
- "SBtree"
- ],
- "weak_dependencies": [
- "bs.log"
- ],
- "features": [
- "bs.random:binomial",
- "bs.random:choice",
- "bs.random:fractal_noise_2d",
- "bs.random:fractal_noise_mat_2d",
- "bs.random:geometric",
- "bs.random:poisson",
- "bs.random:simplex_noise_2d",
- "bs.random:simplex_noise_mat_2d",
- "bs.random:uniform",
- "bs.random:weighted_choice",
- "bs.random:white_noise_mat_1d",
- "bs.random:white_noise_mat_2d"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.random/.metadata/module.json b/datapacks/Bookshelf/data/bs.random/.metadata/module.json
deleted file mode 100644
index bfd8685a17..0000000000
--- a/datapacks/Bookshelf/data/bs.random/.metadata/module.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "bs.random",
- "display_name": "Random",
- "description": "Contains many random functions for different distributions.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html",
- "weak_dependencies": [
- "bs.log"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.random/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.random/function/__help__.mcfunction
deleted file mode 100644
index e3c3ddabe7..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.random documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.random/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.random/function/__load__.mcfunction
deleted file mode 100644
index dd23915cf5..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/__load__.mcfunction
+++ /dev/null
@@ -1,50 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions
-# ------------------------------------------------------------------------------------------------------------
-
-forceload add -30000000 1600
-setblock -30000000 0 1606 minecraft:decorated_pot
-
-scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
-scoreboard objectives add bs.in dummy [{"text":"BS ","color":"dark_gray"},{"text":"Input","color":"aqua"}]
-
-scoreboard players set -1000 bs.const -1000
-scoreboard players set 2 bs.const 2
-scoreboard players set 8 bs.const 8
-scoreboard players set 10 bs.const 10
-scoreboard players set 12 bs.const 12
-scoreboard players set 13 bs.const 13
-scoreboard players set 14 bs.const 14
-scoreboard players set 24 bs.const 24
-scoreboard players set 78 bs.const 78
-scoreboard players set 100 bs.const 100
-scoreboard players set 1000 bs.const 1000
-scoreboard players set 10000 bs.const 10000
-scoreboard players set 65536 bs.const 65536
-scoreboard players set 26645 bs.const 26645
-scoreboard players set 29447 bs.const 29447
-scoreboard players set 32544 bs.const 32544
-scoreboard players set 35967 bs.const 35967
-scoreboard players set 39750 bs.const 39750
-scoreboard players set 43930 bs.const 43930
-scoreboard players set 48550 bs.const 48550
-scoreboard players set 53656 bs.const 53656
-scoreboard players set 59299 bs.const 59299
-scoreboard players set 1000000000 bs.const 1000000000
-
-execute unless data storage bs:const log.messages[{namespaces: ["bs.random"]}] run data modify storage bs:const log.messages[{namespaces: ["bs"]}].namespaces append value "bs.random"
diff --git a/datapacks/Bookshelf/data/bs.random/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.random/function/__unload__.mcfunction
deleted file mode 100644
index 3b312bb032..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/__unload__.mcfunction
+++ /dev/null
@@ -1,27 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions
-# ------------------------------------------------------------------------------------------------------------
-
-setblock -30000000 0 1606 minecraft:air
-forceload remove -30000000 1600
-
-scoreboard objectives remove bs.const
-scoreboard objectives remove bs.ctx
-scoreboard objectives remove bs.out
-scoreboard objectives remove bs.in
-
-data remove storage bs:in random
-data remove storage bs:out random
diff --git a/datapacks/Bookshelf/data/bs.random/function/choice/choice.mcfunction b/datapacks/Bookshelf/data/bs.random/function/choice/choice.mcfunction
deleted file mode 100644
index 3e5a8bdbe2..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/choice/choice.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-choice
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score #l bs.ctx if data storage bs:in random.choice.options[]
-execute store result score #i bs.ctx run random value 0..1000
-scoreboard players remove #l bs.ctx 1
-execute store result storage bs:ctx y int .001 run scoreboard players operation #i bs.ctx *= #l bs.ctx
-function bs.random:choice/get with storage bs:ctx
-return run data get storage bs:ctx y
diff --git a/datapacks/Bookshelf/data/bs.random/function/choice/get.mcfunction b/datapacks/Bookshelf/data/bs.random/function/choice/get.mcfunction
deleted file mode 100644
index 6c85bc7217..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/choice/get.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-choice
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:out random.choice set from storage bs:in random.choice.options[$(y)]
diff --git a/datapacks/Bookshelf/data/bs.random/function/distributions/binomial/binomial.mcfunction b/datapacks/Bookshelf/data/bs.random/function/distributions/binomial/binomial.mcfunction
deleted file mode 100644
index 8aca9f0a0d..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/distributions/binomial/binomial.mcfunction
+++ /dev/null
@@ -1,39 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions
-# ------------------------------------------------------------------------------------------------------------
-
-# Modified from https://github.com/Aeldrion/Minecraft-Random
-$data modify storage bs:ctx _ set value {n:$(trials),p:$(probability)}
-execute store result score #n bs.ctx run data get storage bs:ctx _.n
-execute store result score #p bs.ctx run data get storage bs:ctx _.p 1000000000
-
-execute unless score #n bs.ctx matches 1..1000 run function #bs.log:error { \
- namespace:"bs.random", \
- tag:"binomial", \
- message:'"Trials must be between 1 and 1000."', \
- path:"bs.random:distributions/binomial/binomial", \
-}
-
-execute unless score #p bs.ctx matches 0..1000000000 run function #bs.log:error { \
- namespace:"bs.random", \
- tag:"binomial", \
- message:'"Probability must be between 0 and 1."', \
- path:"bs.random:distributions/binomial/binomial", \
-}
-
-scoreboard players set $random.binomial bs.out 0
-execute if score #n bs.ctx matches 1..1000 if score #p bs.ctx matches 1..1000000000 run function bs.random:distributions/binomial/loop
-return run scoreboard players get $random.binomial bs.out
diff --git a/datapacks/Bookshelf/data/bs.random/function/distributions/binomial/loop.mcfunction b/datapacks/Bookshelf/data/bs.random/function/distributions/binomial/loop.mcfunction
deleted file mode 100644
index 3ce0ee8544..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/distributions/binomial/loop.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions
-# ------------------------------------------------------------------------------------------------------------
-
-# Modified from https://github.com/Aeldrion/Minecraft-Random
-execute if predicate {"condition":"minecraft:value_check","value":{"min":1,"max":1000000000},"range":{"min":1,"max":{"type":"minecraft:score","score":"bs.ctx","target":{"type":"minecraft:fixed","name":"#p"}}}} run scoreboard players add $random.binomial bs.out 1
-scoreboard players remove #n bs.ctx 1
-execute if score #n bs.ctx matches 1.. run function bs.random:distributions/binomial/loop
diff --git a/datapacks/Bookshelf/data/bs.random/function/distributions/geometric/geometric.mcfunction b/datapacks/Bookshelf/data/bs.random/function/distributions/geometric/geometric.mcfunction
deleted file mode 100644
index cc60d086e6..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/distributions/geometric/geometric.mcfunction
+++ /dev/null
@@ -1,31 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions
-# ------------------------------------------------------------------------------------------------------------
-
-# Modified from https://github.com/Aeldrion/Minecraft-Random
-$data modify storage bs:ctx _ set value $(probability)
-execute store result score #p bs.ctx run data get storage bs:ctx _ 1000000000
-
-execute unless score #p bs.ctx matches 0..1000000000 run function #bs.log:error { \
- namespace:"bs.random", \
- tag:"geometric", \
- message:'"Probability must be between 0 and 1."', \
- path:"bs.random:distributions/geometric/geometric", \
-}
-
-scoreboard players set $random.geometric bs.out 0
-function bs.random:distributions/geometric/loop
-return run scoreboard players get $random.geometric bs.out
diff --git a/datapacks/Bookshelf/data/bs.random/function/distributions/geometric/loop.mcfunction b/datapacks/Bookshelf/data/bs.random/function/distributions/geometric/loop.mcfunction
deleted file mode 100644
index b8f4c93534..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/distributions/geometric/loop.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions
-# ------------------------------------------------------------------------------------------------------------
-
-# Modified from https://github.com/Aeldrion/Minecraft-Random
-scoreboard players add $random.geometric bs.out 1
-execute unless predicate {"condition":"minecraft:value_check","value":{"min":1,"max":1000000000},"range":{"min":1,"max":{"type":"minecraft:score","score":"bs.ctx","target":{"type":"minecraft:fixed","name":"#p"}}}} unless score $random.geometric bs.out matches 1000 run function bs.random:distributions/geometric/loop
diff --git a/datapacks/Bookshelf/data/bs.random/function/distributions/poisson/loop.mcfunction b/datapacks/Bookshelf/data/bs.random/function/distributions/poisson/loop.mcfunction
deleted file mode 100644
index 772e2dee2d..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/distributions/poisson/loop.mcfunction
+++ /dev/null
@@ -1,25 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions
-# ------------------------------------------------------------------------------------------------------------
-
-# Modified from https://github.com/Aeldrion/Minecraft-Random
-scoreboard players add #k bs.ctx 1
-
-execute store result score #m bs.ctx run random value 0..65536
-scoreboard players operation #p bs.ctx /= 65536 bs.const
-scoreboard players operation #p bs.ctx *= #m bs.ctx
-
-execute if score #p bs.ctx > #e bs.ctx run function bs.random:distributions/poisson/loop
diff --git a/datapacks/Bookshelf/data/bs.random/function/distributions/poisson/poisson.mcfunction b/datapacks/Bookshelf/data/bs.random/function/distributions/poisson/poisson.mcfunction
deleted file mode 100644
index 78616aa5d8..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/distributions/poisson/poisson.mcfunction
+++ /dev/null
@@ -1,66 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions
-# ------------------------------------------------------------------------------------------------------------
-
-# Modified from https://github.com/Aeldrion/Minecraft-Random
-
-# Save expected value as two scores
-$data modify storage bs:ctx _ set value $(lambda)
-execute store result score #i bs.ctx run data get storage bs:ctx _
-execute store result score #d bs.ctx run data get storage bs:ctx _ 10
-execute unless score #d bs.ctx matches 0..100 run function #bs.log:error { \
- namespace:"bs.random", \
- tag:"poisson", \
- message:'"Lambda must be between 0 and 10."', \
- path:"bs.random:distributions/poisson/poisson", \
-}
-scoreboard players operation #d bs.ctx %= 10 bs.const
-
-# Make sure expected value is valid
-execute if score #i bs.ctx matches ..-1 run scoreboard players set #i bs.ctx 0
-execute if score #i bs.ctx matches 11.. run scoreboard players set #i bs.ctx 10
-execute if score #i bs.ctx matches 0 if score #d bs.ctx matches 0 run scoreboard players set #d bs.ctx 1
-
-# Evaluate exp(-l). The result is a number between 0 and 1 (but not 0), we save it with a scale of 2147483648
-execute if score #i bs.ctx matches 0 run scoreboard players set #e bs.ctx 32768
-execute if score #i bs.ctx matches 1 run scoreboard players set #e bs.ctx 12054
-execute if score #i bs.ctx matches 2 run scoreboard players set #e bs.ctx 4434
-execute if score #i bs.ctx matches 3 run scoreboard players set #e bs.ctx 1631
-execute if score #i bs.ctx matches 4 run scoreboard players set #e bs.ctx 600
-execute if score #i bs.ctx matches 5 run scoreboard players set #e bs.ctx 221
-execute if score #i bs.ctx matches 6 run scoreboard players set #e bs.ctx 81
-execute if score #i bs.ctx matches 7 run scoreboard players set #e bs.ctx 30
-execute if score #i bs.ctx matches 8 run scoreboard players set #e bs.ctx 11
-execute if score #i bs.ctx matches 9 run scoreboard players set #e bs.ctx 4
-execute if score #i bs.ctx matches 10 run scoreboard players set #e bs.ctx 2
-
-# e * exp(0)*65536, e * exp(-0.1)*65536, e * exp(-0.2)*65536, ..., e * exp(-0.9)*65536,
-execute if score #d bs.ctx matches 0 run scoreboard players operation #e bs.ctx *= 65536 bs.const
-execute if score #d bs.ctx matches 1 run scoreboard players operation #e bs.ctx *= 59299 bs.const
-execute if score #d bs.ctx matches 2 run scoreboard players operation #e bs.ctx *= 53656 bs.const
-execute if score #d bs.ctx matches 3 run scoreboard players operation #e bs.ctx *= 48550 bs.const
-execute if score #d bs.ctx matches 4 run scoreboard players operation #e bs.ctx *= 43930 bs.const
-execute if score #d bs.ctx matches 5 run scoreboard players operation #e bs.ctx *= 39750 bs.const
-execute if score #d bs.ctx matches 6 run scoreboard players operation #e bs.ctx *= 35967 bs.const
-execute if score #d bs.ctx matches 7 run scoreboard players operation #e bs.ctx *= 32544 bs.const
-execute if score #d bs.ctx matches 8 run scoreboard players operation #e bs.ctx *= 29447 bs.const
-execute if score #d bs.ctx matches 9 run scoreboard players operation #e bs.ctx *= 26645 bs.const
-
-# Draw random number using Knuth's method
-scoreboard players set #p bs.ctx 2147483647
-scoreboard players set #k bs.ctx -1
-function bs.random:distributions/poisson/loop
-return run scoreboard players operation $random.poisson bs.out = #k bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.random/function/distributions/uniform.mcfunction b/datapacks/Bookshelf/data/bs.random/function/distributions/uniform.mcfunction
deleted file mode 100644
index 170601dd07..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/distributions/uniform.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result score $random.uniform bs.out run return run random value $(min)..$(max)
diff --git a/datapacks/Bookshelf/data/bs.random/function/noise/fractal_noise_2d/fractal_noise_2d.mcfunction b/datapacks/Bookshelf/data/bs.random/function/noise/fractal_noise_2d/fractal_noise_2d.mcfunction
deleted file mode 100644
index 5cfe9135ee..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/noise/fractal_noise_2d/fractal_noise_2d.mcfunction
+++ /dev/null
@@ -1,27 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise-algorithms
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players set #m bs.ctx 0
-scoreboard players set #a bs.ctx 1000
-scoreboard players set #f bs.ctx 1000
-scoreboard players set $random.fractal_noise_2d bs.out 0
-
-scoreboard players operation #o bs.ctx = $random.fractal_noise_2d.octaves bs.in
-scoreboard players operation $random.simplex_noise_2d.seed bs.in = $random.fractal_noise_2d.seed bs.in
-
-execute if score #o bs.ctx matches 1.. run function bs.random:noise/fractal_noise_2d/loop
-return run scoreboard players operation $random.fractal_noise_2d bs.out /= #m bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.random/function/noise/fractal_noise_2d/loop.mcfunction b/datapacks/Bookshelf/data/bs.random/function/noise/fractal_noise_2d/loop.mcfunction
deleted file mode 100644
index ab9a9e8798..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/noise/fractal_noise_2d/loop.mcfunction
+++ /dev/null
@@ -1,40 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise-algorithms
-# ------------------------------------------------------------------------------------------------------------
-
-# Generate noise at the current frequency
-scoreboard players operation $random.simplex_noise_2d.x bs.in = $random.fractal_noise_2d.x bs.in
-scoreboard players operation $random.simplex_noise_2d.y bs.in = $random.fractal_noise_2d.y bs.in
-scoreboard players operation $random.simplex_noise_2d.x bs.in *= #f bs.ctx
-scoreboard players operation $random.simplex_noise_2d.y bs.in *= #f bs.ctx
-scoreboard players operation $random.simplex_noise_2d.x bs.in /= 1000 bs.const
-scoreboard players operation $random.simplex_noise_2d.y bs.in /= 1000 bs.const
-function bs.random:noise/simplex_noise_2d/simplex_noise_2d
-
-scoreboard players operation $random.simplex_noise_2d bs.out *= #a bs.ctx
-scoreboard players operation $random.fractal_noise_2d bs.out += $random.simplex_noise_2d bs.out
-
-# Update maximum possible amplitude for normalization
-scoreboard players operation #m bs.ctx += #a bs.ctx
-
-# Update amplitude and frequency for the next octave
-scoreboard players operation #a bs.ctx *= $random.fractal_noise_2d.persistence bs.in
-scoreboard players operation #a bs.ctx /= 1000 bs.const
-scoreboard players operation #f bs.ctx *= $random.fractal_noise_2d.lacunarity bs.in
-scoreboard players operation #f bs.ctx /= 1000 bs.const
-
-scoreboard players remove #o bs.ctx 1
-execute if score #o bs.ctx matches 1.. run function bs.random:noise/fractal_noise_2d/loop
diff --git a/datapacks/Bookshelf/data/bs.random/function/noise/fractal_noise_mat_2d/fractal_noise_mat_2d.mcfunction b/datapacks/Bookshelf/data/bs.random/function/noise/fractal_noise_mat_2d/fractal_noise_mat_2d.mcfunction
deleted file mode 100644
index 2f2c1bd4e6..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/noise/fractal_noise_mat_2d/fractal_noise_mat_2d.mcfunction
+++ /dev/null
@@ -1,36 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise-generators
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx _ set value {octaves:4,persistence:.5,lacunarity:2.0,size:16,scale:1}
-$scoreboard players set #w bs.ctx $(width)
-$scoreboard players set #h bs.ctx $(height)
-$data modify storage bs:ctx _ merge value $(with)
-execute store result storage bs:ctx _.scale double .000001 run data get storage bs:ctx _.scale 1000
-
-execute store result score $random.fractal_noise_2d.octaves bs.in run data get storage bs:ctx _.octaves
-execute store result score $random.fractal_noise_2d.persistence bs.in run data get storage bs:ctx _.persistence 1000
-execute store result score $random.fractal_noise_2d.lacunarity bs.in run data get storage bs:ctx _.lacunarity 1000
-execute if data storage bs:ctx _.seed store result score $random.fractal_noise_2d.seed bs.in run data get storage bs:ctx _.seed
-execute unless data storage bs:ctx _.seed store result score $random.fractal_noise_2d.seed bs.in run random value 1.. bs.random:fractal_noise_mat_2d
-
-scoreboard players set #k bs.ctx 1000
-execute store result score #c bs.ctx run data get storage bs:ctx _.size
-scoreboard players operation #k bs.ctx /= #c bs.ctx
-
-execute store result score $random.fractal_noise_2d.y bs.in run scoreboard players set #y bs.ctx 0
-data modify storage bs:out random.fractal_noise_mat_2d set value []
-execute if score #h bs.ctx matches 1.. if score #w bs.ctx matches 1.. run function bs.random:noise/fractal_noise_mat_2d/yloop
diff --git a/datapacks/Bookshelf/data/bs.random/function/noise/fractal_noise_mat_2d/xloop.mcfunction b/datapacks/Bookshelf/data/bs.random/function/noise/fractal_noise_mat_2d/xloop.mcfunction
deleted file mode 100644
index 09c38b366b..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/noise/fractal_noise_mat_2d/xloop.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise-generators
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:out random.fractal_noise_mat_2d[-1] append value 0f
-$execute store result storage bs:out random.fractal_noise_mat_2d[-1][-1] float $(scale) run function #bs.random:fractal_noise_2d
-
-execute store result score $random.fractal_noise_2d.x bs.in run scoreboard players add #x bs.ctx 1
-scoreboard players operation $random.fractal_noise_2d.x bs.in *= #k bs.ctx
-execute if score #x bs.ctx < #w bs.ctx run function bs.random:noise/fractal_noise_mat_2d/xloop with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.random/function/noise/fractal_noise_mat_2d/yloop.mcfunction b/datapacks/Bookshelf/data/bs.random/function/noise/fractal_noise_mat_2d/yloop.mcfunction
deleted file mode 100644
index 6f22975129..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/noise/fractal_noise_mat_2d/yloop.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise-generators
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score $random.fractal_noise_2d.x bs.in run scoreboard players set #x bs.ctx 0
-data modify storage bs:out random.fractal_noise_mat_2d append value []
-function bs.random:noise/fractal_noise_mat_2d/xloop with storage bs:ctx _
-
-execute store result score $random.fractal_noise_2d.y bs.in run scoreboard players add #y bs.ctx 1
-scoreboard players operation $random.fractal_noise_2d.y bs.in *= #k bs.ctx
-execute if score #y bs.ctx < #h bs.ctx run function bs.random:noise/fractal_noise_mat_2d/yloop
diff --git a/datapacks/Bookshelf/data/bs.random/function/noise/simplex_noise_2d/simplex_noise_2d.mcfunction b/datapacks/Bookshelf/data/bs.random/function/noise/simplex_noise_2d/simplex_noise_2d.mcfunction
deleted file mode 100644
index 3831ec2e21..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/noise/simplex_noise_2d/simplex_noise_2d.mcfunction
+++ /dev/null
@@ -1,86 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise-algorithms
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation #c bs.ctx = $random.simplex_noise_2d.x bs.in
-scoreboard players operation #d bs.ctx = $random.simplex_noise_2d.y bs.in
-scoreboard players operation #c bs.ctx %= 1000000000 bs.const
-
-# Skew the input space to determine which simplex cell we're in
-execute store result score #i bs.ctx store result score #s bs.ctx run scoreboard players add #c bs.ctx 1000
-execute store result score #j bs.ctx run scoreboard players operation #d bs.ctx %= 1000000000 bs.const
-execute store result storage bs:ctx y int 1 run scoreboard players operation #s bs.ctx += #d bs.ctx
-execute store result score #s bs.ctx run data get storage bs:ctx y .36602540378
-
-scoreboard players operation #i bs.ctx += #s bs.ctx
-execute store result score #u bs.ctx store result score #t bs.ctx run scoreboard players operation #i bs.ctx /= 1000 bs.const
-scoreboard players operation #j bs.ctx += #s bs.ctx
-execute store result score #v bs.ctx run scoreboard players operation #j bs.ctx /= 1000 bs.const
-execute store result storage bs:ctx y int 1 run scoreboard players operation #t bs.ctx += #j bs.ctx
-execute store result score #t bs.ctx run data get storage bs:ctx y 211.3248654
-
-scoreboard players operation #u bs.ctx *= -1000 bs.const
-scoreboard players operation #v bs.ctx *= -1000 bs.const
-scoreboard players operation #u bs.ctx += #t bs.ctx
-scoreboard players operation #v bs.ctx += #t bs.ctx
-execute store result score #t bs.ctx run scoreboard players operation #u bs.ctx += #c bs.ctx
-execute store result score #d bs.ctx run scoreboard players operation #v bs.ctx += #d bs.ctx
-
-# Determine which simplex cell we are in
-execute store success score #c bs.ctx if score #u bs.ctx > #v bs.ctx
-
-# Calculate the contribution from the first corner
-scoreboard players operation #t bs.ctx *= #t bs.ctx
-scoreboard players operation #d bs.ctx *= #d bs.ctx
-scoreboard players operation #t bs.ctx += #d bs.ctx
-scoreboard players remove #t bs.ctx 500000
-scoreboard players operation #t bs.ctx /= -1000 bs.const
-scoreboard players set #n bs.ctx 0
-execute if score #t bs.ctx matches 1.. run function bs.random:noise/simplex_noise_2d/gradient
-scoreboard players operation $random.simplex_noise_2d bs.out = #n bs.ctx
-
-# Calculate the contribution from the second corner
-execute store result score #t bs.ctx run scoreboard players remove #u bs.ctx 578
-execute store result score #d bs.ctx run scoreboard players remove #v bs.ctx 578
-scoreboard players operation #t bs.ctx *= #t bs.ctx
-scoreboard players operation #d bs.ctx *= #d bs.ctx
-scoreboard players operation #t bs.ctx += #d bs.ctx
-scoreboard players remove #t bs.ctx 500000
-scoreboard players operation #t bs.ctx /= -1000 bs.const
-scoreboard players add #i bs.ctx 1
-scoreboard players add #j bs.ctx 1
-scoreboard players set #n bs.ctx 0
-execute if score #t bs.ctx matches 1.. run function bs.random:noise/simplex_noise_2d/gradient
-scoreboard players operation $random.simplex_noise_2d bs.out += #n bs.ctx
-
-# Calculate the contribution from the third corner
-execute if score #c bs.ctx matches 1 run scoreboard players remove #u bs.ctx 1000
-execute if score #c bs.ctx matches 0 run scoreboard players remove #v bs.ctx 1000
-execute store result score #t bs.ctx run scoreboard players add #u bs.ctx 789
-execute store result score #d bs.ctx run scoreboard players add #v bs.ctx 789
-scoreboard players operation #t bs.ctx *= #t bs.ctx
-scoreboard players operation #d bs.ctx *= #d bs.ctx
-scoreboard players operation #t bs.ctx += #d bs.ctx
-scoreboard players remove #t bs.ctx 500000
-scoreboard players operation #t bs.ctx /= -1000 bs.const
-execute if score #c bs.ctx matches 0 run scoreboard players remove #i bs.ctx 1
-execute if score #c bs.ctx matches 1 run scoreboard players remove #j bs.ctx 1
-scoreboard players set #n bs.ctx 0
-execute if score #t bs.ctx matches 1.. run function bs.random:noise/simplex_noise_2d/gradient
-scoreboard players operation $random.simplex_noise_2d bs.out += #n bs.ctx
-
-# Scale the result to cover the range [-1000, 1000]
-return run scoreboard players operation $random.simplex_noise_2d bs.out /= 14 bs.const
diff --git a/datapacks/Bookshelf/data/bs.random/function/noise/simplex_noise_mat_2d/simplex_noise_mat_2d.mcfunction b/datapacks/Bookshelf/data/bs.random/function/noise/simplex_noise_mat_2d/simplex_noise_mat_2d.mcfunction
deleted file mode 100644
index 67a4d3ab14..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/noise/simplex_noise_mat_2d/simplex_noise_mat_2d.mcfunction
+++ /dev/null
@@ -1,33 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise-generators
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx _ set value {size:16,scale:1}
-$scoreboard players set #w bs.ctx $(width)
-$scoreboard players set #h bs.ctx $(height)
-$data modify storage bs:ctx _ merge value $(with)
-execute store result storage bs:ctx _.scale double .000001 run data get storage bs:ctx _.scale 1000
-
-execute if data storage bs:ctx _.seed store result score $random.simplex_noise_2d.seed bs.in run data get storage bs:ctx _.seed
-execute unless data storage bs:ctx _.seed store result score $random.simplex_noise_2d.seed bs.in run random value 1.. bs.random:simplex_noise_mat_2d
-
-scoreboard players set #k bs.ctx 1000
-execute store result score #c bs.ctx run data get storage bs:ctx _.size
-scoreboard players operation #k bs.ctx /= #c bs.ctx
-
-execute store result score $random.simplex_noise_2d.y bs.in run scoreboard players set #y bs.ctx 0
-data modify storage bs:out random.simplex_noise_mat_2d set value []
-execute if score #h bs.ctx matches 1.. if score #w bs.ctx matches 1.. run function bs.random:noise/simplex_noise_mat_2d/yloop
diff --git a/datapacks/Bookshelf/data/bs.random/function/noise/simplex_noise_mat_2d/xloop.mcfunction b/datapacks/Bookshelf/data/bs.random/function/noise/simplex_noise_mat_2d/xloop.mcfunction
deleted file mode 100644
index fc6a3db353..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/noise/simplex_noise_mat_2d/xloop.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise-generators
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:out random.simplex_noise_mat_2d[-1] append value 0f
-$execute store result storage bs:out random.simplex_noise_mat_2d[-1][-1] float $(scale) run function #bs.random:simplex_noise_2d
-
-execute store result score $random.simplex_noise_2d.x bs.in run scoreboard players add #x bs.ctx 1
-scoreboard players operation $random.simplex_noise_2d.x bs.in *= #k bs.ctx
-execute if score #x bs.ctx < #w bs.ctx run function bs.random:noise/simplex_noise_mat_2d/xloop with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.random/function/noise/simplex_noise_mat_2d/yloop.mcfunction b/datapacks/Bookshelf/data/bs.random/function/noise/simplex_noise_mat_2d/yloop.mcfunction
deleted file mode 100644
index 509a37138d..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/noise/simplex_noise_mat_2d/yloop.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise-generators
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score $random.simplex_noise_2d.x bs.in run scoreboard players set #x bs.ctx 0
-data modify storage bs:out random.simplex_noise_mat_2d append value []
-function bs.random:noise/simplex_noise_mat_2d/xloop with storage bs:ctx _
-
-execute store result score $random.simplex_noise_2d.y bs.in run scoreboard players add #y bs.ctx 1
-scoreboard players operation $random.simplex_noise_2d.y bs.in *= #k bs.ctx
-execute if score #y bs.ctx < #h bs.ctx run function bs.random:noise/simplex_noise_mat_2d/yloop
diff --git a/datapacks/Bookshelf/data/bs.random/function/noise/white_noise_mat_1d/loop.mcfunction b/datapacks/Bookshelf/data/bs.random/function/noise/white_noise_mat_1d/loop.mcfunction
deleted file mode 100644
index ea23245cf6..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/noise/white_noise_mat_1d/loop.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise-generators
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players remove #i bs.ctx 1
-data modify storage bs:out random.white_noise_mat_1d append value 0f
-$execute store result storage bs:out random.white_noise_mat_1d[-1] float $(scale) run random value 1..1000
-execute if score #i bs.ctx matches 1.. run function bs.random:noise/white_noise_mat_1d/loop with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.random/function/noise/white_noise_mat_1d/white_noise_mat_1d.mcfunction b/datapacks/Bookshelf/data/bs.random/function/noise/white_noise_mat_1d/white_noise_mat_1d.mcfunction
deleted file mode 100644
index 7f23698946..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/noise/white_noise_mat_1d/white_noise_mat_1d.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise-generators
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx _ set value {scale:1}
-$scoreboard players set #i bs.ctx $(length)
-$data modify storage bs:ctx _ merge value $(with)
-execute store result storage bs:ctx _.scale double .000001 run data get storage bs:ctx _.scale 1000
-
-data modify storage bs:out random.white_noise_mat_1d set value []
-execute if score #i bs.ctx matches 1.. run function bs.random:noise/white_noise_mat_1d/loop with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.random/function/noise/white_noise_mat_2d/white_noise_mat_2d.mcfunction b/datapacks/Bookshelf/data/bs.random/function/noise/white_noise_mat_2d/white_noise_mat_2d.mcfunction
deleted file mode 100644
index 992668c13d..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/noise/white_noise_mat_2d/white_noise_mat_2d.mcfunction
+++ /dev/null
@@ -1,26 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise-generators
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx _ set value {scale:1}
-$scoreboard players set #w bs.ctx $(width)
-$scoreboard players set #h bs.ctx $(height)
-$data modify storage bs:ctx _ merge value $(with)
-execute store result storage bs:ctx _.scale double .000001 run data get storage bs:ctx _.scale 1000
-
-scoreboard players set #y bs.ctx 0
-data modify storage bs:out random.white_noise_mat_2d set value []
-execute if score #h bs.ctx matches 1.. if score #w bs.ctx matches 1.. run function bs.random:noise/white_noise_mat_2d/yloop
diff --git a/datapacks/Bookshelf/data/bs.random/function/noise/white_noise_mat_2d/xloop.mcfunction b/datapacks/Bookshelf/data/bs.random/function/noise/white_noise_mat_2d/xloop.mcfunction
deleted file mode 100644
index bab83ed2e3..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/noise/white_noise_mat_2d/xloop.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise-generators
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:out random.white_noise_mat_2d[-1] append value 0f
-$execute store result storage bs:out random.white_noise_mat_2d[-1][-1] float $(scale) run random value 1..1000
-scoreboard players add #x bs.ctx 1
-execute if score #x bs.ctx < #w bs.ctx run function bs.random:noise/white_noise_mat_2d/xloop with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.random/function/noise/white_noise_mat_2d/yloop.mcfunction b/datapacks/Bookshelf/data/bs.random/function/noise/white_noise_mat_2d/yloop.mcfunction
deleted file mode 100644
index 8771b54944..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/noise/white_noise_mat_2d/yloop.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise-generators
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players set #x bs.ctx 0
-data modify storage bs:out random.white_noise_mat_2d append value []
-function bs.random:noise/white_noise_mat_2d/xloop with storage bs:ctx _
-
-scoreboard players add #y bs.ctx 1
-execute if score #y bs.ctx < #h bs.ctx run function bs.random:noise/white_noise_mat_2d/yloop
diff --git a/datapacks/Bookshelf/data/bs.random/function/weighted_choice/loop.mcfunction b/datapacks/Bookshelf/data/bs.random/function/weighted_choice/loop.mcfunction
deleted file mode 100644
index 8fa8418c89..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/weighted_choice/loop.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-choice
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx _.pools[0].entries append value {type:"item",name:"cod",weight:1,functions:[{function:"set_custom_data",tag:{}}]}
-data modify storage bs:ctx _.pools[0].entries[-1].weight set from storage bs:ctx _.weights[0]
-data modify storage bs:ctx _.pools[0].entries[-1].functions[0].tag.v set from storage bs:ctx _.options[0]
-execute store result storage bs:ctx _.pools[0].entries[-1].functions[0].tag.i int 1 run scoreboard players add #i bs.ctx 1
-data remove storage bs:ctx _.options[0]
-data remove storage bs:ctx _.weights[0]
-execute if data storage bs:ctx _.options[-1] run function bs.random:weighted_choice/loop
diff --git a/datapacks/Bookshelf/data/bs.random/function/weighted_choice/run.mcfunction b/datapacks/Bookshelf/data/bs.random/function/weighted_choice/run.mcfunction
deleted file mode 100644
index 68debd9002..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/weighted_choice/run.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-choice
-# ------------------------------------------------------------------------------------------------------------
-
-$loot replace block -30000000 0 1606 container.0 loot $(_)
-data modify storage bs:ctx _ set from block -30000000 0 1606 item.components."minecraft:custom_data"
-data modify storage bs:out random.weighted_choice set from storage bs:ctx _.v
-return run data get storage bs:ctx _.i
diff --git a/datapacks/Bookshelf/data/bs.random/function/weighted_choice/weighted_choice.mcfunction b/datapacks/Bookshelf/data/bs.random/function/weighted_choice/weighted_choice.mcfunction
deleted file mode 100644
index 8950756310..0000000000
--- a/datapacks/Bookshelf/data/bs.random/function/weighted_choice/weighted_choice.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-choice
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players set #i bs.ctx -1
-data modify storage bs:ctx _ set value {pools:[{rolls:1,entries:[]}]}
-data modify storage bs:ctx _.options set from storage bs:in random.weighted_choice.options
-data modify storage bs:ctx _.weights set from storage bs:in random.weighted_choice.weights
-execute if data storage bs:ctx _.options[-1] run function bs.random:weighted_choice/loop
-return run function bs.random:weighted_choice/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.random/tags/function/choice.json b/datapacks/Bookshelf/data/bs.random/tags/function/choice.json
deleted file mode 100644
index 3ab34010ad..0000000000
--- a/datapacks/Bookshelf/data/bs.random/tags/function/choice.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-choice",
- "authors": [
- "SBtree"
- ],
- "created": {
- "date": "2024/06/17",
- "minecraft_version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "minecraft_version": "1.21"
- }
- },
- "values": [
- "bs.random:choice/choice"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.random/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.random/tags/function/exclusive_load.json
deleted file mode 100644
index 4e6155d084..0000000000
--- a/datapacks/Bookshelf/data/bs.random/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.random:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.random/tags/function/help.json b/datapacks/Bookshelf/data/bs.random/tags/function/help.json
deleted file mode 100644
index db43eb31a3..0000000000
--- a/datapacks/Bookshelf/data/bs.random/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.random:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.random/tags/function/load.json b/datapacks/Bookshelf/data/bs.random/tags/function/load.json
deleted file mode 100644
index f42a6b211c..0000000000
--- a/datapacks/Bookshelf/data/bs.random/tags/function/load.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "values": [
- "bs.random:__load__",
- {
- "id": "#bs.log:load",
- "required": false
- }
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.random/tags/function/uniform.json b/datapacks/Bookshelf/data/bs.random/tags/function/uniform.json
deleted file mode 100644
index 28c8ad66c3..0000000000
--- a/datapacks/Bookshelf/data/bs.random/tags/function/uniform.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/06/24",
- "minecraft_version": "1.21"
- },
- "updated": {
- "date": "2024/06/24",
- "minecraft_version": "1.21"
- }
- },
- "values": [
- "bs.random:distributions/uniform"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.random/tags/function/unload.json b/datapacks/Bookshelf/data/bs.random/tags/function/unload.json
deleted file mode 100644
index 0cf5d6dcea..0000000000
--- a/datapacks/Bookshelf/data/bs.random/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.random:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.random/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.random/test/__boot__.mcfunction
deleted file mode 100644
index e47bb949dc..0000000000
--- a/datapacks/Bookshelf/data/bs.random/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.random
-# @beforebatch function #bs.random:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.random/test/choice.mcfunction b/datapacks/Bookshelf/data/bs.random/test/choice.mcfunction
deleted file mode 100644
index 6a4987866c..0000000000
--- a/datapacks/Bookshelf/data/bs.random/test/choice.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# Choice should return a random index and its value
-# @batch bs.random
-
-# return a value that match the index
-data modify storage bs:in random.choice.options set value [0,1,2,3,4]
-execute store result score #i bs.ctx run function #bs.random:choice
-execute if score #i bs.ctx matches 0 run assert data storage bs:out random{choice:0}
-execute if score #i bs.ctx matches 1 run assert data storage bs:out random{choice:1}
-execute if score #i bs.ctx matches 2 run assert data storage bs:out random{choice:2}
-execute if score #i bs.ctx matches 3 run assert data storage bs:out random{choice:3}
-execute if score #i bs.ctx matches 4 run assert data storage bs:out random{choice:4}
-
-# it does not return the same index each time (using a large dataset)
-data modify storage bs:in random.choice.options set value [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50]
-execute store result score #0 bs.ctx run function #bs.random:choice
-execute store result score #1 bs.ctx run function #bs.random:choice
-execute store result score #2 bs.ctx run function #bs.random:choice
-execute store result score #3 bs.ctx run function #bs.random:choice
-execute store result score #4 bs.ctx run function #bs.random:choice
-execute if score #0 bs.ctx = #1 bs.ctx if score #1 bs.ctx = #2 bs.ctx if score #2 bs.ctx = #3 bs.ctx if score #3 bs.ctx = #4 bs.ctx run fail "Choice must return a random index each time"
diff --git a/datapacks/Bookshelf/data/bs.random/test/distributions/binomial.mcfunction b/datapacks/Bookshelf/data/bs.random/test/distributions/binomial.mcfunction
deleted file mode 100644
index 408c855aa3..0000000000
--- a/datapacks/Bookshelf/data/bs.random/test/distributions/binomial.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Binomial distribution returns acceptable values
-# @batch bs.random
-
-# if probabilty is 1, should stop at last trial
-function #bs.random:binomial {trials:5,probability:1}
-assert score $random.binomial bs.out matches 5
-
-# if probability is 0, should not stop and no trial should succeed
-function #bs.random:binomial {trials:5,probability:0}
-assert score $random.binomial bs.out matches 0
diff --git a/datapacks/Bookshelf/data/bs.random/test/distributions/geometric.mcfunction b/datapacks/Bookshelf/data/bs.random/test/distributions/geometric.mcfunction
deleted file mode 100644
index f9a2adb9ed..0000000000
--- a/datapacks/Bookshelf/data/bs.random/test/distributions/geometric.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Geometric distribution returns acceptable values
-# @batch bs.random
-
-# if probabilty is 1, should stop at first trial
-function #bs.random:geometric {probability:1}
-assert score $random.geometric bs.out matches 1
-
-# if probability is 0, should not stop and should reach the bound (1000)
-function #bs.random:geometric {probability:0}
-assert score $random.geometric bs.out matches 1000
diff --git a/datapacks/Bookshelf/data/bs.random/test/distributions/poisson.mcfunction b/datapacks/Bookshelf/data/bs.random/test/distributions/poisson.mcfunction
deleted file mode 100644
index c0672a39c1..0000000000
--- a/datapacks/Bookshelf/data/bs.random/test/distributions/poisson.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Poisson distribution returns acceptable values
-# @batch bs.random
-
-execute store result score #0 bs.ctx run function #bs.random:poisson {lambda:1}
-execute store result score #1 bs.ctx run function #bs.random:poisson {lambda:3}
-execute store result score #2 bs.ctx run function #bs.random:poisson {lambda:5}
-execute store result score #3 bs.ctx run function #bs.random:poisson {lambda:7}
-execute store result score #4 bs.ctx run function #bs.random:poisson {lambda:9}
-execute if score #0 bs.ctx = #1 bs.ctx if score #1 bs.ctx = #2 bs.ctx if score #2 bs.ctx = #3 bs.ctx if score #3 bs.ctx = #4 bs.ctx run fail "The poisson distribution should not always return the same value"
diff --git a/datapacks/Bookshelf/data/bs.random/test/distributions/uniform.mcfunction b/datapacks/Bookshelf/data/bs.random/test/distributions/uniform.mcfunction
deleted file mode 100644
index 4c3df6335b..0000000000
--- a/datapacks/Bookshelf/data/bs.random/test/distributions/uniform.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Uniform distribution returns acceptable values
-# @batch bs.random
-
-execute store result score #0 bs.ctx run function #bs.random:uniform {min:-10000000,max:10000000}
-execute store result score #1 bs.ctx run function #bs.random:uniform {min:-10000000,max:10000000}
-execute store result score #2 bs.ctx run function #bs.random:uniform {min:-10000000,max:10000000}
-execute store result score #3 bs.ctx run function #bs.random:uniform {min:-10000000,max:10000000}
-execute store result score #4 bs.ctx run function #bs.random:uniform {min:-10000000,max:10000000}
-execute if score #0 bs.ctx = #1 bs.ctx if score #1 bs.ctx = #2 bs.ctx if score #2 bs.ctx = #3 bs.ctx if score #3 bs.ctx = #4 bs.ctx run fail "The uniform distribution should not always return the same value"
diff --git a/datapacks/Bookshelf/data/bs.random/test/noise/fractal_noise_2d.mcfunction b/datapacks/Bookshelf/data/bs.random/test/noise/fractal_noise_2d.mcfunction
deleted file mode 100644
index aa5a66e70b..0000000000
--- a/datapacks/Bookshelf/data/bs.random/test/noise/fractal_noise_2d.mcfunction
+++ /dev/null
@@ -1,38 +0,0 @@
-# Fractal noise 2d generates the right values (hardcoded values based on seed)
-# @batch bs.random
-
-scoreboard players set $random.fractal_noise_2d.x bs.in 28656
-scoreboard players set $random.fractal_noise_2d.y bs.in 1203
-scoreboard players set $random.fractal_noise_2d.seed bs.in 5865932
-scoreboard players set $random.fractal_noise_2d.octaves bs.in 4
-scoreboard players set $random.fractal_noise_2d.persistence bs.in 500
-scoreboard players set $random.fractal_noise_2d.lacunarity bs.in 2000
-function #bs.random:fractal_noise_2d
-assert score $random.fractal_noise_2d bs.out matches 89
-
-scoreboard players set $random.fractal_noise_2d.x bs.in 15589
-scoreboard players set $random.fractal_noise_2d.y bs.in 812
-scoreboard players set $random.fractal_noise_2d.seed bs.in 57678
-scoreboard players set $random.fractal_noise_2d.octaves bs.in 2
-scoreboard players set $random.fractal_noise_2d.persistence bs.in 700
-scoreboard players set $random.fractal_noise_2d.lacunarity bs.in 1500
-function #bs.random:fractal_noise_2d
-assert score $random.fractal_noise_2d bs.out matches 264
-
-scoreboard players set $random.fractal_noise_2d.x bs.in 420
-scoreboard players set $random.fractal_noise_2d.y bs.in 5123
-scoreboard players set $random.fractal_noise_2d.seed bs.in 1
-scoreboard players set $random.fractal_noise_2d.octaves bs.in 6
-scoreboard players set $random.fractal_noise_2d.persistence bs.in 200
-scoreboard players set $random.fractal_noise_2d.lacunarity bs.in 2500
-function #bs.random:fractal_noise_2d
-assert score $random.fractal_noise_2d bs.out matches -406
-
-scoreboard players set $random.fractal_noise_2d.x bs.in 1000
-scoreboard players set $random.fractal_noise_2d.y bs.in 1000
-scoreboard players set $random.fractal_noise_2d.seed bs.in 123456789
-scoreboard players set $random.fractal_noise_2d.octaves bs.in 5
-scoreboard players set $random.fractal_noise_2d.persistence bs.in 600
-scoreboard players set $random.fractal_noise_2d.lacunarity bs.in 1900
-function #bs.random:fractal_noise_2d
-assert score $random.fractal_noise_2d bs.out matches -133
diff --git a/datapacks/Bookshelf/data/bs.random/test/noise/fractal_noise_mat_2d.mcfunction b/datapacks/Bookshelf/data/bs.random/test/noise/fractal_noise_mat_2d.mcfunction
deleted file mode 100644
index 1a6388c6ad..0000000000
--- a/datapacks/Bookshelf/data/bs.random/test/noise/fractal_noise_mat_2d.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# Fractal noise 2d generates the right number of random values
-# @batch bs.random
-
-function #bs.random:fractal_noise_mat_2d {width:0,height:8,with:{}}
-execute store result score #n bs.ctx if data storage bs:out random.fractal_noise_mat_2d[]
-assert score #n bs.ctx matches 0
-
-function #bs.random:fractal_noise_mat_2d {width:8,height:0,with:{}}
-execute store result score #n bs.ctx if data storage bs:out random.fractal_noise_mat_2d[]
-assert score #n bs.ctx matches 0
-
-function #bs.random:fractal_noise_mat_2d {width:3,height:2,with:{}}
-execute store result score #n bs.ctx if data storage bs:out random.fractal_noise_mat_2d[]
-assert score #n bs.ctx matches 2
-execute store result score #n bs.ctx if data storage bs:out random.fractal_noise_mat_2d[0][]
-assert score #n bs.ctx matches 3
-execute store result score #n bs.ctx if data storage bs:out random.fractal_noise_mat_2d[1][]
-assert score #n bs.ctx matches 3
diff --git a/datapacks/Bookshelf/data/bs.random/test/noise/simplex_noise_2d.mcfunction b/datapacks/Bookshelf/data/bs.random/test/noise/simplex_noise_2d.mcfunction
deleted file mode 100644
index fd110211bb..0000000000
--- a/datapacks/Bookshelf/data/bs.random/test/noise/simplex_noise_2d.mcfunction
+++ /dev/null
@@ -1,26 +0,0 @@
-# Simplex noise 2d generates the right values (hardcoded values based on seed)
-# @batch bs.random
-
-scoreboard players set $random.simplex_noise_2d.x bs.in 28656
-scoreboard players set $random.simplex_noise_2d.y bs.in 1203
-scoreboard players set $random.simplex_noise_2d.seed bs.in 5865932
-function #bs.random:simplex_noise_2d
-assert score $random.simplex_noise_2d bs.out matches 170
-
-scoreboard players set $random.simplex_noise_2d.x bs.in 15589
-scoreboard players set $random.simplex_noise_2d.y bs.in 812
-scoreboard players set $random.simplex_noise_2d.seed bs.in 57678
-function #bs.random:simplex_noise_2d
-assert score $random.simplex_noise_2d bs.out matches 279
-
-scoreboard players set $random.simplex_noise_2d.x bs.in 420
-scoreboard players set $random.simplex_noise_2d.y bs.in 5123
-scoreboard players set $random.simplex_noise_2d.seed bs.in 1
-function #bs.random:simplex_noise_2d
-assert score $random.simplex_noise_2d bs.out matches -612
-
-scoreboard players set $random.simplex_noise_2d.x bs.in 1000
-scoreboard players set $random.simplex_noise_2d.y bs.in 1000
-scoreboard players set $random.simplex_noise_2d.seed bs.in 123456789
-function #bs.random:simplex_noise_2d
-assert score $random.simplex_noise_2d bs.out matches -473
diff --git a/datapacks/Bookshelf/data/bs.random/test/noise/simplex_noise_mat_2d.mcfunction b/datapacks/Bookshelf/data/bs.random/test/noise/simplex_noise_mat_2d.mcfunction
deleted file mode 100644
index 2a0535fb7b..0000000000
--- a/datapacks/Bookshelf/data/bs.random/test/noise/simplex_noise_mat_2d.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# Simplex noise 2d generates the right number of random values
-# @batch bs.random
-
-function #bs.random:simplex_noise_mat_2d {width:0,height:8,with:{}}
-execute store result score #n bs.ctx if data storage bs:out random.simplex_noise_mat_2d[]
-assert score #n bs.ctx matches 0
-
-function #bs.random:simplex_noise_mat_2d {width:8,height:0,with:{}}
-execute store result score #n bs.ctx if data storage bs:out random.simplex_noise_mat_2d[]
-assert score #n bs.ctx matches 0
-
-function #bs.random:simplex_noise_mat_2d {width:3,height:2,with:{}}
-execute store result score #n bs.ctx if data storage bs:out random.simplex_noise_mat_2d[]
-assert score #n bs.ctx matches 2
-execute store result score #n bs.ctx if data storage bs:out random.simplex_noise_mat_2d[0][]
-assert score #n bs.ctx matches 3
-execute store result score #n bs.ctx if data storage bs:out random.simplex_noise_mat_2d[1][]
-assert score #n bs.ctx matches 3
diff --git a/datapacks/Bookshelf/data/bs.random/test/noise/white_noise_mat_1d.mcfunction b/datapacks/Bookshelf/data/bs.random/test/noise/white_noise_mat_1d.mcfunction
deleted file mode 100644
index 2e99ba246f..0000000000
--- a/datapacks/Bookshelf/data/bs.random/test/noise/white_noise_mat_1d.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# White noise 1d generates the right number of random values
-# @batch bs.random
-
-function #bs.random:white_noise_mat_1d {length:0,with:{}}
-execute store result score #n bs.ctx if data storage bs:out random.white_noise_mat_1d[]
-assert score #n bs.ctx matches 0
-
-function #bs.random:white_noise_mat_1d {length:5,with:{}}
-execute store result score #n bs.ctx if data storage bs:out random.white_noise_mat_1d[]
-assert score #n bs.ctx matches 5
-
-execute store result score #0 bs.ctx run data get storage bs:out random.white_noise_mat_1d[0] 1000
-execute store result score #1 bs.ctx run data get storage bs:out random.white_noise_mat_1d[1] 1000
-execute store result score #2 bs.ctx run data get storage bs:out random.white_noise_mat_1d[2] 1000
-execute store result score #3 bs.ctx run data get storage bs:out random.white_noise_mat_1d[3] 1000
-execute store result score #4 bs.ctx run data get storage bs:out random.white_noise_mat_1d[4] 1000
-execute store result score #5 bs.ctx run data get storage bs:out random.white_noise_mat_1d[5] 1000
-execute if score #0 bs.ctx = #1 bs.ctx if score #1 bs.ctx = #2 bs.ctx if score #2 bs.ctx = #3 bs.ctx if score #3 bs.ctx = #4 bs.ctx if score #4 bs.ctx = #5 bs.ctx run fail "White noise should not always return the same value"
diff --git a/datapacks/Bookshelf/data/bs.random/test/noise/white_noise_mat_2d.mcfunction b/datapacks/Bookshelf/data/bs.random/test/noise/white_noise_mat_2d.mcfunction
deleted file mode 100644
index 65c0b724b4..0000000000
--- a/datapacks/Bookshelf/data/bs.random/test/noise/white_noise_mat_2d.mcfunction
+++ /dev/null
@@ -1,26 +0,0 @@
-# White noise 2d generates the right number of random values
-# @batch bs.random
-
-function #bs.random:white_noise_mat_2d {width:0,height:8,with:{}}
-execute store result score #n bs.ctx if data storage bs:out random.white_noise_mat_2d[]
-assert score #n bs.ctx matches 0
-
-function #bs.random:white_noise_mat_2d {width:8,height:0,with:{}}
-execute store result score #n bs.ctx if data storage bs:out random.white_noise_mat_2d[]
-assert score #n bs.ctx matches 0
-
-function #bs.random:white_noise_mat_2d {width:3,height:2,with:{}}
-execute store result score #n bs.ctx if data storage bs:out random.white_noise_mat_2d[]
-assert score #n bs.ctx matches 2
-execute store result score #n bs.ctx if data storage bs:out random.white_noise_mat_2d[0][]
-assert score #n bs.ctx matches 3
-execute store result score #n bs.ctx if data storage bs:out random.white_noise_mat_2d[1][]
-assert score #n bs.ctx matches 3
-
-execute store result score #0 bs.ctx run data get storage bs:out random.white_noise_mat_2d[0][0] 1000
-execute store result score #1 bs.ctx run data get storage bs:out random.white_noise_mat_2d[0][1] 1000
-execute store result score #2 bs.ctx run data get storage bs:out random.white_noise_mat_2d[0][2] 1000
-execute store result score #3 bs.ctx run data get storage bs:out random.white_noise_mat_2d[1][0] 1000
-execute store result score #4 bs.ctx run data get storage bs:out random.white_noise_mat_2d[1][1] 1000
-execute store result score #5 bs.ctx run data get storage bs:out random.white_noise_mat_2d[1][2] 1000
-execute if score #0 bs.ctx = #1 bs.ctx if score #1 bs.ctx = #2 bs.ctx if score #2 bs.ctx = #3 bs.ctx if score #3 bs.ctx = #4 bs.ctx if score #4 bs.ctx = #5 bs.ctx run fail "White noise should not always return the same value"
diff --git a/datapacks/Bookshelf/data/bs.random/test/weighted_choice.mcfunction b/datapacks/Bookshelf/data/bs.random/test/weighted_choice.mcfunction
deleted file mode 100644
index 4523ba25c0..0000000000
--- a/datapacks/Bookshelf/data/bs.random/test/weighted_choice.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# Weighted choice should return a random index and its value
-# @batch bs.random
-
-# return a value that match the index
-data modify storage bs:in random.weighted_choice.options set value [0,1,2,3,4]
-execute store result score #i bs.ctx run function #bs.random:weighted_choice
-execute if score #i bs.ctx matches 0 run assert data storage bs:out random{weighted_choice:0}
-execute if score #i bs.ctx matches 1 run assert data storage bs:out random{weighted_choice:1}
-execute if score #i bs.ctx matches 2 run assert data storage bs:out random{weighted_choice:2}
-execute if score #i bs.ctx matches 3 run assert data storage bs:out random{weighted_choice:3}
-execute if score #i bs.ctx matches 4 run assert data storage bs:out random{weighted_choice:4}
-
-# the weight has an impact on the returned value
-data modify storage bs:in random.weighted_choice.options set value [0,42,0,0,0,0]
-data modify storage bs:in random.weighted_choice.weights set value [0,1,0,0,0,0]
-execute store result score #i bs.ctx run function #bs.random:weighted_choice
-assert data storage bs:out random{weighted_choice:42}
-assert score #i bs.ctx matches 1
diff --git a/datapacks/Bookshelf/data/bs.raycast/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.raycast/.metadata/generated/features.json
deleted file mode 100644
index 5271157aa7..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/.metadata/generated/features.json
+++ /dev/null
@@ -1,20 +0,0 @@
-[
- {
- "name": "run",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/raycast.html#run-the-raycast",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/09",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/04/02",
- "version": "1.20.4"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.raycast/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.raycast/.metadata/generated/module.json
deleted file mode 100644
index 481d0e3ce1..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/.metadata/generated/module.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": "bs.raycast",
- "display_name": "Raycast",
- "description": "Cast rays and see if they collide with blocks or entities.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/raycast.html",
- "authors": [
- "Aksiome"
- ],
- "dependencies": [
- "bs.hitbox"
- ],
- "features": [
- "bs.raycast:run"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.raycast/.metadata/module.json b/datapacks/Bookshelf/data/bs.raycast/.metadata/module.json
deleted file mode 100644
index c9b4e3b657..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.raycast",
- "display_name": "Raycast",
- "description": "Cast rays and see if they collide with blocks or entities.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/raycast.html"
-}
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/__help__.mcfunction
deleted file mode 100644
index ed02d104bc..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/raycast.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.raycast documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/raycast.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/__load__.mcfunction
deleted file mode 100644
index 7a9ee73e61..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/__load__.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/raycast.html
-# ------------------------------------------------------------------------------------------------------------
-
-forceload add -30000000 1600
-execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
-
-scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/__unload__.mcfunction
deleted file mode 100644
index bd9592a765..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/__unload__.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/raycast.html
-# ------------------------------------------------------------------------------------------------------------
-
-kill B5-0-0-0-1
-forceload remove -30000000 1600
-
-scoreboard objectives remove bs.data
-
-data remove storage bs:data raycast
-data remove storage bs:out raycast
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/check/block/any.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/check/block/any.mcfunction
deleted file mode 100644
index 5d2d5a4d54..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/check/block/any.mcfunction
+++ /dev/null
@@ -1,30 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute unless block ~ ~ ~ #bs.hitbox:is_composite run return run function bs.raycast:collide/cube
-
-function #bs.hitbox:get_block
-execute store result score #raycast.ox bs.data run data get storage bs:out hitbox.offset.x 10000000
-execute store result score #raycast.oz bs.data run data get storage bs:out hitbox.offset.z 10000000
-
-execute if score #raycast.ux bs.data matches 0.. run scoreboard players operation #raycast.lx bs.data -= #raycast.dx bs.data
-execute if score #raycast.uy bs.data matches 0.. run scoreboard players operation #raycast.ly bs.data -= #raycast.dy bs.data
-execute if score #raycast.uz bs.data matches 0.. run scoreboard players operation #raycast.lz bs.data -= #raycast.dz bs.data
-function bs.raycast:check/block/shape
-execute if score #raycast.ux bs.data matches 0.. run scoreboard players operation #raycast.lx bs.data += #raycast.dx bs.data
-execute if score #raycast.uy bs.data matches 0.. run scoreboard players operation #raycast.ly bs.data += #raycast.dy bs.data
-execute if score #raycast.uz bs.data matches 0.. run scoreboard players operation #raycast.lz bs.data += #raycast.dz bs.data
-
-execute unless score #raycast.distance bs.data matches 2147483647 run function bs.raycast:collide/block
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/check/block/shape.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/check/block/shape.mcfunction
deleted file mode 100644
index 62f6b7658c..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/check/block/shape.mcfunction
+++ /dev/null
@@ -1,63 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# get hitbox coordinates
-execute store result score #x bs.ctx run data get storage bs:out hitbox.shape[-1][0] 625000
-execute store result score #y bs.ctx run data get storage bs:out hitbox.shape[-1][1] 625000
-execute store result score #z bs.ctx run data get storage bs:out hitbox.shape[-1][2] 625000
-execute store result score #i bs.ctx run data get storage bs:out hitbox.shape[-1][3] 625000
-execute store result score #j bs.ctx run data get storage bs:out hitbox.shape[-1][4] 625000
-execute store result score #k bs.ctx run data get storage bs:out hitbox.shape[-1][5] 625000
-data remove storage bs:out hitbox.shape[-1]
-
-# offset coordinates if needed
-scoreboard players operation #x bs.ctx += #raycast.ox bs.data
-scoreboard players operation #i bs.ctx += #raycast.ox bs.data
-scoreboard players operation #z bs.ctx += #raycast.oz bs.data
-scoreboard players operation #k bs.ctx += #raycast.oz bs.data
-
-# when step is negative, ray is one step further and hitbox coordinates should be negative
-scoreboard players operation #x bs.ctx /= #raycast.ux bs.data
-scoreboard players operation #i bs.ctx /= #raycast.ux bs.data
-scoreboard players operation #y bs.ctx /= #raycast.uy bs.data
-scoreboard players operation #j bs.ctx /= #raycast.uy bs.data
-scoreboard players operation #z bs.ctx /= #raycast.uz bs.data
-scoreboard players operation #k bs.ctx /= #raycast.uz bs.data
-
-# when step is negative we need to reverse near and far points
-execute if score #raycast.ux bs.data matches ..-1 run scoreboard players operation #x bs.ctx >< #i bs.ctx
-execute if score #raycast.uy bs.data matches ..-1 run scoreboard players operation #y bs.ctx >< #j bs.ctx
-execute if score #raycast.uz bs.data matches ..-1 run scoreboard players operation #z bs.ctx >< #k bs.ctx
-
-# compute near and far points for AABB collision
-execute store result score #raycast.tmin bs.data run scoreboard players operation #x bs.ctx += #raycast.lx bs.data
-execute store result score #raycast.tmax bs.data run scoreboard players operation #i bs.ctx += #raycast.lx bs.data
-scoreboard players operation #y bs.ctx += #raycast.ly bs.data
-scoreboard players operation #j bs.ctx += #raycast.ly bs.data
-scoreboard players operation #z bs.ctx += #raycast.lz bs.data
-scoreboard players operation #k bs.ctx += #raycast.lz bs.data
-scoreboard players operation #raycast.tmin bs.data > #y bs.ctx
-scoreboard players operation #raycast.tmin bs.data > #z bs.ctx
-scoreboard players operation #raycast.tmax bs.data < #j bs.ctx
-scoreboard players operation #raycast.tmax bs.data < #k bs.ctx
-
-# if tmin <= tmax, ray is intersecting with AABB, if tmax < 0, ray is intersecting AABB, but the whole AABB is behind
-execute if score #raycast.tmax bs.data matches 0.. \
- if score #raycast.tmin bs.data <= #raycast.tmax bs.data \
- if score #raycast.tmin bs.data < #raycast.distance bs.data \
- if score #raycast.tmin bs.data <= #raycast.max_distance bs.data \
- run function bs.raycast:collide/shape
-
-execute if data storage bs:out hitbox.shape[-1] run function bs.raycast:check/block/shape
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/check/entity/any.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/check/entity/any.mcfunction
deleted file mode 100644
index b102f27dd7..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/check/entity/any.mcfunction
+++ /dev/null
@@ -1,27 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-function #bs.hitbox:get_entity
-execute if entity @s[type=!#bs.hitbox:is_shaped] run return run function bs.raycast:check/entity/size
-
-execute if score #raycast.ux bs.data matches 0.. run scoreboard players operation #raycast.lx bs.data -= #raycast.dx bs.data
-execute if score #raycast.uy bs.data matches 0.. run scoreboard players operation #raycast.ly bs.data -= #raycast.dy bs.data
-execute if score #raycast.uz bs.data matches 0.. run scoreboard players operation #raycast.lz bs.data -= #raycast.dz bs.data
-function bs.raycast:check/entity/shape
-execute if score #raycast.ux bs.data matches 0.. run scoreboard players operation #raycast.lx bs.data += #raycast.dx bs.data
-execute if score #raycast.uy bs.data matches 0.. run scoreboard players operation #raycast.ly bs.data += #raycast.dy bs.data
-execute if score #raycast.uz bs.data matches 0.. run scoreboard players operation #raycast.lz bs.data += #raycast.dz bs.data
-
-execute unless score #raycast.distance bs.data matches 2147483647 run function bs.raycast:collide/entity
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/check/entity/shape.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/check/entity/shape.mcfunction
deleted file mode 100644
index 0a7a0726f0..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/check/entity/shape.mcfunction
+++ /dev/null
@@ -1,57 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# get hitbox coordinates
-execute store result score #x bs.ctx run data get storage bs:out hitbox.shape[-1][0] 625000
-execute store result score #y bs.ctx run data get storage bs:out hitbox.shape[-1][1] 625000
-execute store result score #z bs.ctx run data get storage bs:out hitbox.shape[-1][2] 625000
-execute store result score #i bs.ctx run data get storage bs:out hitbox.shape[-1][3] 625000
-execute store result score #j bs.ctx run data get storage bs:out hitbox.shape[-1][4] 625000
-execute store result score #k bs.ctx run data get storage bs:out hitbox.shape[-1][5] 625000
-data remove storage bs:out hitbox.shape[-1]
-
-# when step is negative, ray is one step further and hitbox coordinates should be negative
-scoreboard players operation #x bs.ctx /= #raycast.ux bs.data
-scoreboard players operation #i bs.ctx /= #raycast.ux bs.data
-scoreboard players operation #y bs.ctx /= #raycast.uy bs.data
-scoreboard players operation #j bs.ctx /= #raycast.uy bs.data
-scoreboard players operation #z bs.ctx /= #raycast.uz bs.data
-scoreboard players operation #k bs.ctx /= #raycast.uz bs.data
-
-# when step is negative we need to reverse near and far points
-execute if score #raycast.ux bs.data matches ..-1 run scoreboard players operation #x bs.ctx >< #i bs.ctx
-execute if score #raycast.uy bs.data matches ..-1 run scoreboard players operation #y bs.ctx >< #j bs.ctx
-execute if score #raycast.uz bs.data matches ..-1 run scoreboard players operation #z bs.ctx >< #k bs.ctx
-
-# compute near and far points for AABB collision
-execute store result score #raycast.tmin bs.data run scoreboard players operation #x bs.ctx += #raycast.lx bs.data
-execute store result score #raycast.tmax bs.data run scoreboard players operation #i bs.ctx += #raycast.lx bs.data
-scoreboard players operation #y bs.ctx += #raycast.ly bs.data
-scoreboard players operation #j bs.ctx += #raycast.ly bs.data
-scoreboard players operation #z bs.ctx += #raycast.lz bs.data
-scoreboard players operation #k bs.ctx += #raycast.lz bs.data
-scoreboard players operation #raycast.tmin bs.data > #y bs.ctx
-scoreboard players operation #raycast.tmin bs.data > #z bs.ctx
-scoreboard players operation #raycast.tmax bs.data < #j bs.ctx
-scoreboard players operation #raycast.tmax bs.data < #k bs.ctx
-
-# if tmin <= tmax, ray is intersecting with AABB, if tmax < 0, ray is intersecting AABB, but the whole AABB is behind
-execute if score #raycast.tmax bs.data matches 0.. \
- if score #raycast.tmin bs.data <= #raycast.tmax bs.data \
- if score #raycast.tmin bs.data < #raycast.distance bs.data \
- if score #raycast.tmin bs.data <= #raycast.max_distance bs.data \
- run function bs.raycast:collide/shape
-
-execute if data storage bs:out hitbox.shape[-1] run function bs.raycast:check/entity/shape
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/check/entity/size.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/check/entity/size.mcfunction
deleted file mode 100644
index 4b295d958b..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/check/entity/size.mcfunction
+++ /dev/null
@@ -1,65 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-tag @s add bs.raycast.omit
-
-# get the entity relative coordinates
-execute in minecraft:overworld positioned as @s as B5-0-0-0-1 run function bs.raycast:compute/entity_rpos with storage bs:data raycast
-execute store result score #x bs.ctx run data get storage bs:ctx _[0] 10000000
-execute store result score #y bs.ctx run data get storage bs:ctx _[1] 10000000
-execute store result score #z bs.ctx run data get storage bs:ctx _[2] 10000000
-execute store result score #i bs.ctx run scoreboard players operation #x bs.ctx += #raycast.x bs.data
-execute store result score #j bs.ctx run scoreboard players operation #y bs.ctx += #raycast.y bs.data
-execute store result score #k bs.ctx run scoreboard players operation #z bs.ctx += #raycast.z bs.data
-
-# compute hitbox coordinates (using width and height)
-execute store result score #raycast.h bs.data run data get storage bs:out hitbox.height 10000
-execute store result score #raycast.w bs.data run data get storage bs:out hitbox.width 5000
-execute store result score #raycast.s bs.data run data get storage bs:out hitbox.scale 1000
-scoreboard players operation #raycast.h bs.data *= #raycast.s bs.data
-scoreboard players operation #raycast.w bs.data *= #raycast.s bs.data
-scoreboard players operation #x bs.ctx -= #raycast.w bs.data
-scoreboard players operation #z bs.ctx -= #raycast.w bs.data
-scoreboard players operation #i bs.ctx += #raycast.w bs.data
-scoreboard players operation #j bs.ctx += #raycast.h bs.data
-scoreboard players operation #k bs.ctx += #raycast.w bs.data
-
-# when step is negative, points are negative so we get the absolute value
-scoreboard players operation #x bs.ctx /= #raycast.ux bs.data
-scoreboard players operation #i bs.ctx /= #raycast.ux bs.data
-scoreboard players operation #y bs.ctx /= #raycast.uy bs.data
-scoreboard players operation #j bs.ctx /= #raycast.uy bs.data
-scoreboard players operation #z bs.ctx /= #raycast.uz bs.data
-scoreboard players operation #k bs.ctx /= #raycast.uz bs.data
-
-# when step is negative we need to reverse near and far points
-execute if score #raycast.ux bs.data matches ..-1 run scoreboard players operation #x bs.ctx >< #i bs.ctx
-execute if score #raycast.uy bs.data matches ..-1 run scoreboard players operation #y bs.ctx >< #j bs.ctx
-execute if score #raycast.uz bs.data matches ..-1 run scoreboard players operation #z bs.ctx >< #k bs.ctx
-
-# compute near and far points for AABB collision
-scoreboard players operation #raycast.tmin bs.data = #x bs.ctx
-scoreboard players operation #raycast.tmax bs.data = #i bs.ctx
-scoreboard players operation #raycast.tmin bs.data > #y bs.ctx
-scoreboard players operation #raycast.tmin bs.data > #z bs.ctx
-scoreboard players operation #raycast.tmax bs.data < #j bs.ctx
-scoreboard players operation #raycast.tmax bs.data < #k bs.ctx
-
-# if tmin <= tmax, ray is intersecting with AABB, if tmax < 0, ray is intersecting AABB, but the whole AABB is behind
-execute if score #raycast.tmax bs.data matches 0.. \
- if score #raycast.tmin bs.data <= #raycast.tmax bs.data \
- if score #raycast.tmin bs.data < #raycast.distance bs.data \
- if score #raycast.tmin bs.data <= #raycast.max_distance bs.data \
- run function bs.raycast:collide/size
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/collide/block.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/collide/block.mcfunction
deleted file mode 100644
index 4962b389ef..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/collide/block.mcfunction
+++ /dev/null
@@ -1,26 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# compute output data and run callbacks
-tp @s ~ ~ ~
-data modify storage bs:out raycast.targeted_block set from entity @s Pos
-execute store result storage bs:out raycast.distance double .001 run scoreboard players get #raycast.distance bs.data
-execute if data storage bs:data raycast.on_targeted_block at @s run function bs.raycast:react/targeted_block with storage bs:data raycast
-execute summon minecraft:marker run function bs.raycast:compute/hit_point with storage bs:out raycast
-
-# stop the recursion if piercing is 0
-execute unless score #raycast.piercing bs.data matches 0 run scoreboard players set #raycast.distance bs.data 2147483647
-execute if score #raycast.piercing bs.data matches 0 run scoreboard players set #raycast.max_distance bs.data -2147483648
-scoreboard players remove #raycast.piercing bs.data 1
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/collide/cube.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/collide/cube.mcfunction
deleted file mode 100644
index 50d73217c1..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/collide/cube.mcfunction
+++ /dev/null
@@ -1,33 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# compute the travelled distance
-scoreboard players operation #raycast.lx bs.data -= #raycast.dx bs.data
-scoreboard players operation #raycast.ly bs.data -= #raycast.dy bs.data
-execute store result score #raycast.distance bs.data run scoreboard players operation #raycast.lz bs.data -= #raycast.dz bs.data
-scoreboard players operation #raycast.distance bs.data > #raycast.lx bs.data
-scoreboard players operation #raycast.distance bs.data > #raycast.ly bs.data
-
-# get the normal of the surface that was hit
-data modify storage bs:out raycast.hit_normal set value [0,0,0]
-execute if score #raycast.distance bs.data = #raycast.lx bs.data store result storage bs:out raycast.hit_normal[0] int -1 run data get storage bs:data raycast.sx
-execute if score #raycast.distance bs.data = #raycast.ly bs.data store result storage bs:out raycast.hit_normal[1] int -1 run data get storage bs:data raycast.sy
-execute if score #raycast.distance bs.data = #raycast.lz bs.data store result storage bs:out raycast.hit_normal[2] int -1 run data get storage bs:data raycast.sz
-
-scoreboard players operation #raycast.lx bs.data += #raycast.dx bs.data
-scoreboard players operation #raycast.ly bs.data += #raycast.dy bs.data
-scoreboard players operation #raycast.lz bs.data += #raycast.dz bs.data
-
-function bs.raycast:collide/block
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/collide/shape.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/collide/shape.mcfunction
deleted file mode 100644
index 20f78e4656..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/collide/shape.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# get the travelled distance
-scoreboard players operation #raycast.distance bs.data = #raycast.tmin bs.data
-
-# get the normal of the surface that was hit
-data modify storage bs:out raycast.hit_normal set value [0,0,0]
-execute if score #raycast.distance bs.data = #x bs.ctx store result storage bs:out raycast.hit_normal[0] int -1 run data get storage bs:data raycast.sx
-execute if score #raycast.distance bs.data = #y bs.ctx store result storage bs:out raycast.hit_normal[1] int -1 run data get storage bs:data raycast.sy
-execute if score #raycast.distance bs.data = #z bs.ctx store result storage bs:out raycast.hit_normal[2] int -1 run data get storage bs:data raycast.sz
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/collide/size.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/collide/size.mcfunction
deleted file mode 100644
index 717801b35d..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/collide/size.mcfunction
+++ /dev/null
@@ -1,25 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# stop the recursion then get the travelled distance
-scoreboard players operation #raycast.distance bs.data = #raycast.tmin bs.data
-
-# get the normal of the surface that was hit
-data modify storage bs:out raycast.hit_normal set value [0,0,0]
-execute if score #raycast.distance bs.data = #x bs.ctx store result storage bs:out raycast.hit_normal[0] int -1 run data get storage bs:data raycast.sx
-execute if score #raycast.distance bs.data = #y bs.ctx store result storage bs:out raycast.hit_normal[1] int -1 run data get storage bs:data raycast.sy
-execute if score #raycast.distance bs.data = #z bs.ctx store result storage bs:out raycast.hit_normal[2] int -1 run data get storage bs:data raycast.sz
-
-function bs.raycast:collide/entity
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/compute/hit_point.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/compute/hit_point.mcfunction
deleted file mode 100644
index b5ade35521..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/compute/hit_point.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify entity @s Pos set from storage bs:data raycast.pos
-$execute positioned as @s run tp @s ^ ^ ^$(distance)
-data modify storage bs:out raycast.hit_point set from entity @s Pos
-execute if data storage bs:data raycast.on_hit_point at @s run function bs.raycast:react/hit_point with storage bs:data raycast
-kill @s
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/react/hit_point.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/react/hit_point.mcfunction
deleted file mode 100644
index 3af5330020..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/react/hit_point.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$$(on_hit_point)
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/recurse/init.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/recurse/init.mcfunction
deleted file mode 100644
index a06b52514b..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/recurse/init.mcfunction
+++ /dev/null
@@ -1,54 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data raycast.pos set from entity @s Pos
-execute store result storage bs:data raycast.x int -1 run data get storage bs:data raycast.pos[0]
-execute store result storage bs:data raycast.y int -1 run data get storage bs:data raycast.pos[1]
-execute store result storage bs:data raycast.z int -1 run data get storage bs:data raycast.pos[2]
-
-# get the unit vector [ux,uz,uz]
-execute positioned 0.0 0.0 0.0 positioned ^ ^ ^10 run tp @s ~ ~ ~
-data modify storage bs:ctx _ set from entity @s Pos
-execute store result score #raycast.ux bs.data run data get storage bs:ctx _[0] 1000
-execute store result score #raycast.uy bs.data run data get storage bs:ctx _[1] 1000
-execute store result score #raycast.uz bs.data run data get storage bs:ctx _[2] 1000
-
-# compute the delta [dx,dy,dz] (distance to advance to the next grid intersection)
-data modify storage bs:data raycast merge value {sx:1,sy:1,sz:1}
-execute store result score #raycast.dx bs.data store result score #raycast.dy bs.data run scoreboard players set #raycast.dz bs.data 10000000
-execute if score #raycast.ux bs.data matches ..-1 store result storage bs:data raycast.sx int .0000001 run scoreboard players set #raycast.dx bs.data -10000000
-execute if score #raycast.uy bs.data matches ..-1 store result storage bs:data raycast.sy int .0000001 run scoreboard players set #raycast.dy bs.data -10000000
-execute if score #raycast.uz bs.data matches ..-1 store result storage bs:data raycast.sz int .0000001 run scoreboard players set #raycast.dz bs.data -10000000
-scoreboard players operation #raycast.dx bs.data /= #raycast.ux bs.data
-scoreboard players operation #raycast.dy bs.data /= #raycast.uy bs.data
-scoreboard players operation #raycast.dz bs.data /= #raycast.uz bs.data
-
-# compute the length [lx,ly,lz] (distance from the origin to the next grid intersection)
-function bs.raycast:compute/init_rpos with storage bs:data raycast
-execute store result score #raycast.x bs.data store result score #raycast.lx bs.data run data get storage bs:ctx _[0] -10000000
-execute store result score #raycast.y bs.data store result score #raycast.ly bs.data run data get storage bs:ctx _[1] -10000000
-execute store result score #raycast.z bs.data store result score #raycast.lz bs.data run data get storage bs:ctx _[2] -10000000
-execute if score #raycast.ux bs.data matches 0.. run scoreboard players add #raycast.lx bs.data 10000000
-execute if score #raycast.uy bs.data matches 0.. run scoreboard players add #raycast.ly bs.data 10000000
-execute if score #raycast.uz bs.data matches 0.. run scoreboard players add #raycast.lz bs.data 10000000
-scoreboard players operation #raycast.lx bs.data /= #raycast.ux bs.data
-scoreboard players operation #raycast.ly bs.data /= #raycast.uy bs.data
-scoreboard players operation #raycast.lz bs.data /= #raycast.uz bs.data
-
-# run the recursion loop
-execute if data storage bs:data raycast{entities:1b} run data modify storage bs:data raycast.entities set value "!bs.raycast.omit"
-execute align xyz run function bs.raycast:recurse/next with storage bs:data raycast
-
-kill @s
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/recurse/next.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/recurse/next.mcfunction
deleted file mode 100644
index 947e331f26..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/recurse/next.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# check block and entity collision (debug: particle minecraft:block_marker{block_state:"barrier"} ~.5 ~.5 ~.5 0 0 0 0 1)
-$execute unless data storage bs:data raycast{blocks:0b} unless block ~ ~ ~ $(ignored_blocks) run function bs.raycast:check/block/any
-$execute unless data storage bs:data raycast{entities:0b} as @e[type=!$(ignored_entities),tag=$(entities),tag=!bs.raycast.omit,dx=0] run function bs.raycast:check/entity/any
-
-# advance on the grid by the shortest length
-execute if score #raycast.lx bs.data <= #raycast.ly bs.data if score #raycast.lx bs.data <= #raycast.lz bs.data if score #raycast.lx bs.data <= #raycast.max_distance bs.data run return run function bs.raycast:recurse/x with storage bs:data raycast
-execute if score #raycast.ly bs.data <= #raycast.lz bs.data if score #raycast.ly bs.data <= #raycast.max_distance bs.data run return run function bs.raycast:recurse/y with storage bs:data raycast
-execute if score #raycast.lz bs.data <= #raycast.max_distance bs.data run return run function bs.raycast:recurse/z with storage bs:data raycast
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/recurse/x.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/recurse/x.mcfunction
deleted file mode 100644
index ae55815888..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/recurse/x.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# increment length by delta on x then move to the next block on the grid
-scoreboard players operation #raycast.lx bs.data += #raycast.dx bs.data
-$execute positioned ~$(sx) ~ ~ run return run function bs.raycast:recurse/next with storage bs:data raycast
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/recurse/y.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/recurse/y.mcfunction
deleted file mode 100644
index 0cd3871cbb..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/recurse/y.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# increment length by delta on y then move to the next block on the grid
-scoreboard players operation #raycast.ly bs.data += #raycast.dy bs.data
-$execute positioned ~ ~$(sy) ~ run return run function bs.raycast:recurse/next with storage bs:data raycast
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/recurse/z.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/recurse/z.mcfunction
deleted file mode 100644
index 96dca547bc..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/recurse/z.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# increment length by delta on z then move to the next block on the grid
-scoreboard players operation #raycast.lz bs.data += #raycast.dz bs.data
-$execute positioned ~ ~ ~$(sz) run return run function bs.raycast:recurse/next with storage bs:data raycast
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/run.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/run.mcfunction
deleted file mode 100644
index 5461200e1a..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/run.mcfunction
+++ /dev/null
@@ -1,25 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/raycast.html#run-the-raycast
-# ------------------------------------------------------------------------------------------------------------
-
-tag @s add bs.raycast.omit
-scoreboard players set #raycast.distance bs.data 2147483647
-execute store result score #raycast.piercing bs.data run data get storage bs:data raycast.piercing
-execute store result score #raycast.max_distance bs.data run data get storage bs:data raycast.max_distance 1000
-data modify storage bs:out raycast set value {distance:0d,hit_normal:[0,0,0]}
-execute summon minecraft:marker run function bs.raycast:recurse/init
-tag @e[tag=bs.raycast.omit] remove bs.raycast.omit
-return run execute unless score #raycast.distance bs.data matches 2147483647
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/with.mcfunction b/datapacks/Bookshelf/data/bs.raycast/function/with.mcfunction
deleted file mode 100644
index b9bc0f59c5..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/function/with.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data raycast set value { \
- blocks: true, \
- entities: false, \
- max_distance: 16.0, \
- ignored_blocks: "#bs.hitbox:intangible", \
- ignored_entities: "#bs.hitbox:intangible", \
-}
-$data modify storage bs:data raycast merge value $(with)
diff --git a/datapacks/Bookshelf/data/bs.raycast/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.raycast/tags/function/exclusive_load.json
deleted file mode 100644
index d3292032e0..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.raycast:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.raycast/tags/function/help.json b/datapacks/Bookshelf/data/bs.raycast/tags/function/help.json
deleted file mode 100644
index 1c6074e261..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.raycast:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.raycast/tags/function/load.json b/datapacks/Bookshelf/data/bs.raycast/tags/function/load.json
deleted file mode 100644
index 65d92b428c..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/tags/function/load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#bs.hitbox:load",
- "bs.raycast:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.raycast/tags/function/run.json b/datapacks/Bookshelf/data/bs.raycast/tags/function/run.json
deleted file mode 100644
index 13d0dd61e2..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/tags/function/run.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/raycast.html#run-the-raycast",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/09",
- "minecraft_version": "1.20.2"
- },
- "updated": {
- "date": "2024/04/02",
- "minecraft_version": "1.20.4"
- }
- },
- "values": [
- "bs.raycast:with",
- "bs.raycast:run"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.raycast/tags/function/unload.json b/datapacks/Bookshelf/data/bs.raycast/tags/function/unload.json
deleted file mode 100644
index 8ceedab1e3..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.raycast:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.raycast/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.raycast/test/__boot__.mcfunction
deleted file mode 100644
index 2b4381ea9b..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.raycast
-# @beforebatch function #bs.raycast:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.raycast/test/block/check_shape.mcfunction b/datapacks/Bookshelf/data/bs.raycast/test/block/check_shape.mcfunction
deleted file mode 100644
index 4faa9dd04a..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/test/block/check_shape.mcfunction
+++ /dev/null
@@ -1,15 +0,0 @@
-# Casting a ray through a composite shape behave as expected
-# @batch bs.raycast
-
-fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
-setblock ~ ~ ~ minecraft:oak_stairs[facing=east]
-execute positioned ~1.5 ~ ~.5 facing ~-.5 ~.52 ~ run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
-execute positioned ~-.5 ~ ~.5 facing ~.5 ~.52 ~ run function #bs.raycast:run {with:{}}
-execute if data storage bs:out raycast.targeted_block run fail "Should not detect a targeted block"
-
-setblock ~ ~ ~ minecraft:oak_stairs[facing=west]
-execute positioned ~-.5 ~ ~.5 facing ~.5 ~.52 ~ run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
-execute positioned ~1.5 ~ ~.5 facing ~-.5 ~.52 ~ run function #bs.raycast:run {with:{}}
-execute if data storage bs:out raycast.targeted_block run fail "Should not detect a targeted block"
diff --git a/datapacks/Bookshelf/data/bs.raycast/test/block/ignored_blocks.mcfunction b/datapacks/Bookshelf/data/bs.raycast/test/block/ignored_blocks.mcfunction
deleted file mode 100644
index 5fbd10d798..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/test/block/ignored_blocks.mcfunction
+++ /dev/null
@@ -1,6 +0,0 @@
-# Ray stop on non ignored_blocks
-# @batch bs.raycast
-
-setblock ~ ~ ~1 minecraft:light
-execute positioned ~.5 ~ ~ run function #bs.raycast:run {with:{ignored_blocks:"minecraft:air"}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/datapacks/Bookshelf/data/bs.raycast/test/block/max_distance.mcfunction b/datapacks/Bookshelf/data/bs.raycast/test/block/max_distance.mcfunction
deleted file mode 100644
index 25ad680445..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/test/block/max_distance.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Ray stop at max_distance
-# @batch bs.raycast
-
-setblock ~ ~ ~1 minecraft:bookshelf
-execute positioned ~.5 ~ ~ run function #bs.raycast:run {with:{max_distance:1}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
-execute positioned ~.5 ~ ~ run function #bs.raycast:run {with:{max_distance:.9}}
-execute if data storage bs:out raycast.targeted_block run fail "Should not detect a targeted block"
diff --git a/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_nnn.mcfunction b/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_nnn.mcfunction
deleted file mode 100644
index 801f9d3881..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_nnn.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Casting a ray facing [-x,-y,-z] behave as expected
-# @batch bs.raycast
-
-setblock ~-1 ~ ~-1 minecraft:bookshelf
-execute positioned ~.5 ~1 ~.5 facing ~-.51 ~-1.01 ~-1.49 run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
-execute positioned ~.5 ~1 ~.5 facing ~-1.49 ~-1.01 ~-.51 run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_nnp.mcfunction b/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_nnp.mcfunction
deleted file mode 100644
index a96e9689b3..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_nnp.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Casting a ray facing [-x,-y,+z] behave as expected
-# @batch bs.raycast
-
-setblock ~-1 ~ ~1 minecraft:bookshelf
-execute positioned ~.5 ~1 ~.5 facing ~-.51 ~-1.01 ~1.49 run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
-execute positioned ~.5 ~1 ~.5 facing ~-1.49 ~-1.01 ~.51 run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_npn.mcfunction b/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_npn.mcfunction
deleted file mode 100644
index bb8d52ea15..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_npn.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Casting a ray facing [-x,+y,-z] behave as expected
-# @batch bs.raycast
-
-setblock ~-1 ~ ~-1 minecraft:bookshelf
-execute positioned ~.5 ~ ~.5 facing ~-.51 ~.99 ~-1.49 run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
-execute positioned ~.5 ~ ~.5 facing ~-1.49 ~.99 ~-.51 run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_npp.mcfunction b/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_npp.mcfunction
deleted file mode 100644
index 11f697cff5..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_npp.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Casting a ray facing [-x,+y,+z] behave as expected
-# @batch bs.raycast
-
-setblock ~-1 ~ ~1 minecraft:bookshelf
-execute positioned ~.5 ~ ~.5 facing ~-.51 ~.99 ~1.49 run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
-execute positioned ~.5 ~ ~.5 facing ~-1.49 ~.99 ~.51 run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_pnp.mcfunction b/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_pnp.mcfunction
deleted file mode 100644
index c1d29a5893..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_pnp.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Casting a ray facing [+x,-y,+z] behave as expected
-# @batch bs.raycast
-
-setblock ~1 ~ ~1 minecraft:bookshelf
-execute positioned ~.5 ~1 ~.5 facing ~.51 ~-1.01 ~1.49 run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
-execute positioned ~.5 ~1 ~.5 facing ~1.49 ~-1.01 ~.51 run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_ppn.mcfunction b/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_ppn.mcfunction
deleted file mode 100644
index 826e277a89..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_ppn.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Casting a ray facing [+x,+y,-z] behave as expected
-# @batch bs.raycast
-
-setblock ~1 ~ ~-1 minecraft:bookshelf
-execute positioned ~.5 ~ ~.5 facing ~.51 ~.99 ~-1.49 run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
-execute positioned ~.5 ~ ~.5 facing ~1.49 ~.99 ~-.51 run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_ppp.mcfunction b/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_ppp.mcfunction
deleted file mode 100644
index a0e9369438..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/test/block/recurse_ppp.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Casting a ray facing [+x,+y,+z] behave as expected
-# @batch bs.raycast
-
-setblock ~1 ~ ~1 minecraft:bookshelf
-execute positioned ~.5 ~ ~.5 facing ~.51 ~.99 ~1.49 run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
-execute positioned ~.5 ~ ~.5 facing ~1.49 ~.99 ~.51 run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/datapacks/Bookshelf/data/bs.raycast/test/block/recuse_pnn.mcfunction b/datapacks/Bookshelf/data/bs.raycast/test/block/recuse_pnn.mcfunction
deleted file mode 100644
index 4aac6f2443..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/test/block/recuse_pnn.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Casting a ray facing [+x,-y,-z] behave as expected
-# @batch bs.raycast
-
-setblock ~1 ~ ~-1 minecraft:bookshelf
-execute positioned ~.5 ~1 ~.5 facing ~.51 ~-1.01 ~-1.49 run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
-execute positioned ~.5 ~1 ~.5 facing ~1.49 ~-1.01 ~-.51 run function #bs.raycast:run {with:{}}
-execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/datapacks/Bookshelf/data/bs.raycast/test/entity/check_shape.mcfunction b/datapacks/Bookshelf/data/bs.raycast/test/entity/check_shape.mcfunction
deleted file mode 100644
index dc6f08a3fa..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/test/entity/check_shape.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Casting a ray through an entity shape behave as expected
-# @batch bs.raycast
-
-summon minecraft:item_frame ~ ~ ~ {Facing:0}
-execute positioned ~.5 ~.5 ~.5 facing ~ ~1 ~ run function #bs.raycast:run {with:{blocks:false,entities:true}}
-execute unless data storage bs:out raycast.targeted_entity run fail "Failed to detect a targeted entity"
-
-summon minecraft:item_frame ~ ~ ~ {Facing:1}
-execute positioned ~.5 ~.5 ~.5 facing ~ ~-1 ~ run function #bs.raycast:run {with:{blocks:false,entities:true}}
-execute unless data storage bs:out raycast.targeted_entity run fail "Failed to detect a targeted entity"
diff --git a/datapacks/Bookshelf/data/bs.raycast/test/entity/check_size.mcfunction b/datapacks/Bookshelf/data/bs.raycast/test/entity/check_size.mcfunction
deleted file mode 100644
index 9e65d6da51..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/test/entity/check_size.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Casting a ray through an entity behave as expected
-# @batch bs.raycast
-
-summon minecraft:armor_stand ~.5 ~ ~.5
-execute positioned ~1.5 ~1 ~.5 facing ~-.76 ~ ~.24 run function #bs.raycast:run {with:{blocks:false,entities:true}}
-execute unless data storage bs:out raycast.targeted_entity run fail "Failed to detect a targeted entity"
-execute positioned ~-.5 ~1 ~.5 facing ~.76 ~ ~-.24 run function #bs.raycast:run {with:{blocks:false,entities:true}}
-execute unless data storage bs:out raycast.targeted_entity run fail "Failed to detect a targeted entity"
diff --git a/datapacks/Bookshelf/data/bs.raycast/test/entity/ignored_entities.mcfunction b/datapacks/Bookshelf/data/bs.raycast/test/entity/ignored_entities.mcfunction
deleted file mode 100644
index 9b00409eb6..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/test/entity/ignored_entities.mcfunction
+++ /dev/null
@@ -1,6 +0,0 @@
-# Ray do not stop on ignored_entities
-# @batch bs.raycast
-
-summon minecraft:armor_stand ~.5 ~ ~.5
-execute positioned ~.5 ~ ~-.5 run function #bs.raycast:run {with:{blocks:false,entities:true,ignored_entities:"minecraft:armor_stand"}}
-execute if data storage bs:out raycast.targeted_entity run fail "Should not detect a targeted entity"
diff --git a/datapacks/Bookshelf/data/bs.raycast/test/entity/max_distance.mcfunction b/datapacks/Bookshelf/data/bs.raycast/test/entity/max_distance.mcfunction
deleted file mode 100644
index 4fe12a2526..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/test/entity/max_distance.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Ray stop at max_distance
-# @batch bs.raycast
-
-summon minecraft:interaction ~.5 ~ ~1.5 {width:1f,height:1f}
-execute positioned ~.5 ~ ~ run function #bs.raycast:run {with:{blocks:false,entities:true,max_distance:1}}
-execute unless data storage bs:out raycast.targeted_entity run fail "Failed to detect a targeted entity"
-execute positioned ~.5 ~ ~ run function #bs.raycast:run {with:{blocks:false,entities:true,max_distance:.9}}
-execute if data storage bs:out raycast.targeted_entity run fail "Should not detect a targeted entity"
diff --git a/datapacks/Bookshelf/data/bs.raycast/test/entity/tagged_entities.mcfunction b/datapacks/Bookshelf/data/bs.raycast/test/entity/tagged_entities.mcfunction
deleted file mode 100644
index 135023c916..0000000000
--- a/datapacks/Bookshelf/data/bs.raycast/test/entity/tagged_entities.mcfunction
+++ /dev/null
@@ -1,7 +0,0 @@
-# Ray stop only on tagged entities
-# @batch bs.raycast
-
-summon minecraft:armor_stand ~.5 ~ ~.5
-summon minecraft:armor_stand ~.5 ~ ~1.5 {UUID:[I;-1170214687,114379287,-1715952819,-561845151],Tags:["bs.packtest"]}
-execute positioned ~.5 ~ ~-.5 run function #bs.raycast:run {with:{blocks:false,entities:"bs.packtest"}}
-assert data storage bs:out raycast{targeted_entity:[I;-1170214687,114379287,-1715952819,-561845151]}
diff --git a/datapacks/Bookshelf/data/bs.schedule/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.schedule/.metadata/generated/features.json
deleted file mode 100644
index fe74057927..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/.metadata/generated/features.json
+++ /dev/null
@@ -1,75 +0,0 @@
-[
- {
- "name": "cancel_all",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html#cancel",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2023/09/10",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/01/20",
- "version": "1.20.4"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "cancel_one",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html#cancel",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2019/07/31",
- "version": "1.14"
- },
- "updated": {
- "date": "2024/01/20",
- "version": "1.20.4"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "clear",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html#clear",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2019/07/31",
- "version": "1.14"
- },
- "updated": {
- "date": "2024/01/20",
- "version": "1.20.4"
- }
- },
- {
- "name": "schedule",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html#schedule",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2019/07/31",
- "version": "1.14"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.schedule/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.schedule/.metadata/generated/module.json
deleted file mode 100644
index d5a35cbb90..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/.metadata/generated/module.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "bs.schedule",
- "display_name": "Schedule",
- "description": "Enhance command scheduling with this module, providing flexibility beyond vanilla capabilities. Cancel commands and maintain execution context (entity & location).",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "weak_dependencies": [
- "bs.log"
- ],
- "features": [
- "bs.schedule:cancel_all",
- "bs.schedule:cancel_one",
- "bs.schedule:clear",
- "bs.schedule:schedule"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.schedule/.metadata/module.json b/datapacks/Bookshelf/data/bs.schedule/.metadata/module.json
deleted file mode 100644
index 0ff278de14..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/.metadata/module.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "bs.schedule",
- "display_name": "Schedule",
- "description": "Enhance command scheduling with this module, providing flexibility beyond vanilla capabilities. Cancel commands and maintain execution context (entity & location).",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html",
- "weak_dependencies": [
- "bs.log"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.schedule/function/__help__.mcfunction
deleted file mode 100644
index 6f2cfccfd0..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.schedule documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.schedule/function/__load__.mcfunction
deleted file mode 100644
index 8db3770e3a..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/function/__load__.mcfunction
+++ /dev/null
@@ -1,36 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html
-# ------------------------------------------------------------------------------------------------------------
-
-forceload add -30000000 1600
-execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
-
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
-scoreboard objectives add bs.schedule.id dummy [{"text":"BS ","color":"dark_gray"},{"text":"Schedule ID","color":"aqua"}]
-
-data modify storage bs:const schedule.units set value [ \
- {name:"t",scale:1}, \
- {name:"tick",scale:1}, \
- {name:"s",scale:20}, \
- {name:"second",scale:20}, \
- {name:"m",scale:1200}, \
- {name:"minute",scale:1200}, \
- {name:"hour",scale:72000}, \
- {name:"h",scale:72000}, \
-]
-
-execute unless data storage bs:const log.messages[{namespaces: ["bs.schedule"]}] run data modify storage bs:const log.messages[{namespaces: ["bs"]}].namespaces append value "bs.schedule"
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.schedule/function/__unload__.mcfunction
deleted file mode 100644
index 826dc884f2..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/function/__unload__.mcfunction
+++ /dev/null
@@ -1,26 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html
-# ------------------------------------------------------------------------------------------------------------
-
-kill B5-0-0-0-1
-forceload remove -30000000 1600
-
-scoreboard objectives remove bs.ctx
-scoreboard objectives remove bs.data
-scoreboard objectives remove bs.schedule.id
-
-data remove storage bs:data schedule
-data remove storage bs:const schedule
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/clear.mcfunction b/datapacks/Bookshelf/data/bs.schedule/function/clear.mcfunction
deleted file mode 100644
index f7ff8121eb..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/function/clear.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/clear.html
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players set #schedule.suid bs.data 0
-data modify storage bs:data schedule.queue set value []
-schedule clear bs.schedule:execute/callback
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/execute/callback.mcfunction b/datapacks/Bookshelf/data/bs.schedule/function/execute/callback.mcfunction
deleted file mode 100644
index e02a21caa9..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/function/execute/callback.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data schedule.slice set value []
-execute store result storage bs:ctx y int 1 run time query gametime
-function bs.schedule:execute/slice with storage bs:ctx
-
-execute if data storage bs:data schedule.slice[-1] as B5-0-0-0-1 run function bs.schedule:execute/loop
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/execute/loop.mcfunction b/datapacks/Bookshelf/data/bs.schedule/function/execute/loop.mcfunction
deleted file mode 100644
index 541333e9b8..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/function/execute/loop.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify entity @s {} merge from storage bs:data schedule.slice[-1]
-execute if data storage bs:data schedule.slice[-1].esid run function bs.schedule:execute/run/with_entity with storage bs:data schedule.slice[-1]
-execute unless data storage bs:data schedule.slice[-1].esid run function bs.schedule:execute/run/without_entity with storage bs:data schedule.slice[-1]
-
-data remove storage bs:data schedule.slice[-1]
-execute if data storage bs:data schedule.slice[-1] run return run function bs.schedule:execute/loop
-tp @s -30000000 0 1600
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/execute/run/with_entity.mcfunction b/datapacks/Bookshelf/data/bs.schedule/function/execute/run/with_entity.mcfunction
deleted file mode 100644
index 98080e7f97..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/function/execute/run/with_entity.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute at @s in $(dimension) as @e[predicate=bs.schedule:target] run $(command)
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/schedule/callback.mcfunction b/datapacks/Bookshelf/data/bs.schedule/function/schedule/callback.mcfunction
deleted file mode 100644
index 7fb07eb9af..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/function/schedule/callback.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$return run schedule function bs.schedule:execute/callback $(time)t append
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/schedule/context/get_custom_dimension.mcfunction b/datapacks/Bookshelf/data/bs.schedule/function/schedule/context/get_custom_dimension.mcfunction
deleted file mode 100644
index 04d6dbcd35..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/function/schedule/context/get_custom_dimension.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx _.dimension set from entity @s Brain.memories.minecraft:home.value.dimension
-kill @s
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/schedule/context/get_dimension.mcfunction b/datapacks/Bookshelf/data/bs.schedule/function/schedule/context/get_dimension.mcfunction
deleted file mode 100644
index a42c0e3428..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/function/schedule/context/get_dimension.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute if dimension minecraft:overworld run return run data modify storage bs:ctx _.dimension set value "minecraft:overworld"
-execute if dimension minecraft:the_nether run return run data modify storage bs:ctx _.dimension set value "minecraft:the_nether"
-execute if dimension minecraft:the_end run return run data modify storage bs:ctx _.dimension set value "minecraft:the_end"
-
-execute positioned -30000000 0 1600 summon piglin_brute run function bs.schedule:schedule/context/get_custom_dimension
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/schedule/unit/handle.mcfunction b/datapacks/Bookshelf/data/bs.schedule/function/schedule/unit/handle.mcfunction
deleted file mode 100644
index fa76b55691..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/function/schedule/unit/handle.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store success score #s bs.ctx run function bs.schedule:schedule/unit/normalize with storage bs:const schedule.units[{name:'$(unit)'}]
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/schedule/unit/normalize.mcfunction b/datapacks/Bookshelf/data/bs.schedule/function/schedule/unit/normalize.mcfunction
deleted file mode 100644
index 36a3093ee2..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/function/schedule/unit/normalize.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$return run execute store result storage bs:ctx _.time int $(scale) run data get storage bs:ctx _.time
diff --git a/datapacks/Bookshelf/data/bs.schedule/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.schedule/tags/function/exclusive_load.json
deleted file mode 100644
index 159c6137a0..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.schedule:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.schedule/tags/function/help.json b/datapacks/Bookshelf/data/bs.schedule/tags/function/help.json
deleted file mode 100644
index 16fc3444a9..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.schedule:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.schedule/tags/function/load.json b/datapacks/Bookshelf/data/bs.schedule/tags/function/load.json
deleted file mode 100644
index e225e10095..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/tags/function/load.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "values": [
- "bs.schedule:__load__",
- {
- "id": "#bs.log:load",
- "required": false
- }
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.schedule/tags/function/unload.json b/datapacks/Bookshelf/data/bs.schedule/tags/function/unload.json
deleted file mode 100644
index 42d5311b58..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.schedule:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.schedule/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.schedule/test/__boot__.mcfunction
deleted file mode 100644
index 4882d08d7e..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.schedule
-# @beforebatch function #bs.schedule:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.schedule/test/cancel/all.mcfunction b/datapacks/Bookshelf/data/bs.schedule/test/cancel/all.mcfunction
deleted file mode 100644
index 49f40675ad..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/test/cancel/all.mcfunction
+++ /dev/null
@@ -1,13 +0,0 @@
-# All commands that match the id get canceled
-# @batch bs.schedule
-
-await entity B5-0-0-0-2
-
-scoreboard players set #packtest.schedule.ca bs.data 0
-function #bs.schedule:schedule {with:{command:"scoreboard players add #packtest.schedule.ca bs.data 1",time:1}}
-function #bs.schedule:schedule {with:{command:"scoreboard players add #packtest.schedule.ca bs.data 1",time:1,id:{cancel:"all"}}}
-function #bs.schedule:schedule {with:{command:"scoreboard players add #packtest.schedule.ca bs.data 1",time:1,id:{cancel:"all"}}}
-function #bs.schedule:cancel_all {with:{id:{cancel:"all"}}}
-
-await delay 1t
-assert score #packtest.schedule.ca bs.data matches 1
diff --git a/datapacks/Bookshelf/data/bs.schedule/test/cancel/one.mcfunction b/datapacks/Bookshelf/data/bs.schedule/test/cancel/one.mcfunction
deleted file mode 100644
index 90b2ec9718..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/test/cancel/one.mcfunction
+++ /dev/null
@@ -1,13 +0,0 @@
-# Only the last command that matches the id get canceled
-# @batch bs.schedule
-
-await entity B5-0-0-0-2
-
-scoreboard players set #packtest.schedule.co bs.data 0
-function #bs.schedule:schedule {with:{command:"scoreboard players add #packtest.schedule.co bs.data 1",time:1}}
-function #bs.schedule:schedule {with:{command:"scoreboard players add #packtest.schedule.co bs.data 1",time:1,id:{cancel:"one"}}}
-function #bs.schedule:schedule {with:{command:"scoreboard players add #packtest.schedule.co bs.data 1",time:1,id:{cancel:"one"}}}
-function #bs.schedule:cancel_one {with:{id:{cancel:"one"}}}
-
-await delay 1t
-assert score #packtest.schedule.co bs.data matches 2
diff --git a/datapacks/Bookshelf/data/bs.schedule/test/schedule/context.mcfunction b/datapacks/Bookshelf/data/bs.schedule/test/schedule/context.mcfunction
deleted file mode 100644
index 853f5306e0..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/test/schedule/context.mcfunction
+++ /dev/null
@@ -1,14 +0,0 @@
-# Commands keep the execution context
-# @batch bs.schedule
-# @dummy
-
-await entity B5-0-0-0-2
-
-setblock ~ ~1 ~ minecraft:bookshelf
-function #bs.schedule:schedule {with:{command:"execute if block ~ ~1 ~ minecraft:bookshelf run scoreboard players set @s bs.data 1",time:1}}
-await delay 1t
-assert score @s bs.data matches 1
-
-execute in minecraft:the_nether run function #bs.schedule:schedule {with:{command:"execute if dimension minecraft:the_nether run scoreboard players set @s bs.data 2",time:1}}
-await delay 1t
-assert score @s bs.data matches 2
diff --git a/datapacks/Bookshelf/data/bs.schedule/test/schedule/stack.mcfunction b/datapacks/Bookshelf/data/bs.schedule/test/schedule/stack.mcfunction
deleted file mode 100644
index 55629f8fdd..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/test/schedule/stack.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Commands can stack on a same tick
-# @batch bs.schedule
-
-await entity B5-0-0-0-2
-
-function #bs.schedule:schedule {with:{command:"scoreboard players add #packtest.schedule.stack bs.data 1",time:1}}
-function #bs.schedule:schedule {with:{command:"scoreboard players add #packtest.schedule.stack bs.data 1",time:1}}
-await delay 1t
-assert score #packtest.schedule.stack bs.data matches 2
diff --git a/datapacks/Bookshelf/data/bs.schedule/test/units/error.mcfunction b/datapacks/Bookshelf/data/bs.schedule/test/units/error.mcfunction
deleted file mode 100644
index 264412a236..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/test/units/error.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Invalid unit should throw an error
-# @batch bs.schedule
-# @dummy
-
-await entity B5-0-0-0-2
-
-tag @s add bs.schedule.log.schedule._
-function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"¯|_(ツ)_|¯"}}
-assert chat "(?i).*unit.*¯\\|_\\(ツ\\)_\\|¯"
diff --git a/datapacks/Bookshelf/data/bs.schedule/test/units/success.mcfunction b/datapacks/Bookshelf/data/bs.schedule/test/units/success.mcfunction
deleted file mode 100644
index c9d04cf60e..0000000000
--- a/datapacks/Bookshelf/data/bs.schedule/test/units/success.mcfunction
+++ /dev/null
@@ -1,15 +0,0 @@
-# Valid units should not throw an error
-# @batch bs.schedule
-# @dummy
-
-await entity B5-0-0-0-2
-
-function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"t"}}
-function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"tick"}}
-function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"s"}}
-function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"second"}}
-function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"m"}}
-function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"minute"}}
-function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"h"}}
-function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"hour"}}
-assert not chat "(?i).*error.*"
diff --git a/datapacks/Bookshelf/data/bs.sidebar/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.sidebar/.metadata/generated/features.json
deleted file mode 100644
index 5784f425c3..0000000000
--- a/datapacks/Bookshelf/data/bs.sidebar/.metadata/generated/features.json
+++ /dev/null
@@ -1,35 +0,0 @@
-[
- {
- "name": "create",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/sidebar.html#create",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/08/18",
- "version": "23w32a"
- },
- "updated": {
- "date": "2023/12/07",
- "version": "1.20.3"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "refresh",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/sidebar.html#refresh",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/08/18",
- "version": "23w32a"
- },
- "updated": {
- "date": "2023/12/07",
- "version": "1.20.3"
- }
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.sidebar/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.sidebar/.metadata/generated/module.json
deleted file mode 100644
index 29554221a6..0000000000
--- a/datapacks/Bookshelf/data/bs.sidebar/.metadata/generated/module.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "name": "bs.sidebar",
- "display_name": "Sidebar",
- "description": "Create a visually appealing and dynamic sidebar using the scoreboard.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/sidebar.html",
- "authors": [
- "Aksiome"
- ],
- "weak_dependencies": [
- "bs.log"
- ],
- "features": [
- "bs.sidebar:create",
- "bs.sidebar:refresh"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.sidebar/.metadata/module.json b/datapacks/Bookshelf/data/bs.sidebar/.metadata/module.json
deleted file mode 100644
index e929af18b6..0000000000
--- a/datapacks/Bookshelf/data/bs.sidebar/.metadata/module.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "bs.sidebar",
- "display_name": "Sidebar",
- "description": "Create a visually appealing and dynamic sidebar using the scoreboard.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/sidebar.html",
- "weak_dependencies": [
- "bs.log"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.sidebar/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.sidebar/function/__help__.mcfunction
deleted file mode 100644
index dfb094f85a..0000000000
--- a/datapacks/Bookshelf/data/bs.sidebar/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/sidebar.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.sidebar documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/sidebar.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.sidebar/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.sidebar/function/__load__.mcfunction
deleted file mode 100644
index 9ceb5f5918..0000000000
--- a/datapacks/Bookshelf/data/bs.sidebar/function/__load__.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/sidebar.html
-# ------------------------------------------------------------------------------------------------------------
-
-forceload add -30000000 1600
-execute unless entity B5-0-0-0-2 run summon minecraft:text_display -30000000 0 1600 {UUID:[I;181,0,0,2],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],view_range:0f}
-
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-execute unless data storage bs:const log.messages[{namespaces: ["bs.sidebar"]}] run data modify storage bs:const log.messages[{namespaces: ["bs"]}].namespaces append value "bs.sidebar"
diff --git a/datapacks/Bookshelf/data/bs.sidebar/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.sidebar/function/__unload__.mcfunction
deleted file mode 100644
index 2588ecab3e..0000000000
--- a/datapacks/Bookshelf/data/bs.sidebar/function/__unload__.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/sidebar.html
-# ------------------------------------------------------------------------------------------------------------
-
-kill B5-0-0-0-2
-forceload remove -30000000 1600
-
-scoreboard objectives remove bs.ctx
-
-data remove storage bs:data sidebar
diff --git a/datapacks/Bookshelf/data/bs.sidebar/function/create/recurse/next.mcfunction b/datapacks/Bookshelf/data/bs.sidebar/function/create/recurse/next.mcfunction
deleted file mode 100644
index 5546586bfd..0000000000
--- a/datapacks/Bookshelf/data/bs.sidebar/function/create/recurse/next.mcfunction
+++ /dev/null
@@ -1,41 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$scoreboard players set $$(line) $(id) -$(line)
-$scoreboard players display name $$(line) $(id) $(left)
-$scoreboard players display numberformat $$(line) $(id) fixed $(right)
-
-$execute if score #l bs.ctx matches 1 run data modify storage bs:data sidebar[{id:'$(id)'}].dyn append value {cmd:'scoreboard players display name $$(line) $(id)',text:'$(dynleft)'}
-$execute if score #r bs.ctx matches 1 run data modify storage bs:data sidebar[{id:'$(id)'}].dyn append value {cmd:'scoreboard players display numberformat $$(line) $(id) fixed',text:'$(dynright)'}
-execute store result storage bs:ctx _.line int 1 run scoreboard players add #i bs.ctx 1
-
-data remove storage bs:ctx _.contents[0]
-execute unless data storage bs:ctx _.contents[0] run return 1
-
-data modify storage bs:ctx _.dynleft set from storage bs:ctx _.contents[0]
-data modify storage bs:ctx _.dynleft set from storage bs:ctx _.contents[0][0]
-data modify entity @s CustomName set from storage bs:ctx _.dynleft
-data modify entity @s text set from storage bs:ctx _.dynleft
-data modify storage bs:ctx _.left set from entity @s CustomName
-execute store success score #l bs.ctx run data modify storage bs:ctx _.left set from entity @s text
-
-data modify storage bs:ctx _.dynright set value '""'
-data modify storage bs:ctx _.dynright set from storage bs:ctx _.contents[0][1]
-data modify entity @s CustomName set from storage bs:ctx _.dynright
-data modify entity @s text set from storage bs:ctx _.dynright
-data modify storage bs:ctx _.right set from entity @s CustomName
-execute store success score #r bs.ctx run data modify storage bs:ctx _.right set from entity @s text
-
-function bs.sidebar:create/recurse/next with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.sidebar/function/refresh/loop.mcfunction b/datapacks/Bookshelf/data/bs.sidebar/function/refresh/loop.mcfunction
deleted file mode 100644
index 8d78f89fef..0000000000
--- a/datapacks/Bookshelf/data/bs.sidebar/function/refresh/loop.mcfunction
+++ /dev/null
@@ -1,27 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/sidebar.html#create
-# ------------------------------------------------------------------------------------------------------------
-
-$$(cmd) $(text)
-
-data remove storage bs:ctx _.dyn[0]
-execute unless data storage bs:ctx _.dyn[0] run return 1
-
-data modify storage bs:ctx _.cmd set from storage bs:ctx _.dyn[0].cmd
-data modify entity B5-0-0-0-2 text set from storage bs:ctx _.dyn[0].text
-data modify storage bs:ctx _.text set from entity B5-0-0-0-2 text
-
-return run function bs.sidebar:refresh/loop with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.sidebar/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.sidebar/tags/function/exclusive_load.json
deleted file mode 100644
index 2622ac346f..0000000000
--- a/datapacks/Bookshelf/data/bs.sidebar/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.sidebar:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.sidebar/tags/function/help.json b/datapacks/Bookshelf/data/bs.sidebar/tags/function/help.json
deleted file mode 100644
index d47eb1fb1a..0000000000
--- a/datapacks/Bookshelf/data/bs.sidebar/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.sidebar:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.sidebar/tags/function/load.json b/datapacks/Bookshelf/data/bs.sidebar/tags/function/load.json
deleted file mode 100644
index 3751c5b28e..0000000000
--- a/datapacks/Bookshelf/data/bs.sidebar/tags/function/load.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "values": [
- "bs.sidebar:__load__",
- {
- "id": "#bs.log:load",
- "required": false
- }
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.sidebar/tags/function/unload.json b/datapacks/Bookshelf/data/bs.sidebar/tags/function/unload.json
deleted file mode 100644
index 0ac58b3b9f..0000000000
--- a/datapacks/Bookshelf/data/bs.sidebar/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.sidebar:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.time/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.time/.metadata/generated/features.json
deleted file mode 100644
index 7f742ef2fa..0000000000
--- a/datapacks/Bookshelf/data/bs.time/.metadata/generated/features.json
+++ /dev/null
@@ -1,21 +0,0 @@
-[
- {
- "name": "get",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/time.html#system-time",
- "authors": [
- "Aksiome"
- ],
- "contributors": [
- "Awhikax",
- "RedCoal"
- ],
- "created": {
- "date": "2021/10/30",
- "version": "1.17.1"
- },
- "updated": {
- "date": "2023/08/30",
- "version": "23w33a"
- }
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.time/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.time/.metadata/generated/module.json
deleted file mode 100644
index 13d0b47ebe..0000000000
--- a/datapacks/Bookshelf/data/bs.time/.metadata/generated/module.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "name": "bs.time",
- "display_name": "Time",
- "description": "Get information about the system time effortlessly.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/time.html",
- "authors": [
- "Aksiome"
- ],
- "contributors": [
- "Awhikax",
- "RedCoal"
- ],
- "features": [
- "bs.time:get"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.time/.metadata/module.json b/datapacks/Bookshelf/data/bs.time/.metadata/module.json
deleted file mode 100644
index 8fa06c018a..0000000000
--- a/datapacks/Bookshelf/data/bs.time/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.time",
- "display_name": "Time",
- "description": "Get information about the system time effortlessly.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/time.html"
-}
diff --git a/datapacks/Bookshelf/data/bs.time/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.time/function/__help__.mcfunction
deleted file mode 100644
index c45c80ba09..0000000000
--- a/datapacks/Bookshelf/data/bs.time/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/time.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.time documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/time.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.time/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.time/function/__load__.mcfunction
deleted file mode 100644
index 22b9a2c531..0000000000
--- a/datapacks/Bookshelf/data/bs.time/function/__load__.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/time.html
-# ------------------------------------------------------------------------------------------------------------
-
-forceload add -30000000 1600
-setblock -30000000 0 1605 minecraft:repeating_command_block[facing=up]{auto:1b,Command:"help me",TrackOutput:1}
-
-scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
diff --git a/datapacks/Bookshelf/data/bs.time/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.time/function/__unload__.mcfunction
deleted file mode 100644
index 352f4436e7..0000000000
--- a/datapacks/Bookshelf/data/bs.time/function/__unload__.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/time.html
-# ------------------------------------------------------------------------------------------------------------
-
-setblock -30000000 0 1605 minecraft:air
-forceload remove -30000000 1600
-
-data remove storage bs:data time
-scoreboard objectives remove bs.out
diff --git a/datapacks/Bookshelf/data/bs.time/function/get/cast.mcfunction b/datapacks/Bookshelf/data/bs.time/function/get/cast.mcfunction
deleted file mode 100644
index 9e3d65f52b..0000000000
--- a/datapacks/Bookshelf/data/bs.time/function/get/cast.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$scoreboard players set $time.hours bs.out $(hours)
-$scoreboard players set $time.minutes bs.out $(minutes)
-$scoreboard players set $time.seconds bs.out $(seconds)
diff --git a/datapacks/Bookshelf/data/bs.time/function/get/get.mcfunction b/datapacks/Bookshelf/data/bs.time/function/get/get.mcfunction
deleted file mode 100644
index f676d3acec..0000000000
--- a/datapacks/Bookshelf/data/bs.time/function/get/get.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/time.html#system-time
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data time.full set string block -30000000 0 1605 LastOutput 10 18
-data modify storage bs:data time.hours set string storage bs:data time.full 0 2
-data modify storage bs:data time.minutes set string storage bs:data time.full 3 5
-data modify storage bs:data time.seconds set string storage bs:data time.full 6 8
-
-function bs.time:get/cast with storage bs:data time
diff --git a/datapacks/Bookshelf/data/bs.time/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.time/tags/function/exclusive_load.json
deleted file mode 100644
index 5fe0e7389d..0000000000
--- a/datapacks/Bookshelf/data/bs.time/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.time:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.time/tags/function/get.json b/datapacks/Bookshelf/data/bs.time/tags/function/get.json
deleted file mode 100644
index a55a406b81..0000000000
--- a/datapacks/Bookshelf/data/bs.time/tags/function/get.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/time.html#system-time",
- "authors": [
- "Aksiome"
- ],
- "contributors": [
- "RedCoal",
- "Awhikax"
- ],
- "created": {
- "date": "2021/10/30",
- "minecraft_version": "1.17.1"
- },
- "updated": {
- "date": "2023/08/30",
- "minecraft_version": "23w33a"
- }
- },
- "values": [
- "bs.time:get/get"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.time/tags/function/help.json b/datapacks/Bookshelf/data/bs.time/tags/function/help.json
deleted file mode 100644
index 69e1cea288..0000000000
--- a/datapacks/Bookshelf/data/bs.time/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.time:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.time/tags/function/load.json b/datapacks/Bookshelf/data/bs.time/tags/function/load.json
deleted file mode 100644
index ab17e20c3a..0000000000
--- a/datapacks/Bookshelf/data/bs.time/tags/function/load.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.time:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.time/tags/function/unload.json b/datapacks/Bookshelf/data/bs.time/tags/function/unload.json
deleted file mode 100644
index 48e9571b60..0000000000
--- a/datapacks/Bookshelf/data/bs.time/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.time:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.time/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.time/test/__boot__.mcfunction
deleted file mode 100644
index 9a22a6c78c..0000000000
--- a/datapacks/Bookshelf/data/bs.time/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.time
-# @beforebatch function #bs.time:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.time/test/format.mcfunction b/datapacks/Bookshelf/data/bs.time/test/format.mcfunction
deleted file mode 100644
index 57e3fdbec1..0000000000
--- a/datapacks/Bookshelf/data/bs.time/test/format.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Time format is valid
-# @batch bs.time
-
-scoreboard players set $time.hours bs.out -1
-scoreboard players set $time.minutes bs.out -1
-scoreboard players set $time.seconds bs.out -1
-function #bs.time:get
-assert score $time.hours bs.out matches 0..
-assert score $time.minutes bs.out matches 0..
-assert score $time.seconds bs.out matches 0..
diff --git a/datapacks/Bookshelf/data/bs.tree/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.tree/.metadata/generated/features.json
deleted file mode 100644
index fe51488c70..0000000000
--- a/datapacks/Bookshelf/data/bs.tree/.metadata/generated/features.json
+++ /dev/null
@@ -1 +0,0 @@
-[]
diff --git a/datapacks/Bookshelf/data/bs.tree/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.tree/.metadata/generated/module.json
deleted file mode 100644
index baf6593eab..0000000000
--- a/datapacks/Bookshelf/data/bs.tree/.metadata/generated/module.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "name": "bs.tree",
- "display_name": "Tree",
- "description": "Simplicity meets utility in this bank of trees.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/tree.html",
- "authors": [],
- "features": []
-}
diff --git a/datapacks/Bookshelf/data/bs.tree/.metadata/module.json b/datapacks/Bookshelf/data/bs.tree/.metadata/module.json
deleted file mode 100644
index 8de67b391d..0000000000
--- a/datapacks/Bookshelf/data/bs.tree/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.tree",
- "display_name": "Tree",
- "description": "Simplicity meets utility in this bank of trees.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/tree.html"
-}
diff --git a/datapacks/Bookshelf/data/bs.tree/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.tree/function/__help__.mcfunction
deleted file mode 100644
index 6b297af11e..0000000000
--- a/datapacks/Bookshelf/data/bs.tree/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/tree.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.tree documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/tree.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.tree/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.tree/function/__load__.mcfunction
deleted file mode 100644
index dd20e7c63f..0000000000
--- a/datapacks/Bookshelf/data/bs.tree/function/__load__.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/weather.html
-# ------------------------------------------------------------------------------------------------------------
diff --git a/datapacks/Bookshelf/data/bs.tree/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.tree/function/__unload__.mcfunction
deleted file mode 100644
index dd20e7c63f..0000000000
--- a/datapacks/Bookshelf/data/bs.tree/function/__unload__.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/weather.html
-# ------------------------------------------------------------------------------------------------------------
diff --git a/datapacks/Bookshelf/data/bs.tree/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.tree/tags/function/exclusive_load.json
deleted file mode 100644
index f946fe860d..0000000000
--- a/datapacks/Bookshelf/data/bs.tree/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.tree:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.tree/tags/function/help.json b/datapacks/Bookshelf/data/bs.tree/tags/function/help.json
deleted file mode 100644
index 6541fb011b..0000000000
--- a/datapacks/Bookshelf/data/bs.tree/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.tree:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.tree/tags/function/load.json b/datapacks/Bookshelf/data/bs.tree/tags/function/load.json
deleted file mode 100644
index 3003b3f5bc..0000000000
--- a/datapacks/Bookshelf/data/bs.tree/tags/function/load.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.tree:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.tree/tags/function/unload.json b/datapacks/Bookshelf/data/bs.tree/tags/function/unload.json
deleted file mode 100644
index 1e42293942..0000000000
--- a/datapacks/Bookshelf/data/bs.tree/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.tree:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.vector/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.vector/.metadata/generated/features.json
deleted file mode 100644
index 804f2c1568..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/.metadata/generated/features.json
+++ /dev/null
@@ -1,269 +0,0 @@
-[
- {
- "name": "abs_max",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#absolute-max",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/02/23",
- "version": "1.19.2"
- },
- "updated": {
- "date": "2024/05/09",
- "version": "1.20.6"
- }
- },
- {
- "name": "abs_min",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#absolute-min",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/17",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/05/09",
- "version": "1.20.6"
- }
- },
- {
- "name": "basis_rot_3d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#basis-rotation-3d",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/10/20",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "cartesian_to_spherical",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#cartesian-to-spherical",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/10/20",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "cross_product",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#cross-product",
- "authors": [
- "Aksiome",
- "Majoras16"
- ],
- "created": {
- "date": "2023/04/27",
- "version": "1.19.2"
- },
- "updated": {
- "date": "2023/10/17",
- "version": "1.20.2"
- }
- },
- {
- "name": "dot_product",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#dot-product",
- "authors": [
- "Aksiome",
- "Majoras16"
- ],
- "created": {
- "date": "2023/04/27",
- "version": "1.19.2"
- },
- "updated": {
- "date": "2023/10/17",
- "version": "1.20.2"
- }
- },
- {
- "name": "length",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#length",
- "authors": [
- "Aksiome",
- "KubbyDev",
- "Leirof"
- ],
- "created": {
- "date": "2018/04/01",
- "version": "1.19.2"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "length_squared",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#length",
- "authors": [
- "Aksiome",
- "KubbyDev",
- "Leirof"
- ],
- "created": {
- "date": "2018/04/01",
- "version": "1.19.2"
- },
- "updated": {
- "date": "2023/10/17",
- "version": "1.20.2"
- }
- },
- {
- "name": "normalize",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#normalize",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/02/19",
- "version": "1.19.2"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "normalize_max_component",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#length",
- "authors": [
- "Aksiome",
- "KubbyDev",
- "Leirof"
- ],
- "created": {
- "date": "2018/04/01",
- "version": "1.19.2"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "pos_from_vec",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/17",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2023/10/17",
- "version": "1.20.2"
- }
- },
- {
- "name": "rot_from_vec",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/17",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2023/10/17",
- "version": "1.20.2"
- }
- },
- {
- "name": "spherical_to_cartesian",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#spherical-to-cartesian",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/20",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "vec_from_pos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/17",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2023/02/17",
- "version": "1.20.2"
- }
- },
- {
- "name": "vec_from_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/17",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2023/02/17",
- "version": "1.20.2"
- }
- },
- {
- "name": "vec_from_vel",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/17",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2023/02/17",
- "version": "1.20.2"
- }
- },
- {
- "name": "vel_from_vec",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/17",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2023/02/17",
- "version": "1.20.2"
- }
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.vector/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.vector/.metadata/generated/module.json
deleted file mode 100644
index 7aa3142a5a..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/.metadata/generated/module.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "name": "bs.vector",
- "display_name": "Vector",
- "description": "Vectors are fundamental and incredibly powerful tools to manage motions, forces and… well… do physics!",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html",
- "authors": [
- "Aksiome",
- "KubbyDev",
- "Leirof",
- "Majoras16"
- ],
- "features": [
- "bs.vector:abs_max",
- "bs.vector:abs_min",
- "bs.vector:basis_rot_3d",
- "bs.vector:cartesian_to_spherical",
- "bs.vector:cross_product",
- "bs.vector:dot_product",
- "bs.vector:length",
- "bs.vector:length_squared",
- "bs.vector:normalize",
- "bs.vector:normalize_max_component",
- "bs.vector:pos_from_vec",
- "bs.vector:rot_from_vec",
- "bs.vector:spherical_to_cartesian",
- "bs.vector:vec_from_pos",
- "bs.vector:vec_from_rot",
- "bs.vector:vec_from_vel",
- "bs.vector:vel_from_vec"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.vector/.metadata/module.json b/datapacks/Bookshelf/data/bs.vector/.metadata/module.json
deleted file mode 100644
index 8768ea99be..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.vector",
- "display_name": "Vector",
- "description": "Vectors are fundamental and incredibly powerful tools to manage motions, forces and… well… do physics!",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html"
-}
diff --git a/datapacks/Bookshelf/data/bs.vector/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/__help__.mcfunction
deleted file mode 100644
index 69050279a2..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.vector documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.vector/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/__load__.mcfunction
deleted file mode 100644
index c24c34f4a8..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/__load__.mcfunction
+++ /dev/null
@@ -1,30 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html
-# ------------------------------------------------------------------------------------------------------------
-
-forceload add -30000000 1600
-execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
-execute unless entity B5-0-0-0-2 run summon minecraft:text_display -30000000 0 1600 {UUID:[I;181,0,0,2],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],view_range:0f}
-
-scoreboard objectives add bs.in dummy [{"text":"BS ","color":"dark_gray"},{"text":"Input","color":"aqua"}]
-scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
-scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-
-scoreboard players set -1 bs.const -1
-scoreboard players set 2 bs.const 2
-scoreboard players set 100 bs.const 100
-scoreboard players set 1000 bs.const 1000
diff --git a/datapacks/Bookshelf/data/bs.vector/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/__unload__.mcfunction
deleted file mode 100644
index e4f6323305..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/__unload__.mcfunction
+++ /dev/null
@@ -1,25 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html
-# ------------------------------------------------------------------------------------------------------------
-
-kill B5-0-0-0-1
-kill B5-0-0-0-2
-forceload remove -30000000 1600
-
-scoreboard objectives remove bs.in
-scoreboard objectives remove bs.out
-scoreboard objectives remove bs.const
-scoreboard objectives remove bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.vector/function/abs_max.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/abs_max.mcfunction
deleted file mode 100644
index 62d3c6c95c..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/abs_max.mcfunction
+++ /dev/null
@@ -1,37 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#absolute-max
-# ------------------------------------------------------------------------------------------------------------
-
-# INFO ------------------------------------------------------------------------
-# Copyright © 2024 Gunivers Community.
-
-# Authors: Aksiome, Leirof
-# Contributors:
-
-# Version: 2.0
-# Created: 23/02/2023 (1.19.2)
-# Last modification: 09/05/2024 (1.20.6)
-
-# Documentation: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#absolute-max
-# Dependencies:
-# Note:
-
-# CODE ------------------------------------------------------------------------
-
-scoreboard players operation $vector.abs_max bs.out = $vector.abs_max.0 bs.in
-execute if predicate bs.vector:abs_max/check1 run scoreboard players operation $vector.abs_max bs.out = $vector.abs_max.1 bs.in
-execute if predicate bs.vector:abs_max/check2 run scoreboard players operation $vector.abs_max bs.out = $vector.abs_max.2 bs.in
-return run scoreboard players get $vector.abs_max bs.out
diff --git a/datapacks/Bookshelf/data/bs.vector/function/abs_min.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/abs_min.mcfunction
deleted file mode 100644
index 2ec57741ab..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/abs_min.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#absolute-min
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard players operation $vector.abs_min bs.out = $vector.abs_min.0 bs.in
-execute if predicate bs.vector:abs_min/check1 run scoreboard players operation $vector.abs_min bs.out = $vector.abs_min.1 bs.in
-execute if predicate bs.vector:abs_min/check2 run scoreboard players operation $vector.abs_min bs.out = $vector.abs_min.2 bs.in
-return run scoreboard players get $vector.abs_min bs.out
diff --git a/datapacks/Bookshelf/data/bs.vector/function/convert/basis_rot_3d/basis_rot_3d.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/convert/basis_rot_3d/basis_rot_3d.mcfunction
deleted file mode 100644
index 3a10d0ab51..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/convert/basis_rot_3d/basis_rot_3d.mcfunction
+++ /dev/null
@@ -1,51 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#basis-rotation-3d
-# ------------------------------------------------------------------------------------------------------------
-
-$scoreboard players set #s bs.ctx $(scaling)
-scoreboard players set #t bs.ctx 1000000000
-execute store result storage bs:ctx y double .000000001 run scoreboard players operation #t bs.ctx /= #s bs.ctx
-
-# sincos(h: Phi) & sincos(v: Theta)
-execute in minecraft:overworld as B5-0-0-0-1 run function bs.vector:convert/basis_rot_3d/sincos with storage bs:ctx
-
-# X' = Z * sin(h) + X * cos(h)
-scoreboard players operation $vector.basis_rot_3d.0 bs.out = $vector.basis_rot_3d.pos.2 bs.in
-scoreboard players operation $vector.basis_rot_3d.0 bs.out *= #j bs.ctx
-scoreboard players operation #t bs.ctx = $vector.basis_rot_3d.pos.0 bs.in
-scoreboard players operation #t bs.ctx *= #i bs.ctx
-scoreboard players operation $vector.basis_rot_3d.0 bs.out += #t bs.ctx
-scoreboard players operation $vector.basis_rot_3d.0 bs.out /= 1000 bs.const
-
-# Y' = (z * cos(h) - x * sin(h)) * sin(v) + y * cos(v)
-scoreboard players operation $vector.basis_rot_3d.1 bs.out = $vector.basis_rot_3d.pos.2 bs.in
-scoreboard players operation $vector.basis_rot_3d.1 bs.out *= #i bs.ctx
-scoreboard players operation #t bs.ctx = $vector.basis_rot_3d.pos.0 bs.in
-scoreboard players operation #t bs.ctx *= #j bs.ctx
-scoreboard players operation $vector.basis_rot_3d.1 bs.out -= #t bs.ctx
-execute store result score $vector.basis_rot_3d.2 bs.out run scoreboard players operation $vector.basis_rot_3d.1 bs.out /= 1000 bs.const
-scoreboard players operation $vector.basis_rot_3d.1 bs.out *= #l bs.ctx
-scoreboard players operation #t bs.ctx = $vector.basis_rot_3d.pos.1 bs.in
-scoreboard players operation #t bs.ctx *= #k bs.ctx
-scoreboard players operation $vector.basis_rot_3d.1 bs.out += #t bs.ctx
-scoreboard players operation $vector.basis_rot_3d.1 bs.out /= 1000 bs.const
-
-# Z' = (z * cos(h) - x * sin(h)) * cos(v) - y * sin(v)
-scoreboard players operation $vector.basis_rot_3d.2 bs.out *= #k bs.ctx
-scoreboard players operation #t bs.ctx = $vector.basis_rot_3d.pos.1 bs.in
-scoreboard players operation #t bs.ctx *= #l bs.ctx
-scoreboard players operation $vector.basis_rot_3d.2 bs.out -= #t bs.ctx
-scoreboard players operation $vector.basis_rot_3d.2 bs.out /= 1000 bs.const
diff --git a/datapacks/Bookshelf/data/bs.vector/function/convert/basis_rot_3d/sincos.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/convert/basis_rot_3d/sincos.mcfunction
deleted file mode 100644
index b4ac5b985a..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/convert/basis_rot_3d/sincos.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result entity @s Rotation[0] float $(y) run scoreboard players get $vector.basis_rot_3d.rot.0 bs.in
-execute at @s positioned 0.0 0.0 0.0 rotated ~ 0.0 run tp @s ^ ^ ^10.0
-execute store result score #i bs.ctx run data get entity @s Pos[2] 100
-execute store result score #j bs.ctx run data get entity @s Pos[0] -100
-$execute store result entity @s Rotation[0] float $(y) run scoreboard players get $vector.basis_rot_3d.rot.1 bs.in
-execute at @s positioned 0.0 0.0 0.0 rotated ~ 0.0 run tp @s ^ ^ ^10.0
-execute store result score #k bs.ctx run data get entity @s Pos[2] 100
-execute store result score #l bs.ctx run data get entity @s Pos[0] -100
-tp @s -30000000 0 1600
diff --git a/datapacks/Bookshelf/data/bs.vector/function/convert/cartesian_to_spherical/cartesian_to_spherical.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/convert/cartesian_to_spherical/cartesian_to_spherical.mcfunction
deleted file mode 100644
index 3774c2d2db..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/convert/cartesian_to_spherical/cartesian_to_spherical.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#cartesian-to-spherical
-# ------------------------------------------------------------------------------------------------------------
-
-execute in minecraft:overworld as B5-0-0-0-1 run function bs.vector:convert/cartesian_to_spherical/compute
-$execute store result score $vector.cartesian_to_spherical.0 bs.out run data get entity B5-0-0-0-1 Rotation[0] $(scaling)
-$execute store result score $vector.cartesian_to_spherical.1 bs.out run data get entity B5-0-0-0-1 Rotation[1] $(scaling)
-execute store result score $vector.cartesian_to_spherical.2 bs.out as B5-0-0-0-2 run function bs.vector:length/compute with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.vector/function/convert/cartesian_to_spherical/compute.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/convert/cartesian_to_spherical/compute.mcfunction
deleted file mode 100644
index 33ca82a171..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/convert/cartesian_to_spherical/compute.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result entity @s Pos[0] double 0.001 store result storage bs:ctx x int 1 run scoreboard players get $vector.cartesian_to_spherical.0 bs.in
-execute store result entity @s Pos[1] double 0.001 store result storage bs:ctx y int 1 run scoreboard players get $vector.cartesian_to_spherical.1 bs.in
-execute store result entity @s Pos[2] double 0.001 store result storage bs:ctx z int 1 run scoreboard players get $vector.cartesian_to_spherical.2 bs.in
-execute positioned 0.0 0.0 0.0 facing entity @s feet run tp @s -30000000 0 1600 ~ ~
diff --git a/datapacks/Bookshelf/data/bs.vector/function/convert/spherical_to_cartesian/compute.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/convert/spherical_to_cartesian/compute.mcfunction
deleted file mode 100644
index 5b808c35cf..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/convert/spherical_to_cartesian/compute.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result entity @s Rotation[0] float $(y) run scoreboard players get $vector.spherical_to_cartesian.0 bs.in
-$execute store result entity @s Rotation[1] float $(y) run scoreboard players get $vector.spherical_to_cartesian.1 bs.in
-$execute rotated as @s positioned 0.0 0.0 0.0 run tp @s ^ ^ ^$(x)
-data modify storage bs:ctx _ set from entity @s Pos
-tp @s -30000000 0 1600
diff --git a/datapacks/Bookshelf/data/bs.vector/function/convert/spherical_to_cartesian/spherical_to_cartesian.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/convert/spherical_to_cartesian/spherical_to_cartesian.mcfunction
deleted file mode 100644
index f6bba239d7..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/convert/spherical_to_cartesian/spherical_to_cartesian.mcfunction
+++ /dev/null
@@ -1,25 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#spherical-to-cartesian
-# ------------------------------------------------------------------------------------------------------------
-
-$scoreboard players set #s bs.ctx $(scaling)
-scoreboard players set #t bs.ctx 1000000000
-execute store result storage bs:ctx y double .000000001 run scoreboard players operation #t bs.ctx /= #s bs.ctx
-execute store result storage bs:ctx x int 1 run scoreboard players get $vector.spherical_to_cartesian.2 bs.in
-execute in minecraft:overworld as B5-0-0-0-1 run function bs.vector:convert/spherical_to_cartesian/compute with storage bs:ctx
-execute store result score $vector.spherical_to_cartesian.0 bs.out run data get storage bs:ctx _[0]
-execute store result score $vector.spherical_to_cartesian.1 bs.out run data get storage bs:ctx _[1]
-execute store result score $vector.spherical_to_cartesian.2 bs.out run data get storage bs:ctx _[2]
diff --git a/datapacks/Bookshelf/data/bs.vector/function/cross_product.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/cross_product.mcfunction
deleted file mode 100644
index 649ba8dc5b..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/cross_product.mcfunction
+++ /dev/null
@@ -1,42 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#cross-product
-# ------------------------------------------------------------------------------------------------------------
-
-$scoreboard players set #s bs.ctx $(scaling)
-
-# out.0 = u.1 * v.2 - u.2 * v.1
-scoreboard players operation $vector.cross_product.0 bs.out = $vector.cross_product.u.1 bs.in
-scoreboard players operation $vector.cross_product.0 bs.out *= $vector.cross_product.v.2 bs.in
-scoreboard players operation #t bs.ctx = $vector.cross_product.u.2 bs.in
-scoreboard players operation #t bs.ctx *= $vector.cross_product.v.1 bs.in
-scoreboard players operation $vector.cross_product.0 bs.out -= #t bs.ctx
-scoreboard players operation $vector.cross_product.0 bs.out /= #s bs.ctx
-
-# out.1 = u.2 * v.0 - u.0 * v.2
-scoreboard players operation $vector.cross_product.1 bs.out = $vector.cross_product.u.2 bs.in
-scoreboard players operation $vector.cross_product.1 bs.out *= $vector.cross_product.v.0 bs.in
-scoreboard players operation #t bs.ctx = $vector.cross_product.u.0 bs.in
-scoreboard players operation #t bs.ctx *= $vector.cross_product.v.2 bs.in
-scoreboard players operation $vector.cross_product.1 bs.out -= #t bs.ctx
-scoreboard players operation $vector.cross_product.1 bs.out /= #s bs.ctx
-
-# out.2 = u.0 * v.1 - u.1 * v.0
-scoreboard players operation $vector.cross_product.2 bs.out = $vector.cross_product.u.0 bs.in
-scoreboard players operation $vector.cross_product.2 bs.out *= $vector.cross_product.v.1 bs.in
-scoreboard players operation #t bs.ctx = $vector.cross_product.u.1 bs.in
-scoreboard players operation #t bs.ctx *= $vector.cross_product.v.0 bs.in
-scoreboard players operation $vector.cross_product.2 bs.out -= #t bs.ctx
-scoreboard players operation $vector.cross_product.2 bs.out /= #s bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.vector/function/dot_product.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/dot_product.mcfunction
deleted file mode 100644
index 1e3e07d742..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/dot_product.mcfunction
+++ /dev/null
@@ -1,28 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#dot-product
-# ------------------------------------------------------------------------------------------------------------
-
-$scoreboard players set #s bs.ctx $(scaling)
-
-scoreboard players operation $vector.dot_product bs.out = $vector.dot_product.u.0 bs.in
-scoreboard players operation $vector.dot_product bs.out *= $vector.dot_product.v.0 bs.in
-scoreboard players operation #t bs.ctx = $vector.dot_product.u.1 bs.in
-scoreboard players operation #t bs.ctx *= $vector.dot_product.v.1 bs.in
-scoreboard players operation $vector.dot_product bs.out += #t bs.ctx
-scoreboard players operation #t bs.ctx = $vector.dot_product.u.2 bs.in
-scoreboard players operation #t bs.ctx *= $vector.dot_product.v.2 bs.in
-scoreboard players operation $vector.dot_product bs.out += #t bs.ctx
-return run scoreboard players operation $vector.dot_product bs.out /= #s bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.vector/function/length/compute.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/length/compute.mcfunction
deleted file mode 100644
index 23e200173f..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/length/compute.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# compute Euclidean distance: sqrt(x^2+y^2+z^2)
-# Thanks to Triton365 for sharing this trick on the Minecraft Commands discord
-$data modify entity @s transformation set value [$(x)f,0f,0f,0f,$(y)f,0f,0f,0f,$(z)f,0f,0f,0f,0f,0f,0f,1f]
-return run data get entity @s transformation.scale[0]
diff --git a/datapacks/Bookshelf/data/bs.vector/function/length/length.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/length/length.mcfunction
deleted file mode 100644
index fe5ebd24da..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/length/length.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#length
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result storage bs:ctx x int 1 run scoreboard players get $vector.length.0 bs.in
-execute store result storage bs:ctx y int 1 run scoreboard players get $vector.length.1 bs.in
-execute store result storage bs:ctx z int 1 run scoreboard players get $vector.length.2 bs.in
-
-execute store result score $vector.length bs.out as B5-0-0-0-2 run return run function bs.vector:length/compute with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.vector/function/length_squared.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/length_squared.mcfunction
deleted file mode 100644
index d44a9c8ac0..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/length_squared.mcfunction
+++ /dev/null
@@ -1,28 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#length
-# ------------------------------------------------------------------------------------------------------------
-
-$scoreboard players set #s bs.ctx $(scaling)
-
-scoreboard players operation $vector.length_squared bs.out = $vector.length_squared.0 bs.in
-scoreboard players operation $vector.length_squared bs.out *= $vector.length_squared.0 bs.in
-scoreboard players operation #t bs.ctx = $vector.length_squared.1 bs.in
-scoreboard players operation #t bs.ctx *= $vector.length_squared.1 bs.in
-scoreboard players operation $vector.length_squared bs.out += #t bs.ctx
-scoreboard players operation #t bs.ctx = $vector.length_squared.2 bs.in
-scoreboard players operation #t bs.ctx *= $vector.length_squared.2 bs.in
-scoreboard players operation $vector.length_squared bs.out += #t bs.ctx
-return run scoreboard players operation $vector.length_squared bs.out /= #s bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.vector/function/normalize/compute.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/normalize/compute.mcfunction
deleted file mode 100644
index 9894315868..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/normalize/compute.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result entity @s Pos[0] double 0.00000001 run scoreboard players get $vector.normalize.0 bs.in
-execute store result entity @s Pos[1] double 0.00000001 run scoreboard players get $vector.normalize.1 bs.in
-execute store result entity @s Pos[2] double 0.00000001 run scoreboard players get $vector.normalize.2 bs.in
-execute positioned 0.0 0.0 0.0 facing entity @s feet run tp @s ^ ^ ^1
-data modify storage bs:ctx _ set from entity @s Pos
-tp @s -30000000 0 1600 ~ ~
diff --git a/datapacks/Bookshelf/data/bs.vector/function/normalize/normalize.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/normalize/normalize.mcfunction
deleted file mode 100644
index 8085399551..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/normalize/normalize.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#normalize
-# ------------------------------------------------------------------------------------------------------------
-
-execute in minecraft:overworld as B5-0-0-0-1 run function bs.vector:normalize/compute
-$execute store result score $vector.normalize.0 bs.out run data get storage bs:ctx _[0] $(scale)
-$execute store result score $vector.normalize.1 bs.out run data get storage bs:ctx _[1] $(scale)
-$execute store result score $vector.normalize.2 bs.out run data get storage bs:ctx _[2] $(scale)
diff --git a/datapacks/Bookshelf/data/bs.vector/function/normalize_max_component.mcfunction b/datapacks/Bookshelf/data/bs.vector/function/normalize_max_component.mcfunction
deleted file mode 100644
index 7b05896a37..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/function/normalize_max_component.mcfunction
+++ /dev/null
@@ -1,35 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#normalize
-# ------------------------------------------------------------------------------------------------------------
-
-$scoreboard players set #s bs.ctx $(scale)
-
-scoreboard players operation $vector.normalize_max_component.factor bs.out = $vector.normalize_max_component.0 bs.in
-execute if predicate bs.vector:normalize_max_component/check1 run scoreboard players operation $vector.normalize_max_component.factor bs.out = $vector.normalize_max_component.1 bs.in
-execute if predicate bs.vector:normalize_max_component/check2 run scoreboard players operation $vector.normalize_max_component.factor bs.out = $vector.normalize_max_component.2 bs.in
-execute if score $vector.normalize_max_component.factor bs.out matches ..-1 run scoreboard players operation $vector.normalize_max_component.factor bs.out *= -1 bs.const
-
-scoreboard players operation $vector.normalize_max_component.0 bs.out = $vector.normalize_max_component.0 bs.in
-scoreboard players operation $vector.normalize_max_component.1 bs.out = $vector.normalize_max_component.1 bs.in
-scoreboard players operation $vector.normalize_max_component.2 bs.out = $vector.normalize_max_component.2 bs.in
-
-scoreboard players operation $vector.normalize_max_component.0 bs.out *= #s bs.ctx
-scoreboard players operation $vector.normalize_max_component.1 bs.out *= #s bs.ctx
-scoreboard players operation $vector.normalize_max_component.2 bs.out *= #s bs.ctx
-
-scoreboard players operation $vector.normalize_max_component.0 bs.out /= $vector.normalize_max_component.factor bs.out
-scoreboard players operation $vector.normalize_max_component.1 bs.out /= $vector.normalize_max_component.factor bs.out
-scoreboard players operation $vector.normalize_max_component.2 bs.out /= $vector.normalize_max_component.factor bs.out
diff --git a/datapacks/Bookshelf/data/bs.vector/predicate/abs_max/check1.json b/datapacks/Bookshelf/data/bs.vector/predicate/abs_max/check1.json
deleted file mode 100644
index c0e91fe48f..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/predicate/abs_max/check1.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "condition": "minecraft:inverted",
- "term": {
- "condition": "minecraft:any_of",
- "terms": [
- {
- "condition": "minecraft:value_check",
- "value": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_max.1"
- },
- "score": "bs.in"
- },
- "range": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_max"
- },
- "score": "bs.out",
- "scale": -1
- },
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_max"
- },
- "score": "bs.out"
- }
- }
- },
- {
- "condition": "minecraft:value_check",
- "value": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_max.1"
- },
- "score": "bs.in"
- },
- "range": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_max"
- },
- "score": "bs.out"
- },
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_max"
- },
- "score": "bs.out",
- "scale": -1
- }
- }
- }
- ]
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.vector/predicate/abs_max/check2.json b/datapacks/Bookshelf/data/bs.vector/predicate/abs_max/check2.json
deleted file mode 100644
index 03a382d710..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/predicate/abs_max/check2.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "condition": "minecraft:inverted",
- "term": {
- "condition": "minecraft:any_of",
- "terms": [
- {
- "condition": "minecraft:value_check",
- "value": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_max.2"
- },
- "score": "bs.in"
- },
- "range": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_max"
- },
- "score": "bs.out",
- "scale": -1
- },
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_max"
- },
- "score": "bs.out"
- }
- }
- },
- {
- "condition": "minecraft:value_check",
- "value": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_max.2"
- },
- "score": "bs.in"
- },
- "range": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_max"
- },
- "score": "bs.out"
- },
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_max"
- },
- "score": "bs.out",
- "scale": -1
- }
- }
- }
- ]
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.vector/predicate/abs_min/check1.json b/datapacks/Bookshelf/data/bs.vector/predicate/abs_min/check1.json
deleted file mode 100644
index 8e41e4598c..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/predicate/abs_min/check1.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
- "condition": "minecraft:any_of",
- "terms": [
- {
- "condition": "minecraft:value_check",
- "value": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_min.1"
- },
- "score": "bs.in"
- },
- "range": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_min"
- },
- "score": "bs.out",
- "scale": -1
- },
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_min"
- },
- "score": "bs.out"
- }
- }
- },
- {
- "condition": "minecraft:value_check",
- "value": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_min.1"
- },
- "score": "bs.in"
- },
- "range": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_min"
- },
- "score": "bs.out"
- },
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_min"
- },
- "score": "bs.out",
- "scale": -1
- }
- }
- }
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.vector/predicate/abs_min/check2.json b/datapacks/Bookshelf/data/bs.vector/predicate/abs_min/check2.json
deleted file mode 100644
index d5b3c67055..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/predicate/abs_min/check2.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
- "condition": "minecraft:any_of",
- "terms": [
- {
- "condition": "minecraft:value_check",
- "value": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_min.2"
- },
- "score": "bs.in"
- },
- "range": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_min"
- },
- "score": "bs.out",
- "scale": -1
- },
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_min"
- },
- "score": "bs.out"
- }
- }
- },
- {
- "condition": "minecraft:value_check",
- "value": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_min.2"
- },
- "score": "bs.in"
- },
- "range": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_min"
- },
- "score": "bs.out"
- },
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.abs_min"
- },
- "score": "bs.out",
- "scale": -1
- }
- }
- }
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.vector/predicate/normalize_max_component/check1.json b/datapacks/Bookshelf/data/bs.vector/predicate/normalize_max_component/check1.json
deleted file mode 100644
index 886d8265f1..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/predicate/normalize_max_component/check1.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "condition": "minecraft:inverted",
- "term": {
- "condition": "minecraft:any_of",
- "terms": [
- {
- "condition": "minecraft:value_check",
- "value": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.normalize_max_component.1"
- },
- "score": "bs.in"
- },
- "range": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.normalize_max_component.factor"
- },
- "score": "bs.out",
- "scale": -1
- },
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.normalize_max_component.factor"
- },
- "score": "bs.out"
- }
- }
- },
- {
- "condition": "minecraft:value_check",
- "value": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.normalize_max_component.1"
- },
- "score": "bs.in"
- },
- "range": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.normalize_max_component.factor"
- },
- "score": "bs.out"
- },
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.normalize_max_component.factor"
- },
- "score": "bs.out",
- "scale": -1
- }
- }
- }
- ]
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.vector/predicate/normalize_max_component/check2.json b/datapacks/Bookshelf/data/bs.vector/predicate/normalize_max_component/check2.json
deleted file mode 100644
index 8bc0df826a..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/predicate/normalize_max_component/check2.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "condition": "minecraft:inverted",
- "term": {
- "condition": "minecraft:any_of",
- "terms": [
- {
- "condition": "minecraft:value_check",
- "value": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.normalize_max_component.2"
- },
- "score": "bs.in"
- },
- "range": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.normalize_max_component.factor"
- },
- "score": "bs.out",
- "scale": -1
- },
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.normalize_max_component.factor"
- },
- "score": "bs.out"
- }
- }
- },
- {
- "condition": "minecraft:value_check",
- "value": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.normalize_max_component.2"
- },
- "score": "bs.in"
- },
- "range": {
- "min": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.normalize_max_component.factor"
- },
- "score": "bs.out"
- },
- "max": {
- "type": "minecraft:score",
- "target": {
- "type": "minecraft:fixed",
- "name": "$vector.normalize_max_component.factor"
- },
- "score": "bs.out",
- "scale": -1
- }
- }
- }
- ]
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/abs_min.json b/datapacks/Bookshelf/data/bs.vector/tags/function/abs_min.json
deleted file mode 100644
index 49ed7947b2..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/abs_min.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "__bookshelf__": {
- "feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#absolute-min",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/17",
- "minecraft_version": "1.20.2"
- },
- "updated": {
- "date": "2024/05/09",
- "minecraft_version": "1.20.6"
- }
- },
- "values": [
- "bs.vector:abs_min"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.vector/tags/function/exclusive_load.json
deleted file mode 100644
index e03f8dd58b..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.vector:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/help.json b/datapacks/Bookshelf/data/bs.vector/tags/function/help.json
deleted file mode 100644
index a414f2ce7f..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.vector:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/load.json b/datapacks/Bookshelf/data/bs.vector/tags/function/load.json
deleted file mode 100644
index 7be94f6372..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/load.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.vector:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/unload.json b/datapacks/Bookshelf/data/bs.vector/tags/function/unload.json
deleted file mode 100644
index b4e0b25556..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.vector:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.vector/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.vector/test/__boot__.mcfunction
deleted file mode 100644
index 902db8bfbc..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.vector
-# @beforebatch function #bs.vector:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.vector/test/abs_max.mcfunction b/datapacks/Bookshelf/data/bs.vector/test/abs_max.mcfunction
deleted file mode 100644
index ef39ad58c2..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/test/abs_max.mcfunction
+++ /dev/null
@@ -1,14 +0,0 @@
-# Max returns correct values
-# @batch bs.vector
-
-scoreboard players set $vector.abs_max.0 bs.in 52
-scoreboard players set $vector.abs_max.1 bs.in -48
-scoreboard players set $vector.abs_max.2 bs.in 12
-function #bs.vector:abs_max
-assert score $vector.abs_max bs.out matches 52
-
-scoreboard players set $vector.abs_max.0 bs.in -85
-scoreboard players set $vector.abs_max.1 bs.in 48
-scoreboard players set $vector.abs_max.2 bs.in 72
-function #bs.vector:abs_max
-assert score $vector.abs_max bs.out matches -85
diff --git a/datapacks/Bookshelf/data/bs.vector/test/abs_min.mcfunction b/datapacks/Bookshelf/data/bs.vector/test/abs_min.mcfunction
deleted file mode 100644
index 16550ddbc6..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/test/abs_min.mcfunction
+++ /dev/null
@@ -1,14 +0,0 @@
-# Min returns correct values
-# @batch bs.vector
-
-scoreboard players set $vector.abs_min.0 bs.in 52
-scoreboard players set $vector.abs_min.1 bs.in -48
-scoreboard players set $vector.abs_min.2 bs.in -12
-function #bs.vector:abs_min
-assert score $vector.abs_min bs.out matches -12
-
-scoreboard players set $vector.abs_min.0 bs.in -85
-scoreboard players set $vector.abs_min.1 bs.in 48
-scoreboard players set $vector.abs_min.2 bs.in 72
-function #bs.vector:abs_min
-assert score $vector.abs_min bs.out matches 48
diff --git a/datapacks/Bookshelf/data/bs.vector/test/basis_rot_3d.mcfunction b/datapacks/Bookshelf/data/bs.vector/test/basis_rot_3d.mcfunction
deleted file mode 100644
index 7d69127edd..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/test/basis_rot_3d.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# Convert canonical to local coordinates
-# @batch bs.vector
-
-await entity B5-0-0-0-1
-
-scoreboard players set $vector.basis_rot_3d.pos.0 bs.in 577
-scoreboard players set $vector.basis_rot_3d.pos.1 bs.in 577
-scoreboard players set $vector.basis_rot_3d.pos.2 bs.in 577
-scoreboard players set $vector.basis_rot_3d.rot.0 bs.in -45000
-scoreboard players set $vector.basis_rot_3d.rot.1 bs.in -35265
-
-function #bs.vector:basis_rot_3d {scaling:1000}
-
-assert score $vector.basis_rot_3d.0 bs.out matches -1..1
-assert score $vector.basis_rot_3d.1 bs.out matches -1..1
-assert score $vector.basis_rot_3d.2 bs.out matches 999..1001
diff --git a/datapacks/Bookshelf/data/bs.vector/test/cartesian_to_spherical.mcfunction b/datapacks/Bookshelf/data/bs.vector/test/cartesian_to_spherical.mcfunction
deleted file mode 100644
index 13c0001aeb..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/test/cartesian_to_spherical.mcfunction
+++ /dev/null
@@ -1,15 +0,0 @@
-# Convert cartesian to spherical coordinates
-# @batch bs.vector
-
-await entity B5-0-0-0-1
-await entity B5-0-0-0-2
-
-scoreboard players set $vector.cartesian_to_spherical.0 bs.in 577
-scoreboard players set $vector.cartesian_to_spherical.1 bs.in 577
-scoreboard players set $vector.cartesian_to_spherical.2 bs.in 577
-
-function #bs.vector:cartesian_to_spherical {scaling:1000}
-
-assert score $vector.cartesian_to_spherical.0 bs.out matches -45001..-44999
-assert score $vector.cartesian_to_spherical.1 bs.out matches -35266..-35264
-assert score $vector.cartesian_to_spherical.2 bs.out matches 999..1001
diff --git a/datapacks/Bookshelf/data/bs.vector/test/cross_product.mcfunction b/datapacks/Bookshelf/data/bs.vector/test/cross_product.mcfunction
deleted file mode 100644
index 5bc0ff3464..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/test/cross_product.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# Cross product returns correct values
-# @batch bs.vector
-
-scoreboard players set $vector.cross_product.u.0 bs.in 4
-scoreboard players set $vector.cross_product.u.1 bs.in 2
-scoreboard players set $vector.cross_product.u.2 bs.in 5
-
-scoreboard players set $vector.cross_product.v.0 bs.in 1
-scoreboard players set $vector.cross_product.v.1 bs.in 3
-scoreboard players set $vector.cross_product.v.2 bs.in 9
-
-function #bs.vector:cross_product {scaling:1}
-
-assert score $vector.cross_product.0 bs.out matches 3
-assert score $vector.cross_product.1 bs.out matches -31
-assert score $vector.cross_product.2 bs.out matches 10
diff --git a/datapacks/Bookshelf/data/bs.vector/test/dot_product.mcfunction b/datapacks/Bookshelf/data/bs.vector/test/dot_product.mcfunction
deleted file mode 100644
index 544faf0d27..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/test/dot_product.mcfunction
+++ /dev/null
@@ -1,14 +0,0 @@
-# Dot product returns correct values
-# @batch bs.vector
-
-scoreboard players set $vector.dot_product.u.0 bs.in 24
-scoreboard players set $vector.dot_product.u.1 bs.in 35
-scoreboard players set $vector.dot_product.u.2 bs.in 42
-
-scoreboard players set $vector.dot_product.v.0 bs.in 35
-scoreboard players set $vector.dot_product.v.1 bs.in 42
-scoreboard players set $vector.dot_product.v.2 bs.in 45
-
-function #bs.vector:dot_product {scaling:10}
-
-assert score $vector.dot_product bs.out matches 420
diff --git a/datapacks/Bookshelf/data/bs.vector/test/length.mcfunction b/datapacks/Bookshelf/data/bs.vector/test/length.mcfunction
deleted file mode 100644
index 93d9a1c4f1..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/test/length.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# Length returns correct values
-# @batch bs.vector
-
-await entity B5-0-0-0-2
-
-scoreboard players set $vector.length.0 bs.in 37216
-scoreboard players set $vector.length.1 bs.in 3383
-scoreboard players set $vector.length.2 bs.in 19172
-
-function #bs.vector:length
-
-assert score $vector.length bs.out matches 42000
diff --git a/datapacks/Bookshelf/data/bs.vector/test/length_squared.mcfunction b/datapacks/Bookshelf/data/bs.vector/test/length_squared.mcfunction
deleted file mode 100644
index 65dd145306..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/test/length_squared.mcfunction
+++ /dev/null
@@ -1,10 +0,0 @@
-# Length squared returns correct values
-# @batch bs.vector
-
-scoreboard players set $vector.length_squared.0 bs.in 4000
-scoreboard players set $vector.length_squared.1 bs.in 5000
-scoreboard players set $vector.length_squared.2 bs.in 1000
-
-function #bs.vector:length_squared {scaling:1000}
-
-assert score $vector.length_squared bs.out matches 42000
diff --git a/datapacks/Bookshelf/data/bs.vector/test/normalize.mcfunction b/datapacks/Bookshelf/data/bs.vector/test/normalize.mcfunction
deleted file mode 100644
index d79840cb1c..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/test/normalize.mcfunction
+++ /dev/null
@@ -1,14 +0,0 @@
-# Normalize returns correct values
-# @batch bs.vector
-
-await entity B5-0-0-0-1
-
-scoreboard players set $vector.normalize.0 bs.in 37216
-scoreboard players set $vector.normalize.1 bs.in 3383
-scoreboard players set $vector.normalize.2 bs.in 19172
-
-function #bs.vector:normalize {scale:1000}
-
-assert score $vector.normalize.0 bs.out matches 885..887
-assert score $vector.normalize.1 bs.out matches 79..81
-assert score $vector.normalize.2 bs.out matches 455..457
diff --git a/datapacks/Bookshelf/data/bs.vector/test/normalize_max_component.mcfunction b/datapacks/Bookshelf/data/bs.vector/test/normalize_max_component.mcfunction
deleted file mode 100644
index c5b8144ee5..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/test/normalize_max_component.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# Fast normalize returns correct values
-# @batch bs.vector
-
-scoreboard players set $vector.normalize_max_component.0 bs.in 37216
-scoreboard players set $vector.normalize_max_component.1 bs.in 3383
-scoreboard players set $vector.normalize_max_component.2 bs.in 19172
-
-function #bs.vector:normalize_max_component {scale:1000}
-
-assert score $vector.normalize_max_component.0 bs.out matches 1000
-assert score $vector.normalize_max_component.1 bs.out matches 89..91
-assert score $vector.normalize_max_component.2 bs.out matches 514..516
diff --git a/datapacks/Bookshelf/data/bs.vector/test/spherical_to_cartesian.mcfunction b/datapacks/Bookshelf/data/bs.vector/test/spherical_to_cartesian.mcfunction
deleted file mode 100644
index 1b70cef1a1..0000000000
--- a/datapacks/Bookshelf/data/bs.vector/test/spherical_to_cartesian.mcfunction
+++ /dev/null
@@ -1,14 +0,0 @@
-# Convert spherical to cartesian coordinates
-# @batch bs.vector
-
-await entity B5-0-0-0-1
-
-scoreboard players set $vector.spherical_to_cartesian.0 bs.in 15250
-scoreboard players set $vector.spherical_to_cartesian.1 bs.in 42000
-scoreboard players set $vector.spherical_to_cartesian.2 bs.in 8525
-
-function #bs.vector:spherical_to_cartesian {scaling:1000}
-
-assert score $vector.spherical_to_cartesian.0 bs.out matches -1667..-1665
-assert score $vector.spherical_to_cartesian.1 bs.out matches -5704..-5702
-assert score $vector.spherical_to_cartesian.2 bs.out matches 6111..6113
diff --git a/datapacks/Bookshelf/data/bs.view/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.view/.metadata/generated/features.json
deleted file mode 100644
index 1859853f36..0000000000
--- a/datapacks/Bookshelf/data/bs.view/.metadata/generated/features.json
+++ /dev/null
@@ -1,157 +0,0 @@
-[
- {
- "name": "as_aimed_entity",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#aimed-entity",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/11/30",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/03/30",
- "version": "1.20.4"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- },
- {
- "name": "as_looked_entity",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#looked-entity",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/12/06",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/03/30",
- "version": "1.20.4"
- }
- },
- {
- "name": "at_aimed_block",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#aimed-block",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/11/30",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/03/30",
- "version": "1.20.4"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- },
- {
- "name": "at_aimed_entity",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#aimed-entity",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/11/30",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/03/30",
- "version": "1.20.4"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- },
- {
- "name": "at_aimed_point",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#aimed-point",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/25",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/03/30",
- "version": "1.20.4"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- },
- {
- "name": "at_block_placement",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#block-placement",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/24",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/05/09",
- "version": "1.20.6"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- },
- {
- "name": "at_looked_entity",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#looked-entity",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/12/06",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/03/30",
- "version": "1.20.4"
- }
- },
- {
- "name": "can_see_ata",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#can-see-as-to-at",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2019/05/20",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/04/20",
- "version": "1.20.4"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- },
- {
- "name": "in_view_ata",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#in-view-as-to-at",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2019/05/20",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/04/20",
- "version": "1.20.4"
- }
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.view/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.view/.metadata/generated/module.json
deleted file mode 100644
index 40dd7465ae..0000000000
--- a/datapacks/Bookshelf/data/bs.view/.metadata/generated/module.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "name": "bs.view",
- "display_name": "View",
- "description": "Execute commands based on what an entity sees.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "dependencies": [
- "bs.hitbox",
- "bs.raycast"
- ],
- "features": [
- "bs.view:as_aimed_entity",
- "bs.view:as_looked_entity",
- "bs.view:at_aimed_block",
- "bs.view:at_aimed_entity",
- "bs.view:at_aimed_point",
- "bs.view:at_block_placement",
- "bs.view:at_looked_entity",
- "bs.view:can_see_ata",
- "bs.view:in_view_ata"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.view/.metadata/module.json b/datapacks/Bookshelf/data/bs.view/.metadata/module.json
deleted file mode 100644
index 55ada81d77..0000000000
--- a/datapacks/Bookshelf/data/bs.view/.metadata/module.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "bs.view",
- "display_name": "View",
- "description": "Execute commands based on what an entity sees.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html",
- "dependencies": [
- "bs.raycast"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.view/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.view/function/__help__.mcfunction
deleted file mode 100644
index 1872ba8514..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/__help__.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.view documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.view/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.view/function/__load__.mcfunction
deleted file mode 100644
index 30d565a3d4..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/__load__.mcfunction
+++ /dev/null
@@ -1,26 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-forceload add -30000000 1600
-execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
-
-scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
-
-execute unless data storage bs:in view.can_see_ata run data modify storage bs:in view.can_see_ata set value { \
- ignored_blocks: "#bs.view:can_see_through", \
-}
-
-execute unless data storage bs:in view.in_view_ata run data modify storage bs:in view.in_view_ata set value { \
- angle: 120.0, \
-}
diff --git a/datapacks/Bookshelf/data/bs.view/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.view/function/__unload__.mcfunction
deleted file mode 100644
index 2d7040f755..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/__unload__.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-kill B5-0-0-0-1
-forceload remove -30000000 1600
-
-scoreboard objectives remove bs.data
-
-data remove storage bs:in view
-data remove storage bs:data view
diff --git a/datapacks/Bookshelf/data/bs.view/function/aimed_block/at_aimed_block.mcfunction b/datapacks/Bookshelf/data/bs.view/function/aimed_block/at_aimed_block.mcfunction
deleted file mode 100644
index 75722c1aa2..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/aimed_block/at_aimed_block.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#aimed-block
-# ------------------------------------------------------------------------------------------------------------
-
-# run the raycast at the entity eyes
-tag @s add bs.view.this
-$data modify storage bs:data raycast.on_targeted_block set value 'execute as @n[tag=bs.view.this,sort=arbitrary] run $(run)'
-execute at @s anchored eyes positioned ^ ^ ^ run function bs.raycast:run
-tag @s remove bs.view.this
diff --git a/datapacks/Bookshelf/data/bs.view/function/aimed_block/with.mcfunction b/datapacks/Bookshelf/data/bs.view/function/aimed_block/with.mcfunction
deleted file mode 100644
index b9bc0f59c5..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/aimed_block/with.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data raycast set value { \
- blocks: true, \
- entities: false, \
- max_distance: 16.0, \
- ignored_blocks: "#bs.hitbox:intangible", \
- ignored_entities: "#bs.hitbox:intangible", \
-}
-$data modify storage bs:data raycast merge value $(with)
diff --git a/datapacks/Bookshelf/data/bs.view/function/aimed_entity/as_aimed_entity.mcfunction b/datapacks/Bookshelf/data/bs.view/function/aimed_entity/as_aimed_entity.mcfunction
deleted file mode 100644
index 6852fa4193..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/aimed_entity/as_aimed_entity.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#aimed-entity
-# ------------------------------------------------------------------------------------------------------------
-
-# run the raycast at the entity eyes
-tag @s add bs.view.this
-$data modify storage bs:data raycast.on_targeted_entity set value 'execute at @n[tag=bs.view.this,sort=arbitrary] run $(run)'
-execute at @s anchored eyes positioned ^ ^ ^ run function bs.raycast:run
-tag @s remove bs.view.this
diff --git a/datapacks/Bookshelf/data/bs.view/function/aimed_entity/at_aimed_entity.mcfunction b/datapacks/Bookshelf/data/bs.view/function/aimed_entity/at_aimed_entity.mcfunction
deleted file mode 100644
index 0ec888e48b..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/aimed_entity/at_aimed_entity.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#aimed-entity
-# ------------------------------------------------------------------------------------------------------------
-
-# run the raycast at the entity eyes
-tag @s add bs.view.this
-$data modify storage bs:data raycast.on_targeted_entity set value 'execute as @n[tag=bs.view.this,sort=arbitrary] run $(run)'
-execute at @s anchored eyes positioned ^ ^ ^ run function bs.raycast:run
-tag @s remove bs.view.this
diff --git a/datapacks/Bookshelf/data/bs.view/function/aimed_entity/with.mcfunction b/datapacks/Bookshelf/data/bs.view/function/aimed_entity/with.mcfunction
deleted file mode 100644
index d8a0e7e249..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/aimed_entity/with.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data raycast set value { \
- blocks: true, \
- entities: true, \
- max_distance: 16.0, \
- ignored_blocks: "#bs.hitbox:intangible", \
- ignored_entities: "#bs.hitbox:intangible", \
-}
-$data modify storage bs:data raycast merge value $(with)
diff --git a/datapacks/Bookshelf/data/bs.view/function/aimed_point/at_aimed_point.mcfunction b/datapacks/Bookshelf/data/bs.view/function/aimed_point/at_aimed_point.mcfunction
deleted file mode 100644
index 4f0a658602..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/aimed_point/at_aimed_point.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#aimed-point
-# ------------------------------------------------------------------------------------------------------------
-
-# run the raycast at the entity eyes
-tag @s add bs.view.this
-$data modify storage bs:data raycast.on_hit_point set value 'execute as @n[tag=bs.view.this,sort=arbitrary] run $(run)'
-execute at @s anchored eyes positioned ^ ^ ^ run function bs.raycast:run
-tag @s remove bs.view.this
diff --git a/datapacks/Bookshelf/data/bs.view/function/aimed_point/with.mcfunction b/datapacks/Bookshelf/data/bs.view/function/aimed_point/with.mcfunction
deleted file mode 100644
index d8a0e7e249..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/aimed_point/with.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data raycast set value { \
- blocks: true, \
- entities: true, \
- max_distance: 16.0, \
- ignored_blocks: "#bs.hitbox:intangible", \
- ignored_entities: "#bs.hitbox:intangible", \
-}
-$data modify storage bs:data raycast merge value $(with)
diff --git a/datapacks/Bookshelf/data/bs.view/function/block_placement/at_block_placement.mcfunction b/datapacks/Bookshelf/data/bs.view/function/block_placement/at_block_placement.mcfunction
deleted file mode 100644
index e60b210f1b..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/block_placement/at_block_placement.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#block-placement
-# ------------------------------------------------------------------------------------------------------------
-
-# run the raycast at the entity eyes
-tag @s add bs.view.this
-$data modify storage bs:data raycast.on_targeted_block set value 'function bs.view:block_placement/compute {run:\'$(run)\'}'
-execute at @s anchored eyes positioned ^ ^ ^ run function bs.raycast:run
-tag @s remove bs.view.this
diff --git a/datapacks/Bookshelf/data/bs.view/function/block_placement/compute.mcfunction b/datapacks/Bookshelf/data/bs.view/function/block_placement/compute.mcfunction
deleted file mode 100644
index 7251170129..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/block_placement/compute.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result storage bs:ctx x int 1 run data get storage bs:out raycast.hit_normal[0]
-execute store result storage bs:ctx y int 1 run data get storage bs:out raycast.hit_normal[1]
-execute store result storage bs:ctx z int 1 run data get storage bs:out raycast.hit_normal[2]
-
-function bs.view:block_placement/displace with storage bs:ctx
-$execute at @s as @n[tag=bs.view.this,sort=arbitrary] run $(run)
diff --git a/datapacks/Bookshelf/data/bs.view/function/block_placement/with.mcfunction b/datapacks/Bookshelf/data/bs.view/function/block_placement/with.mcfunction
deleted file mode 100644
index b9bc0f59c5..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/block_placement/with.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data raycast set value { \
- blocks: true, \
- entities: false, \
- max_distance: 16.0, \
- ignored_blocks: "#bs.hitbox:intangible", \
- ignored_entities: "#bs.hitbox:intangible", \
-}
-$data modify storage bs:data raycast merge value $(with)
diff --git a/datapacks/Bookshelf/data/bs.view/function/can_see_ata/can_see_ata.mcfunction b/datapacks/Bookshelf/data/bs.view/function/can_see_ata/can_see_ata.mcfunction
deleted file mode 100644
index 5253ed0f48..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/can_see_ata/can_see_ata.mcfunction
+++ /dev/null
@@ -1,26 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#can-see-as-to-at
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:ctx _ set from entity @s Pos
-data modify storage bs:ctx x set from storage bs:ctx _[0]
-data modify storage bs:ctx y set from storage bs:ctx _[1]
-data modify storage bs:ctx z set from storage bs:ctx _[2]
-execute summon minecraft:marker run function bs.view:can_see_ata/max_distance/get_rpos with storage bs:ctx
-function bs.view:can_see_ata/max_distance/compute with storage bs:ctx
-
-execute facing entity @s eyes run function bs.raycast:run
-return run execute if score #raycast.distance bs.data matches 2147483647
diff --git a/datapacks/Bookshelf/data/bs.view/function/can_see_ata/max_distance/compute.mcfunction b/datapacks/Bookshelf/data/bs.view/function/can_see_ata/max_distance/compute.mcfunction
deleted file mode 100644
index db0ff62dd5..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/can_see_ata/max_distance/compute.mcfunction
+++ /dev/null
@@ -1,19 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# compute Euclidean distance: sqrt(x^2+y^2+z^2)
-# Thanks to Triton365 for sharing this trick on the Minecraft Commands discord
-$data modify entity @s transformation set value [$(x)f,0f,0f,0f,$(y)f,0f,0f,0f,$(z)f,0f,0f,0f,0f,0f,0f,1f]
-data modify storage bs:data raycast.max_distance set from entity @s transformation.scale[0]
diff --git a/datapacks/Bookshelf/data/bs.view/function/can_see_ata/with.mcfunction b/datapacks/Bookshelf/data/bs.view/function/can_see_ata/with.mcfunction
deleted file mode 100644
index 43a1907d74..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/can_see_ata/with.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-data modify storage bs:data raycast set value { \
- blocks: true, \
- entities: false, \
- ignored_blocks: "#bs.view:can_see_through", \
- ignored_entities: "#bs.hitbox:intangible", \
-}
-$data modify storage bs:data raycast merge value $(with)
diff --git a/datapacks/Bookshelf/data/bs.view/function/in_view_ata/check.mcfunction b/datapacks/Bookshelf/data/bs.view/function/in_view_ata/check.mcfunction
deleted file mode 100644
index 4024a73059..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/in_view_ata/check.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$return run execute if entity @s[distance=..$(x)]
diff --git a/datapacks/Bookshelf/data/bs.view/function/in_view_ata/in_view_ata.mcfunction b/datapacks/Bookshelf/data/bs.view/function/in_view_ata/in_view_ata.mcfunction
deleted file mode 100644
index a0cdd3063e..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/in_view_ata/in_view_ata.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#in-view-as-to-at
-# ------------------------------------------------------------------------------------------------------------
-
-$data modify storage bs:ctx _ set value $(angle)
-execute in minecraft:overworld as B5-0-0-0-1 run function bs.view:in_view_ata/angle
-execute facing entity @s eyes positioned as @s positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^1 run \
- return run function bs.view:in_view_ata/check with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.view/function/looked_entity/as_looked_entity.mcfunction b/datapacks/Bookshelf/data/bs.view/function/looked_entity/as_looked_entity.mcfunction
deleted file mode 100644
index 303b0cf310..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/looked_entity/as_looked_entity.mcfunction
+++ /dev/null
@@ -1,29 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#looked-entity
-# ------------------------------------------------------------------------------------------------------------
-
-execute unless predicate bs.view:is_looking_at_entity run return fail
-execute if entity @n[tag=bs.view.is_lookable,tag=!bs.view.bi,sort=arbitrary] run function bs.view:looked_entity/setup
-tag @n[tag=bs.view.is_lookable,sort=arbitrary,limit=255] add bs.view.selected
-execute if score #view.looked_entity bs.data matches 1.. if predicate bs.view:looked_entity/b0 run tag @n[tag=bs.view.selected,tag=!bs.view.b0,sort=arbitrary,limit=255] remove bs.view.selected
-execute if score #view.looked_entity bs.data matches 2.. if predicate bs.view:looked_entity/b1 run tag @n[tag=bs.view.selected,tag=!bs.view.b1,sort=arbitrary,limit=255] remove bs.view.selected
-execute if score #view.looked_entity bs.data matches 4.. if predicate bs.view:looked_entity/b2 run tag @n[tag=bs.view.selected,tag=!bs.view.b2,sort=arbitrary,limit=255] remove bs.view.selected
-execute if score #view.looked_entity bs.data matches 8.. if predicate bs.view:looked_entity/b3 run tag @n[tag=bs.view.selected,tag=!bs.view.b3,sort=arbitrary,limit=255] remove bs.view.selected
-execute if score #view.looked_entity bs.data matches 16.. if predicate bs.view:looked_entity/b4 run tag @n[tag=bs.view.selected,tag=!bs.view.b4,sort=arbitrary,limit=255] remove bs.view.selected
-execute if score #view.looked_entity bs.data matches 32.. if predicate bs.view:looked_entity/b5 run tag @n[tag=bs.view.selected,tag=!bs.view.b5,sort=arbitrary,limit=255] remove bs.view.selected
-execute if score #view.looked_entity bs.data matches 64.. if predicate bs.view:looked_entity/b6 run tag @n[tag=bs.view.selected,tag=!bs.view.b6,sort=arbitrary,limit=255] remove bs.view.selected
-execute if score #view.looked_entity bs.data matches 128.. if predicate bs.view:looked_entity/b7 run tag @n[tag=bs.view.selected,tag=!bs.view.b7,sort=arbitrary,limit=255] remove bs.view.selected
-$execute as @n[tag=bs.view.is_lookable,tag=bs.view.selected,sort=arbitrary] run return run $(run)
diff --git a/datapacks/Bookshelf/data/bs.view/function/looked_entity/at_looked_entity.mcfunction b/datapacks/Bookshelf/data/bs.view/function/looked_entity/at_looked_entity.mcfunction
deleted file mode 100644
index 9e89587e5a..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/looked_entity/at_looked_entity.mcfunction
+++ /dev/null
@@ -1,29 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#looked-entity
-# ------------------------------------------------------------------------------------------------------------
-
-execute unless predicate bs.view:is_looking_at_entity run return fail
-execute if entity @n[tag=bs.view.is_lookable,tag=!bs.view.bi,sort=arbitrary] run function bs.view:looked_entity/setup
-tag @n[tag=bs.view.is_lookable,sort=arbitrary,limit=255] add bs.view.selected
-execute if score #view.looked_entity bs.data matches 1.. if predicate bs.view:looked_entity/b0 run tag @n[tag=bs.view.selected,tag=!bs.view.b0,sort=arbitrary,limit=255] remove bs.view.selected
-execute if score #view.looked_entity bs.data matches 2.. if predicate bs.view:looked_entity/b1 run tag @n[tag=bs.view.selected,tag=!bs.view.b1,sort=arbitrary,limit=255] remove bs.view.selected
-execute if score #view.looked_entity bs.data matches 4.. if predicate bs.view:looked_entity/b2 run tag @n[tag=bs.view.selected,tag=!bs.view.b2,sort=arbitrary,limit=255] remove bs.view.selected
-execute if score #view.looked_entity bs.data matches 8.. if predicate bs.view:looked_entity/b3 run tag @n[tag=bs.view.selected,tag=!bs.view.b3,sort=arbitrary,limit=255] remove bs.view.selected
-execute if score #view.looked_entity bs.data matches 16.. if predicate bs.view:looked_entity/b4 run tag @n[tag=bs.view.selected,tag=!bs.view.b4,sort=arbitrary,limit=255] remove bs.view.selected
-execute if score #view.looked_entity bs.data matches 32.. if predicate bs.view:looked_entity/b5 run tag @n[tag=bs.view.selected,tag=!bs.view.b5,sort=arbitrary,limit=255] remove bs.view.selected
-execute if score #view.looked_entity bs.data matches 64.. if predicate bs.view:looked_entity/b6 run tag @n[tag=bs.view.selected,tag=!bs.view.b6,sort=arbitrary,limit=255] remove bs.view.selected
-execute if score #view.looked_entity bs.data matches 128.. if predicate bs.view:looked_entity/b7 run tag @n[tag=bs.view.selected,tag=!bs.view.b7,sort=arbitrary,limit=255] remove bs.view.selected
-$execute at @n[tag=bs.view.is_lookable,tag=bs.view.selected,sort=arbitrary] run return run $(run)
diff --git a/datapacks/Bookshelf/data/bs.view/function/looked_entity/setup.mcfunction b/datapacks/Bookshelf/data/bs.view/function/looked_entity/setup.mcfunction
deleted file mode 100644
index 67cec50431..0000000000
--- a/datapacks/Bookshelf/data/bs.view/function/looked_entity/setup.mcfunction
+++ /dev/null
@@ -1,45 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-tag @n[tag=bs.view.b0,sort=arbitrary,limit=255] remove bs.view.b0
-tag @n[tag=bs.view.b1,sort=arbitrary,limit=255] remove bs.view.b1
-tag @n[tag=bs.view.b2,sort=arbitrary,limit=255] remove bs.view.b2
-tag @n[tag=bs.view.b3,sort=arbitrary,limit=255] remove bs.view.b3
-tag @n[tag=bs.view.b4,sort=arbitrary,limit=255] remove bs.view.b4
-tag @n[tag=bs.view.b5,sort=arbitrary,limit=255] remove bs.view.b5
-tag @n[tag=bs.view.b6,sort=arbitrary,limit=255] remove bs.view.b6
-tag @n[tag=bs.view.b7,sort=arbitrary,limit=255] remove bs.view.b7
-tag @n[tag=bs.view.bi,sort=arbitrary,limit=255] remove bs.view.bi
-
-scoreboard players set #view.looked_entity bs.data 0
-execute as @n[tag=bs.view.is_lookable,sort=arbitrary,limit=255] store result score @s bs.data run scoreboard players add #view.looked_entity bs.data 1
-
-tag @n[tag=bs.view.is_lookable,scores={bs.data=128..},sort=arbitrary,limit=255] add bs.view.b7
-scoreboard players remove @n[tag=bs.view.is_lookable,scores={bs.data=128..},sort=arbitrary,limit=255] bs.data 128
-tag @n[tag=bs.view.is_lookable,scores={bs.data=64..},sort=arbitrary,limit=255] add bs.view.b6
-scoreboard players remove @n[tag=bs.view.is_lookable,scores={bs.data=64..},sort=arbitrary,limit=255] bs.data 64
-tag @n[tag=bs.view.is_lookable,scores={bs.data=32..},sort=arbitrary,limit=255] add bs.view.b5
-scoreboard players remove @n[tag=bs.view.is_lookable,scores={bs.data=32..},sort=arbitrary,limit=255] bs.data 32
-tag @n[tag=bs.view.is_lookable,scores={bs.data=16..},sort=arbitrary,limit=255] add bs.view.b4
-scoreboard players remove @n[tag=bs.view.is_lookable,scores={bs.data=16..},sort=arbitrary,limit=255] bs.data 16
-tag @n[tag=bs.view.is_lookable,scores={bs.data=8..},sort=arbitrary,limit=255] add bs.view.b3
-scoreboard players remove @n[tag=bs.view.is_lookable,scores={bs.data=8..},sort=arbitrary,limit=255] bs.data 8
-tag @n[tag=bs.view.is_lookable,scores={bs.data=4..},sort=arbitrary,limit=255] add bs.view.b2
-scoreboard players remove @n[tag=bs.view.is_lookable,scores={bs.data=4..},sort=arbitrary,limit=255] bs.data 4
-tag @n[tag=bs.view.is_lookable,scores={bs.data=2..},sort=arbitrary,limit=255] add bs.view.b1
-scoreboard players remove @n[tag=bs.view.is_lookable,scores={bs.data=2..},sort=arbitrary,limit=255] bs.data 2
-tag @n[tag=bs.view.is_lookable,scores={bs.data=1..},sort=arbitrary,limit=255] add bs.view.b0
-scoreboard players reset @n[tag=bs.view.is_lookable,sort=arbitrary,limit=255] bs.data
-tag @n[tag=bs.view.is_lookable,sort=arbitrary,limit=255] add bs.view.bi
diff --git a/datapacks/Bookshelf/data/bs.view/predicate/is_looking_at_entity.json b/datapacks/Bookshelf/data/bs.view/predicate/is_looking_at_entity.json
deleted file mode 100644
index 78e8832391..0000000000
--- a/datapacks/Bookshelf/data/bs.view/predicate/is_looking_at_entity.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "condition": "minecraft:entity_properties",
- "entity": "this",
- "predicate": {
- "type_specific": {
- "type": "player",
- "looking_at": {
- "nbt": "{Tags:[\"bs.view.is_lookable\"]}"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b0.json b/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b0.json
deleted file mode 100644
index 8dbe5fac25..0000000000
--- a/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b0.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "condition": "minecraft:entity_properties",
- "entity": "this",
- "predicate": {
- "type_specific": {
- "type": "player",
- "looking_at": {
- "nbt": "{Tags:[\"bs.view.b0\"]}"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b1.json b/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b1.json
deleted file mode 100644
index d7bccebc12..0000000000
--- a/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b1.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "condition": "minecraft:entity_properties",
- "entity": "this",
- "predicate": {
- "type_specific": {
- "type": "player",
- "looking_at": {
- "nbt": "{Tags:[\"bs.view.b1\"]}"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b2.json b/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b2.json
deleted file mode 100644
index d4e5ccad3d..0000000000
--- a/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b2.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "condition": "minecraft:entity_properties",
- "entity": "this",
- "predicate": {
- "type_specific": {
- "type": "player",
- "looking_at": {
- "nbt": "{Tags:[\"bs.view.b2\"]}"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b3.json b/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b3.json
deleted file mode 100644
index 0ed3ee8b17..0000000000
--- a/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b3.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "condition": "minecraft:entity_properties",
- "entity": "this",
- "predicate": {
- "type_specific": {
- "type": "player",
- "looking_at": {
- "nbt": "{Tags:[\"bs.view.b3\"]}"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b4.json b/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b4.json
deleted file mode 100644
index e41d6e405c..0000000000
--- a/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b4.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "condition": "minecraft:entity_properties",
- "entity": "this",
- "predicate": {
- "type_specific": {
- "type": "player",
- "looking_at": {
- "nbt": "{Tags:[\"bs.view.b4\"]}"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b5.json b/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b5.json
deleted file mode 100644
index b97add4774..0000000000
--- a/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b5.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "condition": "minecraft:entity_properties",
- "entity": "this",
- "predicate": {
- "type_specific": {
- "type": "player",
- "looking_at": {
- "nbt": "{Tags:[\"bs.view.b5\"]}"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b6.json b/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b6.json
deleted file mode 100644
index 56ce4ff9b4..0000000000
--- a/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b6.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "condition": "minecraft:entity_properties",
- "entity": "this",
- "predicate": {
- "type_specific": {
- "type": "player",
- "looking_at": {
- "nbt": "{Tags:[\"bs.view.b6\"]}"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b7.json b/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b7.json
deleted file mode 100644
index 6f2fd5f84d..0000000000
--- a/datapacks/Bookshelf/data/bs.view/predicate/looked_entity/b7.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "condition": "minecraft:entity_properties",
- "entity": "this",
- "predicate": {
- "type_specific": {
- "type": "player",
- "looking_at": {
- "nbt": "{Tags:[\"bs.view.b7\"]}"
- }
- }
- }
-}
diff --git a/datapacks/Bookshelf/data/bs.view/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.view/tags/function/exclusive_load.json
deleted file mode 100644
index 8c1ce9cb68..0000000000
--- a/datapacks/Bookshelf/data/bs.view/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.view:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.view/tags/function/help.json b/datapacks/Bookshelf/data/bs.view/tags/function/help.json
deleted file mode 100644
index ad631d11f0..0000000000
--- a/datapacks/Bookshelf/data/bs.view/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.view:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.view/tags/function/load.json b/datapacks/Bookshelf/data/bs.view/tags/function/load.json
deleted file mode 100644
index 1b9ed48375..0000000000
--- a/datapacks/Bookshelf/data/bs.view/tags/function/load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#bs.raycast:load",
- "bs.view:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.view/tags/function/unload.json b/datapacks/Bookshelf/data/bs.view/tags/function/unload.json
deleted file mode 100644
index 1d726d52eb..0000000000
--- a/datapacks/Bookshelf/data/bs.view/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.view:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.view/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.view/test/__boot__.mcfunction
deleted file mode 100644
index 2d8e9906a4..0000000000
--- a/datapacks/Bookshelf/data/bs.view/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.view
-# @beforebatch function #bs.view:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.view/test/as_aimed_entity.mcfunction b/datapacks/Bookshelf/data/bs.view/test/as_aimed_entity.mcfunction
deleted file mode 100644
index 7a7b8ef3a9..0000000000
--- a/datapacks/Bookshelf/data/bs.view/test/as_aimed_entity.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Callback is run as the targeted entity
-# @batch bs.view
-# @dummy
-
-fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
-summon minecraft:armor_stand ~.5 ~ ~1.5 {Tags:["bs.raycast.is_solid"],NoGravity:1b}
-function #bs.view:as_aimed_entity {run:"tag @s add bs.found",with:{}}
-assert entity @e[type=minecraft:armor_stand,tag=bs.found] inside
diff --git a/datapacks/Bookshelf/data/bs.view/test/as_looked_entity.mcfunction b/datapacks/Bookshelf/data/bs.view/test/as_looked_entity.mcfunction
deleted file mode 100644
index f7bb9e9310..0000000000
--- a/datapacks/Bookshelf/data/bs.view/test/as_looked_entity.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Callback is run as the looked at entity
-# @batch bs.view
-# @dummy
-
-fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
-summon minecraft:armor_stand ~.5 ~ ~1.5 {Tags:["bs.view.is_lookable"],NoGravity:1b}
-function #bs.view:as_looked_entity {run:"tag @s add bs.found"}
-assert entity @e[type=minecraft:armor_stand,tag=bs.found] inside
diff --git a/datapacks/Bookshelf/data/bs.view/test/at_aimed_block.mcfunction b/datapacks/Bookshelf/data/bs.view/test/at_aimed_block.mcfunction
deleted file mode 100644
index a233fa0a53..0000000000
--- a/datapacks/Bookshelf/data/bs.view/test/at_aimed_block.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Callback is run at the targeted block
-# @batch bs.view
-# @dummy
-
-fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
-setblock ~ ~1 ~1 minecraft:sponge
-function #bs.view:at_aimed_block {run:"setblock ~ ~ ~ minecraft:bookshelf",with:{}}
-assert block ~ ~1 ~1 minecraft:bookshelf
diff --git a/datapacks/Bookshelf/data/bs.view/test/at_aimed_entity.mcfunction b/datapacks/Bookshelf/data/bs.view/test/at_aimed_entity.mcfunction
deleted file mode 100644
index b9e47fc3c0..0000000000
--- a/datapacks/Bookshelf/data/bs.view/test/at_aimed_entity.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Callback is run at the targeted entity
-# @batch bs.view
-# @dummy
-
-fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
-summon minecraft:armor_stand ~.5 ~ ~1.5 {Tags:["bs.raycast.is_solid"],NoGravity:1b}
-function #bs.view:at_aimed_entity {run:"tag @e[distance=0] add bs.found",with:{}}
-assert entity @e[type=minecraft:armor_stand,tag=bs.found] inside
diff --git a/datapacks/Bookshelf/data/bs.view/test/at_aimed_point.mcfunction b/datapacks/Bookshelf/data/bs.view/test/at_aimed_point.mcfunction
deleted file mode 100644
index 30d555eefc..0000000000
--- a/datapacks/Bookshelf/data/bs.view/test/at_aimed_point.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Callback is run at the hit point
-# @batch bs.view
-# @dummy
-
-fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
-setblock ~ ~1 ~1 minecraft:bookshelf
-function #bs.view:at_aimed_point {run:"summon minecraft:marker ~ ~ ~",with:{}}
-execute at @s anchored eyes positioned ^ ^ ^.5 run assert entity @e[type=minecraft:marker,distance=..0.1]
diff --git a/datapacks/Bookshelf/data/bs.view/test/at_block_placement.mcfunction b/datapacks/Bookshelf/data/bs.view/test/at_block_placement.mcfunction
deleted file mode 100644
index ce64ffc1c9..0000000000
--- a/datapacks/Bookshelf/data/bs.view/test/at_block_placement.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Callback is run at the placed block
-# @batch bs.view
-# @dummy
-
-fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
-setblock ~ ~1 ~1 minecraft:sponge
-function #bs.view:at_block_placement {run:"setblock ~ ~ ~ minecraft:bookshelf",with:{}}
-assert block ~ ~1 ~ minecraft:bookshelf
diff --git a/datapacks/Bookshelf/data/bs.view/test/at_looked_entity.mcfunction b/datapacks/Bookshelf/data/bs.view/test/at_looked_entity.mcfunction
deleted file mode 100644
index af64209a48..0000000000
--- a/datapacks/Bookshelf/data/bs.view/test/at_looked_entity.mcfunction
+++ /dev/null
@@ -1,8 +0,0 @@
-# Callback is run at the looked at entity
-# @batch bs.view
-# @dummy
-
-fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
-summon minecraft:armor_stand ~.5 ~ ~1.5 {Tags:["bs.view.is_lookable"],NoGravity:1b}
-function #bs.view:at_looked_entity {run:"tag @e[distance=0] add bs.found"}
-assert entity @e[type=minecraft:armor_stand,tag=bs.found] inside
diff --git a/datapacks/Bookshelf/data/bs.view/test/can_see_ata.mcfunction b/datapacks/Bookshelf/data/bs.view/test/can_see_ata.mcfunction
deleted file mode 100644
index 6b4973233e..0000000000
--- a/datapacks/Bookshelf/data/bs.view/test/can_see_ata.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# Check the whole distance between the executor and the position
-# @batch bs.view
-# @dummy
-
-fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
-setblock ~ ~1 ~1 minecraft:bookshelf
-
-execute at @s positioned ~ ~1 ~.5 store result score #success bs.data run function #bs.view:can_see_ata {with:{}}
-execute if score #success bs.data matches 1 run fail "Position must be obstructed when reaching a block"
-
-execute at @s positioned ~ ~1 ~.49 store result score #success bs.data run function #bs.view:can_see_ata {with:{}}
-execute if score #success bs.data matches 0 run fail "Position must be unobstructed before reaching a block"
diff --git a/datapacks/Bookshelf/data/bs.view/test/in_view_ata.mcfunction b/datapacks/Bookshelf/data/bs.view/test/in_view_ata.mcfunction
deleted file mode 100644
index d699a69e6c..0000000000
--- a/datapacks/Bookshelf/data/bs.view/test/in_view_ata.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Check multiple vision angles
-# @batch bs.view
-# @dummy
-
-execute at @s anchored eyes positioned ^1 ^ ^1 store result score #success bs.data run function #bs.view:in_view_ata {angle:90}
-execute if score #success bs.data matches 1 run fail "Position must not be within the 90-degree viewing angle"
-
-execute at @s anchored eyes positioned ^.99 ^ ^1 store result score #success bs.data run function #bs.view:in_view_ata {angle:90}
-execute if score #success bs.data matches 0 run fail "Position must be within the 90-degree viewing angle"
diff --git a/datapacks/Bookshelf/data/bs.weather/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.weather/.metadata/generated/features.json
deleted file mode 100644
index fe51488c70..0000000000
--- a/datapacks/Bookshelf/data/bs.weather/.metadata/generated/features.json
+++ /dev/null
@@ -1 +0,0 @@
-[]
diff --git a/datapacks/Bookshelf/data/bs.weather/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.weather/.metadata/generated/module.json
deleted file mode 100644
index 99db47ace8..0000000000
--- a/datapacks/Bookshelf/data/bs.weather/.metadata/generated/module.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "name": "bs.weather",
- "display_name": "Weather",
- "description": "Everything concerning the weather.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/weather.html",
- "authors": [],
- "features": []
-}
diff --git a/datapacks/Bookshelf/data/bs.weather/.metadata/module.json b/datapacks/Bookshelf/data/bs.weather/.metadata/module.json
deleted file mode 100644
index f24d86c20f..0000000000
--- a/datapacks/Bookshelf/data/bs.weather/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.weather",
- "display_name": "Weather",
- "description": "Everything concerning the weather.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/weather.html"
-}
diff --git a/datapacks/Bookshelf/data/bs.weather/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.weather/function/__help__.mcfunction
deleted file mode 100644
index f6c615344c..0000000000
--- a/datapacks/Bookshelf/data/bs.weather/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/weather.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.weather documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/weather.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.weather/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.weather/function/__load__.mcfunction
deleted file mode 100644
index 51cfd30cf8..0000000000
--- a/datapacks/Bookshelf/data/bs.weather/function/__load__.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/tree.html
-# ------------------------------------------------------------------------------------------------------------
diff --git a/datapacks/Bookshelf/data/bs.weather/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.weather/function/__unload__.mcfunction
deleted file mode 100644
index 51cfd30cf8..0000000000
--- a/datapacks/Bookshelf/data/bs.weather/function/__unload__.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/tree.html
-# ------------------------------------------------------------------------------------------------------------
diff --git a/datapacks/Bookshelf/data/bs.weather/predicate/is_raining.json b/datapacks/Bookshelf/data/bs.weather/predicate/is_raining.json
deleted file mode 100644
index 99541a284c..0000000000
--- a/datapacks/Bookshelf/data/bs.weather/predicate/is_raining.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "condition": "weather_check",
- "raining": true
-}
diff --git a/datapacks/Bookshelf/data/bs.weather/predicate/is_thundering.json b/datapacks/Bookshelf/data/bs.weather/predicate/is_thundering.json
deleted file mode 100644
index 64fd7db19d..0000000000
--- a/datapacks/Bookshelf/data/bs.weather/predicate/is_thundering.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "condition": "weather_check",
- "thundering": true
-}
diff --git a/datapacks/Bookshelf/data/bs.weather/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.weather/tags/function/exclusive_load.json
deleted file mode 100644
index 8198a7f5c6..0000000000
--- a/datapacks/Bookshelf/data/bs.weather/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.weather:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.weather/tags/function/help.json b/datapacks/Bookshelf/data/bs.weather/tags/function/help.json
deleted file mode 100644
index ebaabc0684..0000000000
--- a/datapacks/Bookshelf/data/bs.weather/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.weather:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.weather/tags/function/load.json b/datapacks/Bookshelf/data/bs.weather/tags/function/load.json
deleted file mode 100644
index eea34c9637..0000000000
--- a/datapacks/Bookshelf/data/bs.weather/tags/function/load.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.weather:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.weather/tags/function/unload.json b/datapacks/Bookshelf/data/bs.weather/tags/function/unload.json
deleted file mode 100644
index 0850039be3..0000000000
--- a/datapacks/Bookshelf/data/bs.weather/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.weather:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.xp/.metadata/generated/features.json b/datapacks/Bookshelf/data/bs.xp/.metadata/generated/features.json
deleted file mode 100644
index de45ada1bd..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/.metadata/generated/features.json
+++ /dev/null
@@ -1,178 +0,0 @@
-[
- {
- "name": "add_levels",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#add-remove",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2022/04/14",
- "version": "1.18.2"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "add_points",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#add-remove",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2022/04/14",
- "version": "1.18.2"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "add_progress",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#add-remove",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/08/31",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2024/03/08",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_max_points",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#get",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/08/31",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "get_progress",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#get",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2022/04/14",
- "version": "1.18.2"
- },
- "updated": {
- "date": "2024/03/08",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_remaining_points",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#get",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/08/31",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "get_total_points",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#get",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2022/04/14",
- "version": "1.18.2"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "set_levels",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#set",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2022/04/14",
- "version": "1.18.2"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "set_points",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#set",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2022/04/14",
- "version": "1.18.2"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "set_progress",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#set",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2022/04/14",
- "version": "1.18.2"
- },
- "updated": {
- "date": "2024/03/08",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_total_points",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#set",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2022/04/14",
- "version": "1.18.2"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- }
-]
diff --git a/datapacks/Bookshelf/data/bs.xp/.metadata/generated/module.json b/datapacks/Bookshelf/data/bs.xp/.metadata/generated/module.json
deleted file mode 100644
index 9ceaae104f..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/.metadata/generated/module.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "name": "bs.xp",
- "display_name": "XP",
- "description": "Efficiently manage the experience points and levels of players.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "features": [
- "bs.xp:add_levels",
- "bs.xp:add_points",
- "bs.xp:add_progress",
- "bs.xp:get_max_points",
- "bs.xp:get_progress",
- "bs.xp:get_remaining_points",
- "bs.xp:get_total_points",
- "bs.xp:set_levels",
- "bs.xp:set_points",
- "bs.xp:set_progress",
- "bs.xp:set_total_points"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.xp/.metadata/module.json b/datapacks/Bookshelf/data/bs.xp/.metadata/module.json
deleted file mode 100644
index 7c39944c92..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/.metadata/module.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "bs.xp",
- "display_name": "XP",
- "description": "Efficiently manage the experience points and levels of players.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html"
-}
diff --git a/datapacks/Bookshelf/data/bs.xp/function/__help__.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/__help__.mcfunction
deleted file mode 100644
index 99a2baa6f5..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/__help__.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html
-# ------------------------------------------------------------------------------------------------------------
-
-tellraw @s [{"text": "[bs.xp documentation]", "color": "dark_aqua", "clickEvent": {"action": "open_url", "value": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html"}, "hoverEvent": {"action": "show_text", "contents": "Click to open URL"}}]
diff --git a/datapacks/Bookshelf/data/bs.xp/function/__load__.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/__load__.mcfunction
deleted file mode 100644
index 45c8ccf689..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/__load__.mcfunction
+++ /dev/null
@@ -1,31 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
-scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
-scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
-
-scoreboard players set 2 bs.const 2
-scoreboard players set 5 bs.const 5
-scoreboard players set 6 bs.const 6
-scoreboard players set 9 bs.const 9
-scoreboard players set 81 bs.const 81
-scoreboard players set 100 bs.const 100
-scoreboard players set 325 bs.const 325
-
-# level 111111129 => max_points = 1000000002
-data modify storage bs:const xp.progress set value 1000000000
diff --git a/datapacks/Bookshelf/data/bs.xp/function/__unload__.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/__unload__.mcfunction
deleted file mode 100644
index 66b01b913e..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/__unload__.mcfunction
+++ /dev/null
@@ -1,23 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html
-# ------------------------------------------------------------------------------------------------------------
-
-scoreboard objectives remove bs.ctx
-scoreboard objectives remove bs.out
-scoreboard objectives remove bs.const
-
-data remove storage bs:in xp
-data remove storage bs:const xp
diff --git a/datapacks/Bookshelf/data/bs.xp/function/add/levels.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/add/levels.mcfunction
deleted file mode 100644
index 4c4a6adc1a..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/add/levels.mcfunction
+++ /dev/null
@@ -1,17 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#add-remove
-# ------------------------------------------------------------------------------------------------------------
-$xp add @s $(levels) levels
diff --git a/datapacks/Bookshelf/data/bs.xp/function/add/points.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/add/points.mcfunction
deleted file mode 100644
index b7c42e2eb5..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/add/points.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#add-remove
-# ------------------------------------------------------------------------------------------------------------
-
-$xp add @s $(points) points
diff --git a/datapacks/Bookshelf/data/bs.xp/function/add/progress/apply.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/add/progress/apply.mcfunction
deleted file mode 100644
index 7841cb6324..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/add/progress/apply.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$xp add @s $(x) points
diff --git a/datapacks/Bookshelf/data/bs.xp/function/add/progress/progress.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/add/progress/progress.mcfunction
deleted file mode 100644
index 7a5beef1bb..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/add/progress/progress.mcfunction
+++ /dev/null
@@ -1,27 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#add-remove
-# ------------------------------------------------------------------------------------------------------------
-
-# level 111111129 => max_points = 1000000002
-$execute store result storage bs:ctx x int 1 store result score #p bs.ctx run data get storage bs:const xp.progress $(progress)
-execute store result storage bs:ctx y int 1 run xp query @s levels
-xp set @s 111111129 levels
-execute store result score #x bs.ctx run xp query @s points
-scoreboard players operation #p bs.ctx += #x bs.ctx
-execute if score #p bs.ctx matches ..0 run xp set @s 0 points
-execute if score #p bs.ctx matches 1000000000.. run xp set @s 1000000000 points
-execute if score #p bs.ctx matches 1..999999999 run function bs.xp:add/progress/apply with storage bs:ctx
-function bs.xp:utils/restore_levels with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.xp/function/get/max_points/max_points.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/get/max_points/max_points.mcfunction
deleted file mode 100644
index 6123bbc72e..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/get/max_points/max_points.mcfunction
+++ /dev/null
@@ -1,21 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#get
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score $xp.get_max_points bs.out run xp query @s levels
-execute if score $xp.get_max_points bs.out matches 0..15 run return run function bs.xp:get/max_points/range_1
-execute if score $xp.get_max_points bs.out matches 16..30 run return run function bs.xp:get/max_points/range_2
-execute if score $xp.get_max_points bs.out matches 31.. run return run function bs.xp:get/max_points/range_3
diff --git a/datapacks/Bookshelf/data/bs.xp/function/get/max_points/range_1.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/get/max_points/range_1.mcfunction
deleted file mode 100644
index 53a6bedd02..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/get/max_points/range_1.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# 2 × current_level + 7 (for levels 0–15)
-scoreboard players operation $xp.get_max_points bs.out *= 2 bs.const
-return run scoreboard players add $xp.get_max_points bs.out 7
diff --git a/datapacks/Bookshelf/data/bs.xp/function/get/max_points/range_2.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/get/max_points/range_2.mcfunction
deleted file mode 100644
index b455cc1e8c..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/get/max_points/range_2.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# 5 × current_level – 38 (for levels 16–30)
-scoreboard players operation $xp.get_max_points bs.out *= 5 bs.const
-return run scoreboard players remove $xp.get_max_points bs.out 38
diff --git a/datapacks/Bookshelf/data/bs.xp/function/get/max_points/range_3.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/get/max_points/range_3.mcfunction
deleted file mode 100644
index 7c8f863033..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/get/max_points/range_3.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# 9 × current_level – 158 (for levels 31+)
-scoreboard players operation $xp.get_max_points bs.out *= 9 bs.const
-return run scoreboard players remove $xp.get_max_points bs.out 158
diff --git a/datapacks/Bookshelf/data/bs.xp/function/get/progress.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/get/progress.mcfunction
deleted file mode 100644
index 31552d40a7..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/get/progress.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#get
-# ------------------------------------------------------------------------------------------------------------
-
-$execute store result score $xp.get_progress bs.out run return run data get entity @s XpP $(scale)
diff --git a/datapacks/Bookshelf/data/bs.xp/function/get/remaining_points.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/get/remaining_points.mcfunction
deleted file mode 100644
index baa5e6c8e4..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/get/remaining_points.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#get
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score $xp.get_remaining_points bs.out run function #bs.xp:get_max_points
-execute store result score #p bs.ctx run xp query @s points
-return run scoreboard players operation $xp.get_remaining_points bs.out -= #p bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.xp/function/get/total_points/range_1.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/get/total_points/range_1.mcfunction
deleted file mode 100644
index d334e282c4..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/get/total_points/range_1.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# level^2 + 6 × level (at levels 0–16)
-scoreboard players operation #x bs.ctx *= 6 bs.const
-scoreboard players operation #y bs.ctx *= #y bs.ctx
-scoreboard players operation $xp.get_total_points bs.out += #x bs.ctx
-return run scoreboard players operation $xp.get_total_points bs.out += #y bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.xp/function/get/total_points/range_2.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/get/total_points/range_2.mcfunction
deleted file mode 100644
index 8fc387df8e..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/get/total_points/range_2.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# 2.5 × level^2 – 40.5 × level + 360 (at levels 17–31)
-# => 1/2 × (5 × level^2 - 81 × level) + 360
-scoreboard players operation #x bs.ctx *= 81 bs.const
-scoreboard players operation #y bs.ctx *= #y bs.ctx
-scoreboard players operation #y bs.ctx *= 5 bs.const
-scoreboard players operation #y bs.ctx -= #x bs.ctx
-scoreboard players operation #y bs.ctx /= 2 bs.const
-scoreboard players operation $xp.get_total_points bs.out += #y bs.ctx
-return run scoreboard players add $xp.get_total_points bs.out 360
diff --git a/datapacks/Bookshelf/data/bs.xp/function/get/total_points/range_3.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/get/total_points/range_3.mcfunction
deleted file mode 100644
index 59f91ebb9b..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/get/total_points/range_3.mcfunction
+++ /dev/null
@@ -1,24 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-# 4.5 × level^2 – 162.5 × level + 2220 (at levels 32+)
-# => 1/2 × (9 × level^2 - 325 × level) + 2220
-scoreboard players operation #x bs.ctx *= 325 bs.const
-scoreboard players operation #y bs.ctx *= #y bs.ctx
-scoreboard players operation #y bs.ctx *= 9 bs.const
-scoreboard players operation #y bs.ctx -= #x bs.ctx
-scoreboard players operation #y bs.ctx /= 2 bs.const
-scoreboard players operation $xp.get_total_points bs.out += #y bs.ctx
-return run scoreboard players add $xp.get_total_points bs.out 2220
diff --git a/datapacks/Bookshelf/data/bs.xp/function/get/total_points/total_points.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/get/total_points/total_points.mcfunction
deleted file mode 100644
index 5e51caaa2f..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/get/total_points/total_points.mcfunction
+++ /dev/null
@@ -1,22 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#get
-# ------------------------------------------------------------------------------------------------------------
-
-execute store result score $xp.get_total_points bs.out run xp query @s points
-execute store result score #x bs.ctx store result score #y bs.ctx run xp query @s levels
-execute if score #x bs.ctx matches 1..16 run return run function bs.xp:get/total_points/range_1
-execute if score #x bs.ctx matches 17..31 run return run function bs.xp:get/total_points/range_2
-execute if score #x bs.ctx matches 32.. run return run function bs.xp:get/total_points/range_3
diff --git a/datapacks/Bookshelf/data/bs.xp/function/set/levels.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/set/levels.mcfunction
deleted file mode 100644
index 4b92bce192..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/set/levels.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#set
-# ------------------------------------------------------------------------------------------------------------
-
-$xp set @s $(levels) levels
diff --git a/datapacks/Bookshelf/data/bs.xp/function/set/points.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/set/points.mcfunction
deleted file mode 100644
index 47e104f327..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/set/points.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#set
-# ------------------------------------------------------------------------------------------------------------
-
-$xp set @s $(points) points
diff --git a/datapacks/Bookshelf/data/bs.xp/function/set/progress/apply.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/set/progress/apply.mcfunction
deleted file mode 100644
index 96170d4727..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/set/progress/apply.mcfunction
+++ /dev/null
@@ -1,16 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-# ------------------------------------------------------------------------------------------------------------
-
-$xp set @s $(x) points
diff --git a/datapacks/Bookshelf/data/bs.xp/function/set/progress/progress.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/set/progress/progress.mcfunction
deleted file mode 100644
index 17549b7702..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/set/progress/progress.mcfunction
+++ /dev/null
@@ -1,25 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#set
-# ------------------------------------------------------------------------------------------------------------
-
-# level 111111129 => max_points = 1000000002
-$execute store result storage bs:ctx x int 1 store result score #p bs.ctx run data get storage bs:const xp.progress $(progress)
-execute store result storage bs:ctx y int 1 run xp query @s levels
-xp set @s 111111129 levels
-execute if score #p bs.ctx matches ..0 run xp set @s 0 points
-execute if score #p bs.ctx matches 1000000000.. run xp set @s 1000000000 points
-execute if score #p bs.ctx matches 1..999999999 run function bs.xp:set/progress/apply with storage bs:ctx
-function bs.xp:utils/restore_levels with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.xp/function/set/total_points.mcfunction b/datapacks/Bookshelf/data/bs.xp/function/set/total_points.mcfunction
deleted file mode 100644
index 0f4b2cfa04..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/function/set/total_points.mcfunction
+++ /dev/null
@@ -1,20 +0,0 @@
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) 2024 Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#set
-# ------------------------------------------------------------------------------------------------------------
-
-xp set @s 0 points
-xp set @s 0 levels
-$xp add @s $(points) points
diff --git a/datapacks/Bookshelf/data/bs.xp/tags/function/exclusive_load.json b/datapacks/Bookshelf/data/bs.xp/tags/function/exclusive_load.json
deleted file mode 100644
index 3096102f2d..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/tags/function/exclusive_load.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "values": [
- "#minecraft:unload",
- "#bs.xp:load"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.xp/tags/function/help.json b/datapacks/Bookshelf/data/bs.xp/tags/function/help.json
deleted file mode 100644
index 8d2a3edd41..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/tags/function/help.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.xp:__help__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.xp/tags/function/load.json b/datapacks/Bookshelf/data/bs.xp/tags/function/load.json
deleted file mode 100644
index 197f65e2e5..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/tags/function/load.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.xp:__load__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.xp/tags/function/unload.json b/datapacks/Bookshelf/data/bs.xp/tags/function/unload.json
deleted file mode 100644
index 47528ef2dc..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/tags/function/unload.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "values": [
- "bs.xp:__unload__"
- ]
-}
diff --git a/datapacks/Bookshelf/data/bs.xp/test/__boot__.mcfunction b/datapacks/Bookshelf/data/bs.xp/test/__boot__.mcfunction
deleted file mode 100644
index 83668d3d69..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/test/__boot__.mcfunction
+++ /dev/null
@@ -1,2 +0,0 @@
-# @batch bs.xp
-# @beforebatch function #bs.xp:exclusive_load
diff --git a/datapacks/Bookshelf/data/bs.xp/test/add/levels.mcfunction b/datapacks/Bookshelf/data/bs.xp/test/add/levels.mcfunction
deleted file mode 100644
index 84b04f3d4f..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/test/add/levels.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Levels are added correctly
-# @batch bs.xp
-# @dummy
-
-function #bs.xp:add_levels {levels:42}
-assert entity @s[level=42]
-
-function #bs.xp:add_levels {levels:22}
-assert entity @s[level=64]
diff --git a/datapacks/Bookshelf/data/bs.xp/test/add/points.mcfunction b/datapacks/Bookshelf/data/bs.xp/test/add/points.mcfunction
deleted file mode 100644
index d206d9c476..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/test/add/points.mcfunction
+++ /dev/null
@@ -1,11 +0,0 @@
-# Points are added correctly
-# @batch bs.xp
-# @dummy
-
-function #bs.xp:add_points {points:1}
-execute store result score #r bs.ctx run xp query @s points
-assert score #r bs.ctx matches 1
-
-function #bs.xp:add_points {points:5}
-execute store result score #r bs.ctx run xp query @s points
-assert score #r bs.ctx matches 6
diff --git a/datapacks/Bookshelf/data/bs.xp/test/add/progress.mcfunction b/datapacks/Bookshelf/data/bs.xp/test/add/progress.mcfunction
deleted file mode 100644
index a9ab3b4e82..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/test/add/progress.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# Progress is added correctly without overflowing to the next level
-# @batch bs.xp
-# @dummy
-
-function #bs.xp:add_progress {progress:0.1}
-assert data entity @s {XpP:0.1f}
-
-function #bs.xp:add_progress {progress:0.4}
-assert data entity @s {XpP:0.5f}
-
-function #bs.xp:add_progress {progress:1.0}
-assert data entity @s {XpP:1.0f}
diff --git a/datapacks/Bookshelf/data/bs.xp/test/get/max_points.mcfunction b/datapacks/Bookshelf/data/bs.xp/test/get/max_points.mcfunction
deleted file mode 100644
index 5fc6cf703b..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/test/get/max_points.mcfunction
+++ /dev/null
@@ -1,15 +0,0 @@
-# Max points formula works for all levels
-# @batch bs.xp
-# @dummy
-
-xp set @s 5 levels
-execute store result score #r bs.ctx run function #bs.xp:get_max_points
-assert score #r bs.ctx matches 17
-
-xp set @s 21 levels
-execute store result score #r bs.ctx run function #bs.xp:get_max_points
-assert score #r bs.ctx matches 67
-
-xp set @s 42 levels
-execute store result score #r bs.ctx run function #bs.xp:get_max_points
-assert score #r bs.ctx matches 220
diff --git a/datapacks/Bookshelf/data/bs.xp/test/get/progress.mcfunction b/datapacks/Bookshelf/data/bs.xp/test/get/progress.mcfunction
deleted file mode 100644
index 2af7a4f087..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/test/get/progress.mcfunction
+++ /dev/null
@@ -1,11 +0,0 @@
-# Progress scaling works as expected
-# @batch bs.xp
-# @dummy
-
-xp set @s 1 points
-execute store result score #r bs.ctx run function #bs.xp:get_progress {scale:10000}
-assert score #r bs.ctx matches 1428
-
-xp set @s 5 points
-execute store result score #r bs.ctx run function #bs.xp:get_progress {scale:100}
-assert score #r bs.ctx matches 71
diff --git a/datapacks/Bookshelf/data/bs.xp/test/get/remaining_points.mcfunction b/datapacks/Bookshelf/data/bs.xp/test/get/remaining_points.mcfunction
deleted file mode 100644
index 980aa4b0c9..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/test/get/remaining_points.mcfunction
+++ /dev/null
@@ -1,18 +0,0 @@
-# Remaining points formula works for all levels
-# @batch bs.xp
-# @dummy
-
-xp set @s 5 levels
-xp set @s 5 points
-execute store result score #r bs.ctx run function #bs.xp:get_remaining_points
-assert score #r bs.ctx matches 12
-
-xp set @s 21 levels
-xp set @s 12 points
-execute store result score #r bs.ctx run function #bs.xp:get_remaining_points
-assert score #r bs.ctx matches 55
-
-xp set @s 42 levels
-xp set @s 18 points
-execute store result score #r bs.ctx run function #bs.xp:get_remaining_points
-assert score #r bs.ctx matches 202
diff --git a/datapacks/Bookshelf/data/bs.xp/test/get/total_points.mcfunction b/datapacks/Bookshelf/data/bs.xp/test/get/total_points.mcfunction
deleted file mode 100644
index 3dd1b5fa56..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/test/get/total_points.mcfunction
+++ /dev/null
@@ -1,15 +0,0 @@
-# Total points formula works for all levels
-# @batch bs.xp
-# @dummy
-
-xp set @s 42 levels
-execute store result score #r bs.ctx run function #bs.xp:get_total_points
-assert score #r bs.ctx matches 3333
-
-xp add @s -2500 points
-execute store result score #r bs.ctx run function #bs.xp:get_total_points
-assert score #r bs.ctx matches 833
-
-xp add @s -700 points
-execute store result score #r bs.ctx run function #bs.xp:get_total_points
-assert score #r bs.ctx matches 133
diff --git a/datapacks/Bookshelf/data/bs.xp/test/set/levels.mcfunction b/datapacks/Bookshelf/data/bs.xp/test/set/levels.mcfunction
deleted file mode 100644
index 8f43e2f915..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/test/set/levels.mcfunction
+++ /dev/null
@@ -1,9 +0,0 @@
-# Levels are set correctly
-# @batch bs.xp
-# @dummy
-
-function #bs.xp:set_levels {levels:42}
-assert entity @s[level=42]
-
-function #bs.xp:set_levels {levels:22}
-assert entity @s[level=22]
diff --git a/datapacks/Bookshelf/data/bs.xp/test/set/points.mcfunction b/datapacks/Bookshelf/data/bs.xp/test/set/points.mcfunction
deleted file mode 100644
index 87725d09ea..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/test/set/points.mcfunction
+++ /dev/null
@@ -1,11 +0,0 @@
-# Points are set correctly
-# @batch bs.xp
-# @dummy
-
-function #bs.xp:set_points {points:5}
-execute store result score #r bs.ctx run xp query @s points
-assert score #r bs.ctx matches 5
-
-function #bs.xp:set_points {points:2}
-execute store result score #r bs.ctx run xp query @s points
-assert score #r bs.ctx matches 2
diff --git a/datapacks/Bookshelf/data/bs.xp/test/set/progress.mcfunction b/datapacks/Bookshelf/data/bs.xp/test/set/progress.mcfunction
deleted file mode 100644
index 21e8c5b5db..0000000000
--- a/datapacks/Bookshelf/data/bs.xp/test/set/progress.mcfunction
+++ /dev/null
@@ -1,12 +0,0 @@
-# Progress is set correctly without overflowing to the next level
-# @batch bs.xp
-# @dummy
-
-function #bs.xp:set_progress {progress:0.5}
-assert data entity @s {XpP:0.5f}
-
-function #bs.xp:set_progress {progress:0.1}
-assert data entity @s {XpP:0.1f}
-
-function #bs.xp:set_progress {progress:2.0}
-assert data entity @s {XpP:1.0f}
diff --git a/datapacks/Bookshelf/data/minecraft/tags/function/load.json b/datapacks/Bookshelf/data/minecraft/tags/function/load.json
deleted file mode 100644
index 2832ef1c4c..0000000000
--- a/datapacks/Bookshelf/data/minecraft/tags/function/load.json
+++ /dev/null
@@ -1,96 +0,0 @@
-{
- "values": [
- {
- "id": "#bs.biome:load",
- "required": false
- },
- {
- "id": "#bs.bitwise:load",
- "required": false
- },
- {
- "id": "#bs.block:load",
- "required": false
- },
- {
- "id": "#bs.color:load",
- "required": false
- },
- {
- "id": "#bs.generate:load",
- "required": false
- },
- {
- "id": "#bs.health:load",
- "required": false
- },
- {
- "id": "#bs.hitbox:load",
- "required": false
- },
- {
- "id": "#bs.id:load",
- "required": false
- },
- {
- "id": "#bs.interaction:load",
- "required": false
- },
- {
- "id": "#bs.link:load",
- "required": false
- },
- {
- "id": "#bs.math:load",
- "required": false
- },
- {
- "id": "#bs.move:load",
- "required": false
- },
- {
- "id": "#bs.position:load",
- "required": false
- },
- {
- "id": "#bs.random:load",
- "required": false
- },
- {
- "id": "#bs.raycast:load",
- "required": false
- },
- {
- "id": "#bs.schedule:load",
- "required": false
- },
- {
- "id": "#bs.sidebar:load",
- "required": false
- },
- {
- "id": "#bs.time:load",
- "required": false
- },
- {
- "id": "#bs.tree:load",
- "required": false
- },
- {
- "id": "#bs.vector:load",
- "required": false
- },
- {
- "id": "#bs.view:load",
- "required": false
- },
- {
- "id": "#bs.weather:load",
- "required": false
- },
- {
- "id": "#bs.xp:load",
- "required": false
- }
- ]
-}
diff --git a/datapacks/Bookshelf/data/minecraft/tags/function/tick.json b/datapacks/Bookshelf/data/minecraft/tags/function/tick.json
deleted file mode 100644
index 86dde3df2a..0000000000
--- a/datapacks/Bookshelf/data/minecraft/tags/function/tick.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "values": []
-}
diff --git a/datapacks/Bookshelf/data/minecraft/tags/function/unload.json b/datapacks/Bookshelf/data/minecraft/tags/function/unload.json
deleted file mode 100644
index c3facf413b..0000000000
--- a/datapacks/Bookshelf/data/minecraft/tags/function/unload.json
+++ /dev/null
@@ -1,96 +0,0 @@
-{
- "values": [
- {
- "id": "#bs.biome:unload",
- "required": false
- },
- {
- "id": "#bs.bitwise:unload",
- "required": false
- },
- {
- "id": "#bs.block:unload",
- "required": false
- },
- {
- "id": "#bs.color:unload",
- "required": false
- },
- {
- "id": "#bs.generate:unload",
- "required": false
- },
- {
- "id": "#bs.health:unload",
- "required": false
- },
- {
- "id": "#bs.hitbox:unload",
- "required": false
- },
- {
- "id": "#bs.id:unload",
- "required": false
- },
- {
- "id": "#bs.interaction:unload",
- "required": false
- },
- {
- "id": "#bs.link:unload",
- "required": false
- },
- {
- "id": "#bs.math:unload",
- "required": false
- },
- {
- "id": "#bs.move:unload",
- "required": false
- },
- {
- "id": "#bs.position:unload",
- "required": false
- },
- {
- "id": "#bs.random:unload",
- "required": false
- },
- {
- "id": "#bs.raycast:unload",
- "required": false
- },
- {
- "id": "#bs.schedule:unload",
- "required": false
- },
- {
- "id": "#bs.sidebar:unload",
- "required": false
- },
- {
- "id": "#bs.time:unload",
- "required": false
- },
- {
- "id": "#bs.tree:unload",
- "required": false
- },
- {
- "id": "#bs.vector:unload",
- "required": false
- },
- {
- "id": "#bs.view:unload",
- "required": false
- },
- {
- "id": "#bs.weather:unload",
- "required": false
- },
- {
- "id": "#bs.xp:unload",
- "required": false
- }
- ]
-}
diff --git a/datapacks/Bookshelf/icon.png b/datapacks/Bookshelf/icon.png
deleted file mode 100644
index 776d769578..0000000000
Binary files a/datapacks/Bookshelf/icon.png and /dev/null differ
diff --git a/datapacks/Bookshelf/pack.mcmeta b/datapacks/Bookshelf/pack.mcmeta
deleted file mode 100644
index 93c4b13b82..0000000000
--- a/datapacks/Bookshelf/pack.mcmeta
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "id": "bs",
- "pack": {
- "pack_format": 57,
- "description": "Bookshelf - Library designed for mapmakers"
- }
-}
diff --git a/docs/.gitignore b/docs/.gitignore
deleted file mode 100644
index 69fa449dd9..0000000000
--- a/docs/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-_build/
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 1a1922419f..349398fb40 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -1,160 +1,29 @@
# 🛠️ Changelog
----
-
-## 📦 Bookshelf - 2.2.2
-
-### 🐛 Fixes
-
-- **[#293](https://github.com/Gunivers/Bookshelf/issues/293)** Entity `creaking_transient` was removed from Minecraft 1.21.4, causing `bs.hitbox` to stop working for entities.
+This changelog includes updates for all versions of the project.
---
-## 📦 Bookshelf - 2.2.1
-
-Bookshelf is now based on **Minecraft 1.21.4**.
-
-### 🐛 Fixes
-- **[#288](https://github.com/Gunivers/Bookshelf/issues/288)** Fix `bs.move` collisions.
-- **[#290](https://github.com/Gunivers/Bookshelf/issues/290)** Add missing blocks in `bs.block` registries.
-
+```{include} _templates/changelog/v3.0.0.md
+```
---
-
-## 📦 Bookshelf - 2.2.0
-
-```{epigraph}
-**🪐 The dimensional update!**
-
-*This release features new modules for random distribution and terrain generation, refinements to existing modules, performance enhancements, and minor bug resolutions. Additionally, this update aims to ensure all functions work seamlessly across all dimensions.*
+```{include} _templates/changelog/v2.2.2.md
```
-
-Bookshelf is now based on **Minecraft 1.21.3**.
-
-### 🎉 Added modules
-
-- **[#1](https://github.com/Gunivers/Bookshelf/issues/1)** / **[#220](https://github.com/Gunivers/Bookshelf/issues/220)** Added the `bs.random` module, which includes:
- - Random distributions: uniform, binomial, geometric, and Poisson.
- - Noise generation functions: white, simplex, and fractal.
- - Random selection of an element from a list.
-- **[#6](https://github.com/Gunivers/Bookshelf/issues/6)** Added the `bs.generate` module for terrain generation. Currently supports 2D shape algorithms, enabling texture and heightmap-based terrain generation.
-- **[#193](https://github.com/Gunivers/Bookshelf/issues/193)** Added the `bs.interaction` module, which proposes interactions to listen to different players' events: left click, right click, hover (enter, leave and continuous).
-
-### ✨ Added features
-
-- **[#222](https://github.com/Gunivers/Bookshelf/issues/222)** Added `#bs.block:fill_random` for filling regions with randomly selected blocks.
-- **[#258](https://github.com/Gunivers/Bookshelf/issues/258)** Added `#bs.block:emit_block_particle` to emit block particles in specific locations.
-- **[#245](https://github.com/Gunivers/Bookshelf/issues/245)** Added `piercing` and callback options to `#bs.raycast:run`.
-- **[#203](https://github.com/Gunivers/Bookshelf/issues/203)** Added `#bs.hitbox:is_entity_in_block` and `#bs.hitbox:is_entity_in_blocks` to verify if an entity is within a block.
-- **[#233](https://github.com/Gunivers/Bookshelf/issues/233)** Introduced new link management functions:
- - `#bs.link:remove_link` to remove specific links.
- - `#bs.link:as_children`, `#bs.link:as_parent`, `#bs.link:at_children`, and `#bs.link:at_parent` to handle parent-child link relationships.
-- **[#171](https://github.com/Gunivers/Bookshelf/issues/171)** Added logging functions `#bs.log:history` and `#bs.log:clear_history` for viewing and clearing log history.
-
-### 🔁 Tweaks
-
-- **[#251](https://github.com/Gunivers/Bookshelf/issues/251)** Enhanced `bs.block` fill functions to accept `from` and `to` inputs as either `[x, y, z]` lists or as stringified coordinates (e.g., `~ ~5 25`).
-- **[#247](https://github.com/Gunivers/Bookshelf/pull/247)** Improved the default `bs.log` format for clarity.
-- **[#252](https://github.com/Gunivers/Bookshelf/pull/252)** Optimized `bs.hitbox` module for improved performance.
-- **[#265](https://github.com/Gunivers/Bookshelf/pull/265)** Optimized `bs.schedule` module for improved performance.
-- **[#265](https://github.com/Gunivers/Bookshelf/pull/265)** Enabled `bs.move` module to function effectively at higher coordinate ranges. Collision detection has also been improved and should be more robust.
-- **[#265](https://github.com/Gunivers/Bookshelf/pull/265)** Load tags do not load modules in isolation anymore. This can now be done using the `exclusive_load` tag.
-- **[#276](https://github.com/Gunivers/Bookshelf/pull/276)** Add new hitboxes (new babies and salmon variants).
-
-### 🐛 Fixes
-
-- **[#254](https://github.com/Gunivers/Bookshelf/issues/254)** Resolved execution loop interruptions caused by `#bs.schedule:schedule` callbacks.
-- **[#243](https://github.com/Gunivers/Bookshelf/issues/243)** Fixed unload functions for `bs.health` and `bs.move`.
-- **[#264](https://github.com/Gunivers/Bookshelf/issues/264)** Resolved compatibility issues with the schedule module outside the overworld.
-- **[#255](https://github.com/Gunivers/Bookshelf/issues/255)** Fixed `bs.move` local velocity collisions.
-- **[#262](https://github.com/Gunivers/Bookshelf/pull/262)** Resolved collision issues with paintings for `bs.raycast` and `bs.move`.
-- **[#256](https://github.com/Gunivers/Bookshelf/issues/256)** Fixed XP progress boundary issues at 0% and 100%.
-- **[#265](https://github.com/Gunivers/Bookshelf/pull/265)** Corrected hitbox for player in spectator mode.
-- **[#270](https://github.com/Gunivers/Bookshelf/issues/270)** Enabled all modules to function across any dimension.
-
-
---
-
-## 📦 Bookshelf - 2.1.1
-
-### 🔁 Tweaks
-- **[#238](https://github.com/Gunivers/Bookshelf/pull/238)** Load tags now load modules in isolation.
-- **[#237](https://github.com/Gunivers/Bookshelf/pull/237)** Enhanced speed of `bs.block` module.
-- **[#218](https://github.com/Gunivers/Bookshelf/pull/218)** Enhanced speed of factorial function in `bs.math`.
-
-### 🐛 Fixes
-- **[#236](https://github.com/Gunivers/Bookshelf/issues/236)** Fix `bs.block`, `bs.id` and `bs.math` load functions.
-- **[#235](https://github.com/Gunivers/Bookshelf/issues/235)** Fix `bs.block` inputs that required extra escaping.
-
-### 📄 Documentation
-- **[#215](https://github.com/Gunivers/Bookshelf/issues/215)** There is now documentation about the documentation (kind of metadocumentation?).
-
+```{include} _templates/changelog/v2.2.1.md
+```
---
-
-## 📦 Bookshelf - 2.1.0
-
-Bookshelf is now based on **Minecraft 1.21**.
-
-### 🎉 Addition
-- **[#187](https://github.com/Gunivers/Bookshelf/issues/187)** Add `#bs.block:map_type` and `#bs.block:mix_type` functions.
-
-### 🐛 Fixes
-- **[#211](https://github.com/Gunivers/Bookshelf/pull/211)** Add missing help function tag in `bs.link`.
-- **[#211](https://github.com/Gunivers/Bookshelf/pull/211)** Add missing help function tag in `bs.vector`.
-- **[#211](https://github.com/Gunivers/Bookshelf/pull/211)** Add missing help function tag in `bs.xp`.
-
-### 📄 Documentation
-- **[#206](https://github.com/Gunivers/Bookshelf/issues/206)** Add new related datapacks and mods.
-- **[#208](https://github.com/Gunivers/Bookshelf/issues/208)** Add missing documentation for documentation for feature `bs.position:get_pos_and_rot`.
-- **[#208](https://github.com/Gunivers/Bookshelf/issues/208)** Add missing documentation for documentation for feature `bs.position:set_pos_and_rot`.
-- **[#208](https://github.com/Gunivers/Bookshelf/issues/208)** Add missing documentation for documentation for feature `bs.position:add_pos_and_rot`.
-
-### 📋 Conventions
-- **[#200](https://github.com/Gunivers/Bookshelf/issues/200)** We throw away the old feature function header to a new one with only the licence. This header is now mandatory for all functions. All the metadata that was present inside the old one have been moved to the feature function tag.
-- **[#52](https://github.com/Gunivers/Bookshelf/issues/52)** / **[#175](https://github.com/Gunivers/Bookshelf/issues/175)** Each module has now its own metadata that should be specified manually. The metadata of the features and modules are used to generate more metadata, including the dependencies. These metadata can be used by bots like the incomming Bookshelf Manager. More information [here](project:contribute/metadata.md).
-
-### ⚙️ Github and CI
-- Added a template for pull requests.
-- Added templates for issues.
-- **[#199](https://github.com/Gunivers/Bookshelf/pull/199)** The different metadata (the manually specified one and the generated one) are now automatically verified at each commit inside a pull request. This prevents them from being forgotten. More information [here](project:contribute/contribution-validation.md).
-
+```{include} _templates/changelog/v2.2.0.md
+```
---
-
-## 📦 Bookshelf - 2.0.0
-
-```{admonition} Breaking changes
-:class: warning
-
-This new version is filled with breaking changes. Since maintaining a list of those became unrealistic, the following changelog only highlights a selection of tweaks and new functionalities.
+```{include} _templates/changelog/v2.1.1.md
```
-
-### 🎉 Addition
-- There is now a changelog!
-- Added player health manipulation.
-- Added precise collisions (move, raycast and view).
-- Added float manipulation (frexp and ldexp).
-- Added a new hitbox module.
-- Added a new raycast module.
-- Added a new sidebar module.
-
-### 🔁 Tweaks
-- The project has a new fresh identity: Bookshelf.
-- Every module has been reworked for improved accuracy, performance, and/or simplicity.
-- Renamed almost everything (scores, objectives, functions, ...).
-- Many functions now utilize macros, storage, or fake scores instead of objectives.
-- Removed the core module. The library no longer requires a base module.
-- Removed outdated modules (cache, item, mapedit, and memory).
-- Merged the location and orientation modules into a new position module.
-- Bitwise operations have been moved out of the math module into a separate module.
-- Enhanced the accuracy of the move and view modules due to their rework and the addition of the new hitbox module.
-- The schedule module now maintains the current execution context.
-
-### 🐛 Bug fixes
-- Who knows at this point 🤷♂️, almost no legacy code remains...
-
---
-
-## 📦 Gunivers Lib - 1.0.0
-
-Data load error: TooLazyException
-
-Our devs are too busy coding the future to dig up the past...
+```{include} _templates/changelog/v2.1.0.md
+```
+---
+```{include} _templates/changelog/v2.0.0.md
+```
+---
+```{include} _templates/changelog/v1.0.0.md
+```
diff --git a/docs/Makefile b/docs/Makefile
deleted file mode 100644
index d4bb2cbb9e..0000000000
--- a/docs/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-# Minimal makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line, and also
-# from the environment for the first two.
-SPHINXOPTS ?=
-SPHINXBUILD ?= sphinx-build
-SOURCEDIR = .
-BUILDDIR = _build
-
-# Put it first so that "make" without argument is like "make help".
-help:
- @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
-
-.PHONY: help Makefile
-
-# Catch-all target: route all unknown targets to Sphinx using the new
-# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
-%: Makefile
- @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/_exts/bs_nbt.py b/docs/_exts/bs_nbt.py
deleted file mode 100644
index a19705174a..0000000000
--- a/docs/_exts/bs_nbt.py
+++ /dev/null
@@ -1,15 +0,0 @@
-from docutils import nodes
-from sphinx.application import Sphinx
-from sphinx.util.docutils import SphinxRole
-
-class NbtRole(SphinxRole):
-
- def run(self):
- svg = f' '
- node = nodes.raw("", nodes.Text(svg), format="html")
- self.set_source_info(node)
- return [node], []
-
-
-def setup(app: Sphinx):
- app.add_role('nbt', NbtRole())
diff --git a/docs/_exts/bs_treeview.py b/docs/_exts/bs_treeview.py
deleted file mode 100644
index e105317a63..0000000000
--- a/docs/_exts/bs_treeview.py
+++ /dev/null
@@ -1,36 +0,0 @@
-from docutils import nodes
-from sphinx.application import Sphinx
-from sphinx.util.docutils import SphinxDirective
-
-class TreeViewDirective(SphinxDirective):
- has_content = True
-
- def run(self):
- container = nodes.container()
- container.set_class("bs-treeview")
- list_node = nodes.bullet_list()
- list_nodes = [list_node]
-
- for line in self.content:
- indent_level = (len(line) - len(line.lstrip('- ')) - 1) // 2
- text = line.lstrip('- ')
-
- while len(list_nodes) <= indent_level:
- new_item_node = nodes.list_item()
- if not list_nodes[-1].children or not isinstance(list_nodes[-1].children[-1], nodes.list_item):
- list_nodes[-1] += new_item_node
- new_list_node = nodes.bullet_list()
- list_nodes[-1].children[-1] += new_list_node
- list_nodes.append(new_list_node)
-
- item_node = nodes.list_item()
- item_node.extend(self.state.inline_text(text, self.lineno)[0])
- list_nodes[indent_level] += item_node
- list_nodes = list_nodes[:indent_level+1]
-
- container.append(list_node)
- return [container]
-
-
-def setup(app: Sphinx):
- app.add_directive('treeview', TreeViewDirective)
diff --git a/docs/_imgs/banner-dark.png b/docs/_imgs/banner-dark.png
index 730ad6407b..9a51ca985f 100644
Binary files a/docs/_imgs/banner-dark.png and b/docs/_imgs/banner-dark.png differ
diff --git a/docs/_imgs/banner-light.png b/docs/_imgs/banner-light.png
index e0288cf147..5ed58ab738 100644
Binary files a/docs/_imgs/banner-light.png and b/docs/_imgs/banner-light.png differ
diff --git a/docs/_imgs/discord.svg b/docs/_imgs/discord.svg
deleted file mode 100644
index bdf670ec9c..0000000000
--- a/docs/_imgs/discord.svg
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
- Discord
-
-
-
-
diff --git a/docs/_imgs/documentation.svg b/docs/_imgs/documentation.svg
deleted file mode 100644
index 4b7092476c..0000000000
--- a/docs/_imgs/documentation.svg
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
- How to use
-
-
-
-
diff --git a/docs/_imgs/download.svg b/docs/_imgs/download.svg
deleted file mode 100644
index 71901120cc..0000000000
--- a/docs/_imgs/download.svg
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
- Get started
-
-
-
-
diff --git a/docs/_imgs/modules/biome.png b/docs/_imgs/modules/environment.png
similarity index 100%
rename from docs/_imgs/modules/biome.png
rename to docs/_imgs/modules/environment.png
diff --git a/docs/_imgs/readme/block-dark.svg b/docs/_imgs/readme/block-dark.svg
new file mode 100644
index 0000000000..34875b9148
--- /dev/null
+++ b/docs/_imgs/readme/block-dark.svg
@@ -0,0 +1,39 @@
+
+
+
+
+ 🧱 Block
+
+ Get and manipulate blocks (supports
+
+ BlockStates and NBT).
+
diff --git a/docs/_imgs/readme/block.svg b/docs/_imgs/readme/block.svg
new file mode 100644
index 0000000000..16cd112961
--- /dev/null
+++ b/docs/_imgs/readme/block.svg
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+ 🧱 Block
+
+
+ Get and manipulate blocks (supports
+
+ BlockStates and NBT).
+
diff --git a/docs/_imgs/readme/generate-dark.svg b/docs/_imgs/readme/generate-dark.svg
new file mode 100644
index 0000000000..3aeac43f03
--- /dev/null
+++ b/docs/_imgs/readme/generate-dark.svg
@@ -0,0 +1,39 @@
+
+
+
+
+ 🏗️ Generate
+
+ Generate terrains and landscapes,
+
+ incorporating natural features.
+
diff --git a/docs/_imgs/readme/generate.svg b/docs/_imgs/readme/generate.svg
new file mode 100644
index 0000000000..0fc9394710
--- /dev/null
+++ b/docs/_imgs/readme/generate.svg
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+ 🏗️ Generate
+
+
+ Generate terrains and landscapes,
+
+ incorporating natural features.
+
diff --git a/docs/_imgs/readme/health-dark.svg b/docs/_imgs/readme/health-dark.svg
new file mode 100644
index 0000000000..72f7b5b8f6
--- /dev/null
+++ b/docs/_imgs/readme/health-dark.svg
@@ -0,0 +1,39 @@
+
+
+
+
+ ❤️ Health
+
+ Easily manage the health of a player
+
+ or the lifetime of an entity!
+
diff --git a/docs/_imgs/readme/health.svg b/docs/_imgs/readme/health.svg
new file mode 100644
index 0000000000..9caad01e08
--- /dev/null
+++ b/docs/_imgs/readme/health.svg
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+ ❤️ Health
+
+
+ Easily manage the health of a player
+
+ or the lifetime of an entity!
+
diff --git a/docs/_imgs/readme/math-dark.svg b/docs/_imgs/readme/math-dark.svg
new file mode 100644
index 0000000000..3160ca2a94
--- /dev/null
+++ b/docs/_imgs/readme/math-dark.svg
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+ 🧮 Math
+
+
+ Mathematical functions: sin, cos,
+
+ exp, log, sqrt and much more!
+
diff --git a/docs/_imgs/readme/math.svg b/docs/_imgs/readme/math.svg
new file mode 100644
index 0000000000..30ee751fa1
--- /dev/null
+++ b/docs/_imgs/readme/math.svg
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+ 🧮 Math
+
+
+ Mathematical functions: sin, cos,
+
+ exp, log, sqrt and much more!
+
diff --git a/docs/_imgs/readme/quickstart.svg b/docs/_imgs/readme/quickstart.svg
new file mode 100644
index 0000000000..a6b4498eb0
--- /dev/null
+++ b/docs/_imgs/readme/quickstart.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+ 🚀 Quickstart!
+
diff --git a/docs/_imgs/readme/random-dark.svg b/docs/_imgs/readme/random-dark.svg
new file mode 100644
index 0000000000..953cba51a9
--- /dev/null
+++ b/docs/_imgs/readme/random-dark.svg
@@ -0,0 +1,39 @@
+
+
+
+
+ 🎲 Random
+
+ Random functions for different
+
+ distributions and noise patterns.
+
diff --git a/docs/_imgs/readme/random.svg b/docs/_imgs/readme/random.svg
new file mode 100644
index 0000000000..e4fcff79d8
--- /dev/null
+++ b/docs/_imgs/readme/random.svg
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+ 🎲 Random
+
+
+ Random functions for different
+
+ distributions and noise patterns.
+
diff --git a/docs/_imgs/readme/raycast-dark.svg b/docs/_imgs/readme/raycast-dark.svg
new file mode 100644
index 0000000000..e22f5a8b6d
--- /dev/null
+++ b/docs/_imgs/readme/raycast-dark.svg
@@ -0,0 +1,39 @@
+
+
+
+
+ 🔦 Raycast
+
+ Cast rays and see if they collide
+
+ with blocks or entities.
+
diff --git a/docs/_imgs/readme/raycast.svg b/docs/_imgs/readme/raycast.svg
new file mode 100644
index 0000000000..091d60843b
--- /dev/null
+++ b/docs/_imgs/readme/raycast.svg
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+ 🔦 Raycast
+
+
+ Cast rays and see if they collide
+
+ with blocks or entities.
+
diff --git a/docs/_imgs/readme/watch-trailer.svg b/docs/_imgs/readme/watch-trailer.svg
new file mode 100644
index 0000000000..5a410122cd
--- /dev/null
+++ b/docs/_imgs/readme/watch-trailer.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+ 🎬 Watch trailer
+
diff --git a/docs/_static/bookshelf.css b/docs/_static/bookshelf.css
index 4102b594b4..0038084ef9 100644
--- a/docs/_static/bookshelf.css
+++ b/docs/_static/bookshelf.css
@@ -155,108 +155,3 @@ button.btn.version-switcher__button {
.bd-header .navbar-nav li a.nav-link {
text-align: center;
}
-
-
-.bs-treeview ul, .bs-treeview li {
- margin: 0;
- padding: 0;
- list-style-type: none;
- list-style-image: none;
-}
-
-.bs-treeview li li {
- position: relative;
- padding: .15rem 0 .15rem 1rem;
- margin-left: .5rem;
- border-left: 1px solid #636363;
-}
-
-.bs-treeview li li::before {
- content: "";
- position: absolute;
- top: 0;
- left: -1px;
- width: .75rem;
- height: 1.15rem;
- border-left: 1px solid #636363;
- border-bottom: 1px solid #636363;
-}
-
-.bs-treeview li li:last-child {
- border-color: transparent;
-}
-
-.bs-treeview {
- margin-bottom: 1rem;
-}
-
-[class^="bs-nbt-"] {
- display: inline-block;
- background-image: url('nbt-sprite.png');
- background-position: -16px -48px;
- background-repeat: no-repeat;
- background-size: 64px;
- vertical-align: middle;
- width: 1em;
- height: 1em;
-}
-
-.bs-nbt-byte {
- background-position: 0px 0px;
-}
-
-.bs-nbt-double {
- background-position: -16px 0px;
-}
-
-.bs-nbt-float {
- background-position: -32px 0px;
-}
-
-.bs-nbt-int {
- background-position: -48px 0px;
-}
-
-.bs-nbt-long {
- background-position: 0px -16px;
-}
-
-.bs-nbt-short {
- background-position: -16px -16px;
-}
-
-.bs-nbt-string {
- background-position: -32px -16px;
-}
-
-.bs-nbt-compound {
- background-position: -48px -16px;
-}
-
-.bs-nbt-byte-array {
- background-position: 0px -32px;
-}
-
-.bs-nbt-int-array {
- background-position: -16px -32px;
-}
-
-.bs-nbt-list {
- background-position: -32px -32px;
-}
-
-.bs-nbt-bool {
- background-position: -48px -32px;
-}
-
-.bs-nbt-long-array {
- background-position: 0px -48px;
-}
-
-.bs-nbt-any {
- background-position: -16px -48px;
-}
-
-.bs-nbt-number {
- background-position: -32px -48px;
-}
diff --git a/docs/_static/bookshelf.js b/docs/_static/bookshelf.js
index 8d237f5846..fe09214d62 100644
--- a/docs/_static/bookshelf.js
+++ b/docs/_static/bookshelf.js
@@ -22,7 +22,7 @@ document.addEventListener('DOMContentLoaded', () => {
if (comments) {
const giscusAttributes = {
"src": "https://giscus.app/client.js",
- "data-repo": "Gunivers/Bookshelf",
+ "data-repo": "mcbookshelf/Bookshelf",
"data-repo-id": "R_kgDOHQjqYg",
"data-category": "Documentation",
"data-category-id": "DIC_kwDOHQjqYs4CUQpy",
diff --git a/docs/_static/logo-bookshelf.png b/docs/_static/logo-bookshelf.png
index bc181c2dc7..1b07fa7302 100644
Binary files a/docs/_static/logo-bookshelf.png and b/docs/_static/logo-bookshelf.png differ
diff --git a/docs/_static/nbt-sprite.png b/docs/_static/nbt-sprite.png
deleted file mode 100644
index a5e940e2df..0000000000
Binary files a/docs/_static/nbt-sprite.png and /dev/null differ
diff --git a/docs/_static/switcher.json b/docs/_static/switcher.json
index 8ecd8ca7ea..73d0b3db4b 100644
--- a/docs/_static/switcher.json
+++ b/docs/_static/switcher.json
@@ -2,37 +2,37 @@
{
"name": "dev",
"version": "master",
- "url": "https://bookshelf.docs.gunivers.net/en/master/"
+ "url": "https://docs.mcbookshelf.dev/en/master/"
},
{
"name": "latest",
"version": "latest",
- "url": "https://bookshelf.docs.gunivers.net/en/latest/",
+ "url": "https://docs.mcbookshelf.dev/en/latest/",
"preferred": true
},
{
"name": "2.2.2",
"version": "v2.2.2",
- "url": "https://bookshelf.docs.gunivers.net/en/v2.2.2/"
+ "url": "https://docs.mcbookshelf.dev/en/v2.2.2/"
},
{
"name": "2.1.1",
"version": "v2.1.1",
- "url": "https://bookshelf.docs.gunivers.net/en/v2.1.1/"
+ "url": "https://docs.mcbookshelf.dev/en/v2.1.1/"
},
{
"name": "2.0.0",
"version": "v2.0.0",
- "url": "https://bookshelf.docs.gunivers.net/en/v2.0.0/"
+ "url": "https://docs.mcbookshelf.dev/en/v2.0.0/"
},
{
"name": "1.5",
"version": "1.19",
- "url": "https://bookshelf.docs.gunivers.net/en/1.19-1.0_wild/"
+ "url": "https://docs.mcbookshelf.dev/en/1.19-1.0_wild/"
},
{
"name": "1.4",
"version": "1.18",
- "url": "https://bookshelf.docs.gunivers.net/en/1.18-1.1_spaghetti/"
+ "url": "https://docs.mcbookshelf.dev/en/1.18-1.1_spaghetti/"
}
-]
+]
\ No newline at end of file
diff --git a/docs/_templates/changelog/template.md b/docs/_templates/changelog/template.md
new file mode 100644
index 0000000000..32e369e2ec
--- /dev/null
+++ b/docs/_templates/changelog/template.md
@@ -0,0 +1,15 @@
+## 📦 Bookshelf - x.x.x
+
+> **...**
+>
+> *...*
+
+(Bookshelf is now based on **Minecraft 1.x.x**.)
+
+- ⚠️ **[#id](issue/pr)** - ...
+- 🎉 **[#id](issue/pr)** - ...
+- ✨ **[#id](issue/pr)** - ...
+- ⚡ **[#id](issue/pr)** - ...
+- 🐛 **[#id](issue/pr)** - ...
+- 📝 **[#id](issue/pr)** - ...
+- ⚙️ **[#id](issue/pr)** - ...
diff --git a/docs/_templates/changelog/v1.0.0.md b/docs/_templates/changelog/v1.0.0.md
new file mode 100644
index 0000000000..7bd5c55b8a
--- /dev/null
+++ b/docs/_templates/changelog/v1.0.0.md
@@ -0,0 +1,5 @@
+## 📦 Gunivers Lib - 1.0.0
+
+Data load error: TooLazyException
+
+Our devs are too busy coding the future to dig up the past...
diff --git a/docs/_templates/changelog/v2.0.0.md b/docs/_templates/changelog/v2.0.0.md
new file mode 100644
index 0000000000..8897ff5c08
--- /dev/null
+++ b/docs/_templates/changelog/v2.0.0.md
@@ -0,0 +1,35 @@
+## 📦 [Bookshelf - 2.0.0](https://github.com/mcbookshelf/Bookshelf/releases/tag/v2.0.0)
+
+> **🌱 The Flourishing Update!**
+>
+> *This release replants the foundation of the Gunivers Library, growing into something entirely new.*
+>
+> **⚠️ BREAKING CHANGES**: This new version is filled with breaking changes. Since maintaining a list of those became unrealistic, the following changelog only highlights a selection of tweaks and new functionalities.
+
+
+### 🎉 Addition
+
+- There is now a changelog!
+- Added player health manipulation.
+- Added precise collisions (move, raycast and view).
+- Added float manipulation (frexp and ldexp).
+- Added a new hitbox module.
+- Added a new raycast module.
+- Added a new sidebar module.
+
+### ⚡ Enhancements
+
+- The project has a new fresh identity: Bookshelf.
+- Every module has been reworked for improved accuracy, performance, and/or simplicity.
+- Renamed almost everything (scores, objectives, functions, ...).
+- Many functions now utilize macros, storage, or fake scores instead of objectives.
+- Removed the core module. The library no longer requires a base module.
+- Removed outdated modules (cache, item, mapedit, and memory).
+- Merged the location and orientation modules into a new position module.
+- Bitwise operations have been moved out of the math module into a separate module.
+- Enhanced the accuracy of the move and view modules due to their rework and the addition of the new hitbox module.
+- The schedule module now maintains the current execution context.
+
+### 🐛 Bug Fixes
+
+- Who knows at this point 🤷♂️, almost no legacy code remains...
diff --git a/docs/_templates/changelog/v2.1.0.md b/docs/_templates/changelog/v2.1.0.md
new file mode 100644
index 0000000000..e5d3ad8bf4
--- /dev/null
+++ b/docs/_templates/changelog/v2.1.0.md
@@ -0,0 +1,39 @@
+## 📦 [Bookshelf - 2.1.0](https://github.com/mcbookshelf/Bookshelf/releases/tag/v2.1.0)
+
+> **⚙️ The MetaData Update!**
+>
+> *This release enhances documentation and automated tools, and introduces new block manipulation features.*
+
+Bookshelf is now based on **Minecraft 1.21**.
+
+
+- 📝 **[#206](https://github.com/mcbookshelf/Bookshelf/issues/206)** - Added new related datapacks and mods.
+- 📝 **[#200](https://github.com/mcbookshelf/Bookshelf/issues/200)** - Replaced the old function header with a new license-only header, now mandatory for all functions. Metadata has been moved to the feature function tag.
+- 📝 **[#52](https://github.com/mcbookshelf/Bookshelf/issues/52)** / **[#175](https://github.com/mcbookshelf/Bookshelf/issues/175)** - Each module now includes its own manual metadata, aiding in dependency management and supporting tools like the upcoming Bookshelf Manager. More info [here](project:contribute/metadata.md).
+- ⚙️ **[#199](https://github.com/mcbookshelf/Bookshelf/pull/199)** - Automated metadata verification during pull requests to ensure no data is missed. More info [here](project:contribute/contribution-validation.md).
+- ⚙️ Added templates for pull requests and issues.
+
+
+### `🧱 bs.block`
+
+- ✨ **[#187](https://github.com/mcbookshelf/Bookshelf/issues/187)** - Added `#bs.block:map_type` and `#bs.block:mix_type` functions.
+
+
+### `🔗 bs.link`
+
+- 🐛 **[#211](https://github.com/mcbookshelf/Bookshelf/pull/211)** - Fixed missing help function tag.
+
+
+### `🧭 bs.position`
+
+- 📝 **[#208](https://github.com/mcbookshelf/Bookshelf/issues/208)** - Updated documentation for `#bs.position:_pos_and_rot`.
+
+
+### `➡️ bs.vector`
+
+- 🐛 **[#211](https://github.com/mcbookshelf/Bookshelf/pull/211)** - Fixed missing help function tag.
+
+
+### `🏅 bs.xp`
+
+- 🐛 **[#211](https://github.com/mcbookshelf/Bookshelf/pull/211)** - Fixed missing help function tag.
diff --git a/docs/_templates/changelog/v2.1.1.md b/docs/_templates/changelog/v2.1.1.md
new file mode 100644
index 0000000000..ea01e54803
--- /dev/null
+++ b/docs/_templates/changelog/v2.1.1.md
@@ -0,0 +1,27 @@
+## 📦 [Bookshelf - 2.1.1](https://github.com/mcbookshelf/Bookshelf/releases/tag/v2.1.1)
+
+> **⚡ A Performance Update!**
+>
+> *This release improves the performance of the block module, fixes several bugs, and introduces the new concept of loading modules in isolation.*
+
+
+- ⚡ **[#238](https://github.com/mcbookshelf/Bookshelf/pull/238)** - Load tags now load modules in isolation.
+- 📝 **[#215](https://github.com/mcbookshelf/Bookshelf/issues/215)** - Added documentation about documentation (meta-documentation).
+
+
+### `🧱 bs.block`
+
+- ⚡ **[#237](https://github.com/mcbookshelf/Bookshelf/pull/237)** - Enhanced the speed of the module.
+- ⚡ **[#218](https://github.com/mcbookshelf/Bookshelf/pull/218)** - Enhanced the speed of the factorial function.
+- 🐛 **[#235](https://github.com/mcbookshelf/Bookshelf/issues/235)** - Fixed inputs that required extra escaping.
+- 🐛 **[#236](https://github.com/mcbookshelf/Bookshelf/issues/236)** - Fixed load function.
+
+
+### `🏷️ bs.id`
+
+- 🐛 **[#236](https://github.com/mcbookshelf/Bookshelf/issues/236)** - Fixed load function.
+
+
+### `🧮 bs.math`
+
+- 🐛 **[#236](https://github.com/mcbookshelf/Bookshelf/issues/236)** - Fixed load function.
diff --git a/docs/_templates/changelog/v2.2.0.md b/docs/_templates/changelog/v2.2.0.md
new file mode 100644
index 0000000000..bc70dd552e
--- /dev/null
+++ b/docs/_templates/changelog/v2.2.0.md
@@ -0,0 +1,84 @@
+## 📦 [Bookshelf - 2.2.0](https://github.com/mcbookshelf/Bookshelf/releases/tag/v2.2.0)
+
+> **🪐 The Dimensional Update!**
+>
+> *This release introduces new modules for random distribution and terrain generation, improves existing modules, boosts performance, and fixes minor bugs. All > functions now work seamlessly across all dimensions.*
+
+Bookshelf is now based on **Minecraft 1.21.3**.
+
+
+- ⚡ **[#265](https://github.com/mcbookshelf/Bookshelf/pull/265)** - Load tags do not load modules in isolation anymore. This can now be done using the `exclusive_load` tag.
+- 🐛 **[#270](https://github.com/mcbookshelf/Bookshelf/issues/270)** - Enabled modules to operate seamlessly across all dimensions.
+
+
+### `🧱 bs.block`
+
+- ✨ **[#222](https://github.com/mcbookshelf/Bookshelf/issues/222)** - Added `#bs.block:fill_random` for filling regions with randomly selected blocks.
+- ✨ **[#258](https://github.com/mcbookshelf/Bookshelf/issues/258)** - Added `#bs.block:emit_block_particle` to emit block particles in specific locations.
+- ⚡ **[#251](https://github.com/mcbookshelf/Bookshelf/issues/251)** - Fill functions now accept `from` and `to` as `[x, y, z]` lists or string coordinates (e.g., `~ ~5 25`).
+
+
+### `🏗️ bs.generate`
+
+- 🎉 **[#6](https://github.com/mcbookshelf/Bookshelf/issues/6)** - Added module for terrain generation. Supports 2D algorithms for texture and heightmap-based generation.
+
+### `❤️ bs.health`
+
+- 🐛 **[#243](https://github.com/mcbookshelf/Bookshelf/issues/243)** - Fixed unload function.
+
+
+### `🎯 bs.hitbox`
+
+- ✨ **[#203](https://github.com/mcbookshelf/Bookshelf/issues/203)** - Added `#bs.hitbox:is_entity_in_block` to check if an entity is in a block.
+- ✨ **[#203](https://github.com/mcbookshelf/Bookshelf/issues/203)** - Added `#bs.hitbox:is_entity_in_blocks` to check if an entity is in any block.
+- ⚡ **[#252](https://github.com/mcbookshelf/Bookshelf/pull/252)** - Optimized module for improved performance.
+- ⚡ **[#276](https://github.com/mcbookshelf/Bookshelf/pull/276)** - Add new hitboxes (new babies and salmon variants).
+- 🐛 **[#265](https://github.com/mcbookshelf/Bookshelf/pull/265)** - Corrected hitbox for player in spectator mode.
+
+
+### `🖱️ bs.interaction`
+
+- 🎉 **[#193](https://github.com/mcbookshelf/Bookshelf/issues/193)** - Added module to track player actions on interaction entities: left/right click, and hover events.
+
+
+### `🔗 bs.link`
+
+- ✨ **[#233](https://github.com/mcbookshelf/Bookshelf/issues/233)** - Added `#bs.link:remove_link` to remove specific links.
+- ✨ **[#233](https://github.com/mcbookshelf/Bookshelf/issues/233)** - Added `#bs.link:_children` and `#bs.link:_parent` to handle parent-child link relationships.
+
+
+### `📄 bs.log`
+
+- ✨ **[#171](https://github.com/mcbookshelf/Bookshelf/issues/171)** - Added logging functions `#bs.log:history` and `#bs.log:clear_history` for viewing and clearing log history.
+- ⚡ **[#247](https://github.com/mcbookshelf/Bookshelf/pull/247)** - Improved the default `bs.log` format for clarity.
+
+
+### `🏃 bs.move`
+
+- ⚡ **[#265](https://github.com/mcbookshelf/Bookshelf/pull/265)** - Enabled the module to work reliably at high coordinates with improved and more robust collision detection.
+- 🐛 **[#243](https://github.com/mcbookshelf/Bookshelf/issues/243)** - Fixed unload function.
+- 🐛 **[#255](https://github.com/mcbookshelf/Bookshelf/issues/255)** - Fixed local velocity collisions.
+- 🐛 **[#262](https://github.com/mcbookshelf/Bookshelf/pull/262)** - Resolved collision issues with paintings.
+
+
+### `🎲 bs.random`
+
+- 🎉 **[#1](https://github.com/mcbookshelf/Bookshelf/issues/1)** / **[#220](https://github.com/mcbookshelf/Bookshelf/issues/220)** - Added module, which includes random distributions, noise generation, and random selection of an element from a list.
+
+
+### `🔦 bs.raycast`
+
+- ✨ **[#245](https://github.com/mcbookshelf/Bookshelf/issues/245)** - Added `piercing` and callback options to `#bs.raycast:run`.
+- 🐛 **[#262](https://github.com/mcbookshelf/Bookshelf/pull/262)** - Resolved collision issues with paintings.
+
+
+### `⏲️ bs.schedule`
+
+- ⚡ **[#265](https://github.com/mcbookshelf/Bookshelf/pull/265)** - Optimized module for improved performance.
+- 🐛 **[#254](https://github.com/mcbookshelf/Bookshelf/issues/254)** - Resolved execution loop interruptions caused by callbacks.
+- 🐛 **[#264](https://github.com/mcbookshelf/Bookshelf/issues/264)** - Resolved compatibility issues with the schedule module outside the overworld.
+
+
+### `🏅 bs.xp`
+
+- 🐛 **[#256](https://github.com/mcbookshelf/Bookshelf/issues/256)** - Fixed progress bar boundary issues at 0% and 100%.
diff --git a/docs/_templates/changelog/v2.2.1.md b/docs/_templates/changelog/v2.2.1.md
new file mode 100644
index 0000000000..c8a6f21ec9
--- /dev/null
+++ b/docs/_templates/changelog/v2.2.1.md
@@ -0,0 +1,16 @@
+## 📦 [Bookshelf - 2.2.1](https://github.com/mcbookshelf/Bookshelf/releases/tag/v2.2.1)
+
+> **⬆️ A Minecraft Update!**
+>
+> *This release fixes several issues and bumps the Minecraft version to 1.21.4.*
+
+Bookshelf is now based on **Minecraft 1.21.4**.
+
+
+### `🧱 bs.block`
+
+- 🐛 **[#290](https://github.com/Gunivers/Bookshelf/issues/290)** - Added missing blocks in registries.
+
+### `🏃 bs.move`
+
+- 🐛 **[#288](https://github.com/Gunivers/Bookshelf/issues/288)** - Fixed collision resolutions.
diff --git a/docs/_templates/changelog/v2.2.2.md b/docs/_templates/changelog/v2.2.2.md
new file mode 100644
index 0000000000..21c6f00baf
--- /dev/null
+++ b/docs/_templates/changelog/v2.2.2.md
@@ -0,0 +1,10 @@
+## 📦 [Bookshelf - 2.2.2](https://github.com/mcbookshelf/Bookshelf/releases/tag/v2.2.2)
+
+> **🩹 A Quick Hotfix!**
+>
+> *This is a hotfix for version 2.2.1.*
+
+
+### `🎯 bs.hitbox`
+
+- 🐛 **[#293](https://github.com/Gunivers/Bookshelf/issues/293)** - Fixed module issues caused by the removal of `creaking_transient` in Minecraft 1.21.4.
diff --git a/docs/_templates/changelog/v3.0.0.md b/docs/_templates/changelog/v3.0.0.md
new file mode 100644
index 0000000000..8ae8a7bded
--- /dev/null
+++ b/docs/_templates/changelog/v3.0.0.md
@@ -0,0 +1,25 @@
+## 📦 [Bookshelf - 3.0.0](https://github.com/mcbookshelf/Bookshelf/releases/tag/v3.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!
+
+- ⚠️ **[#281](https://github.com/mcbookshelf/Bookshelf/issues/281)** - Merged the `bs.biome` and `bs.weather` modules into a single `bs.environment` module.
+- 🎉 **[#272](https://github.com/mcbookshelf/Bookshelf/issues/272)** - Added a new automatically generated `bs.load` module, eliminating the need to manually create `load` and `unload` tags for each module. Bookshelf now also uses **LanternLoad** to load its modules.
+- ⚡ **[#285](https://github.com/mcbookshelf/Bookshelf/pull/285)** - Simplified testing by automating batch specification and removing the need for a `__boot__` function.
+- ⚡ **[#285](https://github.com/mcbookshelf/Bookshelf/pull/285)** - Removed the need to create a `__help__` function and `help` tag. These are now automatically generated.
+- 📝 **[#280](https://github.com/mcbookshelf/Bookshelf/issues/280)** - Migrated the documentation to **mcbookshelf.dev** for improved accessibility and organization.
+- 📝 **[#285](https://github.com/mcbookshelf/Bookshelf/pull/285)** - Reworked the contribute documentation to reflect all changes and added a new **Getting Started** page.
+- ⚙️ **[#277](https://github.com/mcbookshelf/Bookshelf/issues/277)** - Created a GitHub organization for the Bookshelf project.
+- ⚙️ **[#278](https://github.com/mcbookshelf/Bookshelf/issues/278)** - Rewrote scripts and modules to use **Beet**, removing the Jupyter Notebook.
+- ⚙️ **[#285](https://github.com/mcbookshelf/Bookshelf/pull/285)** - Reworked metadata to a new format.
+- ⚙️ **[#285](https://github.com/mcbookshelf/Bookshelf/pull/285)** - Modules now require a `README.md` and a `pack.png`.
+- ⚙️ **[#285](https://github.com/mcbookshelf/Bookshelf/pull/285)** - Updated GitHub with new issue templates and a code of conduct.
+- ⚙️ **[#285](https://github.com/mcbookshelf/Bookshelf/pull/285)** - Added new workflows with automatic deployment to **Modrinth** and **Smithed**.
+
+
+### `🎯 bs.hitbox`
+
+- ✨ **[#285](https://github.com/mcbookshelf/Bookshelf/pull/285)** - Introduced a `#bs.hitbox:is_sized` tag for improved hitbox management.
diff --git a/docs/_templates/featured-modules.md b/docs/_templates/featured-modules.md
index 0eb8be543b..ee1435d243 100644
--- a/docs/_templates/featured-modules.md
+++ b/docs/_templates/featured-modules.md
@@ -1,43 +1,43 @@
::::{grid} 2
-:::{grid-item-card} 🧮 Math
-:link: modules/math
+:::{grid-item-card} 🧱 Block
+:link: modules/block
:link-type: doc
:margin: 0 3 0 0
-Mathematical functions: sin, cos, exp, log, sqrt and much more!
+Get and manipulate blocks (supports BlockStates and NBT).
:::
-:::{grid-item-card} 🏃 Move
-:link: modules/move
+:::{grid-item-card} 🔦 Raycast
+:link: modules/raycast
:link-type: doc
:margin: 0 3 0 0
-Give customized trajectories to entities, which can bounce on blocks and more...
+Cast rays and see if they collide with blocks or entities.
:::
-:::{grid-item-card} 🏷️ ID
-:link: modules/id
+:::{grid-item-card} 🧮 Math
+:link: modules/math
:link-type: doc
:margin: 0 3 0 0
-Identify entities with IDs, and use them to create complexe systems!
+Mathematical functions: sin, cos, exp, log, sqrt and much more!
:::
-:::{grid-item-card} 🔗 Link
-:link: modules/link
+:::{grid-item-card} 🏗️ Generate
+:link: modules/generate
:link-type: doc
:margin: 0 3 0 0
-Link entities positions and rotations and create coherent structures!
+Generate terrains and landscapes, incorporating natural features.
:::
-:::{grid-item-card} 🧱 Block
-:link: modules/block
+:::{grid-item-card} 🎲 Random
+:link: modules/random
:link-type: doc
:margin: 0 3 0 0
-Get and manipulate blocks (supports BlockStates and NBT).
+Random functions for different distributions and noise patterns.
:::
:::{grid-item-card} ❤️ Health
diff --git a/docs/conf.py b/docs/conf.py
index 6926aa1e91..f5240600af 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,24 +1,21 @@
import os
-import sys
-
-sys.path.append(os.path.join(os.path.dirname(__file__), "_exts/"))
# -- Project information -----------------------------------------------------
project = "Bookshelf"
-copyright = "2024, Gunivers"
+copyright = "2024, Gunivers" # noqa: A001
author = "Gunivers"
# -- General configuration ---------------------------------------------------
extensions = [
- "myst_parser",
- "sphinx_design",
- "sphinx_togglebutton",
- "sphinx_copybutton",
- "bs_treeview",
- "bs_nbt",
+ "myst_parser",
+ "sphinx_copybutton",
+ "sphinx_design",
+ "sphinx_minecraft",
+ "sphinx_togglebutton",
+ "sphinx_treeview",
]
exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
@@ -44,7 +41,6 @@
"tasklist",
]
-
# -- Options for HTML output -------------------------------------------------
html_baseurl = os.environ.get("READTHEDOCS_CANONICAL_URL", "")
@@ -57,14 +53,14 @@
html_js_files = ["bookshelf.js"]
html_context = {
- "github_user": "Gunivers",
+ "github_user": "mcbookshelf",
"github_repo": "Bookshelf",
"github_version": "master",
"doc_path": "docs",
- "READTHEDOCS": os.environ.get("READTHEDOCS", "") == "True"
+ "READTHEDOCS": os.environ.get("READTHEDOCS", "") == "True",
}
-json_url = "https://bookshelf.docs.gunivers.net/en/master/_static/switcher.json"
+json_url = "https://docs.mcbookshelf.dev/en/master/_static/switcher.json"
version_match = os.environ.get("READTHEDOCS_VERSION")
if not version_match or version_match.isdigit():
@@ -93,13 +89,32 @@
"version_match": version_match,
},
"icon_links": [
- # {"name": "Download", "url": "https://glib.gunivers.net/", "icon": "fa-solid fa-download"},
- {"name": "GitHub", "url": "https://github.com/Gunivers/Bookshelf", "icon": "fa-brands fa-github"},
- {"name": "Support us", "url": "https://www.helloasso.com/associations/altearn/formulaires/3/en", "icon": "fa-solid fa-heart"},
- {"name": "Discord server", "url": "https://discord.gg/MkXytNjmBt", "icon": "fa-brands fa-discord"},
- {"name": "Gunivers", "url": "https://gunivers.net", "icon": "_static/logo-gunivers.png", "type": "local"},
+ {
+ "name": "GitHub",
+ "url": "https://github.com/mcbookshelf/Bookshelf",
+ "icon": "fa-brands fa-github",
+ },
+ {
+ "name": "Support us",
+ "url": "https://www.helloasso.com/associations/altearn/formulaires/3/en",
+ "icon": "fa-solid fa-heart",
+ },
+ {
+ "name": "Discord server",
+ "url": "https://discord.gg/MkXytNjmBt",
+ "icon": "fa-brands fa-discord",
+ },
+ {
+ "name": "Gunivers",
+ "url": "https://gunivers.net",
+ "icon": "_static/logo-gunivers.png",
+ "type": "local",
+ },
],
}
if version_match == "master":
- html_theme_options["announcement"] = "⚠️ You are reading a doc of an undergoing development version. Information can be out of date and/or change at any time. ⚠️"
+ html_theme_options["announcement"] = (
+ "⚠️ You are reading a doc of an undergoing development version. "
+ "Information can be out of date and/or change at any time. ⚠️"
+ )
diff --git a/docs/contribute/cli-reference.md b/docs/contribute/cli-reference.md
new file mode 100644
index 0000000000..216eb51d72
--- /dev/null
+++ b/docs/contribute/cli-reference.md
@@ -0,0 +1,27 @@
+---
+html_theme.sidebar_secondary.remove: true
+---
+
+# 📜 CLI Reference
+
+This page provides a quick reference to the available commands. Use this reference to quickly look up commands and their usage without diving into detailed documentation.
+
+| **Command ** | **Description** | **Arguments/Options** |
+|--------------------------|-------------------------------------------------------------|--------------------------------------------------------------------------|
+| **📝 `docs build`** | Build static HTML documentation. | `[output]` - Build directory (optional, defaults to `_build`). |
+| **📝 `docs watch`** | Build and serve live documentation. | `[output]` - Build directory (optional, defaults to `_build`). |
+| **🔖 `meta check`** | Check modules' metadata files. | No arguments. |
+| **🔖 `meta update`** | Update metadata changes. | No arguments. |
+| **🧩 `modules build`** | Build the specified modules. | `[modules...]` - List of modules to build (optional). |
+| **🧩 `modules check`** | Check modules requirements. | No arguments. |
+| **🧩 `modules link`** | Link the generated packs to Minecraft. More information [here](project:getting-started.md#linking-modules-to-minecraft). | `[world]`, `--minecraft`, `--data-pack`, `--resource-pack` - Paths to their respective directories. |
+| **🧩 `modules release`** | Build zipped modules for release. | No arguments. |
+| **🧩 `modules test`** | Build and test the specified modules. | `[modules...]` - List of modules to test (optional). |
+| **🧩 `modules watch`** | Watch and rebuild the specified modules when changes occur. | `[modules...]` - List of modules to watch (optional). |
+
+To run any command, type `pdm run` before the command itself. Alternatively, you can activate the virtual environment (venv) manually and run the command directly. Some commands also have aliases:
+
+| **Alias** | **Command** |
+|-----------------|-------------------------|
+| `pdm run build` | `pdm run modules build` |
+| `pdm run watch` | `pdm run modules watch` |
diff --git a/docs/contribute/comments.md b/docs/contribute/comments.md
deleted file mode 100644
index 18de24a40c..0000000000
--- a/docs/contribute/comments.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-html_theme.sidebar_secondary.remove: true
----
-
-# 💭 Comments
-
-The development of Bookshelf is collaborative, which means that other people can read the code. Moreover, Bookshelf is also meant to be pedagogical and accessible to people curious about the way the functions of Bookshelf work. Therefore, it is important to make it understood by other developers or users, and this, in addition to the
-documentation, also goes through the commentary of the code. Thus, it is important to regularly and cleanly comment on functions in order to explain how the function works.
\ No newline at end of file
diff --git a/docs/contribute/conservation-principle.md b/docs/contribute/conservation-principle.md
deleted file mode 100644
index cff9bb1546..0000000000
--- a/docs/contribute/conservation-principle.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-html_theme.sidebar_secondary.remove: true
----
-
-# ♻️ Conservation principle
-
-```{epigraph}
-"Nothing is lost, nothing is created, everything is transformed"
-
--- Antoine Lavoisier
-```
-
-To minimize interference with scores and other data, Bookshelf aims to prevent accidental overwrites. This involves minimizing the creation of new scores, strictly forbidding score deletion, and avoiding unnecessary score rewrites whenever possible.
-
-To achieve this, each function begins by saving its inputs and restores them at the end. This ensures that only the function outputs are altered, leaving other data intact.
-
-Additionally, while default objectives for inputs and outputs are `bs.in` and `bs.out`, alternative ones can be used, particularly when representing entity states.
-
-```mcfunction
-# Get the position of the source entity
-function bs.position:get_pos {scale:1000}
-
-# Multiply the X coordinate by 2
-scoreboard players operation @s bs.pos.x *= 2 bs.const
-
-# Place the entity at the new position
-function bs.position:set_pos {scale:.001}
-```
-
-In this exemple, the `get` function will return `bs.pos.[x,y,z]` scores, that are also used as input for the `set` function.
diff --git a/docs/contribute/contribution-validation.md b/docs/contribute/contribution-validation.md
index 12af57cc39..1847867bf7 100644
--- a/docs/contribute/contribution-validation.md
+++ b/docs/contribute/contribution-validation.md
@@ -1,38 +1,40 @@
-# ✅ Contribution validation
+# ✅ Contribution Validation
-A Bookshelf contribution often requires some additional modifications other than the code itself.
-To ensure the different modifications are correctly contributed, we have set up different validation steps.
+Contributing often requires additional changes beyond the code itself. To ensure all contributions are properly integrated, we follow a series of validation steps.
---
-## ⚙️ Automatic validation
+## ⚙️ Automatic Validation
-First, we have defined some scripts that are automatically executed when proposing a pull request (and after each commit inside the pull request).
-These scripts verify:
-- If the metadata of the features, modules, and datapacks are defined and up to date (see [metadata page](project:metadata.md)).
-- If there is no regression in the code, by executing the different unit tests (see [debug page](project:debug.md#-unit-tests)).
+We use automated scripts to validate contributions whenever a pull request is opened or updated with new commits. These scripts check:
+- Whether metadata is defined and up to date (see [metadata page](project:metadata.md)).
+- Whether the code passes all unit tests, ensuring no regressions (see [debug page](project:debug-tools.md#-unit-tests)).
-A Bookshelf contributor can also manually and locally execute these checks using the `all.ipynb` notebook in the `scripts` folder (requires Python, see `scripts/pyproject.toml` file).
-
-Some checks about the metadata can fail because the specified metadata are not up to date.
-Indeed, some module/feature metadata such as the dependencies are computed, and the Bookshelf contributor needs to manually run the generators to enable their computation.
-These generators are available in the `scripts/all.ipynb` notebook and are not executed by the CI/CD.
+Bookshelf contributors can also manually run these checks locally using the following commands:
+```sh
+pdm run modules check
+pdm run modules test
+```
---
-## 📄 Pull request template
+## 📄 Pull Request Template
+
+When creating a pull request, contributors are provided with a checklist template to ensure no essential steps are overlooked. This checklist covers changes that cannot be automatically validated, such as:
+- Updating the changelog with details about the contribution and the pull request ID.
+- Adding or updating documentation for new or existing features.
+- Including unit tests where applicable.
+- Linking the pull request to an existing issue.
-When a Bookshelf contributor opens a pull request on the Bookshelf repository, the message of the pull request is filled with a checklist.
-This checklist helps the Bookshelf contributor to ensure that they have not forgotten any changes we cannot automatically verify, such as the modification of the changelog file.
-Here is a non-exhaustive list of what a feature contribution requires:
-- Update the changelog with the content of the contribution and the ID of the pull request.
-- Document the new features in the documentation and update the documentation for existing features (if needed).
-- Provide some unit tests if possible.
-- Link the pull request to an existing issue.
+This checklist ensures contributions meet project standards before submission.
---
-## 🔎 Manual review
+## 🔎 Manual Review
-Finally, other Bookshelf contributors manually review the pull request before approving it.
+After automated checks, other Bookshelf contributors manually review the pull request. This review ensures:
+- Code quality and alignment with project standards.
+- Adequate documentation and testing.
+- Compliance with the overall contribution guidelines.
+Once the review process is complete, the contribution is approved and merged.
diff --git a/docs/contribute/debug-tools.md b/docs/contribute/debug-tools.md
new file mode 100644
index 0000000000..6a1f432d6c
--- /dev/null
+++ b/docs/contribute/debug-tools.md
@@ -0,0 +1,90 @@
+# 🕵️ Debug Tools
+
+Debugging is a fundamental aspect of software development. Bookshelf provides tools to help identify and resolve issues effectively.
+
+---
+
+## 🧪 Unit Tests
+
+Tests are essential for ensuring code correctness and preventing future bugs. This project uses Misode's Minecraft Fabric mod, [PackTest](https://github.com/misode/packtest), for testing.
+
+
+### ⚙️ Running Tests
+
+To run the tests, you have two options:
+
+1. **Headless Mode**: We provide a simple command `pdm run modules test` that allows you to run the tests headlessly, without having to open the game.
+2. **In-Game**: Download and install the Minecraft fabric mod. Once that's done, you can run the tests using the test command in Minecraft.
+
+```{admonition} Java Required
+:class: warning
+Ensure that Java is installed on your system, as it is required for the command to work.
+```
+
+### ✍️ Writing Tests
+
+Each test is a `.mcfunction` file inside the `test` folder.
+When writing tests, make sure to clearly define what you are testing and what the expected outcome is. It's also a good idea to include edge cases to ensure your code can handle all possible inputs.
+
+### 🛠️ Custom Commands
+
+PackTest offers a variety of commands to control test flow, validate conditions, and interact with Minecraft's environment:
+
+**Test Flow Commands**:
+- `fail []`: Immediately fails the current test and logs an optional message.
+- `succeed`: Immediately passes the current test.
+- `assert `: Fails the test if the condition is false.
+- `assert not `: Fails the test if the condition is true.
+- `await `: Continuously checks a condition until it succeeds or times out.
+- `await not `: Waits until the condition becomes false.
+- `await delay `: Pauses the test for a specified duration.
+
+**Condition Types**:
+- `block `: Checks if a block at the specified position matches the given block.
+- `data `: Verifies NBT data using standard Minecraft data syntax.
+- `entity `: Validates if entities match a selector (works beyond test boundaries).
+- `predicate `: Executes a predicate in the data pack.
+- `score `: Compares scores using Minecraft's score-based conditions.
+- `chat []`: Matches chat messages against a regex pattern.
+
+### 🧍 Player Dummies
+
+PackTest allows you to spawn and control "dummies," simulated players for testing:
+
+- `dummy spawn`: Spawns a new dummy.
+- `dummy respawn`: Respawns a killed dummy.
+- `dummy jump`: Makes the dummy jump.
+- `dummy sneak [true|false]`: Toggles sneaking.
+- `dummy sprint [true|false]`: Toggles sprinting.
+- `dummy use item`: Simulates the dummy using an item.
+- `dummy mine `: Commands the dummy to mine a block.
+
+### 📋 Test Directives
+
+You can customize tests using directives (special comments at the beginning of the test):
+
+- `@template`: Specifies the resource location of a structure template to use for the test.
+- `@timeout`: Sets the maximum time (in ticks) before the test fails (default: 100).
+- `@dummy`: Spawns a dummy for testing (e.g., `@dummy ~0.5 ~ ~0.5`).
+- `@optional`: Marks the test as allowed to fail (useful for non-critical cases).
+
+
+```{admonition} Learn more...
+:class: info
+
+If you need more information than this page provides, visit Misode's [repository](https://github.com/misode/packtest) for detailed guidance on writing tests.
+```
+
+---
+
+## 📦 Modules
+
+Bookshelf includes a variety of modules designed to enhance your development experience.
+
+### 📄 Logging
+
+Centralizes and streamlines log management, making it easier to monitor and troubleshoot your project. For more details, refer to the [log module documentation](project:../modules/log.md).
+
+### 🔬 Var Dumping
+
+Provides an easy way to display scores or storage values at any given time, helping with debugging and tracking. For more details, refer to the [dump module documentation](project:../modules/dump.md).
diff --git a/docs/contribute/debug.md b/docs/contribute/debug.md
deleted file mode 100644
index 388bb5ef99..0000000000
--- a/docs/contribute/debug.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# 🕵️ Debug
-
-Learn about Bookshelf's debugging tools, including unit tests, logging and var dumping.
-
----
-
-## 📄 Logging
-
-Bookshelf offers a logging module designed to centralize and streamline log management. For more details on this feature, refer to the [log module documentation](project:../modules/log.md).
-
----
-
-## 🔬 Var dumping
-
-Bookshelf offers a var dumper module designed to easily display a score or storage at any given time. For more details on this feature, refer to the [dump module documentation](project:../modules/dump.md).
-
----
-
-## 🧪 Unit tests
-
-Tests are an integral part of any software development process. They help ensure the correctness of your code and can save you from potential bugs in the future. In this project, we use a Minecraft fabric mod made by Misode called [PackTest](https://github.com/misode/packtest).
-
-### ✍️ Writing tests
-
-Each test is a `.mcfunction` file inside the `test` folder, at the root of each module.
-When writing tests, make sure to clearly define what you are testing and what the expected outcome is. It's also a good idea to include edge cases to ensure your code can handle all possible inputs.
-
-Each test must set the `@batch` directive to the name of the module. For example:
-
-```mcfunction
-# This is a test
-# @batch
-```
-
-This setup ensures that tests are correctly scoped to their respective modules, providing a structured and isolated testing environment.
-
-Additionally, each test folder should contain a `__boot__.mcfunction` file that initializes the testing environment. This file should set the `@beforebatch` directive, as shown below:
-
-```mcfunction
-# @batch
-# @beforebatch function #
-```
-
-The purpose of these directives is to load only the relevant module, helping to identify any missing load instructions.
-
-
-### ⚙️ Running tests
-
-To run the tests, you have two options:
-
-1. **Headless Mode**: We provide a small script inside the notebook that allows you to run the tests headlessly, without having to open the game. This is a more convenient option for continuous integration environments.
-
-2. **In-Game**: Download and install the Minecraft fabric mod. Once that's done, you can run the tests using the test command in Minecraft.
-
-For more information on how to write and run tests, you can refer to Misode's [PackTest repository](https://github.com/misode/packtest).
diff --git a/docs/contribute/definitions.md b/docs/contribute/definitions.md
index b13bbab099..35565e5359 100644
--- a/docs/contribute/definitions.md
+++ b/docs/contribute/definitions.md
@@ -14,7 +14,7 @@ In order to speak with the same vocabulary, here is some words that have a speci
* - **Dependency**
- A module that another module relies on for functionality. It must be loaded for the dependent module to work correctly.
* - **Feature**
- - Something designed for the final user in order to allow him to perform a task. Most of the time, a feature is a function tag to call instead of the function. This enable, among other things, filtering the `/function` completion by proposing only the features. A feature can also be a loot_table, a structure, a predicate or whatever.
+ - Something designed for the final user in order to allow them to perform a task. Most of the time, a feature is a function tag to call instead of the function. A feature can also be a loot table, a structure, a predicate or whatever.
* - **Module**
- A group of features that share a common purpose and that are contained in a namespace (i.e. datapack structures).
* - **Weak Dependency**
diff --git a/docs/contribute/documentation.md b/docs/contribute/documentation.md
index 59117f2374..ca9872a376 100644
--- a/docs/contribute/documentation.md
+++ b/docs/contribute/documentation.md
@@ -1,52 +1,33 @@
# 📝 Documentation
-The primary objective of Bookshelf is to streamline the datapack development process and ensure accessibility. To achieve this, it is crucial that the library is thoroughly documented.
-We have dedicated significant effort to creating this comprehensive documentation website.
-Moreover, we request that every new feature contribution be accompanied by appropriate documentation.
-
-This page aims to give some information on how to contribute to the documentation itself.
+Bookshelf aims to simplify map making and make it accessible. We’ve worked hard to create a comprehensive documentation website and ask that every new feature be documented properly.
---
-## ⚙️ Install the required tools
-
-Bookshelf documentation requires Python.
-If you are not familiar with this programming language, don't worry, you don't have to use it.
-But to be able to build the documentation locally, you still need to install it.
-For that, you can download version 3.12 or higher on the [Python website](https://www.python.org/downloads/).
-After having installed Python and cloned the Bookshelf repository, navigate to the `/docs` folder and open a terminal (or Powershell if you are on Windows).
-Then, execute this command:
-
-```shell
-pip install -r requirements.txt -U
-```
+## ✍️ Write the Documentation
-This command will install all the required dependencies, especially [Sphinx](https://www.sphinx-doc.org/en/master/) and [Myst Parser](https://myst-parser.readthedocs.io/en/latest/intro.html) that enable the generation of the documentation website from the different Markdown files.
+The documentation is written in Markdown, extended with Myst Parser. You can view the [Myst Parser documentation here](https://myst-parser.readthedocs.io/en/latest/intro.html). To add or update documentation, simply follow the structure of existing pages and features. All images are stored in the `/docs/_imgs` folder.
---
-## ✍️ Write the documentation
+## 🔨 Build the Documentation
-The documentation is mainly written in Markdown, extended by Myst Parser.
-You can find the documentation of Myst Parser [here](https://myst-parser.readthedocs.io/en/latest/intro.html).
-To write a new documentation page or to document a new feature, you can simply take as example the existing pages/features.
+To verify that your documentation changes work as expected, you can build and view it locally on your computer.
+1. Open a terminal (or Powershell if you are on Windows).
+2. Choose one of the following options to build and view the documentation:
-All the images are stored into the `/docs/_imgs` folder.
+### Option 1: Build Documentation
----
+```shell
+pdm run docs build
+```
-## 🔨 Build the documentation
+This command will generate the documentation, which you can find in the `/docs/_build` folder.
-To ensure your documentation contribution works correctly, you can build and verify it locally on your computer.
-To do this, navigate to the `/docs` folder and open a terminal (or Powershell if you are on Windows).
-Then, execute this command:
+### Option 2: Build with Hot Reload
```shell
-# For Windows:
-./make html
-# For other OSs:
-make html
+pdm run docs watch
```
-You can now find the built documentation inside the `/docs/_build/html` folder.
-Open the `index.html` with your browser to see your changes.
+This option will also generate the documentation but will allow you to view it in your browser at `http://127.0.0.1:8000` with hot reloading, so any changes you make will automatically update in the browser.
diff --git a/docs/contribute/file-format.md b/docs/contribute/file-format.md
index 10f5bc84f8..9ba7313e9d 100644
--- a/docs/contribute/file-format.md
+++ b/docs/contribute/file-format.md
@@ -2,10 +2,9 @@
html_theme.sidebar_secondary.remove: true
---
-# 📄 File format
+# 📄 File Format
Each function of Bookshelf should have a header to indicate the license.
-The header may also specified the link to the feature documentation (not mandatory).
---
@@ -14,29 +13,7 @@ Header to put at the beggining of each function:
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
-#
-# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
-# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# Conditions:
-# - You may use this file in compliance with the MPL v2.0
-# - Any modifications must be documented and disclosed under the same license
-#
-# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature:
-# ------------------------------------------------------------------------------------------------------------
-```
-
-The `` placeholder must be fill by the current year and the `` placeholder by the link to the documentation of this specific feature.
-
-If the documentation is not specified, the header looks like:
-```
-# ------------------------------------------------------------------------------------------------------------
-# Copyright (c) Gunivers
-#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/docs/contribute/generated-files.md b/docs/contribute/generated-files.md
new file mode 100644
index 0000000000..bb374b44f1
--- /dev/null
+++ b/docs/contribute/generated-files.md
@@ -0,0 +1,50 @@
+# ⚙️ Generated Files
+
+When building modules with **[Beet](https://github.com/mcbeet/beet)**, several files are automatically generated to simplify development and improve consistency. This page outlines what happens behind the scenes.
+
+---
+
+## 📦 Module Management
+
+Modules are bundled with their dependencies:
+- If Module `A` depends on Module `B`, both are included in the build process.
+
+A special loader module, `bs.load`, along with `load` (LanternLoad), is created to:
+- Resolve version conflicts and manage dependencies between modules.
+- Ensure load functions are called in the correct order, maintaining reliable datapack behaviors.
+
+During the build process, the `pack.mcmeta` file is automatically updated to ensure compatibility:
+- `pack_format` is set to the latest supported Minecraft version.
+- `supported_formats` specifies a compatible version range.
+
+---
+
+## 🗂️ Resource-Based Plugins
+
+Beyond module management, Bookshelf automatically generates data across multiple resource types.
+
+### 📄 Function Related
+
+Bookshelf enhances the contributor and user experience by:
+
+- Automatically adding functions from the module's `import` folder to the `__load__` function.
+- Generating a `__help__` function and its `help` tag linking to the documentation of the module.
+
+### 🧪 Test Related
+
+Bookshelf uses PackTest to run tests for its modules. To ensure smooth execution, it:
+
+- Automatically includes `@batch ` instructions in test functions.
+- Generates a `__setup__` test function to isolate and load only the module being tested.
+
+### 🏷️ Tag Related
+
+To ensure proper loading and versioning, Bookshelf requires non-overridable tags. It:
+
+- Updates all tags with the `replace` key set to `true`.
+
+---
+
+## 🧩 Module-Specific Plugins
+
+In addition to these shared plugins, each module can include its own plugins that hook into the build pipeline. Some modules may have plugins that are responsible for generating data specific to themselves, providing even greater flexibility during the build process.
diff --git a/docs/contribute/getting-started.md b/docs/contribute/getting-started.md
new file mode 100644
index 0000000000..aea5371bad
--- /dev/null
+++ b/docs/contribute/getting-started.md
@@ -0,0 +1,77 @@
+---
+html_theme.sidebar_secondary.remove: true
+---
+
+# 🚀 Getting Started
+
+This guide will walk you through setting up a local development environment to build, test, and contribute to our modules.
+
+---
+
+## ⚙️ Prerequisites
+
+Before getting started, ensure your system is prepared by following these steps:
+
+1. Install [**PDM**](https://pdm-project.org/en/latest/), the Python Dependency Manager.
+2. Open a terminal at the root of the project and run the following command to install all required dependencies:
+ ```sh
+ pdm install
+ ```
+
+Running this command prepares your environment for building and testing the project.
+
+---
+
+## 🔨 Building Modules
+
+The `modules` directory contains the source files for all modules. Use the following commands to manage and build them efficiently:
+
+:::{list-table}
+* - `pdm run modules build`
+ - Build all modules.
+* - `pdm run modules watch`
+ - Monitor changes and rebuild modules automatically.
+* - `pdm run modules ...`
+ - Build or watch only the specified modules.
+* - `pdm run modules link [world]`
+ - Link the generated resource and data packs to a Minecraft world.
+:::
+
+```{admonition} Watching Modules
+:class: tip
+
+Building modules can take some time. For a smoother experience, it's recommended to only watch the module you're currently working on: `pdm run modules watch `.
+```
+
+### Linking Modules to Minecraft
+
+The `link` command allows you to integrate generated packs directly into a Minecraft world. Below are the options available for this command:
+
+:::{list-table}
+* - `world (optional)`
+ - The name of the Minecraft world to link.
+* - `--minecraft `
+ - Path to the `.minecraft` directory (location of Minecraft files).
+* - `--data-pack `
+ - Path to the directory where data packs are stored.
+* - `--resource-pack `
+ - Path to the directory where resource packs are stored.
+:::
+
+
+This workflow demonstrates how to link and continuously test your modules directly in Minecraft:
+```sh
+# Link modules to a specific world
+pdm run modules link --minecraft
+
+# Monitor changes and rebuild a module for the linked world
+pdm run modules watch
+```
+
+---
+
+## 🧪 Testing Modules
+
+Testing is a fundamental aspect of software development. It helps ensure the correctness of your code and can save you from potential bugs in the future.
+
+To learn how to write and run tests for your modules, refer to the [Debug Section](project:debug-tools.md#-unit-tests).
diff --git a/docs/contribute/good-practices.md b/docs/contribute/good-practices.md
new file mode 100644
index 0000000000..cff9650a67
--- /dev/null
+++ b/docs/contribute/good-practices.md
@@ -0,0 +1,39 @@
+# 🛡️ Good Practices
+
+Bookshelf’s development emphasizes collaboration, clarity, and efficiency. By following these guidelines, you can help maintain a high standard of code that is accessible, understandable, and non-intrusive.
+
+---
+
+## 💬 Commenting Code
+
+Bookshelf is a collaborative project designed to be both pedagogical and accessible. This means the code is not only functional but also understandable by developers and curious users alike.
+
+To achieve this, **commenting your code regularly and cleanly** is essential.
+
+- Explain the purpose of each function and its key components.
+- Ensure comments are concise but provide enough context for others.
+- Update comments when the functionality changes to avoid confusion.
+
+Clear comments contribute to a smoother collaboration and make Bookshelf easier to learn from.
+
+---
+
+## ♻️ Conservation Principle
+
+Bookshelf follows a conservation principle inspired by Antoine Lavoisier’s maxim:
+
+```{epigraph}
+"Nothing is lost, nothing is created, everything is transformed"
+
+-- Antoine Lavoisier
+```
+
+This principle minimizes interference with scores and other data, aiming to prevent accidental overwrites or unnecessary operations.
+
+### Key Guidelines:
+
+- **Minimize the creation of new scores**. Use existing ones whenever possible.
+- **Strictly avoid score deletion**. Instead, repurpose scores or reset their values if necessary.
+- **Reduce unnecessary score rewrites**. Only update scores when absolutely required.
+
+Each function should handle inputs responsibly, ensuring that only outputs are altered.
diff --git a/docs/contribute/index.md b/docs/contribute/index.md
index a4d280fc0e..20c1526935 100644
--- a/docs/contribute/index.md
+++ b/docs/contribute/index.md
@@ -4,7 +4,7 @@ html_theme.sidebar_secondary.remove: true
# 🤝 Contribute
-Bookshelf is a community project and can therefore be developed by several people at the same time. To keep the project clean and consistent, it is necessary for the different developers to respect some conventions when developing functions. In the following page, you can find all the Bookshelf standards. This standard is signed by the prefix `bs.` in the namespaces so you can identify all the datapacks that use it.
+Welcome to the Contribute section of our documentation! Whether you're fixing bugs, adding features, or writing new modules, this guide will help you get started and align with our project's standards.
To contribute on this project, you must
@@ -12,6 +12,8 @@ To contribute on this project, you must
- Know the basic usage of git projects (20-30 min to learn on internet)
- Be accessible to answer questions about your work
+If you're not familiar with GitHub pull requests or open-source collaboration, we recommend this guide to help you get started quickly: [First Contributions Guide](https://github.com/firstcontributions/first-contributions/blob/main/README.md).
+
:::{admonition} **For french speakers**
:class: note
Ce projet est réalisé principalement par des membres francophones mais à destination d'un public international. C'est pourquoi toute la lib ainsi que la documentation est en anglais.
@@ -24,11 +26,11 @@ Si vous souhaitez contribuer mais que votre anglais n'est pas au point, vous pou
:hidden:
:maxdepth: 1
:caption: Fundamentals
-
definitions
+getting-started
nomenclature
+shared-resources
tree-structure
-shared-data
file-format
````
@@ -36,11 +38,18 @@ file-format
:hidden:
:maxdepth: 1
:caption: Key Concepts
-debug
-metadata
+debug-tools
documentation
+metadata
+generated-files
contribution-validation
-conservation-principle
special-functions
-comments
+good-practices
+````
+
+````{toctree}
+:hidden:
+:maxdepth: 1
+:caption: Quick References
+cli-reference
````
diff --git a/docs/contribute/metadata.md b/docs/contribute/metadata.md
index 131f6c1bb3..d6082e7c91 100644
--- a/docs/contribute/metadata.md
+++ b/docs/contribute/metadata.md
@@ -1,18 +1,15 @@
# 🔖 Metadata
-To facilitate the work of bots such as the Bookshelf Manager, each feature, module, and data pack should include some metadata.
-Contributors need to manually specify some of these, which are then used to produce more complete metadata files that bots can consume.
-
-To generate the full metadata, contributors need to execute the metadata generators in the `scripts/all.ipynb` notebook (requires Python, see the `scripts/pyproject.toml` file).
-All metadata are verified by the CI/CD pipeline (see the [contribution validation page](project:../contribute/contribution-validation.md)).
+To support automation by tools like the Bookshelf Manager, modules must declare specific metadata. All metadata are verified during the CI/CD process (see the [contribution validation page](project:../contribute/contribution-validation.md)).
---
-## ⭐ Feature metadata
+## ⭐ Feature Metadata
-The feature metadata are directly placed on the function tag of the feature:
+Feature metadata are defined directly within each `.json` file, as shown below:
-```json
+```{code-block} json
+:force:
{
"__bookshelf__": {
"feature": true,
@@ -32,86 +29,71 @@ The feature metadata are directly placed on the function tag of the feature:
"minecraft_version": ""
}
},
- "values": [
- ...
- ]
+ ...
}
```
| Field | Description | Mandatory |
|-------|-------------|---------- |
-| feature | Indicate if the current function tag is the end point of a feature or not. | yes |
-| documentation | The link to the documentation of the feature. | yes |
-| authors | The list of authors of the feature. Cannot be empty. | yes |
-| contributors | The list of contributors to the feature. A contributor is someone who helps to create the function without developing it (the one who gives a track to realize the function or the one who fixes a bug for example). Cannot be empty. | no |
-| created | Date and minecraft version in which the system was originally created (for history purpose) | yes |
-| updated | Date and minecraft version in which the system was modified for the last time | yes |
-
-The generated metadata are placed in `/data/.metadata/generated/features.json`.
+| feature | Indicates whether the current function tag is the endpoint of a feature. | yes |
+| documentation | A link to the feature's documentation. | yes |
+| authors | A list of feature authors. Cannot be empty. | yes |
+| contributors | A list of contributors (e.g., those who provided insights, fixes, or indirect help). | no |
+| created | The creation date and Minecraft version for historical purposes. | yes |
+| updated | The date and Minecraft version of the most recent update. | yes |
---
-## 🧩 Module metadata
+## 🧩 Module Metadata
-The module metadata are specified in `/data/.metadata/module.json` (see [tree structure page](project:../contribute/tree-structure.md)).
-Here is the format:
+Module metadata are defined in `modules//module.json`. Below is an example:
-```json
+```{code-block} json
+:force:
{
- "name": "",
- "display_name": "",
- "description": "",
- "documentation": "",
- "icon": "",
- "authors": [
- ""
- ],
- "contributors": [
- ""
- ],
- "weak_dependencies": [
- ""
- ]
-}
-```
-
-| Field | Description | Mandatory |
-|-------|-------------|---------- |
-| name | The name of the module. Format: `bs.foo`. | yes |
-| display_name | The display name of the module. For instance: `Foo`. | yes |
-| description | A description for the module. | yes |
-| documentation | The link to the documentation of the module. | yes |
-| icon | The name of the module icon image. Should be placed on the same folder than the `metadata` file. | no (but trigger warnings) |
-| authors | The list of authors of the module. Cannot be empty. The authors are automatically computed from the features, this field allows defining authors that are not indicated inside the features. | no |
-| contributors | The list of contributors to the feature. A contributor is someone who helps to create the function without developing it (the one who gives a track to realize the function or the one who fixes a bug for example). The contributors are automatically computed from the features, this field allows defining contributors that are not indicated inside the features. | no |
-| weak dependencies | List of the feature weak dependencies. A weak dependency is a dependency module that is not essential to the functioning of the feature. For instance, `bs.log`. | no |
-
-The generated metadata are placed in `/data/.metadata/generated/module.json`.
-
----
-
-## 📦 Datapack metadata
-
-The datapack metadata are the `pack.mcmeta` file:
-
-```json
-{
- "pack": {
- "pack_format": 41,
- "description": "Bookshelf - Library designed for mapmakers"
+ ...
+ "meta": {
+ "name": "",
+ "slug": "",
+ "description": "",
+ "documentation": "",
+ "tags": [
+ ""
+ ],
+ "authors": [
+ ""
+ ],
+ "contributors": [
+ ""
+ ],
+ "dependencies": [
+ ""
+ ],
+ "weak_dependencies": [
+ ""
+ ]
}
}
-
```
| Field | Description | Mandatory |
|-------|-------------|---------- |
-| pack_format | See the [Minecraft wiki](https://minecraft.wiki/w/Pack_format). | yes |
-| description | A description for the datapack. | yes |
+| name | The module's display name (e.g. `Foo`). | yes |
+| slug | The module's slug used to publish to platforms (e.g. `bookshelf-foo`). | yes |
+| description | A description of the module's purpose. | yes |
+| documentation | A link to the module's documentation. | yes |
+| tags | A list of tags for categorizing or identifying modules. Tags are also used to generate bundles (e.g. `default` and `dev`). | no (but trigger warnings) |
+| authors | A list of module authors (supplements authors from features). Cannot be empty. | no |
+| contributors | A list of contributors (supplements contributors from features). | no |
+| dependencies | Essential modules required for this module to function (e.g., `bs.hitbox`). | no |
+| weak dependencies | Optional modules that enhance functionality but are not essential (e.g., `bs.log`). | no |
---
## 📜 Manifest
-The manifest is the file containing the metadata of all datapacks, modules, and features of Bookshelf.
-This manifest is automatically generated and it is located at `generated/manifest.json`.
+The manifest consolidates metadata for all modules and features in Bookshelf. It is automatically generated and can be updated using the following command:
+```sh
+pdm run meta update
+```
+The generated file is located at `meta/manifest.json`.
diff --git a/docs/contribute/nomenclature.md b/docs/contribute/nomenclature.md
index 3a7dc08bd3..5a55bf98ba 100644
--- a/docs/contribute/nomenclature.md
+++ b/docs/contribute/nomenclature.md
@@ -10,7 +10,7 @@ Bookshelf respects certain naming conventions in order to reduce the effort need
:::{list-table}
* - **Files**
- - Use the snake_case convention. A few names are reserved for [special functions](project:../contribute/special-functions.md) at the root of each module: `__help__`, `__load__`, `__tick__`, and `__unload__`.
+ - Use the snake_case convention. A few names are reserved for [special functions](project:../contribute/special-functions.md) at the root of each module: `__help__`, `__load__`, and `__unload__`.
*Example: `function/.mcfunction`*
* - **Entity tags**
@@ -18,11 +18,11 @@ Bookshelf respects certain naming conventions in order to reduce the effort need
*Example: `bs..my_tag`*
* - **Data storage**
- - Use the snake_case convention. Is limited to what is defined in the [shared data](project:shared-data.md) section.
+ - Use the snake_case convention. Is limited to what is defined in the [Shared Resources](project:shared-resources.md) section.
*Example: `bs:data .`*
* - **Objectives**
- - Use the snake_case convention and `bs.` prefix. Only create new objectives if no existing objective defined in the [shared data](project:shared-data.md) section can be used.
+ - Use the snake_case convention and `bs.` prefix. Only create new objectives if no existing objective defined in the [Shared Resources](project:shared-resources.md) section can be used.
*Example: `bs.my_objective`*
* - **Scoreholders**
diff --git a/docs/contribute/shared-data.md b/docs/contribute/shared-data.md
deleted file mode 100644
index e3066d23b5..0000000000
--- a/docs/contribute/shared-data.md
+++ /dev/null
@@ -1,64 +0,0 @@
----
-html_theme.sidebar_secondary.remove: true
----
-
-# 🌐 Shared data
-
-In order to reduce the footprint of the library here are some shared objectives and storages that a module can use:
-
----
-
-## Shared objectives
-
-| Objectives | Description |
-|------------|-------------|
-| `bs.const` | Contain constant values. Scoreholder format: `` |
-| `bs.data` | Global score storage. Scoreholder format: `#.` |
-| `bs.in` | Default score for inputs. Scoreholder format: `$..` |
-| `bs.out` | Default score for outputs. Scoreholder format: `$.` or `$..` |
-| `bs.ctx` | Fast contextual scoreboard. Scoreholder format: `#` |
-
----
-
-## Shared storages
-
-| Namespaces | Description |
-|------------|-------------|
-| `bs:const` | Contain constant data. Path format: `.` |
-| `bs:data` | Global data storage. Path format: `.` |
-| `bs:in` | Default storage for inputs. Path format: `..` |
-| `bs:out` | Default storage for outputs. Path format: `.` or `..` |
-| `bs:ctx` | Fast contextual storage. Only path accepted are `x`, `y`, `z` for numbers (store) and `_` for other data. |
-
----
-
-## Shared blocks
-
-These commands can be used at load time to create blocks that can be used anywhere. These blocks must be kept in loaded chunks (at -30000000 1600).
-
-```mcfunction
-# A block that can be used to manipulate loots
-setblock -30000000 0 1606 minecraft:decorated_pot
-
-# Command block used to get the system time (command block output)
-setblock -30000000 0 1605 minecraft:repeating_command_block[facing=up]{auto:1b,Command:"help me",TrackOutput:1}
-```
-
-## Shared entities
-
-These commands can be used at load time to create global entities that can be used anywhere. These entities must be kept in loaded chunks (at -30000000 1600) at the end of each tick. They are summoned with specific UUIDs in order to avoid having to rely on the `@e` selector. The UUID `B5-0-0-0-0` is reserved for contextual temporary entities that should not exist at the end of a tick.
-
-```mcfunction
-# The most useful entity, used for position, arithmetic, and much more...
-execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
-
-# An entity that can be used to interpret text or compute transformations
-execute unless entity B5-0-0-0-2 run summon minecraft:text_display -30000000 0 1600 {UUID:[I;181,0,0,2],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],view_range:0f}
-
-# An entity that can be used to manipulate loots or compute transformations
-execute unless entity B5-0-0-0-3 run summon minecraft:item_display -30000000 0 1600 {UUID:[I;181,0,0,3],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],view_range:0f}
-
-# An entity used as an UUID pointer (modify Owner then execute on origin)
-execute unless entity B5-0-0-0-4 run summon minecraft:snowball -30000000 0 1600 {UUID:[I;181,0,0,4],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],NoGravity:1b,Invulnerable:1b}
-
-```
diff --git a/docs/contribute/shared-resources.md b/docs/contribute/shared-resources.md
new file mode 100644
index 0000000000..0152914458
--- /dev/null
+++ b/docs/contribute/shared-resources.md
@@ -0,0 +1,63 @@
+---
+html_theme.sidebar_secondary.remove: true
+---
+
+# 🌐 Shared Resources
+
+To minimize redundancy and enhance efficiency, the library provides shared objectives, storages, blocks, and entities that modules can leverage.
+
+---
+
+## Objectives
+
+| Objectives | Description |
+|------------|-------------|
+| `bs.ctx` | Contextual scoreboard for fast temporary values. Format: `#` |
+| `bs.const` | Stores constant values. Format: `` |
+| `bs.data` | Global score storage. Format: `#.` |
+| `bs.in` | Default scores for input values. Format: `$..` |
+| `bs.out` | Default scores for output values. Format: `$.` or `$..` |
+
+---
+
+## Storages
+
+| Namespaces | Description |
+|------------|-------------|
+| `bs:ctx` | Fast contextual storage. Keys: `x`, `y`, `z` for numeric values (store) and `_` for other data. |
+| `bs:const` | Stores constant data. Path format: `.` |
+| `bs:data` | General-purpose global storage. Path format: `.` |
+| `bs:in` | Input data storage. Path format: `..` |
+| `bs:out` | Output data storage. Path format: `.` or `..` |
+
+---
+
+## Blocks
+
+These commands can be used at load time to create blocks that can be used anywhere. These blocks must be kept in loaded chunks (`-30000000 1600`).
+
+```mcfunction
+# Block for manipulating loots
+setblock -30000000 0 1606 minecraft:decorated_pot
+
+# Command block for system time (command block output)
+setblock -30000000 0 1605 minecraft:repeating_command_block[facing=up]{auto:1b,Command:"help me",TrackOutput:1}
+```
+
+---
+
+## Entities
+
+Global entities are summoned with specific UUIDs, ensuring they remain accessible and avoid selector conflicts. They must persist in always-loaded chunks (`-30000000 1600`) at the end of each tick. The UUID `B5-0-0-0-0` is reserved for temporary contextual entities that must not persist beyond the current tick.
+
+```{code-block} mcfunction
+:force:
+# Marker for position, arithmetic, and various utilities
+execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
+
+# Text display entity for interpreting text or computing transformations
+execute unless entity B5-0-0-0-2 run summon minecraft:text_display -30000000 0 1600 {UUID:[I;181,0,0,2],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],view_range:0f,alignment:"center"}
+
+# Item display entity for manipulating loots or computing transformations
+execute unless entity B5-0-0-0-3 run summon minecraft:item_display -30000000 0 1600 {UUID:[I;181,0,0,3],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],view_range:0f,alignment:"center"}
+```
diff --git a/docs/contribute/special-functions.md b/docs/contribute/special-functions.md
index e35826e9e2..6af9811643 100644
--- a/docs/contribute/special-functions.md
+++ b/docs/contribute/special-functions.md
@@ -1,30 +1,24 @@
----
-html_theme.sidebar_secondary.remove: true
----
-
-# 🌟 Special functions
+# 🌟 Special Functions
Some functions follow specific conventions to streamline functionality and ensure consistency across modules.
---
-## 👉 The "ata" functions
+## 👉 The "ata" Functions
This is a reduction of "as to at". Several functions require 2 positions to work (example: retrieve the distance between 2 points) or an entity and a position. To simplify the use, no need to pass 3 scores for each position. You will be able to place an entity on point 1 (if it is useful), then execute the function at point 2 while executing it as the entity on point 1.
---
-## 🔒 The "reserved" functions
+## 🔒 The "reserved" Functions
-Reserved functions are special functions within each module that serve predefined purposes. They must all have a function tag (without "__") and are located at the root of each module.
+Reserved functions are special functions within each module that serve predefined purposes. They are located at the root of each module.
:::{list-table}
* - `__help__`
- - This function provides a path to the documentation for the module. **(Must be present in every module)**
+ - This function provides a path to the documentation for the module. **(Automatically generated)**
* - `__load__`
- This function is executed when the module is loaded. **(Must be present in every module)**
* - `__unload__`
- This function is executed when the module is unloaded. **(Must be present in every module)**
-* - `__tick__`
- - This function is executed every tick.
:::
diff --git a/docs/contribute/tree-structure.md b/docs/contribute/tree-structure.md
index 167614f669..6f494c40d7 100644
--- a/docs/contribute/tree-structure.md
+++ b/docs/contribute/tree-structure.md
@@ -2,68 +2,58 @@
html_theme.sidebar_secondary.remove: true
---
-# 🌳 Tree structure
+# 🌳 Tree Structure
Bookshelf respects a certain tree structure which can be similar to Java packages, called "modules" in this project. The added features must therefore be positioned in these various modules according to their usefulness.
---
-**Module requirements:**
+:::::{grid} 1 2 2 2
+::::{grid-item}
+:columns: 12 6 6 7
-- Each module must declare a metadata file as detailed in the [metadata page](project:metadata.md).
+**Module Requirements:**
-- Each module should be responsible for loading and unloading itself. This includes redefining objectives, constants, and any other necessary elements.
+- Each module must include a `module.json`, as described in the [metadata page](project:metadata.md).
-- Each module should have a help function tag, a load function tag (responsible for loading the module and its dependencies) and an unload function tag.
+- Each module must also include a `pack.png` and a `README.md`.
-- Each module's load and unload function tags should be referenced as optional in `#minecraft:load` and `#minecraft:unload` respectively.
+- The `__load__` and `__unload__` functions are required to manage the module's loading and unloading. This includes resetting objectives, storages, and any other necessary elements.
-- The load function tag for each module must start by unloading all other modules using `#minecraft:unload`. After that, it should load the module and its dependencies. Weak dependencies can be specified with `"required"`: false. For example, in the health module:
- ```json
- {
- "values": [
- "#minecraft:unload",
- "bs.health:__load__",
- {
- "id": "#bs.log:load",
- "required": false
- }
- ]
- }
- ```
-**Feature requirements:**
+**Feature Requirements:**
-- Each feature function should have its own function tag.
+- Each feature function should have a dedicated function tag that declares metadata, as detailed in the [metadata page](project:metadata.md).
-- A feature is equal to a unique utility, so we should not hesitate to decompose its features in order to make it more readable and to promote reusability.
-
-In addition to these few constraints, the Bookshelf contributor is free to organise their files as they wishes as long as it remains coherent, understandable and it respects the global structure detailed below:
+- Each feature should declares metadata, as detailed in the [metadata page](project:metadata.md).
-```
-📁data
- ├─ 📁
- | ├─ 📁 .metadata
- | | └─ 📄 module.json
- │ ├─ 📁 function
- │ │ ├─ 📁
- │ │ │ ├─ 📄 .mcfunction
- │ │ │ └─ 📄 ...
- │ │ ├─ 📄 .mcfunction
- │ │ ├─ 📄 __load__.mcfunction
- │ │ ├─ 📄 __unload__.mcfunction
- │ ├─ 📁
- │ │ ├─ 📁
- │ │ │ ├─ 📄 .json
- │ │ │ └─ 📄 ...
- │ │ ├─ 📄 .json
- │ └─ 📁 tags
- │ └─ 📁 function
- │ ├─ 📄 .json
- │ └─ 📄 ...
- └─ 📁 ...
-```
+- A feature is equal to a unique utility, so we should not hesitate to decompose its features in order to make it more readable and to promote reusability.
-:::{note}
- Functions, predicates, structures, loot tables etc. must respect the same structure.
+In addition to these few constraints, contributors are free to organize their files as they wish as long as it remains coherent and it respects the global structure.
+::::
+::::{grid-item}
+:columns: 12 6 6 5
+
+:::{treeview}
+- {mcdir}`folder` modules
+ - {mcdir}`folder` \
+ - {mcdir}`folder` data/\
+ - {mcdir}`folder` function
+ - {mcdir}`folder` \
+ - {mcdir}`mcfunction` ...
+ - {mcdir}`mcfunction` \.mcfunction
+ - {mcdir}`mcfunction` \_\_load\_\_.mcfunction
+ - {mcdir}`mcfunction` \_\_unload\_\_.mcfunction
+ - {mcdir}`folder` \
+ - {mcdir}`json` \.json
+ - {mcdir}`json` ...
+ - {mcdir}`folder` tags/function
+ - {mcdir}`json` \.json
+ - {mcdir}`json` ...
+ - {mcdir}`json` module.json
+ - {mcdir}`image` pack.png
+ - {mcdir}`file` README\.md
+ - {mcdir}`folder` ...
:::
+::::
+:::::
diff --git a/docs/faq.md b/docs/faq.md
index b859930e81..5790479b61 100644
--- a/docs/faq.md
+++ b/docs/faq.md
@@ -28,7 +28,7 @@ Bookshelf prioritizes accessibility and versatility. While this may occasionally
## What about copyrights?
-Bookshelf is licensed to allow you to use and modify it for personal use and distribute maps or datapacks that use Bookshelf without any issues, as long as you share any modification made to the original source code. For that, we chose the [MPL 2.0](https://github.com/Gunivers/Bookshelf/blob/master/LICENSE) (Mozila Public License 2.0).
+Bookshelf is licensed to allow you to use and modify it for personal use and distribute maps or datapacks that use Bookshelf without any issues, as long as you share any modification made to the original source code. For that, we chose the [MPL 2.0](https://github.com/mcbookshelf/Bookshelf/blob/master/LICENSE) (Mozila Public License 2.0).
```{button-link} https://discord.gg/MkXytNjmBt
:color: primary
diff --git a/docs/index.md b/docs/index.md
index a6a9c59728..5c32a0d260 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -21,7 +21,7 @@ sd_hide_title: true
## 🕵️♂️ What is Bookshelf?
-Bookshelf (formerly known as Gunivers Libs) is a user-friendly modular library datapack, crafted to assist mapmakers in effortlessly implementing intricate systems within their maps.
+Bookshelf (formerly known as Gunivers Libs) is a modular library datapack designed to simplify complex systems in Minecraft maps. Ideal for mapmakers looking for easy-to-implement tools.
::::{grid} 2
@@ -52,7 +52,7 @@ Bookshelf (formerly known as Gunivers Libs) is a user-friendly modular library d
---
-### 🌟 Featured modules
+### 🌟 Featured Modules
```{include} _templates/featured-modules.md
```
@@ -61,11 +61,11 @@ Bookshelf (formerly known as Gunivers Libs) is a user-friendly modular library d
## 🔥 Motivation
-As developers, we recognize the importance of using libraries to save time and avoid reinventing the wheel. Unfortunately, we've noticed that mapmakers within the Minecraft community are often unfamiliar with this concept.
+As developers, we understand the value of libraries: they save time, streamline workflows, and eliminate the need to reinvent the wheel. However, we’ve noticed that many mapmakers in the Minecraft community are less familiar with this concept.
-That's why we started this project, to introduce a variety of reusable tools and try to convice mapmakers to embrace the use of libraries.
+That’s why we started this project, to provide a variety of reusable tools and encourage mapmakers to embrace the use of libraries.
-While we strive to keep these modules as much optimized and accurate as possible, our main goal is to offer a wide range of features and provide tools that are both easy to use and install. Therefore, we will always prioritize accessibility above everything else.
+While we strive to keep our modules as optimized as possible, our top priority is accessibility. We focus on creating features that are easy to use and simple to install, ensuring they’re practical for everyone.
```{epigraph}
"I have seen further than others because I have stood on the shoulders of giants."
@@ -75,9 +75,9 @@ While we strive to keep these modules as much optimized and accurate as possible
## 🤝 Contribution
-If you have any doubts related to the project or want to discuss something, then join [our Discord](https://discord.gg/MkXytNjmBt) server.
+If you have any doubts related to the project or want to discuss something, join [our Discord](https://discord.gg/MkXytNjmBt) server.
-If you want to contribute, please refer to the [contribution docs](https://bookshelf.docs.gunivers.net/en/latest/contribute/index.html) for more information.
+If you want to contribute, please refer to the [contribution docs](https://docs.mcbookshelf.dev/en/latest/contribute/index.html) for more information.
```{toctree}
:hidden:
diff --git a/docs/make.bat b/docs/make.bat
deleted file mode 100755
index 954237b9b9..0000000000
--- a/docs/make.bat
+++ /dev/null
@@ -1,35 +0,0 @@
-@ECHO OFF
-
-pushd %~dp0
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
- set SPHINXBUILD=sphinx-build
-)
-set SOURCEDIR=.
-set BUILDDIR=_build
-
-%SPHINXBUILD% >NUL 2>NUL
-if errorlevel 9009 (
- echo.
- echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
- echo.installed, then set the SPHINXBUILD environment variable to point
- echo.to the full path of the 'sphinx-build' executable. Alternatively you
- echo.may add the Sphinx directory to PATH.
- echo.
- echo.If you don't have Sphinx installed, grab it from
- echo.https://www.sphinx-doc.org/
- exit /b 1
-)
-
-if "%1" == "" goto help
-
-%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-goto end
-
-:help
-%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-
-:end
-popd
diff --git a/docs/modules.md b/docs/modules.md
index c50f9e80dd..515ee04811 100644
--- a/docs/modules.md
+++ b/docs/modules.md
@@ -8,7 +8,7 @@ Bookshelf is designed with modularity in mind. Features that serve a common purp
---
-## 🌟 Featured modules
+## 🌟 Featured Modules
```{include} _templates/featured-modules.md
```
@@ -17,10 +17,10 @@ Bookshelf is designed with modularity in mind. Features that serve a common purp
:hidden:
:caption: Base modules
-modules/biome
modules/bitwise
modules/block
modules/color
+modules/environment
modules/generate
modules/health
modules/hitbox
@@ -38,7 +38,6 @@ modules/time
modules/tree
modules/vector
modules/view
-modules/weather
modules/xp
```
diff --git a/docs/modules/biome.md b/docs/modules/biome.md
deleted file mode 100644
index 15b64f5383..0000000000
--- a/docs/modules/biome.md
+++ /dev/null
@@ -1,130 +0,0 @@
-# ⛰️ Biome
-
-**`#bs.biome:help`**
-
-Comprehensive information and tools related to biome properties.
-
-```{image} /_imgs/modules/biome.png
-:align: center
-:class: dark_light p-2
-```
-
-```{epigraph}
-"The most dangerous worldview is the worldview of those have not viewed the world."
-
--- Alexander von Humboldt
-```
-
----
-
-## 🔧 Functions
-
-You can find below all functions available in this module.
-
----
-
-
-### Get biome
-
-```{function} #bs.biome:get_biome
-
-Get biome data at the execution position of the function.
-
-:Inputs:
- **Execution `at ` or `positioned `**: Position from which you want to get biome data.
-
-:Outputs:
- **Storage `bs:out biome`**:
- :::{treeview}
- - {nbt}`compound` Biome data
- - {nbt}`string` **type**: String representation of the id (e.g., `minecraft:plains`).
- - {nbt}`double` **temperature**: The base temperature of the biome.
- - {nbt}`bool` **has_precipitation**: Whether the biome has precipitation or not.
- :::
-```
-
-*Get biome data at the current location:*
-
-```mcfunction
-# Once
-function #bs.biome:get_biome
-data get storage bs:out biome
-```
-
-> **Credits**: Aksiome
-
----
-
-### Get temperature
-
-```{function} #bs.biome:get_temperature {scale:}
-
-Get the temperature at the execution position of the function taking the altitude into account.
-
-:Inputs:
- **Execution `at ` or `positioned `**: Position from which you want to get the temperature.
-
- **Function macro**:
- :::{treeview}
- - {nbt}`compound` Arguments
- - {nbt}`number` **scale**: Scalar for the function's output.
- :::
-
-:Outputs:
- **Return | Score `$biome.get_base_temperature bs.out`**: Temperature at a given position.
-```
-
-*Get the temperature at the current altitude:*
-
-```mcfunction
-# Once
-function #bs.biome:get_temperature {scale:1000}
-```
-
-> **Credits**: Aksiome, theogiraudet
-
----
-
-## 👁️ Predicates
-
-You can find below all predicates available in this module.
-
----
-
-### Can it rain?
-
-**`bs.biome:can_rain`**
-
-Determine if it can rain or not.
-
-> **Credits**: Aksiome
-
----
-
-### Can it snow?
-
-**`bs.biome:can_snow`**
-
-Determine if it can snow or not.
-
-> **Credits**: Aksiome
-
----
-
-### Can it rain or snow?
-
-**`bs.biome:has_precipitation`**
-
-Determine if the biome has precipitation or not.
-
-> **Credits**: Aksiome
-
----
-
-
diff --git a/docs/modules/bitwise.md b/docs/modules/bitwise.md
index dee40115eb..5d18841de2 100644
--- a/docs/modules/bitwise.md
+++ b/docs/modules/bitwise.md
@@ -28,7 +28,7 @@ You can find below all functions available in this module.
---
-### Bit count
+### Bit Count
```{function} #bs.bitwise:bit_count
@@ -55,7 +55,7 @@ tellraw @a [{"text":"Number of bits for 12 = ","color":"#e0c7ff"},{"score":{"nam
---
-### Bit length
+### Bit Length
```{function} #bs.bitwise:bit_length
@@ -109,7 +109,7 @@ tellraw @a [{"text":"Two's complement of -12 = ","color":"#e0c7ff"},{"score":{"n
---
-### Logical operators
+### Logical Operators
::::{tab-set}
:::{tab-item} And
diff --git a/docs/modules/block.md b/docs/modules/block.md
index 0c7d4c7687..dd5a5456c9 100644
--- a/docs/modules/block.md
+++ b/docs/modules/block.md
@@ -10,7 +10,7 @@ Manage blocks, including states and NBTs, while offering advanced tools for seam
-- Louis Kahn
```
-```{admonition} Virtual block format
+```{admonition} Virtual Block Format
:class: info
To manipulate blocks and their states, Bookshelf utilizes a [virtual block format](#get) stored in the block output. It's crucial not to update it manually; instead, utilize the helper functions provided in the library.
@@ -233,7 +233,7 @@ data get storage bs:out block
::::
:::::
-```{admonition} Read-only output
+```{admonition} Read-only Output
:class: warning
The `bs:out block` output is intended to be read-only. Modifying parts manually could lead to potential bugs. That's why the module provides numerous functions capable of making modifications to the output while preserving its integrity.
@@ -243,7 +243,7 @@ The `bs:out block` output is intended to be read-only. Modifying parts manually
---
-### Manage state
+### Manage State
:::::{tab-set}
::::{tab-item} Keep
@@ -431,7 +431,7 @@ data get storage bs:out block.block
---
-### Manage type
+### Manage Type
:::::{tab-set}
::::{tab-item} Replace
@@ -473,7 +473,8 @@ data get storage bs:out block.block
Swap related block types while ensuring coherent replacements within the defined mapping registry. A mapping registry is defined as follows:
-```mcfunction
+```{code-block} mcfunction
+:force:
data modify storage bs:const block.mapping_registry.bs.colors set value [ \
{ set: "wool", attrs: ["red"], type: "minecraft:red_wool" }, \
{ set: "wool", attrs: ["green"], type: "minecraft:green_wool" }, \
@@ -530,7 +531,8 @@ This function may sometimes behave unpredictably due to the arbitrary nature of
Mix block types while ensuring coherent replacements within the defined mapping registry. A mapping registry is defined as follows:
-```mcfunction
+```{code-block} mcfunction
+:force:
data modify storage bs:const block.mapping_registry.bs.colors set value [ \
{ set: "cube", attrs: ["stone"], type: "minecraft:stone" }, \
{ set: "cube", attrs: ["brick"], type: "minecraft:bricks" }, \
@@ -577,7 +579,7 @@ data get storage bs:out block.block
```
::::
-::::{tab-item} Lookup item
+::::{tab-item} Lookup Item
```{function} #bs.block:lookup_item {item:}
@@ -609,7 +611,7 @@ Minecraft does not perfectly map between blocks and items. Some items may corres
```
::::
-::::{tab-item} Lookup type
+::::{tab-item} Lookup Type
```{function} #bs.block:lookup_type {type:}
@@ -749,7 +751,7 @@ execute positioned 0 0 0 run function #bs.block:set_type
### Produce
:::::{tab-set}
-::::{tab-item} Block display
+::::{tab-item} Block Display
```{function} #bs.block:spawn_block_display
@@ -784,7 +786,7 @@ function #bs.block:spawn_block_display
```
::::
-::::{tab-item} Falling block
+::::{tab-item} Falling Block
```{function} #bs.block:spawn_falling_block
@@ -819,7 +821,7 @@ function #bs.block:spawn_falling_block
```
::::
-::::{tab-item} Solid block display
+::::{tab-item} Solid Block Display
```{function} #bs.block:spawn_solid_block_display
@@ -854,7 +856,7 @@ function #bs.block:spawn_solid_block_display
```
::::
-::::{tab-item} Block particle
+::::{tab-item} Block Particle
```{function} #bs.block:emit_block_particle
@@ -898,7 +900,8 @@ function #bs.block:emit_block_particle
---
-## 🎓 Custom mapping registry
+(custom-mapping-registry)=
+## 🎓 Custom Mapping Registry
This module allows you to create a personalized mapping registry tailored to your specific needs.
@@ -906,7 +909,8 @@ This module allows you to create a personalized mapping registry tailored to you
To create a new registry, you need to define an array within the `bs:const block.mapping_registry` storage. Each new registry should be namespaced, and each element must include `set`, `attrs`, and `type`. Here’s how you can define a new mapping registry:
-```mcfunction
+```{code-block} mcfunction
+:force:
data modify storage bs:const block.mapping_registry.. [
{ set: "cube", attrs: ["oak"], type: "minecraft:oak_planks" }, \
{ set: "cube", attrs: ["spruce"], type: "minecraft:spruce_planks" }, \
diff --git a/docs/modules/color.md b/docs/modules/color.md
index 550ff2c1ee..600f0cd348 100644
--- a/docs/modules/color.md
+++ b/docs/modules/color.md
@@ -15,7 +15,7 @@ Facilitate color conversion between various formats.
-- Henri Matisse
```
-```{admonition} Minecraft color format
+```{admonition} Minecraft Color Format
:class: info
The internal color format for Minecraft is decimal. This module facilitates the conversion between this integer (decimal) format and other commonly used formats.
@@ -29,10 +29,10 @@ You can find below all functions available in this module.
---
-### Convert to hexadecimal
+### Convert to Hexadecimal
:::::{tab-set}
-::::{tab-item} RGB to hexadecimal
+::::{tab-item} RGB to Hexadecimal
```{function} #bs.color:rgb_to_hex {color:[]}
@@ -60,7 +60,7 @@ data get storage bs:out color.rgb_to_hex
```
::::
-::::{tab-item} Integer to hexadecimal
+::::{tab-item} Integer to Hexadecimal
```{function} #bs.color:int_to_hex {color:}
@@ -94,10 +94,10 @@ data get storage bs:out color.int_to_hex
---
-### Convert to integer
+### Convert to Integer
:::::{tab-set}
-::::{tab-item} Hexadecimal to integer
+::::{tab-item} Hexadecimal to Integer
```{function} #bs.color:hex_to_int {color:}
@@ -127,7 +127,7 @@ execute as @e[type=minecraft:zombie,sort=nearest,limit=1] store result entity @s
```
::::
-::::{tab-item} RGB to integer
+::::{tab-item} RGB to Integer
```{function} #bs.color:rgb_to_int {color:[]}
@@ -239,4 +239,3 @@ data get storage bs:out color.int_to_rgb
Feel free to leave your questions and feedbacks below!
-
diff --git a/docs/modules/dump.md b/docs/modules/dump.md
index 63da8ed744..a2fb931026 100644
--- a/docs/modules/dump.md
+++ b/docs/modules/dump.md
@@ -12,7 +12,7 @@ You can find below all functions available in this module.
---
-### Dump var
+### Dump Var
```{function} #bs.dump:var {var:}
@@ -29,7 +29,8 @@ Dump the content of given variables to the chat.
```
*View position scores as an array:*
-```mcfunction
+```{code-block} mcfunction
+:force:
function #bs.position:get_pos {scale:1}
function #bs.dump:var {var: ["@s bs.pos.x", "@s bs.pos.y", "@s bs.pos.z"]}
```
diff --git a/docs/modules/environment.md b/docs/modules/environment.md
new file mode 100644
index 0000000000..8c13dbcfbb
--- /dev/null
+++ b/docs/modules/environment.md
@@ -0,0 +1,150 @@
+# ⛰️ Environment
+
+**`#bs.environment:help`**
+
+Comprehensive information and tools related to weather and biome properties.
+
+```{image} /_imgs/modules/environment.png
+:align: center
+:class: dark_light p-2
+```
+
+```{epigraph}
+"The most dangerous worldview is the worldview of those have not viewed the world."
+
+-- Alexander von Humboldt
+```
+
+---
+
+## 🔧 Functions
+
+You can find below all functions available in this module.
+
+---
+
+
+### Get Biome
+
+```{function} #bs.environment:get_biome
+
+Get biome data at the execution position of the function.
+
+:Inputs:
+ **Execution `at ` or `positioned `**: Position from which you want to get biome data.
+
+:Outputs:
+ **Storage `bs:out environment.get_biome`**:
+ :::{treeview}
+ - {nbt}`compound` Biome data
+ - {nbt}`string` **type**: String representation of the id (e.g., `minecraft:plains`).
+ - {nbt}`double` **temperature**: The base temperature of the biome.
+ - {nbt}`bool` **has_precipitation**: Whether the biome has precipitation or not.
+ :::
+```
+
+*Get biome data at the current location:*
+
+```mcfunction
+# Once
+function #bs.environment:get_biome
+data get storage bs:out environment.get_biome
+```
+
+> **Credits**: Aksiome
+
+---
+
+### Get Temperature
+
+```{function} #bs.environment:get_temperature {scale:}
+
+Get the temperature at the execution position of the function taking the altitude into account.
+
+:Inputs:
+ **Execution `at ` or `positioned `**: Position from which you want to get the temperature.
+
+ **Function macro**:
+ :::{treeview}
+ - {nbt}`compound` Arguments
+ - {nbt}`number` **scale**: Scalar for the function's output.
+ :::
+
+:Outputs:
+ **Return | Score `$environment.get_temperature bs.out`**: Temperature at a given position.
+```
+
+*Get the temperature at the current altitude:*
+
+```mcfunction
+# Once
+function #bs.environment:get_temperature {scale:1000}
+```
+
+> **Credits**: Aksiome, theogiraudet
+
+---
+
+## 👁️ Predicates
+
+You can find below all predicates available in this module.
+
+---
+
+### Can It Rain?
+
+**`bs.environment:can_rain`**
+
+Determine if it can rain or not.
+
+> **Credits**: Aksiome
+
+---
+
+### Can It Snow?
+
+**`bs.environment:can_snow`**
+
+Determine if it can snow or not.
+
+> **Credits**: Aksiome
+
+---
+
+### Can It Rain or Snow?
+
+**`bs.environment:has_precipitation`**
+
+Determine if the biome has precipitation or not.
+
+> **Credits**: Aksiome
+
+---
+
+### Is It Raining?
+
+**`bs.environment:is_raining`**
+
+Determine if it is raining or not.
+
+> **Credits**: Aksiome, theogiraudet
+
+---
+
+### Is It Thundering?
+
+**`bs.environment:is_thundering`**
+
+Determine if it is thundering or not.
+
+> **Credits**: Aksiome, theogiraudet
+
+---
+
+
diff --git a/docs/modules/generate.md b/docs/modules/generate.md
index aa1f985deb..690f91162f 100644
--- a/docs/modules/generate.md
+++ b/docs/modules/generate.md
@@ -20,6 +20,14 @@ Generate diverse terrains and landscapes, incorporating natural features.
-- Anonymous
```
+```{button-link} https://youtu.be/uDenmF9l8a4
+:color: primary
+:align: center
+:shadow:
+
+{octicon}`device-camera-video` Watch a demo
+```
+
---
## 🔧 Functions
@@ -59,7 +67,7 @@ Generates a shape in 2D space at the specified origin, with the callback execute
```
::::
-::::{tab-item} Simplex shape 2D
+::::{tab-item} Simplex Shape 2D
```{function} #bs.generate:simplex_shape_2d
@@ -90,7 +98,7 @@ Generates a shape in 2D space using a Simplex noise algorithm. The shape is gene
```
::::
-::::{tab-item} Fractal shape 2D
+::::{tab-item} Fractal Shape 2D
```{function} #bs.generate:fractal_shape_2d
@@ -128,15 +136,16 @@ Generates a shape in 2D space using a Fractal noise algorithm. The shape is gene
*Generate a 3D terrain using a heightmap. This function employs a linear approach; for more interesting terrain, consider scaling the noise values differently according to various ranges. Check out [this video](https://www.youtube.com/watch?v=CSa5O6knuwI) for more insights on terrain generation:*
-```mcfunction
+```{code-block} mcfunction
+:force:
# Once
-function #bs.generate:fractal_shape_2d {width:64,height:64,run:"function bs.generate:shape_2d/demo/heightmap/heightmap",with:{}}
+function #bs.generate:fractal_shape_2d {width:64,height:64,run:"function mypack:generate",with:{}}
-# bs.generate:shape_2d/demo/heightmap/heightmaps
+# mypack:generate
execute store result storage bs:ctx y int .01 run scoreboard players add $random.fractal_noise_2d bs.out 1000
-function bs.generate:shape_2d/demo/heightmap/run with storage bs:ctx
+function mypack:fill with storage bs:ctx
-# bs.generate:shape_2d/demo/heightmap/run
+# mypack:fill
$fill ~ ~ ~ ~ ~$(y) ~ stone
```
diff --git a/docs/modules/health.md b/docs/modules/health.md
index 44f0135929..2f3c789729 100644
--- a/docs/modules/health.md
+++ b/docs/modules/health.md
@@ -52,7 +52,7 @@ Add or remove health points from players.
function #bs.health:add_health {points:5.0}
```
-```{admonition} How to remove
+```{admonition} How to remove?
:class: tip
You can use negative numbers to remove health points from the player.
@@ -84,7 +84,7 @@ Add or remove maximum health points from players.
function #bs.health:add_max_health {points:5.0}
```
-```{admonition} How to remove
+```{admonition} How to remove?
:class: tip
You can use negative numbers to remove max health from the player.
@@ -219,7 +219,7 @@ function #bs.health:set_max_health {points:5.0}
---
-### Time to live
+### Time to Live
```{function} #bs.health:time_to_live {with:{}}
diff --git a/docs/modules/hitbox.md b/docs/modules/hitbox.md
index e5ac56d386..5bf84654cf 100644
--- a/docs/modules/hitbox.md
+++ b/docs/modules/hitbox.md
@@ -87,10 +87,10 @@ Static entities, such as paintings and item frames, do not provide height and wi
---
-### Is entity inside
+### Is Entity Inside
:::::{tab-set}
-::::{tab-item} Entity in block
+::::{tab-item} Entity in Block
```{function} #bs.hitbox:is_entity_in_block
@@ -119,7 +119,7 @@ execute summon minecraft:cow if function #bs.hitbox:is_entity_in_block run say I
```
::::
-::::{tab-item} Entity in blocks
+::::{tab-item} Entity in Blocks
```{function} #bs.hitbox:is_entity_in_blocks
diff --git a/docs/modules/id.md b/docs/modules/id.md
index 286d0154d4..c9e57d91c1 100644
--- a/docs/modules/id.md
+++ b/docs/modules/id.md
@@ -18,7 +18,7 @@ You can find below all functions available in this module.
---
-### Give simple unique ID
+### Give Simple Unique ID
```{function} #bs.id:give_suid
@@ -44,7 +44,7 @@ scoreboard objective setdisplay sidebar bs.id
---
-### Give chain unique ID
+### Give Chain Unique ID
```{function} #bs.id:give_cuid
@@ -57,7 +57,7 @@ Give a unique `bs.cid` score to each entity.
**Score `@s bs.cid`**: Generated chain unique id.
```
-```{admonition} How it works
+```{admonition} How it works?
:class: info
The chain ID is similar to the simple ID. However with chain IDs, you can use the function `#bs.id:update_cuids` to make sure there are no gaps in the ID sequence, thus creating a continuous chain.
@@ -76,7 +76,7 @@ scoreboard objective setdisplay sidebar bs.cid
---
-### Update chain unique ID
+### Update Chain Unique ID
```{function} #bs.id:update_cuids
@@ -102,7 +102,7 @@ You can find below all predicates available in this module.
---
-### Check simple unique ID
+### Check Simple Unique ID
::::{tab-set}
:::{tab-item} Has
@@ -200,7 +200,7 @@ execute as @e[predicate=bs.id:suid_match,limit=1] run say In range
---
-### Check chain unique ID
+### Check Chain Unique ID
::::{tab-set}
:::{tab-item} Has
diff --git a/docs/modules/interaction.md b/docs/modules/interaction.md
index 2365d4ee58..150861ed12 100644
--- a/docs/modules/interaction.md
+++ b/docs/modules/interaction.md
@@ -21,7 +21,7 @@ You can find below all functions available in this API.
---
-### Clear events
+### Clear Events
```{function} #bs.interaction:clear_events
@@ -60,10 +60,10 @@ execute as @n[tag=bs.entity.interaction] run function #bs.interaction:clear_even
---
-### On event
+### On Event
:::::{tab-set}
-::::{tab-item} Left click
+::::{tab-item} Left Click
```{function} #bs.interaction:on_left_click
@@ -88,7 +88,7 @@ Each interaction can respond to multiple events.
**State**: The interaction will trigger the event when left clicked.
```
::::
-::::{tab-item} Right click
+::::{tab-item} Right Click
```{function} #bs.interaction:on_right_click
@@ -138,7 +138,7 @@ Each interaction can respond to multiple events.
**State**: The interaction will trigger the event continuously while hovered over.
```
::::
-::::{tab-item} Enter hover
+::::{tab-item} Enter Hover
```{function} #bs.interaction:on_hover_enter
@@ -163,7 +163,7 @@ Each interaction can respond to multiple events.
**State**: The interaction will trigger the event once upon hover entry.
```
::::
-::::{tab-item} Leave hover
+::::{tab-item} Leave Hover
```{function} #bs.interaction:on_hover_leave
@@ -189,7 +189,7 @@ Each interaction can respond to multiple events.
```
-```{admonition} Edge case
+```{admonition} Edge Case
:class: warning
If a player logs out while hovering over the interaction, the hover leave event will trigger on the executor. If the executor is the player, the event won’t be triggered again when they log back in. Be sure to account for this edge case and handle it appropriately when the player returns.
@@ -214,7 +214,7 @@ execute as @n[tag=bs.entity.interaction] run function #bs.interaction:on_hover_l
---
-### Predefined callbacks
+### Predefined Callbacks
:::::{tab-set}
::::{tab-item} Glow
@@ -244,17 +244,17 @@ You can find below all tags available in this API.
---
-### Listen a specific event?
+### Listen to a Specific Event?
:::::{tab-set}
-::::{tab-item} Right click
+::::{tab-item} Right Click
**`bs.interaction.listen_right_click`**
Determine if the current interaction listen to right click interaction.
::::
-::::{tab-item} Left click
+::::{tab-item} Left Click
**`bs.interaction.listen_left_click`**
@@ -266,13 +266,13 @@ Determine if the current interaction listen to left click interaction.
Determine if the current interaction listen to hover interaction.
::::
-::::{tab-item} Enter hover
+::::{tab-item} Enter Hover
**`bs.interaction.listen_hover_enter`**
Determine if the current interaction listen to enter hover interaction.
::::
-::::{tab-item} Leave hover
+::::{tab-item} Leave Hover
**`bs.interaction.listen_hover_leave`**
@@ -284,7 +284,7 @@ Determine if the current interaction listen to leave hover interaction.
---
-### Is source?
+### Is Source?
**`bs.interaction.source`**
@@ -295,7 +295,7 @@ Determine if the current entity is the source of the event.
---
-### Is target?
+### Is Target?
**`bs.interaction.target`**
diff --git a/docs/modules/link.md b/docs/modules/link.md
index a2c519902a..6a00516d63 100644
--- a/docs/modules/link.md
+++ b/docs/modules/link.md
@@ -16,7 +16,7 @@ Construct coherent entity structures by linking entities' positions and rotation
```
```{important}
-This module limits the world size to 2,147,480 to prevent scoreboard overflow.
+This module uses scaled integers and can overflow when coordinates are higher than 2,000,000.
```
---
@@ -27,7 +27,7 @@ You can find below all functions available in this module.
---
-### Create link
+### Create Link
```{function} #bs.link:create_link_ata
@@ -60,7 +60,7 @@ You should generally avoid changing output scores, as they serve as parameters f
---
-### Imitate behaviors
+### Imitate Behaviors
::::{tab-set}
:::{tab-item} Pos & Rot
@@ -143,7 +143,7 @@ execute as @e[predicate=bs.link:has_link] run function #bs.link:imitate_rot
```
:::
-:::{tab-item} Single axis
+:::{tab-item} Single Axis
```{function} #bs.link:imitate_pos_[x|y|z]
@@ -173,7 +173,7 @@ execute as @e[predicate=bs.link:has_link] run function #bs.link:imitate_pos_z
```
:::
-:::{tab-item} Single angle
+:::{tab-item} Single Angle
```{function} #bs.link:imitate_rot_[h|v]
@@ -211,7 +211,7 @@ While chaining behavior functions is possible, it's not advisable because it inv
---
-### Keep local position
+### Keep Local Position
```{function} #bs.link:keep_local_pos
@@ -236,7 +236,7 @@ execute as @e[type=armor_stand] run function #bs.link:create_link_ata
execute as @e[predicate=bs.link:has_link] run function #bs.link:keep_local_pos
```
-```{admonition} Local position... 🥶 What's this?
+```{admonition} Local Position... 🥶 What's this?
:class: dropdown
Unlike relative coordinates, this reference frame considers the entity's rotation. Therefore, when the parent entity rotates, the child entity rotates around it. For those familiar with Minecraft commands, local coordinates are available through the `^` symbol.
@@ -246,7 +246,7 @@ Unlike relative coordinates, this reference frame considers the entity's rotatio
---
-### Mirror plane
+### Mirror Plane
```{function} #bs.link:mirror_[x|z]_plane
@@ -279,7 +279,7 @@ execute as @e[predicate=bs.link:has_link] run function #bs.link:mirror_z_plane
---
-### Mirror point
+### Mirror Point
```{function} #bs.link:mirror_point_ata
@@ -311,7 +311,7 @@ execute as @e[predicate=bs.link:has_link] positioned 0 0 0 run function #bs.link
### Relationships
::::{tab-set}
-:::{tab-item} As children
+:::{tab-item} As Children
```{function} #bs.link:as_children {run:}
@@ -333,7 +333,7 @@ function #bs.link:as_children {run:"say Hello World"}
```
:::
-:::{tab-item} As parent
+:::{tab-item} As Parent
```{function} #bs.link:as_children {run:}
@@ -355,7 +355,7 @@ execute as @n[type=armor_stand] run function #bs.link:as_parent {run:"say Hello
```
:::
-:::{tab-item} At children
+:::{tab-item} At Children
```{function} #bs.link:as_children {run:}
@@ -377,7 +377,7 @@ function #bs.link:at_children {run:"summon lightning_bolt"}
```
:::
-:::{tab-item} At parent
+:::{tab-item} At Parent
```{function} #bs.link:as_children {run:}
@@ -405,7 +405,7 @@ execute as @n[type=armor_stand] run function #bs.link:at_parent {run:"summon lig
---
-### Remove link
+### Remove Link
```{function} #bs.link:remove_link
@@ -429,7 +429,7 @@ execute as @n[type=armor_stand] run function #bs.link:remove_link
---
-### Reverse behaviors
+### Reverse Behaviors
::::{tab-set}
:::{tab-item} Pos & Rot
@@ -512,7 +512,7 @@ execute as @e[predicate=bs.link:has_link] run function #bs.link:reverse_rot
```
:::
-:::{tab-item} Single axis
+:::{tab-item} Single Axis
```{function} #bs.link:reverse_pos_[x|y|z]
@@ -542,7 +542,7 @@ execute as @e[predicate=bs.link:has_link] run function #bs.link:reverse_pos_z
```
:::
-:::{tab-item} Single angle
+:::{tab-item} Single Angle
```{function} #bs.link:reverse_rot_[h|v]
@@ -580,7 +580,7 @@ While chaining behavior functions is possible, it's not advisable because it inv
---
-### Update link
+### Update Link
```{function} #bs.link:update_link
@@ -616,7 +616,7 @@ You can find below all predicates available in this module.
---
-### Has link
+### Has Link
**`bs.link:has_link`**
@@ -626,7 +626,7 @@ Determine if an entity has a `bs.link.to` score.
---
-### Link equal
+### Link Equal
```{function} bs.link:link_equal
@@ -647,7 +647,7 @@ execute as @n[predicate=bs.link:link_equal] run say I'm the one
---
(custom-behaviors)=
-## 🎓 Custom behaviors
+## 🎓 Custom Behaviors
This module allows you to combine multiple behaviors to create your very own optimized custom one.
diff --git a/docs/modules/log.md b/docs/modules/log.md
index 007b502f28..e564e9ed24 100644
--- a/docs/modules/log.md
+++ b/docs/modules/log.md
@@ -4,7 +4,7 @@
Log messages in the chat with varying levels of severity.
-```{admonition} Enable command blocks
+```{admonition} Enable Command Blocks
:class: warning
This module uses a command block to get the system time. For the time to be displayed as intended, be sure that `enable-command-block` is set to `true` in you `server.properties` file and that the `sendCommandFeedback` gamerule is enabled.
@@ -18,7 +18,7 @@ You can find below all functions available in this module.
---
-### Log messages
+### Log Messages
:::::{tab-set}
::::{tab-item} Error
@@ -123,10 +123,10 @@ function #bs.log:debug { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", me
---
-### Log history
+### Log History
:::::{tab-set}
-::::{tab-item} View history
+::::{tab-item} View History
```{function} #bs.log:history {with:{}}
@@ -151,7 +151,7 @@ function #bs.log:history {with: {severity: "warn", namespace: "bs.foo", tag: "ba
```
::::
-::::{tab-item} Clear history
+::::{tab-item} Clear History
```{function} #bs.log:clear_history {with:{}}
@@ -183,7 +183,7 @@ function #bs.log:clear_history {with: {severity: "warn", namespace: "bs.foo", ta
---
(usage)=
-## 🎓 How to use?
+## 🎓 How to Use?
Different log levels are available for various types of logs:
1. **Debug**: Detailed debug information.
@@ -193,7 +193,7 @@ Different log levels are available for various types of logs:
---
-### Manage granularity
+### Manage Granularity
A significant number of logs can quickly flood the chat. To prevent this, Bookshelf's log module can be configured to display specific logs based on two parameters: the **log level**, the **tag** and the **namespace**.
@@ -211,7 +211,7 @@ Each level allows the visualization of subsequent levels. For example, if a user
---
-### Define the message
+### Define the Message
Log functions take four variables as input. The `path` of the current function that inform users of the log origin, the `tag`, the `namespace` and the `message`.
@@ -237,12 +237,13 @@ Will display the following message if the user has one of these tags: `bs.foo.lo
![](/_imgs/modules/log/example-2.png)
-### Customize the format
+### Customize the Format
Bookshelf proposes to define different log message format according to the namespace.
To add new log message formats, you have to write directly inside the storage array `bs:const log.messages`:
-```mcfunction
+```{code-block} mcfunction
+:force:
{
namespaces: [""],
format: {
@@ -276,7 +277,8 @@ Bookshelf exposes several values that can be used directly in the log messages f
A simple example to define custom log message formats for the namespace `bs.foo`:
-```mcfunction
+```{code-block} mcfunction
+:force:
data modify storage bs:const log.messages append value { \
namespaces: ["bs.foo"], \
format: { \
diff --git a/docs/modules/math.md b/docs/modules/math.md
index 85e0439cb5..ef1d622b1b 100644
--- a/docs/modules/math.md
+++ b/docs/modules/math.md
@@ -51,7 +51,7 @@ Compute the combine of 2 numbers.
**Return | Score `$math.combine bs.out`**: Result of the operation.
```
-```{admonition} Technical limitation
+```{admonition} Technical Limitation
:class: important
The value of `bs.out` is incorrect if the result is greater than 2,147,483,647 or `$math.combine.[n,k] bs.in` are not both positive.
@@ -137,7 +137,7 @@ Compute the factorial of the number.
**Return | Score `$math.factorial bs.out`**: Result of the operation.
```
-```{admonition} Technical limitation
+```{admonition} Technical Limitation
:class: important
Due to the limit of integers that can be stored in a score, the interval of `$math.factorial.n bs.in` is limited to `[0,12]`.
@@ -157,7 +157,7 @@ tellraw @a [{"text": "3! = ","color":"dark_gray"},{"score":{"name":"$math.factor
---
-### Float manipulation
+### Float Manipulation
::::{tab-set}
:::{tab-item} Frexp
@@ -215,7 +215,7 @@ data get storage bs:out math.ldexp
---
-### Greatest common denominator
+### Greatest Common Denominator
```{function} #bs.math:gcd
@@ -403,7 +403,7 @@ tellraw @a [{"text": "3.5^2.25 = ", "color": "dark_gray"},{"nbt": "math.pow", "s
---
-### Rounded division
+### Rounded Division
```{function} #bs.math:divide
@@ -432,7 +432,7 @@ tellraw @a [{"text": "9 / 5 = ", "color": "dark_gray"},{"score":{"name":"$math.d
---
-### Square root
+### Square Root
::::{tab-set}
diff --git a/docs/modules/move.md b/docs/modules/move.md
index ecf42a461b..1e8ff1bbb1 100644
--- a/docs/modules/move.md
+++ b/docs/modules/move.md
@@ -15,6 +15,14 @@ Make your entity move exactly the way you want them to!
-- Heraclitus
```
+```{button-link} https://youtu.be/V6NxxpN_hhc
+:color: primary
+:align: center
+:shadow:
+
+{octicon}`device-camera-video` Watch a demo
+```
+
---
## 🔧 Functions
@@ -23,7 +31,7 @@ You can find below all functions available in this module.
---
-### Apply velocity
+### Apply Velocity
:::::{tab-set}
::::{tab-item} Canonical
@@ -86,7 +94,8 @@ Teleport an entity by its velocity scores, using the local reference frame, whil
*Move a cube (block_display) by its velocity scores (uses an interaction as the hitbox):*
-```mcfunction
+```{code-block} mcfunction
+:force:
# Once
summon minecraft:block_display ~ ~ ~ {block_state:{Name:"stone"},teleport_duration:3,transformation:[1f,0f,0f,-0.5f,0f,1f,0f,0f,0f,0f,1f,-0.5f,0f,0f,0f,1f],Passengers:[{id:"minecraft:interaction",width:1f,height:1f}]}
scoreboard players set @e[type=minecraft:block_display] bs.vel.x 100
@@ -103,7 +112,7 @@ execute as @e[type=minecraft:block_display] run function #bs.move:apply_vel {sca
execute as @e[type=minecraft:block_display] run function #bs.move:apply_vel {scale:0.001,with:{on_collision:"#bs.move:on_collision/stick"}}
```
-```{admonition} Performance tip
+```{admonition} Performance Tip
:class: tip
Although this system doesn't set specific limits, it's important to note that performance is influenced by both the speed and size of the entity.
@@ -113,7 +122,7 @@ Although this system doesn't set specific limits, it's important to note that pe
---
-### Canonical to local
+### Canonical to Local
```{function} #bs.move:canonical_to_local
@@ -128,7 +137,7 @@ Convert a canonical velocity (using the relative reference frame) into a local v
**Scores `@s bs.vel.[x,y,z]`**: Converted velocity.
```
-```{admonition} Local velocity... 🥶 What's this?
+```{admonition} Local Velocity... 🥶 What's this?
:class: dropdown
Unlike relative velocity (canonical), this reference frame considers the entity's rotation. Therefore, when the parent entity rotates, the child entity rotates around it. For those familiar with Minecraft commands, local coordinates are available through the `^` symbol.
@@ -138,7 +147,7 @@ Unlike relative velocity (canonical), this reference frame considers the entity'
---
-### Local to canonical
+### Local to Canonical
```{function} #bs.move:local_to_canonical
@@ -153,7 +162,7 @@ Convert a local velocity (using the local reference frame) into a canonical velo
**Scores `@s bs.vel.[x,y,z]`**: Converted velocity.
```
-```{admonition} Local velocity... 🥶 What's this?
+```{admonition} Local Velocity... 🥶 What's this?
:class: dropdown
Unlike relative velocity (canonical), this reference frame considers the entity's rotation. Therefore, when the parent entity rotates, the child entity rotates around it. For those familiar with Minecraft commands, local coordinates are available through the `^` symbol.
@@ -163,7 +172,7 @@ Unlike relative velocity (canonical), this reference frame considers the entity'
---
-### Set motion
+### Set Motion
```{function} #bs.move:set_motion {scale:}
@@ -201,7 +210,7 @@ execute as @e[type=minecraft:pig] run function #bs.move:set_motion {scale:0.001}
---
-## 🎓 Custom collisions
+## 🎓 Custom Collisions
This module allows you to customize collision behaviors according to your specific needs.
@@ -220,7 +229,7 @@ By modifying the `on_collision` input key, you have the freedom to specify the f
- The entity will stop and stick to the collision surface.
:::
-### How it works?
+### How It Works?
Upon collision, you have the freedom to update both the velocity score that will be used in the next tick `@s bs.vel.[x,y,z]` and the remaining velocity `$move.vel_remaining.[x,y,z] bs.data`. Since the module will attempt to continue moving based on the remaining velocity, it's crucial to avoid introducing a race condition.
diff --git a/docs/modules/position.md b/docs/modules/position.md
index 3a639c2376..dad5434ff4 100644
--- a/docs/modules/position.md
+++ b/docs/modules/position.md
@@ -23,7 +23,7 @@ You can find below all functions available in this module.
---
-### Add position and rotation
+### Add Position and Rotation
:::::{tab-set}
::::{tab-item} x,y,z
@@ -247,7 +247,7 @@ Add position scores to the entity's coordinates and rotate it according to its r
---
-### Canonical to local
+### Canonical to Local
```{function} #bs.position:canonical_to_local
@@ -262,7 +262,7 @@ Convert a canonical position (using the relative reference frame) into a local p
**Scores `@s bs.pos.[x,y,z]`**: Converted position.
```
-```{admonition} Local position... 🥶 What's this?
+```{admonition} Local Position... 🥶 What's this?
:class: dropdown
Unlike relative position (canonical), this reference frame considers the entity's rotation. Therefore, when the parent entity rotates, the child entity rotates around it. For those familiar with Minecraft commands, local coordinates are available through the `^` symbol.
@@ -272,7 +272,7 @@ Unlike relative position (canonical), this reference frame considers the entity'
---
-### Get distance
+### Get Distance
:::::{tab-set}
::::{tab-item} Normal
@@ -306,7 +306,7 @@ execute at @e[type=sheep,limit=1,sort=nearest] run function #bs.position:get_dis
tellraw @a [{"text": "Distance: ", "color": "dark_gray"},{"score":{"name":"$position.get_distance_ata", "objective": "bs.out"}, "color": "gold"}]
```
-```{admonition} Performance tip
+```{admonition} Performance Tip
:class: tip
For several applications such as comparing distances, you can use the squared distance instead of the "normal" distance. It is a bit faster to compute.
@@ -344,7 +344,7 @@ execute at @e[type=sheep,limit=1,sort=nearest] run function #bs.position:get_dis
tellraw @a [{"text": "Distance^2: ", "color": "dark_gray"},{"score":{"name":"$position.get_distance_squared_ata", "objective": "bs.out"}, "color": "gold"}]
```
-```{admonition} Score limitation
+```{admonition} Score Limitation
:class: warning
Scores in Minecraft have a limited size similar to a signed integer variable. The latter is huge, but not unlimited and can overflow. Since this function uses powers of 2 to calculate the result, you should prefer the "normal" version (which does not rely on powers) when working over big distances.
@@ -357,7 +357,7 @@ Scores in Minecraft have a limited size similar to a signed integer variable. Th
---
-### Get position and rotation
+### Get Position and Rotation
:::::{tab-set}
::::{tab-item} x,y,z
@@ -584,7 +584,7 @@ Get the execution position and rotation of the function and store the coordinate
---
-### Get relative
+### Get Relative
:::::{tab-set}
::::{tab-item} As to at
@@ -619,7 +619,7 @@ tellraw @a [{"text": "Relative position : X=", "color": "dark_gray"},{"score":{"
```
::::
-::::{tab-item} From direction
+::::{tab-item} From Direction
```{function} #bs.position:get_relative_from_dir {scale:}
@@ -657,7 +657,7 @@ tellraw @a [{"text": "Relative position : X=", "color": "dark_gray"},{"score":{"
---
-### Local to canonical
+### Local to Canonical
```{function} #bs.position:local_to_canonical
@@ -672,7 +672,7 @@ Convert a local position (using the local reference frame) into a canonical posi
**Scores `@s bs.pos.[x,y,z]`**: Converted position.
```
-```{admonition} Local position... 🥶 What's this?
+```{admonition} Local Position... 🥶 What's this?
:class: dropdown
Unlike relative position (canonical), this reference frame considers the entity's rotation. Therefore, when the parent entity rotates, the child entity rotates around it. For those familiar with Minecraft commands, local coordinates are available through the `^` symbol.
@@ -682,7 +682,7 @@ Unlike relative position (canonical), this reference frame considers the entity'
---
-### Set position and rotation
+### Set Position and Rotation
:::::{tab-set}
::::{tab-item} x,y,z
diff --git a/docs/modules/random.md b/docs/modules/random.md
index e03bf2379e..023f1a3b0c 100644
--- a/docs/modules/random.md
+++ b/docs/modules/random.md
@@ -23,7 +23,7 @@ You can find below all functions available in this module.
---
-### Random choice
+### Random Choice
:::::{tab-set}
::::{tab-item} Choice
@@ -94,7 +94,7 @@ tellraw @a [{"text":"Value: ","color":"dark_gray"},{"nbt":"random.weighted_choic
---
-### Random distributions
+### Random Distributions
:::::{tab-set}
::::{tab-item} Uniform
@@ -251,7 +251,7 @@ A Poisson distribution produces values that tend to cluster around an average va
---
-### Noise algorithms
+### Noise Algorithms
:::::{tab-set}
::::{tab-item} Simplex Noise
@@ -321,10 +321,10 @@ function #bs.random:fractal_noise_2d
---
-### Noise matrices
+### Noise Matrices
:::::{tab-set}
-::::{tab-item} White noise 1D
+::::{tab-item} White Noise 1D
```{function} #bs.random:white_noise_mat_1d {length:,with:{}}
@@ -354,7 +354,7 @@ tellraw @a [{"text": "Noise: ", "color": "dark_gray"},{"nbt":"white_noise_mat_1d
```
::::
-::::{tab-item} White noise 2D
+::::{tab-item} White Noise 2D
```{function} #bs.random:white_noise_mat_2d {width:,height:,with:{}}
@@ -457,7 +457,7 @@ tellraw @a [{"text": "Noise: ", "color": "dark_gray"},{"nbt":"fractal_noise_mat_
:::::
::::{grid} 3
-:::{grid-item-card} White noise
+:::{grid-item-card} White Noise
:margin: 0 3 0 0
:text-align: center
@@ -465,14 +465,14 @@ tellraw @a [{"text": "Noise: ", "color": "dark_gray"},{"nbt":"fractal_noise_mat_
:::
-:::{grid-item-card} Simplex noise
+:::{grid-item-card} Simplex Noise
:margin: 0 3 0 0
:text-align: center
![](/_imgs/modules/random/simplex_noise.png)
:::
-:::{grid-item-card} Fractal noise
+:::{grid-item-card} Fractal Noise
:margin: 0 3 0 0
:text-align: center
diff --git a/docs/modules/raycast.md b/docs/modules/raycast.md
index b41632a2b0..e886924175 100644
--- a/docs/modules/raycast.md
+++ b/docs/modules/raycast.md
@@ -22,7 +22,7 @@ You can find below all functions available in this module.
---
-### Run the raycast
+### Run the Raycast
```{function} #bs.raycast:run {with:{}}
diff --git a/docs/modules/schedule.md b/docs/modules/schedule.md
index 3953aaf720..3fff6daf97 100644
--- a/docs/modules/schedule.md
+++ b/docs/modules/schedule.md
@@ -36,7 +36,7 @@ function #bs.schedule:cancel_all {with:{id:"foo"}}
```
::::
-::::{tab-item} Single one
+::::{tab-item} Single One
```{function} #bs.schedule:cancel_one {with:{}}
diff --git a/docs/modules/sidebar.md b/docs/modules/sidebar.md
index 076c84bc32..628ad0635c 100644
--- a/docs/modules/sidebar.md
+++ b/docs/modules/sidebar.md
@@ -30,7 +30,8 @@ Create and register a new sidebar.
```
*Create and display a new sidebar with left-aligned text:*
-```mcfunction
+```{code-block} mcfunction
+:force:
# Create a new sidebar
function #bs.sidebar:create { \
objective: "my_guessing_game", \
@@ -48,7 +49,8 @@ scoreboard objectives setdisplay sidebar my_guessing_game
```
*Create and display a new sidebar with right-aligned text:*
-```mcfunction
+```{code-block} mcfunction
+:force:
# Create a new sidebar
function #bs.sidebar:create { \
objective: "my_guessing_game_2", \
diff --git a/docs/modules/time.md b/docs/modules/time.md
index c9494d6abc..7896df532c 100644
--- a/docs/modules/time.md
+++ b/docs/modules/time.md
@@ -4,7 +4,7 @@
Get information about the system time effortlessly.
-```{admonition} Enable command blocks
+```{admonition} Enable Command Blocks
:class: warning
This module uses a command block to get the system time. For the time to be displayed as intended, be sure that `enable-command-block` is set to `true` in you `server.properties` file and that the `sendCommandFeedback` gamerule is enabled.
@@ -16,7 +16,7 @@ You can find below all functions available in this module.
---
-### System time
+### System Time
```{function} #bs.time:get
diff --git a/docs/modules/vector.md b/docs/modules/vector.md
index 2285840e06..2f79aed5b7 100644
--- a/docs/modules/vector.md
+++ b/docs/modules/vector.md
@@ -38,7 +38,7 @@ You can find below all functions available in this module.
---
-### Absolute max
+### Absolute Max
```{function} #bs.vector:abs_max
@@ -70,7 +70,7 @@ tellraw @a [{"text":" Max component: ","color":"dark_gray"},{"score":{"name":"$v
---
-### Absolute min
+### Absolute Min
```{function} #bs.vector:abs_min
@@ -102,7 +102,7 @@ tellraw @a [{"text":" Min component: ","color":"dark_gray"},{"score":{"name":"$v
---
-### Basis rotation 3D
+### Basis Rotation 3D
```{function} #bs.vector:basis_rot_3d {scaling:}
@@ -123,7 +123,7 @@ Get the equivalent of the vector passed in parameter in a base with a different
**Scores `$vector.basis_rot_3d.[0,1,2] bs.out`**: Vector coordinates $=(X',Y',Z')$ in the target base.
```
-```{admonition} Basis system
+```{admonition} Basis System
:class: info
This system uses the Minecraft coordinate system. Thus:
@@ -184,7 +184,7 @@ tellraw @a [{"text": "X = ", "color": "dark_gray"},{"score":{"name":"$vector.bas
---
-### Cartesian to spherical
+### Cartesian to Spherical
```{function} #bs.vector:cartesian_to_spherical {scaling:}
@@ -203,7 +203,7 @@ Convert cartesian coordinates to spherical coordinates.
**Scores `$vector.cartesian_to_spherical.[0,1,2] bs.out`**: Vector representing the spherical coordinates $=(H,V,R)$.
```
-```{admonition} Spherical coordinates
+```{admonition} Spherical Coordinates
:class: warning
This system returns non conventional [spherical coordinates](https://en.wikipedia.org/wiki/Spherical_coordinate_system).
@@ -231,7 +231,7 @@ tellraw @a [{"text":"Spherical coordinates: ","color":"dark_gray"},{"score":{"na
---
-### Cross product
+### Cross Product
```{function} #bs.vector:cross_product {scaling:}
@@ -275,7 +275,7 @@ tellraw @a [{"text":"Cross product: ","color":"dark_gray"},{"score":{"name":"$ve
---
-### Dot product
+### Dot Product
```{function} #bs.vector:dot_product {scaling:}
@@ -348,7 +348,7 @@ function #bs.vector:length
tellraw @a [{"text":" Vector length: ","color":"dark_gray"},{"score":{"name":"$vector.length","objective":"bs.out"}}]
```
-```{admonition} Performance tip
+```{admonition} Performance Tip
:class: tip
If you want to minimize the performance impact, we recomande you to use the `length_squared` function instead of this one when it's possible. In fact, computing the length of a vector requires to perform square root operation which is not a simple task for a computer, especially in Minecraft.
@@ -359,7 +359,7 @@ If you want to minimize the performance impact, we recomande you to use the `len
```
::::
-::::{tab-item} Length squared
+::::{tab-item} Length Squared
```{function} #bs.vector:length_squared {scaling:}
@@ -420,7 +420,7 @@ Normalize the vector by putting the length at the given scale while keeping prop
**Scores `$vector.normalize.[0,1,2] bs.out`**: Normalized vector components.
```
-```{admonition} Performance tip
+```{admonition} Performance Tip
:class: tip
A vector doesn’t always need to be normalized by its length. Often, the `normalize_max_component` function can be used instead. While this method doesn’t normalize the length, it simplifies some operations and enhances performance.
@@ -442,7 +442,7 @@ tellraw @a [{"text":"Normalized vector: ","color":"dark_gray"},{"score":{"name":
```
::::
-::::{tab-item} Max component
+::::{tab-item} Max Component
```{function} #bs.vector:normalize_max_component {scale:}
@@ -485,7 +485,7 @@ tellraw @a [{"text":"Normalized vector: ","color":"dark_gray"},{"score":{"name":
---
-### Spherical to cartesian
+### Spherical to Cartesian
```{function} #bs.vector:spherical_to_cartesian {scaling:}
@@ -504,7 +504,7 @@ Convert spherical coordinates to cartesian coordinates.
**Scores `$vector.spherical_to_cartesian.[0,1,2] bs.out`**: Vector representing the cartesian coordinates $=(X,Y,Z)$.
```
-```{admonition} Spherical coordinates
+```{admonition} Spherical Coordinates
:class: warning
This system uses non conventional [spherical coordinates](https://en.wikipedia.org/wiki/Spherical_coordinate_system).
diff --git a/docs/modules/view.md b/docs/modules/view.md
index 42ca70b65a..f0a0b19fec 100644
--- a/docs/modules/view.md
+++ b/docs/modules/view.md
@@ -24,7 +24,7 @@ You can find below all functions available in this module.
---
-### Aimed block
+### Aimed Block
```{function} #bs.view:at_aimed_block {run:,with:{}}
@@ -48,7 +48,7 @@ Run a command at the aligned coordinates of the block an entity is aiming at.
function #bs.view:at_aimed_block {run:"setblock ~ ~ ~ minecraft:sponge",with:{}}
```
-```{admonition} Advanced usage
+```{admonition} Advanced Usage
:class: dropdown
This system is a simplified, specific use case of the `#bs.raycast:run` function. It internally relies on it, allowing you to read its output and providing the flexibility to alter its behavior by modifying its input. [Learn more here](raycast.md)
@@ -58,7 +58,7 @@ This system is a simplified, specific use case of the `#bs.raycast:run` function
---
-### Aimed entity
+### Aimed Entity
:::::{tab-set}
::::{tab-item} As
@@ -113,13 +113,13 @@ function #bs.view:at_aimed_entity {run:"particle minecraft:heart ~ ~2 ~ 0 0 0 0
::::
:::::
-```{admonition} Advanced usage
+```{admonition} Advanced Usage
:class: dropdown
This system is a simplified, specific use case of the `#bs.raycast:run` function. It internally relies on it, allowing you to read its output and providing the flexibility to alter its behavior by modifying its input. [Learn more here](raycast.md)
```
-```{admonition} Performance tip
+```{admonition} Performance Tip
:class: tip
In Minecraft, predicates can check if a player is looking at an entity. If you only need a simple player specific check, you should consider using the [Looked entity](#looked-entity) functions.
@@ -129,7 +129,7 @@ In Minecraft, predicates can check if a player is looking at an entity. If you o
---
-### Aimed point
+### Aimed Point
```{function} #bs.view:at_aimed_point {run:,with:{}}
@@ -153,7 +153,7 @@ Run a command at the point that was hit by a raycast.
function #bs.view:at_aimed_point {run:"particle minecraft:flame ~ ~ ~ 0 0 0 0 1 force",with:{}}
```
-```{admonition} Advanced usage
+```{admonition} Advanced Usage
:class: dropdown
This system is a simplified, specific use case of the `#bs.raycast:run` function. It internally relies on it, allowing you to read its output and providing the flexibility to alter its behavior by modifying its input. [Learn more here](raycast.md)
@@ -163,7 +163,7 @@ This system is a simplified, specific use case of the `#bs.raycast:run` function
---
-### Block placement
+### Block Placement
```{function} #bs.view:at_block_placement {run:,with:{}}
@@ -187,13 +187,13 @@ Run a command at the precise coordinates where a block would align if placed, co
function #bs.view:at_block_placement {run:"setblock ~ ~ ~ minecraft:sponge"}
```
-```{admonition} Advanced usage
+```{admonition} Advanced Usage
:class: dropdown
This system is a simplified, specific use case of the `#bs.raycast:run` function. It internally relies on it, allowing you to read its output and providing the flexibility to alter its behavior by modifying its input. [Learn more here](raycast.md)
```
-```{admonition} Avoid the advancement
+```{admonition} Avoid Advancements
:class: important
This function simulates block placement but is discouraged for use with the `placed_block` advancement due to potential differences in precision compared to Minecraft. Rapid mouse movements during the same tick may also result in the wrong block being targeted.
@@ -203,7 +203,7 @@ This function simulates block placement but is discouraged for use with the `pla
---
-### Can see "as to at"
+### Can See "as to at"
```{function} #bs.view:can_see_ata {with:{}}
@@ -233,7 +233,7 @@ execute at @s as @e[distance=0.1..,sort=nearest,limit=1] store success score #su
execute if score #success bs.data matches 1 run say You're not hiding very well...
```
-```{admonition} Advanced usage
+```{admonition} Advanced Usage
:class: dropdown
This system is a simplified, specific use case of the `#bs.raycast:run` function. It internally relies on it, allowing you to read its output and providing the flexibility to alter its behavior by modifying its input. [Learn more here](raycast.md)
@@ -243,7 +243,7 @@ This system is a simplified, specific use case of the `#bs.raycast:run` function
---
-### In view "as to at"
+### In View "as to at"
```{function} #bs.view:in_view_ata {angle:}
@@ -272,7 +272,7 @@ execute as @s positioned 0 5 0 run function #bs.view:in_view_ata {angle:90}
---
-### Looked entity
+### Looked Entity
:::::{tab-set}
::::{tab-item} As
@@ -331,7 +331,7 @@ function #bs.view:at_looked_entity {run:"particle minecraft:crit ~ ~2 ~ 0 0 0 0
::::
:::::
-```{admonition} Technical limitations
+```{admonition} Technical Limitations
:class: important
As this function relies on a player specific predicate, it is exclusively designed for players. Additionally, to optimize performance, only a maximum of 255 entities are allowed to have the `bs.view.is_lookable` tag simultaneously.
diff --git a/docs/modules/weather.md b/docs/modules/weather.md
deleted file mode 100644
index 29ed04fd7b..0000000000
--- a/docs/modules/weather.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# ⛅ Weather
-
-`#bs.weather:help`
-
-Everything concerning the weather.
-
----
-
-## 👁️ Predicates
-
-You can find below all predicates available in this module.
-
----
-
-### Is it raining?
-
-**`bs.weather:is_raining`**
-
-Determine if it is raining or not.
-
-> **Credits**: Aksiome, theogiraudet
-
----
-
-### Is it thundering?
-
-**`bs.weather:is_thundering`**
-
-Determine if it is thundering or not.
-
-> **Credits**: Aksiome, theogiraudet
-
----
-
-
diff --git a/docs/modules/xp.md b/docs/modules/xp.md
index f5d02a0d26..57796cd5e7 100644
--- a/docs/modules/xp.md
+++ b/docs/modules/xp.md
@@ -79,7 +79,7 @@ function #bs.xp:add_points {points:42}
```
::::
-::::{tab-item} Progress bar
+::::{tab-item} Progress Bar
```{function} #bs.xp:add_progress {progress:}
@@ -111,7 +111,7 @@ function #bs.xp:add_progress {progress:0.25}
::::
:::::
-```{admonition} How to remove
+```{admonition} How to remove?
:class: tip
You can use negative numbers to remove experience from the player.
@@ -125,7 +125,7 @@ You can use negative numbers to remove experience from the player.
### Get
:::::{tab-set}
-::::{tab-item} Max points
+::::{tab-item} Max Points
```{function} #bs.xp:get_max_points
@@ -149,7 +149,7 @@ tellraw @a [{"text":"I need a total of "},{"score":{"name":"$xp.get_max_points",
```
::::
-::::{tab-item} Remaining points
+::::{tab-item} Remaining Points
```{function} #bs.xp:get_remaining_points
@@ -173,7 +173,7 @@ tellraw @a [{"text":"I need "},{"score":{"name":"$xp.get_remaining_points","obje
```
::::
-::::{tab-item} Total points
+::::{tab-item} Total Points
```{function} #bs.xp:get_total_points
@@ -197,7 +197,7 @@ tellraw @a [{"text":"I have "},{"score":{"name":"$xp.get_total_points","objectiv
```
::::
-::::{tab-item} Progress bar
+::::{tab-item} Progress Bar
```{function} #bs.xp:get_progress {scale:}
@@ -296,7 +296,7 @@ function #bs.xp:set_points {points:42}
```
::::
-::::{tab-item} Total points
+::::{tab-item} Total Points
```{function} #bs.xp:set_total_points {points:}
@@ -326,7 +326,7 @@ function #bs.xp:set_total_points {points:42}
```
::::
-::::{tab-item} Progress bar
+::::{tab-item} Progress Bar
```{function} #bs.xp:set_progress {progress:}
diff --git a/docs/quickstart.md b/docs/quickstart.md
index f3df1988e6..0bcbee909c 100644
--- a/docs/quickstart.md
+++ b/docs/quickstart.md
@@ -21,7 +21,7 @@ We are actively searching for web developers to create the new version of the Bo
::::
::::{tab-item} 🏷️ from release
-Bookshelf releases are available on both [Github](https://github.com/Gunivers/Bookshelf/releases) and [Modrinth](https://modrinth.com/datapack/bookshelf-library). In each release, you will find zipped datapacks. You have multiple options for installation:
+Bookshelf releases are available on both [Github](https://github.com/mcbookshelf/Bookshelf/releases) and [Modrinth](https://modrinth.com/datapack/bookshelf-library). In each release, you will find zipped datapacks. You have multiple options for installation:
📚 **Whole Datapacks:** You can download entire datapacks which includes all modules and dependencies. This is a good option if you want to explore everything Bookshelf has to offer.
@@ -36,14 +36,14 @@ If you like the project, don't hesitate to star it on Github and/or follow it on
::::
::::{tab-item} 🗃️ from source
-If you know how datapacks work, and want to handle the installation process on your own 💪😎, first familiarize yourself with the structure of the project below. Then rendez-vous on [github](https://github.com/Gunivers/Bookshelf) to download the repository, and extract only what you need!
+If you know how datapacks work, and want to handle the installation process on your own 💪😎, first familiarize yourself with the structure of the project below. Then rendez-vous on [github](https://github.com/mcbookshelf/Bookshelf) to download the repository, and extract only what you need!
Once Bookshelf is installed on your map with specific modules (rather than the entire library), the initial step is to ensure that each module can be properly loaded with all its dependencies. Verify this by calling the `#bs.:load` function for each module or check your game console for any errors.
Upon exploring the main datapack, you may notice files within the minecraft namespace. These files facilitate the autoloading of modules and the ticking of specific functions. While they are not strictly needed for Bookshelf to work, without them, you have the responsibility to manually call tick functions or reload modules.
-### 🏗️ Structural overview
+### 🏗️ Structural Overview
The Github repository includes a demo map (still a work in progress) and four datapacks:
@@ -68,14 +68,14 @@ This datapack contains code utilized by the world itself. It is not intended for
---
-## 👶 First steps
+## 👶 First Steps
:::{important}
-Bookshelf relies on persistent entities to enhance performances. Therefore, it's important not to kill all entities. Instead, you can use the command `kill @e[tag=!bs.persistent]`. [Learn more here](contribute/shared-data.md#shared-entities)
+Bookshelf relies on persistent entities to enhance performances. Therefore, it's important not to kill all entities. Instead, you can use the command `kill @e[tag=!bs.persistent]`. [Learn more here](contribute/shared-resources.md#entities)
:::
-### 📖 Good practices
+### 📖 Good Practices
Bookshelf is designed to minimize unintended side effects. However, complications can arise when multiple datapacks utilize the same one. To prevent potential issues, it’s always recommended to set inputs prior to executing a function. This holds true even though Bookshelf adheres to a strict policy of preserving inputs. By following this practice, you can ensure smoother operation and prevent unexpected behaviors.
diff --git a/docs/related.md b/docs/related.md
index 9f873c64a2..7e54a3f9d0 100644
--- a/docs/related.md
+++ b/docs/related.md
@@ -9,7 +9,7 @@ Through the three sub-pages of this related page, we want to pay tribute to diff
::::{grid} 3
-:::{grid-item-card} 📂 Projects using Bookshelf
+:::{grid-item-card} 📂 Projects Using Bookshelf
:link: related/use-bookshelf
:link-type: doc
:margin: 0 3 0 0
@@ -17,7 +17,7 @@ Through the three sub-pages of this related page, we want to pay tribute to diff
Pojects that use Bookshelf.
:::
-:::{grid-item-card} 📚 Related libraries
+:::{grid-item-card} 📚 Related Libraries
:link: related/related-libraries
:link-type: doc
:margin: 0 3 0 0
diff --git a/docs/related/guides-and-tools.md b/docs/related/guides-and-tools.md
index 74e1bbe129..fe0873df1f 100644
--- a/docs/related/guides-and-tools.md
+++ b/docs/related/guides-and-tools.md
@@ -2,13 +2,13 @@
html_theme.sidebar_secondary.remove: true
---
-# 🔧 Guides & tools
+# 🔧 Guides & Tools
Map making is an aspect of Minecraft that becomes increasingly difficult with each new version of the game.
To help beginner (and even advanced) map makers, the community provides numerous guides and tools.
This page listes some of them.
-## 📚 Guides & documentation
+## 📚 Guides & Documentation
```{include} ../_templates/map-making-guides.md
```
diff --git a/docs/related/related-libraries.md b/docs/related/related-libraries.md
index 028ab6142b..438fe5cb21 100644
--- a/docs/related/related-libraries.md
+++ b/docs/related/related-libraries.md
@@ -2,7 +2,7 @@
html_theme.sidebar_secondary.remove: true
---
-# 📚 Related libraries
+# 📚 Related Libraries
This page lists some interesting datapack libraries you can use instead of or in addition to Bookshelf.
diff --git a/docs/related/use-bookshelf.md b/docs/related/use-bookshelf.md
index 8823250b25..4bfc7c43bd 100644
--- a/docs/related/use-bookshelf.md
+++ b/docs/related/use-bookshelf.md
@@ -2,7 +2,7 @@
html_theme.sidebar_secondary.remove: true
---
-# 📁 Projects that use Bookshelf
+# 📁 Projects Using Bookshelf
Bookshelf is a project with a long history.
Starting with the name of LGDir following by Gunivers-Lib (Glib), this library was used by several projects of the Gunivers community.
diff --git a/docs/requirements.txt b/docs/requirements.txt
deleted file mode 100644
index 483aaca0de..0000000000
--- a/docs/requirements.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-sphinx
-myst-parser
-pydata-sphinx-theme
-sphinx-design
-sphinx-togglebutton
-sphinx-copybutton
-linkify-it-py
\ No newline at end of file
diff --git a/docs/special-thanks.md b/docs/special-thanks.md
index 7da127c6b4..6fad5ea94b 100644
--- a/docs/special-thanks.md
+++ b/docs/special-thanks.md
@@ -2,11 +2,11 @@
html_theme.sidebar_secondary.remove: true
---
-# ❤️ Special thanks
+# ❤️ Special Thanks
Bookshelf is a collaborative project, made possible by the dedication and contributions of numerous individuals. We extend special thanks to those who have made significant contributions to this project, without whom it would not be what it is today.
-```{button-link} https://github.com/Gunivers/Bookshelf/graphs/contributors
+```{button-link} https://github.com/mcbookshelf/Bookshelf/graphs/contributors
:color: primary
:align: center
:shadow:
diff --git a/generated/command_storage_bs.dat b/generated/command_storage_bs.dat
deleted file mode 100644
index 2eb709b5aa..0000000000
Binary files a/generated/command_storage_bs.dat and /dev/null differ
diff --git a/generated/manifest.json b/generated/manifest.json
deleted file mode 100644
index 14e56567dc..0000000000
--- a/generated/manifest.json
+++ /dev/null
@@ -1,3826 +0,0 @@
-{
- "datapacks": [
- {
- "name": "Bookshelf",
- "description": "Bookshelf - Library designed for mapmakers",
- "pack_format": 57,
- "modules": [
- {
- "name": "bs.biome",
- "display_name": "Biome",
- "description": "Comprehensive information and tools related to biome properties.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "contributors": [
- "Aksiome"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.biome",
- "features": [
- {
- "name": "get_biome",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html#get-biome",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/04/22",
- "version": "1.20.5"
- },
- "updated": {
- "date": "2024/04/22",
- "version": "1.20.5"
- }
- },
- {
- "name": "get_temperature",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html#get-temperature",
- "authors": [
- "theogiraudet"
- ],
- "contributors": [
- "Aksiome"
- ],
- "created": {
- "date": "2018/08/16",
- "version": "1.14"
- },
- "updated": {
- "date": "2024/04/22",
- "version": "1.20.5"
- }
- }
- ]
- },
- {
- "name": "bs.bitwise",
- "display_name": "Bitwise",
- "description": "A collection of various bitwise operations, providing versatile tools for manipulating binary data.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.bitwise",
- "features": [
- {
- "name": "and",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#logical-operators",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2018/02/27",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/08/22",
- "version": "23w33a"
- }
- },
- {
- "name": "bit_count",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#bit-count",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/02/27",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "bit_length",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#bit-length",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2020/09/06",
- "version": "1.16"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "not",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#logical-operators",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2018/08/27",
- "version": "1.13"
- },
- "updated": {
- "date": "2024/03/18",
- "version": "1.20.4"
- }
- },
- {
- "name": "or",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#logical-operators",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2018/02/27",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/08/22",
- "version": "23w33a"
- }
- },
- {
- "name": "two_complement",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#complement-to-2",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2020/09/06",
- "version": "1.16"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "xor",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#logical-operators",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2018/02/27",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/08/22",
- "version": "23w33a"
- }
- }
- ]
- },
- {
- "name": "bs.block",
- "display_name": "Block",
- "description": "Manage blocks, including states and NBTs, while offering advanced tools for seamless transformations.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "contributors": [
- "SBtree-bit",
- "theogiraudet"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.block",
- "features": [
- {
- "name": "emit_block_particle",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#produce",
- "authors": [
- "theogiraudet"
- ],
- "created": {
- "date": "2024/10/09",
- "version": "1.21.1"
- },
- "updated": {
- "date": "2024/10/09",
- "version": "1.21.1"
- }
- },
- {
- "name": "fill_block",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#fill",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/09/11",
- "version": "1.21"
- }
- },
- {
- "name": "fill_random",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#fill",
- "authors": [
- "Aksiome"
- ],
- "contributors": [
- "SBtree-bit"
- ],
- "created": {
- "date": "2024/06/16",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/11",
- "version": "1.21"
- }
- },
- {
- "name": "fill_type",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#fill",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/09/11",
- "version": "1.21"
- }
- },
- {
- "name": "get_block",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#get",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_type",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#get",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "keep_properties",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "lookup_item",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "lookup_type",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "map_type",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type",
- "authors": [
- "Aksiome"
- ],
- "contributors": [
- "theogiraudet"
- ],
- "created": {
- "date": "2024/05/25",
- "version": "1.20.6"
- },
- "updated": {
- "date": "2024/06/11",
- "version": "1.20.6"
- }
- },
- {
- "name": "match",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#match",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "merge_properties",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "mix_type",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type",
- "authors": [
- "Aksiome"
- ],
- "contributors": [
- "theogiraudet"
- ],
- "created": {
- "date": "2024/06/08",
- "version": "1.20.6"
- },
- "updated": {
- "date": "2024/06/11",
- "version": "1.20.6"
- }
- },
- {
- "name": "remove_properties",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "replace_properties",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "replace_type",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_block",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#set",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_type",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#set",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "shift_properties",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "spawn_block_display",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#produce",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "spawn_falling_block",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#produce",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- },
- {
- "name": "spawn_solid_block_display",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#produce",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/01/15",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/15",
- "version": "1.20.4"
- }
- }
- ]
- },
- {
- "name": "bs.color",
- "display_name": "Color",
- "description": "Facilitate color conversion between various formats.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "contributors": [
- "Aksiome"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.color",
- "features": [
- {
- "name": "hex_to_int",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html#get-biome",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/04/22",
- "version": "1.20.5"
- },
- "updated": {
- "date": "2024/04/22",
- "version": "1.20.5"
- }
- },
- {
- "name": "hex_to_rgb",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-rgb",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/20",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/20",
- "version": "1.20.4"
- }
- },
- {
- "name": "int_to_hex",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-hex",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/20",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/20",
- "version": "1.20.4"
- }
- },
- {
- "name": "int_to_rgb",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-rgb",
- "authors": [
- "theogiraudet"
- ],
- "contributors": [
- "Aksiome"
- ],
- "created": {
- "date": "2019/08/12",
- "version": "1.14"
- },
- "updated": {
- "date": "2023/10/22",
- "version": "1.20.2"
- }
- },
- {
- "name": "rgb_to_hex",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-hex",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/20",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/20",
- "version": "1.20.4"
- }
- },
- {
- "name": "rgb_to_int",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-int",
- "authors": [
- "theogiraudet"
- ],
- "contributors": [
- "Aksiome"
- ],
- "created": {
- "date": "2019/08/12",
- "version": "1.14"
- },
- "updated": {
- "date": "2023/10/22",
- "version": "1.20.2"
- }
- }
- ]
- },
- {
- "name": "bs.generate",
- "display_name": "Generate",
- "description": "Generate diverse terrains and landscapes, incorporating natural features.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html",
- "authors": [
- "Aksiome"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.generate",
- "dependencies": [
- "bs.random"
- ],
- "features": [
- {
- "name": "fractal_shape_2d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/09",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/09",
- "version": "1.21"
- }
- },
- {
- "name": "shape_2d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/09",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/09",
- "version": "1.21"
- }
- },
- {
- "name": "simplex_shape_2d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/09",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/09",
- "version": "1.21"
- }
- }
- ]
- },
- {
- "name": "bs.health",
- "display_name": "Health",
- "description": "Efficiently manage the lifecycle and vital aspects of an entity.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.health",
- "weak_dependencies": [
- "bs.log"
- ],
- "features": [
- {
- "name": "add_health",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#add-remove",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/15",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/03/19",
- "version": "1.20.4"
- }
- },
- {
- "name": "add_max_health",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#add-remove",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/15",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/03/19",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_health",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#get",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/23",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/03/19",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_max_health",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#get",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/23",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/03/19",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_health",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#set",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/15",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/03/19",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_max_health",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#set",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/15",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/03/19",
- "version": "1.20.4"
- }
- },
- {
- "name": "time_to_live",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#time-to-live",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/07/08",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/11/19",
- "version": "1.20.3"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- }
- ]
- },
- {
- "name": "bs.hitbox",
- "display_name": "Hitbox",
- "description": "Get and check the hitboxes of blocks or entities.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html",
- "authors": [
- "Aksiome"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.hitbox",
- "features": [
- {
- "name": "get_block",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#get",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/11/21",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/09/28",
- "version": "1.21"
- }
- },
- {
- "name": "get_entity",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#get",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/11/21",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/09/28",
- "version": "1.21"
- }
- },
- {
- "name": "is_entity_in_block",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-inside",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/28",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/28",
- "version": "1.21"
- }
- },
- {
- "name": "is_entity_in_blocks",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-inside",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/28",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/28",
- "version": "1.21"
- }
- },
- {
- "name": "is_in_block",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-inside",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/11/21",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/09/28",
- "version": "1.21"
- }
- },
- {
- "name": "is_in_entity",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-inside",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/11/21",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/09/28",
- "version": "1.21"
- }
- }
- ]
- },
- {
- "name": "bs.id",
- "display_name": "ID",
- "description": "Manage entity IDs, essential in scenarios like shooting games where you need to track who is targeting whom.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/id.html",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.id",
- "features": [
- {
- "name": "give_cuid",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/id.html#give-chain-unique-id",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2017/10/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/08/28",
- "version": "23w33a"
- }
- },
- {
- "name": "give_suid",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/id.html#give-simple-unique-id",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2017/10/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/08/28",
- "version": "23w33a"
- }
- },
- {
- "name": "update_cuids",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/id.html#update-chain-unique-id",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2017/10/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/08/28",
- "version": "23w33a"
- }
- }
- ]
- },
- {
- "name": "bs.interaction",
- "display_name": "Interaction",
- "description": "A low-level API to create GUI based on Interaction entity by binding events to it.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.interaction",
- "weak_dependencies": [
- "bs.log"
- ],
- "features": [
- {
- "name": "clear_events",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#clear-events",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/11/01",
- "version": "1.21.3"
- },
- "updated": {
- "date": "2024/11/01",
- "version": "1.21.3"
- }
- },
- {
- "name": "on_hover",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/03/30",
- "version": "24w13a"
- },
- "updated": {
- "date": "2024/11/01",
- "version": "1.21.3"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "on_hover_enter",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/03/30",
- "version": "24w13a"
- },
- "updated": {
- "date": "2024/11/01",
- "version": "1.21.3"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "on_hover_leave",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/03/30",
- "version": "24w13a"
- },
- "updated": {
- "date": "2024/11/01",
- "version": "1.21.3"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "on_left_click",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/03/30",
- "version": "24w13a"
- },
- "updated": {
- "date": "2024/11/01",
- "version": "1.21.3"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "on_right_click",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2024/03/30",
- "version": "24w13a"
- },
- "updated": {
- "date": "2024/11/01",
- "version": "1.21.3"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- }
- ]
- },
- {
- "name": "bs.link",
- "display_name": "Link",
- "description": "Construct coherent entity structures by linking entities’ positions and rotations.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.link",
- "dependencies": [
- "bs.id",
- "bs.position"
- ],
- "features": [
- {
- "name": "as_children",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#relationships",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/07",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/07",
- "version": "1.21"
- }
- },
- {
- "name": "as_parent",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#relationships",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/07",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/07",
- "version": "1.21"
- }
- },
- {
- "name": "at_children",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#relationships",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/07",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/07",
- "version": "1.21"
- }
- },
- {
- "name": "at_parent",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#relationships",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/07",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/07",
- "version": "1.21"
- }
- },
- {
- "name": "create_link_ata",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#create-link",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2020/05/16",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.15"
- },
- "dependencies": [
- "bs.id"
- ]
- },
- {
- "name": "imitate_pos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "imitate_pos_and_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/09/09",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "imitate_pos_x",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "imitate_pos_y",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "imitate_pos_z",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "imitate_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "imitate_rot_h",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "imitate_rot_v",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "keep_local_pos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#keep-local-position",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2019/07/13",
- "version": "1.14"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.1"
- }
- },
- {
- "name": "mirror_point_ata",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#mirror-point",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/10",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.1"
- },
- "dependencies": [
- "bs.position"
- ]
- },
- {
- "name": "mirror_x_plane",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#mirror-plane",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/10",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.1"
- }
- },
- {
- "name": "mirror_z_plane",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#mirror-plane",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/10",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.1"
- }
- },
- {
- "name": "remove_link",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#remove-link",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/07",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/07",
- "version": "1.21"
- }
- },
- {
- "name": "reverse_pos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "reverse_pos_and_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "reverse_pos_x",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "reverse_pos_y",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "reverse_pos_z",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "reverse_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "reverse_rot_h",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "reverse_rot_v",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/09/11",
- "version": "1.20.4"
- }
- },
- {
- "name": "update_link",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#update-link",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/06/29",
- "version": "1.13"
- },
- "updated": {
- "date": "2023/10/20",
- "version": "1.20.2"
- },
- "dependencies": [
- "bs.position"
- ]
- }
- ]
- },
- {
- "name": "bs.math",
- "display_name": "Math",
- "description": "The beatifull world of mathematics… in Minecraft!",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html",
- "authors": [
- "Aksiome",
- "Ethanout",
- "KubbyDev",
- "Leirof",
- "SBtree-bit",
- "Triton365",
- "theogiraudet",
- "xiaodou123"
- ],
- "contributors": [
- "Aksiome",
- "tryashtar"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.math",
- "features": [
- {
- "name": "acos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2017/09/04",
- "version": "1.12.1"
- },
- "updated": {
- "date": "2023/09/05",
- "version": "23w33a"
- }
- },
- {
- "name": "asin",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2017/08/24",
- "version": "1.12"
- },
- "updated": {
- "date": "2023/09/05",
- "version": "23w33a"
- }
- },
- {
- "name": "atan",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/10/01",
- "version": "1.13.2"
- },
- "updated": {
- "date": "2023/09/05",
- "version": "23w33a"
- }
- },
- {
- "name": "atan2",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2023/09/05",
- "version": "23w33a"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "combine",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#combine",
- "authors": [
- "Ethanout"
- ],
- "created": {
- "date": "2023/08/13",
- "version": "23w31a"
- },
- "updated": {
- "date": "2023/08/13",
- "version": "23w31a"
- }
- },
- {
- "name": "cos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#trigonometry",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/15",
- "version": "1.12"
- },
- "updated": {
- "date": "2023/08/31",
- "version": "23w33a"
- }
- },
- {
- "name": "divide",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#rounded-division",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2017/08/26",
- "version": "1.12"
- },
- "updated": {
- "date": "2023/09/01",
- "version": "23w33a"
- }
- },
- {
- "name": "exp",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#exponential",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2018/12/25",
- "version": "1.13.2"
- },
- "updated": {
- "date": "2024/01/31",
- "version": "1.20.4"
- }
- },
- {
- "name": "exp2",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#exponential",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/31",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/31",
- "version": "1.20.4"
- }
- },
- {
- "name": "factorial",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#factorial",
- "authors": [
- "Aksiome",
- "KubbyDev",
- "SBtree-bit"
- ],
- "contributors": [
- "tryashtar"
- ],
- "created": {
- "date": "2017/09/08",
- "version": "1.12.1"
- },
- "updated": {
- "date": "2023/08/31",
- "version": "23w33a"
- }
- },
- {
- "name": "frexp",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#float-manipulation",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/02",
- "version": "23w33a"
- },
- "updated": {
- "date": "2024/01/31",
- "version": "1.20.4"
- }
- },
- {
- "name": "gcd",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#greatest-common-denominator",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/10/28",
- "version": "1.12.2"
- },
- "updated": {
- "date": "2023/08/03",
- "version": "23w33a"
- }
- },
- {
- "name": "ipow",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#power",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/01/29",
- "version": "1.20.4"
- }
- },
- {
- "name": "isqrt",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#square-root",
- "authors": [
- "Ethanout",
- "Triton365",
- "xiaodou123"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2023/01/26",
- "version": "1.20.4"
- }
- },
- {
- "name": "ldexp",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#float-manipulation",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/28",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/28",
- "version": "1.20.4"
- }
- },
- {
- "name": "log",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#logarithm",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2019/01/06",
- "version": "1.13.2"
- },
- "updated": {
- "date": "2024/01/29",
- "version": "1.20.4"
- }
- },
- {
- "name": "log10",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#logarithm",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2019/01/07",
- "version": "1.13.2"
- },
- "updated": {
- "date": "2024/01/29",
- "version": "1.20.4"
- }
- },
- {
- "name": "log2",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#logarithm",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2019/01/07",
- "version": "1.13.2"
- },
- "updated": {
- "date": "2024/01/29",
- "version": "1.20.4"
- }
- },
- {
- "name": "loga",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#logarithm",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2019/01/07",
- "version": "1.13.2"
- },
- "updated": {
- "date": "2024/01/29",
- "version": "1.20.4"
- }
- },
- {
- "name": "pow",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#pow",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/30",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/01/30",
- "version": "1.20.4"
- }
- },
- {
- "name": "sin",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#trigonometry",
- "authors": [
- "Leirof"
- ],
- "contributors": [
- "Aksiome"
- ],
- "created": {
- "date": "2017/05/16",
- "version": "1.12"
- },
- "updated": {
- "date": "2023/08/31",
- "version": "23w33a"
- }
- },
- {
- "name": "sincos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#trigonometry",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/09/05",
- "version": "23w33a"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "sqrt",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#square-root",
- "authors": [
- "Aksiome",
- "Ethanout",
- "theogiraudet"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/01/28",
- "version": "1.20.4"
- }
- },
- {
- "name": "tan",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#trigonometry",
- "authors": [
- "Aksiome",
- "KubbyDev"
- ],
- "created": {
- "date": "2018/10/01",
- "version": "1.13.2"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- }
- ]
- },
- {
- "name": "bs.move",
- "display_name": "Move",
- "description": "Make your entity move exactly the way you want them to!",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.move",
- "dependencies": [
- "bs.hitbox"
- ],
- "features": [
- {
- "name": "apply_local_vel",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#apply-velocity",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/05/28",
- "version": "1.13"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- },
- {
- "name": "apply_vel",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#apply-velocity",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/05/24",
- "version": "1.13"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- },
- {
- "name": "canonical_to_local",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#canonical-to-local",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/12/25",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "local_to_canonical",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#local-to-canonical",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/12/25",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/04/19",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_motion",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#set-motion",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2019/07/10",
- "version": "1.14.3"
- },
- "updated": {
- "date": "2023/12/13",
- "version": "1.20.4"
- }
- }
- ]
- },
- {
- "name": "bs.position",
- "display_name": "Position",
- "description": "Manage entity positions and rotations using scores.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html",
- "authors": [
- "Aksiome",
- "Leirof",
- "theogiraudet"
- ],
- "contributors": [
- "Triton365"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.position",
- "features": [
- {
- "name": "add_pos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "add_pos_and_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "add_pos_x",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "add_pos_y",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "add_pos_z",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "add_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "add_rot_h",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "add_rot_v",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2024/01/22",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "canonical_to_local",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#canonical-to-local",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/20",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_distance_ata",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-distance",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "contributors": [
- "Triton365"
- ],
- "created": {
- "date": "2019/07/14",
- "version": "1.14.3"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_distance_squared_ata",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-distance",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2019/07/14",
- "version": "1.14.3"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_pos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_pos_and_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/09/09",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_pos_x",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_pos_y",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_pos_z",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_relative_ata",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-relative",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2019/07/14",
- "version": "1.14.3"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_relative_from_dir",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-relative",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/20",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-rotation",
- "authors": [
- "Aksiome",
- "Leirof",
- "theogiraudet"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_rot_h",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-rotation",
- "authors": [
- "Aksiome",
- "Leirof",
- "theogiraudet"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_rot_v",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-rotation",
- "authors": [
- "Aksiome",
- "Leirof",
- "theogiraudet"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "local_to_canonical",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#local-to-canonical",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/12/25",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/04/12",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_pos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#set-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_pos_and_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/09/09",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_pos_x",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#set-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_pos_y",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#set-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_pos_z",
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#set-position-and-rotation",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#set-rotation",
- "authors": [
- "Aksiome",
- "Leirof",
- "theogiraudet"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_rot_h",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#set-rotation",
- "authors": [
- "Aksiome",
- "Leirof",
- "theogiraudet"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_rot_v",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#set-rotation",
- "authors": [
- "Aksiome",
- "Leirof",
- "theogiraudet"
- ],
- "created": {
- "date": "2017/05/14",
- "version": "1.12"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- }
- ]
- },
- {
- "name": "bs.random",
- "display_name": "Random",
- "description": "Contains many random functions for different distributions.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html",
- "authors": [
- "Aksiome",
- "SBtree"
- ],
- "contributors": [
- "Aeldrion",
- "SBtree"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.random",
- "weak_dependencies": [
- "bs.log"
- ],
- "features": [
- {
- "name": "binomial",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions",
- "authors": [
- "SBtree"
- ],
- "contributors": [
- "Aeldrion"
- ],
- "created": {
- "date": "2024/06/15",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "choice",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-choice",
- "authors": [
- "SBtree"
- ],
- "created": {
- "date": "2024/06/17",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- }
- },
- {
- "name": "fractal_noise_2d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/08/05",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- }
- },
- {
- "name": "fractal_noise_mat_2d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/08/05",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- }
- },
- {
- "name": "geometric",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions",
- "authors": [
- "SBtree"
- ],
- "contributors": [
- "Aeldrion"
- ],
- "created": {
- "date": "2024/06/16",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "poisson",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions",
- "authors": [
- "SBtree"
- ],
- "contributors": [
- "Aeldrion"
- ],
- "created": {
- "date": "2024/06/16",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "simplex_noise_2d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
- "authors": [
- "Aksiome"
- ],
- "contributors": [
- "SBtree"
- ],
- "created": {
- "date": "2024/08/05",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- }
- },
- {
- "name": "simplex_noise_mat_2d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
- "authors": [
- "Aksiome"
- ],
- "contributors": [
- "SBtree"
- ],
- "created": {
- "date": "2024/08/05",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- }
- },
- {
- "name": "uniform",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/06/24",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/06/24",
- "version": "1.21"
- }
- },
- {
- "name": "weighted_choice",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-choice",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/04",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/04",
- "version": "1.21"
- }
- },
- {
- "name": "white_noise_mat_1d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
- "authors": [
- "Aksiome",
- "SBtree"
- ],
- "created": {
- "date": "2024/06/20",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- }
- },
- {
- "name": "white_noise_mat_2d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
- "authors": [
- "Aksiome",
- "SBtree"
- ],
- "created": {
- "date": "2024/06/20",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/08/05",
- "version": "1.21"
- }
- }
- ]
- },
- {
- "name": "bs.raycast",
- "display_name": "Raycast",
- "description": "Cast rays and see if they collide with blocks or entities.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/raycast.html",
- "authors": [
- "Aksiome"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.raycast",
- "dependencies": [
- "bs.hitbox"
- ],
- "features": [
- {
- "name": "run",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/raycast.html#run-the-raycast",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/09",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/04/02",
- "version": "1.20.4"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- }
- ]
- },
- {
- "name": "bs.schedule",
- "display_name": "Schedule",
- "description": "Enhance command scheduling with this module, providing flexibility beyond vanilla capabilities. Cancel commands and maintain execution context (entity & location).",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.schedule",
- "weak_dependencies": [
- "bs.log"
- ],
- "features": [
- {
- "name": "cancel_all",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html#cancel",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2023/09/10",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/01/20",
- "version": "1.20.4"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "cancel_one",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html#cancel",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2019/07/31",
- "version": "1.14"
- },
- "updated": {
- "date": "2024/01/20",
- "version": "1.20.4"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "clear",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html#clear",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2019/07/31",
- "version": "1.14"
- },
- "updated": {
- "date": "2024/01/20",
- "version": "1.20.4"
- }
- },
- {
- "name": "schedule",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html#schedule",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "created": {
- "date": "2019/07/31",
- "version": "1.14"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- }
- ]
- },
- {
- "name": "bs.sidebar",
- "display_name": "Sidebar",
- "description": "Create a visually appealing and dynamic sidebar using the scoreboard.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/sidebar.html",
- "authors": [
- "Aksiome"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.sidebar",
- "weak_dependencies": [
- "bs.log"
- ],
- "features": [
- {
- "name": "create",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/sidebar.html#create",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/08/18",
- "version": "23w32a"
- },
- "updated": {
- "date": "2023/12/07",
- "version": "1.20.3"
- },
- "weak_dependencies": [
- "bs.log"
- ]
- },
- {
- "name": "refresh",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/sidebar.html#refresh",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/08/18",
- "version": "23w32a"
- },
- "updated": {
- "date": "2023/12/07",
- "version": "1.20.3"
- }
- }
- ]
- },
- {
- "name": "bs.time",
- "display_name": "Time",
- "description": "Get information about the system time effortlessly.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/time.html",
- "authors": [
- "Aksiome"
- ],
- "contributors": [
- "Awhikax",
- "RedCoal"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.time",
- "features": [
- {
- "name": "get",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/time.html#system-time",
- "authors": [
- "Aksiome"
- ],
- "contributors": [
- "Awhikax",
- "RedCoal"
- ],
- "created": {
- "date": "2021/10/30",
- "version": "1.17.1"
- },
- "updated": {
- "date": "2023/08/30",
- "version": "23w33a"
- }
- }
- ]
- },
- {
- "name": "bs.tree",
- "display_name": "Tree",
- "description": "Simplicity meets utility in this bank of trees.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/tree.html",
- "authors": [],
- "module_path": "datapacks/Bookshelf/data/bs.tree",
- "features": []
- },
- {
- "name": "bs.vector",
- "display_name": "Vector",
- "description": "Vectors are fundamental and incredibly powerful tools to manage motions, forces and… well… do physics!",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html",
- "authors": [
- "Aksiome",
- "KubbyDev",
- "Leirof",
- "Majoras16"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.vector",
- "features": [
- {
- "name": "abs_max",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#absolute-max",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/02/23",
- "version": "1.19.2"
- },
- "updated": {
- "date": "2024/05/09",
- "version": "1.20.6"
- }
- },
- {
- "name": "abs_min",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#absolute-min",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/17",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/05/09",
- "version": "1.20.6"
- }
- },
- {
- "name": "basis_rot_3d",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#basis-rotation-3d",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/10/20",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "cartesian_to_spherical",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#cartesian-to-spherical",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/10/20",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "cross_product",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#cross-product",
- "authors": [
- "Aksiome",
- "Majoras16"
- ],
- "created": {
- "date": "2023/04/27",
- "version": "1.19.2"
- },
- "updated": {
- "date": "2023/10/17",
- "version": "1.20.2"
- }
- },
- {
- "name": "dot_product",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#dot-product",
- "authors": [
- "Aksiome",
- "Majoras16"
- ],
- "created": {
- "date": "2023/04/27",
- "version": "1.19.2"
- },
- "updated": {
- "date": "2023/10/17",
- "version": "1.20.2"
- }
- },
- {
- "name": "length",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#length",
- "authors": [
- "Aksiome",
- "KubbyDev",
- "Leirof"
- ],
- "created": {
- "date": "2018/04/01",
- "version": "1.19.2"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "length_squared",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#length",
- "authors": [
- "Aksiome",
- "KubbyDev",
- "Leirof"
- ],
- "created": {
- "date": "2018/04/01",
- "version": "1.19.2"
- },
- "updated": {
- "date": "2023/10/17",
- "version": "1.20.2"
- }
- },
- {
- "name": "normalize",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#normalize",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2018/02/19",
- "version": "1.19.2"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "normalize_max_component",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#length",
- "authors": [
- "Aksiome",
- "KubbyDev",
- "Leirof"
- ],
- "created": {
- "date": "2018/04/01",
- "version": "1.19.2"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "pos_from_vec",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/17",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2023/10/17",
- "version": "1.20.2"
- }
- },
- {
- "name": "rot_from_vec",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/17",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2023/10/17",
- "version": "1.20.2"
- }
- },
- {
- "name": "spherical_to_cartesian",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#spherical-to-cartesian",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/20",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2024/02/27",
- "version": "1.20.4"
- }
- },
- {
- "name": "vec_from_pos",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/17",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2023/02/17",
- "version": "1.20.2"
- }
- },
- {
- "name": "vec_from_rot",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/17",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2023/02/17",
- "version": "1.20.2"
- }
- },
- {
- "name": "vec_from_vel",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/17",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2023/02/17",
- "version": "1.20.2"
- }
- },
- {
- "name": "vel_from_vec",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/10/17",
- "version": "1.20.2"
- },
- "updated": {
- "date": "2023/02/17",
- "version": "1.20.2"
- }
- }
- ]
- },
- {
- "name": "bs.view",
- "display_name": "View",
- "description": "Execute commands based on what an entity sees.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.view",
- "dependencies": [
- "bs.hitbox",
- "bs.raycast"
- ],
- "features": [
- {
- "name": "as_aimed_entity",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#aimed-entity",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/11/30",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/03/30",
- "version": "1.20.4"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- },
- {
- "name": "as_looked_entity",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#looked-entity",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/12/06",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/03/30",
- "version": "1.20.4"
- }
- },
- {
- "name": "at_aimed_block",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#aimed-block",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/11/30",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/03/30",
- "version": "1.20.4"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- },
- {
- "name": "at_aimed_entity",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#aimed-entity",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/11/30",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/03/30",
- "version": "1.20.4"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- },
- {
- "name": "at_aimed_point",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#aimed-point",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/25",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/03/30",
- "version": "1.20.4"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- },
- {
- "name": "at_block_placement",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#block-placement",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/01/24",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/05/09",
- "version": "1.20.6"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- },
- {
- "name": "at_looked_entity",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#looked-entity",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2023/12/06",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/03/30",
- "version": "1.20.4"
- }
- },
- {
- "name": "can_see_ata",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#can-see-as-to-at",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2019/05/20",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/04/20",
- "version": "1.20.4"
- },
- "dependencies": [
- "bs.hitbox"
- ]
- },
- {
- "name": "in_view_ata",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#in-view-as-to-at",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2019/05/20",
- "version": "1.20.3"
- },
- "updated": {
- "date": "2024/04/20",
- "version": "1.20.4"
- }
- }
- ]
- },
- {
- "name": "bs.weather",
- "display_name": "Weather",
- "description": "Everything concerning the weather.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/weather.html",
- "authors": [],
- "module_path": "datapacks/Bookshelf/data/bs.weather",
- "features": []
- },
- {
- "name": "bs.xp",
- "display_name": "XP",
- "description": "Efficiently manage the experience points and levels of players.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "module_path": "datapacks/Bookshelf/data/bs.xp",
- "features": [
- {
- "name": "add_levels",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#add-remove",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2022/04/14",
- "version": "1.18.2"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "add_points",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#add-remove",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2022/04/14",
- "version": "1.18.2"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "add_progress",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#add-remove",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/08/31",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2024/03/08",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_max_points",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#get",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/08/31",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "get_progress",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#get",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2022/04/14",
- "version": "1.18.2"
- },
- "updated": {
- "date": "2024/03/08",
- "version": "1.20.4"
- }
- },
- {
- "name": "get_remaining_points",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#get",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2023/08/31",
- "version": "1.20.1"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "get_total_points",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#get",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2022/04/14",
- "version": "1.18.2"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "set_levels",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#set",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2022/04/14",
- "version": "1.18.2"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "set_points",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#set",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2022/04/14",
- "version": "1.18.2"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- },
- {
- "name": "set_progress",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#set",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2022/04/14",
- "version": "1.18.2"
- },
- "updated": {
- "date": "2024/03/08",
- "version": "1.20.4"
- }
- },
- {
- "name": "set_total_points",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#set",
- "authors": [
- "Aksiome",
- "Leirof"
- ],
- "created": {
- "date": "2022/04/14",
- "version": "1.18.2"
- },
- "updated": {
- "date": "2023/11/20",
- "version": "23w46a"
- }
- }
- ]
- }
- ]
- },
- {
- "name": "Bookshelf Dev",
- "description": "Bookshelf Development Kit - Library designed for mapmakers",
- "pack_format": 57,
- "modules": [
- {
- "name": "bs.dump",
- "display_name": "Dump",
- "description": "Dump the content of given variables to the chat.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/dump.html",
- "authors": [
- "Aksiome"
- ],
- "module_path": "datapacks/Bookshelf Dev/data/bs.dump",
- "features": [
- {
- "name": "var",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/dump.html#dump-var",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/03/02",
- "version": "1.20.4"
- },
- "updated": {
- "date": "2024/03/02",
- "version": "1.20.4"
- }
- }
- ]
- },
- {
- "name": "bs.log",
- "display_name": "Log",
- "description": "Log messages in the chat with varying levels of severity.",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html",
- "authors": [
- "Aksiome",
- "theogiraudet"
- ],
- "module_path": "datapacks/Bookshelf Dev/data/bs.log",
- "features": [
- {
- "name": "clear_history",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#history",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/06",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/06",
- "version": "1.21"
- }
- },
- {
- "name": "debug",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#debug",
- "authors": [
- "theogiraudet"
- ],
- "created": {
- "date": "2023/08/05",
- "version": "23w31a"
- },
- "updated": {
- "date": "2024/09/06",
- "version": "1.21"
- }
- },
- {
- "name": "error",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#error",
- "authors": [
- "theogiraudet"
- ],
- "created": {
- "date": "2023/08/05",
- "version": "23w31a"
- },
- "updated": {
- "date": "2024/09/06",
- "version": "1.21"
- }
- },
- {
- "name": "history",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#history",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/06",
- "version": "1.21"
- },
- "updated": {
- "date": "2024/09/06",
- "version": "1.21"
- }
- },
- {
- "name": "info",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#info",
- "authors": [
- "theogiraudet"
- ],
- "created": {
- "date": "2023/08/05",
- "version": "23w31a"
- },
- "updated": {
- "date": "2024/09/06",
- "version": "1.21"
- }
- },
- {
- "name": "warn",
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#warn",
- "authors": [
- "theogiraudet"
- ],
- "created": {
- "date": "2023/08/05",
- "version": "23w31a"
- },
- "updated": {
- "date": "2024/09/06",
- "version": "1.21"
- }
- }
- ]
- }
- ]
- }
- ]
-}
diff --git a/icon.png b/icon.png
deleted file mode 100644
index 0741e90955..0000000000
Binary files a/icon.png and /dev/null differ
diff --git a/level.dat b/level.dat
deleted file mode 100644
index 2542045d3f..0000000000
Binary files a/level.dat and /dev/null differ
diff --git a/meta/manifest.json b/meta/manifest.json
new file mode 100644
index 0000000000..99faa0dc53
--- /dev/null
+++ b/meta/manifest.json
@@ -0,0 +1,4006 @@
+{
+ "modules": [
+ {
+ "id": "bs.bitwise",
+ "name": "Bitwise",
+ "slug": "bookshelf-bitwise",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.bitwise/README.md",
+ "description": "A collection of various bitwise operations, providing versatile tools for manipulating binary data.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/bitwise.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "features": [
+ {
+ "id": "#bs.bitwise:and",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/bitwise.html#logical-operators",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2018/02/27",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/08/22",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "#bs.bitwise:bit_count",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/bitwise.html#bit-count",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.bitwise:bit_length",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/bitwise.html#bit-length",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2020/09/06",
+ "minecraft_version": "1.16"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.bitwise:not",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/bitwise.html#logical-operators",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2018/08/27",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2024/03/18",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.bitwise:or",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/bitwise.html#logical-operators",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2018/02/27",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/08/22",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "#bs.bitwise:two_complement",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/bitwise.html#complement-to-2",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2020/09/06",
+ "minecraft_version": "1.16"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.bitwise:xor",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/bitwise.html#logical-operators",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2018/02/27",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/08/22",
+ "minecraft_version": "23w33a"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.block",
+ "name": "Block",
+ "slug": "bookshelf-block",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.block/README.md",
+ "description": "Manage blocks, including states and NBTs, while offering advanced tools for seamless transformations.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "features": [
+ {
+ "id": "#bs.block:emit_block_particle",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#produce",
+ "authors": [
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/10/09",
+ "minecraft_version": "1.21.1"
+ },
+ "updated": {
+ "date": "2024/10/09",
+ "minecraft_version": "1.21.1"
+ }
+ },
+ {
+ "id": "#bs.block:fill_block",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#fill",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/09/11",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.block:fill_random",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#fill",
+ "authors": [
+ "Aksiome"
+ ],
+ "contributors": [
+ "SBtree-bit"
+ ],
+ "created": {
+ "date": "2024/06/16",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/11",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.block:fill_type",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#fill",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/09/11",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.block:get_block",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#get",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.block:get_type",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#get",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.block:keep_properties",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-state",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.block:lookup_item",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-type",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.block:lookup_type",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-type",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.block:map_type",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-type",
+ "authors": [
+ "Aksiome"
+ ],
+ "contributors": [
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/05/25",
+ "minecraft_version": "1.20.6"
+ },
+ "updated": {
+ "date": "2024/06/11",
+ "minecraft_version": "1.20.6"
+ }
+ },
+ {
+ "id": "#bs.block:match",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#match",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.block:merge_properties",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-state",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.block:mix_type",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-type",
+ "authors": [
+ "Aksiome"
+ ],
+ "contributors": [
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/06/08",
+ "minecraft_version": "1.20.6"
+ },
+ "updated": {
+ "date": "2024/06/11",
+ "minecraft_version": "1.20.6"
+ }
+ },
+ {
+ "id": "#bs.block:remove_properties",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-state",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.block:replace_properties",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-state",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.block:replace_type",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-type",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.block:set_block",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#set",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.block:set_type",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#set",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.block:shift_properties",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-state",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.block:spawn_block_display",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#produce",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.block:spawn_falling_block",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#produce",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.block:spawn_solid_block_display",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#produce",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.color",
+ "name": "Color",
+ "slug": "bookshelf-color",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.color/README.md",
+ "description": "Facilitate color conversion between various formats.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/color.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "features": [
+ {
+ "id": "#bs.color:hex_to_int",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/color.html#convert-to-int",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/04/22",
+ "minecraft_version": "1.20.5"
+ },
+ "updated": {
+ "date": "2024/04/22",
+ "minecraft_version": "1.20.5"
+ }
+ },
+ {
+ "id": "#bs.color:hex_to_rgb",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/color.html#convert-to-rgb",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/20",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/20",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.color:int_to_hex",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/color.html#convert-to-hex",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/20",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/20",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.color:int_to_rgb",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/color.html#convert-to-rgb",
+ "authors": [
+ "theogiraudet"
+ ],
+ "contributors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2019/08/12",
+ "minecraft_version": "1.14"
+ },
+ "updated": {
+ "date": "2023/10/22",
+ "minecraft_version": "1.20.2"
+ }
+ },
+ {
+ "id": "#bs.color:rgb_to_hex",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/color.html#convert-to-hex",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/20",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/20",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.color:rgb_to_int",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/color.html#convert-to-int",
+ "authors": [
+ "theogiraudet"
+ ],
+ "contributors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2019/08/12",
+ "minecraft_version": "1.14"
+ },
+ "updated": {
+ "date": "2023/10/22",
+ "minecraft_version": "1.20.2"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.dump",
+ "name": "Dump",
+ "slug": "bookshelf-dump",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.dump/README.md",
+ "description": "Dump the content of given variables to the chat.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/dump.html",
+ "kind": "data_pack",
+ "tags": [
+ "dev"
+ ],
+ "features": [
+ {
+ "id": "#bs.dump:var",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/dump.html#dump-var",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/03/02",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/03/02",
+ "minecraft_version": "1.20.4"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.environment",
+ "name": "Environment",
+ "slug": "bookshelf-environment",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.environment/README.md",
+ "description": "Comprehensive information and tools related to weather and biome properties.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/environment.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "features": [
+ {
+ "id": "#bs.environment:get_biome",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/environment.html#get-biome",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/04/22",
+ "minecraft_version": "1.20.5"
+ },
+ "updated": {
+ "date": "2024/04/22",
+ "minecraft_version": "1.20.5"
+ }
+ },
+ {
+ "id": "#bs.environment:get_temperature",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/environment.html#get-temperature",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2018/08/16",
+ "minecraft_version": "1.14"
+ },
+ "updated": {
+ "date": "2024/04/22",
+ "minecraft_version": "1.20.5"
+ }
+ },
+ {
+ "id": "bs.environment:can_rain",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/environment.html#can-it-rain",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/04/22",
+ "minecraft_version": "1.20.5"
+ },
+ "updated": {
+ "date": "2024/11/24",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ {
+ "id": "bs.environment:is_raining",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/environment.html#is-it-raining",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/04/22",
+ "minecraft_version": "1.20.5"
+ },
+ "updated": {
+ "date": "2024/11/24",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ {
+ "id": "bs.environment:is_thundering",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/environment.html#is-it-thundering",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/04/22",
+ "minecraft_version": "1.20.5"
+ },
+ "updated": {
+ "date": "2024/11/24",
+ "minecraft_version": "1.21.3"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.generate",
+ "name": "Generate",
+ "slug": "bookshelf-generate",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.generate/README.md",
+ "description": "Generate diverse terrains and landscapes, incorporating natural features.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/generate.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "dependencies": [
+ "bs.random"
+ ],
+ "features": [
+ {
+ "id": "#bs.generate:fractal_shape_2d",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/generate.html#shape-2d",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/09",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/09",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.generate:shape_2d",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/generate.html#shape-2d",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/09",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/09",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.generate:simplex_shape_2d",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/generate.html#shape-2d",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/09",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/09",
+ "minecraft_version": "1.21"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.health",
+ "name": "Health",
+ "slug": "bookshelf-health",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.health/README.md",
+ "description": "Efficiently manage the lifecycle and vital aspects of an entity.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/health.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "weak_dependencies": [
+ "bs.log"
+ ],
+ "features": [
+ {
+ "id": "#bs.health:add_health",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/health.html#add-remove",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/09/15",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2024/03/19",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.health:add_max_health",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/health.html#add-remove",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/09/15",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2024/03/19",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.health:get_health",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/health.html#get",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/10/23",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2024/03/19",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.health:get_max_health",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/health.html#get",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/10/23",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2024/03/19",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.health:set_health",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/health.html#set",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/09/15",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2024/03/19",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.health:set_max_health",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/health.html#set",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/09/15",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2024/03/19",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.health:time_to_live",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/health.html#time-to-live",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/07/08",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/11/19",
+ "minecraft_version": "1.20.3"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.hitbox",
+ "name": "Hitbox",
+ "slug": "bookshelf-hitbox",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.hitbox/README.md",
+ "description": "Get and check the hitboxes of blocks or entities.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "features": [
+ {
+ "id": "#bs.hitbox:get_block",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#get",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/11/21",
+ "minecraft_version": "1.20.3"
+ },
+ "updated": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.hitbox:get_entity",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#get",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/11/21",
+ "minecraft_version": "1.20.3"
+ },
+ "updated": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.hitbox:intangible",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#intangible",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.hitbox:intangible",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#intangible",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.hitbox:is_entity_in_block",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#is-inside",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.hitbox:is_entity_in_blocks",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#is-inside",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.hitbox:is_in_block",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#is-inside",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/11/21",
+ "minecraft_version": "1.20.3"
+ },
+ "updated": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.hitbox:is_in_entity",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#is-inside",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/11/21",
+ "minecraft_version": "1.20.3"
+ },
+ "updated": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.hitbox:is_shaped",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#is-shaped",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.hitbox:is_sized",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#is-sized",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/10/28",
+ "minecraft_version": "1.21.2"
+ },
+ "updated": {
+ "date": "2024/10/28",
+ "minecraft_version": "1.21.2"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.id",
+ "name": "ID",
+ "slug": "bookshelf-id",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.id/README.md",
+ "description": "Manage entity IDs, essential in scenarios like shooting games where you need to track who is targeting whom.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "features": [
+ {
+ "id": "#bs.id:give_cuid",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#give-chain-unique-id",
+ "authors": [
+ "Aksiome",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2017/10/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "#bs.id:give_suid",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#give-simple-unique-id",
+ "authors": [
+ "Aksiome",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2017/10/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "#bs.id:update_cuids",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#update-chain-unique-id",
+ "authors": [
+ "Aksiome",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2017/10/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "bs.id:cuid_equal",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-chain-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "bs.id:cuid_lower",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-chain-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "bs.id:cuid_match",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-chain-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "bs.id:cuid_upper",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-chain-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "bs.id:has_cuid",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-chain-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "bs.id:has_suid",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-simple-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "bs.id:suid_equal",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-simple-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "bs.id:suid_lower",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-simple-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "bs.id:suid_match",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-simple-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "bs.id:suid_upper",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-simple-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.interaction",
+ "name": "Interaction",
+ "slug": "bookshelf-interaction",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.interaction/README.md",
+ "description": "A low-level API to create GUI based on Interaction entity by binding events to it.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/interaction.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "weak_dependencies": [
+ "bs.log"
+ ],
+ "features": [
+ {
+ "id": "#bs.interaction:clear_events",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/interaction.html#clear-events",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/11/01",
+ "minecraft_version": "1.21.3"
+ },
+ "updated": {
+ "date": "2024/11/01",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ {
+ "id": "#bs.interaction:on_hover",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/interaction.html#on-event",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/03/30",
+ "minecraft_version": "24w13a"
+ },
+ "updated": {
+ "date": "2024/11/01",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ {
+ "id": "#bs.interaction:on_hover_enter",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/interaction.html#on-event",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/03/30",
+ "minecraft_version": "24w13a"
+ },
+ "updated": {
+ "date": "2024/11/01",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ {
+ "id": "#bs.interaction:on_hover_leave",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/interaction.html#on-event",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/03/30",
+ "minecraft_version": "24w13a"
+ },
+ "updated": {
+ "date": "2024/11/01",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ {
+ "id": "#bs.interaction:on_left_click",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/interaction.html#on-event",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/03/30",
+ "minecraft_version": "24w13a"
+ },
+ "updated": {
+ "date": "2024/11/01",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ {
+ "id": "#bs.interaction:on_right_click",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/interaction.html#on-event",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/03/30",
+ "minecraft_version": "24w13a"
+ },
+ "updated": {
+ "date": "2024/11/01",
+ "minecraft_version": "1.21.3"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.link",
+ "name": "Link",
+ "slug": "bookshelf-link",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.link/README.md",
+ "description": "Construct coherent entity structures by linking entities\u2019 positions and rotations.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "dependencies": [
+ "bs.id",
+ "bs.position"
+ ],
+ "features": [
+ {
+ "id": "#bs.link:as_children",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#relationships",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.link:as_parent",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#relationships",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.link:at_children",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#relationships",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.link:at_parent",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#relationships",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.link:create_link_ata",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#create-link",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2020/05/16",
+ "minecraft_version": "1.20.1"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.15"
+ }
+ },
+ {
+ "id": "#bs.link:imitate_pos",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#imitate-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.link:imitate_pos_and_rot",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#imitate-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2023/09/09",
+ "minecraft_version": "1.20.1"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.link:imitate_pos_x",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#imitate-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.link:imitate_pos_y",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#imitate-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.link:imitate_pos_z",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#imitate-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.link:imitate_rot",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#imitate-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.link:imitate_rot_h",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#imitate-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.link:imitate_rot_v",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#imitate-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.link:keep_local_pos",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#keep-local-position",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2019/07/13",
+ "minecraft_version": "1.14"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.1"
+ }
+ },
+ {
+ "id": "#bs.link:mirror_point_ata",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#mirror-point",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/09/10",
+ "minecraft_version": "1.20.1"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.1"
+ }
+ },
+ {
+ "id": "#bs.link:mirror_x_plane",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#mirror-plane",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/09/10",
+ "minecraft_version": "1.20.1"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.1"
+ }
+ },
+ {
+ "id": "#bs.link:mirror_z_plane",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#mirror-plane",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/09/10",
+ "minecraft_version": "1.20.1"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.1"
+ }
+ },
+ {
+ "id": "#bs.link:remove_link",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#remove-link",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.link:reverse_pos",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#reverse-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.link:reverse_pos_and_rot",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#reverse-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.link:reverse_pos_x",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#reverse-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.link:reverse_pos_y",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#reverse-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.link:reverse_pos_z",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#reverse-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.link:reverse_rot",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#reverse-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.link:reverse_rot_h",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#reverse-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.link:reverse_rot_v",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#reverse-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.link:update_link",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#update-link",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/10/20",
+ "minecraft_version": "1.20.2"
+ }
+ },
+ {
+ "id": "bs.link:has_link",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#has-link",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/11/07",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2023/11/07",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "bs.link:link_equal",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#link-equal",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.log",
+ "name": "Log",
+ "slug": "bookshelf-log",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.log/README.md",
+ "description": "Log messages in the chat with varying levels of severity.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/log.html",
+ "kind": "data_pack",
+ "tags": [
+ "dev"
+ ],
+ "features": [
+ {
+ "id": "#bs.log:clear_history",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/log.html#history",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/06",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/06",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.log:debug",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/log.html#debug",
+ "authors": [
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2023/08/05",
+ "minecraft_version": "23w31a"
+ },
+ "updated": {
+ "date": "2024/09/06",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.log:error",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/log.html#error",
+ "authors": [
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2023/08/05",
+ "minecraft_version": "23w31a"
+ },
+ "updated": {
+ "date": "2024/09/06",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.log:history",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/log.html#history",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/06",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/06",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.log:info",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/log.html#info",
+ "authors": [
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2023/08/05",
+ "minecraft_version": "23w31a"
+ },
+ "updated": {
+ "date": "2024/09/06",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.log:warn",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/log.html#warn",
+ "authors": [
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2023/08/05",
+ "minecraft_version": "23w31a"
+ },
+ "updated": {
+ "date": "2024/09/06",
+ "minecraft_version": "1.21"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.math",
+ "name": "Math",
+ "slug": "bookshelf-math",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.math/README.md",
+ "description": "The beatifull world of mathematics\u2026 in Minecraft!",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "features": [
+ {
+ "id": "#bs.math:acos",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#inverse-trigonometry",
+ "authors": [
+ "Aksiome",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2017/09/04",
+ "minecraft_version": "1.12.1"
+ },
+ "updated": {
+ "date": "2023/09/05",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "#bs.math:asin",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#inverse-trigonometry",
+ "authors": [
+ "Aksiome",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2017/08/24",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2023/09/05",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "#bs.math:atan",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#inverse-trigonometry",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/10/01",
+ "minecraft_version": "1.13.2"
+ },
+ "updated": {
+ "date": "2023/09/05",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "#bs.math:atan2",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#inverse-trigonometry",
+ "authors": [
+ "Aksiome",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2023/09/05",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.math:combine",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#combine",
+ "authors": [
+ "Ethanout"
+ ],
+ "created": {
+ "date": "2023/08/13",
+ "minecraft_version": "23w31a"
+ },
+ "updated": {
+ "date": "2023/08/13",
+ "minecraft_version": "23w31a"
+ }
+ },
+ {
+ "id": "#bs.math:cos",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#trigonometry",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/05/15",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2023/08/31",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "#bs.math:divide",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#rounded-division",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2017/08/26",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2023/09/01",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "#bs.math:exp",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#exponential",
+ "authors": [
+ "Aksiome",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2018/12/25",
+ "minecraft_version": "1.13.2"
+ },
+ "updated": {
+ "date": "2024/01/31",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.math:exp2",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#exponential",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/31",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/31",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.math:factorial",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#factorial",
+ "authors": [
+ "Aksiome",
+ "KubbyDev",
+ "SBtree-bit"
+ ],
+ "contributors": [
+ "tryashtar"
+ ],
+ "created": {
+ "date": "2017/09/08",
+ "minecraft_version": "1.12.1"
+ },
+ "updated": {
+ "date": "2023/08/31",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "#bs.math:frexp",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#float-manipulation",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/09/02",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2024/01/31",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.math:gcd",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#greatest-common-denominator",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/10/28",
+ "minecraft_version": "1.12.2"
+ },
+ "updated": {
+ "date": "2023/08/03",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "#bs.math:ipow",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#power",
+ "authors": [
+ "Aksiome",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/01/29",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.math:isqrt",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#square-root",
+ "authors": [
+ "Triton365",
+ "Ethanout",
+ "xiaodou123"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2023/01/26",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.math:ldexp",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#float-manipulation",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/28",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/28",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.math:log",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#logarithm",
+ "authors": [
+ "Aksiome",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2019/01/06",
+ "minecraft_version": "1.13.2"
+ },
+ "updated": {
+ "date": "2024/01/29",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.math:log10",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#logarithm",
+ "authors": [
+ "Aksiome",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2019/01/07",
+ "minecraft_version": "1.13.2"
+ },
+ "updated": {
+ "date": "2024/01/29",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.math:log2",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#logarithm",
+ "authors": [
+ "Aksiome",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2019/01/07",
+ "minecraft_version": "1.13.2"
+ },
+ "updated": {
+ "date": "2024/01/29",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.math:loga",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#logarithm",
+ "authors": [
+ "Aksiome",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2019/01/07",
+ "minecraft_version": "1.13.2"
+ },
+ "updated": {
+ "date": "2024/01/29",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.math:pow",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#pow",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/30",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/30",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.math:sin",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#trigonometry",
+ "authors": [
+ "Leirof"
+ ],
+ "contributors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2017/05/16",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2023/08/31",
+ "minecraft_version": "23w33a"
+ }
+ },
+ {
+ "id": "#bs.math:sincos",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#trigonometry",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/09/05",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.math:sqrt",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#square-root",
+ "authors": [
+ "Aksiome",
+ "Ethanout",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/01/28",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.math:tan",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#trigonometry",
+ "authors": [
+ "Aksiome",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2018/10/01",
+ "minecraft_version": "1.13.2"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.move",
+ "name": "Move",
+ "slug": "bookshelf-move",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.move/README.md",
+ "description": "Make your entity move exactly the way you want them to!",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/move.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "dependencies": [
+ "bs.hitbox"
+ ],
+ "features": [
+ {
+ "id": "#bs.move:apply_local_vel",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/move.html#apply-velocity",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/05/28",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.move:apply_vel",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/move.html#apply-velocity",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/05/24",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.move:canonical_to_local",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/move.html#canonical-to-local",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/12/25",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.move:local_to_canonical",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/move.html#local-to-canonical",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/12/25",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/04/19",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.move:set_motion",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/move.html#set-motion",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2019/07/10",
+ "minecraft_version": "1.14.3"
+ },
+ "updated": {
+ "date": "2023/12/13",
+ "minecraft_version": "1.20.4"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.position",
+ "name": "Position",
+ "slug": "bookshelf-position",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.position/README.md",
+ "description": "Manage entity positions and rotations using scores.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "features": [
+ {
+ "id": "#bs.position:add_pos",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#add-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2024/01/22",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:add_pos_and_rot",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#add-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2024/01/22",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:add_pos_x",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#add-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2024/01/22",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:add_pos_y",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#add-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2024/01/22",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:add_pos_z",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#add-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2024/01/22",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:add_rot",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#add-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2024/01/22",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:add_rot_h",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#add-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2024/01/22",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:add_rot_v",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#add-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2024/01/22",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:canonical_to_local",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#canonical-to-local",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/10/20",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:get_distance_ata",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-distance",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "contributors": [
+ "Triton365"
+ ],
+ "created": {
+ "date": "2019/07/14",
+ "minecraft_version": "1.14.3"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:get_distance_squared_ata",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-distance",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2019/07/14",
+ "minecraft_version": "1.14.3"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:get_pos",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:get_pos_and_rot",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2023/09/09",
+ "minecraft_version": "1.20.1"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:get_pos_x",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:get_pos_y",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:get_pos_z",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:get_relative_ata",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-relative",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2019/07/14",
+ "minecraft_version": "1.14.3"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:get_relative_from_dir",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-relative",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/10/20",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:get_rot",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:get_rot_h",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:get_rot_v",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:local_to_canonical",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#local-to-canonical",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/12/25",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/04/12",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:set_pos",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#set-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:set_pos_and_rot",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2023/09/09",
+ "minecraft_version": "1.20.1"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:set_pos_x",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#set-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:set_pos_y",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#set-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:set_pos_z",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#set-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:set_rot",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#set-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:set_rot_h",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#set-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.position:set_rot_v",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#set-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.random",
+ "name": "Random",
+ "slug": "bookshelf-random",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.random/README.md",
+ "description": "Contains many random functions for different distributions.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "features": [
+ {
+ "id": "#bs.random:binomial",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#random-distributions",
+ "authors": [
+ "SBtree"
+ ],
+ "contributors": [
+ "Aeldrion"
+ ],
+ "created": {
+ "date": "2024/06/15",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/08/05",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.random:choice",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#random-choice",
+ "authors": [
+ "SBtree"
+ ],
+ "created": {
+ "date": "2024/06/17",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/08/05",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.random:fractal_noise_2d",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#noise",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/08/05",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/08/05",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.random:fractal_noise_mat_2d",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#noise",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/08/05",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/08/05",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.random:geometric",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#random-distributions",
+ "authors": [
+ "SBtree"
+ ],
+ "contributors": [
+ "Aeldrion"
+ ],
+ "created": {
+ "date": "2024/06/16",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/08/05",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.random:poisson",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#random-distributions",
+ "authors": [
+ "SBtree"
+ ],
+ "contributors": [
+ "Aeldrion"
+ ],
+ "created": {
+ "date": "2024/06/16",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/08/05",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.random:simplex_noise_2d",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#noise",
+ "authors": [
+ "Aksiome"
+ ],
+ "contributors": [
+ "SBtree"
+ ],
+ "created": {
+ "date": "2024/08/05",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/08/05",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.random:simplex_noise_mat_2d",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#noise",
+ "authors": [
+ "Aksiome"
+ ],
+ "contributors": [
+ "SBtree"
+ ],
+ "created": {
+ "date": "2024/08/05",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/08/05",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.random:uniform",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#random-distributions",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/06/24",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/06/24",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.random:weighted_choice",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#random-choice",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/04",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/04",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.random:white_noise_mat_1d",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#noise",
+ "authors": [
+ "Aksiome",
+ "SBtree"
+ ],
+ "created": {
+ "date": "2024/06/20",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/08/05",
+ "minecraft_version": "1.21"
+ }
+ },
+ {
+ "id": "#bs.random:white_noise_mat_2d",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#noise",
+ "authors": [
+ "Aksiome",
+ "SBtree"
+ ],
+ "created": {
+ "date": "2024/06/20",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/08/05",
+ "minecraft_version": "1.21"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.raycast",
+ "name": "Raycast",
+ "slug": "bookshelf-raycast",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.raycast/README.md",
+ "description": "Cast rays and see if they collide with blocks or entities.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/raycast.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "dependencies": [
+ "bs.hitbox"
+ ],
+ "features": [
+ {
+ "id": "#bs.raycast:run",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/raycast.html#run-the-raycast",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/10/09",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2024/10/24",
+ "minecraft_version": "1.21.3"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.schedule",
+ "name": "Schedule",
+ "slug": "bookshelf-schedule",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.schedule/README.md",
+ "description": "Enhance command scheduling. Cancel commands and maintain execution context (entity & location).",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/schedule.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "weak_dependencies": [
+ "bs.log"
+ ],
+ "features": [
+ {
+ "id": "#bs.schedule:cancel_all",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/schedule.html#cancel",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2023/09/10",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2024/01/20",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.schedule:cancel_one",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/schedule.html#cancel",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2019/07/31",
+ "minecraft_version": "1.14"
+ },
+ "updated": {
+ "date": "2024/01/20",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.schedule:clear",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/schedule.html#clear",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2019/07/31",
+ "minecraft_version": "1.14"
+ },
+ "updated": {
+ "date": "2024/01/20",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.schedule:schedule",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/schedule.html#schedule",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2019/07/31",
+ "minecraft_version": "1.14"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.sidebar",
+ "name": "Sidebar",
+ "slug": "bookshelf-sidebar",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.sidebar/README.md",
+ "description": "Create a visually appealing and dynamic sidebar using the scoreboard.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/sidebar.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "weak_dependencies": [
+ "bs.log"
+ ],
+ "features": [
+ {
+ "id": "#bs.sidebar:create",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/sidebar.html#create",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/18",
+ "minecraft_version": "23w32a"
+ },
+ "updated": {
+ "date": "2023/12/07",
+ "minecraft_version": "1.20.3"
+ }
+ },
+ {
+ "id": "#bs.sidebar:refresh",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/sidebar.html#refresh",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/18",
+ "minecraft_version": "23w32a"
+ },
+ "updated": {
+ "date": "2023/12/07",
+ "minecraft_version": "1.20.3"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.time",
+ "name": "Time",
+ "slug": "bookshelf-time",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.time/README.md",
+ "description": "Get information about the system time effortlessly.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/time.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "features": [
+ {
+ "id": "#bs.time:get",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/time.html#system-time",
+ "authors": [
+ "Aksiome"
+ ],
+ "contributors": [
+ "Awhikax",
+ "RedCoal"
+ ],
+ "created": {
+ "date": "2021/10/30",
+ "minecraft_version": "1.17.1"
+ },
+ "updated": {
+ "date": "2023/08/30",
+ "minecraft_version": "23w33a"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.tree",
+ "name": "Tree",
+ "slug": "bookshelf-tree",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.tree/README.md",
+ "description": "Simplicity meets utility in this bank of trees.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/tree.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "features": []
+ },
+ {
+ "id": "bs.vector",
+ "name": "Vector",
+ "slug": "bookshelf-vector",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.vector/README.md",
+ "description": "Vectors are fundamental and incredibly powerful tools to manage motions, forces and\u2026 well\u2026 do physics!",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "features": [
+ {
+ "id": "#bs.vector:abs_max",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#absolute-max",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2023/02/23",
+ "minecraft_version": "1.19.2"
+ },
+ "updated": {
+ "date": "2024/05/09",
+ "minecraft_version": "1.20.6"
+ }
+ },
+ {
+ "id": "#bs.vector:abs_min",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#absolute-min",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/10/17",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2024/05/09",
+ "minecraft_version": "1.20.6"
+ }
+ },
+ {
+ "id": "#bs.vector:basis_rot_3d",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#basis-rotation-3d",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2023/10/20",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.vector:cartesian_to_spherical",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#cartesian-to-spherical",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2023/10/20",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.vector:cross_product",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#cross-product",
+ "authors": [
+ "Aksiome",
+ "Majoras16"
+ ],
+ "created": {
+ "date": "2023/04/27",
+ "minecraft_version": "1.19.2"
+ },
+ "updated": {
+ "date": "2023/10/17",
+ "minecraft_version": "1.20.2"
+ }
+ },
+ {
+ "id": "#bs.vector:dot_product",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#dot-product",
+ "authors": [
+ "Aksiome",
+ "Majoras16"
+ ],
+ "created": {
+ "date": "2023/04/27",
+ "minecraft_version": "1.19.2"
+ },
+ "updated": {
+ "date": "2023/10/17",
+ "minecraft_version": "1.20.2"
+ }
+ },
+ {
+ "id": "#bs.vector:length",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#length",
+ "authors": [
+ "Aksiome",
+ "Leirof",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2018/04/01",
+ "minecraft_version": "1.19.2"
+ },
+ "updated": {
+ "date": "2023/11/20",
+ "minecraft_version": "23w46a"
+ }
+ },
+ {
+ "id": "#bs.vector:length_squared",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#length",
+ "authors": [
+ "Aksiome",
+ "Leirof",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2018/04/01",
+ "minecraft_version": "1.19.2"
+ },
+ "updated": {
+ "date": "2023/10/17",
+ "minecraft_version": "1.20.2"
+ }
+ },
+ {
+ "id": "#bs.vector:normalize",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#normalize",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/02/19",
+ "minecraft_version": "1.19.2"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.vector:normalize_max_component",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#length",
+ "authors": [
+ "Aksiome",
+ "Leirof",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2018/04/01",
+ "minecraft_version": "1.19.2"
+ },
+ "updated": {
+ "date": "2023/11/20",
+ "minecraft_version": "23w46a"
+ }
+ },
+ {
+ "id": "#bs.vector:pos_from_vec",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#helpers",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/10/17",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2023/10/17",
+ "minecraft_version": "1.20.2"
+ }
+ },
+ {
+ "id": "#bs.vector:rot_from_vec",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#helpers",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/10/17",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2023/10/17",
+ "minecraft_version": "1.20.2"
+ }
+ },
+ {
+ "id": "#bs.vector:spherical_to_cartesian",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#spherical-to-cartesian",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/10/20",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.vector:vec_from_pos",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#helpers",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/10/17",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2023/02/17",
+ "minecraft_version": "1.20.2"
+ }
+ },
+ {
+ "id": "#bs.vector:vec_from_rot",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#helpers",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/10/17",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2023/02/17",
+ "minecraft_version": "1.20.2"
+ }
+ },
+ {
+ "id": "#bs.vector:vec_from_vel",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#helpers",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/10/17",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2023/02/17",
+ "minecraft_version": "1.20.2"
+ }
+ },
+ {
+ "id": "#bs.vector:vel_from_vec",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#helpers",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/10/17",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2023/02/17",
+ "minecraft_version": "1.20.2"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.view",
+ "name": "View",
+ "slug": "bookshelf-view",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.view/README.md",
+ "description": "Execute commands based on what an entity sees.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "dependencies": [
+ "bs.raycast"
+ ],
+ "features": [
+ {
+ "id": "#bs.view:as_aimed_entity",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#aimed-entity",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/11/30",
+ "minecraft_version": "1.20.3"
+ },
+ "updated": {
+ "date": "2024/03/30",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.view:as_looked_entity",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#looked-entity",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/12/06",
+ "minecraft_version": "1.20.3"
+ },
+ "updated": {
+ "date": "2024/03/30",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.view:at_aimed_block",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#aimed-block",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/11/30",
+ "minecraft_version": "1.20.3"
+ },
+ "updated": {
+ "date": "2024/03/30",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.view:at_aimed_entity",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#aimed-entity",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/11/30",
+ "minecraft_version": "1.20.3"
+ },
+ "updated": {
+ "date": "2024/03/30",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.view:at_aimed_point",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#aimed-point",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/25",
+ "minecraft_version": "1.20.3"
+ },
+ "updated": {
+ "date": "2024/03/30",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.view:at_block_placement",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#block-placement",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/24",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/05/09",
+ "minecraft_version": "1.20.6"
+ }
+ },
+ {
+ "id": "#bs.view:at_looked_entity",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#looked-entity",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/12/06",
+ "minecraft_version": "1.20.3"
+ },
+ "updated": {
+ "date": "2024/03/30",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.view:can_see_ata",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#can-see-as-to-at",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2019/05/20",
+ "minecraft_version": "1.20.3"
+ },
+ "updated": {
+ "date": "2024/04/20",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.view:in_view_ata",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#in-view-as-to-at",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2019/05/20",
+ "minecraft_version": "1.20.3"
+ },
+ "updated": {
+ "date": "2024/04/20",
+ "minecraft_version": "1.20.4"
+ }
+ }
+ ]
+ },
+ {
+ "id": "bs.xp",
+ "name": "XP",
+ "slug": "bookshelf-xp",
+ "readme": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/heads/master/modules/bs.xp/README.md",
+ "description": "Efficiently manage the experience points and levels of players.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html",
+ "kind": "data_pack",
+ "tags": [
+ "default"
+ ],
+ "features": [
+ {
+ "id": "#bs.xp:add_levels",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#add-remove",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2022/04/14",
+ "minecraft_version": "1.18.2"
+ },
+ "updated": {
+ "date": "2023/11/20",
+ "minecraft_version": "23w46a"
+ }
+ },
+ {
+ "id": "#bs.xp:add_points",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#add-remove",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2022/04/14",
+ "minecraft_version": "1.18.2"
+ },
+ "updated": {
+ "date": "2023/11/20",
+ "minecraft_version": "23w46a"
+ }
+ },
+ {
+ "id": "#bs.xp:add_progress",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#add-remove",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2023/08/31",
+ "minecraft_version": "1.20.1"
+ },
+ "updated": {
+ "date": "2024/03/08",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.xp:get_max_points",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#get",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2023/08/31",
+ "minecraft_version": "1.20.1"
+ },
+ "updated": {
+ "date": "2023/11/20",
+ "minecraft_version": "23w46a"
+ }
+ },
+ {
+ "id": "#bs.xp:get_progress",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#get",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2022/04/14",
+ "minecraft_version": "1.18.2"
+ },
+ "updated": {
+ "date": "2024/03/08",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.xp:get_remaining_points",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#get",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2023/08/31",
+ "minecraft_version": "1.20.1"
+ },
+ "updated": {
+ "date": "2023/11/20",
+ "minecraft_version": "23w46a"
+ }
+ },
+ {
+ "id": "#bs.xp:get_total_points",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#get",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2022/04/14",
+ "minecraft_version": "1.18.2"
+ },
+ "updated": {
+ "date": "2023/11/20",
+ "minecraft_version": "23w46a"
+ }
+ },
+ {
+ "id": "#bs.xp:set_levels",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#set",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2022/04/14",
+ "minecraft_version": "1.18.2"
+ },
+ "updated": {
+ "date": "2023/11/20",
+ "minecraft_version": "23w46a"
+ }
+ },
+ {
+ "id": "#bs.xp:set_points",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#set",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2022/04/14",
+ "minecraft_version": "1.18.2"
+ },
+ "updated": {
+ "date": "2023/11/20",
+ "minecraft_version": "23w46a"
+ }
+ },
+ {
+ "id": "#bs.xp:set_progress",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#set",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2022/04/14",
+ "minecraft_version": "1.18.2"
+ },
+ "updated": {
+ "date": "2024/03/08",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ {
+ "id": "#bs.xp:set_total_points",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#set",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2022/04/14",
+ "minecraft_version": "1.18.2"
+ },
+ "updated": {
+ "date": "2023/11/20",
+ "minecraft_version": "23w46a"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/meta/versions.json b/meta/versions.json
new file mode 100644
index 0000000000..f1c3d02d00
--- /dev/null
+++ b/meta/versions.json
@@ -0,0 +1,51 @@
+[
+ {
+ "version": "2.2.2",
+ "minecraft_versions": [
+ "1.21.2",
+ "1.21.3",
+ "1.21.4"
+ ],
+ "manifest": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/tags/v2.2.2/generated/manifest.json"
+ },
+ {
+ "version": "2.2.1",
+ "minecraft_versions": [
+ "1.21.2",
+ "1.21.3",
+ "1.21.4"
+ ],
+ "manifest": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/tags/v2.2.1/generated/manifest.json"
+ },
+ {
+ "version": "2.2.0",
+ "minecraft_versions": [
+ "1.21.2",
+ "1.21.3"
+ ],
+ "manifest": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/tags/v2.2.0/generated/manifest.json"
+ },
+ {
+ "version": "2.1.1",
+ "minecraft_versions": [
+ "1.21",
+ "1.21.1"
+ ],
+ "manifest": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/tags/v2.1.1/generated/manifest.json"
+ },
+ {
+ "version": "2.1.0",
+ "minecraft_versions": [
+ "1.21",
+ "1.21.1"
+ ],
+ "manifest": "https://raw.githubusercontent.com/mcbookshelf/Bookshelf/refs/tags/v2.1.0/generated/manifest.json"
+ },
+ {
+ "version": "2.0.0",
+ "minecraft_versions": [
+ "1.20.5",
+ "1.20.6"
+ ]
+ }
+]
diff --git a/modules/bookshelf/README.md b/modules/bookshelf/README.md
new file mode 100644
index 0000000000..94c5da211e
--- /dev/null
+++ b/modules/bookshelf/README.md
@@ -0,0 +1,14 @@
+# 📚 Bookshelf Library
+
+This datapack brings together the full suite of **Bookshelf modules**, offering a versatile toolkit for Minecraft mapmakers. It includes modules such as:
+
+- **🧱 Block**: Get and manipulate blocks (supports BlockStates and NBT).
+- **🔦 Raycast**: Cast rays and see if they collide with blocks or entities.
+- **🧮 Math**: Mathematical functions: sin, cos, exp, log, sqrt and much more!
+- **🏗️ Generate**: Generate terrains and landscapes, incorporating natural features.
+- **🎲 Random**: Random functions for different distributions and noise patterns.
+- **❤️ Health**: Easily manage the health of a player or the lifetime of an entity!
+
+*And much more...*
+
+For more details and usage examples, check out the [documentation](https://docs.mcbookshelf.dev/en/latest/index.html).
diff --git a/modules/bookshelf/module.json b/modules/bookshelf/module.json
new file mode 100644
index 0000000000..f4f6471d72
--- /dev/null
+++ b/modules/bookshelf/module.json
@@ -0,0 +1,18 @@
+{
+ "data_pack": {
+ "name": "bookshelf"
+ },
+ "meta": {
+ "name": "Library",
+ "slug": "bookshelf-library",
+ "description": "Bookshelf is a modular library datapack designed to simplify complex systems in Minecraft maps. Ideal for mapmakers looking for easy-to-implement tools.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/index.html"
+ },
+ "require": [
+ "core.plugins.setup_pack",
+ "core.plugins.setup_jinja"
+ ],
+ "pipeline": [
+ "core.plugins.bundle_packs.default"
+ ]
+}
diff --git a/modules/bookshelf/pack.png b/modules/bookshelf/pack.png
new file mode 100644
index 0000000000..ff9903d7a7
Binary files /dev/null and b/modules/bookshelf/pack.png differ
diff --git a/modules/bs.bitwise/README.md b/modules/bs.bitwise/README.md
new file mode 100644
index 0000000000..6ce1a6d7dd
--- /dev/null
+++ b/modules/bs.bitwise/README.md
@@ -0,0 +1,14 @@
+# 🖥️ Bookshelf Bitwise
+
+This datapack provides a collection of various bitwise operations, providing versatile tools for manipulating binary data.
+
+> “Binary is a very simple numbering system, but it is incredibly powerful when used correctly.”
+>
+> -- Alan Turing
+
+For more details and usage examples, check out the [documentation](https://docs.mcbookshelf.dev/en/latest/modules/bitwise.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.bitwise/data/bs.bitwise/function/__load__.mcfunction b/modules/bs.bitwise/data/bs.bitwise/function/__load__.mcfunction
new file mode 100644
index 0000000000..0fca42e118
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/function/__load__.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
+scoreboard objectives add bs.in dummy [{"text":"BS ","color":"dark_gray"},{"text":"Input","color":"aqua"}]
+
+scoreboard players set -1 bs.const -1
+scoreboard players set 2 bs.const 2
diff --git a/modules/bs.bitwise/data/bs.bitwise/function/__unload__.mcfunction b/modules/bs.bitwise/data/bs.bitwise/function/__unload__.mcfunction
new file mode 100644
index 0000000000..5affba9d95
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/function/__unload__.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard objectives remove bs.const
+scoreboard objectives remove bs.ctx
+scoreboard objectives remove bs.out
+scoreboard objectives remove bs.in
diff --git a/modules/bs.bitwise/data/bs.bitwise/function/and/and.mcfunction b/modules/bs.bitwise/data/bs.bitwise/function/and/and.mcfunction
new file mode 100644
index 0000000000..e68e76b55c
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/function/and/and.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Note:
+# - This function returns the and bitwise between two numbers.
+# - Example: -178 & 32165 = 32004
+# The result is the number composed by keeping all one at the same position in the two binary representations of these numbers.
+
+scoreboard players operation #a bs.ctx = $bitwise.and.a bs.in
+scoreboard players operation #b bs.ctx = $bitwise.and.b bs.in
+function bs.bitwise:and/compute
+return run scoreboard players operation $bitwise.and bs.out = #x bs.ctx
diff --git a/modules/bs.bitwise/data/bs.bitwise/function/and/compute.mcfunction b/modules/bs.bitwise/data/bs.bitwise/function/and/compute.mcfunction
new file mode 100644
index 0000000000..780264879b
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/function/and/compute.mcfunction
@@ -0,0 +1,110 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set #x bs.ctx 0
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players set #x bs.ctx -2147483648
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 1073741824
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 536870912
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 268435456
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 134217728
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 67108864
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 33554432
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 16777216
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 8388608
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 4194304
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 2097152
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 1048576
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 524288
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 262144
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 131072
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 65536
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 32768
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 16384
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 8192
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 4096
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 2048
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 1024
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 512
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 256
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 128
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 64
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 32
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 16
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 8
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 4
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 2
+scoreboard players operation #a bs.ctx *= 2 bs.const
+scoreboard players operation #b bs.ctx *= 2 bs.const
+execute if score #a bs.ctx matches ..-1 if score #b bs.ctx matches ..-1 run scoreboard players add #x bs.ctx 1
diff --git a/modules/bs.bitwise/data/bs.bitwise/function/bit_count.mcfunction b/modules/bs.bitwise/data/bs.bitwise/function/bit_count.mcfunction
new file mode 100644
index 0000000000..6b91a5a6b8
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/function/bit_count.mcfunction
@@ -0,0 +1,81 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $bitwise.bit_count bs.out 0
+scoreboard players operation #n bs.ctx = $bitwise.bit_count.n bs.in
+execute if score #n bs.ctx matches ..-1 run scoreboard players operation #n bs.ctx *= -1 bs.const
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+scoreboard players operation #n bs.ctx *= 2 bs.const
+execute if score #n bs.ctx matches ..-1 run scoreboard players add $bitwise.bit_count bs.out 1
+return run scoreboard players get $bitwise.bit_count bs.out
diff --git a/modules/bs.bitwise/data/bs.bitwise/function/bit_length/bit_length.mcfunction b/modules/bs.bitwise/data/bs.bitwise/function/bit_length/bit_length.mcfunction
new file mode 100644
index 0000000000..6829f5df06
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/function/bit_length/bit_length.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Note:
+# - This function returns the number of bits needed to represent a number
+# - Example: a = 1451, (a)2 = 0b10110101011, |(a)2| = 11
+
+scoreboard players operation #n bs.ctx = $bitwise.bit_length.n bs.in
+execute if score #n bs.ctx matches ..-1 run scoreboard players operation #n bs.ctx *= -1 bs.const
+execute if score #n bs.ctx matches 0..127 run return run function bs.bitwise:bit_length/group_1
+execute if score #n bs.ctx matches 128..32767 run return run function bs.bitwise:bit_length/group_2
+execute if score #n bs.ctx matches 32768..8388607 run return run function bs.bitwise:bit_length/group_3
+execute if score #n bs.ctx matches 8388608..2147483647 run return run function bs.bitwise:bit_length/group_4
diff --git a/datapacks/Bookshelf/data/bs.bitwise/function/bit_length/group_1.mcfunction b/modules/bs.bitwise/data/bs.bitwise/function/bit_length/group_1.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.bitwise/function/bit_length/group_1.mcfunction
rename to modules/bs.bitwise/data/bs.bitwise/function/bit_length/group_1.mcfunction
index ba215f41d8..1acbab3492 100644
--- a/datapacks/Bookshelf/data/bs.bitwise/function/bit_length/group_1.mcfunction
+++ b/modules/bs.bitwise/data/bs.bitwise/function/bit_length/group_1.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.bitwise/function/bit_length/group_2.mcfunction b/modules/bs.bitwise/data/bs.bitwise/function/bit_length/group_2.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.bitwise/function/bit_length/group_2.mcfunction
rename to modules/bs.bitwise/data/bs.bitwise/function/bit_length/group_2.mcfunction
index dd14c53a2d..c89c607390 100644
--- a/datapacks/Bookshelf/data/bs.bitwise/function/bit_length/group_2.mcfunction
+++ b/modules/bs.bitwise/data/bs.bitwise/function/bit_length/group_2.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.bitwise/function/bit_length/group_3.mcfunction b/modules/bs.bitwise/data/bs.bitwise/function/bit_length/group_3.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.bitwise/function/bit_length/group_3.mcfunction
rename to modules/bs.bitwise/data/bs.bitwise/function/bit_length/group_3.mcfunction
index 884ea363be..21a11b278f 100644
--- a/datapacks/Bookshelf/data/bs.bitwise/function/bit_length/group_3.mcfunction
+++ b/modules/bs.bitwise/data/bs.bitwise/function/bit_length/group_3.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.bitwise/function/bit_length/group_4.mcfunction b/modules/bs.bitwise/data/bs.bitwise/function/bit_length/group_4.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.bitwise/function/bit_length/group_4.mcfunction
rename to modules/bs.bitwise/data/bs.bitwise/function/bit_length/group_4.mcfunction
index 4276a158c7..e2f53a7fe9 100644
--- a/datapacks/Bookshelf/data/bs.bitwise/function/bit_length/group_4.mcfunction
+++ b/modules/bs.bitwise/data/bs.bitwise/function/bit_length/group_4.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.bitwise/data/bs.bitwise/function/not.mcfunction b/modules/bs.bitwise/data/bs.bitwise/function/not.mcfunction
new file mode 100644
index 0000000000..bfb3284a31
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/function/not.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Note: This function returns the bit negation of a number
+
+scoreboard players operation $bitwise.not bs.out = $bitwise.not.n bs.in
+scoreboard players operation $bitwise.not bs.out *= -1 bs.const
+
+return run scoreboard players remove $bitwise.not bs.out 1
diff --git a/modules/bs.bitwise/data/bs.bitwise/function/or.mcfunction b/modules/bs.bitwise/data/bs.bitwise/function/or.mcfunction
new file mode 100644
index 0000000000..93664aae2d
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/function/or.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Note:
+# - This function returns the or bitwise between two numbers.
+# - Example: -178 | 32165 = -17
+# - Formula: a | b = (a + b) - (a & b)
+# The result is the number composed by keeping all one in the two binary representations of these numbers.
+
+scoreboard players operation #a bs.ctx = $bitwise.or.a bs.in
+execute store result score $bitwise.or bs.out run scoreboard players operation #b bs.ctx = $bitwise.or.b bs.in
+scoreboard players operation $bitwise.or bs.out += $bitwise.or.a bs.in
+function bs.bitwise:and/compute
+return run scoreboard players operation $bitwise.or bs.out -= #x bs.ctx
diff --git a/modules/bs.bitwise/data/bs.bitwise/function/two_complement.mcfunction b/modules/bs.bitwise/data/bs.bitwise/function/two_complement.mcfunction
new file mode 100644
index 0000000000..abb134d1b0
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/function/two_complement.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Note:
+# - This function returns the two's complement of a number
+# - Example: -1 -> 2147483647
+# -417 -> 2147483231
+# Two's complement allows to represent a negative number like a positive number by remplacing this number by its complement.
+# The two's complement is obtained by inverted all bits of the binary representation of the number, and add one to this.
+# An other way to compute this: 2^n - abs(x) where n is the number of bit wanted to represent the binary number of the complement.
+# In Minecraft, numbers are stored in a integer type (4 bytes), i.e. a 2^n of 2^31 - 1. In this case, we need to take 2^32 to include
+# all numbers but 2^32 can't be store in an integer, so we modify a bit the operation for: (2^n - 1) - abs(x) + 1.
+
+scoreboard players operation $bitwise.two_complement bs.out = $bitwise.two_complement.n bs.in
+execute if score $bitwise.two_complement bs.out matches 1.. run return run scoreboard players get $bitwise.two_complement bs.out
+scoreboard players add $bitwise.two_complement bs.out 2147483647
+return run scoreboard players add $bitwise.two_complement bs.out 1
diff --git a/modules/bs.bitwise/data/bs.bitwise/function/xor.mcfunction b/modules/bs.bitwise/data/bs.bitwise/function/xor.mcfunction
new file mode 100644
index 0000000000..bc25320629
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/function/xor.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Note:
+# - This function returns the exclusive or bitwise between two numbers.
+# - Example: -178 ^ 32165 = -32021
+# - Formula: a ^ b = (a + b) - 2*(a & b)
+# The result is the number composed by putting one at all bits where the value in the two binary representations of these numbers is different.
+
+scoreboard players operation #a bs.ctx = $bitwise.xor.a bs.in
+execute store result score $bitwise.xor bs.out run scoreboard players operation #b bs.ctx = $bitwise.xor.b bs.in
+scoreboard players operation $bitwise.xor bs.out += $bitwise.xor.a bs.in
+function bs.bitwise:and/compute
+scoreboard players operation $bitwise.xor bs.out -= #x bs.ctx
+return run scoreboard players operation $bitwise.xor bs.out -= #x bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.bitwise/tags/function/and.json b/modules/bs.bitwise/data/bs.bitwise/tags/function/and.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.bitwise/tags/function/and.json
rename to modules/bs.bitwise/data/bs.bitwise/tags/function/and.json
index 91c69db583..f53c3fdaae 100644
--- a/datapacks/Bookshelf/data/bs.bitwise/tags/function/and.json
+++ b/modules/bs.bitwise/data/bs.bitwise/tags/function/and.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#logical-operators",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/bitwise.html#logical-operators",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/datapacks/Bookshelf/data/bs.bitwise/tags/function/bit_count.json b/modules/bs.bitwise/data/bs.bitwise/tags/function/bit_count.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.bitwise/tags/function/bit_count.json
rename to modules/bs.bitwise/data/bs.bitwise/tags/function/bit_count.json
index ed9e09e58b..b3243f3ad6 100644
--- a/datapacks/Bookshelf/data/bs.bitwise/tags/function/bit_count.json
+++ b/modules/bs.bitwise/data/bs.bitwise/tags/function/bit_count.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#bit-count",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/bitwise.html#bit-count",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.bitwise/tags/function/bit_length.json b/modules/bs.bitwise/data/bs.bitwise/tags/function/bit_length.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.bitwise/tags/function/bit_length.json
rename to modules/bs.bitwise/data/bs.bitwise/tags/function/bit_length.json
index 229e1482ef..dae6190606 100644
--- a/datapacks/Bookshelf/data/bs.bitwise/tags/function/bit_length.json
+++ b/modules/bs.bitwise/data/bs.bitwise/tags/function/bit_length.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#bit-length",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/bitwise.html#bit-length",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/modules/bs.bitwise/data/bs.bitwise/tags/function/not.json b/modules/bs.bitwise/data/bs.bitwise/tags/function/not.json
new file mode 100644
index 0000000000..3e84dc9ff7
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/tags/function/not.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/bitwise.html#logical-operators",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2018/08/27",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2024/03/18",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.bitwise:not"
+ ]
+}
diff --git a/modules/bs.bitwise/data/bs.bitwise/tags/function/or.json b/modules/bs.bitwise/data/bs.bitwise/tags/function/or.json
new file mode 100644
index 0000000000..84d44596e6
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/tags/function/or.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/bitwise.html#logical-operators",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2018/02/27",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/08/22",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "values": [
+ "bs.bitwise:or"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.bitwise/tags/function/two_complement.json b/modules/bs.bitwise/data/bs.bitwise/tags/function/two_complement.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.bitwise/tags/function/two_complement.json
rename to modules/bs.bitwise/data/bs.bitwise/tags/function/two_complement.json
index de317e3074..70ca74958a 100644
--- a/datapacks/Bookshelf/data/bs.bitwise/tags/function/two_complement.json
+++ b/modules/bs.bitwise/data/bs.bitwise/tags/function/two_complement.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/bitwise.html#complement-to-2",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/bitwise.html#complement-to-2",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/modules/bs.bitwise/data/bs.bitwise/tags/function/xor.json b/modules/bs.bitwise/data/bs.bitwise/tags/function/xor.json
new file mode 100644
index 0000000000..9c4f99e82c
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/tags/function/xor.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/bitwise.html#logical-operators",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2018/02/27",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/08/22",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "values": [
+ "bs.bitwise:xor"
+ ]
+}
diff --git a/modules/bs.bitwise/data/bs.bitwise/test/and.mcfunction b/modules/bs.bitwise/data/bs.bitwise/test/and.mcfunction
new file mode 100644
index 0000000000..2ca5e005d9
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/test/and.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $bitwise.and.a bs.in -9
+scoreboard players set $bitwise.and.b bs.in 57
+function #bs.bitwise:and
+assert score $bitwise.and bs.out matches 49
+
+scoreboard players set $bitwise.and.a bs.in 1234567890
+scoreboard players set $bitwise.and.b bs.in 123456
+function #bs.bitwise:and
+assert score $bitwise.and bs.out matches 576
diff --git a/modules/bs.bitwise/data/bs.bitwise/test/bit_count.mcfunction b/modules/bs.bitwise/data/bs.bitwise/test/bit_count.mcfunction
new file mode 100644
index 0000000000..135d6a3f28
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/test/bit_count.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $bitwise.bit_count.n bs.in -1568
+function #bs.bitwise:bit_count
+assert score $bitwise.bit_count bs.out matches 3
+
+scoreboard players set $bitwise.bit_count.n bs.in 174653179
+function #bs.bitwise:bit_count
+assert score $bitwise.bit_count bs.out matches 19
diff --git a/modules/bs.bitwise/data/bs.bitwise/test/bit_length.mcfunction b/modules/bs.bitwise/data/bs.bitwise/test/bit_length.mcfunction
new file mode 100644
index 0000000000..6e16182fa2
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/test/bit_length.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $bitwise.bit_length.n bs.in -1568
+function #bs.bitwise:bit_length
+assert score $bitwise.bit_length bs.out matches 11
+
+scoreboard players set $bitwise.bit_length.n bs.in 174653179
+function #bs.bitwise:bit_length
+assert score $bitwise.bit_length bs.out matches 28
diff --git a/modules/bs.bitwise/data/bs.bitwise/test/not.mcfunction b/modules/bs.bitwise/data/bs.bitwise/test/not.mcfunction
new file mode 100644
index 0000000000..d10aed3a27
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/test/not.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $bitwise.not.n bs.in 123456
+function #bs.bitwise:not
+assert score $bitwise.not bs.out matches -123457
+
+scoreboard players set $bitwise.not.n bs.in -197364158
+function #bs.bitwise:not
+assert score $bitwise.not bs.out matches 197364157
diff --git a/modules/bs.bitwise/data/bs.bitwise/test/or.mcfunction b/modules/bs.bitwise/data/bs.bitwise/test/or.mcfunction
new file mode 100644
index 0000000000..e7ced1e64f
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/test/or.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $bitwise.or.a bs.in -9
+scoreboard players set $bitwise.or.b bs.in 57
+function #bs.bitwise:or
+assert score $bitwise.or bs.out matches -1
+
+scoreboard players set $bitwise.or.a bs.in 1234567890
+scoreboard players set $bitwise.or.b bs.in 123456
+function #bs.bitwise:or
+assert score $bitwise.or bs.out matches 1234690770
diff --git a/modules/bs.bitwise/data/bs.bitwise/test/two_complement.mcfunction b/modules/bs.bitwise/data/bs.bitwise/test/two_complement.mcfunction
new file mode 100644
index 0000000000..6ab38ff387
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/test/two_complement.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $bitwise.two_complement.n bs.in 123456
+function #bs.bitwise:two_complement
+assert score $bitwise.two_complement bs.out matches 123456
+
+scoreboard players set $bitwise.two_complement.n bs.in -197364158
+function #bs.bitwise:two_complement
+assert score $bitwise.two_complement bs.out matches 1950119490
diff --git a/modules/bs.bitwise/data/bs.bitwise/test/xor.mcfunction b/modules/bs.bitwise/data/bs.bitwise/test/xor.mcfunction
new file mode 100644
index 0000000000..3ff2257bf5
--- /dev/null
+++ b/modules/bs.bitwise/data/bs.bitwise/test/xor.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $bitwise.xor.a bs.in -9
+scoreboard players set $bitwise.xor.b bs.in 57
+function #bs.bitwise:xor
+assert score $bitwise.xor bs.out matches -50
+
+scoreboard players set $bitwise.xor.a bs.in 1234567890
+scoreboard players set $bitwise.xor.b bs.in 123456
+function #bs.bitwise:xor
+assert score $bitwise.xor bs.out matches 1234690194
diff --git a/modules/bs.bitwise/module.json b/modules/bs.bitwise/module.json
new file mode 100644
index 0000000000..e439a4fa9c
--- /dev/null
+++ b/modules/bs.bitwise/module.json
@@ -0,0 +1,14 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.bitwise",
+ "load": "."
+ },
+ "meta": {
+ "name": "Bitwise",
+ "slug": "bookshelf-bitwise",
+ "description": "A collection of various bitwise operations, providing versatile tools for manipulating binary data.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/bitwise.html",
+ "tags": ["default"]
+ }
+}
diff --git a/modules/bs.block/README.md b/modules/bs.block/README.md
new file mode 100644
index 0000000000..f2a42f0a2e
--- /dev/null
+++ b/modules/bs.block/README.md
@@ -0,0 +1,14 @@
+# 🧱 Bookshelf Block
+
+This datapack allows you to manage blocks efficiently, including their states and NBT data, while providing advanced tools for transformations.
+
+> “Architecture is the thoughtful making of space.”
+>
+> -- Louis Kahn
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/block.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.block/data/bs.block/function/__load__.mcfunction b/modules/bs.block/data/bs.block/function/__load__.mcfunction
new file mode 100644
index 0000000000..23f9dd56a8
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/__load__.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+forceload add -30000000 1600
+setblock -30000000 0 1606 minecraft:decorated_pot
+execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
+execute unless entity B5-0-0-0-2 run summon minecraft:text_display -30000000 0 1600 {UUID:[I;181,0,0,2],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],view_range:0f,alignment:"center"}
+
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
+
+data modify storage bs:out block set value {}
diff --git a/modules/bs.block/data/bs.block/function/__unload__.mcfunction b/modules/bs.block/data/bs.block/function/__unload__.mcfunction
new file mode 100644
index 0000000000..ee519dc0c4
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/__unload__.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+kill B5-0-0-0-1
+kill B5-0-0-0-2
+setblock -30000000 0 1606 minecraft:air
+forceload remove -30000000 1600
+
+scoreboard objectives remove bs.ctx
+scoreboard objectives remove bs.data
+
+data remove storage bs:in block
+data remove storage bs:out block
+data remove storage bs:const block
+data remove storage bs:data block
diff --git a/datapacks/Bookshelf/data/bs.block/function/fill/fill_block.mcfunction b/modules/bs.block/data/bs.block/function/fill/fill_block.mcfunction
similarity index 89%
rename from datapacks/Bookshelf/data/bs.block/function/fill/fill_block.mcfunction
rename to modules/bs.block/data/bs.block/function/fill/fill_block.mcfunction
index 04d9f69a9c..b4c2d5e1e9 100644
--- a/datapacks/Bookshelf/data/bs.block/function/fill/fill_block.mcfunction
+++ b/modules/bs.block/data/bs.block/function/fill/fill_block.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#fill
# ------------------------------------------------------------------------------------------------------------
data modify storage bs:data block._ set value { \
diff --git a/datapacks/Bookshelf/data/bs.block/function/fill/fill_random.mcfunction b/modules/bs.block/data/bs.block/function/fill/fill_random.mcfunction
similarity index 90%
rename from datapacks/Bookshelf/data/bs.block/function/fill/fill_random.mcfunction
rename to modules/bs.block/data/bs.block/function/fill/fill_random.mcfunction
index 80c938fd24..6e8c59e0a3 100644
--- a/datapacks/Bookshelf/data/bs.block/function/fill/fill_random.mcfunction
+++ b/modules/bs.block/data/bs.block/function/fill/fill_random.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#fill
# ------------------------------------------------------------------------------------------------------------
data modify storage bs:data block._ set value { \
diff --git a/datapacks/Bookshelf/data/bs.block/function/fill/fill_type.mcfunction b/modules/bs.block/data/bs.block/function/fill/fill_type.mcfunction
similarity index 89%
rename from datapacks/Bookshelf/data/bs.block/function/fill/fill_type.mcfunction
rename to modules/bs.block/data/bs.block/function/fill/fill_type.mcfunction
index 2a7c464992..8c1de509e1 100644
--- a/datapacks/Bookshelf/data/bs.block/function/fill/fill_type.mcfunction
+++ b/modules/bs.block/data/bs.block/function/fill/fill_type.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#fill
# ------------------------------------------------------------------------------------------------------------
data modify storage bs:data block._ set value { \
diff --git a/modules/bs.block/data/bs.block/function/fill/process/pause.mcfunction b/modules/bs.block/data/bs.block/function/fill/process/pause.mcfunction
new file mode 100644
index 0000000000..1387f3dd30
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/fill/process/pause.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result storage bs:data block._.pos[0] double 1 run scoreboard players get #block.x bs.data
+execute store result storage bs:data block._.pos[1] double 1 run scoreboard players get #block.y bs.data
+execute store result storage bs:data block._.pos[2] double 1 run scoreboard players get #block.z bs.data
+
+execute unless data storage bs:data block._.dim run function bs.block:utils/get_dimension
+execute unless data storage bs:data block._.rot run data modify storage bs:data block._.rot set from entity @s Rotation
+
+data modify storage bs:data block.fill prepend from storage bs:data block._
+schedule function bs.block:fill/process/scheduled 1t replace
diff --git a/modules/bs.block/data/bs.block/function/fill/process/resume.mcfunction b/modules/bs.block/data/bs.block/function/fill/process/resume.mcfunction
new file mode 100644
index 0000000000..c65e942f0e
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/fill/process/resume.mcfunction
@@ -0,0 +1,39 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data block._ set from storage bs:data block.fill[-1]
+data remove storage bs:data block._._
+
+data modify entity @s Pos set from storage bs:data block._.pos
+data modify entity @s Rotation set from storage bs:data block._.rot
+
+execute store result score #block.x bs.data run data get storage bs:data block._.pos[0]
+execute store result score #block.y bs.data run data get storage bs:data block._.pos[1]
+execute store result score #block.z bs.data run data get storage bs:data block._.pos[2]
+execute store result score #block.i bs.data run data get storage bs:data block._.limit
+execute store result score #block.min_x bs.data run data get storage bs:data block._.min_x
+execute store result score #block.min_y bs.data run data get storage bs:data block._.min_y
+execute store result score #block.min_z bs.data run data get storage bs:data block._.min_z
+execute store result score #block.max_x bs.data run data get storage bs:data block._.max_x
+execute store result score #block.max_y bs.data run data get storage bs:data block._.max_y
+execute store result score #block.max_z bs.data run data get storage bs:data block._.max_z
+
+$execute in $(dim) positioned as @s rotated as @s run function bs.block:fill/recurse/next with storage bs:data block._
+
+data remove storage bs:data block.fill[-1]
+execute if data storage bs:data block.fill[-1]._ \
+ run return run function bs.block:fill/process/resume with storage bs:data block.fill[-1]
+
+execute in minecraft:overworld run tp @s -30000000 0 1600
diff --git a/modules/bs.block/data/bs.block/function/fill/process/scheduled.mcfunction b/modules/bs.block/data/bs.block/function/fill/process/scheduled.mcfunction
new file mode 100644
index 0000000000..4f8545e92f
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/fill/process/scheduled.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data block.fill[]._ set value 1b
+execute as B5-0-0-0-1 run function bs.block:fill/process/resume with storage bs:data block.fill[-1]
diff --git a/modules/bs.block/data/bs.block/function/fill/recurse/init.mcfunction b/modules/bs.block/data/bs.block/function/fill/recurse/init.mcfunction
new file mode 100644
index 0000000000..dc0d777a27
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/fill/recurse/init.mcfunction
@@ -0,0 +1,38 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute unless data storage bs:data block._.from[2] run function bs.block:utils/resolve_from_pos with storage bs:data block._
+execute unless data storage bs:data block._.to[2] run function bs.block:utils/resolve_to_pos with storage bs:data block._
+
+execute store result score #block.i bs.data run data get storage bs:data block._.limit
+execute store result score #block.min_x bs.data run data get storage bs:data block._.from[0]
+execute store result score #block.min_y bs.data run data get storage bs:data block._.from[1]
+execute store result score #block.min_z bs.data run data get storage bs:data block._.from[2]
+execute store result score #block.max_x bs.data run data get storage bs:data block._.to[0]
+execute store result score #block.max_y bs.data run data get storage bs:data block._.to[1]
+execute store result score #block.max_z bs.data run data get storage bs:data block._.to[2]
+execute if score #block.min_x bs.data > #block.max_x bs.data run scoreboard players operation #block.min_x bs.data >< #block.max_x bs.data
+execute if score #block.min_y bs.data > #block.max_y bs.data run scoreboard players operation #block.min_y bs.data >< #block.max_y bs.data
+execute if score #block.min_z bs.data > #block.max_z bs.data run scoreboard players operation #block.min_z bs.data >< #block.max_z bs.data
+execute store result storage bs:data block._.min_x int 1 store result storage bs:data block._.pos[0] double 1 store result score #block.x bs.data run scoreboard players get #block.min_x bs.data
+execute store result storage bs:data block._.min_y int 1 store result storage bs:data block._.pos[1] double 1 store result score #block.y bs.data run scoreboard players get #block.min_y bs.data
+execute store result storage bs:data block._.min_z int 1 store result storage bs:data block._.pos[2] double 1 store result score #block.z bs.data run scoreboard players get #block.min_z bs.data
+execute store result storage bs:data block._.max_x int 1 run scoreboard players get #block.max_x bs.data
+execute store result storage bs:data block._.max_y int 1 run scoreboard players get #block.max_y bs.data
+execute store result storage bs:data block._.max_z int 1 run scoreboard players get #block.max_z bs.data
+
+data modify entity @s Pos set from storage bs:data block._.pos
+execute positioned as @s run function bs.block:fill/recurse/next with storage bs:data block._
+kill @s
diff --git a/modules/bs.block/data/bs.block/function/fill/recurse/next.mcfunction b/modules/bs.block/data/bs.block/function/fill/recurse/next.mcfunction
new file mode 100644
index 0000000000..188ffad629
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/fill/recurse/next.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute if score #block.i bs.data matches 0 run return run function bs.block:fill/process/pause
+
+$execute $(mask)run function bs.block:fill/strategy/$(impl) with storage bs:data block._
+
+scoreboard players remove #block.i bs.data 1
+scoreboard players add #block.z bs.data 1
+execute if score #block.z bs.data > #block.max_z bs.data run scoreboard players add #block.y bs.data 1
+execute if score #block.z bs.data > #block.max_z bs.data run scoreboard players operation #block.z bs.data = #block.min_z bs.data
+execute if score #block.y bs.data > #block.max_y bs.data run scoreboard players add #block.x bs.data 1
+execute if score #block.y bs.data > #block.max_y bs.data run scoreboard players operation #block.y bs.data = #block.min_y bs.data
+
+execute if score #block.z bs.data > #block.min_z bs.data positioned ~ ~ ~1 run return run function bs.block:fill/recurse/next with storage bs:data block._
+$execute if score #block.y bs.data > #block.min_y bs.data positioned ~ ~1 $(min_z) run return run function bs.block:fill/recurse/next with storage bs:data block._
+$execute if score #block.x bs.data <= #block.max_x bs.data positioned ~1 $(min_y) $(min_z) run return run function bs.block:fill/recurse/next with storage bs:data block._
diff --git a/modules/bs.block/data/bs.block/function/fill/strategy/set_block.mcfunction b/modules/bs.block/data/bs.block/function/fill/strategy/set_block.mcfunction
new file mode 100644
index 0000000000..98834ec888
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/fill/strategy/set_block.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$setblock ~ ~ ~ $(block) $(mode)
diff --git a/datapacks/Bookshelf/data/bs.block/function/fill/strategy/set_random.mcfunction b/modules/bs.block/data/bs.block/function/fill/strategy/set_random.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.block/function/fill/strategy/set_random.mcfunction
rename to modules/bs.block/data/bs.block/function/fill/strategy/set_random.mcfunction
index 5586cd23b0..18c9f8e6c7 100644
--- a/datapacks/Bookshelf/data/bs.block/function/fill/strategy/set_random.mcfunction
+++ b/modules/bs.block/data/bs.block/function/fill/strategy/set_random.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.block/data/bs.block/function/fill/strategy/set_type.mcfunction b/modules/bs.block/data/bs.block/function/fill/strategy/set_type.mcfunction
new file mode 100644
index 0000000000..79b9a57362
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/fill/strategy/set_type.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function bs.block:get/get_block
+function #bs.block:replace_type with storage bs:data block._
+data modify storage bs:data block._.block set from storage bs:out block.block
+function bs.block:fill/strategy/set_block with storage bs:data block._
diff --git a/modules/bs.block/data/bs.block/function/get/compile/block.mcfunction b/modules/bs.block/data/bs.block/function/get/compile/block.mcfunction
new file mode 100644
index 0000000000..7df55e4141
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/get/compile/block.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# compile the state string or default to an empty one
+execute if data storage bs:out block._ run function bs.block:get/compile/state
+execute unless data storage bs:out block.state run data modify storage bs:out block.state set value ""
+execute unless data storage bs:out block.properties run data modify storage bs:out block.properties set value {}
+
+# escape the nbt or default to an empty string
+execute store success score #s bs.ctx if data storage bs:out block.nbt{}
+execute if score #s bs.ctx matches 0 run data modify storage bs:out block.nbt set value ""
+execute if score #s bs.ctx matches 1 run data modify entity B5-0-0-0-2 text set value '{"storage":"bs:out","nbt":"block.nbt"}'
+
+# generate the full block string representation
+data modify storage bs:ctx _ set from storage bs:out block
+execute if score #s bs.ctx matches 1 run data modify storage bs:ctx _.nbt set string entity B5-0-0-0-2 text 1 -1
+return run function bs.block:get/compile/concat/block with storage bs:ctx _
diff --git a/modules/bs.block/data/bs.block/function/get/compile/concat/block.mcfunction b/modules/bs.block/data/bs.block/function/get/compile/concat/block.mcfunction
new file mode 100644
index 0000000000..21ce8c4d0f
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/get/compile/concat/block.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$return run data modify storage bs:out block.block set value "$(type)$(state)$(nbt)"
diff --git a/modules/bs.block/data/bs.block/function/get/compile/concat/state.mcfunction b/modules/bs.block/data/bs.block/function/get/compile/concat/state.mcfunction
new file mode 100644
index 0000000000..f1dd123736
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/get/compile/concat/state.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:out block.state set value "[$(6)$(5)$(4)$(3)$(2)$(1)$(0)]"
diff --git a/modules/bs.block/data/bs.block/function/get/compile/state.mcfunction b/modules/bs.block/data/bs.block/function/get/compile/state.mcfunction
new file mode 100644
index 0000000000..33b98caec8
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/get/compile/state.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx _ set value {0:"",1:"",2:"",3:"",4:"",5:"",6:"",7:""}
+data modify storage bs:ctx _ merge from storage bs:out block._
+function bs.block:get/compile/concat/state with storage bs:ctx _
diff --git a/modules/bs.block/data/bs.block/function/get/compile/type.mcfunction b/modules/bs.block/data/bs.block/function/get/compile/type.mcfunction
new file mode 100644
index 0000000000..12d96eaf3a
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/get/compile/type.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:out block.block set from storage bs:out block.type
+data modify storage bs:out block.properties set value {}
+data modify storage bs:out block.state set value ""
+data modify storage bs:out block.nbt set value ""
diff --git a/modules/bs.block/data/bs.block/function/get/get_block.mcfunction b/modules/bs.block/data/bs.block/function/get/get_block.mcfunction
new file mode 100644
index 0000000000..bfa71cd97b
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/get/get_block.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data remove storage bs:out block
+loot replace block -30000000 0 1606 container.0 loot bs.block:get/get_block
+data modify storage bs:out block set from block -30000000 0 1606 item.components."minecraft:custom_data"
+data modify storage bs:out block.nbt set from block ~ ~ ~ {}
diff --git a/datapacks/Bookshelf/data/bs.block/function/get/get_type.mcfunction b/modules/bs.block/data/bs.block/function/get/get_type.mcfunction
similarity index 87%
rename from datapacks/Bookshelf/data/bs.block/function/get/get_type.mcfunction
rename to modules/bs.block/data/bs.block/function/get/get_type.mcfunction
index df954808c1..c0b48be26f 100644
--- a/datapacks/Bookshelf/data/bs.block/function/get/get_type.mcfunction
+++ b/modules/bs.block/data/bs.block/function/get/get_type.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,10 +11,8 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#get
# ------------------------------------------------------------------------------------------------------------
data remove storage bs:out block
-loot replace block -30000000 0 1606 container.0 loot bs.block:get/get
+loot replace block -30000000 0 1606 container.0 loot bs.block:get/get_type
data modify storage bs:out block set from block -30000000 0 1606 item.components."minecraft:custom_data"
diff --git a/datapacks/Bookshelf/data/bs.block/function/load/mapping_registry.mcfunction b/modules/bs.block/data/bs.block/function/import/mapping_registry.mcfunction
similarity index 99%
rename from datapacks/Bookshelf/data/bs.block/function/load/mapping_registry.mcfunction
rename to modules/bs.block/data/bs.block/function/import/mapping_registry.mcfunction
index 57557d7f08..fc647c0564 100644
--- a/datapacks/Bookshelf/data/bs.block/function/load/mapping_registry.mcfunction
+++ b/modules/bs.block/data/bs.block/function/import/mapping_registry.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.block/function/lookup/lookup_item.mcfunction b/modules/bs.block/data/bs.block/function/lookup/lookup_item.mcfunction
similarity index 85%
rename from datapacks/Bookshelf/data/bs.block/function/lookup/lookup_item.mcfunction
rename to modules/bs.block/data/bs.block/function/lookup/lookup_item.mcfunction
index fe2117774c..0cab642157 100644
--- a/datapacks/Bookshelf/data/bs.block/function/lookup/lookup_item.mcfunction
+++ b/modules/bs.block/data/bs.block/function/lookup/lookup_item.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type
# ------------------------------------------------------------------------------------------------------------
$return run data modify storage bs:out block set from storage bs:const block.items."$(item)"
diff --git a/datapacks/Bookshelf/data/bs.block/function/lookup/lookup_type.mcfunction b/modules/bs.block/data/bs.block/function/lookup/lookup_type.mcfunction
similarity index 85%
rename from datapacks/Bookshelf/data/bs.block/function/lookup/lookup_type.mcfunction
rename to modules/bs.block/data/bs.block/function/lookup/lookup_type.mcfunction
index 61d472fd81..7fb49f5052 100644
--- a/datapacks/Bookshelf/data/bs.block/function/lookup/lookup_type.mcfunction
+++ b/modules/bs.block/data/bs.block/function/lookup/lookup_type.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type
# ------------------------------------------------------------------------------------------------------------
$return run data modify storage bs:out block set from storage bs:const block.types."$(type)"
diff --git a/modules/bs.block/data/bs.block/function/match/check.mcfunction b/modules/bs.block/data/bs.block/function/match/check.mcfunction
new file mode 100644
index 0000000000..e65a59077f
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/match/check.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$return run execute if block ~ ~ ~ $(block)
diff --git a/modules/bs.block/data/bs.block/function/match/match.mcfunction b/modules/bs.block/data/bs.block/function/match/match.mcfunction
new file mode 100644
index 0000000000..e99e5be37a
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/match/match.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+return run function bs.block:match/check with storage bs:in block.match
diff --git a/modules/bs.block/data/bs.block/function/produce/block_display/run.mcfunction b/modules/bs.block/data/bs.block/function/produce/block_display/run.mcfunction
new file mode 100644
index 0000000000..b3ba6d0976
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/produce/block_display/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$summon minecraft:block_display ~ ~ ~ $(_)
diff --git a/datapacks/Bookshelf/data/bs.block/function/produce/block_display/spawn_block_display.mcfunction b/modules/bs.block/data/bs.block/function/produce/block_display/spawn_block_display.mcfunction
similarity index 89%
rename from datapacks/Bookshelf/data/bs.block/function/produce/block_display/spawn_block_display.mcfunction
rename to modules/bs.block/data/bs.block/function/produce/block_display/spawn_block_display.mcfunction
index 7918dc6404..d533c793ab 100644
--- a/datapacks/Bookshelf/data/bs.block/function/produce/block_display/spawn_block_display.mcfunction
+++ b/modules/bs.block/data/bs.block/function/produce/block_display/spawn_block_display.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#produce
# ------------------------------------------------------------------------------------------------------------
data modify storage bs:ctx _ set value {}
diff --git a/datapacks/Bookshelf/data/bs.block/function/produce/block_display/spawn_solid_block_display.mcfunction b/modules/bs.block/data/bs.block/function/produce/block_display/spawn_solid_block_display.mcfunction
similarity index 91%
rename from datapacks/Bookshelf/data/bs.block/function/produce/block_display/spawn_solid_block_display.mcfunction
rename to modules/bs.block/data/bs.block/function/produce/block_display/spawn_solid_block_display.mcfunction
index 799fbf6d48..5ae3e78fbc 100644
--- a/datapacks/Bookshelf/data/bs.block/function/produce/block_display/spawn_solid_block_display.mcfunction
+++ b/modules/bs.block/data/bs.block/function/produce/block_display/spawn_solid_block_display.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#produce
# ------------------------------------------------------------------------------------------------------------
data modify storage bs:ctx _ set value {transformation:[1f,0f,0f,-0.5f,0f,1f,0f,0f,0f,0f,1f,-0.5f,0f,0f,0f,1f],Passengers:[{id:"minecraft:shulker",active_effects:[{id:"invisibility",Amplifier:1b,duration:-1,show_particles:0b}],AttachFace:0b,Invulnerable:1b,NoAI:1b,NoGravity:1b,PersistenceRequired:1b,Silent:1b}]}
diff --git a/modules/bs.block/data/bs.block/function/produce/block_particle/emit_block_particle.mcfunction b/modules/bs.block/data/bs.block/function/produce/block_particle/emit_block_particle.mcfunction
new file mode 100644
index 0000000000..55f60b2654
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/produce/block_particle/emit_block_particle.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx _ set value {}
+data modify storage bs:ctx _.name set from storage bs:in block.emit_block_particle.type
+data modify storage bs:ctx _.properties set from storage bs:in block.emit_block_particle.properties
+data modify storage bs:ctx _.delta set from storage bs:in block.emit_block_particle.delta
+data modify storage bs:ctx _.speed set from storage bs:in block.emit_block_particle.speed
+data modify storage bs:ctx _.count set from storage bs:in block.emit_block_particle.count
+
+function bs.block:produce/block_particle/run with storage bs:ctx _
diff --git a/modules/bs.block/data/bs.block/function/produce/block_particle/run.mcfunction b/modules/bs.block/data/bs.block/function/produce/block_particle/run.mcfunction
new file mode 100644
index 0000000000..603197f2eb
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/produce/block_particle/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$particle block{block_state: { Name: "$(name)", Properties: $(properties) }} ~ ~ ~ $(delta) $(speed) $(count)
diff --git a/modules/bs.block/data/bs.block/function/produce/falling_block/run.mcfunction b/modules/bs.block/data/bs.block/function/produce/falling_block/run.mcfunction
new file mode 100644
index 0000000000..e860e05b9f
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/produce/falling_block/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$summon minecraft:falling_block ~ ~ ~ $(_)
diff --git a/datapacks/Bookshelf/data/bs.block/function/produce/falling_block/spawn_falling_block.mcfunction b/modules/bs.block/data/bs.block/function/produce/falling_block/spawn_falling_block.mcfunction
similarity index 89%
rename from datapacks/Bookshelf/data/bs.block/function/produce/falling_block/spawn_falling_block.mcfunction
rename to modules/bs.block/data/bs.block/function/produce/falling_block/spawn_falling_block.mcfunction
index 2f6d52cdf9..a5f6273ccb 100644
--- a/datapacks/Bookshelf/data/bs.block/function/produce/falling_block/spawn_falling_block.mcfunction
+++ b/modules/bs.block/data/bs.block/function/produce/falling_block/spawn_falling_block.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#produce
# ------------------------------------------------------------------------------------------------------------
data modify storage bs:ctx _ set value {}
diff --git a/modules/bs.block/data/bs.block/function/set/run.mcfunction b/modules/bs.block/data/bs.block/function/set/run.mcfunction
new file mode 100644
index 0000000000..af4fe5bd6d
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/set/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$return run setblock ~ ~ ~ $(block) $(mode)
diff --git a/modules/bs.block/data/bs.block/function/set/set_block.mcfunction b/modules/bs.block/data/bs.block/function/set/set_block.mcfunction
new file mode 100644
index 0000000000..c8fcdde4af
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/set/set_block.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute unless data storage bs:in block.set_block.mode run data modify storage bs:in block.set_block.mode set value "replace"
+return run function bs.block:set/run with storage bs:in block.set_block
diff --git a/modules/bs.block/data/bs.block/function/set/set_type.mcfunction b/modules/bs.block/data/bs.block/function/set/set_type.mcfunction
new file mode 100644
index 0000000000..c15b6f4f73
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/set/set_type.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute unless data storage bs:in block.set_type.mode run data modify storage bs:in block.set_type.mode set value "replace"
+function bs.block:get/get_block
+function #bs.block:replace_type with storage bs:in block.set_type
+data modify storage bs:out block.mode set from storage bs:in block.set_type.mode
+return run function bs.block:set/run with storage bs:out block
diff --git a/modules/bs.block/data/bs.block/function/transform/keep_properties/keep_properties.mcfunction b/modules/bs.block/data/bs.block/function/transform/keep_properties/keep_properties.mcfunction
new file mode 100644
index 0000000000..9bd6f07d3f
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/transform/keep_properties/keep_properties.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute if data storage bs:out block{group:0} run return 0
+
+$data modify storage bs:ctx _ set value {i:$(properties)}
+function bs.block:transform/lookup_group with storage bs:out block
+function bs.block:transform/keep_properties/recurse/next with storage bs:ctx _.i[-1]
+
+data modify storage bs:out block.properties set from storage bs:ctx _.p
+data modify storage bs:out block._ set from storage bs:ctx _.s
diff --git a/modules/bs.block/data/bs.block/function/transform/keep_properties/recurse/get_by_value.mcfunction b/modules/bs.block/data/bs.block/function/transform/keep_properties/recurse/get_by_value.mcfunction
new file mode 100644
index 0000000000..b5c22fc9d6
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/transform/keep_properties/recurse/get_by_value.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:ctx _.v set from storage bs:ctx _.g[{n:"$(name)"}].o[{v:"$(v)"}]
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/keep_properties/recurse/get_default.mcfunction b/modules/bs.block/data/bs.block/function/transform/keep_properties/recurse/get_default.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.block/function/transform/keep_properties/recurse/get_default.mcfunction
rename to modules/bs.block/data/bs.block/function/transform/keep_properties/recurse/get_default.mcfunction
index f6df8b4cb4..67b292fb2c 100644
--- a/datapacks/Bookshelf/data/bs.block/function/transform/keep_properties/recurse/get_default.mcfunction
+++ b/modules/bs.block/data/bs.block/function/transform/keep_properties/recurse/get_default.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.block/data/bs.block/function/transform/keep_properties/recurse/next.mcfunction b/modules/bs.block/data/bs.block/function/transform/keep_properties/recurse/next.mcfunction
new file mode 100644
index 0000000000..57a46e88ba
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/transform/keep_properties/recurse/next.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store success score #s bs.ctx run data modify storage bs:ctx _.i[-1].v set from storage bs:out block.properties."$(name)"
+execute if score #s bs.ctx matches 0 run function bs.block:transform/keep_properties/recurse/get_default with storage bs:ctx _.i[-1]
+execute if score #s bs.ctx matches 1 run function bs.block:transform/keep_properties/recurse/get_by_value with storage bs:ctx _.i[-1]
+
+data modify storage bs:ctx _.p merge from storage bs:ctx _.v.p
+data modify storage bs:ctx _.s merge from storage bs:ctx _.v.s
+
+data remove storage bs:ctx _.i[-1]
+function bs.block:transform/keep_properties/recurse/next with storage bs:ctx _.i[-1]
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/lookup_group.mcfunction b/modules/bs.block/data/bs.block/function/transform/lookup_group.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.block/function/transform/lookup_group.mcfunction
rename to modules/bs.block/data/bs.block/function/transform/lookup_group.mcfunction
index 5dfb86eb9f..ae2f02f370 100644
--- a/datapacks/Bookshelf/data/bs.block/function/transform/lookup_group.mcfunction
+++ b/modules/bs.block/data/bs.block/function/transform/lookup_group.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.block/data/bs.block/function/transform/merge_properties/merge_properties.mcfunction b/modules/bs.block/data/bs.block/function/transform/merge_properties/merge_properties.mcfunction
new file mode 100644
index 0000000000..0457af648a
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/transform/merge_properties/merge_properties.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute if data storage bs:out block{group:0} run return 0
+
+$data modify storage bs:ctx _ set value {i:$(properties)}
+function bs.block:transform/lookup_group with storage bs:out block
+loot replace block -30000000 0 1606 container.0 loot bs.block:get/get_block
+data modify storage bs:ctx _.p set from block -30000000 0 1606 item.components."minecraft:custom_data".properties
+function bs.block:transform/merge_properties/recurse/next with storage bs:ctx _.i[-1]
diff --git a/modules/bs.block/data/bs.block/function/transform/merge_properties/recurse/get_by_value.mcfunction b/modules/bs.block/data/bs.block/function/transform/merge_properties/recurse/get_by_value.mcfunction
new file mode 100644
index 0000000000..b5c22fc9d6
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/transform/merge_properties/recurse/get_by_value.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:ctx _.v set from storage bs:ctx _.g[{n:"$(name)"}].o[{v:"$(v)"}]
diff --git a/modules/bs.block/data/bs.block/function/transform/merge_properties/recurse/next.mcfunction b/modules/bs.block/data/bs.block/function/transform/merge_properties/recurse/next.mcfunction
new file mode 100644
index 0000000000..71072bf70a
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/transform/merge_properties/recurse/next.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store success score #s bs.ctx run data modify storage bs:ctx _.i[-1].v set from storage bs:ctx _.p."$(name)"
+execute if score #s bs.ctx matches 1 run function bs.block:transform/merge_properties/recurse/get_by_value with storage bs:ctx _.i[-1]
+
+data modify storage bs:out block.properties merge from storage bs:ctx _.v.p
+data modify storage bs:out block._ merge from storage bs:ctx _.v.s
+
+data remove storage bs:ctx _.i[-1]
+function bs.block:transform/merge_properties/recurse/next with storage bs:ctx _.i[-1]
diff --git a/modules/bs.block/data/bs.block/function/transform/remove_properties/recurse/next.mcfunction b/modules/bs.block/data/bs.block/function/transform/remove_properties/recurse/next.mcfunction
new file mode 100644
index 0000000000..c9be8730d4
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/transform/remove_properties/recurse/next.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$function bs.block:transform/remove_properties/recurse/remove with storage bs:ctx _.g[{n:"$(name)"}]
+
+data remove storage bs:ctx _.i[-1]
+function bs.block:transform/remove_properties/recurse/next with storage bs:ctx _.i[-1]
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/remove_properties/recurse/remove.mcfunction b/modules/bs.block/data/bs.block/function/transform/remove_properties/recurse/remove.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.block/function/transform/remove_properties/recurse/remove.mcfunction
rename to modules/bs.block/data/bs.block/function/transform/remove_properties/recurse/remove.mcfunction
index 1bd0ec0695..a77fefdbb6 100644
--- a/datapacks/Bookshelf/data/bs.block/function/transform/remove_properties/recurse/remove.mcfunction
+++ b/modules/bs.block/data/bs.block/function/transform/remove_properties/recurse/remove.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.block/data/bs.block/function/transform/remove_properties/remove_properties.mcfunction b/modules/bs.block/data/bs.block/function/transform/remove_properties/remove_properties.mcfunction
new file mode 100644
index 0000000000..f51535d329
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/transform/remove_properties/remove_properties.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute if data storage bs:out block{group:0} run return 0
+
+$data modify storage bs:ctx _ set value {i:$(properties)}
+function bs.block:transform/lookup_group with storage bs:out block
+function bs.block:transform/remove_properties/recurse/next with storage bs:ctx _.i[-1]
diff --git a/modules/bs.block/data/bs.block/function/transform/replace_properties/recurse/next.mcfunction b/modules/bs.block/data/bs.block/function/transform/replace_properties/recurse/next.mcfunction
new file mode 100644
index 0000000000..3012f9426a
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/transform/replace_properties/recurse/next.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:ctx _.v set from storage bs:ctx _.g[{n:"$(name)"}].o[{v:"$(value)"}]
+
+data modify storage bs:out block.properties merge from storage bs:ctx _.v.p
+data modify storage bs:out block._ merge from storage bs:ctx _.v.s
+
+data remove storage bs:ctx _.i[-1]
+function bs.block:transform/replace_properties/recurse/next with storage bs:ctx _.i[-1]
diff --git a/modules/bs.block/data/bs.block/function/transform/replace_properties/replace_properties.mcfunction b/modules/bs.block/data/bs.block/function/transform/replace_properties/replace_properties.mcfunction
new file mode 100644
index 0000000000..0efdc4d7c6
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/transform/replace_properties/replace_properties.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute if data storage bs:out block{group:0} run return 0
+
+$data modify storage bs:ctx _ set value {i:$(properties)}
+function bs.block:transform/lookup_group with storage bs:out block
+function bs.block:transform/replace_properties/recurse/next with storage bs:ctx _.i[-1]
diff --git a/modules/bs.block/data/bs.block/function/transform/replace_type.mcfunction b/modules/bs.block/data/bs.block/function/transform/replace_type.mcfunction
new file mode 100644
index 0000000000..913bad5a83
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/transform/replace_type.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store success score #s bs.ctx run data modify storage bs:ctx _ set from storage bs:const block.types."$(type)"
+execute if score #s bs.ctx matches 0 run return fail
+execute store success score #s bs.ctx run data modify storage bs:ctx _.group set from storage bs:out block.group
+execute if score #s bs.ctx matches 0 run data modify storage bs:out block.type set from storage bs:ctx _.type
+execute if score #s bs.ctx matches 1 run data modify storage bs:out block set from storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/shift_properties/recurse/index.mcfunction b/modules/bs.block/data/bs.block/function/transform/shift_properties/recurse/index.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.block/function/transform/shift_properties/recurse/index.mcfunction
rename to modules/bs.block/data/bs.block/function/transform/shift_properties/recurse/index.mcfunction
index d1e9ac2e19..19d5200273 100644
--- a/datapacks/Bookshelf/data/bs.block/function/transform/shift_properties/recurse/index.mcfunction
+++ b/modules/bs.block/data/bs.block/function/transform/shift_properties/recurse/index.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.block/data/bs.block/function/transform/shift_properties/recurse/next.mcfunction b/modules/bs.block/data/bs.block/function/transform/shift_properties/recurse/next.mcfunction
new file mode 100644
index 0000000000..2bf56db828
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/transform/shift_properties/recurse/next.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result score #l bs.ctx if data storage bs:ctx _.g[{n:"$(name)"}].o[]
+
+execute if score #l bs.ctx matches 1.. \
+ run function bs.block:transform/shift_properties/recurse/shift_property with storage bs:ctx _.i[-1]
+
+data remove storage bs:ctx _.i[-1]
+function bs.block:transform/shift_properties/recurse/next with storage bs:ctx _.i[-1]
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/shift_properties/recurse/shift_property.mcfunction b/modules/bs.block/data/bs.block/function/transform/shift_properties/recurse/shift_property.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.block/function/transform/shift_properties/recurse/shift_property.mcfunction
rename to modules/bs.block/data/bs.block/function/transform/shift_properties/recurse/shift_property.mcfunction
index 3f2385bde7..ec7d16ce6d 100644
--- a/datapacks/Bookshelf/data/bs.block/function/transform/shift_properties/recurse/shift_property.mcfunction
+++ b/modules/bs.block/data/bs.block/function/transform/shift_properties/recurse/shift_property.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/shift_properties/recurse/update_property.mcfunction b/modules/bs.block/data/bs.block/function/transform/shift_properties/recurse/update_property.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.block/function/transform/shift_properties/recurse/update_property.mcfunction
rename to modules/bs.block/data/bs.block/function/transform/shift_properties/recurse/update_property.mcfunction
index 0d593e1087..83ec6e9d97 100644
--- a/datapacks/Bookshelf/data/bs.block/function/transform/shift_properties/recurse/update_property.mcfunction
+++ b/modules/bs.block/data/bs.block/function/transform/shift_properties/recurse/update_property.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.block/data/bs.block/function/transform/shift_properties/shift_properties.mcfunction b/modules/bs.block/data/bs.block/function/transform/shift_properties/shift_properties.mcfunction
new file mode 100644
index 0000000000..7980411582
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/transform/shift_properties/shift_properties.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute if data storage bs:out block{group:0} run return 0
+
+$data modify storage bs:ctx _ set value {i:$(properties)}
+function bs.block:transform/lookup_group with storage bs:out block
+function bs.block:transform/shift_properties/recurse/next with storage bs:ctx _.i[-1]
+
+data modify storage bs:out block._ merge from storage bs:ctx _.s[].o[{_:1b}].s
+data modify storage bs:out block.properties merge from storage bs:ctx _.s[].o[{_:1b}].p
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/filter_set.mcfunction b/modules/bs.block/data/bs.block/function/transform/type_mappings/filter_set.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/filter_set.mcfunction
rename to modules/bs.block/data/bs.block/function/transform/type_mappings/filter_set.mcfunction
index 5aa0825264..f547fed1bc 100644
--- a/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/filter_set.mcfunction
+++ b/modules/bs.block/data/bs.block/function/transform/type_mappings/filter_set.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/filter_type.mcfunction b/modules/bs.block/data/bs.block/function/transform/type_mappings/filter_type.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/filter_type.mcfunction
rename to modules/bs.block/data/bs.block/function/transform/type_mappings/filter_type.mcfunction
index 924a84a6e2..864d4b1eb1 100644
--- a/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/filter_type.mcfunction
+++ b/modules/bs.block/data/bs.block/function/transform/type_mappings/filter_type.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/find_match.mcfunction b/modules/bs.block/data/bs.block/function/transform/type_mappings/find_match.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/find_match.mcfunction
rename to modules/bs.block/data/bs.block/function/transform/type_mappings/find_match.mcfunction
index 924df83b03..86f49716f7 100644
--- a/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/find_match.mcfunction
+++ b/modules/bs.block/data/bs.block/function/transform/type_mappings/find_match.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/keep_best.mcfunction b/modules/bs.block/data/bs.block/function/transform/type_mappings/keep_best.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/keep_best.mcfunction
rename to modules/bs.block/data/bs.block/function/transform/type_mappings/keep_best.mcfunction
index ef4e396bdd..b5f0238851 100644
--- a/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/keep_best.mcfunction
+++ b/modules/bs.block/data/bs.block/function/transform/type_mappings/keep_best.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.block/data/bs.block/function/transform/type_mappings/map_type.mcfunction b/modules/bs.block/data/bs.block/function/transform/type_mappings/map_type.mcfunction
new file mode 100644
index 0000000000..af4af7d55f
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/transform/type_mappings/map_type.mcfunction
@@ -0,0 +1,35 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# get all attributes that belongs to the type input
+$data modify storage bs:ctx _.attrs append from storage bs:ctx _.sets[{type:"$(type)"}].attrs[]
+execute unless data storage bs:ctx _.attrs[-1] run return fail
+
+# keep only the set that has the bs:out block type
+function bs.block:transform/type_mappings/filter_type with storage bs:out block
+execute unless data storage bs:ctx _.filter run return fail
+
+# find entries that match the attributes
+scoreboard players set #a bs.ctx 0
+data modify storage bs:ctx _.entry set from storage bs:ctx _.sets[-1]
+function bs.block:transform/type_mappings/find_match with storage bs:ctx _.entry
+
+# filter out entries that have more attributes
+execute store result storage bs:ctx y byte 1 run scoreboard players get #a bs.ctx
+function bs.block:transform/type_mappings/keep_best with storage bs:ctx
+
+# replace the type in bs:out block
+data modify storage bs:ctx _.type set from storage bs:ctx _.found[0].type
+return run function #bs.block:replace_type with storage bs:ctx _
diff --git a/modules/bs.block/data/bs.block/function/transform/type_mappings/mix_type.mcfunction b/modules/bs.block/data/bs.block/function/transform/type_mappings/mix_type.mcfunction
new file mode 100644
index 0000000000..fa0886b9ae
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/transform/type_mappings/mix_type.mcfunction
@@ -0,0 +1,40 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# get all attributes that belongs to the type input
+$data modify storage bs:ctx _.attrs append from storage bs:ctx _.sets[{type:"$(type)"}].attrs[]
+execute unless data storage bs:ctx _.attrs[-1] run return fail
+
+# keep only the set that has the bs:out block type
+function bs.block:transform/type_mappings/filter_type with storage bs:out block
+execute unless data storage bs:ctx _.filter run return fail
+
+# find entries that match the attributes
+scoreboard players set #a bs.ctx 0
+data modify storage bs:ctx _.attrs append from storage bs:ctx _.filter.attrs[]
+data modify storage bs:ctx _.entry set from storage bs:ctx _.sets[-1]
+function bs.block:transform/type_mappings/find_match with storage bs:ctx _.entry
+
+# filter out entries that have more attributes
+execute store result storage bs:ctx y byte 1 run scoreboard players get #a bs.ctx
+function bs.block:transform/type_mappings/keep_best with storage bs:ctx
+
+# filter out entries that are different from the input / output
+$execute if data storage bs:ctx _.found[1] run data remove storage bs:ctx _.found[{type:"$(type)"}]
+execute if data storage bs:ctx _.found[1] run function bs.block:transform/type_mappings/remove_type with storage bs:ctx _.filter
+
+# replace the type in bs:out block
+data modify storage bs:ctx _.type set from storage bs:ctx _.found[0].type
+return run function #bs.block:replace_type with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/remove_type.mcfunction b/modules/bs.block/data/bs.block/function/transform/type_mappings/remove_type.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/remove_type.mcfunction
rename to modules/bs.block/data/bs.block/function/transform/type_mappings/remove_type.mcfunction
index 50c6ae4e92..97fc214d47 100644
--- a/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/remove_type.mcfunction
+++ b/modules/bs.block/data/bs.block/function/transform/type_mappings/remove_type.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/with_registry.mcfunction b/modules/bs.block/data/bs.block/function/transform/type_mappings/with_registry.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/with_registry.mcfunction
rename to modules/bs.block/data/bs.block/function/transform/type_mappings/with_registry.mcfunction
index 3420f5dc7f..2c4370a23d 100644
--- a/datapacks/Bookshelf/data/bs.block/function/transform/type_mappings/with_registry.mcfunction
+++ b/modules/bs.block/data/bs.block/function/transform/type_mappings/with_registry.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.block/data/bs.block/function/utils/get_custom_dimension.mcfunction b/modules/bs.block/data/bs.block/function/utils/get_custom_dimension.mcfunction
new file mode 100644
index 0000000000..bb72765a1d
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/utils/get_custom_dimension.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data block._.dim set from entity @s Brain.memories.minecraft:home.value.dimension
+kill @s
diff --git a/modules/bs.block/data/bs.block/function/utils/get_dimension.mcfunction b/modules/bs.block/data/bs.block/function/utils/get_dimension.mcfunction
new file mode 100644
index 0000000000..4907aed8f9
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/utils/get_dimension.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute if dimension minecraft:overworld run return run data modify storage bs:data block._.dim set value "minecraft:overworld"
+execute if dimension minecraft:the_nether run return run data modify storage bs:data block._.dim set value "minecraft:the_nether"
+execute if dimension minecraft:the_end run return run data modify storage bs:data block._.dim set value "minecraft:the_end"
+
+execute positioned -30000000 0 1600 summon piglin_brute run function bs.block:utils/get_custom_dimension
diff --git a/modules/bs.block/data/bs.block/function/utils/masks/compile.mcfunction b/modules/bs.block/data/bs.block/function/utils/masks/compile.mcfunction
new file mode 100644
index 0000000000..fc499d5505
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/utils/masks/compile.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx _ set value {x:0,y:0,z:0,negate:0b,mask:""}
+data modify storage bs:ctx _ merge from storage bs:data block._.masks[-1]
+execute if data storage bs:ctx _.block run function bs.block:utils/masks/loop with storage bs:ctx _
+data modify storage bs:data block._.mask set from storage bs:ctx _.mask
diff --git a/modules/bs.block/data/bs.block/function/utils/masks/loop.mcfunction b/modules/bs.block/data/bs.block/function/utils/masks/loop.mcfunction
new file mode 100644
index 0000000000..8b3d7b2ae7
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/utils/masks/loop.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute if data storage bs:ctx _{negate:0b} run data modify storage bs:ctx _.mask set value "if block ~$(x) ~$(y) ~$(z) $(block) $(mask)"
+$execute if data storage bs:ctx _{negate:1b} run data modify storage bs:ctx _.mask set value "unless block ~$(x) ~$(y) ~$(z) $(block) $(mask)"
+
+data remove storage bs:data block._.masks[-1]
+data modify storage bs:ctx _ merge value {x:0,y:0,z:0,negate:0b,block:0b}
+data modify storage bs:ctx _ merge from storage bs:data block._.masks[-1]
+execute unless data storage bs:ctx _{block:0b} run function bs.block:utils/masks/loop with storage bs:ctx _
diff --git a/modules/bs.block/data/bs.block/function/utils/random/compile.mcfunction b/modules/bs.block/data/bs.block/function/utils/random/compile.mcfunction
new file mode 100644
index 0000000000..634f96201c
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/utils/random/compile.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx _ set value {pools:[{rolls:1,entries:[]}]}
+execute if data storage bs:data block._.entries[-1] run function bs.block:utils/random/loop
+data modify storage bs:data block._.entries set from storage bs:ctx _
diff --git a/modules/bs.block/data/bs.block/function/utils/random/loop.mcfunction b/modules/bs.block/data/bs.block/function/utils/random/loop.mcfunction
new file mode 100644
index 0000000000..0125cced46
--- /dev/null
+++ b/modules/bs.block/data/bs.block/function/utils/random/loop.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx _.pools[0].entries append value {type:"item",name:"cod",weight:1,functions:[{function:"set_custom_data",tag:{}}]}
+
+data modify storage bs:ctx _.pools[0].entries[-1].weight set from storage bs:data block._.entries[-1].weight
+data modify storage bs:ctx _.pools[0].entries[-1].functions[0].tag.block set from storage bs:data block._.entries[-1].block
+data modify storage bs:ctx _.pools[0].entries[-1].functions[0].tag.type set from storage bs:data block._.entries[-1].type
+
+data remove storage bs:data block._.entries[-1]
+execute if data storage bs:data block._.entries[-1] run function bs.block:utils/random/loop
diff --git a/datapacks/Bookshelf/data/bs.block/function/utils/resolve_from_pos.mcfunction b/modules/bs.block/data/bs.block/function/utils/resolve_from_pos.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.block/function/utils/resolve_from_pos.mcfunction
rename to modules/bs.block/data/bs.block/function/utils/resolve_from_pos.mcfunction
index e6dd83e666..fdc77132c2 100644
--- a/datapacks/Bookshelf/data/bs.block/function/utils/resolve_from_pos.mcfunction
+++ b/modules/bs.block/data/bs.block/function/utils/resolve_from_pos.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.block/function/utils/resolve_to_pos.mcfunction b/modules/bs.block/data/bs.block/function/utils/resolve_to_pos.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.block/function/utils/resolve_to_pos.mcfunction
rename to modules/bs.block/data/bs.block/function/utils/resolve_to_pos.mcfunction
index 3c0daedeef..3252735187 100644
--- a/datapacks/Bookshelf/data/bs.block/function/utils/resolve_to_pos.mcfunction
+++ b/modules/bs.block/data/bs.block/function/utils/resolve_to_pos.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/emit_block_particle.json b/modules/bs.block/data/bs.block/tags/function/emit_block_particle.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.block/tags/function/emit_block_particle.json
rename to modules/bs.block/data/bs.block/tags/function/emit_block_particle.json
index 0e6dcff2ae..a88e9558f6 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/emit_block_particle.json
+++ b/modules/bs.block/data/bs.block/tags/function/emit_block_particle.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#produce",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#produce",
"authors": [
"theogiraudet"
],
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/fill_block.json b/modules/bs.block/data/bs.block/tags/function/fill_block.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.block/tags/function/fill_block.json
rename to modules/bs.block/data/bs.block/tags/function/fill_block.json
index 5db21212be..4dcdc6cfc8 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/fill_block.json
+++ b/modules/bs.block/data/bs.block/tags/function/fill_block.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#fill",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#fill",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/fill_random.json b/modules/bs.block/data/bs.block/tags/function/fill_random.json
similarity index 79%
rename from datapacks/Bookshelf/data/bs.block/tags/function/fill_random.json
rename to modules/bs.block/data/bs.block/tags/function/fill_random.json
index 1247afd73d..8bb69110f1 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/fill_random.json
+++ b/modules/bs.block/data/bs.block/tags/function/fill_random.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#fill",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#fill",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/fill_type.json b/modules/bs.block/data/bs.block/tags/function/fill_type.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.block/tags/function/fill_type.json
rename to modules/bs.block/data/bs.block/tags/function/fill_type.json
index 275e8e68a3..e7fc3046ac 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/fill_type.json
+++ b/modules/bs.block/data/bs.block/tags/function/fill_type.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#fill",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#fill",
"authors": [
"Aksiome"
],
diff --git a/modules/bs.block/data/bs.block/tags/function/get_block.json b/modules/bs.block/data/bs.block/tags/function/get_block.json
new file mode 100644
index 0000000000..6294089ee9
--- /dev/null
+++ b/modules/bs.block/data/bs.block/tags/function/get_block.json
@@ -0,0 +1,22 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#get",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/15",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.block:get/get_block",
+ "bs.block:get/compile/block"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/get_type.json b/modules/bs.block/data/bs.block/tags/function/get_type.json
similarity index 79%
rename from datapacks/Bookshelf/data/bs.block/tags/function/get_type.json
rename to modules/bs.block/data/bs.block/tags/function/get_type.json
index 883e9272ef..226ba2de83 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/get_type.json
+++ b/modules/bs.block/data/bs.block/tags/function/get_type.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#get",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#get",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/keep_properties.json b/modules/bs.block/data/bs.block/tags/function/keep_properties.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.block/tags/function/keep_properties.json
rename to modules/bs.block/data/bs.block/tags/function/keep_properties.json
index 7a6c18daa8..db6734898f 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/keep_properties.json
+++ b/modules/bs.block/data/bs.block/tags/function/keep_properties.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-state",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/lookup_item.json b/modules/bs.block/data/bs.block/tags/function/lookup_item.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.block/tags/function/lookup_item.json
rename to modules/bs.block/data/bs.block/tags/function/lookup_item.json
index 7eb0f22c24..f6ee2bbe4b 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/lookup_item.json
+++ b/modules/bs.block/data/bs.block/tags/function/lookup_item.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-type",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/lookup_type.json b/modules/bs.block/data/bs.block/tags/function/lookup_type.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.block/tags/function/lookup_type.json
rename to modules/bs.block/data/bs.block/tags/function/lookup_type.json
index 51c2642fae..57b692300a 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/lookup_type.json
+++ b/modules/bs.block/data/bs.block/tags/function/lookup_type.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-type",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/map_type.json b/modules/bs.block/data/bs.block/tags/function/map_type.json
similarity index 81%
rename from datapacks/Bookshelf/data/bs.block/tags/function/map_type.json
rename to modules/bs.block/data/bs.block/tags/function/map_type.json
index b791d84ce6..5934d0b39f 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/map_type.json
+++ b/modules/bs.block/data/bs.block/tags/function/map_type.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-type",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/match.json b/modules/bs.block/data/bs.block/tags/function/match.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.block/tags/function/match.json
rename to modules/bs.block/data/bs.block/tags/function/match.json
index 59bedf5223..b7372f8bef 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/match.json
+++ b/modules/bs.block/data/bs.block/tags/function/match.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#match",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#match",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/merge_properties.json b/modules/bs.block/data/bs.block/tags/function/merge_properties.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.block/tags/function/merge_properties.json
rename to modules/bs.block/data/bs.block/tags/function/merge_properties.json
index 6a03063b54..bd41d81db1 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/merge_properties.json
+++ b/modules/bs.block/data/bs.block/tags/function/merge_properties.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-state",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/mix_type.json b/modules/bs.block/data/bs.block/tags/function/mix_type.json
similarity index 81%
rename from datapacks/Bookshelf/data/bs.block/tags/function/mix_type.json
rename to modules/bs.block/data/bs.block/tags/function/mix_type.json
index 41622743b9..7fdfba2e96 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/mix_type.json
+++ b/modules/bs.block/data/bs.block/tags/function/mix_type.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-type",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/remove_properties.json b/modules/bs.block/data/bs.block/tags/function/remove_properties.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.block/tags/function/remove_properties.json
rename to modules/bs.block/data/bs.block/tags/function/remove_properties.json
index 9b75979270..b63c040fba 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/remove_properties.json
+++ b/modules/bs.block/data/bs.block/tags/function/remove_properties.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-state",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/replace_properties.json b/modules/bs.block/data/bs.block/tags/function/replace_properties.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.block/tags/function/replace_properties.json
rename to modules/bs.block/data/bs.block/tags/function/replace_properties.json
index a69fdf3bcf..ccd18dacb5 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/replace_properties.json
+++ b/modules/bs.block/data/bs.block/tags/function/replace_properties.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-state",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/replace_type.json b/modules/bs.block/data/bs.block/tags/function/replace_type.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.block/tags/function/replace_type.json
rename to modules/bs.block/data/bs.block/tags/function/replace_type.json
index 4aaa0bbc73..a4ea500807 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/replace_type.json
+++ b/modules/bs.block/data/bs.block/tags/function/replace_type.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-type",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-type",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/set_block.json b/modules/bs.block/data/bs.block/tags/function/set_block.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.block/tags/function/set_block.json
rename to modules/bs.block/data/bs.block/tags/function/set_block.json
index a9c0e20732..8c2d945de5 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/set_block.json
+++ b/modules/bs.block/data/bs.block/tags/function/set_block.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#set",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#set",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/set_type.json b/modules/bs.block/data/bs.block/tags/function/set_type.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.block/tags/function/set_type.json
rename to modules/bs.block/data/bs.block/tags/function/set_type.json
index 05ab046aac..249bfa127c 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/set_type.json
+++ b/modules/bs.block/data/bs.block/tags/function/set_type.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#set",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#set",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/shift_properties.json b/modules/bs.block/data/bs.block/tags/function/shift_properties.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.block/tags/function/shift_properties.json
rename to modules/bs.block/data/bs.block/tags/function/shift_properties.json
index 37a9fee5d6..660ccb7a64 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/shift_properties.json
+++ b/modules/bs.block/data/bs.block/tags/function/shift_properties.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#manage-state",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#manage-state",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/spawn_block_display.json b/modules/bs.block/data/bs.block/tags/function/spawn_block_display.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.block/tags/function/spawn_block_display.json
rename to modules/bs.block/data/bs.block/tags/function/spawn_block_display.json
index 437c941465..516c738eca 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/spawn_block_display.json
+++ b/modules/bs.block/data/bs.block/tags/function/spawn_block_display.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#produce",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#produce",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/spawn_falling_block.json b/modules/bs.block/data/bs.block/tags/function/spawn_falling_block.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.block/tags/function/spawn_falling_block.json
rename to modules/bs.block/data/bs.block/tags/function/spawn_falling_block.json
index 7fc5802671..413cc765f0 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/spawn_falling_block.json
+++ b/modules/bs.block/data/bs.block/tags/function/spawn_falling_block.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#produce",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#produce",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/datapacks/Bookshelf/data/bs.block/tags/function/spawn_solid_block_display.json b/modules/bs.block/data/bs.block/tags/function/spawn_solid_block_display.json
similarity index 79%
rename from datapacks/Bookshelf/data/bs.block/tags/function/spawn_solid_block_display.json
rename to modules/bs.block/data/bs.block/tags/function/spawn_solid_block_display.json
index 67dbd3586c..64b841e56c 100644
--- a/datapacks/Bookshelf/data/bs.block/tags/function/spawn_solid_block_display.json
+++ b/modules/bs.block/data/bs.block/tags/function/spawn_solid_block_display.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/block.html#produce",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#produce",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/modules/bs.block/data/bs.block/test/fill/async.mcfunction b/modules/bs.block/data/bs.block/test/fill/async.mcfunction
new file mode 100644
index 0000000000..0091ba74fd
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/fill/async.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:in block.fill_block set value {block:"minecraft:stone",from:"~ ~ ~",to:"~1 ~ ~",limit:1}
+function #bs.block:fill_block
+
+assert block ~ ~ ~ minecraft:stone
+assert not block ~1 ~ ~ minecraft:stone
+await delay 1t
+assert block ~1 ~ ~ minecraft:stone
diff --git a/modules/bs.block/data/bs.block/test/fill/block.mcfunction b/modules/bs.block/data/bs.block/test/fill/block.mcfunction
new file mode 100644
index 0000000000..fa69259267
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/fill/block.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:in block.fill_block set value {block:"minecraft:stone"}
+execute summon minecraft:marker run data modify storage bs:in block.fill_block.from set from entity @s Pos
+execute positioned ~1 ~ ~ summon minecraft:marker run data modify storage bs:in block.fill_block.to set from entity @s Pos
+function #bs.block:fill_block
+
+assert block ~ ~ ~ minecraft:stone
+assert block ~1 ~ ~ minecraft:stone
diff --git a/modules/bs.block/data/bs.block/test/fill/masks.mcfunction b/modules/bs.block/data/bs.block/test/fill/masks.mcfunction
new file mode 100644
index 0000000000..04e025d37d
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/fill/masks.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+fill ~ ~ ~ ~ ~1 ~ dirt
+data modify storage bs:in block.fill_block set value {block:"minecraft:grass_block",from:"~ ~ ~",to:"~ ~1 ~",masks:[{block:"minecraft:dirt"},{block:"minecraft:air",y:1}]}
+function #bs.block:fill_block
+
+assert block ~ ~ ~ minecraft:dirt
+assert block ~ ~1 ~ minecraft:grass_block
diff --git a/datapacks/Bookshelf/data/bs.block/test/fill/random.mcfunction b/modules/bs.block/data/bs.block/test/fill/random.mcfunction
similarity index 75%
rename from datapacks/Bookshelf/data/bs.block/test/fill/random.mcfunction
rename to modules/bs.block/data/bs.block/test/fill/random.mcfunction
index 39b7e57b5e..4f26d00b44 100644
--- a/datapacks/Bookshelf/data/bs.block/test/fill/random.mcfunction
+++ b/modules/bs.block/data/bs.block/test/fill/random.mcfunction
@@ -1,5 +1,17 @@
-# Fill a region with a random block or type
-# @batch bs.block
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
fill ~1 ~ ~-1 ~1 ~1 ~1 minecraft:oak_stairs[facing=west]
fill ~-1 ~ ~-1 ~-1 ~1 ~1 minecraft:oak_stairs[facing=east]
diff --git a/modules/bs.block/data/bs.block/test/fill/type.mcfunction b/modules/bs.block/data/bs.block/test/fill/type.mcfunction
new file mode 100644
index 0000000000..dd009ef500
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/fill/type.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~ ~ ~ minecraft:oak_stairs[facing=west]
+setblock ~1 ~ ~ minecraft:oak_stairs[facing=south]
+
+data modify storage bs:in block.fill_type set value {type:"minecraft:spruce_stairs",from:"~ ~ ~",to:"~1 ~ ~"}
+function #bs.block:fill_type
+
+assert block ~ ~ ~ minecraft:spruce_stairs[facing=west]
+assert block ~1 ~ ~ minecraft:spruce_stairs[facing=south]
diff --git a/modules/bs.block/data/bs.block/test/get/block.mcfunction b/modules/bs.block/data/bs.block/test/get/block.mcfunction
new file mode 100644
index 0000000000..b807c3c98f
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/get/block.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
+function #bs.block:get_block
+
+assert data storage bs:out block{ block: "minecraft:stone_stairs[shape=straight,half=top,facing=west,waterlogged=false,]", type: "minecraft:stone_stairs", state: "[shape=straight,half=top,facing=west,waterlogged=false,]", properties: { facing: "west", half: "top", shape: "straight", waterlogged: "false" } }
+
+setblock ~ ~ ~ minecraft:campfire
+function #bs.block:get_block
+
+assert data storage bs:out block.block
diff --git a/modules/bs.block/data/bs.block/test/get/type.mcfunction b/modules/bs.block/data/bs.block/test/get/type.mcfunction
new file mode 100644
index 0000000000..9f83ffdd5e
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/get/type.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
+function #bs.block:get_type
+
+assert data storage bs:out block{ block: "minecraft:stone_stairs", type: "minecraft:stone_stairs", state: "", properties: {} }
diff --git a/modules/bs.block/data/bs.block/test/lookup/item.mcfunction b/modules/bs.block/data/bs.block/test/lookup/item.mcfunction
new file mode 100644
index 0000000000..f068dfe887
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/lookup/item.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.block:lookup_item {item:"minecraft:stone"}
+assert data storage bs:out block{block:"minecraft:stone",type:"minecraft:stone"}
+
+function #bs.block:lookup_item {item:"minecraft:carrot"}
+assert data storage bs:out block{block:"minecraft:carrots",type:"minecraft:carrots"}
diff --git a/modules/bs.block/data/bs.block/test/lookup/type.mcfunction b/modules/bs.block/data/bs.block/test/lookup/type.mcfunction
new file mode 100644
index 0000000000..2fd77134d4
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/lookup/type.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.block:lookup_type {type:"minecraft:stone"}
+assert data storage bs:out block{block:"minecraft:stone"}
+
+function #bs.block:lookup_type {type:"minecraft:carrots"}
+assert data storage bs:out block{block:"minecraft:carrots",item:"minecraft:carrot"}
diff --git a/modules/bs.block/data/bs.block/test/match.mcfunction b/modules/bs.block/data/bs.block/test/match.mcfunction
new file mode 100644
index 0000000000..d40027d7f6
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/match.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~ ~ ~ minecraft:bookshelf
+data modify storage bs:in block.match.block set value "minecraft:bookshelf"
+execute unless function #bs.block:match run fail "Fail to match the given block"
diff --git a/modules/bs.block/data/bs.block/test/produce/block_display.mcfunction b/modules/bs.block/data/bs.block/test/produce/block_display.mcfunction
new file mode 100644
index 0000000000..930428708e
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/produce/block_display.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:in block.spawn_block_display.type set value "minecraft:bookshelf"
+data modify storage bs:in block.spawn_block_display.extra_nbt set value {Tags:["bs.packtest"]}
+function #bs.block:spawn_block_display
+
+assert entity @e[type=minecraft:block_display,tag=bs.packtest] inside
diff --git a/modules/bs.block/data/bs.block/test/produce/emit_block_particle.mcfunction b/modules/bs.block/data/bs.block/test/produce/emit_block_particle.mcfunction
new file mode 100644
index 0000000000..093f4e6ae4
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/produce/emit_block_particle.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:in block.emit_block_particle.type set value "minecraft:bookshelf"
+data modify storage bs:in block.emit_block_particle merge value { delta: "0 0 0", speed: 5, count: 30, properties: {}}
+
+function #bs.block:emit_block_particle
diff --git a/modules/bs.block/data/bs.block/test/produce/falling_block.mcfunction b/modules/bs.block/data/bs.block/test/produce/falling_block.mcfunction
new file mode 100644
index 0000000000..b394206620
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/produce/falling_block.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:in block.spawn_falling_block.type set value "minecraft:bookshelf"
+data modify storage bs:in block.spawn_falling_block.extra_nbt set value {Tags:["bs.packtest"]}
+function #bs.block:spawn_falling_block
+
+assert entity @e[type=minecraft:falling_block,tag=bs.packtest] inside
diff --git a/modules/bs.block/data/bs.block/test/produce/solid_block_display.mcfunction b/modules/bs.block/data/bs.block/test/produce/solid_block_display.mcfunction
new file mode 100644
index 0000000000..40ea8476ef
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/produce/solid_block_display.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:in block.spawn_solid_block_display.type set value "minecraft:bookshelf"
+data modify storage bs:in block.spawn_solid_block_display.extra_nbt set value {Tags:["bs.packtest"]}
+function #bs.block:spawn_solid_block_display
+execute as @e[type=minecraft:block_display,tag=bs.packtest] on passengers at @s positioned ~ ~ ~.4 run tag @s[dx=0] add bs.packtest.hitbox
+
+assert entity @e[type=minecraft:block_display,tag=bs.packtest] inside
+assert entity @e[type=!minecraft:block_display,tag=bs.packtest.hitbox] inside
diff --git a/modules/bs.block/data/bs.block/test/set/block.mcfunction b/modules/bs.block/data/bs.block/test/set/block.mcfunction
new file mode 100644
index 0000000000..ef6caad16c
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/set/block.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
+data modify storage bs:in block.set_block set value {block:"minecraft:oak_stairs"}
+function #bs.block:set_block
+
+assert block ~ ~ ~ minecraft:oak_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]
diff --git a/modules/bs.block/data/bs.block/test/set/type.mcfunction b/modules/bs.block/data/bs.block/test/set/type.mcfunction
new file mode 100644
index 0000000000..48df782b64
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/set/type.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
+data modify storage bs:in block.set_type set value {type:"minecraft:oak_stairs"}
+function #bs.block:set_type
+
+assert block ~ ~ ~ minecraft:oak_stairs[facing=west,half=top,shape=straight,waterlogged=false]
diff --git a/modules/bs.block/data/bs.block/test/transform/keep_properties.mcfunction b/modules/bs.block/data/bs.block/test/transform/keep_properties.mcfunction
new file mode 100644
index 0000000000..32ef3ccd25
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/transform/keep_properties.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
+function #bs.block:get_block
+function #bs.block:keep_properties {properties:[{name:"facing"},{name:"shape"}]}
+
+assert data storage bs:out block{ block: "minecraft:stone_stairs[shape=straight,facing=west,]", type: "minecraft:stone_stairs", state: "[shape=straight,facing=west,]", properties: { facing: "west", shape: "straight" } }
diff --git a/modules/bs.block/data/bs.block/test/transform/map_type.mcfunction b/modules/bs.block/data/bs.block/test/transform/map_type.mcfunction
new file mode 100644
index 0000000000..01c5c70561
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/transform/map_type.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~ ~ ~ minecraft:spruce_stairs[facing=west,half=top,shape=straight,waterlogged=false]
+function #bs.block:get_block
+
+function #bs.block:map_type {type:"minecraft:oak_planks",mapping_registry:"bs.shapes"}
+assert data storage bs:out block{ block: "minecraft:oak_stairs[shape=straight,half=top,facing=west,waterlogged=false,]" }
+
+function #bs.block:map_type {type:"minecraft:spruce_planks",mapping_registry:"bs.shapes"}
+assert data storage bs:out block{ block: "minecraft:spruce_stairs[shape=straight,half=top,facing=west,waterlogged=false,]" }
diff --git a/modules/bs.block/data/bs.block/test/transform/merge_properties.mcfunction b/modules/bs.block/data/bs.block/test/transform/merge_properties.mcfunction
new file mode 100644
index 0000000000..1ae2a59861
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/transform/merge_properties.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
+function #bs.block:get_block
+setblock ~ ~ ~ minecraft:furnace[facing=north]
+function #bs.block:merge_properties {properties:[{name:"facing"}]}
+
+assert data storage bs:out block{ block: "minecraft:stone_stairs[shape=straight,half=top,facing=north,waterlogged=false,]", type: "minecraft:stone_stairs", state: "[shape=straight,half=top,facing=north,waterlogged=false,]", properties: { facing: "north", half: "top", shape: "straight", waterlogged: "false" } }
diff --git a/modules/bs.block/data/bs.block/test/transform/mix_type.mcfunction b/modules/bs.block/data/bs.block/test/transform/mix_type.mcfunction
new file mode 100644
index 0000000000..5bde09e243
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/transform/mix_type.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~ ~ ~ minecraft:mossy_stone_bricks
+function #bs.block:get_block
+
+function #bs.block:mix_type {type:"minecraft:cobblestone",mapping_registry:"bs.shapes"}
+assert data storage bs:out block{ block: "minecraft:mossy_cobblestone" }
+
+setblock ~ ~ ~ minecraft:mossy_cobblestone
+function #bs.block:get_block
+
+function #bs.block:mix_type {type:"minecraft:stone_bricks",mapping_registry:"bs.shapes"}
+assert data storage bs:out block{ block: "minecraft:mossy_stone_bricks" }
diff --git a/modules/bs.block/data/bs.block/test/transform/remove_properties.mcfunction b/modules/bs.block/data/bs.block/test/transform/remove_properties.mcfunction
new file mode 100644
index 0000000000..a9d58d8634
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/transform/remove_properties.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
+function #bs.block:get_block
+function #bs.block:remove_properties {properties:[{name:"facing"},{name:"shape"}]}
+
+assert data storage bs:out block{ block: "minecraft:stone_stairs[half=top,waterlogged=false,]", type: "minecraft:stone_stairs", state: "[half=top,waterlogged=false,]", properties: { half: "top", waterlogged: "false" } }
diff --git a/modules/bs.block/data/bs.block/test/transform/replace_properties.mcfunction b/modules/bs.block/data/bs.block/test/transform/replace_properties.mcfunction
new file mode 100644
index 0000000000..7a1a631fc1
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/transform/replace_properties.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
+function #bs.block:get_block
+function #bs.block:replace_properties {properties:[{name:"facing",value:"north"}]}
+
+assert data storage bs:out block{ block: "minecraft:stone_stairs[shape=straight,half=top,facing=north,waterlogged=false,]", type: "minecraft:stone_stairs", state: "[shape=straight,half=top,facing=north,waterlogged=false,]", properties: { facing: "north", half: "top", shape: "straight", waterlogged: "false" } }
diff --git a/modules/bs.block/data/bs.block/test/transform/replace_type.mcfunction b/modules/bs.block/data/bs.block/test/transform/replace_type.mcfunction
new file mode 100644
index 0000000000..9d3ded6058
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/transform/replace_type.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
+function #bs.block:get_block
+
+function #bs.block:replace_type {type:"minecraft:spruce_stairs"}
+assert data storage bs:out block{ block: "minecraft:spruce_stairs[shape=straight,half=top,facing=west,waterlogged=false,]", type: "minecraft:spruce_stairs", state: "[shape=straight,half=top,facing=west,waterlogged=false,]", properties: { facing: "west", half: "top", shape: "straight", waterlogged: "false" } }
+
+function #bs.block:replace_type {type:"minecraft:stone"}
+assert data storage bs:out block{ block: "minecraft:stone", type: "minecraft:stone", state: "", properties: {} }
diff --git a/modules/bs.block/data/bs.block/test/transform/shift_properties.mcfunction b/modules/bs.block/data/bs.block/test/transform/shift_properties.mcfunction
new file mode 100644
index 0000000000..30ef0e9d4b
--- /dev/null
+++ b/modules/bs.block/data/bs.block/test/transform/shift_properties.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~ ~ ~ minecraft:stone_stairs[facing=west,half=top,shape=straight,waterlogged=false]
+function #bs.block:get_block
+function #bs.block:shift_properties {properties:[{name:"facing",by:2}]}
+
+assert data storage bs:out block{ block: "minecraft:stone_stairs[shape=straight,half=top,facing=north,waterlogged=false,]", type: "minecraft:stone_stairs", state: "[shape=straight,half=top,facing=north,waterlogged=false,]", properties: { facing: "north", half: "top", shape: "straight", waterlogged: "false" } }
diff --git a/modules/bs.block/gen_blocks.py b/modules/bs.block/gen_blocks.py
new file mode 100644
index 0000000000..d7c068a154
--- /dev/null
+++ b/modules/bs.block/gen_blocks.py
@@ -0,0 +1,289 @@
+from bisect import insort
+from collections import Counter
+from datetime import datetime, timezone
+from itertools import chain, permutations
+
+import numpy as np
+from beet import BlockTag, Context, Function, LootTable
+from pydantic import BaseModel
+
+from core.common.helpers import (
+ cache_result,
+ download_and_parse_json,
+ gen_loot_table_tree,
+ matching_len,
+ render_snbt,
+ with_prefix,
+)
+from core.definitions import (
+ BLOCKS_URL,
+ ITEMS_URL,
+ MINECRAFT_VERSIONS,
+ SPECIAL_ITEMS,
+)
+
+type StrDict = dict[str, str]
+type StatesDict = dict[str, list[str]]
+type StatesTuple = tuple[tuple[str, tuple[str, ...]], ...]
+type RawBlocks = dict[str, tuple[StatesDict, StrDict]]
+
+class Block(BaseModel):
+ """Represents a Minecraft block."""
+
+ type: str
+ item: str | None
+ group: int
+ states: list["State"]
+
+class State(BaseModel):
+ """Represents the state of a Minecraft block within a sequence."""
+
+ id: int
+ name: str
+ options: list[str]
+ sequence_index: int
+ sequence_ref: int | None
+
+
+def beet_default(ctx: Context) -> None:
+ """Generate files used by the bs.block module."""
+ ctx.template.add_package(__name__)
+ namespace = ctx.directory.name
+ blocks = get_blocks(ctx, version := MINECRAFT_VERSIONS[-1])
+
+ with ctx.override(generate_namespace=namespace):
+ ctx.generate("has_state", gen_has_state_block_tag(blocks, version))
+
+ ctx.generate("get/get_type", gen_get_type_loot_table(blocks))
+ ctx.generate("get/get_block", gen_get_block_loot_table(blocks, namespace))
+ for s in {s.id: s for b in blocks for s in b.states}.values():
+ ctx.generate(f"get/{s.id}", gen_get_state_loot_table(s, namespace))
+
+ ctx.generate("import/types_table",
+ types=render_snbt({
+ b.type: b.model_dump(exclude={"states"})
+ for b in blocks
+ }),
+ render=Function(source_path="types_table.jinja"),
+ )
+ ctx.generate("import/items_table",
+ items=render_snbt({
+ b.item: b.model_dump(exclude={"states"})
+ for b in reversed(blocks)
+ }),
+ render=Function(source_path="items_table.jinja"),
+ )
+ ctx.generate("import/groups_table",
+ groups=render_snbt(format_groups_table(blocks)),
+ render=Function(source_path="groups_table.jinja"),
+ )
+
+
+def get_blocks(ctx: Context, version: str) -> list[Block]:
+ """Retrieve and optimizes blocks for the given version."""
+ cache = ctx.cache[f"version/{version}"]
+
+ @cache_result(cache, "blocks.json")
+ def get_optimized_blocks() -> list:
+ raw_blocks = download_and_parse_json(cache, BLOCKS_URL.format(version))
+ if not isinstance(raw_blocks, dict):
+ error_msg = f"Expected a dict, but got {type(raw_blocks)}"
+ raise TypeError(error_msg)
+
+ raw_items = download_and_parse_json(cache, ITEMS_URL.format(version))
+ if not isinstance(raw_items, list):
+ error_msg = f"Expected a list, but got {type(raw_items)}"
+ raise TypeError(error_msg)
+
+ items = {
+ with_prefix(item): with_prefix(item)
+ for item in raw_items
+ } | SPECIAL_ITEMS
+ return group_and_optimize_blocks(raw_blocks, items)
+
+ return [Block.model_validate(data) for data in get_optimized_blocks()]
+
+
+def group_and_optimize_blocks(raw_blocks: RawBlocks, items: StrDict) -> list:
+ """Group blocks and optimizes block state sequences."""
+ blocks: list[dict] = []
+ groups: dict[StatesTuple, int] = {(): 0}
+
+ for block, (states, properties) in raw_blocks.items():
+ ordered_states = reorder_states_options(states, properties)
+ insort(blocks, {
+ "type": with_prefix(block),
+ "item": items.get(with_prefix(block)),
+ "group": groups.setdefault(ordered_states, len(groups)),
+ }, key=lambda x: x["group"])
+
+ optimized_groups = optimize_states_sequences(list(groups.keys()))
+ return [{**block, "states": optimized_groups[block["group"]]} for block in blocks]
+
+
+def reorder_states_options(states: StatesDict, properties: StrDict) -> StatesTuple:
+ """Roll options to ensure the default state value appears first."""
+ return tuple(
+ (name, tuple(np.roll(options, -options.index(properties[name]))))
+ for name, options in sorted(states.items())
+ )
+
+
+def optimize_states_sequences(groups: list[StatesTuple]) -> list[list[dict]]:
+ """Optimize block state sequences by sorting and assigning unique IDs."""
+ sequence_map = {}
+ optimized_groups = []
+ next_id = 1
+
+ for group, states in zip(groups, get_best_sequences(groups), strict=True):
+ ref = None
+ sequence: StatesTuple = ()
+ optimized_group = []
+ for state in states:
+ sequence += (state,)
+ if sequence not in sequence_map:
+ sequence_map[sequence] = next_id
+ next_id += 1
+
+ optimized_group.append({
+ "id": sequence_map[sequence],
+ "name": state[0],
+ "options": next(x[1] for x in group if x[0] == state[0]),
+ "sequence_index": len(sequence) - 1,
+ "sequence_ref": ref,
+ })
+ ref = sequence_map[sequence]
+
+ optimized_groups.append(optimized_group)
+
+ return optimized_groups
+
+
+def get_best_sequences(groups: list[StatesTuple]) -> list[StatesTuple]:
+ """Find the most optimal state sequences based on frequency and matching lengths."""
+ sorted_groups = [[(n, tuple(sorted(o))) for n, o in s] for s in groups]
+ counter = Counter(chain.from_iterable(sorted_groups))
+
+ sequences_perms: list[list[StatesTuple]] = [[
+ perm + tuple(s for s in states if counter[s] <= 1)
+ for perm in permutations([s for s in states if counter[s] > 1])
+ ] for states in sorted_groups]
+
+ sequences: list[StatesTuple] = []
+ while sequences_perms:
+ sequences.append(max(sequences_perms.pop(0), key=lambda seqs:
+ sum(matching_len(seqs, seq) for seq in sequences) + sum(
+ max(matching_len(seqs, seq) for seq in remaining_seqs)
+ for remaining_seqs in sequences_perms
+ ),
+ ))
+
+ return sequences
+
+
+def format_block_entry(entry: dict, block: Block) -> dict:
+ """Format a block entry for a loot table."""
+ return {
+ **entry,
+ "functions": [{
+ "function": "set_custom_data",
+ "tag": render_snbt(block.model_dump(exclude={"states"})),
+ }],
+ }
+
+
+def format_state_entry(entry: dict, option: str, state: State) -> dict:
+ """Format a state entry for a loot table."""
+ return {
+ **entry,
+ "functions": [{
+ "function": "set_custom_data",
+ "tag": render_snbt({
+ "properties": {state.name: option},
+ "_": {state.sequence_index: f"{state.name}={option},"},
+ }),
+ }],
+ "conditions": [{
+ "condition": "location_check",
+ "predicate": {"block": {"state": {state.name: option}}},
+ }],
+ }
+
+
+def format_groups_table(blocks: list[Block]) -> dict:
+ """Organize block states groups into a structured format."""
+ return {
+ block.group: [{
+ "i": state.sequence_index,
+ "n": state.name,
+ "o": [{
+ "i": idx,
+ "v": value,
+ "p": {state.name: value},
+ "s": {state.sequence_index: f"{state.name}={value},"},
+ } for idx, value in enumerate(state.options)],
+ } for state in block.states]
+ for block in blocks
+ }
+
+
+def gen_get_type_loot_table(blocks: list[Block]) -> LootTable:
+ """Generate a loot table to retrieve block types."""
+ return LootTable(
+ gen_loot_table_tree(blocks, lambda block: format_block_entry({
+ "type": "item",
+ "name": "egg",
+ }, block), lambda blocks: [{
+ "condition": "location_check",
+ "predicate": {"block": {"blocks": [b.type[10:] for b in blocks]}},
+ }]),
+ )
+
+
+def gen_get_block_loot_table(blocks: list[Block], namespace: str) -> LootTable:
+ """Generate a loot table to retrieve block data."""
+ return LootTable(
+ gen_loot_table_tree(blocks, lambda block: format_block_entry({
+ "type": "item",
+ "name": "egg",
+ } if block.group == 0 else {
+ "type": "loot_table",
+ "value": f"{namespace}:get/{block.states[-1].id}",
+ }, block), lambda blocks: [{
+ "condition": "location_check",
+ "predicate": {"block": {"blocks": [b.type[10:] for b in blocks]}},
+ }]),
+ )
+
+
+def gen_get_state_loot_table(state: State, namespace: str) -> LootTable:
+ """Generate a loot table to retrieve a single block state property."""
+ return LootTable(
+ {"pools": [{"rolls": 1, "entries": [{"type": "alternatives","children":[
+ format_state_entry({
+ "type": "loot_table",
+ "value": f"{namespace}:get/{state.sequence_ref}",
+ } if state.sequence_ref else {
+ "type": "item",
+ "name": "egg",
+ }, option, state)
+ for option in state.options
+ ]}]}]},
+ )
+
+
+def gen_has_state_block_tag(blocks: list[Block], version: str) -> BlockTag:
+ """Generate a block tag for blocks with states."""
+ return BlockTag({
+ "__bookshelf__": {
+ "feature": True,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html#has-state",
+ "authors": ["Aksiome"],
+ "created": {"date": "2024/01/15", "minecraft_version": "1.20.5"},
+ "updated": {
+ "date": datetime.now(timezone.utc).strftime("%Y/%m/%d"),
+ "minecraft_version": version,
+ },
+ },
+ "values": [b.type for b in blocks if b.group > 0],
+ })
diff --git a/modules/bs.block/module.json b/modules/bs.block/module.json
new file mode 100644
index 0000000000..7d6059fb72
--- /dev/null
+++ b/modules/bs.block/module.json
@@ -0,0 +1,17 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.block",
+ "load": "."
+ },
+ "meta": {
+ "name": "Block",
+ "slug": "bookshelf-block",
+ "description": "Manage blocks, including states and NBTs, while offering advanced tools for seamless transformations.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/block.html",
+ "tags": ["default"]
+ },
+ "pipeline": [
+ "gen_blocks"
+ ]
+}
diff --git a/modules/bs.block/templates/groups_table.jinja b/modules/bs.block/templates/groups_table.jinja
new file mode 100644
index 0000000000..4d0d590dd3
--- /dev/null
+++ b/modules/bs.block/templates/groups_table.jinja
@@ -0,0 +1,3 @@
+{% include 'core/header.jinja' %}
+# This file was automatically generated, do not edit it
+data modify storage bs:const block.groups set value {{ groups }}
diff --git a/modules/bs.block/templates/items_table.jinja b/modules/bs.block/templates/items_table.jinja
new file mode 100644
index 0000000000..4590cea78e
--- /dev/null
+++ b/modules/bs.block/templates/items_table.jinja
@@ -0,0 +1,3 @@
+{% include 'core/header.jinja' %}
+# This file was automatically generated, do not edit it
+data modify storage bs:const block.items set value {{ items }}
diff --git a/modules/bs.block/templates/types_table.jinja b/modules/bs.block/templates/types_table.jinja
new file mode 100644
index 0000000000..98f543e28e
--- /dev/null
+++ b/modules/bs.block/templates/types_table.jinja
@@ -0,0 +1,3 @@
+{% include 'core/header.jinja' %}
+# This file was automatically generated, do not edit it
+data modify storage bs:const block.types set value {{ types }}
diff --git a/modules/bs.color/README.md b/modules/bs.color/README.md
new file mode 100644
index 0000000000..7c7bef24b6
--- /dev/null
+++ b/modules/bs.color/README.md
@@ -0,0 +1,14 @@
+# 🎨 Bookshelf Color
+
+This datapack facilitate color conversion between various formats.
+
+> “Color helps to express light, not the physical phenomenon, but the only light that really exists, that in the artist’s brain.”
+>
+> -- Henri Matisse
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/color.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.color/data/bs.color/function/__load__.mcfunction b/modules/bs.color/data/bs.color/function/__load__.mcfunction
new file mode 100644
index 0000000000..eee8b2033e
--- /dev/null
+++ b/modules/bs.color/data/bs.color/function/__load__.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
+
+scoreboard players set 256 bs.const 256
+scoreboard players set 65536 bs.const 65536
+
+data modify storage bs:const color.hex_chars set value ["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f","50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f","60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f","70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f","80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f","90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df","e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff"]
+data modify storage bs:const color.hex_values set value {00:0,01:1,02:2,03:3,04:4,05:5,06:6,07:7,08:8,09:9,0a:10,0b:11,0c:12,0d:13,0e:14,0f:15,0A:10,0B:11,0C:12,0D:13,0E:14,0F:15,10:16,11:17,12:18,13:19,14:20,15:21,16:22,17:23,18:24,19:25,1a:26,1b:27,1c:28,1d:29,1e:30,1f:31,1A:26,1B:27,1C:28,1D:29,1E:30,1F:31,20:32,21:33,22:34,23:35,24:36,25:37,26:38,27:39,28:40,29:41,2a:42,2b:43,2c:44,2d:45,2e:46,2f:47,2A:42,2B:43,2C:44,2D:45,2E:46,2F:47,30:48,31:49,32:50,33:51,34:52,35:53,36:54,37:55,38:56,39:57,3a:58,3b:59,3c:60,3d:61,3e:62,3f:63,3A:58,3B:59,3C:60,3D:61,3E:62,3F:63,40:64,41:65,42:66,43:67,44:68,45:69,46:70,47:71,48:72,49:73,4a:74,4b:75,4c:76,4d:77,4e:78,4f:79,4A:74,4B:75,4C:76,4D:77,4E:78,4F:79,50:80,51:81,52:82,53:83,54:84,55:85,56:86,57:87,58:88,59:89,5a:90,5b:91,5c:92,5d:93,5e:94,5f:95,5A:90,5B:91,5C:92,5D:93,5E:94,5F:95,60:96,61:97,62:98,63:99,64:100,65:101,66:102,67:103,68:104,69:105,6a:106,6b:107,6c:108,6d:109,6e:110,6f:111,6A:106,6B:107,6C:108,6D:109,6E:110,6F:111,70:112,71:113,72:114,73:115,74:116,75:117,76:118,77:119,78:120,79:121,7a:122,7b:123,7c:124,7d:125,7e:126,7f:127,7A:122,7B:123,7C:124,7D:125,7E:126,7F:127,80:128,81:129,82:130,83:131,84:132,85:133,86:134,87:135,88:136,89:137,8a:138,8b:139,8c:140,8d:141,8e:142,8f:143,8A:138,8B:139,8C:140,8D:141,8E:142,8F:143,90:144,91:145,92:146,93:147,94:148,95:149,96:150,97:151,98:152,99:153,9a:154,9b:155,9c:156,9d:157,9e:158,9f:159,9A:154,9B:155,9C:156,9D:157,9E:158,9F:159,a0:160,a1:161,a2:162,a3:163,a4:164,a5:165,a6:166,a7:167,a8:168,a9:169,aa:170,ab:171,ac:172,ad:173,ae:174,af:175,b0:176,b1:177,b2:178,b3:179,b4:180,b5:181,b6:182,b7:183,b8:184,b9:185,ba:186,bb:187,bc:188,bd:189,be:190,bf:191,c0:192,c1:193,c2:194,c3:195,c4:196,c5:197,c6:198,c7:199,c8:200,c9:201,ca:202,cb:203,cc:204,cd:205,ce:206,cf:207,d0:208,d1:209,d2:210,d3:211,d4:212,d5:213,d6:214,d7:215,d8:216,d9:217,da:218,db:219,dc:220,dd:221,de:222,df:223,e0:224,e1:225,e2:226,e3:227,e4:228,e5:229,e6:230,e7:231,e8:232,e9:233,ea:234,eb:235,ec:236,ed:237,ee:238,ef:239,f0:240,f1:241,f2:242,f3:243,f4:244,f5:245,f6:246,f7:247,f8:248,f9:249,fa:250,fb:251,fc:252,fd:253,fe:254,ff:255,A1:161,A2:162,A3:163,A4:164,A5:165,A6:166,A7:167,A8:168,A9:169,AA:170,AB:171,AC:172,AD:173,AE:174,AF:175,B0:176,B1:177,B2:178,B3:179,B4:180,B5:181,B6:182,B7:183,B8:184,B9:185,BA:186,BB:187,BC:188,BD:189,BE:190,BF:191,C0:192,C1:193,C2:194,C3:195,C4:196,C5:197,C6:198,C7:199,C8:200,C9:201,CA:202,CB:203,CC:204,CD:205,CE:206,CF:207,D0:208,D1:209,D2:210,D3:211,D4:212,D5:213,D6:214,D7:215,D8:216,D9:217,DA:218,DB:219,DC:220,DD:221,DE:222,DF:223,E0:224,E1:225,E2:226,E3:227,E4:228,E5:229,E6:230,E7:231,E8:232,E9:233,EA:234,EB:235,EC:236,ED:237,EE:238,EF:239,F0:240,F1:241,F2:242,F3:243,F4:244,F5:245,F6:246,F7:247,F8:248,F9:249,FA:250,FB:251,FC:252,FD:253,FE:254,FF:255}
+
+execute unless data storage bs:out color.int_to_rgb run data modify storage bs:out color.int_to_rgb set value [0,0,0]
+execute unless data storage bs:out color.hex_to_rgb run data modify storage bs:out color.hex_to_rgb set value [0,0,0]
diff --git a/modules/bs.color/data/bs.color/function/__unload__.mcfunction b/modules/bs.color/data/bs.color/function/__unload__.mcfunction
new file mode 100644
index 0000000000..775a981b48
--- /dev/null
+++ b/modules/bs.color/data/bs.color/function/__unload__.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard objectives remove bs.const
+scoreboard objectives remove bs.ctx
+scoreboard objectives remove bs.out
+
+data remove storage bs:const color
+data remove storage bs:out color
diff --git a/modules/bs.color/data/bs.color/function/hex_to_int/convert_hexes.mcfunction b/modules/bs.color/data/bs.color/function/hex_to_int/convert_hexes.mcfunction
new file mode 100644
index 0000000000..3f24d4abeb
--- /dev/null
+++ b/modules/bs.color/data/bs.color/function/hex_to_int/convert_hexes.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result score $color.hex_to_int bs.out run data get storage bs:const color.hex_values.$(z)
+$execute store result score #r bs.ctx run data get storage bs:const color.hex_values.$(y)
+scoreboard players operation #r bs.ctx *= 256 bs.const
+scoreboard players operation $color.hex_to_int bs.out += #r bs.ctx
+$execute store result score #r bs.ctx run data get storage bs:const color.hex_values.$(x)
+scoreboard players operation #r bs.ctx *= 65536 bs.const
+execute store result storage bs:out color.hex_to_int int 1 run return run scoreboard players operation $color.hex_to_int bs.out += #r bs.ctx
diff --git a/modules/bs.color/data/bs.color/function/hex_to_int/hex_to_int.mcfunction b/modules/bs.color/data/bs.color/function/hex_to_int/hex_to_int.mcfunction
new file mode 100644
index 0000000000..2056586324
--- /dev/null
+++ b/modules/bs.color/data/bs.color/function/hex_to_int/hex_to_int.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:ctx _ set value '$(color)'
+data modify storage bs:ctx x set string storage bs:ctx _ 1 3
+data modify storage bs:ctx y set string storage bs:ctx _ 3 5
+data modify storage bs:ctx z set string storage bs:ctx _ 5 7
+
+return run function bs.color:hex_to_int/convert_hexes with storage bs:ctx
diff --git a/modules/bs.color/data/bs.color/function/hex_to_rgb/convert_hexes.mcfunction b/modules/bs.color/data/bs.color/function/hex_to_rgb/convert_hexes.mcfunction
new file mode 100644
index 0000000000..669f3c673c
--- /dev/null
+++ b/modules/bs.color/data/bs.color/function/hex_to_rgb/convert_hexes.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:out color.hex_to_rgb[0] int 1 store result score $color.hex_to_rgb.r bs.out run data get storage bs:const color.hex_values.$(x)
+$execute store result storage bs:out color.hex_to_rgb[1] int 1 store result score $color.hex_to_rgb.g bs.out run data get storage bs:const color.hex_values.$(y)
+$execute store result storage bs:out color.hex_to_rgb[2] int 1 store result score $color.hex_to_rgb.b bs.out run data get storage bs:const color.hex_values.$(z)
diff --git a/modules/bs.color/data/bs.color/function/hex_to_rgb/hex_to_rgb.mcfunction b/modules/bs.color/data/bs.color/function/hex_to_rgb/hex_to_rgb.mcfunction
new file mode 100644
index 0000000000..b7b9045a00
--- /dev/null
+++ b/modules/bs.color/data/bs.color/function/hex_to_rgb/hex_to_rgb.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:ctx _ set value '$(color)'
+data modify storage bs:ctx x set string storage bs:ctx _ 1 3
+data modify storage bs:ctx y set string storage bs:ctx _ 3 5
+data modify storage bs:ctx z set string storage bs:ctx _ 5 7
+
+return run function bs.color:hex_to_rgb/convert_hexes with storage bs:ctx
diff --git a/modules/bs.color/data/bs.color/function/int_to_hex/concat_hexes.mcfunction b/modules/bs.color/data/bs.color/function/int_to_hex/concat_hexes.mcfunction
new file mode 100644
index 0000000000..f9669727c7
--- /dev/null
+++ b/modules/bs.color/data/bs.color/function/int_to_hex/concat_hexes.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:out color.int_to_hex set value "#$(r)$(g)$(b)"
diff --git a/modules/bs.color/data/bs.color/function/int_to_hex/get_hexes.mcfunction b/modules/bs.color/data/bs.color/function/int_to_hex/get_hexes.mcfunction
new file mode 100644
index 0000000000..a9e2b8ee4c
--- /dev/null
+++ b/modules/bs.color/data/bs.color/function/int_to_hex/get_hexes.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx _ set value {r:"",g:"",b:""}
+$data modify storage bs:ctx _.r set from storage bs:const color.hex_chars[$(x)]
+$data modify storage bs:ctx _.g set from storage bs:const color.hex_chars[$(y)]
+$data modify storage bs:ctx _.b set from storage bs:const color.hex_chars[$(z)]
diff --git a/modules/bs.color/data/bs.color/function/int_to_hex/int_to_hex.mcfunction b/modules/bs.color/data/bs.color/function/int_to_hex/int_to_hex.mcfunction
new file mode 100644
index 0000000000..91a65ed0ef
--- /dev/null
+++ b/modules/bs.color/data/bs.color/function/int_to_hex/int_to_hex.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$scoreboard players set #c bs.ctx $(color)
+
+scoreboard players operation #r bs.ctx = #c bs.ctx
+scoreboard players operation #r bs.ctx /= 65536 bs.const
+scoreboard players operation #g bs.ctx = #c bs.ctx
+scoreboard players operation #g bs.ctx /= 256 bs.const
+scoreboard players operation #b bs.ctx = #c bs.ctx
+
+execute store result storage bs:ctx x int 1 run scoreboard players operation #r bs.ctx %= 256 bs.const
+execute store result storage bs:ctx y int 1 run scoreboard players operation #g bs.ctx %= 256 bs.const
+execute store result storage bs:ctx z int 1 run scoreboard players operation #b bs.ctx %= 256 bs.const
+
+function bs.color:int_to_hex/get_hexes with storage bs:ctx
+function bs.color:int_to_hex/concat_hexes with storage bs:ctx _
diff --git a/modules/bs.color/data/bs.color/function/int_to_rgb.mcfunction b/modules/bs.color/data/bs.color/function/int_to_rgb.mcfunction
new file mode 100644
index 0000000000..b9d30268b9
--- /dev/null
+++ b/modules/bs.color/data/bs.color/function/int_to_rgb.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$scoreboard players set #c bs.ctx $(color)
+
+scoreboard players operation $color.int_to_rgb.r bs.out = #c bs.ctx
+scoreboard players operation $color.int_to_rgb.r bs.out /= 65536 bs.const
+scoreboard players operation $color.int_to_rgb.g bs.out = #c bs.ctx
+scoreboard players operation $color.int_to_rgb.g bs.out /= 256 bs.const
+scoreboard players operation $color.int_to_rgb.b bs.out = #c bs.ctx
+
+execute store result storage bs:out color.int_to_rgb[0] int 1 run scoreboard players operation $color.int_to_rgb.r bs.out %= 256 bs.const
+execute store result storage bs:out color.int_to_rgb[1] int 1 run scoreboard players operation $color.int_to_rgb.g bs.out %= 256 bs.const
+execute store result storage bs:out color.int_to_rgb[2] int 1 run scoreboard players operation $color.int_to_rgb.b bs.out %= 256 bs.const
diff --git a/modules/bs.color/data/bs.color/function/rgb_to_hex/concat_hexes.mcfunction b/modules/bs.color/data/bs.color/function/rgb_to_hex/concat_hexes.mcfunction
new file mode 100644
index 0000000000..812fec7d73
--- /dev/null
+++ b/modules/bs.color/data/bs.color/function/rgb_to_hex/concat_hexes.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:out color.rgb_to_hex set value "#$(r)$(g)$(b)"
diff --git a/modules/bs.color/data/bs.color/function/rgb_to_hex/get_hexes.mcfunction b/modules/bs.color/data/bs.color/function/rgb_to_hex/get_hexes.mcfunction
new file mode 100644
index 0000000000..43ed00ba93
--- /dev/null
+++ b/modules/bs.color/data/bs.color/function/rgb_to_hex/get_hexes.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:ctx _.r set from storage bs:const color.hex_chars[$(x)]
+$data modify storage bs:ctx _.g set from storage bs:const color.hex_chars[$(y)]
+$data modify storage bs:ctx _.b set from storage bs:const color.hex_chars[$(z)]
diff --git a/modules/bs.color/data/bs.color/function/rgb_to_hex/rgb_to_hex.mcfunction b/modules/bs.color/data/bs.color/function/rgb_to_hex/rgb_to_hex.mcfunction
new file mode 100644
index 0000000000..8091405d6d
--- /dev/null
+++ b/modules/bs.color/data/bs.color/function/rgb_to_hex/rgb_to_hex.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:ctx _ set value {rgb:$(color)}
+
+data modify storage bs:ctx x set from storage bs:ctx _.rgb[0]
+data modify storage bs:ctx y set from storage bs:ctx _.rgb[1]
+data modify storage bs:ctx z set from storage bs:ctx _.rgb[2]
+
+function bs.color:rgb_to_hex/get_hexes with storage bs:ctx
+function bs.color:rgb_to_hex/concat_hexes with storage bs:ctx _
diff --git a/modules/bs.color/data/bs.color/function/rgb_to_int.mcfunction b/modules/bs.color/data/bs.color/function/rgb_to_int.mcfunction
new file mode 100644
index 0000000000..c0aab9ba00
--- /dev/null
+++ b/modules/bs.color/data/bs.color/function/rgb_to_int.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:ctx _ set value $(color)
+
+execute store result score #r bs.ctx run data get storage bs:ctx _[0]
+execute store result score #g bs.ctx run data get storage bs:ctx _[1]
+execute store result score #b bs.ctx run data get storage bs:ctx _[2]
+
+scoreboard players operation $color.rgb_to_int bs.out = #r bs.ctx
+scoreboard players operation $color.rgb_to_int bs.out *= 65536 bs.const
+scoreboard players operation #c bs.ctx = #g bs.ctx
+scoreboard players operation #c bs.ctx *= 256 bs.const
+scoreboard players operation $color.rgb_to_int bs.out += #c bs.ctx
+return run execute store result storage bs:out color.rgb_to_int int 1 run scoreboard players operation $color.rgb_to_int bs.out += #b bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.color/tags/function/hex_to_int.json b/modules/bs.color/data/bs.color/tags/function/hex_to_int.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.color/tags/function/hex_to_int.json
rename to modules/bs.color/data/bs.color/tags/function/hex_to_int.json
index 767da18282..60a4501d94 100644
--- a/datapacks/Bookshelf/data/bs.color/tags/function/hex_to_int.json
+++ b/modules/bs.color/data/bs.color/tags/function/hex_to_int.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/biome.html#get-biome",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/color.html#convert-to-int",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.color/tags/function/hex_to_rgb.json b/modules/bs.color/data/bs.color/tags/function/hex_to_rgb.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.color/tags/function/hex_to_rgb.json
rename to modules/bs.color/data/bs.color/tags/function/hex_to_rgb.json
index b74b572c5c..dd12f475fe 100644
--- a/datapacks/Bookshelf/data/bs.color/tags/function/hex_to_rgb.json
+++ b/modules/bs.color/data/bs.color/tags/function/hex_to_rgb.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-rgb",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/color.html#convert-to-rgb",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.color/tags/function/int_to_hex.json b/modules/bs.color/data/bs.color/tags/function/int_to_hex.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.color/tags/function/int_to_hex.json
rename to modules/bs.color/data/bs.color/tags/function/int_to_hex.json
index 0c1b0406ee..1303ff242c 100644
--- a/datapacks/Bookshelf/data/bs.color/tags/function/int_to_hex.json
+++ b/modules/bs.color/data/bs.color/tags/function/int_to_hex.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-hex",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/color.html#convert-to-hex",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.color/tags/function/int_to_rgb.json b/modules/bs.color/data/bs.color/tags/function/int_to_rgb.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.color/tags/function/int_to_rgb.json
rename to modules/bs.color/data/bs.color/tags/function/int_to_rgb.json
index 46db8edb99..fec5df736f 100644
--- a/datapacks/Bookshelf/data/bs.color/tags/function/int_to_rgb.json
+++ b/modules/bs.color/data/bs.color/tags/function/int_to_rgb.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-rgb",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/color.html#convert-to-rgb",
"authors": [
"theogiraudet"
],
diff --git a/datapacks/Bookshelf/data/bs.color/tags/function/rgb_to_hex.json b/modules/bs.color/data/bs.color/tags/function/rgb_to_hex.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.color/tags/function/rgb_to_hex.json
rename to modules/bs.color/data/bs.color/tags/function/rgb_to_hex.json
index 792d3080a6..d7c903ccef 100644
--- a/datapacks/Bookshelf/data/bs.color/tags/function/rgb_to_hex.json
+++ b/modules/bs.color/data/bs.color/tags/function/rgb_to_hex.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-hex",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/color.html#convert-to-hex",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.color/tags/function/rgb_to_int.json b/modules/bs.color/data/bs.color/tags/function/rgb_to_int.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.color/tags/function/rgb_to_int.json
rename to modules/bs.color/data/bs.color/tags/function/rgb_to_int.json
index 0c7b5ec74e..a359858152 100644
--- a/datapacks/Bookshelf/data/bs.color/tags/function/rgb_to_int.json
+++ b/modules/bs.color/data/bs.color/tags/function/rgb_to_int.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/color.html#convert-to-int",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/color.html#convert-to-int",
"authors": [
"theogiraudet"
],
diff --git a/modules/bs.color/data/bs.color/test/hex_to_int.mcfunction b/modules/bs.color/data/bs.color/test/hex_to_int.mcfunction
new file mode 100644
index 0000000000..5be01f9d52
--- /dev/null
+++ b/modules/bs.color/data/bs.color/test/hex_to_int.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #r bs.ctx run function #bs.color:hex_to_int {color:"#F26A3B"}
+assert data storage bs:out color{hex_to_int:15886907}
+assert score $color.hex_to_int bs.out matches 15886907
+assert score #r bs.ctx matches 15886907
+
+execute store result score #r bs.ctx run function #bs.color:hex_to_int {color:"#2AC855"}
+assert score #r bs.ctx matches 2803797
+
+execute store result score #r bs.ctx run function #bs.color:hex_to_int {color:"#5919C0"}
+assert score #r bs.ctx matches 5839296
diff --git a/modules/bs.color/data/bs.color/test/hex_to_rgb.mcfunction b/modules/bs.color/data/bs.color/test/hex_to_rgb.mcfunction
new file mode 100644
index 0000000000..0239af0b82
--- /dev/null
+++ b/modules/bs.color/data/bs.color/test/hex_to_rgb.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.color:hex_to_rgb {color:"#F26A3B"}
+assert score $color.hex_to_rgb.r bs.out matches 242
+assert score $color.hex_to_rgb.g bs.out matches 106
+assert score $color.hex_to_rgb.b bs.out matches 59
+assert data storage bs:out color{hex_to_rgb:[242,106,59]}
+
+function #bs.color:hex_to_rgb {color:"#2AC855"}
+assert data storage bs:out color{hex_to_rgb:[42,200,85]}
+
+function #bs.color:hex_to_rgb {color:"#5919C0"}
+assert data storage bs:out color{hex_to_rgb:[89,25,192]}
diff --git a/modules/bs.color/data/bs.color/test/int_to_hex.mcfunction b/modules/bs.color/data/bs.color/test/int_to_hex.mcfunction
new file mode 100644
index 0000000000..0db1ff27ac
--- /dev/null
+++ b/modules/bs.color/data/bs.color/test/int_to_hex.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.color:int_to_hex {color:15886907}
+assert data storage bs:out color{int_to_hex:"#f26a3b"}
+
+function #bs.color:int_to_hex {color:2803797}
+assert data storage bs:out color{int_to_hex:"#2ac855"}
+
+function #bs.color:int_to_hex {color:5839296}
+assert data storage bs:out color{int_to_hex:"#5919c0"}
diff --git a/modules/bs.color/data/bs.color/test/int_to_rgb.mcfunction b/modules/bs.color/data/bs.color/test/int_to_rgb.mcfunction
new file mode 100644
index 0000000000..8212baccfe
--- /dev/null
+++ b/modules/bs.color/data/bs.color/test/int_to_rgb.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.color:int_to_rgb {color:15886907}
+assert score $color.int_to_rgb.r bs.out matches 242
+assert score $color.int_to_rgb.g bs.out matches 106
+assert score $color.int_to_rgb.b bs.out matches 59
+assert data storage bs:out color{int_to_rgb:[242,106,59]}
+
+function #bs.color:int_to_rgb {color:2803797}
+assert data storage bs:out color{int_to_rgb:[42,200,85]}
+
+function #bs.color:int_to_rgb {color:5839296}
+assert data storage bs:out color{int_to_rgb:[89,25,192]}
diff --git a/modules/bs.color/data/bs.color/test/rgb_to_hex.mcfunction b/modules/bs.color/data/bs.color/test/rgb_to_hex.mcfunction
new file mode 100644
index 0000000000..2f37ec9539
--- /dev/null
+++ b/modules/bs.color/data/bs.color/test/rgb_to_hex.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.color:rgb_to_hex {color:[242,106,59]}
+assert data storage bs:out color{rgb_to_hex:"#f26a3b"}
+
+function #bs.color:rgb_to_hex {color:[42,200,85]}
+assert data storage bs:out color{rgb_to_hex:"#2ac855"}
+
+function #bs.color:rgb_to_hex {color:[89,25,192]}
+assert data storage bs:out color{rgb_to_hex:"#5919c0"}
diff --git a/modules/bs.color/data/bs.color/test/rgb_to_int.mcfunction b/modules/bs.color/data/bs.color/test/rgb_to_int.mcfunction
new file mode 100644
index 0000000000..3c79cad76b
--- /dev/null
+++ b/modules/bs.color/data/bs.color/test/rgb_to_int.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #r bs.ctx run function #bs.color:rgb_to_int {color:[242,106,59]}
+assert data storage bs:out color{rgb_to_int:15886907}
+assert score $color.rgb_to_int bs.out matches 15886907
+assert score #r bs.ctx matches 15886907
+
+execute store result score #r bs.ctx run function #bs.color:rgb_to_int {color:[42,200,85]}
+assert score #r bs.ctx matches 2803797
+
+execute store result score #r bs.ctx run function #bs.color:rgb_to_int {color:[89,25,192]}
+assert score #r bs.ctx matches 5839296
diff --git a/modules/bs.color/module.json b/modules/bs.color/module.json
new file mode 100644
index 0000000000..05784068ba
--- /dev/null
+++ b/modules/bs.color/module.json
@@ -0,0 +1,14 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.color",
+ "load": "."
+ },
+ "meta": {
+ "name": "Color",
+ "slug": "bookshelf-color",
+ "description": "Facilitate color conversion between various formats.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/color.html",
+ "tags": ["default"]
+ }
+}
diff --git a/modules/bs.dump/README.md b/modules/bs.dump/README.md
new file mode 100644
index 0000000000..e08ac77bd9
--- /dev/null
+++ b/modules/bs.dump/README.md
@@ -0,0 +1,10 @@
+# 🔬 Bookshelf Dump
+
+This datapack provides tools for printing the state of various "variables" (such as scores or NBT data), making it easier to debug and track values.
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/dump.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.dump/data/bs.dump/function/__load__.mcfunction b/modules/bs.dump/data/bs.dump/function/__load__.mcfunction
new file mode 100644
index 0000000000..7817bb6ed0
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/__load__.mcfunction
@@ -0,0 +1,32 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+forceload add -30000000 1600
+execute unless entity B5-0-0-0-2 run summon minecraft:text_display -30000000 0 1600 {UUID:[I;181,0,0,2],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],view_range:0f,alignment:"center"}
+
+scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
+scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
+
+scoreboard players set 3 bs.const 3
+
+data modify storage bs:const dump set value { \
+ key: "#3CE9F2", \
+ type: "#FB7F4A", \
+ string: "#6ED856", \
+ number: "#FFAA32", \
+ bracket_1: "#0099FF", \
+ bracket_2: "#FFD700", \
+ bracket_3: "#FF60FC", \
+}
diff --git a/modules/bs.dump/data/bs.dump/function/__unload__.mcfunction b/modules/bs.dump/data/bs.dump/function/__unload__.mcfunction
new file mode 100644
index 0000000000..dc03e1791c
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/__unload__.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+kill B5-0-0-0-2
+forceload remove -30000000 1600
+
+scoreboard objectives remove bs.const
+scoreboard objectives remove bs.data
+
+data remove storage bs:const dump
+data remove storage bs:data dump
+data remove storage bs:out dump
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/expand.mcfunction b/modules/bs.dump/data/bs.dump/function/expand.mcfunction
similarity index 97%
rename from datapacks/Bookshelf Dev/data/bs.dump/function/expand.mcfunction
rename to modules/bs.dump/data/bs.dump/function/expand.mcfunction
index 8733bfd1e7..2c865eea68 100644
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/expand.mcfunction
+++ b/modules/bs.dump/data/bs.dump/function/expand.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.dump/data/bs.dump/function/format/any.mcfunction b/modules/bs.dump/data/bs.dump/function/format/any.mcfunction
new file mode 100644
index 0000000000..036eb0c4c6
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/any.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute if data storage bs:data dump[-1].var[] run return run function bs.dump:format/array/array
+execute if data storage bs:data dump[-1].var{} run return run function bs.dump:format/compound/compound
+
+data modify storage bs:ctx _ set value [[0b],[0s],[0],[0l],[0f],[0d],[""]]
+execute store success score #dump.success bs.data run data modify storage bs:ctx _[] append from storage bs:data dump[-1].var
+execute if score #dump.success bs.data matches 1 unless data storage bs:ctx _[-1][1] run return run function bs.dump:format/number with storage bs:const dump
+execute if score #dump.success bs.data matches 1 run function bs.dump:format/string/string with storage bs:const dump
diff --git a/modules/bs.dump/data/bs.dump/function/format/array/array.mcfunction b/modules/bs.dump/data/bs.dump/function/format/array/array.mcfunction
new file mode 100644
index 0000000000..1aeb9807e3
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/array/array.mcfunction
@@ -0,0 +1,32 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #dump.count bs.data if data storage bs:data dump[-1].var[]
+execute store result score #dump.expand bs.data run data get storage bs:data dump[-1].expand
+
+execute if score #dump.count bs.data matches 0 run return run function bs.dump:format/array/empty
+execute if score #dump.count bs.data matches ..3 \
+ unless data storage bs:data dump[-1].var[][] \
+ unless data storage bs:data dump[-1].var[{}] \
+ run return run function bs.dump:format/array/compact/compact
+
+execute if score #dump.expand bs.data matches 0 run return run function bs.dump:format/array/collapse
+
+function bs.dump:format/bracket/open with storage bs:const dump
+function bs.dump:format/array/loop
+data modify storage bs:out dump append value '"\\n"'
+data modify storage bs:out dump append from storage bs:data dump[].indent
+data remove storage bs:out dump[-1]
+function bs.dump:format/bracket/close with storage bs:const dump
diff --git a/modules/bs.dump/data/bs.dump/function/format/array/collapse.mcfunction b/modules/bs.dump/data/bs.dump/function/format/array/collapse.mcfunction
new file mode 100644
index 0000000000..9da0a79aed
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/array/collapse.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function bs.dump:format/bracket/open with storage bs:const dump
+function bs.dump:format/collapse/collapse
+function bs.dump:format/bracket/close with storage bs:const dump
diff --git a/modules/bs.dump/data/bs.dump/function/format/array/compact/compact.mcfunction b/modules/bs.dump/data/bs.dump/function/format/array/compact/compact.mcfunction
new file mode 100644
index 0000000000..c2c3eabe9c
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/array/compact/compact.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function bs.dump:format/bracket/open with storage bs:const dump
+function bs.dump:format/array/compact/loop
+function bs.dump:format/bracket/close with storage bs:const dump
diff --git a/modules/bs.dump/data/bs.dump/function/format/array/compact/loop.mcfunction b/modules/bs.dump/data/bs.dump/function/format/array/compact/loop.mcfunction
new file mode 100644
index 0000000000..2ff6cffe0b
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/array/compact/loop.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data dump append from storage bs:data dump[-1]
+data modify storage bs:data dump[-1].var set from storage bs:data dump[-1].var[0]
+function bs.dump:format/any
+data remove storage bs:data dump[-1]
+data remove storage bs:data dump[-1].var[0]
+
+execute if data storage bs:data dump[-1].var[0] run data modify storage bs:out dump append value '", "'
+execute if data storage bs:data dump[-1].var[0] run function bs.dump:format/array/compact/loop
diff --git a/modules/bs.dump/data/bs.dump/function/format/array/empty.mcfunction b/modules/bs.dump/data/bs.dump/function/format/array/empty.mcfunction
new file mode 100644
index 0000000000..3edf2249bc
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/array/empty.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function bs.dump:format/bracket/open with storage bs:const dump
+function bs.dump:format/bracket/close with storage bs:const dump
diff --git a/modules/bs.dump/data/bs.dump/function/format/array/loop.mcfunction b/modules/bs.dump/data/bs.dump/function/format/array/loop.mcfunction
new file mode 100644
index 0000000000..47bc516e11
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/array/loop.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:out dump append value '"\\n"'
+data modify storage bs:out dump append from storage bs:data dump[].indent
+
+data modify storage bs:data dump append from storage bs:data dump[-1]
+data modify storage bs:data dump[-1].var set from storage bs:data dump[-1].var[0]
+execute store result storage bs:data dump[-1].expand int .99999999 run data get storage bs:data dump[-1].expand
+function bs.dump:format/any
+data remove storage bs:data dump[-1]
+data remove storage bs:data dump[-1].var[0]
+
+execute if data storage bs:data dump[-1].var[0] run data modify storage bs:out dump append value '", "'
+execute if data storage bs:data dump[-1].var[0] run function bs.dump:format/array/loop
diff --git a/modules/bs.dump/data/bs.dump/function/format/brace/close.mcfunction b/modules/bs.dump/data/bs.dump/function/format/brace/close.mcfunction
new file mode 100644
index 0000000000..7ab967d564
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/brace/close.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #dump.depth bs.data if data storage bs:data dump[]
+scoreboard players operation #dump.depth bs.data %= 3 bs.const
+
+$execute if score #dump.depth bs.data matches 0 run data modify storage bs:out dump append value '{"text":"}","color":"$(bracket_1)"}'
+$execute if score #dump.depth bs.data matches 1 run data modify storage bs:out dump append value '{"text":"}","color":"$(bracket_2)"}'
+$execute if score #dump.depth bs.data matches 2 run data modify storage bs:out dump append value '{"text":"}","color":"$(bracket_3)"}'
diff --git a/modules/bs.dump/data/bs.dump/function/format/brace/open.mcfunction b/modules/bs.dump/data/bs.dump/function/format/brace/open.mcfunction
new file mode 100644
index 0000000000..7351c606bf
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/brace/open.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #dump.depth bs.data if data storage bs:data dump[]
+scoreboard players operation #dump.depth bs.data %= 3 bs.const
+
+$execute if score #dump.depth bs.data matches 0 run data modify storage bs:out dump append value '{"text":"{","color":"$(bracket_1)"}'
+$execute if score #dump.depth bs.data matches 1 run data modify storage bs:out dump append value '{"text":"{","color":"$(bracket_2)"}'
+$execute if score #dump.depth bs.data matches 2 run data modify storage bs:out dump append value '{"text":"{","color":"$(bracket_3)"}'
diff --git a/modules/bs.dump/data/bs.dump/function/format/bracket/close.mcfunction b/modules/bs.dump/data/bs.dump/function/format/bracket/close.mcfunction
new file mode 100644
index 0000000000..004b6ccd9f
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/bracket/close.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #dump.depth bs.data if data storage bs:data dump[]
+scoreboard players operation #dump.depth bs.data %= 3 bs.const
+
+$execute if score #dump.depth bs.data matches 0 run data modify storage bs:out dump append value '{"text":"]","color":"$(bracket_1)"}'
+$execute if score #dump.depth bs.data matches 1 run data modify storage bs:out dump append value '{"text":"]","color":"$(bracket_2)"}'
+$execute if score #dump.depth bs.data matches 2 run data modify storage bs:out dump append value '{"text":"]","color":"$(bracket_3)"}'
diff --git a/modules/bs.dump/data/bs.dump/function/format/bracket/open.mcfunction b/modules/bs.dump/data/bs.dump/function/format/bracket/open.mcfunction
new file mode 100644
index 0000000000..393c6df0ac
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/bracket/open.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #dump.depth bs.data if data storage bs:data dump[]
+scoreboard players operation #dump.depth bs.data %= 3 bs.const
+
+$execute if score #dump.depth bs.data matches 0 run data modify storage bs:out dump append value '{"text":"[","color":"$(bracket_1)"}'
+$execute if score #dump.depth bs.data matches 1 run data modify storage bs:out dump append value '{"text":"[","color":"$(bracket_2)"}'
+$execute if score #dump.depth bs.data matches 2 run data modify storage bs:out dump append value '{"text":"[","color":"$(bracket_3)"}'
diff --git a/modules/bs.dump/data/bs.dump/function/format/collapse/collapse.mcfunction b/modules/bs.dump/data/bs.dump/function/format/collapse/collapse.mcfunction
new file mode 100644
index 0000000000..22ce3384cc
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/collapse/collapse.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify entity B5-0-0-0-2 text set value '{"storage":"bs:data","nbt":"dump[-1].var"}'
+data modify entity B5-0-0-0-2 text set value '{"entity":"B5-0-0-0-2","nbt":"text"}'
+data modify storage bs:data dump[-1].var set from entity B5-0-0-0-2 text
+data modify storage bs:data dump[-1].var set string storage bs:data dump[-1].var 3 -3
+function bs.dump:format/collapse/event with storage bs:data dump[-1]
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/collapse/event.mcfunction b/modules/bs.dump/data/bs.dump/function/format/collapse/event.mcfunction
similarity index 98%
rename from datapacks/Bookshelf Dev/data/bs.dump/function/format/collapse/event.mcfunction
rename to modules/bs.dump/data/bs.dump/function/format/collapse/event.mcfunction
index 2829421930..f1a04959bf 100644
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/collapse/event.mcfunction
+++ b/modules/bs.dump/data/bs.dump/function/format/collapse/event.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.dump/data/bs.dump/function/format/compound/collapse.mcfunction b/modules/bs.dump/data/bs.dump/function/format/compound/collapse.mcfunction
new file mode 100644
index 0000000000..5566a6c5e8
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/compound/collapse.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function bs.dump:format/brace/open with storage bs:const dump
+function bs.dump:format/collapse/collapse
+function bs.dump:format/brace/close with storage bs:const dump
diff --git a/modules/bs.dump/data/bs.dump/function/format/compound/compound.mcfunction b/modules/bs.dump/data/bs.dump/function/format/compound/compound.mcfunction
new file mode 100644
index 0000000000..2fdfe2737d
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/compound/compound.mcfunction
@@ -0,0 +1,28 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #dump.count bs.data run data get storage bs:data dump[-1].var
+execute store result score #dump.expand bs.data run data get storage bs:data dump[-1].expand
+
+execute if score #dump.count bs.data matches 0 run return run function bs.dump:format/compound/empty
+execute if score #dump.expand bs.data matches 0 run return run function bs.dump:format/compound/collapse
+
+function bs.dump:format/brace/open with storage bs:const dump
+function bs.dump:key/get
+function bs.dump:format/compound/loop with storage bs:data dump[-1]
+data modify storage bs:out dump append value '"\\n"'
+data modify storage bs:out dump append from storage bs:data dump[].indent
+data remove storage bs:out dump[-1]
+function bs.dump:format/brace/close with storage bs:const dump
diff --git a/modules/bs.dump/data/bs.dump/function/format/compound/empty.mcfunction b/modules/bs.dump/data/bs.dump/function/format/compound/empty.mcfunction
new file mode 100644
index 0000000000..fd94344b5a
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/compound/empty.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function bs.dump:format/brace/open with storage bs:const dump
+function bs.dump:format/brace/close with storage bs:const dump
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/compound/key.mcfunction b/modules/bs.dump/data/bs.dump/function/format/compound/key.mcfunction
similarity index 98%
rename from datapacks/Bookshelf Dev/data/bs.dump/function/format/compound/key.mcfunction
rename to modules/bs.dump/data/bs.dump/function/format/compound/key.mcfunction
index 9cff045bc5..99a891637f 100644
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/compound/key.mcfunction
+++ b/modules/bs.dump/data/bs.dump/function/format/compound/key.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.dump/data/bs.dump/function/format/compound/loop.mcfunction b/modules/bs.dump/data/bs.dump/function/format/compound/loop.mcfunction
new file mode 100644
index 0000000000..058fe1ea19
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/compound/loop.mcfunction
@@ -0,0 +1,30 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:out dump append value '"\\n"'
+data modify storage bs:out dump append from storage bs:data dump[].indent
+
+data modify storage bs:data dump append from storage bs:data dump[-1]
+$data modify storage bs:data dump[-1].var set from storage bs:data dump[-1].var.$(key)
+execute store result storage bs:data dump[-1].expand int .99999999 run data get storage bs:data dump[-1].expand
+function bs.dump:format/compound/key with storage bs:const dump
+function bs.dump:format/any
+data remove storage bs:data dump[-1]
+$data remove storage bs:data dump[-1].var.$(key)
+
+execute store result score #dump.count bs.data run data get storage bs:data dump[-1].var
+execute if score #dump.count bs.data matches 1.. run data modify storage bs:out dump append value '", "'
+execute if score #dump.count bs.data matches 1.. run function bs.dump:key/get
+execute if score #dump.count bs.data matches 1.. run function bs.dump:format/compound/loop with storage bs:data dump[-1]
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/number.mcfunction b/modules/bs.dump/data/bs.dump/function/format/number.mcfunction
similarity index 97%
rename from datapacks/Bookshelf Dev/data/bs.dump/function/format/number.mcfunction
rename to modules/bs.dump/data/bs.dump/function/format/number.mcfunction
index b56c6380b2..496a02238a 100644
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/number.mcfunction
+++ b/modules/bs.dump/data/bs.dump/function/format/number.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.dump/data/bs.dump/function/format/score.mcfunction b/modules/bs.dump/data/bs.dump/function/format/score.mcfunction
new file mode 100644
index 0000000000..4f4496b062
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/score.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify entity B5-0-0-0-2 text set value '{"score":{"name":"#dump.var","objective":"bs.data"},"color":"$(number)"}'
+data modify storage bs:out dump append from entity B5-0-0-0-2 text
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/string/string.mcfunction b/modules/bs.dump/data/bs.dump/function/format/string/string.mcfunction
similarity index 98%
rename from datapacks/Bookshelf Dev/data/bs.dump/function/format/string/string.mcfunction
rename to modules/bs.dump/data/bs.dump/function/format/string/string.mcfunction
index 26e4193be1..7d4cd38254 100644
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/string/string.mcfunction
+++ b/modules/bs.dump/data/bs.dump/function/format/string/string.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.dump/data/bs.dump/function/format/string/unquote.mcfunction b/modules/bs.dump/data/bs.dump/function/format/string/unquote.mcfunction
new file mode 100644
index 0000000000..28c962f444
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/format/string/unquote.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:data dump[-1].var set value $(var)
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/format/undefined.mcfunction b/modules/bs.dump/data/bs.dump/function/format/undefined.mcfunction
similarity index 96%
rename from datapacks/Bookshelf Dev/data/bs.dump/function/format/undefined.mcfunction
rename to modules/bs.dump/data/bs.dump/function/format/undefined.mcfunction
index 0f85cb13b1..876d98c79d 100644
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/format/undefined.mcfunction
+++ b/modules/bs.dump/data/bs.dump/function/format/undefined.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.dump/data/bs.dump/function/interpret/any.mcfunction b/modules/bs.dump/data/bs.dump/function/interpret/any.mcfunction
new file mode 100644
index 0000000000..87b7967a00
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/interpret/any.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute if data storage bs:data dump[-1].var[] run return run function bs.dump:interpret/array/array
+execute if data storage bs:data dump[-1].var{} run return run function bs.dump:interpret/compound/compound
+
+execute store success score #dump.success bs.data run function bs.dump:interpret/path/path with storage bs:data dump[-1]
+execute if score #dump.success bs.data matches 0 run function bs.dump:interpret/score with storage bs:data dump[-1]
diff --git a/modules/bs.dump/data/bs.dump/function/interpret/array/array.mcfunction b/modules/bs.dump/data/bs.dump/function/interpret/array/array.mcfunction
new file mode 100644
index 0000000000..722de871e2
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/interpret/array/array.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #dump.count bs.data if data storage bs:data dump[-1].var[]
+
+execute if score #dump.count bs.data matches 0 run return run function bs.dump:format/array/empty
+execute if score #dump.count bs.data matches ..3 \
+ unless data storage bs:data dump[-1].var[][] \
+ unless data storage bs:data dump[-1].var[{}] \
+ run return run function bs.dump:interpret/array/compact/compact
+
+function bs.dump:format/bracket/open with storage bs:const dump
+function bs.dump:interpret/array/loop
+data modify storage bs:out dump append value '"\\n"'
+data modify storage bs:out dump append from storage bs:data dump[].indent
+data remove storage bs:out dump[-1]
+function bs.dump:format/bracket/close with storage bs:const dump
diff --git a/modules/bs.dump/data/bs.dump/function/interpret/array/compact/compact.mcfunction b/modules/bs.dump/data/bs.dump/function/interpret/array/compact/compact.mcfunction
new file mode 100644
index 0000000000..0d8027fa0d
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/interpret/array/compact/compact.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function bs.dump:format/bracket/open with storage bs:const dump
+execute if score #dump.count bs.data matches 1.. run function bs.dump:interpret/array/compact/loop
+function bs.dump:format/bracket/close with storage bs:const dump
diff --git a/modules/bs.dump/data/bs.dump/function/interpret/array/compact/loop.mcfunction b/modules/bs.dump/data/bs.dump/function/interpret/array/compact/loop.mcfunction
new file mode 100644
index 0000000000..a32482544c
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/interpret/array/compact/loop.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data dump append from storage bs:data dump[-1]
+data modify storage bs:data dump[-1].var set from storage bs:data dump[-1].var[0]
+function bs.dump:interpret/any
+data remove storage bs:data dump[-1]
+data remove storage bs:data dump[-1].var[0]
+
+execute if data storage bs:data dump[-1].var[0] run data modify storage bs:out dump append value '", "'
+execute if data storage bs:data dump[-1].var[0] run function bs.dump:interpret/array/compact/loop
diff --git a/modules/bs.dump/data/bs.dump/function/interpret/array/loop.mcfunction b/modules/bs.dump/data/bs.dump/function/interpret/array/loop.mcfunction
new file mode 100644
index 0000000000..8aa31e2105
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/interpret/array/loop.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:out dump append value '"\\n"'
+data modify storage bs:out dump append from storage bs:data dump[].indent
+
+data modify storage bs:data dump append from storage bs:data dump[-1]
+data modify storage bs:data dump[-1].var set from storage bs:data dump[-1].var[0]
+function bs.dump:interpret/any
+data remove storage bs:data dump[-1]
+data remove storage bs:data dump[-1].var[0]
+
+execute if data storage bs:data dump[-1].var[0] run data modify storage bs:out dump append value '", "'
+execute if data storage bs:data dump[-1].var[0] run function bs.dump:interpret/array/loop
diff --git a/modules/bs.dump/data/bs.dump/function/interpret/compound/compound.mcfunction b/modules/bs.dump/data/bs.dump/function/interpret/compound/compound.mcfunction
new file mode 100644
index 0000000000..01c4757531
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/interpret/compound/compound.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #dump.count bs.data run data get storage bs:data dump[-1].var
+execute if score #dump.count bs.data matches 0 run return run function bs.dump:format/compound/empty
+
+function bs.dump:format/brace/open with storage bs:const dump
+function bs.dump:key/get
+function bs.dump:interpret/compound/loop with storage bs:data dump[-1]
+data modify storage bs:out dump append value '"\\n"'
+data modify storage bs:out dump append from storage bs:data dump[].indent
+data remove storage bs:out dump[-1]
+function bs.dump:format/brace/close with storage bs:const dump
diff --git a/modules/bs.dump/data/bs.dump/function/interpret/compound/loop.mcfunction b/modules/bs.dump/data/bs.dump/function/interpret/compound/loop.mcfunction
new file mode 100644
index 0000000000..04a2185efc
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/interpret/compound/loop.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:out dump append value '"\\n"'
+data modify storage bs:out dump append from storage bs:data dump[].indent
+
+data modify storage bs:data dump append from storage bs:data dump[-1]
+$data modify storage bs:data dump[-1].var set from storage bs:data dump[-1].var.$(key)
+function bs.dump:format/compound/key with storage bs:const dump
+function bs.dump:interpret/any
+data remove storage bs:data dump[-1]
+$data remove storage bs:data dump[-1].var.$(key)
+
+execute store result score #dump.count bs.data run data get storage bs:data dump[-1].var
+execute if score #dump.count bs.data matches 1.. run data modify storage bs:out dump append value '", "'
+execute if score #dump.count bs.data matches 1.. run function bs.dump:key/get
+execute if score #dump.count bs.data matches 1.. run function bs.dump:interpret/compound/loop with storage bs:data dump[-1]
diff --git a/modules/bs.dump/data/bs.dump/function/interpret/path/expand/cast.mcfunction b/modules/bs.dump/data/bs.dump/function/interpret/path/expand/cast.mcfunction
new file mode 100644
index 0000000000..9ebd527bfa
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/interpret/path/expand/cast.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:data dump[-1].expand set value $(_)
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/expand/guard.mcfunction b/modules/bs.dump/data/bs.dump/function/interpret/path/expand/guard.mcfunction
similarity index 96%
rename from datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/expand/guard.mcfunction
rename to modules/bs.dump/data/bs.dump/function/interpret/path/expand/guard.mcfunction
index 917ed46b92..8eca0be96e 100644
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/expand/guard.mcfunction
+++ b/modules/bs.dump/data/bs.dump/function/interpret/path/expand/guard.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.dump/data/bs.dump/function/interpret/path/expand/parse/init.mcfunction b/modules/bs.dump/data/bs.dump/function/interpret/path/expand/parse/init.mcfunction
new file mode 100644
index 0000000000..36b992087a
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/interpret/path/expand/parse/init.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result storage bs:ctx x int 1 run scoreboard players set #dump.cursor bs.data -2
+execute store result storage bs:ctx y int 1 run scoreboard players set #dump.cursor bs.data -1
+function bs.dump:interpret/path/expand/parse/next with storage bs:ctx
diff --git a/modules/bs.dump/data/bs.dump/function/interpret/path/expand/parse/next.mcfunction b/modules/bs.dump/data/bs.dump/function/interpret/path/expand/parse/next.mcfunction
new file mode 100644
index 0000000000..345008ccc2
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/interpret/path/expand/parse/next.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:ctx _ set string storage bs:data dump[-1].var $(x) $(y)
+execute if data storage bs:ctx {_:" "} run return run function bs.dump:interpret/path/expand/parse/terminate with storage bs:ctx
+execute store result storage bs:ctx y int 1 run scoreboard players get #dump.cursor bs.data
+execute store result storage bs:ctx x int 1 run scoreboard players remove #dump.cursor bs.data 1
+function bs.dump:interpret/path/expand/parse/next with storage bs:ctx
diff --git a/modules/bs.dump/data/bs.dump/function/interpret/path/expand/parse/terminate.mcfunction b/modules/bs.dump/data/bs.dump/function/interpret/path/expand/parse/terminate.mcfunction
new file mode 100644
index 0000000000..6afdb2f381
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/interpret/path/expand/parse/terminate.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:ctx _ set string storage bs:data dump[-1].var $(y)
+$data modify storage bs:data dump[-1].var set string storage bs:data dump[-1].var 0 $(x)
+function bs.dump:interpret/path/expand/cast with storage bs:ctx
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/path.mcfunction b/modules/bs.dump/data/bs.dump/function/interpret/path/path.mcfunction
similarity index 97%
rename from datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/path.mcfunction
rename to modules/bs.dump/data/bs.dump/function/interpret/path/path.mcfunction
index d03d58c243..711d9a7de0 100644
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/path.mcfunction
+++ b/modules/bs.dump/data/bs.dump/function/interpret/path/path.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/populate.mcfunction b/modules/bs.dump/data/bs.dump/function/interpret/path/populate.mcfunction
similarity index 97%
rename from datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/populate.mcfunction
rename to modules/bs.dump/data/bs.dump/function/interpret/path/populate.mcfunction
index 407b8ac573..c7dcfc31a6 100644
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/interpret/path/populate.mcfunction
+++ b/modules/bs.dump/data/bs.dump/function/interpret/path/populate.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.dump/data/bs.dump/function/interpret/score.mcfunction b/modules/bs.dump/data/bs.dump/function/interpret/score.mcfunction
new file mode 100644
index 0000000000..176ed5c5a5
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/interpret/score.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store success score #dump.success bs.data run scoreboard players get $(var)
+execute if score #dump.success bs.data matches 0 run return run function bs.dump:format/undefined with storage bs:const dump
+$scoreboard players operation #dump.var bs.data = $(var)
+function bs.dump:format/score with storage bs:const dump
diff --git a/modules/bs.dump/data/bs.dump/function/key/get.mcfunction b/modules/bs.dump/data/bs.dump/function/key/get.mcfunction
new file mode 100644
index 0000000000..cba566730e
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/key/get.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify entity B5-0-0-0-2 text set value '{"storage":"bs:data","nbt":"dump[-1].var"}'
+function bs.dump:key/unquote with entity B5-0-0-0-2
+
+data modify storage bs:ctx _ set string storage bs:data dump[-1].key 1 2
+execute store result storage bs:ctx x int 1 run scoreboard players set #dump.cursor bs.data 2
+execute store result storage bs:ctx y int 1 run scoreboard players add #dump.cursor bs.data 1
+execute if data storage bs:ctx {_:'"'} run return run function bs.dump:key/parse/quoted/double with storage bs:ctx
+execute if data storage bs:ctx {_:"'"} run return run function bs.dump:key/parse/quoted/single with storage bs:ctx
+function bs.dump:key/parse/unquoted with storage bs:ctx
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/key/parse/quoted/double.mcfunction b/modules/bs.dump/data/bs.dump/function/key/parse/quoted/double.mcfunction
similarity index 98%
rename from datapacks/Bookshelf Dev/data/bs.dump/function/key/parse/quoted/double.mcfunction
rename to modules/bs.dump/data/bs.dump/function/key/parse/quoted/double.mcfunction
index 89d586ba66..594a0f26c9 100644
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/key/parse/quoted/double.mcfunction
+++ b/modules/bs.dump/data/bs.dump/function/key/parse/quoted/double.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/key/parse/quoted/single.mcfunction b/modules/bs.dump/data/bs.dump/function/key/parse/quoted/single.mcfunction
similarity index 98%
rename from datapacks/Bookshelf Dev/data/bs.dump/function/key/parse/quoted/single.mcfunction
rename to modules/bs.dump/data/bs.dump/function/key/parse/quoted/single.mcfunction
index 1ccacc8666..8a719d3d74 100644
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/key/parse/quoted/single.mcfunction
+++ b/modules/bs.dump/data/bs.dump/function/key/parse/quoted/single.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.dump/data/bs.dump/function/key/parse/terminate.mcfunction b/modules/bs.dump/data/bs.dump/function/key/parse/terminate.mcfunction
new file mode 100644
index 0000000000..d3ffbc09ed
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/key/parse/terminate.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:data dump[-1].key set string storage bs:data dump[-1].key 1 $(x)
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/function/key/parse/unquoted.mcfunction b/modules/bs.dump/data/bs.dump/function/key/parse/unquoted.mcfunction
similarity index 97%
rename from datapacks/Bookshelf Dev/data/bs.dump/function/key/parse/unquoted.mcfunction
rename to modules/bs.dump/data/bs.dump/function/key/parse/unquoted.mcfunction
index ffe48f8811..73acf119d5 100644
--- a/datapacks/Bookshelf Dev/data/bs.dump/function/key/parse/unquoted.mcfunction
+++ b/modules/bs.dump/data/bs.dump/function/key/parse/unquoted.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.dump/data/bs.dump/function/key/unquote.mcfunction b/modules/bs.dump/data/bs.dump/function/key/unquote.mcfunction
new file mode 100644
index 0000000000..8d41481209
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/key/unquote.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:data dump[-1].key set value $(text)
diff --git a/modules/bs.dump/data/bs.dump/function/var.mcfunction b/modules/bs.dump/data/bs.dump/function/var.mcfunction
new file mode 100644
index 0000000000..f779b276a1
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/function/var.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Note: Thanks to tryashtar and PiggyPig for inspiring the idea behind this module.
+
+data modify storage bs:out dump set value ['[{"text":"[","color":"#cccccc"},{"selector":"@s"},"] ⇒ "]']
+$data modify storage bs:data dump set value [{var:$(var),indent:'"\\u2000"'}]
+function bs.dump:interpret/any
+tellraw @a {"type":"nbt","storage":"bs:out","nbt":"dump[]","separator":"","interpret":true}
diff --git a/datapacks/Bookshelf Dev/data/bs.dump/tags/function/var.json b/modules/bs.dump/data/bs.dump/tags/function/var.json
similarity index 75%
rename from datapacks/Bookshelf Dev/data/bs.dump/tags/function/var.json
rename to modules/bs.dump/data/bs.dump/tags/function/var.json
index 8d3db043ba..292b4ef1ab 100644
--- a/datapacks/Bookshelf Dev/data/bs.dump/tags/function/var.json
+++ b/modules/bs.dump/data/bs.dump/tags/function/var.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/dump.html#dump-var",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/dump.html#dump-var",
"authors": [
"Aksiome"
],
diff --git a/modules/bs.dump/data/bs.dump/test/var.mcfunction b/modules/bs.dump/data/bs.dump/test/var.mcfunction
new file mode 100644
index 0000000000..21b03e6e2c
--- /dev/null
+++ b/modules/bs.dump/data/bs.dump/test/var.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+await entity B5-0-0-0-2
+
+data modify storage bs:data packtest set value {foo:"bar"}
+function #bs.dump:var { var: { storage: "storage bs:data packtest", entity:"entity @s {} 0", score: ["3 bs.const", "-_- bs.const"] }}
+
+assert chat '.*?\\{[\\s\\S]*storage: \\{[\\s\\S]*foo: \\"bar\\"[\\s\\S]*\\}[\\s\\S]*\\}'
+assert chat '.*?\\{[\\s\\S]*entity: \\{ [0-9]+ entries .*? \\}[\\s\\S]*\\}'
+assert chat '.*?\\{[\\s\\S]*score: \\[3, undefined\\][\\s\\S]*\\}'
+
+data remove storage bs:data packtest
diff --git a/modules/bs.dump/module.json b/modules/bs.dump/module.json
new file mode 100644
index 0000000000..3c3acdca18
--- /dev/null
+++ b/modules/bs.dump/module.json
@@ -0,0 +1,14 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.dump",
+ "load": "."
+ },
+ "meta": {
+ "name": "Dump",
+ "slug": "bookshelf-dump",
+ "description": "Dump the content of given variables to the chat.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/dump.html",
+ "tags": ["dev"]
+ }
+}
diff --git a/modules/bs.environment/README.md b/modules/bs.environment/README.md
new file mode 100644
index 0000000000..8783cd5dea
--- /dev/null
+++ b/modules/bs.environment/README.md
@@ -0,0 +1,14 @@
+# ⛰️ Bookshelf Environment
+
+This datapack provides comprehensive information and tools related to weather and biome properties.
+
+> “The most dangerous worldview is the worldview of those have not viewed the world.”
+>
+> -- Alexander von Humboldt
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/environment.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.environment/data/bs.environment/function/__load__.mcfunction b/modules/bs.environment/data/bs.environment/function/__load__.mcfunction
new file mode 100644
index 0000000000..ff6dbf0c57
--- /dev/null
+++ b/modules/bs.environment/data/bs.environment/function/__load__.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+forceload add -30000000 1600
+setblock -30000000 0 1606 minecraft:decorated_pot
+
+scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
+
+scoreboard players set 125000 bs.const 125000
diff --git a/modules/bs.environment/data/bs.environment/function/__unload__.mcfunction b/modules/bs.environment/data/bs.environment/function/__unload__.mcfunction
new file mode 100644
index 0000000000..3478e25103
--- /dev/null
+++ b/modules/bs.environment/data/bs.environment/function/__unload__.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock -30000000 0 1606 minecraft:air
+forceload remove -30000000 1600
+
+data remove storage bs:out environment
+
+scoreboard objectives remove bs.const
+scoreboard objectives remove bs.ctx
+scoreboard objectives remove bs.out
diff --git a/modules/bs.environment/data/bs.environment/function/get/biome/get_biome.mcfunction b/modules/bs.environment/data/bs.environment/function/get/biome/get_biome.mcfunction
new file mode 100644
index 0000000000..58e568f2de
--- /dev/null
+++ b/modules/bs.environment/data/bs.environment/function/get/biome/get_biome.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data remove storage bs:out environment.get_biome
+loot replace block -30000000 0 1606 container.0 loot bs.environment:get/get_biome
+data modify storage bs:out environment.get_biome set from block -30000000 0 1606 item.components."minecraft:custom_data"
diff --git a/modules/bs.environment/data/bs.environment/function/get/temperature/get_temperature.mcfunction b/modules/bs.environment/data/bs.environment/function/get/temperature/get_temperature.mcfunction
new file mode 100644
index 0000000000..12ce205bc1
--- /dev/null
+++ b/modules/bs.environment/data/bs.environment/function/get/temperature/get_temperature.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+loot replace block -30000000 0 1606 container.0 loot bs.environment:get/get_biome
+execute store result score #t bs.ctx run data get block -30000000 0 1606 item.components."minecraft:custom_data".temperature
+execute store result storage bs:ctx y double .00000001 summon minecraft:marker run function bs.environment:get/temperature/variation
+$execute store result score $environment.get_temperature bs.out run return run data get storage bs:ctx y $(scale)
diff --git a/datapacks/Bookshelf/data/bs.biome/function/get/temperature/variation.mcfunction b/modules/bs.environment/data/bs.environment/function/get/temperature/variation.mcfunction
similarity index 77%
rename from datapacks/Bookshelf/data/bs.biome/function/get/temperature/variation.mcfunction
rename to modules/bs.environment/data/bs.environment/function/get/temperature/variation.mcfunction
index 4e33ed6af2..5262fb829c 100644
--- a/datapacks/Bookshelf/data/bs.biome/function/get/temperature/variation.mcfunction
+++ b/modules/bs.environment/data/bs.environment/function/get/temperature/variation.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -14,5 +14,9 @@
# ------------------------------------------------------------------------------------------------------------
execute store result score #v bs.ctx run data get entity @s Pos[1]
-scoreboard players remove #v bs.ctx 80
kill @s
+
+execute if score #v bs.ctx matches ..80 run return run scoreboard players get #t bs.ctx
+scoreboard players remove #v bs.ctx 80
+scoreboard players operation #v bs.ctx *= 125000 bs.const
+return run scoreboard players operation #t bs.ctx -= #v bs.ctx
diff --git a/modules/bs.environment/data/bs.environment/predicate/can_rain.json b/modules/bs.environment/data/bs.environment/predicate/can_rain.json
new file mode 100644
index 0000000000..e33ea95af2
--- /dev/null
+++ b/modules/bs.environment/data/bs.environment/predicate/can_rain.json
@@ -0,0 +1,31 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/environment.html#can-it-rain",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/04/22",
+ "minecraft_version": "1.20.5"
+ },
+ "updated": {
+ "date": "2024/11/24",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ "condition": "minecraft:all_of",
+ "terms": [
+ {
+ "condition": "minecraft:reference",
+ "name": "bs.environment:has_precipitation"
+ },
+ {
+ "condition": "minecraft:inverted",
+ "term": {
+ "condition": "minecraft:reference",
+ "name": "bs.environment:can_snow"
+ }
+ }
+ ]
+}
diff --git a/modules/bs.environment/data/bs.environment/predicate/is_raining.json b/modules/bs.environment/data/bs.environment/predicate/is_raining.json
new file mode 100644
index 0000000000..65a90e5f3c
--- /dev/null
+++ b/modules/bs.environment/data/bs.environment/predicate/is_raining.json
@@ -0,0 +1,19 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/environment.html#is-it-raining",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/04/22",
+ "minecraft_version": "1.20.5"
+ },
+ "updated": {
+ "date": "2024/11/24",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ "condition": "weather_check",
+ "raining": true
+}
diff --git a/modules/bs.environment/data/bs.environment/predicate/is_thundering.json b/modules/bs.environment/data/bs.environment/predicate/is_thundering.json
new file mode 100644
index 0000000000..d1662822bb
--- /dev/null
+++ b/modules/bs.environment/data/bs.environment/predicate/is_thundering.json
@@ -0,0 +1,19 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/environment.html#is-it-thundering",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/04/22",
+ "minecraft_version": "1.20.5"
+ },
+ "updated": {
+ "date": "2024/11/24",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ "condition": "weather_check",
+ "thundering": true
+}
diff --git a/modules/bs.environment/data/bs.environment/tags/function/get_biome.json b/modules/bs.environment/data/bs.environment/tags/function/get_biome.json
new file mode 100644
index 0000000000..75d2ec0ec2
--- /dev/null
+++ b/modules/bs.environment/data/bs.environment/tags/function/get_biome.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/environment.html#get-biome",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/04/22",
+ "minecraft_version": "1.20.5"
+ },
+ "updated": {
+ "date": "2024/04/22",
+ "minecraft_version": "1.20.5"
+ }
+ },
+ "values": [
+ "bs.environment:get/biome/get_biome"
+ ]
+}
diff --git a/modules/bs.environment/data/bs.environment/tags/function/get_temperature.json b/modules/bs.environment/data/bs.environment/tags/function/get_temperature.json
new file mode 100644
index 0000000000..792cf24d01
--- /dev/null
+++ b/modules/bs.environment/data/bs.environment/tags/function/get_temperature.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/environment.html#get-temperature",
+ "authors": [
+ "Aksiome",
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2018/08/16",
+ "minecraft_version": "1.14"
+ },
+ "updated": {
+ "date": "2024/04/22",
+ "minecraft_version": "1.20.5"
+ }
+ },
+ "values": [
+ "bs.environment:get/temperature/get_temperature"
+ ]
+}
diff --git a/modules/bs.environment/gen_biomes.py b/modules/bs.environment/gen_biomes.py
new file mode 100644
index 0000000000..91ce8739f7
--- /dev/null
+++ b/modules/bs.environment/gen_biomes.py
@@ -0,0 +1,115 @@
+from collections import defaultdict
+from datetime import datetime, timezone
+
+from beet import Context, LootTable, Predicate
+from pydantic import BaseModel
+
+from core.common.helpers import (
+ download_and_parse_json,
+ gen_loot_table_tree,
+ render_snbt,
+ with_prefix,
+)
+from core.definitions import BIOMES_URL, MINECRAFT_VERSIONS
+
+SNOW_THRESHOLD = 0.4
+
+class Biome(BaseModel):
+ """Represents a Minecraft biome."""
+
+ type: str
+ temperature: float
+ has_precipitation: bool
+
+
+def beet_default(ctx: Context) -> None:
+ """Generate files used by the bs.environment module."""
+ namespace = ctx.directory.name
+ biomes = get_biomes(ctx, version := MINECRAFT_VERSIONS[-1])
+
+ with ctx.override(generate_namespace=namespace):
+ ctx.generate("get/get_biome", gen_get_biome_loot_table(biomes))
+ ctx.generate("can_snow", gen_can_snow_predicate(biomes, version))
+ ctx.generate(
+ "has_precipitation",
+ gen_has_precipitation_predicate(biomes, version),
+ )
+
+
+def get_biomes(ctx: Context, version: str) -> list[Biome]:
+ """Retrieve biomes from the provided version."""
+ cache = ctx.cache[f"version/{version}"]
+ raw_biomes = download_and_parse_json(cache, BIOMES_URL.format(version))
+ if not isinstance(raw_biomes, dict):
+ error_msg = f"Expected a dict, but got {type(raw_biomes)}"
+ raise TypeError(error_msg)
+
+ return [
+ Biome(type=with_prefix(biome), **data)
+ for biome, data in raw_biomes.items()
+ ]
+
+
+def gen_get_biome_loot_table(biomes: list[Biome]) -> LootTable:
+ """Generate a loot table to retrieve biomes."""
+ return LootTable(
+ gen_loot_table_tree(biomes, lambda biome: {
+ "type": "item",
+ "name": "egg",
+ "functions": [{"function": "set_custom_data", "tag": render_snbt(biome)}],
+ }, lambda biomes: [{
+ "condition": "minecraft:location_check",
+ "predicate": {"biomes": [biome.type[10:] for biome in biomes]},
+ }]),
+ )
+
+
+def gen_can_snow_predicate(biomes: list[Biome], version: str) -> Predicate:
+ """Generate a predicate to determine where snow can occur."""
+ groups = defaultdict(list)
+ for biome in filter(
+ lambda b: b.temperature < SNOW_THRESHOLD and b.has_precipitation,
+ biomes,
+ ):
+ # Calculate minimum y-level for snow based on biome temperature
+ y = int((biome.temperature - 0.15) / 0.00125 + 80)
+ groups[y if y > 0 else -2147483648].append(biome.type)
+
+ return Predicate({
+ "__bookshelf__": {
+ "feature": True,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/environment.html#can-it-snow",
+ "authors": ["Aksiome"],
+ "created": {"date": "2024/04/22", "minecraft_version": "1.20.5"},
+ "updated": {
+ "date": datetime.now(timezone.utc).strftime("%Y/%m/%d"),
+ "minecraft_version": version,
+ },
+ },
+ "condition":"minecraft:any_of",
+ "terms": [{
+ "condition": "minecraft:location_check",
+ "predicate": {
+ "position": { "y": { "min": y } },
+ "biomes": biomes,
+ },
+ } for y, biomes in dict(sorted(groups.items())).items()],
+ })
+
+
+def gen_has_precipitation_predicate(biomes: list[Biome], version: str) -> Predicate:
+ """Generate a predicate to determine biomes with precipitation."""
+ return Predicate({
+ "__bookshelf__": {
+ "feature": True,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/environment.html#can-it-rain-or-snow",
+ "authors": ["Aksiome"],
+ "created": {"date": "2024/04/22", "minecraft_version": "1.20.5"},
+ "updated": {
+ "date": datetime.now(timezone.utc).strftime("%Y/%m/%d"),
+ "minecraft_version": version,
+ },
+ },
+ "condition": "minecraft:location_check",
+ "predicate": {"biomes": [b.type for b in biomes if b.has_precipitation]},
+ })
diff --git a/modules/bs.environment/module.json b/modules/bs.environment/module.json
new file mode 100644
index 0000000000..91f270d1e0
--- /dev/null
+++ b/modules/bs.environment/module.json
@@ -0,0 +1,17 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.environment",
+ "load": "."
+ },
+ "meta": {
+ "name": "Environment",
+ "slug": "bookshelf-environment",
+ "description": "Comprehensive information and tools related to weather and biome properties.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/environment.html",
+ "tags": ["default"]
+ },
+ "pipeline": [
+ "gen_biomes"
+ ]
+}
diff --git a/modules/bs.generate/README.md b/modules/bs.generate/README.md
new file mode 100644
index 0000000000..fe4397b1b3
--- /dev/null
+++ b/modules/bs.generate/README.md
@@ -0,0 +1,14 @@
+# 🏗️ Bookshelf Generate
+
+This datapack provides tools for generating a wide range of terrains and landscapes, utilizing various noise functions for natural-looking results.
+
+> “Nature’s beauty is a reflection of the harmony of numbers and patterns.”
+>
+> -- Anonymous
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/generate.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.generate/data/bs.generate/function/__load__.mcfunction b/modules/bs.generate/data/bs.generate/function/__load__.mcfunction
new file mode 100644
index 0000000000..87ffdb9781
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/function/__load__.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+forceload add -30000000 1600
+setblock -30000000 0 1606 minecraft:decorated_pot
+execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
+
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
diff --git a/modules/bs.generate/data/bs.generate/function/__unload__.mcfunction b/modules/bs.generate/data/bs.generate/function/__unload__.mcfunction
new file mode 100644
index 0000000000..c55484f652
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/function/__unload__.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+kill B5-0-0-0-1
+forceload remove -30000000 1600
+
+data remove storage bs:data generate
diff --git a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/fractal_shape_2d.mcfunction b/modules/bs.generate/data/bs.generate/function/shape_2d/fractal_shape_2d.mcfunction
similarity index 92%
rename from datapacks/Bookshelf/data/bs.generate/function/shape_2d/fractal_shape_2d.mcfunction
rename to modules/bs.generate/data/bs.generate/function/shape_2d/fractal_shape_2d.mcfunction
index ff1df87800..726596fd2e 100644
--- a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/fractal_shape_2d.mcfunction
+++ b/modules/bs.generate/data/bs.generate/function/shape_2d/fractal_shape_2d.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d
# ------------------------------------------------------------------------------------------------------------
data modify storage bs:data generate._ set value { \
diff --git a/modules/bs.generate/data/bs.generate/function/shape_2d/process/pause.mcfunction b/modules/bs.generate/data/bs.generate/function/shape_2d/process/pause.mcfunction
new file mode 100644
index 0000000000..a73c684a72
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/function/shape_2d/process/pause.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute summon minecraft:marker run function bs.generate:utils/get_location
+execute unless data storage bs:data generate._.dim run function bs.generate:utils/get_dimension
+
+execute store result storage bs:data generate._.x int 1 run scoreboard players get $generate.x bs.data
+execute store result storage bs:data generate._.y int 1 run scoreboard players get $generate.y bs.data
+
+data modify storage bs:data generate.shape_2d prepend from storage bs:data generate._
+schedule function bs.generate:shape_2d/process/scheduled 1t replace
diff --git a/modules/bs.generate/data/bs.generate/function/shape_2d/process/resume.mcfunction b/modules/bs.generate/data/bs.generate/function/shape_2d/process/resume.mcfunction
new file mode 100644
index 0000000000..c8a97ad9a1
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/function/shape_2d/process/resume.mcfunction
@@ -0,0 +1,28 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data generate._ set from storage bs:data generate.shape_2d[-1]
+data remove storage bs:data generate._._
+
+$function bs.generate:shape_2d/strategy/$(impl)/setup
+data modify entity @s Pos set from storage bs:data generate._.pos
+data modify entity @s Rotation set from storage bs:data generate._.rot
+$execute in $(dim) positioned as @s rotated as @s run function bs.generate:shape_2d/recurse/next with storage bs:data generate._
+
+data remove storage bs:data generate.shape_2d[-1]
+execute if data storage bs:data generate.shape_2d[-1]._ \
+ run return run function bs.generate:shape_2d/process/resume with storage bs:data generate.shape_2d[-1]
+
+execute in minecraft:overworld run tp @s -30000000 0 1600
diff --git a/modules/bs.generate/data/bs.generate/function/shape_2d/process/scheduled.mcfunction b/modules/bs.generate/data/bs.generate/function/shape_2d/process/scheduled.mcfunction
new file mode 100644
index 0000000000..25f433bf6c
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/function/shape_2d/process/scheduled.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data generate.shape_2d[]._ set value 1b
+execute as B5-0-0-0-1 run function bs.generate:shape_2d/process/resume with storage bs:data generate.shape_2d[-1]
diff --git a/modules/bs.generate/data/bs.generate/function/shape_2d/recurse/init.mcfunction b/modules/bs.generate/data/bs.generate/function/shape_2d/recurse/init.mcfunction
new file mode 100644
index 0000000000..50c1b7d2aa
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/function/shape_2d/recurse/init.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute if data storage bs:data generate._{direction:"xz"} run data modify storage bs:data generate._.oz set from entity @s Pos[2]
+execute unless data storage bs:data generate._{direction:"xz"} run data modify storage bs:data generate._.oy set from entity @s Pos[1]
+kill @s
+
+$function bs.generate:shape_2d/strategy/$(impl)/setup
+
+execute if data storage bs:data generate._{direction:"xz"} rotated 0 90 run return run function bs.generate:shape_2d/recurse/next with storage bs:data generate._
+execute if data storage bs:data generate._{direction:"xy"} rotated 0 0 run return run function bs.generate:shape_2d/recurse/next with storage bs:data generate._
+execute if data storage bs:data generate._{direction:"zy"} rotated 90 0 run return run function bs.generate:shape_2d/recurse/next with storage bs:data generate._
diff --git a/modules/bs.generate/data/bs.generate/function/shape_2d/recurse/next.mcfunction b/modules/bs.generate/data/bs.generate/function/shape_2d/recurse/next.mcfunction
new file mode 100644
index 0000000000..5f2bdae145
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/function/shape_2d/recurse/next.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute if score #generate.i bs.data matches 0 run return run function bs.generate:shape_2d/process/pause
+
+$execute if score #generate.i bs.data matches 1.. run function bs.generate:shape_2d/strategy/$(impl)/run with storage bs:data generate._
+scoreboard players remove #generate.i bs.data 1
+
+scoreboard players add $generate.x bs.data 1
+$execute if score $generate.x bs.data < #generate.w bs.data positioned ^ ^$(spacing) ^ run return run function bs.generate:shape_2d/recurse/next with storage bs:data generate._
+scoreboard players set $generate.x bs.data 0
+scoreboard players add $generate.y bs.data 1
+$execute if score $generate.y bs.data < #generate.h bs.data positioned ~ $(oy) $(oz) positioned ^$(spacing) ^ ^ run function bs.generate:shape_2d/recurse/next with storage bs:data generate._
diff --git a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/shape_2d.mcfunction b/modules/bs.generate/data/bs.generate/function/shape_2d/shape_2d.mcfunction
similarity index 89%
rename from datapacks/Bookshelf/data/bs.generate/function/shape_2d/shape_2d.mcfunction
rename to modules/bs.generate/data/bs.generate/function/shape_2d/shape_2d.mcfunction
index e18071e623..b824156261 100644
--- a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/shape_2d.mcfunction
+++ b/modules/bs.generate/data/bs.generate/function/shape_2d/shape_2d.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d
# ------------------------------------------------------------------------------------------------------------
data modify storage bs:data generate._ set value { \
diff --git a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/simplex_shape_2d.mcfunction b/modules/bs.generate/data/bs.generate/function/shape_2d/simplex_shape_2d.mcfunction
similarity index 92%
rename from datapacks/Bookshelf/data/bs.generate/function/shape_2d/simplex_shape_2d.mcfunction
rename to modules/bs.generate/data/bs.generate/function/shape_2d/simplex_shape_2d.mcfunction
index 31c221860f..e602c5b8b4 100644
--- a/datapacks/Bookshelf/data/bs.generate/function/shape_2d/simplex_shape_2d.mcfunction
+++ b/modules/bs.generate/data/bs.generate/function/shape_2d/simplex_shape_2d.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d
# ------------------------------------------------------------------------------------------------------------
data modify storage bs:data generate._ set value { \
diff --git a/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/dummy/run.mcfunction b/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/dummy/run.mcfunction
new file mode 100644
index 0000000000..026dfc5864
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/dummy/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$$(cb)
diff --git a/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/dummy/setup.mcfunction b/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/dummy/setup.mcfunction
new file mode 100644
index 0000000000..3229bfe34b
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/dummy/setup.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score $generate.x bs.data run data get storage bs:data generate._.x
+execute store result score $generate.y bs.data run data get storage bs:data generate._.y
+execute store result score #generate.w bs.data run data get storage bs:data generate._.w
+execute store result score #generate.h bs.data run data get storage bs:data generate._.h
+execute store result score #generate.i bs.data run data get storage bs:data generate._.limit
diff --git a/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/fractal_noise_2d/run.mcfunction b/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/fractal_noise_2d/run.mcfunction
new file mode 100644
index 0000000000..d398c91ff4
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/fractal_noise_2d/run.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation $random.fractal_noise_2d.x bs.in = $generate.x bs.data
+scoreboard players operation $random.fractal_noise_2d.y bs.in = $generate.y bs.data
+scoreboard players operation $random.fractal_noise_2d.x bs.in *= #generate.k bs.data
+scoreboard players operation $random.fractal_noise_2d.y bs.in *= #generate.k bs.data
+
+function #bs.random:fractal_noise_2d
+$$(cb)
diff --git a/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/fractal_noise_2d/setup.mcfunction b/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/fractal_noise_2d/setup.mcfunction
new file mode 100644
index 0000000000..7a80f5c310
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/fractal_noise_2d/setup.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score $random.fractal_noise_2d.seed bs.in run data get storage bs:data generate._.seed
+execute store result score $random.fractal_noise_2d.octaves bs.in run data get storage bs:data generate._.octaves
+execute store result score $random.fractal_noise_2d.persistence bs.in run data get storage bs:data generate._.persistence 1000
+execute store result score $random.fractal_noise_2d.lacunarity bs.in run data get storage bs:data generate._.lacunarity 1000
+
+execute store result score $generate.x bs.data run data get storage bs:data generate._.x
+execute store result score $generate.y bs.data run data get storage bs:data generate._.y
+execute store result score #generate.w bs.data run data get storage bs:data generate._.w
+execute store result score #generate.h bs.data run data get storage bs:data generate._.h
+execute store result score #generate.k bs.data run data get storage bs:data generate._.k
+execute store result score #generate.i bs.data run data get storage bs:data generate._.limit
diff --git a/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/simplex_noise_2d/run.mcfunction b/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/simplex_noise_2d/run.mcfunction
new file mode 100644
index 0000000000..80e933aa07
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/simplex_noise_2d/run.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation $random.simplex_noise_2d.x bs.in = $generate.x bs.data
+scoreboard players operation $random.simplex_noise_2d.y bs.in = $generate.y bs.data
+scoreboard players operation $random.simplex_noise_2d.x bs.in *= #generate.k bs.data
+scoreboard players operation $random.simplex_noise_2d.y bs.in *= #generate.k bs.data
+
+function #bs.random:simplex_noise_2d
+$$(cb)
diff --git a/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/simplex_noise_2d/setup.mcfunction b/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/simplex_noise_2d/setup.mcfunction
new file mode 100644
index 0000000000..f40b367c1e
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/function/shape_2d/strategy/simplex_noise_2d/setup.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score $random.simplex_noise_2d.seed bs.in run data get storage bs:data generate._.seed
+
+execute store result score $generate.x bs.data run data get storage bs:data generate._.x
+execute store result score $generate.y bs.data run data get storage bs:data generate._.y
+execute store result score #generate.w bs.data run data get storage bs:data generate._.w
+execute store result score #generate.h bs.data run data get storage bs:data generate._.h
+execute store result score #generate.k bs.data run data get storage bs:data generate._.k
+execute store result score #generate.i bs.data run data get storage bs:data generate._.limit
diff --git a/modules/bs.generate/data/bs.generate/function/utils/get_custom_dimension.mcfunction b/modules/bs.generate/data/bs.generate/function/utils/get_custom_dimension.mcfunction
new file mode 100644
index 0000000000..96710ce345
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/function/utils/get_custom_dimension.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data generate._.dim set from entity @s Brain.memories.minecraft:home.value.dimension
+kill @s
diff --git a/modules/bs.generate/data/bs.generate/function/utils/get_dimension.mcfunction b/modules/bs.generate/data/bs.generate/function/utils/get_dimension.mcfunction
new file mode 100644
index 0000000000..18d4fc688b
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/function/utils/get_dimension.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute if dimension minecraft:overworld run return run data modify storage bs:data generate._.dim set value "minecraft:overworld"
+execute if dimension minecraft:the_nether run return run data modify storage bs:data generate._.dim set value "minecraft:the_nether"
+execute if dimension minecraft:the_end run return run data modify storage bs:data generate._.dim set value "minecraft:the_end"
+
+execute positioned -30000000 0 1600 summon piglin_brute run function bs.generate:utils/get_custom_dimension
diff --git a/datapacks/Bookshelf/data/bs.generate/function/utils/get_location.mcfunction b/modules/bs.generate/data/bs.generate/function/utils/get_location.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.generate/function/utils/get_location.mcfunction
rename to modules/bs.generate/data/bs.generate/function/utils/get_location.mcfunction
index a065911760..204b5ce097 100644
--- a/datapacks/Bookshelf/data/bs.generate/function/utils/get_location.mcfunction
+++ b/modules/bs.generate/data/bs.generate/function/utils/get_location.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.generate/tags/function/fractal_shape_2d.json b/modules/bs.generate/data/bs.generate/tags/function/fractal_shape_2d.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.generate/tags/function/fractal_shape_2d.json
rename to modules/bs.generate/data/bs.generate/tags/function/fractal_shape_2d.json
index 95f5523586..bef7d317cd 100644
--- a/datapacks/Bookshelf/data/bs.generate/tags/function/fractal_shape_2d.json
+++ b/modules/bs.generate/data/bs.generate/tags/function/fractal_shape_2d.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/generate.html#shape-2d",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.generate/tags/function/shape_2d.json b/modules/bs.generate/data/bs.generate/tags/function/shape_2d.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.generate/tags/function/shape_2d.json
rename to modules/bs.generate/data/bs.generate/tags/function/shape_2d.json
index 8000f907db..f2ccbdd7eb 100644
--- a/datapacks/Bookshelf/data/bs.generate/tags/function/shape_2d.json
+++ b/modules/bs.generate/data/bs.generate/tags/function/shape_2d.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/generate.html#shape-2d",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.generate/tags/function/simplex_shape_2d.json b/modules/bs.generate/data/bs.generate/tags/function/simplex_shape_2d.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.generate/tags/function/simplex_shape_2d.json
rename to modules/bs.generate/data/bs.generate/tags/function/simplex_shape_2d.json
index fe99c7d6b1..7929eb594a 100644
--- a/datapacks/Bookshelf/data/bs.generate/tags/function/simplex_shape_2d.json
+++ b/modules/bs.generate/data/bs.generate/tags/function/simplex_shape_2d.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/generate.html#shape-2d",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/generate.html#shape-2d",
"authors": [
"Aksiome"
],
diff --git a/modules/bs.generate/data/bs.generate/test/shape_2d/async.mcfunction b/modules/bs.generate/data/bs.generate/test/shape_2d/async.mcfunction
new file mode 100644
index 0000000000..d4c6ea85c9
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/test/shape_2d/async.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.generate:shape_2d {width:1,height:2,run:"setblock ~ ~ ~ minecraft:stone",with:{limit:1}}
+
+assert block ~ ~ ~ minecraft:stone
+assert not block ~1 ~ ~ minecraft:stone
+await delay 1t
+assert block ~1 ~ ~ minecraft:stone
diff --git a/modules/bs.generate/data/bs.generate/test/shape_2d/fractal.mcfunction b/modules/bs.generate/data/bs.generate/test/shape_2d/fractal.mcfunction
new file mode 100644
index 0000000000..5d30051cf3
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/test/shape_2d/fractal.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players reset $random.fractal_noise_2d bs.out
+function #bs.generate:fractal_shape_2d {width:1,height:2,run:"assert score $random.fractal_noise_2d bs.out matches -1000..1000",with:{limit:1}}
+scoreboard players reset $random.fractal_noise_2d bs.out
diff --git a/modules/bs.generate/data/bs.generate/test/shape_2d/plane_xy.mcfunction b/modules/bs.generate/data/bs.generate/test/shape_2d/plane_xy.mcfunction
new file mode 100644
index 0000000000..0af1005c23
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/test/shape_2d/plane_xy.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.generate:shape_2d {width:2,height:2,run:"setblock ~ ~ ~ minecraft:stone",with:{direction:"xy"}}
+
+assert block ~ ~ ~ minecraft:stone
+assert block ~ ~1 ~ minecraft:stone
+assert block ~1 ~ ~ minecraft:stone
+assert block ~1 ~1 ~ minecraft:stone
diff --git a/modules/bs.generate/data/bs.generate/test/shape_2d/plane_xz.mcfunction b/modules/bs.generate/data/bs.generate/test/shape_2d/plane_xz.mcfunction
new file mode 100644
index 0000000000..8c3b6414c1
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/test/shape_2d/plane_xz.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.generate:shape_2d {width:2,height:2,run:"setblock ~ ~ ~ minecraft:stone",with:{direction:"xz"}}
+
+assert block ~ ~ ~ minecraft:stone
+assert block ~1 ~ ~ minecraft:stone
+assert block ~ ~ ~1 minecraft:stone
+assert block ~1 ~ ~1 minecraft:stone
diff --git a/modules/bs.generate/data/bs.generate/test/shape_2d/plane_zy.mcfunction b/modules/bs.generate/data/bs.generate/test/shape_2d/plane_zy.mcfunction
new file mode 100644
index 0000000000..8fb4199405
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/test/shape_2d/plane_zy.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.generate:shape_2d {width:2,height:2,run:"setblock ~ ~ ~ minecraft:stone",with:{direction:"zy"}}
+
+assert block ~ ~ ~ minecraft:stone
+assert block ~ ~1 ~ minecraft:stone
+assert block ~ ~ ~1 minecraft:stone
+assert block ~ ~1 ~1 minecraft:stone
diff --git a/modules/bs.generate/data/bs.generate/test/shape_2d/simplex.mcfunction b/modules/bs.generate/data/bs.generate/test/shape_2d/simplex.mcfunction
new file mode 100644
index 0000000000..e93c31c4f9
--- /dev/null
+++ b/modules/bs.generate/data/bs.generate/test/shape_2d/simplex.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players reset $random.simplex_noise_2d bs.out
+function #bs.generate:simplex_shape_2d {width:1,height:2,run:"assert score $random.simplex_noise_2d bs.out matches -1000..1000",with:{limit:1}}
+scoreboard players reset $random.simplex_noise_2d bs.out
diff --git a/modules/bs.generate/module.json b/modules/bs.generate/module.json
new file mode 100644
index 0000000000..f5763d56c1
--- /dev/null
+++ b/modules/bs.generate/module.json
@@ -0,0 +1,17 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.generate",
+ "load": "."
+ },
+ "meta": {
+ "name": "Generate",
+ "slug": "bookshelf-generate",
+ "description": "Generate diverse terrains and landscapes, incorporating natural features.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/generate.html",
+ "tags": ["default"],
+ "dependencies": [
+ "bs.random"
+ ]
+ }
+}
diff --git a/modules/bs.health/README.md b/modules/bs.health/README.md
new file mode 100644
index 0000000000..9ddbcb3f5e
--- /dev/null
+++ b/modules/bs.health/README.md
@@ -0,0 +1,14 @@
+# ❤️ Bookshelf Health
+
+This datapack allows you to efficiently manage the lifecycle and health of entities in Minecraft.
+
+> “He who has a why to live can bear almost any how.”
+>
+> -- Friedrich Nietzsche
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/health.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/datapacks/Bookshelf/data/bs.health/advancement/restore_health.json b/modules/bs.health/data/bs.health/advancement/restore_health.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.health/advancement/restore_health.json
rename to modules/bs.health/data/bs.health/advancement/restore_health.json
diff --git a/modules/bs.health/data/bs.health/function/__load__.mcfunction b/modules/bs.health/data/bs.health/function/__load__.mcfunction
new file mode 100644
index 0000000000..4d4095015a
--- /dev/null
+++ b/modules/bs.health/data/bs.health/function/__load__.mcfunction
@@ -0,0 +1,31 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+scoreboard objectives add bs.ttl dummy [{"text":"BS ","color":"dark_gray"},{"text":"Time to Live","color":"aqua"}]
+
+data modify storage bs:const health.point set value 100000
+data modify storage bs:const health.units set value [ \
+ {name:"t",scale:1}, \
+ {name:"tick",scale:1}, \
+ {name:"s",scale:20}, \
+ {name:"second",scale:20}, \
+ {name:"m",scale:1200}, \
+ {name:"minute",scale:1200}, \
+ {name:"hour",scale:72000}, \
+ {name:"h",scale:72000}, \
+]
+
+execute unless data storage bs:const log.messages[{namespaces: ["bs.health"]}] run data modify storage bs:const log.messages[{namespaces: ["bs"]}].namespaces append value "bs.health"
diff --git a/modules/bs.health/data/bs.health/function/__unload__.mcfunction b/modules/bs.health/data/bs.health/function/__unload__.mcfunction
new file mode 100644
index 0000000000..75db205f8c
--- /dev/null
+++ b/modules/bs.health/data/bs.health/function/__unload__.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard objectives remove bs.ctx
+scoreboard objectives remove bs.ttl
+
+data remove storage bs:const health
+data remove storage bs:data health
+data remove storage bs:out health
diff --git a/modules/bs.health/data/bs.health/function/add/health.mcfunction b/modules/bs.health/data/bs.health/function/add/health.mcfunction
new file mode 100644
index 0000000000..2f8b03a69e
--- /dev/null
+++ b/modules/bs.health/data/bs.health/function/add/health.mcfunction
@@ -0,0 +1,31 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Note: Thanks to XanBelOr for giving the idea to use an advancement to subtick heal the player.
+
+$execute store result score #h bs.ctx run data get storage bs:const health.point $(points)
+
+execute store success score #s bs.ctx run attribute @s minecraft:max_health modifier value get bs.health:limit
+execute if score #s bs.ctx matches 1 store result score #p bs.ctx run attribute @s minecraft:max_health get 100000
+execute if score #s bs.ctx matches 0 store result score #p bs.ctx run data get entity @s Health 100000
+scoreboard players operation #h bs.ctx += #p bs.ctx
+
+execute store result score #m bs.ctx run attribute @s minecraft:max_health get 100000
+execute store result score #a bs.ctx run attribute @s minecraft:max_health modifier value get bs.health:limit 100000
+scoreboard players operation #a bs.ctx -= #m bs.ctx
+execute store result storage bs:ctx x double 0.00001 run scoreboard players operation #a bs.ctx += #h bs.ctx
+execute if score #a bs.ctx matches 1.. run data modify storage bs:ctx x set value 0
+execute if score #p bs.ctx > #h bs.ctx run return run function bs.health:apply/decrease_health with storage bs:ctx
+execute if score #p bs.ctx < #h bs.ctx run return run function bs.health:apply/increase_health with storage bs:ctx
diff --git a/modules/bs.health/data/bs.health/function/add/max_health.mcfunction b/modules/bs.health/data/bs.health/function/add/max_health.mcfunction
new file mode 100644
index 0000000000..5e7c6e6c62
--- /dev/null
+++ b/modules/bs.health/data/bs.health/function/add/max_health.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result score #h bs.ctx run data get storage bs:const health.point $(points)
+
+execute store result score #m bs.ctx run attribute @s minecraft:max_health get 100000
+execute store result score #a bs.ctx run attribute @s minecraft:max_health modifier value get bs.health:limit
+scoreboard players operation #m bs.ctx -= #a bs.ctx
+execute store result storage bs:ctx y double 0.00001 run scoreboard players operation #m bs.ctx += #h bs.ctx
+
+execute store success score #s bs.ctx run attribute @s minecraft:max_health modifier value get bs.health:limit
+execute if score #s bs.ctx matches 1 store result storage bs:ctx x double 0.00001 run scoreboard players operation #a bs.ctx -= #h bs.ctx
+execute if score #s bs.ctx matches 1 if score #a bs.ctx matches ..0 run function bs.health:apply/increase_health with storage bs:ctx
+
+function bs.health:apply/set_max_health with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.health/function/apply/decrease_health.mcfunction b/modules/bs.health/data/bs.health/function/apply/decrease_health.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.health/function/apply/decrease_health.mcfunction
rename to modules/bs.health/data/bs.health/function/apply/decrease_health.mcfunction
index 57cd0259b3..a4e13cf743 100644
--- a/datapacks/Bookshelf/data/bs.health/function/apply/decrease_health.mcfunction
+++ b/modules/bs.health/data/bs.health/function/apply/decrease_health.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.health/function/apply/increase_health.mcfunction b/modules/bs.health/data/bs.health/function/apply/increase_health.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.health/function/apply/increase_health.mcfunction
rename to modules/bs.health/data/bs.health/function/apply/increase_health.mcfunction
index 253da98b87..39996070f6 100644
--- a/datapacks/Bookshelf/data/bs.health/function/apply/increase_health.mcfunction
+++ b/modules/bs.health/data/bs.health/function/apply/increase_health.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.health/function/apply/remove_modifier.mcfunction b/modules/bs.health/data/bs.health/function/apply/remove_modifier.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.health/function/apply/remove_modifier.mcfunction
rename to modules/bs.health/data/bs.health/function/apply/remove_modifier.mcfunction
index e7809717f4..a33261e195 100644
--- a/datapacks/Bookshelf/data/bs.health/function/apply/remove_modifier.mcfunction
+++ b/modules/bs.health/data/bs.health/function/apply/remove_modifier.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.health/function/apply/set_max_health.mcfunction b/modules/bs.health/data/bs.health/function/apply/set_max_health.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.health/function/apply/set_max_health.mcfunction
rename to modules/bs.health/data/bs.health/function/apply/set_max_health.mcfunction
index 4140158de8..71a9b55efc 100644
--- a/datapacks/Bookshelf/data/bs.health/function/apply/set_max_health.mcfunction
+++ b/modules/bs.health/data/bs.health/function/apply/set_max_health.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.health/data/bs.health/function/get/health.mcfunction b/modules/bs.health/data/bs.health/function/get/health.mcfunction
new file mode 100644
index 0000000000..c654c1f635
--- /dev/null
+++ b/modules/bs.health/data/bs.health/function/get/health.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store success score #s bs.ctx run attribute @s minecraft:max_health modifier value get bs.health:limit
+execute if score #s bs.ctx matches 1 store result storage bs:out health.get_health double 0.00001 run attribute @s minecraft:max_health get 100000
+execute if score #s bs.ctx matches 0 run data modify storage bs:out health.get_health set from entity @s Health
+$return run data get storage bs:out health.get_health $(scale)
diff --git a/modules/bs.health/data/bs.health/function/get/max_health.mcfunction b/modules/bs.health/data/bs.health/function/get/max_health.mcfunction
new file mode 100644
index 0000000000..ba33ef35a0
--- /dev/null
+++ b/modules/bs.health/data/bs.health/function/get/max_health.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #m bs.ctx run attribute @s minecraft:max_health get 100000
+execute store result score #a bs.ctx run attribute @s minecraft:max_health modifier value get bs.health:limit 100000
+execute store result storage bs:out health.get_max_health double 0.00001 run scoreboard players operation #m bs.ctx -= #a bs.ctx
+$return run data get storage bs:out health.get_max_health $(scale)
diff --git a/modules/bs.health/data/bs.health/function/set/health.mcfunction b/modules/bs.health/data/bs.health/function/set/health.mcfunction
new file mode 100644
index 0000000000..1c9954b009
--- /dev/null
+++ b/modules/bs.health/data/bs.health/function/set/health.mcfunction
@@ -0,0 +1,28 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Note: Thanks to XanBelOr for giving the idea to use an advancement to subtick heal the player.
+
+$execute store result score #h bs.ctx run data get storage bs:const health.point $(points)
+
+execute store result score #m bs.ctx run attribute @s minecraft:max_health get 100000
+execute store result score #a bs.ctx run attribute @s minecraft:max_health modifier value get bs.health:limit 100000
+scoreboard players operation #m bs.ctx -= #a bs.ctx
+
+execute store result score #p bs.ctx run data get entity @s Health 100000
+execute store result storage bs:ctx x double -0.00001 run scoreboard players operation #m bs.ctx -= #h bs.ctx
+execute if score #m bs.ctx matches ..-1 run data modify storage bs:ctx x set value 0
+execute if score #p bs.ctx > #h bs.ctx run return run function bs.health:apply/decrease_health with storage bs:ctx
+execute if score #p bs.ctx < #h bs.ctx run return run function bs.health:apply/increase_health with storage bs:ctx
diff --git a/modules/bs.health/data/bs.health/function/set/max_health.mcfunction b/modules/bs.health/data/bs.health/function/set/max_health.mcfunction
new file mode 100644
index 0000000000..b461fbae8b
--- /dev/null
+++ b/modules/bs.health/data/bs.health/function/set/max_health.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:ctx y double 0.00001 store result score #h bs.ctx run data get storage bs:const health.point $(points)
+
+execute store success score #s bs.ctx run attribute @s minecraft:max_health modifier value get bs.health:limit
+execute if score #s bs.ctx matches 1 store result score #m bs.ctx run attribute @s minecraft:max_health get 100000
+execute if score #s bs.ctx matches 1 store result storage bs:ctx x double 0.00001 run scoreboard players operation #m bs.ctx -= #h bs.ctx
+execute if score #s bs.ctx matches 1 if score #m bs.ctx matches ..0 run function bs.health:apply/increase_health with storage bs:ctx
+
+function bs.health:apply/set_max_health with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.health/function/time_to_live/next_tick.mcfunction b/modules/bs.health/data/bs.health/function/time_to_live/next_tick.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.health/function/time_to_live/next_tick.mcfunction
rename to modules/bs.health/data/bs.health/function/time_to_live/next_tick.mcfunction
index b1a58d946b..4f0e52f321 100644
--- a/datapacks/Bookshelf/data/bs.health/function/time_to_live/next_tick.mcfunction
+++ b/modules/bs.health/data/bs.health/function/time_to_live/next_tick.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.health/function/time_to_live/normalize_unit.mcfunction b/modules/bs.health/data/bs.health/function/time_to_live/normalize_unit.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.health/function/time_to_live/normalize_unit.mcfunction
rename to modules/bs.health/data/bs.health/function/time_to_live/normalize_unit.mcfunction
index 2023af7be5..a6cb64e2c7 100644
--- a/datapacks/Bookshelf/data/bs.health/function/time_to_live/normalize_unit.mcfunction
+++ b/modules/bs.health/data/bs.health/function/time_to_live/normalize_unit.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.health/function/time_to_live/register_callback.mcfunction b/modules/bs.health/data/bs.health/function/time_to_live/register_callback.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.health/function/time_to_live/register_callback.mcfunction
rename to modules/bs.health/data/bs.health/function/time_to_live/register_callback.mcfunction
index 758889792b..e2b2f9f907 100644
--- a/datapacks/Bookshelf/data/bs.health/function/time_to_live/register_callback.mcfunction
+++ b/modules/bs.health/data/bs.health/function/time_to_live/register_callback.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.health/function/time_to_live/register_unit.mcfunction b/modules/bs.health/data/bs.health/function/time_to_live/register_unit.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.health/function/time_to_live/register_unit.mcfunction
rename to modules/bs.health/data/bs.health/function/time_to_live/register_unit.mcfunction
index 61170a06ed..b326c27c12 100644
--- a/datapacks/Bookshelf/data/bs.health/function/time_to_live/register_unit.mcfunction
+++ b/modules/bs.health/data/bs.health/function/time_to_live/register_unit.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.health/function/time_to_live/run_callback.mcfunction b/modules/bs.health/data/bs.health/function/time_to_live/run_callback.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.health/function/time_to_live/run_callback.mcfunction
rename to modules/bs.health/data/bs.health/function/time_to_live/run_callback.mcfunction
index 5c1fec6839..864a4a701b 100644
--- a/datapacks/Bookshelf/data/bs.health/function/time_to_live/run_callback.mcfunction
+++ b/modules/bs.health/data/bs.health/function/time_to_live/run_callback.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.health/function/time_to_live/time_out.mcfunction b/modules/bs.health/data/bs.health/function/time_to_live/time_out.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.health/function/time_to_live/time_out.mcfunction
rename to modules/bs.health/data/bs.health/function/time_to_live/time_out.mcfunction
index 3c7c0c58e5..8b62e16d4b 100644
--- a/datapacks/Bookshelf/data/bs.health/function/time_to_live/time_out.mcfunction
+++ b/modules/bs.health/data/bs.health/function/time_to_live/time_out.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.health/data/bs.health/function/time_to_live/time_to_live.mcfunction b/modules/bs.health/data/bs.health/function/time_to_live/time_to_live.mcfunction
new file mode 100644
index 0000000000..8b1f0f6339
--- /dev/null
+++ b/modules/bs.health/data/bs.health/function/time_to_live/time_to_live.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:ctx _ set value $(with)
+
+execute if data storage bs:ctx _.on_death run function bs.health:time_to_live/register_callback with entity @s
+execute if data storage bs:ctx _.unit run function bs.health:time_to_live/register_unit with storage bs:ctx _
+execute if data storage bs:ctx _.time store result score @s bs.ttl run data get storage bs:ctx _.time
+schedule function bs.health:time_to_live/next_tick 1t
diff --git a/datapacks/Bookshelf/data/bs.health/tags/function/add_health.json b/modules/bs.health/data/bs.health/tags/function/add_health.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.health/tags/function/add_health.json
rename to modules/bs.health/data/bs.health/tags/function/add_health.json
index d1ea90dcef..90fe76ffe9 100644
--- a/datapacks/Bookshelf/data/bs.health/tags/function/add_health.json
+++ b/modules/bs.health/data/bs.health/tags/function/add_health.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#add-remove",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/health.html#add-remove",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.health/tags/function/add_max_health.json b/modules/bs.health/data/bs.health/tags/function/add_max_health.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.health/tags/function/add_max_health.json
rename to modules/bs.health/data/bs.health/tags/function/add_max_health.json
index 92cf3f0119..0904561935 100644
--- a/datapacks/Bookshelf/data/bs.health/tags/function/add_max_health.json
+++ b/modules/bs.health/data/bs.health/tags/function/add_max_health.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#add-remove",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/health.html#add-remove",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.health/tags/function/get_health.json b/modules/bs.health/data/bs.health/tags/function/get_health.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.health/tags/function/get_health.json
rename to modules/bs.health/data/bs.health/tags/function/get_health.json
index 2dafe51a42..34a533f504 100644
--- a/datapacks/Bookshelf/data/bs.health/tags/function/get_health.json
+++ b/modules/bs.health/data/bs.health/tags/function/get_health.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#get",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/health.html#get",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.health/tags/function/get_max_health.json b/modules/bs.health/data/bs.health/tags/function/get_max_health.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.health/tags/function/get_max_health.json
rename to modules/bs.health/data/bs.health/tags/function/get_max_health.json
index d1f93e98bc..eb8ae84e8b 100644
--- a/datapacks/Bookshelf/data/bs.health/tags/function/get_max_health.json
+++ b/modules/bs.health/data/bs.health/tags/function/get_max_health.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#get",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/health.html#get",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.health/tags/function/set_health.json b/modules/bs.health/data/bs.health/tags/function/set_health.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.health/tags/function/set_health.json
rename to modules/bs.health/data/bs.health/tags/function/set_health.json
index af4e89ee01..f2d95cefec 100644
--- a/datapacks/Bookshelf/data/bs.health/tags/function/set_health.json
+++ b/modules/bs.health/data/bs.health/tags/function/set_health.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#set",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/health.html#set",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.health/tags/function/set_max_health.json b/modules/bs.health/data/bs.health/tags/function/set_max_health.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.health/tags/function/set_max_health.json
rename to modules/bs.health/data/bs.health/tags/function/set_max_health.json
index b2e79d9618..d942a77211 100644
--- a/datapacks/Bookshelf/data/bs.health/tags/function/set_max_health.json
+++ b/modules/bs.health/data/bs.health/tags/function/set_max_health.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#set",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/health.html#set",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.health/tags/function/time_to_live.json b/modules/bs.health/data/bs.health/tags/function/time_to_live.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.health/tags/function/time_to_live.json
rename to modules/bs.health/data/bs.health/tags/function/time_to_live.json
index 357aef08a9..7303d10c77 100644
--- a/datapacks/Bookshelf/data/bs.health/tags/function/time_to_live.json
+++ b/modules/bs.health/data/bs.health/tags/function/time_to_live.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/health.html#time-to-live",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/health.html#time-to-live",
"authors": [
"Aksiome",
"Leirof"
diff --git a/modules/bs.health/data/bs.health/test/add/concurrent.mcfunction b/modules/bs.health/data/bs.health/test/add/concurrent.mcfunction
new file mode 100644
index 0000000000..24a46c3879
--- /dev/null
+++ b/modules/bs.health/data/bs.health/test/add/concurrent.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+function #bs.health:add_health {points:5.0}
+function #bs.health:add_max_health {points:10.0}
+function #bs.health:add_health {points:5.0}
+function #bs.health:add_health {points:-10.0}
+execute store result score #r bs.ctx run data get entity @s Health
+assert score #r bs.ctx matches 15
+
+function #bs.health:add_health {points:20.0}
+await delay 1t
+execute store result score #r bs.ctx run data get entity @s Health
+assert score #r bs.ctx matches 30
diff --git a/modules/bs.health/data/bs.health/test/add/health.mcfunction b/modules/bs.health/data/bs.health/test/add/health.mcfunction
new file mode 100644
index 0000000000..e4852100c0
--- /dev/null
+++ b/modules/bs.health/data/bs.health/test/add/health.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+function #bs.health:add_health {points:-10}
+execute store result score #r bs.ctx run data get entity @s Health
+assert score #r bs.ctx matches 10
+
+function #bs.health:add_health {points:5}
+await delay 1t
+execute store result score #r bs.ctx run data get entity @s Health
+assert score #r bs.ctx matches 15
diff --git a/modules/bs.health/data/bs.health/test/add/max_health.mcfunction b/modules/bs.health/data/bs.health/test/add/max_health.mcfunction
new file mode 100644
index 0000000000..11e3a60823
--- /dev/null
+++ b/modules/bs.health/data/bs.health/test/add/max_health.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+function #bs.health:add_max_health {points:10}
+execute store result score #r bs.ctx run attribute @s minecraft:max_health get
+assert score #r bs.ctx matches 30
+
+function #bs.health:add_max_health {points:-5}
+execute store result score #r bs.ctx run attribute @s minecraft:max_health get
+assert score #r bs.ctx matches 25
diff --git a/modules/bs.health/data/bs.health/test/get/health.mcfunction b/modules/bs.health/data/bs.health/test/get/health.mcfunction
new file mode 100644
index 0000000000..b435eb8767
--- /dev/null
+++ b/modules/bs.health/data/bs.health/test/get/health.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute store result score #r bs.ctx run function #bs.health:get_health {scale:1}
+assert score #r bs.ctx matches 20
+
+attribute @s minecraft:max_health modifier add bs.health:limit -5 add_value
+execute store result score #r bs.ctx run function #bs.health:get_health {scale:1}
+assert score #r bs.ctx matches 15
diff --git a/modules/bs.health/data/bs.health/test/get/max_health.mcfunction b/modules/bs.health/data/bs.health/test/get/max_health.mcfunction
new file mode 100644
index 0000000000..76884bb2cf
--- /dev/null
+++ b/modules/bs.health/data/bs.health/test/get/max_health.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute store result score #r bs.ctx run function #bs.health:get_max_health {scale:1}
+assert score #r bs.ctx matches 20
+
+attribute @s minecraft:max_health modifier add bs.health:limit -10 add_value
+execute store result score #r bs.ctx run function #bs.health:get_max_health {scale:1}
+assert score #r bs.ctx matches 20
diff --git a/modules/bs.health/data/bs.health/test/set/concurrent.mcfunction b/modules/bs.health/data/bs.health/test/set/concurrent.mcfunction
new file mode 100644
index 0000000000..0dfe28ee14
--- /dev/null
+++ b/modules/bs.health/data/bs.health/test/set/concurrent.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+function #bs.health:set_health {points:10.0}
+function #bs.health:set_max_health {points:30.0}
+execute store result score #r bs.ctx run data get entity @s Health
+assert score #r bs.ctx matches 10
+
+function #bs.health:set_max_health {points:20.0}
+function #bs.health:set_health {points:30.0}
+await delay 1t
+execute store result score #r bs.ctx run data get entity @s Health
+assert score #r bs.ctx matches 20
diff --git a/modules/bs.health/data/bs.health/test/set/health.mcfunction b/modules/bs.health/data/bs.health/test/set/health.mcfunction
new file mode 100644
index 0000000000..2c37f76d52
--- /dev/null
+++ b/modules/bs.health/data/bs.health/test/set/health.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+function #bs.health:set_health {points:10}
+execute store result score #r bs.ctx run data get entity @s Health
+assert score #r bs.ctx matches 10
+
+function #bs.health:set_health {points:15}
+await delay 1t
+execute store result score #r bs.ctx run data get entity @s Health
+assert score #r bs.ctx matches 15
diff --git a/modules/bs.health/data/bs.health/test/set/max_health.mcfunction b/modules/bs.health/data/bs.health/test/set/max_health.mcfunction
new file mode 100644
index 0000000000..90c25734d8
--- /dev/null
+++ b/modules/bs.health/data/bs.health/test/set/max_health.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+function #bs.health:set_max_health {points:10}
+execute store result score #r bs.ctx run attribute @s minecraft:max_health get
+assert score #r bs.ctx matches 10
+
+function #bs.health:set_max_health {points:20}
+execute store result score #r bs.ctx run attribute @s minecraft:max_health get
+assert score #r bs.ctx matches 20
diff --git a/modules/bs.health/data/bs.health/test/time_to_live.mcfunction b/modules/bs.health/data/bs.health/test/time_to_live.mcfunction
new file mode 100644
index 0000000000..68602e653d
--- /dev/null
+++ b/modules/bs.health/data/bs.health/test/time_to_live.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set #t bs.ctx 0
+summon minecraft:armor_stand ~ ~ ~ {Tags:["bs.packtest"]}
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest] run function #bs.health:time_to_live {with:{time:5,on_death:"scoreboard players set #t bs.ctx 1"}}
+await delay 5t
+
+assert score #t bs.ctx matches 1
+assert not entity @e[type=minecraft:armor_stand,distance=..1] inside
diff --git a/modules/bs.health/module.json b/modules/bs.health/module.json
new file mode 100644
index 0000000000..83c8ab5065
--- /dev/null
+++ b/modules/bs.health/module.json
@@ -0,0 +1,17 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.health",
+ "load": "."
+ },
+ "meta": {
+ "name": "Health",
+ "slug": "bookshelf-health",
+ "description": "Efficiently manage the lifecycle and vital aspects of an entity.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/health.html",
+ "tags": ["default"],
+ "weak_dependencies": [
+ "bs.log"
+ ]
+ }
+}
diff --git a/modules/bs.hitbox/README.md b/modules/bs.hitbox/README.md
new file mode 100644
index 0000000000..b2ba46f430
--- /dev/null
+++ b/modules/bs.hitbox/README.md
@@ -0,0 +1,14 @@
+# 🎯 Bookshelf Hitbox
+
+This datapack allows you to get and check the hitboxes of blocks and entities.
+
+> “Talent hits a target no one else can hit; Genius hits a target no one else can see.”
+>
+> -- Arthur Schopenhauer
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/__load__.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/__load__.mcfunction
new file mode 100644
index 0000000000..a6cdd53e81
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/__load__.mcfunction
@@ -0,0 +1,37 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+forceload add -30000000 1600
+setblock -30000000 0 1606 minecraft:decorated_pot
+
+scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
+
+scoreboard players set 2 bs.const 2
+scoreboard players set 11 bs.const 11
+scoreboard players set 15 bs.const 15
+scoreboard players set 255 bs.const 255
+scoreboard players set 1000 bs.const 1000
+scoreboard players set 65536 bs.const 65536
+scoreboard players set 3129871 bs.const 3129871
+scoreboard players set 1000000 bs.const 1000000
+scoreboard players set 10000000 bs.const 10000000
+scoreboard players set 16777216 bs.const 16777216
+scoreboard players set 42317861 bs.const 42317861
+scoreboard players set 116129781 bs.const 116129781
+scoreboard players set 268435456 bs.const 268435456
+
+data modify storage bs:data hitbox.offsets set value []
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/__unload__.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/__unload__.mcfunction
new file mode 100644
index 0000000000..0ec3047dbc
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/__unload__.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock -30000000 0 1606 minecraft:air
+forceload remove -30000000 1600
+
+scoreboard objectives remove bs.const
+scoreboard objectives remove bs.ctx
+scoreboard objectives remove bs.out
+
+data remove storage bs:out hitbox
+data remove storage bs:data hitbox
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/get_block/get_block.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_block/get_block.mcfunction
new file mode 100644
index 0000000000..bd3a1032d5
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_block/get_block.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute unless block ~ ~ ~ #bs.hitbox:is_composite run \
+ return run data modify storage bs:out hitbox set value {shape:[[0.0,0.0,0.0,16.0,16.0,16.0]]}
+
+loot replace block -30000000 0 1606 container.0 loot bs.hitbox:get/get_block
+data modify storage bs:out hitbox set from block -30000000 0 1606 item.components."minecraft:custom_data"
+execute if block ~ ~ ~ #bs.hitbox:has_offset summon minecraft:marker run function bs.hitbox:get_block/offset/get
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_block/offset/clamp.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_block/offset/clamp.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_block/offset/clamp.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_block/offset/clamp.mcfunction
index 0fe0ce158b..787144b769 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_block/offset/clamp.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_block/offset/clamp.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/get_block/offset/compute.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_block/offset/compute.mcfunction
new file mode 100644
index 0000000000..5a727f1c28
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_block/offset/compute.mcfunction
@@ -0,0 +1,90 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# compute the offset since we only care about bits 16 to 24, overflow of the scoreboard is not an issue
+data modify storage bs:data hitbox.offsets append value {x:0,z:0,k:[0,0]}
+execute store result storage bs:data hitbox.offsets[-1].k[0] int 1 run scoreboard players get #u bs.ctx
+execute store result storage bs:data hitbox.offsets[-1].k[1] int 1 run scoreboard players get #v bs.ctx
+
+# compute i = (x * 3129871) ^ (z * 116129781) - [Triton365 fast bitwise xor (using floating-point errors)]
+execute store result entity @s Pos[1] double .000000007450580596923828125 run scoreboard players operation #u bs.ctx *= 3129871 bs.const
+execute store result entity @s Pos[2] double .000000007450580596923828125 run scoreboard players operation #v bs.ctx *= 116129781 bs.const
+execute at @s \
+ positioned -.00000000186264514923095703125 ~33554496 ~33554496 facing ~ ~-.0000000037252902984619140625 ~-.0000000037252902984619140625 positioned ^ ^ ^-.00000000186264514923095703125 \
+ positioned ~ ~33554431.9999999962747097015380859375 ~33554431.9999999962747097015380859375 facing ~ ~-.000000007450580596923828125 ~-.000000007450580596923828125 positioned ^ ^ ^-.0000000037252902984619140625 \
+ positioned ~ ~67108863.999999992549419403076171875 ~67108863.999999992549419403076171875 facing ~ ~-.00000001490116119384765625 ~-.00000001490116119384765625 positioned ^ ^ ^-.000000007450580596923828125 \
+ positioned ~ ~134217727.99999998509883880615234375 ~134217727.99999998509883880615234375 facing ~ ~-.0000000298023223876953125 ~-.0000000298023223876953125 positioned ^ ^ ^-.00000001490116119384765625 \
+ positioned ~ ~268435455.9999999701976776123046875 ~268435455.9999999701976776123046875 facing ~ ~-.000000059604644775390625 ~-.000000059604644775390625 positioned ^ ^ ^-.0000000298023223876953125 \
+ positioned ~ ~536870911.999999940395355224609375 ~536870911.999999940395355224609375 facing ~ ~-.00000011920928955078125 ~-.00000011920928955078125 positioned ^ ^ ^-.000000059604644775390625 \
+ positioned ~ ~1073741823.99999988079071044921875 ~1073741823.99999988079071044921875 facing ~ ~-.0000002384185791015625 ~-.0000002384185791015625 positioned ^ ^ ^-.00000011920928955078125 \
+ positioned ~ ~2147483647.9999997615814208984375 ~2147483647.9999997615814208984375 facing ~ ~-.000000476837158203125 ~-.000000476837158203125 positioned ^ ^ ^-.0000002384185791015625 \
+ positioned ~ ~4294967295.999999523162841796875 ~4294967295.999999523162841796875 facing ~ ~-.00000095367431640625 ~-.00000095367431640625 positioned ^ ^ ^-.000000476837158203125 \
+ positioned ~ ~8589934591.99999904632568359375 ~8589934591.99999904632568359375 facing ~ ~-.0000019073486328125 ~-.0000019073486328125 positioned ^ ^ ^-.00000095367431640625 \
+ positioned ~ ~17179869183.9999980926513671875 ~17179869183.9999980926513671875 facing ~ ~-.000003814697265625 ~-.000003814697265625 positioned ^ ^ ^-.0000019073486328125 \
+ positioned ~ ~34359738367.999996185302734375 ~34359738367.999996185302734375 facing ~ ~-.00000762939453125 ~-.00000762939453125 positioned ^ ^ ^-.000003814697265625 \
+ positioned ~ ~68719476735.99999237060546875 ~68719476735.99999237060546875 facing ~ ~-.0000152587890625 ~-.0000152587890625 positioned ^ ^ ^-.00000762939453125 \
+ positioned ~ ~137438953471.9999847412109375 ~137438953471.9999847412109375 facing ~ ~-.000030517578125 ~-.000030517578125 positioned ^ ^ ^-.0000152587890625 \
+ positioned ~ ~274877906943.999969482421875 ~274877906943.999969482421875 facing ~ ~-.00006103515625 ~-.00006103515625 positioned ^ ^ ^-.000030517578125 \
+ positioned ~ ~549755813887.99993896484375 ~549755813887.99993896484375 facing ~ ~-.0001220703125 ~-.0001220703125 positioned ^ ^ ^-.00006103515625 \
+ positioned ~ ~1099511627775.9998779296875 ~1099511627775.9998779296875 facing ~ ~-.000244140625 ~-.000244140625 positioned ^ ^ ^-.0001220703125 \
+ positioned ~ ~2199023255551.999755859375 ~2199023255551.999755859375 facing ~ ~-.00048828125 ~-.00048828125 positioned ^ ^ ^-.000244140625 \
+ positioned ~ ~4398046511103.99951171875 ~4398046511103.99951171875 facing ~ ~-.0009765625 ~-.0009765625 positioned ^ ^ ^-.00048828125 \
+ positioned ~ ~8796093022207.9990234375 ~8796093022207.9990234375 facing ~ ~-.001953125 ~-.001953125 positioned ^ ^ ^-.0009765625 \
+ positioned ~ ~17592186044415.998046875 ~17592186044415.998046875 facing ~ ~-.00390625 ~-.00390625 positioned ^ ^ ^-.001953125 \
+ positioned ~ ~35184372088831.99609375 ~35184372088831.99609375 facing ~ ~-.0078125 ~-.0078125 positioned ^ ^ ^-.00390625 \
+ positioned ~ ~70368744177663.9921875 ~70368744177663.9921875 facing ~ ~-.015625 ~-.015625 positioned ^ ^ ^-.0078125 \
+ positioned ~ ~140737488355327.984375 ~140737488355327.984375 facing ~ ~-.03125 ~-.03125 positioned ^ ^ ^-.015625 \
+ positioned ~ ~281474976710655.96875 ~281474976710655.96875 facing ~ ~-.0625 ~-.0625 positioned ^ ^ ^-.03125 \
+ positioned ~ ~562949953421311.9375 ~562949953421311.9375 facing ~ ~-.125 ~-.125 positioned ^ ^ ^-.0625 \
+ positioned ~ ~1125899906842623.875 ~1125899906842623.875 facing ~ ~-.25 ~-.25 positioned ^ ^ ^-.125 \
+ positioned ~ ~2251799813685247.75 ~2251799813685247.75 facing ~ ~-.5 ~-.5 positioned ^ ^ ^-.25 \
+ positioned ~ ~4503599627370495.5 ~4503599627370495.5 facing ~ ~-1 ~-1 positioned ^ ^ ^-.5 \
+ positioned ~ ~9007199254740991 ~9007199254740991 facing ~ ~-2 ~-2 positioned ^ ^ ^-1 \
+ positioned ~ ~18014398509481982 ~18014398509481982 facing ~ ~-4 ~-4 positioned ^ ^ ^2 \
+ run tp @s ~ 0 0.
+execute store result score #i bs.ctx run data get entity @s Pos[0] 1073741824
+scoreboard players operation #i bs.ctx -= #u bs.ctx
+execute store result score #j bs.ctx run scoreboard players operation #i bs.ctx -= #v bs.ctx
+
+# compute i = (i * i * 42317861) + (i * 11)
+scoreboard players operation #j bs.ctx *= #j bs.ctx
+scoreboard players operation #j bs.ctx *= 42317861 bs.const
+scoreboard players operation #i bs.ctx *= 11 bs.const
+execute store result score #u bs.ctx store result score #v bs.ctx run scoreboard players operation #i bs.ctx += #j bs.ctx
+
+# compute offset x = (((i >> 16 & 15) / 15.0) - 0.5) * 0.5
+scoreboard players operation #u bs.ctx /= 65536 bs.const
+scoreboard players operation #u bs.ctx *= 268435456 bs.const
+scoreboard players operation #u bs.ctx /= 268435456 bs.const
+execute if score #u bs.ctx matches ..-1 run scoreboard players add #u bs.ctx 16
+scoreboard players operation #u bs.ctx *= 10000000 bs.const
+scoreboard players operation #u bs.ctx /= 15 bs.const
+scoreboard players remove #u bs.ctx 5000000
+scoreboard players operation #u bs.ctx /= 2 bs.const
+
+# compute offset z = (((i >> 24 & 15) / 15.0) - 0.5) * 0.5
+scoreboard players operation #v bs.ctx /= 16777216 bs.const
+scoreboard players operation #v bs.ctx *= 268435456 bs.const
+scoreboard players operation #v bs.ctx /= 268435456 bs.const
+execute if score #v bs.ctx matches ..-1 run scoreboard players add #v bs.ctx 16
+scoreboard players operation #v bs.ctx *= 10000000 bs.const
+scoreboard players operation #v bs.ctx /= 15 bs.const
+scoreboard players remove #v bs.ctx 5000000
+scoreboard players operation #v bs.ctx /= 2 bs.const
+
+# cache the result for better performance in future calls
+execute store result storage bs:out hitbox.offset.x double .0000001 run scoreboard players get #u bs.ctx
+execute store result storage bs:out hitbox.offset.z double .0000001 run scoreboard players get #v bs.ctx
+data modify storage bs:data hitbox.offsets[-1] merge from storage bs:out hitbox.offset
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_block/offset/fetch.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_block/offset/fetch.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_block/offset/fetch.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_block/offset/fetch.mcfunction
index 94162a2e37..0c4707517d 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_block/offset/fetch.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_block/offset/fetch.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/get_block/offset/get.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_block/offset/get.mcfunction
new file mode 100644
index 0000000000..d024f32868
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_block/offset/get.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #u bs.ctx store result storage bs:ctx x int 1 run data get entity @s Pos[0]
+execute store result score #v bs.ctx store result storage bs:ctx z int 1 run data get entity @s Pos[2]
+
+function bs.hitbox:get_block/offset/fetch with storage bs:ctx
+execute if score #s bs.ctx matches 0 run function bs.hitbox:get_block/offset/compute
+kill @s
+
+execute if block ~ ~ ~ minecraft:pointed_dripstone run function bs.hitbox:get_block/offset/clamp {min:-1250000,max:1250000}
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/get_entity/dispatch.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/dispatch.mcfunction
new file mode 100644
index 0000000000..51830f3903
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/dispatch.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$function bs.hitbox:get_entity/registry/$(y)
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/get_entity.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/get_entity.mcfunction
similarity index 93%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/get_entity.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/get_entity.mcfunction
index 50f29a28d3..5a1f111bba 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/get_entity.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/get_entity.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#get
# ------------------------------------------------------------------------------------------------------------
scoreboard players set #i bs.ctx 0
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/0.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/0.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/0.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/0.mcfunction
index 71b51a2944..92fbcbd5f4 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/0.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/0.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/1.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/1.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/1.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/1.mcfunction
index 91027c4fc9..dd262ed806 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/1.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/1.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/10.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/10.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/10.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/10.mcfunction
index 9334818871..265e0ea6c1 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/10.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/10.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/11.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/11.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/11.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/11.mcfunction
index e9e5e8b0a4..2451105dfe 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/11.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/11.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/12.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/12.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/12.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/12.mcfunction
index 00eadc134c..3a02e66053 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/12.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/12.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/13.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/13.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/13.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/13.mcfunction
index 2240503426..d76ed887fd 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/13.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/13.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/14.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/14.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/14.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/14.mcfunction
index f9f1206d65..d700d3c60f 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/14.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/14.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/15.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/15.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/15.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/15.mcfunction
index c425d76a15..7c00435ffc 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/15.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/15.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/16.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/16.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/16.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/16.mcfunction
index 3e4ff27f75..f7629c4894 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/16.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/16.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/17.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/17.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/17.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/17.mcfunction
index 4a534ded66..c9601125f3 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/17.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/17.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/18.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/18.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/18.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/18.mcfunction
index 66b54d461c..82d711b93c 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/18.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/18.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/19.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/19.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/19.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/19.mcfunction
index 55622d6eec..0ba01bf62f 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/19.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/19.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/2.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/2.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/2.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/2.mcfunction
index b3503faf51..086849d7bd 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/2.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/2.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/20.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/20.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/20.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/20.mcfunction
index 1fd62ad6f4..8932b07543 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/20.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/20.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/21.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/21.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/21.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/21.mcfunction
index 3eb1bfd243..fd11a03c77 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/21.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/21.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/22.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/22.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/22.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/22.mcfunction
index f2e5e7dc80..900cfbe938 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/22.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/22.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/23.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/23.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/23.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/23.mcfunction
index 3d51957d96..211f60f3bb 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/23.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/23.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/24.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/24.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/24.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/24.mcfunction
index 6c31338177..8fc08b193e 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/24.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/24.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/25.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/25.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/25.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/25.mcfunction
index 45ef767493..0cb4afa197 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/25.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/25.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/26.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/26.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/26.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/26.mcfunction
index a59e69de7b..4a6d51b665 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/26.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/26.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/27.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/27.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/27.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/27.mcfunction
index 613d28a48f..e57e624f4e 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/27.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/27.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/28.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/28.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/28.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/28.mcfunction
index 583a47e2ae..d26511e63e 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/28.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/28.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/29.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/29.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/29.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/29.mcfunction
index 6a9bc0d06b..a4a826d373 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/29.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/29.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/3.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/3.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/3.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/3.mcfunction
index 293088791a..6460b74b48 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/3.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/3.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/30.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/30.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/30.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/30.mcfunction
index 498a03d75d..c2b7c96bd5 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/30.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/30.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/31.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/31.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/31.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/31.mcfunction
index e51cc1b7e0..faaf2b4a49 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/31.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/31.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/32.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/32.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/32.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/32.mcfunction
index 93a864e092..23d697c613 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/32.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/32.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/33.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/33.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/33.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/33.mcfunction
index 11d9d0748f..851f227f5c 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/33.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/33.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/34.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/34.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/34.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/34.mcfunction
index cd4a17ad5e..ef93ac9192 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/34.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/34.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/35.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/35.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/35.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/35.mcfunction
index a5758f967e..f0168399ea 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/35.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/35.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/36.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/36.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/36.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/36.mcfunction
index 276d0003b5..a76fcf5caa 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/36.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/36.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/37.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/37.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/37.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/37.mcfunction
index 77a256e707..fe3c0b73f1 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/37.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/37.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/38.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/38.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/38.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/38.mcfunction
index c9cd1dfc86..0cb435a215 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/38.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/38.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/39.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/39.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/39.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/39.mcfunction
index 47c7f27991..ea4f998798 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/39.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/39.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/4.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/4.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/4.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/4.mcfunction
index 739f61c3f9..27187d1228 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/4.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/4.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/40.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/40.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/40.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/40.mcfunction
index f0b5a6c2e4..c7927fa710 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/40.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/40.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/41.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/41.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/41.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/41.mcfunction
index 11ba1ff44b..56d9d408ed 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/41.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/41.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/42.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/42.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/42.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/42.mcfunction
index 2a938e4a2e..9b7cd58656 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/42.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/42.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/43.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/43.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/43.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/43.mcfunction
index 9201e91976..ae4b1f60de 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/43.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/43.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/44.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/44.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/44.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/44.mcfunction
index f49b6083e9..3d6457a52e 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/44.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/44.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/45.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/45.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/45.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/45.mcfunction
index 4d5f88f8bf..23cb4ddb7c 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/45.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/45.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/46.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/46.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/46.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/46.mcfunction
index 6f6790b755..49560c3094 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/46.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/46.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/47.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/47.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/47.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/47.mcfunction
index e18dd79300..9c5cc0e947 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/47.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/47.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/48.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/48.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/48.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/48.mcfunction
index 1c4b269b1c..5eb5d6e64d 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/48.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/48.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/49.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/49.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/49.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/49.mcfunction
index 65fc1697d5..2e5534e8d3 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/49.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/49.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/5.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/5.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/5.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/5.mcfunction
index 10167218a5..a5e188e878 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/5.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/5.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/50.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/50.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/50.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/50.mcfunction
index 9d95d39ef6..de0540071f 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/50.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/50.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/51.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/51.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/51.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/51.mcfunction
index beb9e06071..28346d8a6c 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/51.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/51.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/52.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/52.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/52.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/52.mcfunction
index fabf940bf9..67c89585ea 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/52.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/52.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/53.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/53.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/53.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/53.mcfunction
index b41dcf8d1c..ae510b4146 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/53.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/53.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/54.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/54.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/54.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/54.mcfunction
index f13c176f86..e834ff5dc2 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/54.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/54.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/55.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/55.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/55.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/55.mcfunction
index 1900a82cda..997aca7993 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/55.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/55.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/56.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/56.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/56.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/56.mcfunction
index 3713705586..6343fcd137 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/56.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/56.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/57.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/57.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/57.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/57.mcfunction
index 4e5d712286..800e919e80 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/57.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/57.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/58.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/58.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/58.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/58.mcfunction
index 28dab2bd70..005ef63068 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/58.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/58.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/59.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/59.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/59.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/59.mcfunction
index 4f297081d3..0d9df9dc2c 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/59.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/59.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/6.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/6.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/6.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/6.mcfunction
index ab12cef6c9..3013ed9793 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/6.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/6.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/60.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/60.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/60.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/60.mcfunction
index 95c47cc9d3..5b0ffed1ec 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/60.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/60.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/61.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/61.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/61.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/61.mcfunction
index c1e050e409..b504d80e81 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/61.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/61.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/62.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/62.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/62.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/62.mcfunction
index 7aa9744c7b..84cd0d6a39 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/62.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/62.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/63.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/63.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/63.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/63.mcfunction
index 3f111358d4..2f569c6bb5 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/63.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/63.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/64.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/64.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/64.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/64.mcfunction
index c8a0bc753f..f6941e0397 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/64.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/64.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/65.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/65.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/65.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/65.mcfunction
index 203499dc77..1c32f794cd 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/65.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/65.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/66.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/66.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/66.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/66.mcfunction
index 7108fba1b8..f8657afdf3 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/66.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/66.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/67.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/67.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/67.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/67.mcfunction
index d4bcc7217f..2695d6222b 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/67.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/67.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/68.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/68.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/68.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/68.mcfunction
index e611074e3e..482c101beb 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/68.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/68.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/69.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/69.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/69.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/69.mcfunction
index b263127086..716e1f113d 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/69.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/69.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/7.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/7.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/7.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/7.mcfunction
index f49b2635a7..ebc58e2fd2 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/7.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/7.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/70.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/70.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/70.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/70.mcfunction
index ab7151cbe6..434c6fb336 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/70.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/70.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/71.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/71.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/71.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/71.mcfunction
index 7060a62d52..c6d5fc0c7f 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/71.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/71.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/72.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/72.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/72.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/72.mcfunction
index 3661171ad3..3672a0add2 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/72.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/72.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/8.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/8.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/8.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/8.mcfunction
index 54f9513751..2933dcb8d7 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/8.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/8.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/9.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/9.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/9.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/9.mcfunction
index 978e78a5f0..61ae6c4b01 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/get_entity/registry/9.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/get_entity/registry/9.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_block/check/check.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_block/check/check.mcfunction
new file mode 100644
index 0000000000..70dff2941b
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_block/check/check.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.hitbox:get_block
+execute store result score #u bs.ctx run data get storage bs:out hitbox.offset.x 1000000
+execute store result score #v bs.ctx run data get storage bs:out hitbox.offset.z 1000000
+return run function bs.hitbox:is_entity_in_block/check/loop
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_block/check/loop.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_block/check/loop.mcfunction
new file mode 100644
index 0000000000..a43e0b483e
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_block/check/loop.mcfunction
@@ -0,0 +1,40 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #i bs.ctx run data get storage bs:out hitbox.shape[-1][0] 62500
+execute store result score #j bs.ctx run data get storage bs:out hitbox.shape[-1][1] 62500
+execute store result score #k bs.ctx run data get storage bs:out hitbox.shape[-1][2] 62500
+execute store result score #o bs.ctx run data get storage bs:out hitbox.shape[-1][3] 62500
+execute store result score #p bs.ctx run data get storage bs:out hitbox.shape[-1][4] 62500
+execute store result score #q bs.ctx run data get storage bs:out hitbox.shape[-1][5] 62500
+
+# offset coordinates if needed
+scoreboard players operation #i bs.ctx += #u bs.ctx
+scoreboard players operation #o bs.ctx += #u bs.ctx
+scoreboard players operation #k bs.ctx += #v bs.ctx
+scoreboard players operation #q bs.ctx += #v bs.ctx
+
+# check aabb vs aabb collision
+execute \
+ if score #x bs.ctx < #o bs.ctx \
+ if score #l bs.ctx >= #i bs.ctx \
+ if score #y bs.ctx < #p bs.ctx \
+ if score #m bs.ctx >= #j bs.ctx \
+ if score #z bs.ctx < #q bs.ctx \
+ if score #n bs.ctx >= #k bs.ctx \
+run return 1
+
+data remove storage bs:out hitbox.shape[-1]
+execute if data storage bs:out hitbox.shape[0] run return run function bs.hitbox:is_entity_in_block/check/loop
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_block/is_entity_in_block.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_block/is_entity_in_block.mcfunction
similarity index 89%
rename from datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_block/is_entity_in_block.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_block/is_entity_in_block.mcfunction
index f8da03e00c..3f88f0d899 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_block/is_entity_in_block.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_block/is_entity_in_block.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-inside
# ------------------------------------------------------------------------------------------------------------
execute if block ~ ~ ~ #bs.hitbox:intangible run return 0
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_block/shaped.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_block/shaped.mcfunction
new file mode 100644
index 0000000000..5d3299a041
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_block/shaped.mcfunction
@@ -0,0 +1,36 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #x bs.ctx run data get storage bs:out hitbox.shape[-1][0] 62500
+execute store result score #y bs.ctx run data get storage bs:out hitbox.shape[-1][1] 62500
+execute store result score #z bs.ctx run data get storage bs:out hitbox.shape[-1][2] 62500
+execute store result score #l bs.ctx run data get storage bs:out hitbox.shape[-1][3] 62500
+execute store result score #m bs.ctx run data get storage bs:out hitbox.shape[-1][4] 62500
+execute store result score #n bs.ctx run data get storage bs:out hitbox.shape[-1][5] 62500
+
+execute summon minecraft:marker run function bs.hitbox:utils/get_negative_pos
+execute at @s align xyz summon minecraft:marker run function bs.hitbox:utils/get_relative_pos with storage bs:ctx
+execute store result score #i bs.ctx run data get storage bs:ctx _[0] 1000000
+execute store result score #j bs.ctx run data get storage bs:ctx _[1] 1000000
+execute store result score #k bs.ctx run data get storage bs:ctx _[2] 1000000
+
+scoreboard players operation #x bs.ctx += #i bs.ctx
+scoreboard players operation #y bs.ctx += #j bs.ctx
+scoreboard players operation #z bs.ctx += #k bs.ctx
+scoreboard players operation #l bs.ctx += #i bs.ctx
+scoreboard players operation #m bs.ctx += #j bs.ctx
+scoreboard players operation #n bs.ctx += #k bs.ctx
+
+return run function bs.hitbox:is_entity_in_block/check/check
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_block/sized.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_block/sized.mcfunction
new file mode 100644
index 0000000000..4bd781dd84
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_block/sized.mcfunction
@@ -0,0 +1,34 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #h bs.ctx run data get storage bs:out hitbox.height 1000
+execute store result score #w bs.ctx run data get storage bs:out hitbox.width 500
+execute store result score #s bs.ctx run data get storage bs:out hitbox.scale 1000
+scoreboard players operation #h bs.ctx *= #s bs.ctx
+scoreboard players operation #w bs.ctx *= #s bs.ctx
+
+execute summon minecraft:marker run function bs.hitbox:utils/get_negative_pos
+execute at @s summon minecraft:marker run function bs.hitbox:utils/get_relative_pos with storage bs:ctx
+execute store result score #l bs.ctx store result score #x bs.ctx run data get storage bs:ctx _[0] 1000000
+execute store result score #m bs.ctx store result score #y bs.ctx run data get storage bs:ctx _[1] 1000000
+execute store result score #n bs.ctx store result score #z bs.ctx run data get storage bs:ctx _[2] 1000000
+
+scoreboard players operation #x bs.ctx -= #w bs.ctx
+scoreboard players operation #z bs.ctx -= #w bs.ctx
+scoreboard players operation #l bs.ctx += #w bs.ctx
+scoreboard players operation #m bs.ctx += #h bs.ctx
+scoreboard players operation #n bs.ctx += #w bs.ctx
+
+return run function bs.hitbox:is_entity_in_block/check/check
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/check/check.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/check/check.mcfunction
new file mode 100644
index 0000000000..1f0afb3946
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/check/check.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+return run function bs.hitbox:is_entity_in_blocks/check/run with storage bs:ctx _
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/check/run.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/check/run.mcfunction
new file mode 100644
index 0000000000..3c18e8d01e
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/check/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute unless block ~ ~ ~ $(ignored_blocks) run return run function bs.hitbox:is_entity_in_block/check/check
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/is_entity_in_blocks.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/is_entity_in_blocks.mcfunction
similarity index 90%
rename from datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/is_entity_in_blocks.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/is_entity_in_blocks.mcfunction
index b7c274b229..e4b601c1aa 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/is_entity_in_blocks/is_entity_in_blocks.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/is_entity_in_blocks.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-inside
# ------------------------------------------------------------------------------------------------------------
execute if entity @s[type=#bs.hitbox:intangible] run return 0
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/recurse/init.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/recurse/init.mcfunction
new file mode 100644
index 0000000000..9dfc8fea99
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/recurse/init.mcfunction
@@ -0,0 +1,31 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation #i bs.ctx /= 1000000 bs.const
+scoreboard players operation #i bs.ctx *= 1000000 bs.const
+scoreboard players operation #x bs.ctx -= #i bs.ctx
+scoreboard players operation #l bs.ctx -= #i bs.ctx
+
+scoreboard players operation #j bs.ctx /= 1000000 bs.const
+scoreboard players operation #j bs.ctx *= 1000000 bs.const
+scoreboard players operation #y bs.ctx -= #j bs.ctx
+scoreboard players operation #m bs.ctx -= #j bs.ctx
+
+scoreboard players operation #k bs.ctx /= 1000000 bs.const
+scoreboard players operation #k bs.ctx *= 1000000 bs.const
+scoreboard players operation #z bs.ctx -= #k bs.ctx
+scoreboard players operation #n bs.ctx -= #k bs.ctx
+
+$execute at @s align xyz positioned ~$(x) ~$(y) ~$(z) run return run function bs.hitbox:is_entity_in_blocks/recurse/x
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/recurse/x.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/recurse/x.mcfunction
new file mode 100644
index 0000000000..71eed230af
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/recurse/x.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute if function bs.hitbox:is_entity_in_blocks/recurse/y run return 1
+
+scoreboard players remove #x bs.ctx 1000000
+scoreboard players remove #l bs.ctx 1000000
+execute if score #l bs.ctx matches 1.. positioned ~1 ~ ~ run return run function bs.hitbox:is_entity_in_blocks/recurse/x
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/recurse/y.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/recurse/y.mcfunction
new file mode 100644
index 0000000000..f92dfb25d9
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/recurse/y.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute if function bs.hitbox:is_entity_in_blocks/recurse/z run return 1
+
+scoreboard players remove #y bs.ctx 1000000
+scoreboard players remove #m bs.ctx 1000000
+execute if score #m bs.ctx matches 1.. positioned ~ ~1 ~ if function bs.hitbox:is_entity_in_blocks/recurse/y run return 1
+scoreboard players add #y bs.ctx 1000000
+scoreboard players add #m bs.ctx 1000000
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/recurse/z.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/recurse/z.mcfunction
new file mode 100644
index 0000000000..b3812e74e8
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/recurse/z.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute if function bs.hitbox:is_entity_in_blocks/check/check run return 1
+
+scoreboard players remove #z bs.ctx 1000000
+scoreboard players remove #n bs.ctx 1000000
+execute if score #n bs.ctx matches 1.. positioned ~ ~ ~1 if function bs.hitbox:is_entity_in_blocks/recurse/z run return 1
+scoreboard players add #z bs.ctx 1000000
+scoreboard players add #n bs.ctx 1000000
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/shaped.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/shaped.mcfunction
new file mode 100644
index 0000000000..d011d47d28
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/shaped.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result storage bs:ctx x double .000001 store result score #i bs.ctx store result score #x bs.ctx run data get storage bs:out hitbox.shape[-1][0] 62500
+execute store result storage bs:ctx y double .000001 store result score #j bs.ctx store result score #y bs.ctx run data get storage bs:out hitbox.shape[-1][1] 62500
+execute store result storage bs:ctx z double .000001 store result score #k bs.ctx store result score #z bs.ctx run data get storage bs:out hitbox.shape[-1][2] 62500
+execute store result score #l bs.ctx run data get storage bs:out hitbox.shape[-1][3] 62500
+execute store result score #m bs.ctx run data get storage bs:out hitbox.shape[-1][4] 62500
+execute store result score #n bs.ctx run data get storage bs:out hitbox.shape[-1][5] 62500
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/sized.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/sized.mcfunction
new file mode 100644
index 0000000000..230ab62af5
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/is_entity_in_blocks/sized.mcfunction
@@ -0,0 +1,30 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #h bs.ctx run data get storage bs:out hitbox.height 1000
+execute store result score #w bs.ctx run data get storage bs:out hitbox.width 500
+execute store result score #s bs.ctx run data get storage bs:out hitbox.scale 1000
+scoreboard players operation #h bs.ctx *= #s bs.ctx
+scoreboard players operation #w bs.ctx *= #s bs.ctx
+
+execute at @s summon minecraft:marker run function bs.hitbox:utils/get_fract_pos
+execute store result score #l bs.ctx store result score #x bs.ctx run data get storage bs:ctx _[0] 1000000
+execute store result score #n bs.ctx store result score #z bs.ctx run data get storage bs:ctx _[2] 1000000
+execute store result storage bs:ctx y double .000001 store result score #j bs.ctx store result score #m bs.ctx store result score #y bs.ctx run data get storage bs:ctx _[1] 1000000
+scoreboard players operation #l bs.ctx += #w bs.ctx
+scoreboard players operation #n bs.ctx += #w bs.ctx
+scoreboard players operation #m bs.ctx += #h bs.ctx
+execute store result storage bs:ctx x double .000001 store result score #i bs.ctx run scoreboard players operation #x bs.ctx -= #w bs.ctx
+execute store result storage bs:ctx z double .000001 store result score #k bs.ctx run scoreboard players operation #z bs.ctx -= #w bs.ctx
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/is_in_block/check.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/is_in_block/check.mcfunction
new file mode 100644
index 0000000000..fcd16fbee6
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/is_in_block/check.mcfunction
@@ -0,0 +1,39 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #i bs.ctx run data get storage bs:out hitbox.shape[-1][0] 62500
+execute store result score #j bs.ctx run data get storage bs:out hitbox.shape[-1][1] 62500
+execute store result score #k bs.ctx run data get storage bs:out hitbox.shape[-1][2] 62500
+execute store result score #o bs.ctx run data get storage bs:out hitbox.shape[-1][3] 62500
+execute store result score #p bs.ctx run data get storage bs:out hitbox.shape[-1][4] 62500
+execute store result score #q bs.ctx run data get storage bs:out hitbox.shape[-1][5] 62500
+
+# offset coordinates if needed
+scoreboard players operation #i bs.ctx += #u bs.ctx
+scoreboard players operation #o bs.ctx += #u bs.ctx
+scoreboard players operation #k bs.ctx += #v bs.ctx
+scoreboard players operation #q bs.ctx += #v bs.ctx
+
+execute \
+ if score #x bs.ctx >= #i bs.ctx \
+ if score #x bs.ctx < #o bs.ctx \
+ if score #y bs.ctx >= #j bs.ctx \
+ if score #y bs.ctx < #p bs.ctx \
+ if score #z bs.ctx >= #k bs.ctx \
+ if score #z bs.ctx < #q bs.ctx \
+run return 1
+
+data remove storage bs:out hitbox.shape[-1]
+execute if data storage bs:out hitbox.shape[0] run return run function bs.hitbox:is_in_block/check
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/is_in_block/is_in_block.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/is_in_block/is_in_block.mcfunction
similarity index 91%
rename from datapacks/Bookshelf/data/bs.hitbox/function/is_in_block/is_in_block.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/is_in_block/is_in_block.mcfunction
index 53542a3b20..5614401f61 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/is_in_block/is_in_block.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/is_in_block/is_in_block.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-inside
# ------------------------------------------------------------------------------------------------------------
execute if block ~ ~ ~ #bs.hitbox:intangible run return 0
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/is_in_entity.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/is_in_entity.mcfunction
similarity index 86%
rename from datapacks/Bookshelf/data/bs.hitbox/function/is_in_entity.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/is_in_entity.mcfunction
index 1f553d3879..ec6acffdc7 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/is_in_entity.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/is_in_entity.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-inside
# ------------------------------------------------------------------------------------------------------------
return run execute if entity @s[dy=0] positioned ~-.99999999999999 ~-.99999999999999 ~-.99999999999999 if entity @s[dy=0]
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/utils/get_fract_pos.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/utils/get_fract_pos.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/utils/get_fract_pos.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/utils/get_fract_pos.mcfunction
index 42fbc0020f..b424db375d 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/utils/get_fract_pos.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/utils/get_fract_pos.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.hitbox/function/utils/get_negative_pos.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/utils/get_negative_pos.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.hitbox/function/utils/get_negative_pos.mcfunction
rename to modules/bs.hitbox/data/bs.hitbox/function/utils/get_negative_pos.mcfunction
index 1a9b1adfeb..699f61de25 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/function/utils/get_negative_pos.mcfunction
+++ b/modules/bs.hitbox/data/bs.hitbox/function/utils/get_negative_pos.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.hitbox/data/bs.hitbox/function/utils/get_relative_pos.mcfunction b/modules/bs.hitbox/data/bs.hitbox/function/utils/get_relative_pos.mcfunction
new file mode 100644
index 0000000000..fa5be0fee7
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/function/utils/get_relative_pos.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$tp @s ~$(x) ~$(y) ~$(z)
+data modify storage bs:ctx _ set from entity @s Pos
+kill @s
diff --git a/datapacks/Bookshelf/data/bs.hitbox/predicate/is_baby.json b/modules/bs.hitbox/data/bs.hitbox/predicate/is_baby.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/predicate/is_baby.json
rename to modules/bs.hitbox/data/bs.hitbox/predicate/is_baby.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/predicate/salmon/large.json b/modules/bs.hitbox/data/bs.hitbox/predicate/salmon/large.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/predicate/salmon/large.json
rename to modules/bs.hitbox/data/bs.hitbox/predicate/salmon/large.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/predicate/salmon/small.json b/modules/bs.hitbox/data/bs.hitbox/predicate/salmon/small.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/predicate/salmon/small.json
rename to modules/bs.hitbox/data/bs.hitbox/predicate/salmon/small.json
diff --git a/modules/bs.hitbox/data/bs.hitbox/tags/block/intangible.json b/modules/bs.hitbox/data/bs.hitbox/tags/block/intangible.json
new file mode 100644
index 0000000000..58ec452caa
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/tags/block/intangible.json
@@ -0,0 +1,26 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#intangible",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ }
+ },
+ "values": [
+ "minecraft:air",
+ "minecraft:cave_air",
+ "minecraft:lava",
+ "minecraft:light",
+ "minecraft:structure_void",
+ "minecraft:void_air",
+ "minecraft:water"
+ ]
+}
diff --git a/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/intangible.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/intangible.json
new file mode 100644
index 0000000000..a24c606281
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/intangible.json
@@ -0,0 +1,43 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#intangible",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ }
+ },
+ "values": [
+ "minecraft:area_effect_cloud",
+ "minecraft:arrow",
+ "minecraft:block_display",
+ "minecraft:dragon_fireball",
+ "minecraft:egg",
+ "minecraft:ender_pearl",
+ "minecraft:evoker_fangs",
+ "minecraft:experience_bottle",
+ "minecraft:experience_orb",
+ "minecraft:eye_of_ender",
+ "minecraft:firework_rocket",
+ "minecraft:fishing_bobber",
+ "minecraft:item",
+ "minecraft:item_display",
+ "minecraft:llama_spit",
+ "minecraft:marker",
+ "minecraft:potion",
+ "minecraft:small_fireball",
+ "minecraft:snowball",
+ "minecraft:spectral_arrow",
+ "minecraft:text_display",
+ "minecraft:tnt",
+ "minecraft:trident",
+ "minecraft:wither_skull"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/is_shaped.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/is_shaped.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/is_shaped.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/is_shaped.json
index 1aed484bfa..affdd44bae 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/is_shaped.json
+++ b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/is_shaped.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-shaped",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#is-shaped",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/is_sized.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/is_sized.json
similarity index 95%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/is_sized.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/is_sized.json
index 0649c3de0f..7d0460df57 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/is_sized.json
+++ b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/is_sized.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-sized",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#is-sized",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/arrow_like.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/arrow_like.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/arrow_like.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/arrow_like.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/bat_like.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/bat_like.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/bat_like.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/bat_like.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/boat.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/boat.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/boat.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/boat.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/cat_like.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/cat_like.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/cat_like.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/cat_like.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/cow_like.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/cow_like.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/cow_like.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/cow_like.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/falling_block_like.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/falling_block_like.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/falling_block_like.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/falling_block_like.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/group_1.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/group_1.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/group_1.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/group_1.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/group_16.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/group_16.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/group_16.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/group_16.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/group_2.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/group_2.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/group_2.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/group_2.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/group_32.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/group_32.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/group_32.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/group_32.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/group_4.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/group_4.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/group_4.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/group_4.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/group_64.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/group_64.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/group_64.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/group_64.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/group_8.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/group_8.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/group_8.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/group_8.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/hoglin.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/hoglin.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/hoglin.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/hoglin.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/horse_like.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/horse_like.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/horse_like.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/horse_like.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/item_frame.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/item_frame.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/item_frame.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/item_frame.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/item_like.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/item_like.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/item_like.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/item_like.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/llama.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/llama.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/llama.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/llama.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/minecart.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/minecart.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/minecart.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/minecart.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/shulker_like.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/shulker_like.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/shulker_like.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/shulker_like.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/silverfish_like.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/silverfish_like.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/silverfish_like.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/silverfish_like.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/skeleton.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/skeleton.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/skeleton.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/skeleton.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/slime_like.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/slime_like.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/slime_like.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/slime_like.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/small_fireball_like.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/small_fireball_like.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/small_fireball_like.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/small_fireball_like.json
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/zombie_like.json b/modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/zombie_like.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/entity_type/size/zombie_like.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/entity_type/size/zombie_like.json
diff --git a/modules/bs.hitbox/data/bs.hitbox/tags/function/get_block.json b/modules/bs.hitbox/data/bs.hitbox/tags/function/get_block.json
new file mode 100644
index 0000000000..ff9e8dd183
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/tags/function/get_block.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#get",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/11/21",
+ "minecraft_version": "1.20.3"
+ },
+ "updated": {
+ "date": "2024/09/28",
+ "minecraft_version": "1.21"
+ }
+ },
+ "values": [
+ "bs.hitbox:get_block/get_block"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/function/get_entity.json b/modules/bs.hitbox/data/bs.hitbox/tags/function/get_entity.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/function/get_entity.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/function/get_entity.json
index c8c0d40228..ddb68b6da0 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/tags/function/get_entity.json
+++ b/modules/bs.hitbox/data/bs.hitbox/tags/function/get_entity.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#get",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#get",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/function/is_entity_in_block.json b/modules/bs.hitbox/data/bs.hitbox/tags/function/is_entity_in_block.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/function/is_entity_in_block.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/function/is_entity_in_block.json
index cb25e1c07f..842c5a1ef8 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/tags/function/is_entity_in_block.json
+++ b/modules/bs.hitbox/data/bs.hitbox/tags/function/is_entity_in_block.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-inside",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#is-inside",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/function/is_entity_in_blocks.json b/modules/bs.hitbox/data/bs.hitbox/tags/function/is_entity_in_blocks.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/function/is_entity_in_blocks.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/function/is_entity_in_blocks.json
index 01e0663e41..18099276c4 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/tags/function/is_entity_in_blocks.json
+++ b/modules/bs.hitbox/data/bs.hitbox/tags/function/is_entity_in_blocks.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-inside",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#is-inside",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/function/is_in_block.json b/modules/bs.hitbox/data/bs.hitbox/tags/function/is_in_block.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/function/is_in_block.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/function/is_in_block.json
index 9e3adee6b9..dcc65ca682 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/tags/function/is_in_block.json
+++ b/modules/bs.hitbox/data/bs.hitbox/tags/function/is_in_block.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-inside",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#is-inside",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.hitbox/tags/function/is_in_entity.json b/modules/bs.hitbox/data/bs.hitbox/tags/function/is_in_entity.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.hitbox/tags/function/is_in_entity.json
rename to modules/bs.hitbox/data/bs.hitbox/tags/function/is_in_entity.json
index e256788878..42f691d25d 100644
--- a/datapacks/Bookshelf/data/bs.hitbox/tags/function/is_in_entity.json
+++ b/modules/bs.hitbox/data/bs.hitbox/tags/function/is_in_entity.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-inside",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#is-inside",
"authors": [
"Aksiome"
],
diff --git a/modules/bs.hitbox/data/bs.hitbox/test/block_offset.mcfunction b/modules/bs.hitbox/data/bs.hitbox/test/block_offset.mcfunction
new file mode 100644
index 0000000000..61557b5f7a
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/test/block_offset.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+## |TEST CASE|: Block with no offset
+setblock ~ ~ ~ minecraft:poppy
+function #bs.hitbox:get_block
+assert not data storage bs:out hitbox{ offset: { x: 0.0, z: 0.0 } }
+
+## |TEST CASE|: Block with offset
+setblock 0 0 0 minecraft:poppy
+execute positioned 0 0 0 run function #bs.hitbox:get_block
+assert data storage bs:out hitbox{ shape: [[5.0, 0.0, 5.0, 11.0, 10.0, 11.0]], offset: { x: -0.25, z: -0.25 } }
diff --git a/modules/bs.hitbox/data/bs.hitbox/test/block_shape.mcfunction b/modules/bs.hitbox/data/bs.hitbox/test/block_shape.mcfunction
new file mode 100644
index 0000000000..7408e37769
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/test/block_shape.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+## |TEST CASE|: Bottom stone slab
+setblock ~ ~ ~ minecraft:stone_slab[type=bottom]
+function #bs.hitbox:get_block
+assert data storage bs:out hitbox{ shape: [[0.0, 0.0, 0.0, 16.0, 8.0, 16.0]] }
+
+## |TEST CASE|: Top stone slab
+setblock ~ ~ ~ minecraft:stone_slab[type=top]
+function #bs.hitbox:get_block
+assert data storage bs:out hitbox{ shape: [[0.0, 8.0, 0.0, 16.0, 16.0, 16.0]] }
diff --git a/modules/bs.hitbox/data/bs.hitbox/test/entity_in_block.mcfunction b/modules/bs.hitbox/data/bs.hitbox/test/entity_in_block.mcfunction
new file mode 100644
index 0000000000..cf07a620de
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/test/entity_in_block.mcfunction
@@ -0,0 +1,31 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+fill ~-1 ~-1 ~-1 ~1 ~1 ~1 minecraft:air replace minecraft:barrier
+setblock ~ ~ ~ minecraft:stone_slab[type=bottom]
+
+## |TEST CASE|: Entity is not inside the block
+tp @s ~.5 ~.75 ~.5
+execute if function #bs.hitbox:is_entity_in_block run fail "Entity should not be inside the slab"
+tp @s ~-.3 ~ ~-.3
+await delay 5t
+execute if function #bs.hitbox:is_entity_in_block run fail "Entity should not be inside the slab"
+
+## |TEST CASE|: Entity is inside the block
+tp @s ~.5 ~-1 ~.5
+execute unless function #bs.hitbox:is_entity_in_block run fail "Entity should be inside the slab"
+tp @s ~-.29 ~ ~-.29
+execute unless function #bs.hitbox:is_entity_in_block run fail "Entity should be inside the slab"
diff --git a/modules/bs.hitbox/data/bs.hitbox/test/entity_in_blocks.mcfunction b/modules/bs.hitbox/data/bs.hitbox/test/entity_in_blocks.mcfunction
new file mode 100644
index 0000000000..0b7621b67c
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/test/entity_in_blocks.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+fill ~-1 ~-1 ~-1 ~1 ~1 ~1 minecraft:air replace minecraft:barrier
+setblock ~-1 ~ ~-1 minecraft:bookshelf
+
+## |TEST CASE|: Entity is not inside a block
+execute store result score #s bs.ctx run function #bs.hitbox:is_entity_in_blocks {with:{}}
+assert score #s bs.ctx matches 0
+
+## |TEST CASE|: Entity not inside a block
+tp @s ~ ~ ~
+execute store result score #s bs.ctx run function #bs.hitbox:is_entity_in_blocks {with:{}}
+assert score #s bs.ctx matches 1
diff --git a/modules/bs.hitbox/data/bs.hitbox/test/entity_scale.mcfunction b/modules/bs.hitbox/data/bs.hitbox/test/entity_scale.mcfunction
new file mode 100644
index 0000000000..a8a19e2d05
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/test/entity_scale.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+## |TEST CASE|: Default entity scale
+function #bs.hitbox:get_entity
+assert data storage bs:out hitbox{ scale: 1.0 }
+
+## |TEST CASE|: Custom entity scale
+attribute @s minecraft:scale base set 0.42
+function #bs.hitbox:get_entity
+assert data storage bs:out hitbox{ scale: 0.42 }
diff --git a/modules/bs.hitbox/data/bs.hitbox/test/entity_size.mcfunction b/modules/bs.hitbox/data/bs.hitbox/test/entity_size.mcfunction
new file mode 100644
index 0000000000..754b85348e
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/test/entity_size.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+## |TEST CASE|: Entity size (width and height)
+function #bs.hitbox:get_entity
+assert data storage bs:out hitbox{ width: 0.6, height: 1.8 }
diff --git a/modules/bs.hitbox/data/bs.hitbox/test/in_block.mcfunction b/modules/bs.hitbox/data/bs.hitbox/test/in_block.mcfunction
new file mode 100644
index 0000000000..305b414cd6
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/test/in_block.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+## |TEST CASE|: Player should not be inside the slab
+setblock ~ ~ ~ minecraft:stone_slab
+execute positioned ~.5 ~.5 ~.5 if function #bs.hitbox:is_in_block run fail "Should not be inside the slab"
+
+## |TEST CASE|: Player should be inside the block
+setblock ~ ~ ~ minecraft:bookshelf
+execute positioned ~.5 ~.5 ~.5 unless function #bs.hitbox:is_in_block run fail "Should be inside the block"
diff --git a/modules/bs.hitbox/data/bs.hitbox/test/in_entity.mcfunction b/modules/bs.hitbox/data/bs.hitbox/test/in_entity.mcfunction
new file mode 100644
index 0000000000..43795e97f7
--- /dev/null
+++ b/modules/bs.hitbox/data/bs.hitbox/test/in_entity.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+## |TEST CASE|: Player should not be inside the entity
+execute positioned ~.5 ~2 ~.5 if function #bs.hitbox:is_in_entity run fail "Should not be inside the entity"
+
+## |TEST CASE|: Player should be inside the entity at various positions
+execute positioned ~.5 ~1.5 ~.5 unless function #bs.hitbox:is_in_entity run fail "Should be inside the entity"
+execute positioned ~.5 ~ ~.5 unless function #bs.hitbox:is_in_entity run fail "Should be inside the entity"
+
+dummy @s leave
diff --git a/modules/bs.hitbox/gen_shapes.py b/modules/bs.hitbox/gen_shapes.py
new file mode 100644
index 0000000000..d886b9f1bc
--- /dev/null
+++ b/modules/bs.hitbox/gen_shapes.py
@@ -0,0 +1,184 @@
+from collections import defaultdict
+from datetime import datetime, timezone
+
+from beet import BlockTag, Context, LootTable
+from pydantic import BaseModel
+
+from core.common.helpers import (
+ download_and_parse_json,
+ gen_loot_table_tree,
+ render_snbt,
+)
+from core.definitions import MINECRAFT_VERSIONS, SHAPES_URL
+
+type Properties = dict[str, str]
+type VoxelShape = list[list[float]]
+type BlockShape = tuple[Properties, VoxelShape]
+
+class BlockShapes(BaseModel):
+ """Groups multiple blocks with similar shape definitions."""
+
+ group: int
+ blocks: list[str]
+ offset: bool
+ shapes: list[BlockShape]
+
+
+def beet_default(ctx: Context) -> None:
+ """Generate files used by the bs.hitbox module."""
+ namespace = ctx.directory.name
+ shapes = get_block_shapes(ctx, version := MINECRAFT_VERSIONS[-1])
+
+ with ctx.override(generate_namespace=namespace):
+ ctx.generate("has_offset", gen_has_offset_block_tag(shapes, version))
+ ctx.generate("is_composite", gen_is_composite_block_tag(shapes, version))
+
+ ctx.generate("get/get_block", gen_get_block_loot_table(shapes, namespace))
+ for entry in filter(lambda entry: entry.group > 0, shapes):
+ ctx.generate(f"get/{entry.group}", gen_get_states_loot_table(entry.shapes))
+
+
+def get_block_shapes(ctx: Context, version: str) -> list[BlockShapes]:
+ """Retrieve and processes block shapes from the provided version."""
+ cache = ctx.cache[f"version/{version}"]
+ raw_shapes = download_and_parse_json(cache, SHAPES_URL.format(version))
+ if not isinstance(raw_shapes, (dict)):
+ error_msg = f"Expected a dict, but got {type(raw_shapes)}"
+ raise TypeError(error_msg)
+
+ grouped_blocks = defaultdict(list)
+ for block, entries in raw_shapes.items():
+ if not is_default_shape(entries):
+ offset = any(e["has_offset"] for e in entries)
+ grouped_shapes = group_shapes_by_properties(entries)
+ grouped_blocks[(offset, tuple(grouped_shapes.items()))].append(block)
+
+ group = 0
+ return [BlockShapes(
+ blocks=blocks,
+ offset=offset,
+ shapes=[(dict(properties), shape) for properties, shape in shapes],
+ group=(group := group + 1) if len(shapes) > 1 else 0,
+ ) for (offset, shapes), blocks in grouped_blocks.items()]
+
+
+def is_default_shape(entries: list[dict]) -> bool:
+ """Check if the entries contain only the default or empty shapes."""
+ return all(e["shape"] in ([[0.0, 0.0, 0.0, 1.0, 1.0, 1.0]], []) for e in entries)
+
+
+def group_shapes_by_properties(entries: list[dict]) -> dict:
+ """Group shapes by their properties, keeping only those that affect the shape."""
+ grouped_shapes = {
+ frozenset(tuple(entry["properties"].items())): tuple(
+ tuple(v * 16 for v in box)
+ for box in entry["shape"]
+ )
+ for entry in entries
+ }
+
+ for prop, _ in next(iter(grouped_shapes.keys())):
+ group = defaultdict(list)
+ for key, shape in grouped_shapes.items():
+ group[frozenset(k for k in key if k[0] != prop)].append(shape)
+ if all(all(s == shapes[0] for s in shapes) for shapes in group.values()):
+ grouped_shapes = {key: tuple(shapes[0]) for key, shapes in group.items()}
+
+ return grouped_shapes
+
+
+def format_shape_node(shapes: list[BlockShape], properties: list[str]) -> dict:
+ """Format a loot table node for the given shapes and properties."""
+ return format_shape_entry(shapes[0][1]) if len(properties) <= 1 else {
+ "type": "alternatives",
+ "children": format_shape_tree(shapes, properties[1:]),
+ }
+
+
+def format_shape_entry(shape: VoxelShape) -> dict:
+ """Format a loot table entry for the given shape."""
+ return {"type": "item", "name": "egg", "functions": [{
+ "function": "set_custom_data",
+ "tag": render_snbt({"shape": shape}),
+ }]}
+
+
+def format_shape_tree(shapes: list[BlockShape], properties: list[str]) -> list:
+ """Format a loot table tree for the given shapes and properties."""
+ groups: defaultdict[str, list[BlockShape]] = defaultdict(list)
+ for shape in shapes:
+ value = shape[0][properties[0]]
+ groups[value].append(shape)
+
+ nodes = list(groups.items())
+
+ return [{
+ **format_shape_node(shapes, properties),
+ "conditions": [{
+ "condition": "location_check",
+ "predicate": {"block": {"state": {properties[0]: value}}},
+ }],
+ } for value, shapes in nodes[:-1]] + [format_shape_node(nodes[-1][1], properties)]
+
+
+def gen_get_block_loot_table(shapes: list[BlockShapes], namespace: str) -> LootTable:
+ """Generate a loot table to retrieve simple block shapes."""
+ return LootTable(
+ gen_loot_table_tree(shapes, lambda entry: format_shape_entry(
+ entry.shapes[0][1],
+ ) if entry.group == 0 else {
+ "type": "loot_table",
+ "value": f"{namespace}:get/{entry.group}",
+ }, lambda shapes: [{
+ "condition": "location_check",
+ "predicate": {"block": {"blocks": [
+ block[10:]
+ for entry in shapes for block in entry.blocks
+ ]}},
+ }]),
+ )
+
+
+def gen_get_states_loot_table(shape: list[BlockShape]) -> LootTable:
+ """Generate a loot table to retrieve block shapes based on properties."""
+ properties = {name: {entry[0][name] for entry in shape} for name in shape[0][0]}
+ sorted_properties = sorted(properties, key=lambda name: len(properties[name]))
+
+ return LootTable({"pools": [{"rolls": 1,"entries":[{
+ "type": "alternatives",
+ "children": format_shape_tree(shape, sorted_properties),
+ }]}]})
+
+
+def gen_has_offset_block_tag(shapes: list[BlockShapes], version: str) -> BlockTag:
+ """Generate a block tag for blocks with offsets."""
+ return BlockTag({
+ "__bookshelf__": {
+ "feature": True,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#has-offset",
+ "authors": ["Aksiome"],
+ "created": {"date": "2024/09/28", "minecraft_version": "1.21"},
+ "updated": {
+ "date": datetime.now(timezone.utc).strftime("%Y/%m/%d"),
+ "minecraft_version": version,
+ },
+ },
+ "values": sorted([b for group in shapes for b in group.blocks if group.offset]),
+ })
+
+
+def gen_is_composite_block_tag(shapes: list[BlockShapes], version: str) -> BlockTag:
+ """Generate a block tag for non simple cubes."""
+ return BlockTag({
+ "__bookshelf__": {
+ "feature": True,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html#is-composite",
+ "authors": ["Aksiome"],
+ "created": {"date": "2024/09/28", "minecraft_version": "1.21"},
+ "updated": {
+ "date": datetime.now(timezone.utc).strftime("%Y/%m/%d"),
+ "minecraft_version": version,
+ },
+ },
+ "values": sorted([block for group in shapes for block in group.blocks]),
+ })
diff --git a/modules/bs.hitbox/module.json b/modules/bs.hitbox/module.json
new file mode 100644
index 0000000000..709b101b6b
--- /dev/null
+++ b/modules/bs.hitbox/module.json
@@ -0,0 +1,17 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.hitbox",
+ "load": "."
+ },
+ "meta": {
+ "name": "Hitbox",
+ "slug": "bookshelf-hitbox",
+ "description": "Get and check the hitboxes of blocks or entities.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/hitbox.html",
+ "tags": ["default"]
+ },
+ "pipeline": [
+ "gen_shapes"
+ ]
+}
diff --git a/modules/bs.id/README.md b/modules/bs.id/README.md
new file mode 100644
index 0000000000..ac895b9a56
--- /dev/null
+++ b/modules/bs.id/README.md
@@ -0,0 +1,14 @@
+# 🏷️ Bookshelf ID
+
+This datapack helps manage entity IDs, which is essential in scenarios like shooting games, where you need to track who is targeting whom.
+
+> “We know what we are, but know not what we may be.”
+>
+> -- William Shakespeare
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/id.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.id/data/bs.id/function/__load__.mcfunction b/modules/bs.id/data/bs.id/function/__load__.mcfunction
new file mode 100644
index 0000000000..bfd1f6d69e
--- /dev/null
+++ b/modules/bs.id/data/bs.id/function/__load__.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard objectives add bs.in dummy [{"text":"BS ","color":"dark_gray"},{"text":"Input","color":"aqua"}]
+scoreboard objectives add bs.id dummy [{"text":"BS ","color":"dark_gray"},{"text":"ID","color":"aqua"}]
+scoreboard objectives add bs.cid dummy [{"text":"BS ","color":"dark_gray"},{"text":"Chain ID","color":"aqua"}]
diff --git a/modules/bs.id/data/bs.id/function/__unload__.mcfunction b/modules/bs.id/data/bs.id/function/__unload__.mcfunction
new file mode 100644
index 0000000000..5e9727af84
--- /dev/null
+++ b/modules/bs.id/data/bs.id/function/__unload__.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard objectives remove bs.in
+scoreboard objectives remove bs.id
+scoreboard objectives remove bs.cid
diff --git a/datapacks/Bookshelf/data/bs.id/function/give_cuid.mcfunction b/modules/bs.id/data/bs.id/function/give_cuid.mcfunction
similarity index 85%
rename from datapacks/Bookshelf/data/bs.id/function/give_cuid.mcfunction
rename to modules/bs.id/data/bs.id/function/give_cuid.mcfunction
index 700cd97338..8de833f381 100644
--- a/datapacks/Bookshelf/data/bs.id/function/give_cuid.mcfunction
+++ b/modules/bs.id/data/bs.id/function/give_cuid.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/id.html#give-chain-unique-id
# ------------------------------------------------------------------------------------------------------------
execute if entity @s store result score @s bs.cid run scoreboard players add #counter bs.cid 1
diff --git a/datapacks/Bookshelf/data/bs.id/function/give_suid.mcfunction b/modules/bs.id/data/bs.id/function/give_suid.mcfunction
similarity index 85%
rename from datapacks/Bookshelf/data/bs.id/function/give_suid.mcfunction
rename to modules/bs.id/data/bs.id/function/give_suid.mcfunction
index 5d02410313..f8fba6e5c8 100644
--- a/datapacks/Bookshelf/data/bs.id/function/give_suid.mcfunction
+++ b/modules/bs.id/data/bs.id/function/give_suid.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/id.html#get-simple-unique-id
# ------------------------------------------------------------------------------------------------------------
execute if entity @s store result score @s bs.id run scoreboard players add #counter bs.id 1
diff --git a/modules/bs.id/data/bs.id/function/update_cuids/loop.mcfunction b/modules/bs.id/data/bs.id/function/update_cuids/loop.mcfunction
new file mode 100644
index 0000000000..21b4df7fa1
--- /dev/null
+++ b/modules/bs.id/data/bs.id/function/update_cuids/loop.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players add $id.cuid bs.in 1
+execute unless entity @n[predicate=bs.id:cuid_equal,sort=arbitrary] run function bs.id:update_cuids/shift
+execute if score #size bs.cid < #counter bs.cid run function bs.id:update_cuids/loop
diff --git a/datapacks/Bookshelf/data/bs.id/function/update_cuids/shift.mcfunction b/modules/bs.id/data/bs.id/function/update_cuids/shift.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.id/function/update_cuids/shift.mcfunction
rename to modules/bs.id/data/bs.id/function/update_cuids/shift.mcfunction
index bdf248b35a..fede3c1b0d 100644
--- a/datapacks/Bookshelf/data/bs.id/function/update_cuids/shift.mcfunction
+++ b/modules/bs.id/data/bs.id/function/update_cuids/shift.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.id/data/bs.id/function/update_cuids/update_cuids.mcfunction b/modules/bs.id/data/bs.id/function/update_cuids/update_cuids.mcfunction
new file mode 100644
index 0000000000..26424b1072
--- /dev/null
+++ b/modules/bs.id/data/bs.id/function/update_cuids/update_cuids.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #size bs.cid if entity @e[scores={bs.cid=1..}]
+execute if score #size bs.cid < #counter bs.cid run scoreboard players set $id.cuid.check bs.in 0
+execute if score #size bs.cid < #counter bs.cid run function bs.id:update_cuids/loop
diff --git a/modules/bs.id/data/bs.id/predicate/cuid_equal.json b/modules/bs.id/data/bs.id/predicate/cuid_equal.json
new file mode 100644
index 0000000000..c94ec8d0fc
--- /dev/null
+++ b/modules/bs.id/data/bs.id/predicate/cuid_equal.json
@@ -0,0 +1,39 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-chain-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "condition": "minecraft:entity_scores",
+ "entity": "this",
+ "scores": {
+ "bs.cid": {
+ "min": {
+ "type": "minecraft:score",
+ "target": {
+ "type": "minecraft:fixed",
+ "name": "$id.cuid"
+ },
+ "score": "bs.in"
+ },
+ "max": {
+ "type": "minecraft:score",
+ "target": {
+ "type": "minecraft:fixed",
+ "name": "$id.cuid"
+ },
+ "score": "bs.in"
+ }
+ }
+ }
+}
diff --git a/modules/bs.id/data/bs.id/predicate/cuid_lower.json b/modules/bs.id/data/bs.id/predicate/cuid_lower.json
new file mode 100644
index 0000000000..6b81b4b411
--- /dev/null
+++ b/modules/bs.id/data/bs.id/predicate/cuid_lower.json
@@ -0,0 +1,31 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-chain-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "condition": "minecraft:entity_scores",
+ "entity": "this",
+ "scores": {
+ "bs.cid": {
+ "max": {
+ "type": "minecraft:score",
+ "target": {
+ "type": "minecraft:fixed",
+ "name": "$id.cuid"
+ },
+ "score": "bs.in"
+ }
+ }
+ }
+}
diff --git a/modules/bs.id/data/bs.id/predicate/cuid_match.json b/modules/bs.id/data/bs.id/predicate/cuid_match.json
new file mode 100644
index 0000000000..403c2496bd
--- /dev/null
+++ b/modules/bs.id/data/bs.id/predicate/cuid_match.json
@@ -0,0 +1,39 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-chain-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "condition": "minecraft:entity_scores",
+ "entity": "this",
+ "scores": {
+ "bs.cid": {
+ "min": {
+ "type": "minecraft:score",
+ "target": {
+ "type": "minecraft:fixed",
+ "name": "$id.cuid.min"
+ },
+ "score": "bs.in"
+ },
+ "max": {
+ "type": "minecraft:score",
+ "target": {
+ "type": "minecraft:fixed",
+ "name": "$id.cuid.max"
+ },
+ "score": "bs.in"
+ }
+ }
+ }
+}
diff --git a/modules/bs.id/data/bs.id/predicate/cuid_upper.json b/modules/bs.id/data/bs.id/predicate/cuid_upper.json
new file mode 100644
index 0000000000..d175a19aee
--- /dev/null
+++ b/modules/bs.id/data/bs.id/predicate/cuid_upper.json
@@ -0,0 +1,31 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-chain-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "condition": "minecraft:entity_scores",
+ "entity": "this",
+ "scores": {
+ "bs.cid": {
+ "min": {
+ "type": "minecraft:score",
+ "target": {
+ "type": "minecraft:fixed",
+ "name": "$id.cuid"
+ },
+ "score": "bs.in"
+ }
+ }
+ }
+}
diff --git a/modules/bs.id/data/bs.id/predicate/has_cuid.json b/modules/bs.id/data/bs.id/predicate/has_cuid.json
new file mode 100644
index 0000000000..00643cbb0c
--- /dev/null
+++ b/modules/bs.id/data/bs.id/predicate/has_cuid.json
@@ -0,0 +1,22 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-chain-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "condition": "minecraft:entity_scores",
+ "entity": "this",
+ "scores": {
+ "bs.cid": {}
+ }
+}
diff --git a/modules/bs.id/data/bs.id/predicate/has_suid.json b/modules/bs.id/data/bs.id/predicate/has_suid.json
new file mode 100644
index 0000000000..1ad1141459
--- /dev/null
+++ b/modules/bs.id/data/bs.id/predicate/has_suid.json
@@ -0,0 +1,22 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-simple-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "condition": "minecraft:entity_scores",
+ "entity": "this",
+ "scores": {
+ "bs.id": {}
+ }
+}
diff --git a/modules/bs.id/data/bs.id/predicate/suid_equal.json b/modules/bs.id/data/bs.id/predicate/suid_equal.json
new file mode 100644
index 0000000000..1d53887abe
--- /dev/null
+++ b/modules/bs.id/data/bs.id/predicate/suid_equal.json
@@ -0,0 +1,39 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-simple-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "condition": "minecraft:entity_scores",
+ "entity": "this",
+ "scores": {
+ "bs.id": {
+ "min": {
+ "type": "minecraft:score",
+ "target": {
+ "type": "minecraft:fixed",
+ "name": "$id.suid"
+ },
+ "score": "bs.in"
+ },
+ "max": {
+ "type": "minecraft:score",
+ "target": {
+ "type": "minecraft:fixed",
+ "name": "$id.suid"
+ },
+ "score": "bs.in"
+ }
+ }
+ }
+}
diff --git a/modules/bs.id/data/bs.id/predicate/suid_lower.json b/modules/bs.id/data/bs.id/predicate/suid_lower.json
new file mode 100644
index 0000000000..b5a2160df9
--- /dev/null
+++ b/modules/bs.id/data/bs.id/predicate/suid_lower.json
@@ -0,0 +1,31 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-simple-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "condition": "minecraft:entity_scores",
+ "entity": "this",
+ "scores": {
+ "bs.id": {
+ "max": {
+ "type": "minecraft:score",
+ "target": {
+ "type": "minecraft:fixed",
+ "name": "$id.suid"
+ },
+ "score": "bs.in"
+ }
+ }
+ }
+}
diff --git a/modules/bs.id/data/bs.id/predicate/suid_match.json b/modules/bs.id/data/bs.id/predicate/suid_match.json
new file mode 100644
index 0000000000..8ceb7a738b
--- /dev/null
+++ b/modules/bs.id/data/bs.id/predicate/suid_match.json
@@ -0,0 +1,39 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-simple-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "condition": "minecraft:entity_scores",
+ "entity": "this",
+ "scores": {
+ "bs.id": {
+ "min": {
+ "type": "minecraft:score",
+ "target": {
+ "type": "minecraft:fixed",
+ "name": "$id.suid.min"
+ },
+ "score": "bs.in"
+ },
+ "max": {
+ "type": "minecraft:score",
+ "target": {
+ "type": "minecraft:fixed",
+ "name": "$id.suid.max"
+ },
+ "score": "bs.in"
+ }
+ }
+ }
+}
diff --git a/modules/bs.id/data/bs.id/predicate/suid_upper.json b/modules/bs.id/data/bs.id/predicate/suid_upper.json
new file mode 100644
index 0000000000..dcef420240
--- /dev/null
+++ b/modules/bs.id/data/bs.id/predicate/suid_upper.json
@@ -0,0 +1,31 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#check-simple-unique-id",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "condition": "minecraft:entity_scores",
+ "entity": "this",
+ "scores": {
+ "bs.id": {
+ "min": {
+ "type": "minecraft:score",
+ "target": {
+ "type": "minecraft:fixed",
+ "name": "$id.suid"
+ },
+ "score": "bs.in"
+ }
+ }
+ }
+}
diff --git a/datapacks/Bookshelf/data/bs.id/tags/function/give_cuid.json b/modules/bs.id/data/bs.id/tags/function/give_cuid.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.id/tags/function/give_cuid.json
rename to modules/bs.id/data/bs.id/tags/function/give_cuid.json
index 57882c9fc3..42d576d8ff 100644
--- a/datapacks/Bookshelf/data/bs.id/tags/function/give_cuid.json
+++ b/modules/bs.id/data/bs.id/tags/function/give_cuid.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/id.html#give-chain-unique-id",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#give-chain-unique-id",
"authors": [
"Aksiome",
"KubbyDev"
diff --git a/modules/bs.id/data/bs.id/tags/function/give_suid.json b/modules/bs.id/data/bs.id/tags/function/give_suid.json
new file mode 100644
index 0000000000..d8ce28d109
--- /dev/null
+++ b/modules/bs.id/data/bs.id/tags/function/give_suid.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#give-simple-unique-id",
+ "authors": [
+ "Aksiome",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2017/10/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/08/28",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "values": [
+ "bs.id:give_suid"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.id/tags/function/update_cuids.json b/modules/bs.id/data/bs.id/tags/function/update_cuids.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.id/tags/function/update_cuids.json
rename to modules/bs.id/data/bs.id/tags/function/update_cuids.json
index 41187af012..f6c4f277fd 100644
--- a/datapacks/Bookshelf/data/bs.id/tags/function/update_cuids.json
+++ b/modules/bs.id/data/bs.id/tags/function/update_cuids.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/id.html#update-chain-unique-id",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html#update-chain-unique-id",
"authors": [
"Aksiome",
"KubbyDev"
diff --git a/modules/bs.id/data/bs.id/test/update_cuids.mcfunction b/modules/bs.id/data/bs.id/test/update_cuids.mcfunction
new file mode 100644
index 0000000000..9b10e6cac1
--- /dev/null
+++ b/modules/bs.id/data/bs.id/test/update_cuids.mcfunction
@@ -0,0 +1,34 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute summon minecraft:marker run function #bs.id:give_cuid
+execute summon minecraft:armor_stand run function #bs.id:give_cuid
+execute summon minecraft:armor_stand run function #bs.id:give_cuid
+execute summon minecraft:marker run function #bs.id:give_cuid
+execute summon minecraft:marker run function #bs.id:give_cuid
+execute summon minecraft:armor_stand run function #bs.id:give_cuid
+execute summon minecraft:marker run function #bs.id:give_cuid
+kill @e[type=minecraft:armor_stand,distance=..1]
+
+function #bs.id:update_cuids
+scoreboard players set #packtest.i bs.cid 0
+execute store result score #packtest bs.cid run scoreboard players operation #packtest.i bs.cid > @e bs.cid
+execute as @e[type=minecraft:marker] if score @s bs.cid = #packtest.i bs.cid run scoreboard players remove #packtest.i bs.cid 1
+execute as @e[type=minecraft:marker] if score @s bs.cid = #packtest.i bs.cid run scoreboard players remove #packtest.i bs.cid 1
+execute as @e[type=minecraft:marker] if score @s bs.cid = #packtest.i bs.cid run scoreboard players remove #packtest.i bs.cid 1
+execute as @e[type=minecraft:marker] if score @s bs.cid = #packtest.i bs.cid run scoreboard players remove #packtest.i bs.cid 1
+scoreboard players operation #packtest bs.cid -= #packtest.i bs.cid
+kill @e[type=minecraft:marker,distance=..1]
+assert score #packtest bs.cid matches 4
diff --git a/modules/bs.id/module.json b/modules/bs.id/module.json
new file mode 100644
index 0000000000..2164f90353
--- /dev/null
+++ b/modules/bs.id/module.json
@@ -0,0 +1,14 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.id",
+ "load": "."
+ },
+ "meta": {
+ "name": "ID",
+ "slug": "bookshelf-id",
+ "description": "Manage entity IDs, essential in scenarios like shooting games where you need to track who is targeting whom.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/id.html",
+ "tags": ["default"]
+ }
+}
diff --git a/modules/bs.interaction/README.md b/modules/bs.interaction/README.md
new file mode 100644
index 0000000000..5cc9f6c162
--- /dev/null
+++ b/modules/bs.interaction/README.md
@@ -0,0 +1,14 @@
+# 🖱️ Bookshelf Interaction
+
+This datapack allows you attach interaction events (click, hover) to interaction entities, enabling dynamic player interactions.
+
+> “As far as the customer is concerned, the interface is the product.”
+>
+> -- Jef Raskin
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/interaction.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/datapacks/Bookshelf/data/bs.interaction/advancement/left_click.json b/modules/bs.interaction/data/bs.interaction/advancement/left_click.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.interaction/advancement/left_click.json
rename to modules/bs.interaction/data/bs.interaction/advancement/left_click.json
diff --git a/datapacks/Bookshelf/data/bs.interaction/advancement/right_click.json b/modules/bs.interaction/data/bs.interaction/advancement/right_click.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.interaction/advancement/right_click.json
rename to modules/bs.interaction/data/bs.interaction/advancement/right_click.json
diff --git a/modules/bs.interaction/data/bs.interaction/function/__load__.mcfunction b/modules/bs.interaction/data/bs.interaction/function/__load__.mcfunction
new file mode 100644
index 0000000000..5a0c8903ef
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/__load__.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+forceload add -30000000 1600
+execute unless entity B5-0-0-0-2 run summon minecraft:text_display -30000000 0 1600 {UUID:[I;181,0,0,2],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],view_range:0f,alignment:"center"}
+
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
+scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
+
+scoreboard objectives add bs.interaction.id dummy [{"text":"BS ","color":"dark_gray"},{"text":"Interaction ID","color":"aqua"}]
+scoreboard objectives add bs.interaction.hover dummy [{"text":"BS ","color":"dark_gray"},{"text":"Interaction Hover","color":"aqua"}]
+scoreboard objectives add bs.interaction.logout minecraft.custom:leave_game [{"text":"BS ","color":"dark_gray"},{"text":"Interaction Logout","color":"aqua"}]
+
+scoreboard players set 2 bs.const 2
diff --git a/modules/bs.interaction/data/bs.interaction/function/__unload__.mcfunction b/modules/bs.interaction/data/bs.interaction/function/__unload__.mcfunction
new file mode 100644
index 0000000000..d440bc31b7
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/__unload__.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+kill B5-0-0-0-2
+forceload remove -30000000 1600
+
+execute as @e[type=minecraft:interaction] run function #bs.interaction:clear_events {with:{}}
+
+scoreboard objectives remove bs.interaction.id
+scoreboard objectives remove bs.interaction.hover
+scoreboard objectives remove bs.interaction.logout
+
+scoreboard objectives remove bs.ctx
+scoreboard objectives remove bs.data
+scoreboard objectives remove bs.const
+
+data remove storage bs:data interaction
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/callback/glow.mcfunction b/modules/bs.interaction/data/bs.interaction/function/callback/glow.mcfunction
similarity index 84%
rename from datapacks/Bookshelf/data/bs.interaction/function/callback/glow.mcfunction
rename to modules/bs.interaction/data/bs.interaction/function/callback/glow.mcfunction
index 3264b2a84a..6d2ab87185 100644
--- a/datapacks/Bookshelf/data/bs.interaction/function/callback/glow.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/function/callback/glow.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#default-callback
# ------------------------------------------------------------------------------------------------------------
# Note:
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/callback/unglow.mcfunction b/modules/bs.interaction/data/bs.interaction/function/callback/unglow.mcfunction
similarity index 84%
rename from datapacks/Bookshelf/data/bs.interaction/function/callback/unglow.mcfunction
rename to modules/bs.interaction/data/bs.interaction/function/callback/unglow.mcfunction
index 6a0060c6a1..feb5e40fed 100644
--- a/datapacks/Bookshelf/data/bs.interaction/function/callback/unglow.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/function/callback/unglow.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#default-callback
# ------------------------------------------------------------------------------------------------------------
# Note:
diff --git a/modules/bs.interaction/data/bs.interaction/function/clear_events/clear_events.mcfunction b/modules/bs.interaction/data/bs.interaction/function/clear_events/clear_events.mcfunction
new file mode 100644
index 0000000000..a9a0fb4316
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/clear_events/clear_events.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:ctx _ set value $(with)
+execute store result storage bs:ctx y int 1 run scoreboard players get @s bs.interaction.id
+return run function bs.interaction:clear_events/remove_matching with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/clear_events/remove_matching.mcfunction b/modules/bs.interaction/data/bs.interaction/function/clear_events/remove_matching.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.interaction/function/clear_events/remove_matching.mcfunction
rename to modules/bs.interaction/data/bs.interaction/function/clear_events/remove_matching.mcfunction
index b3e16255fb..4353bd0a05 100644
--- a/datapacks/Bookshelf/data/bs.interaction/function/clear_events/remove_matching.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/function/clear_events/remove_matching.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.interaction/data/bs.interaction/function/on_event/hover/as_target.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/hover/as_target.mcfunction
new file mode 100644
index 0000000000..e608d61d98
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/hover/as_target.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute if entity @s[tag=bs.interaction.listen_hover] run function bs.interaction:on_event/hover/dispatch with storage bs:ctx
+tag @s remove bs.interaction.target
diff --git a/modules/bs.interaction/data/bs.interaction/function/on_event/hover/dispatch.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/hover/dispatch.mcfunction
new file mode 100644
index 0000000000..32bfe79983
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/hover/dispatch.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data interaction.run set value []
+$data modify storage bs:data interaction.run append from storage bs:data interaction.$(y)[{type:"hover"}]
+execute if data storage bs:data interaction.run[-1] run function bs.interaction:on_event/run with storage bs:data interaction.run[-1]
diff --git a/modules/bs.interaction/data/bs.interaction/function/on_event/hover/hover.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/hover/hover.mcfunction
new file mode 100644
index 0000000000..68fd8fe66c
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/hover/hover.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Check only the interaction that the player was looking at.
+# If the player is not looking at any interaction, return the hover leave event and restart the whole cycle.
+
+tag @s add bs.interaction.source
+execute store result storage bs:ctx y int 1 run scoreboard players get @s bs.interaction.id
+execute as @n[type=minecraft:interaction,predicate=bs.interaction:check_id] run tag @s add bs.interaction.target
+$execute unless predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"minecraft:player","looking_at":{"type":"minecraft:interaction","nbt":"{\"Tags\":[\"bs.interaction.target\"]}","distance":{"absolute":{"max":$(y)}}}}}} run return run function bs.interaction:on_event/hover_leave/hover_leave
+execute as @n[type=minecraft:interaction,tag=bs.interaction.target,distance=..24] run function bs.interaction:on_event/hover/as_target
+tag @s remove bs.interaction.source
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover/reset.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/hover/reset.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.interaction/function/on_event/hover/reset.mcfunction
rename to modules/bs.interaction/data/bs.interaction/function/on_event/hover/reset.mcfunction
index 29810592ef..da1981838c 100644
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover/reset.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/hover/reset.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.interaction/data/bs.interaction/function/on_event/hover_enter/as_target.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_enter/as_target.mcfunction
new file mode 100644
index 0000000000..25e010401f
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_enter/as_target.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players add @s bs.interaction.hover 1
+scoreboard players add #interaction.active_hover bs.data 1
+execute store result storage bs:ctx y int 1 run scoreboard players operation @p[distance=0,tag=bs.interaction.source] bs.interaction.id = @s bs.interaction.id
+execute if entity @s[tag=bs.interaction.listen_hover_enter] run function bs.interaction:on_event/hover_enter/dispatch with storage bs:ctx
+execute if entity @s[tag=bs.interaction.listen_hover] run function bs.interaction:on_event/hover/dispatch with storage bs:ctx
+tag @s remove bs.interaction.target
diff --git a/modules/bs.interaction/data/bs.interaction/function/on_event/hover_enter/dispatch.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_enter/dispatch.mcfunction
new file mode 100644
index 0000000000..daeb42f650
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_enter/dispatch.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data interaction.run set value []
+$data modify storage bs:data interaction.run append from storage bs:data interaction.$(y)[{type:"hover_enter"}]
+execute if data storage bs:data interaction.run[-1] run function bs.interaction:on_event/run with storage bs:data interaction.run[-1]
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_enter/get_target/filter.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_enter/get_target/filter.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_enter/get_target/filter.mcfunction
rename to modules/bs.interaction/data/bs.interaction/function/on_event/hover_enter/get_target/filter.mcfunction
index aaf2f3149d..b2ae21da4e 100644
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_enter/get_target/filter.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_enter/get_target/filter.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_enter/get_target/mask.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_enter/get_target/mask.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_enter/get_target/mask.mcfunction
rename to modules/bs.interaction/data/bs.interaction/function/on_event/hover_enter/get_target/mask.mcfunction
index 357261748e..856fe841fd 100644
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_enter/get_target/mask.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_enter/get_target/mask.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.interaction/data/bs.interaction/function/on_event/hover_enter/hover_enter.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_enter/hover_enter.mcfunction
new file mode 100644
index 0000000000..3a32cccb0e
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_enter/hover_enter.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute unless predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"minecraft:player","looking_at":{"type":"minecraft:interaction","nbt":"{\"Tags\":[\"bs.interaction.is_hoverable\"]}","distance":{"absolute":{"max":$(y)}}}}}} run return fail
+
+tag @s add bs.interaction.source
+tag @n[type=minecraft:interaction,tag=bs.interaction.is_hoverable,distance=..24,limit=2147483647] add bs.interaction.target
+function bs.interaction:on_event/hover_enter/get_target/filter
+execute as @n[type=minecraft:interaction,tag=bs.interaction.target,distance=..24] run function bs.interaction:on_event/hover_enter/as_target
+tag @s remove bs.interaction.source
diff --git a/modules/bs.interaction/data/bs.interaction/function/on_event/hover_leave/as_target.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_leave/as_target.mcfunction
new file mode 100644
index 0000000000..e0666bd0ef
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_leave/as_target.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+tag @s add bs.interaction.target
+scoreboard players remove @s bs.interaction.hover 1
+scoreboard players remove #interaction.active_hover bs.data 1
+execute if entity @s[tag=bs.interaction.listen_hover_leave] run function bs.interaction:on_event/hover_leave/dispatch with storage bs:ctx
+tag @s remove bs.interaction.target
diff --git a/modules/bs.interaction/data/bs.interaction/function/on_event/hover_leave/dispatch.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_leave/dispatch.mcfunction
new file mode 100644
index 0000000000..2ffd3ce1e2
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_leave/dispatch.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data interaction.run set value []
+$data modify storage bs:data interaction.run append from storage bs:data interaction.$(y)[{type:"hover_leave"}]
+execute if data storage bs:data interaction.run[-1] run function bs.interaction:on_event/run with storage bs:data interaction.run[-1]
diff --git a/modules/bs.interaction/data/bs.interaction/function/on_event/hover_leave/hover_leave.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_leave/hover_leave.mcfunction
new file mode 100644
index 0000000000..e4c19646d8
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_leave/hover_leave.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute as @n[type=minecraft:interaction,tag=bs.interaction.target] run function bs.interaction:on_event/hover_leave/as_target
+tag @s remove bs.interaction.source
+scoreboard players reset @s bs.interaction.id
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_leave/try_leave.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_leave/try_leave.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_leave/try_leave.mcfunction
rename to modules/bs.interaction/data/bs.interaction/function/on_event/hover_leave/try_leave.mcfunction
index aa4e85ba5f..e6fea53a3c 100644
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/hover_leave/try_leave.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/hover_leave/try_leave.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.interaction/data/bs.interaction/function/on_event/left_click/as_target.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/left_click/as_target.mcfunction
new file mode 100644
index 0000000000..88f301fc62
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/left_click/as_target.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute on attacker unless entity @s[tag=bs.interaction.source] run return fail
+tag @s add bs.interaction.target
+execute store result storage bs:ctx y int 1 run scoreboard players get @s bs.interaction.id
+function bs.interaction:on_event/left_click/dispatch with storage bs:ctx
+tag @s remove bs.interaction.target
diff --git a/modules/bs.interaction/data/bs.interaction/function/on_event/left_click/dispatch.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/left_click/dispatch.mcfunction
new file mode 100644
index 0000000000..1c779895fb
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/left_click/dispatch.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data interaction.run set value []
+$data modify storage bs:data interaction.run append from storage bs:data interaction.$(y)[{type:"left_click"}]
+execute if data storage bs:data interaction.run[-1] run function bs.interaction:on_event/run with storage bs:data interaction.run[-1]
diff --git a/modules/bs.interaction/data/bs.interaction/function/on_event/left_click/left_click.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/left_click/left_click.mcfunction
new file mode 100644
index 0000000000..42121163ea
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/left_click/left_click.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Note:
+# Function called when a left click is done on a left click listener.
+
+advancement revoke @s only bs.interaction:left_click
+tag @s add bs.interaction.source
+execute as @n[type=minecraft:interaction,tag=bs.interaction.listen_left_click,distance=..24,limit=2147483647] run function bs.interaction:on_event/left_click/as_target
+tag @s remove bs.interaction.source
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/player_process.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/player_process.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.interaction/function/on_event/player_process.mcfunction
rename to modules/bs.interaction/data/bs.interaction/function/on_event/player_process.mcfunction
index a5b17d5213..9c577715ec 100644
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/player_process.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/player_process.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/on_event/process.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/process.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.interaction/function/on_event/process.mcfunction
rename to modules/bs.interaction/data/bs.interaction/function/on_event/process.mcfunction
index fdfa79c5ce..3beb580e84 100644
--- a/datapacks/Bookshelf/data/bs.interaction/function/on_event/process.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/process.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.interaction/data/bs.interaction/function/on_event/right_click/as_target.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/right_click/as_target.mcfunction
new file mode 100644
index 0000000000..829f12588d
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/right_click/as_target.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute on target unless entity @s[tag=bs.interaction.source] run return fail
+tag @s add bs.interaction.target
+execute store result storage bs:ctx y int 1 run scoreboard players get @s bs.interaction.id
+function bs.interaction:on_event/right_click/dispatch with storage bs:ctx
+tag @s remove bs.interaction.target
diff --git a/modules/bs.interaction/data/bs.interaction/function/on_event/right_click/dispatch.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/right_click/dispatch.mcfunction
new file mode 100644
index 0000000000..03650cc974
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/right_click/dispatch.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data interaction.run set value []
+$data modify storage bs:data interaction.run append from storage bs:data interaction.$(y)[{type:"right_click"}]
+execute if data storage bs:data interaction.run[-1] run function bs.interaction:on_event/run with storage bs:data interaction.run[-1]
diff --git a/modules/bs.interaction/data/bs.interaction/function/on_event/right_click/right_click.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/right_click/right_click.mcfunction
new file mode 100644
index 0000000000..92d45f8eb9
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/right_click/right_click.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Note:
+# Function called when a right click is done on a right click listener.
+
+advancement revoke @s only bs.interaction:right_click
+tag @s add bs.interaction.source
+execute as @n[type=minecraft:interaction,tag=bs.interaction.listen_right_click,distance=..24,limit=2147483647] run function bs.interaction:on_event/right_click/as_target
+tag @s remove bs.interaction.source
diff --git a/modules/bs.interaction/data/bs.interaction/function/on_event/run.mcfunction b/modules/bs.interaction/data/bs.interaction/function/on_event/run.mcfunction
new file mode 100644
index 0000000000..75c76f00c5
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/on_event/run.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute as $(executor) run $(run)
+data remove storage bs:data interaction.run[-1]
+execute if data storage bs:data interaction.run[-1] run function bs.interaction:on_event/run with storage bs:data interaction.run[-1]
diff --git a/modules/bs.interaction/data/bs.interaction/function/register/hover.mcfunction b/modules/bs.interaction/data/bs.interaction/function/register/hover.mcfunction
new file mode 100644
index 0000000000..daf77779f5
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/register/hover.mcfunction
@@ -0,0 +1,51 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute unless entity @s[type=interaction] run return run function #bs.log:error { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_hover", \
+ tag: "on_hover", \
+ message: '"The current entity is not an interaction."', \
+}
+$data modify storage bs:ctx _ set value { run: '$(run)', executor: $(executor), type: "hover" }
+
+execute store success score #s bs.ctx run function bs.interaction:register/utils/check_command with storage bs:ctx _
+execute unless score #s bs.ctx matches 1 run return run function #bs.log:error { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_hover", \
+ tag: "on_hover", \
+ message: '"The command is not valid."', \
+}
+
+execute unless function bs.interaction:register/utils/executor/setup \
+ run return run function #bs.log:error { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_hover", \
+ tag: "on_hover", \
+ message: '"The executor is not valid or cannot be interpreted."', \
+ }
+
+execute if score #i bs.ctx matches 2.. run function #bs.log:warn { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_hover", \
+ tag: "on_hover", \
+ message: '"The selector points to multiple entities. Only the first one is selected."' \
+}
+
+tag @s add bs.interaction.is_hoverable
+tag @s add bs.interaction.listen_hover
+scoreboard players set #interaction.process bs.data 1
+schedule function bs.interaction:on_event/process 1t replace
+return run function bs.interaction:register/utils/setup_listener
diff --git a/modules/bs.interaction/data/bs.interaction/function/register/hover_enter.mcfunction b/modules/bs.interaction/data/bs.interaction/function/register/hover_enter.mcfunction
new file mode 100644
index 0000000000..1230637b8c
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/register/hover_enter.mcfunction
@@ -0,0 +1,51 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute unless entity @s[type=interaction] run return run function #bs.log:error { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_hover_enter", \
+ tag: "on_hover_enter", \
+ message: '"The current entity is not an interaction."', \
+}
+$data modify storage bs:ctx _ set value { run: '$(run)', executor: $(executor), type: "hover_enter" }
+
+execute store success score #s bs.ctx run function bs.interaction:register/utils/check_command with storage bs:ctx _
+execute unless score #s bs.ctx matches 1 run return run function #bs.log:error { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_hover_enter", \
+ tag: "on_hover_enter", \
+ message: '"The command is not valid."', \
+}
+
+execute unless function bs.interaction:register/utils/executor/setup \
+ run return run function #bs.log:error { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_hover_enter", \
+ tag: "on_hover_enter", \
+ message: '"The executor is not valid or cannot be interpreted."', \
+ }
+
+execute if score #i bs.ctx matches 2.. run function #bs.log:warn { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_hover_enter", \
+ tag: "on_hover_enter", \
+ message: '"The selector points to multiple entities. Only the first one is selected."' \
+}
+
+tag @s add bs.interaction.is_hoverable
+tag @s add bs.interaction.listen_hover_enter
+scoreboard players set #interaction.process bs.data 1
+schedule function bs.interaction:on_event/process 1t replace
+return run function bs.interaction:register/utils/setup_listener
diff --git a/modules/bs.interaction/data/bs.interaction/function/register/hover_leave.mcfunction b/modules/bs.interaction/data/bs.interaction/function/register/hover_leave.mcfunction
new file mode 100644
index 0000000000..14f5e70c21
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/register/hover_leave.mcfunction
@@ -0,0 +1,51 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute unless entity @s[type=interaction] run return run function #bs.log:error { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_hover_leave", \
+ tag: "on_hover_leave", \
+ message: '"The current entity is not an interaction."', \
+}
+$data modify storage bs:ctx _ set value { run: '$(run)', executor: $(executor), type: "hover_leave" }
+
+execute store success score #s bs.ctx run function bs.interaction:register/utils/check_command with storage bs:ctx _
+execute unless score #s bs.ctx matches 1 run return run function #bs.log:error { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_hover_leave", \
+ tag: "on_hover_leave", \
+ message: '"The command is not valid."', \
+}
+
+execute unless function bs.interaction:register/utils/executor/setup \
+ run return run function #bs.log:error { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_hover_leave", \
+ tag: "on_hover_leave", \
+ message: '"The executor is not valid or cannot be interpreted."', \
+ }
+
+execute if score #i bs.ctx matches 2.. run function #bs.log:warn { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_hover_leave", \
+ tag: "on_hover_leave", \
+ message: '"The selector points to multiple entities. Only the first one is selected."' \
+}
+
+tag @s add bs.interaction.is_hoverable
+tag @s add bs.interaction.listen_hover_leave
+scoreboard players set #interaction.process bs.data 1
+schedule function bs.interaction:on_event/process 1t replace
+return run function bs.interaction:register/utils/setup_listener
diff --git a/modules/bs.interaction/data/bs.interaction/function/register/left_click.mcfunction b/modules/bs.interaction/data/bs.interaction/function/register/left_click.mcfunction
new file mode 100644
index 0000000000..efce2a8310
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/register/left_click.mcfunction
@@ -0,0 +1,48 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute unless entity @s[type=interaction] run return run function #bs.log:error { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_left_click", \
+ tag: "on_left_click", \
+ message: '"The current entity is not an interaction."', \
+}
+$data modify storage bs:ctx _ set value { run: '$(run)', executor: $(executor), type: "left_click" }
+
+execute store success score #s bs.ctx run function bs.interaction:register/utils/check_command with storage bs:ctx _
+execute unless score #s bs.ctx matches 1 run return run function #bs.log:error { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_left_click", \
+ tag: "on_left_click", \
+ message: '"The command is not valid."', \
+}
+
+execute unless function bs.interaction:register/utils/executor/setup \
+ run return run function #bs.log:error { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_left_click", \
+ tag: "on_left_click", \
+ message: '"The executor is not valid or cannot be interpreted."', \
+ }
+
+execute if score #i bs.ctx matches 2.. run function #bs.log:warn { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_left_click", \
+ tag: "on_left_click", \
+ message: '"The selector points to multiple entities. Only the first one is selected."' \
+}
+
+tag @s add bs.interaction.listen_left_click
+return run function bs.interaction:register/utils/setup_listener
diff --git a/modules/bs.interaction/data/bs.interaction/function/register/right_click.mcfunction b/modules/bs.interaction/data/bs.interaction/function/register/right_click.mcfunction
new file mode 100644
index 0000000000..537e9183cc
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/register/right_click.mcfunction
@@ -0,0 +1,48 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute unless entity @s[type=interaction] run return run function #bs.log:error { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_right_click", \
+ tag: "on_right_click", \
+ message: '"The current entity is not an interaction."', \
+}
+$data modify storage bs:ctx _ set value { run: '$(run)', executor: $(executor), type: "right_click" }
+
+execute store success score #s bs.ctx run function bs.interaction:register/utils/check_command with storage bs:ctx _
+execute unless score #s bs.ctx matches 1 run return run function #bs.log:error { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_right_click", \
+ tag: "on_right_click", \
+ message: '"The command is not valid."', \
+}
+
+execute unless function bs.interaction:register/utils/executor/setup \
+ run return run function #bs.log:error { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_right_click", \
+ tag: "on_right_click", \
+ message: '"The executor is not valid or cannot be interpreted."', \
+ }
+
+execute if score #i bs.ctx matches 2.. run function #bs.log:warn { \
+ namespace: bs.interaction, \
+ path: "#bs.interaction:on_right_click", \
+ tag: "on_right_click", \
+ message: '"The selector points to multiple entities. Only the first one is selected."' \
+}
+
+tag @s add bs.interaction.listen_right_click
+return run function bs.interaction:register/utils/setup_listener
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/register/utils/check_command.mcfunction b/modules/bs.interaction/data/bs.interaction/function/register/utils/check_command.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.interaction/function/register/utils/check_command.mcfunction
rename to modules/bs.interaction/data/bs.interaction/function/register/utils/check_command.mcfunction
index 1a60796536..045be42fcb 100644
--- a/datapacks/Bookshelf/data/bs.interaction/function/register/utils/check_command.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/function/register/utils/check_command.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.interaction/data/bs.interaction/function/register/utils/executor/check.mcfunction b/modules/bs.interaction/data/bs.interaction/function/register/utils/executor/check.mcfunction
new file mode 100644
index 0000000000..1f5b99ad87
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/register/utils/executor/check.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+return 1
+$execute if entity $(executor)
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/register/utils/executor/interpret.mcfunction b/modules/bs.interaction/data/bs.interaction/function/register/utils/executor/interpret.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.interaction/function/register/utils/executor/interpret.mcfunction
rename to modules/bs.interaction/data/bs.interaction/function/register/utils/executor/interpret.mcfunction
index 7c75ec9e4b..61ae2d3bd1 100644
--- a/datapacks/Bookshelf/data/bs.interaction/function/register/utils/executor/interpret.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/function/register/utils/executor/interpret.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.interaction/data/bs.interaction/function/register/utils/executor/setup.mcfunction b/modules/bs.interaction/data/bs.interaction/function/register/utils/executor/setup.mcfunction
new file mode 100644
index 0000000000..48d18f23bc
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/register/utils/executor/setup.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Set the executor to the target or the source
+execute if data storage bs:ctx _{executor: "target"} run data modify storage bs:ctx _.executor set value "@s"
+execute if data storage bs:ctx _{executor: "source"} run data modify storage bs:ctx _.executor set value "@p[distance=0,tag=bs.interaction.source]"
+# The executor should be interpreted now only if lazy is set to false
+execute if data storage bs:ctx _.executor{lazy: false} run function bs.interaction:register/utils/executor/interpret with storage bs:ctx _.executor
+# If executor is still an object, replace the executor by the internal selector
+data modify storage bs:ctx _.executor set from storage bs:ctx _.executor.selector
+# Check if the executor is a valid selector
+execute store success score #s bs.ctx run function bs.interaction:register/utils/executor/check with storage bs:ctx _
+return run scoreboard players get #s bs.ctx
diff --git a/modules/bs.interaction/data/bs.interaction/function/register/utils/executor/unquote.mcfunction b/modules/bs.interaction/data/bs.interaction/function/register/utils/executor/unquote.mcfunction
new file mode 100644
index 0000000000..957342692b
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/function/register/utils/executor/unquote.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:ctx _.executor set value $(text)
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/register/utils/register_listener.mcfunction b/modules/bs.interaction/data/bs.interaction/function/register/utils/register_listener.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.interaction/function/register/utils/register_listener.mcfunction
rename to modules/bs.interaction/data/bs.interaction/function/register/utils/register_listener.mcfunction
index 4ec85df1c1..22fbd3687c 100644
--- a/datapacks/Bookshelf/data/bs.interaction/function/register/utils/register_listener.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/function/register/utils/register_listener.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.interaction/function/register/utils/setup_listener.mcfunction b/modules/bs.interaction/data/bs.interaction/function/register/utils/setup_listener.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.interaction/function/register/utils/setup_listener.mcfunction
rename to modules/bs.interaction/data/bs.interaction/function/register/utils/setup_listener.mcfunction
index 55cc45cca0..ee55d60cdb 100644
--- a/datapacks/Bookshelf/data/bs.interaction/function/register/utils/setup_listener.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/function/register/utils/setup_listener.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.interaction/predicate/check_id.json b/modules/bs.interaction/data/bs.interaction/predicate/check_id.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.interaction/predicate/check_id.json
rename to modules/bs.interaction/data/bs.interaction/predicate/check_id.json
diff --git a/modules/bs.interaction/data/bs.interaction/tags/function/callback/glow.json b/modules/bs.interaction/data/bs.interaction/tags/function/callback/glow.json
new file mode 100644
index 0000000000..e083e4c03a
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/tags/function/callback/glow.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/interaction.html#predefined-callbacks",
+ "authors": [
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/11/01",
+ "minecraft_version": "1.21.3"
+ },
+ "updated": {
+ "date": "2024/11/01",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ "values": [
+ "bs.interaction:callback/glow"
+ ]
+}
diff --git a/modules/bs.interaction/data/bs.interaction/tags/function/callback/none.json b/modules/bs.interaction/data/bs.interaction/tags/function/callback/none.json
new file mode 100644
index 0000000000..1a05a742ed
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/tags/function/callback/none.json
@@ -0,0 +1,18 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/interaction.html#predefined-callbacks",
+ "authors": [
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/11/01",
+ "minecraft_version": "1.21.3"
+ },
+ "updated": {
+ "date": "2024/11/01",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ "values": []
+}
diff --git a/modules/bs.interaction/data/bs.interaction/tags/function/callback/unglow.json b/modules/bs.interaction/data/bs.interaction/tags/function/callback/unglow.json
new file mode 100644
index 0000000000..619bbad1e1
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/tags/function/callback/unglow.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/interaction.html#predefined-callbacks",
+ "authors": [
+ "theogiraudet"
+ ],
+ "created": {
+ "date": "2024/11/01",
+ "minecraft_version": "1.21.3"
+ },
+ "updated": {
+ "date": "2024/11/01",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ "values": [
+ "bs.interaction:callback/unglow"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.interaction/tags/function/clear_events.json b/modules/bs.interaction/data/bs.interaction/tags/function/clear_events.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.interaction/tags/function/clear_events.json
rename to modules/bs.interaction/data/bs.interaction/tags/function/clear_events.json
index 2d4e2c7a39..0aaec217f5 100644
--- a/datapacks/Bookshelf/data/bs.interaction/tags/function/clear_events.json
+++ b/modules/bs.interaction/data/bs.interaction/tags/function/clear_events.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#clear-events",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/interaction.html#clear-events",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.interaction/tags/function/on_hover.json b/modules/bs.interaction/data/bs.interaction/tags/function/on_hover.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.interaction/tags/function/on_hover.json
rename to modules/bs.interaction/data/bs.interaction/tags/function/on_hover.json
index f0275fcf61..40143831f3 100644
--- a/datapacks/Bookshelf/data/bs.interaction/tags/function/on_hover.json
+++ b/modules/bs.interaction/data/bs.interaction/tags/function/on_hover.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/interaction.html#on-event",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/datapacks/Bookshelf/data/bs.interaction/tags/function/on_hover_enter.json b/modules/bs.interaction/data/bs.interaction/tags/function/on_hover_enter.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.interaction/tags/function/on_hover_enter.json
rename to modules/bs.interaction/data/bs.interaction/tags/function/on_hover_enter.json
index 730f82ed77..9f57a5d2b4 100644
--- a/datapacks/Bookshelf/data/bs.interaction/tags/function/on_hover_enter.json
+++ b/modules/bs.interaction/data/bs.interaction/tags/function/on_hover_enter.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/interaction.html#on-event",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/datapacks/Bookshelf/data/bs.interaction/tags/function/on_hover_leave.json b/modules/bs.interaction/data/bs.interaction/tags/function/on_hover_leave.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.interaction/tags/function/on_hover_leave.json
rename to modules/bs.interaction/data/bs.interaction/tags/function/on_hover_leave.json
index feb05552e5..27509b1496 100644
--- a/datapacks/Bookshelf/data/bs.interaction/tags/function/on_hover_leave.json
+++ b/modules/bs.interaction/data/bs.interaction/tags/function/on_hover_leave.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/interaction.html#on-event",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/datapacks/Bookshelf/data/bs.interaction/tags/function/on_left_click.json b/modules/bs.interaction/data/bs.interaction/tags/function/on_left_click.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.interaction/tags/function/on_left_click.json
rename to modules/bs.interaction/data/bs.interaction/tags/function/on_left_click.json
index 5bba183c3d..8a2b17fe14 100644
--- a/datapacks/Bookshelf/data/bs.interaction/tags/function/on_left_click.json
+++ b/modules/bs.interaction/data/bs.interaction/tags/function/on_left_click.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/interaction.html#on-event",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/datapacks/Bookshelf/data/bs.interaction/tags/function/on_right_click.json b/modules/bs.interaction/data/bs.interaction/tags/function/on_right_click.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.interaction/tags/function/on_right_click.json
rename to modules/bs.interaction/data/bs.interaction/tags/function/on_right_click.json
index 3defc23a19..83feae12d3 100644
--- a/datapacks/Bookshelf/data/bs.interaction/tags/function/on_right_click.json
+++ b/modules/bs.interaction/data/bs.interaction/tags/function/on_right_click.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/interaction.html#on-event",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/interaction.html#on-event",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/modules/bs.interaction/data/bs.interaction/test/clear_events.mcfunction b/modules/bs.interaction/data/bs.interaction/test/clear_events.mcfunction
new file mode 100644
index 0000000000..35f4005326
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/test/clear_events.mcfunction
@@ -0,0 +1,91 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+## === SETUP ===
+
+summon minecraft:interaction ~.5 ~ ~.5 {Tags: ["bs.packtest","bs.packtest.executor"], width: 1.0, height: 2.0}
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_left_click { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_left_click { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_right_click { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_right_click { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover_enter { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover_enter { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover_leave { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover_leave { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover { run: "help", executor: "target" }
+data modify storage bs:data packtest set value {with:{}}
+
+## === EXPECTED BEHAVIORS (CLEAR LEFT CLICK) ===
+
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result storage bs:data packtest.with.id int 1 run function #bs.interaction:on_left_click { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events with storage bs:data packtest
+execute unless score #i bs.ctx matches 1 run fail "Clear events should clear a single event when using the id"
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events { with: { type: "left_click" } }
+execute unless score #i bs.ctx matches 2 run fail "Clear events should clear all events when using the type"
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] if entity @s[tag=bs.interaction.listen_left_click] run fail "Interaction should stop listening to left_click events when they are cleared"
+
+## === EXPECTED BEHAVIORS (CLEAR RIGHT CLICK) ===
+
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result storage bs:data packtest.with.id int 1 run function #bs.interaction:on_right_click { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events with storage bs:data packtest
+execute unless score #i bs.ctx matches 1 run fail "Clear events should clear a single event when using the id"
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events { with: { type: "right_click" } }
+execute unless score #i bs.ctx matches 2 run fail "Clear events should clear all events when using the type"
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] if entity @s[tag=bs.interaction.listen_right_click] run fail "Interaction should stop listening to right_click events when they are cleared"
+
+## === EXPECTED BEHAVIORS (CLEAR HOVER ENTER) ===
+
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result storage bs:data packtest.with.id int 1 run function #bs.interaction:on_hover_enter { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events with storage bs:data packtest
+execute unless score #i bs.ctx matches 1 run fail "Clear events should clear a single event when using the id"
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events { with: { type: "hover_enter" } }
+execute unless score #i bs.ctx matches 2 run fail "Clear events should clear all events when using the type"
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] if entity @s[tag=bs.interaction.listen_hover_enter] run fail "Interaction should stop listening to hover_enter events when they are cleared"
+
+## === EXPECTED BEHAVIORS (CLEAR HOVER LEAVE) ===
+
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result storage bs:data packtest.with.id int 1 run function #bs.interaction:on_hover_leave { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events with storage bs:data packtest
+execute unless score #i bs.ctx matches 1 run fail "Clear events should clear a single event when using the id"
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events { with: { type: "hover_leave" } }
+execute unless score #i bs.ctx matches 2 run fail "Clear events should clear all events when using the type"
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] if entity @s[tag=bs.interaction.listen_hover_leave] run fail "Interaction should stop listening to hover_leave events when they are cleared"
+
+## === EXPECTED BEHAVIORS (CLEAR HOVER) ===
+
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result storage bs:data packtest.with.id int 1 run function #bs.interaction:on_hover { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events with storage bs:data packtest
+execute unless score #i bs.ctx matches 1 run fail "Clear events should clear a single event when using the id"
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events { with: { type: "hover" } }
+execute unless score #i bs.ctx matches 2 run fail "Clear events should clear all events when using the type"
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] if entity @s[tag=bs.interaction.listen_hover] run fail "Interaction should stop listening to hover events when they are cleared"
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] if entity @s[tag=bs.interaction.is_hoverable] run fail "Interaction should stop listening to all hover events when they are cleared"
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] if score @s bs.interaction.id matches 1.. run fail "Clear events should reset the interaction id when all events are cleared"
+
+## === EXPECTED BEHAVIORS (CLEAR ALL) ===
+
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_left_click { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_right_click { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover_enter { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover_leave { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover { run: "help", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events { with: {} }
+execute unless score #i bs.ctx matches 5 run fail "Clear events should clear all events when using an empty object"
+
+## === EXPECTED BEHAVIORS (CLEAR NONE) ===
+
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] store result score #i bs.ctx run function #bs.interaction:clear_events { with: {} }
+execute unless score #i bs.ctx matches 0 run fail "Clear events should return 0 when no events are registered"
diff --git a/datapacks/Bookshelf/data/bs.interaction/test/on_hover.mcfunction b/modules/bs.interaction/data/bs.interaction/test/on_hover.mcfunction
similarity index 88%
rename from datapacks/Bookshelf/data/bs.interaction/test/on_hover.mcfunction
rename to modules/bs.interaction/data/bs.interaction/test/on_hover.mcfunction
index e414f0539b..362afa1e36 100644
--- a/datapacks/Bookshelf/data/bs.interaction/test/on_hover.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/test/on_hover.mcfunction
@@ -1,4 +1,17 @@
-# @batch bs.interaction
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
# @dummy
## === SETUP ===
diff --git a/datapacks/Bookshelf/data/bs.interaction/test/on_hover_enter.mcfunction b/modules/bs.interaction/data/bs.interaction/test/on_hover_enter.mcfunction
similarity index 87%
rename from datapacks/Bookshelf/data/bs.interaction/test/on_hover_enter.mcfunction
rename to modules/bs.interaction/data/bs.interaction/test/on_hover_enter.mcfunction
index 737f0d112f..731dfebba6 100644
--- a/datapacks/Bookshelf/data/bs.interaction/test/on_hover_enter.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/test/on_hover_enter.mcfunction
@@ -1,4 +1,17 @@
-# @batch bs.interaction
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
# @dummy
## === SETUP ===
diff --git a/datapacks/Bookshelf/data/bs.interaction/test/on_hover_leave.mcfunction b/modules/bs.interaction/data/bs.interaction/test/on_hover_leave.mcfunction
similarity index 87%
rename from datapacks/Bookshelf/data/bs.interaction/test/on_hover_leave.mcfunction
rename to modules/bs.interaction/data/bs.interaction/test/on_hover_leave.mcfunction
index f813f28434..facd23cac3 100644
--- a/datapacks/Bookshelf/data/bs.interaction/test/on_hover_leave.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/test/on_hover_leave.mcfunction
@@ -1,4 +1,17 @@
-# @batch bs.interaction
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
# @dummy
## === SETUP ===
diff --git a/modules/bs.interaction/data/bs.interaction/test/on_hover_logout.mcfunction b/modules/bs.interaction/data/bs.interaction/test/on_hover_logout.mcfunction
new file mode 100644
index 0000000000..ff8d0bc699
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/test/on_hover_logout.mcfunction
@@ -0,0 +1,31 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+## === SETUP ===
+fill ~-1 ~-1 ~-1 ~1 ~1 ~1 minecraft:air replace minecraft:barrier
+summon minecraft:interaction ~.5 ~ ~1.5 {Tags: ["bs.packtest"], width: 1.0, height: 2.0}
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover_enter { run: "scoreboard players add #packtest.interaction_hover_count bs.data 1", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..2] run function #bs.interaction:on_hover_leave { run: "scoreboard players remove #packtest.interaction_hover_count bs.data 1", executor: "target" }
+scoreboard players set #packtest.interaction_hover_count bs.data 0
+
+## === EXPECTED BEHAVIORS ===
+
+execute positioned ~.5 ~ ~.5 run dummy on_hover_logout spawn
+await delay 2t
+assert score #packtest.interaction_hover_count bs.data matches 2
+dummy on_hover_logout leave
+await delay 1t
+assert score #packtest.interaction_hover_count bs.data matches 1
diff --git a/modules/bs.interaction/data/bs.interaction/test/on_hover_swap.mcfunction b/modules/bs.interaction/data/bs.interaction/test/on_hover_swap.mcfunction
new file mode 100644
index 0000000000..ac22299ada
--- /dev/null
+++ b/modules/bs.interaction/data/bs.interaction/test/on_hover_swap.mcfunction
@@ -0,0 +1,33 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+## === SETUP ===
+
+fill ~-1 ~-1 ~-1 ~1 ~1 ~1 minecraft:air replace minecraft:barrier
+summon minecraft:interaction ~ ~ ~1.5 {Tags: ["bs.packtest","bs.packtest.1"], width: 1.0, height: 2.0}
+summon minecraft:interaction ~1 ~ ~1.5 {Tags: ["bs.packtest","bs.packtest.2"], width: 1.0, height: 2.0}
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..3,limit=2] run function #bs.interaction:on_hover_enter { run: "tag @s add bs.packtest.target", executor: "target" }
+execute as @n[type=minecraft:interaction,tag=bs.packtest,distance=..3,limit=2] run function #bs.interaction:on_hover_leave { run: "tag @s remove bs.packtest.target", executor: "target" }
+
+## === EXPECTED BEHAVIORS ===
+
+tp @s ~.5 ~ ~.5 45 0
+await delay 2t
+execute unless entity @n[type=minecraft:interaction,tag=bs.packtest.1,tag=bs.packtest.target,distance=..2] run fail "Failed to run callback on target entity"
+tp @s ~.5 ~ ~.5 -45 0
+await delay 2t
+execute if entity @n[type=minecraft:interaction,tag=bs.packtest.1,tag=bs.packtest.target,distance=..2] run fail "Failed to swap hover to an other target entity"
+execute unless entity @n[type=minecraft:interaction,tag=bs.packtest.2,tag=bs.packtest.target,distance=..2] run fail "Failed to swap hover to an other target entity"
diff --git a/datapacks/Bookshelf/data/bs.interaction/test/on_left_click.mcfunction b/modules/bs.interaction/data/bs.interaction/test/on_left_click.mcfunction
similarity index 83%
rename from datapacks/Bookshelf/data/bs.interaction/test/on_left_click.mcfunction
rename to modules/bs.interaction/data/bs.interaction/test/on_left_click.mcfunction
index 9f23e14a56..01f3e05a79 100644
--- a/datapacks/Bookshelf/data/bs.interaction/test/on_left_click.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/test/on_left_click.mcfunction
@@ -1,4 +1,17 @@
-# @batch bs.interaction
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
# @dummy
## === SETUP ===
diff --git a/datapacks/Bookshelf/data/bs.interaction/test/on_right_click.mcfunction b/modules/bs.interaction/data/bs.interaction/test/on_right_click.mcfunction
similarity index 83%
rename from datapacks/Bookshelf/data/bs.interaction/test/on_right_click.mcfunction
rename to modules/bs.interaction/data/bs.interaction/test/on_right_click.mcfunction
index e0637dd59c..38542d218e 100644
--- a/datapacks/Bookshelf/data/bs.interaction/test/on_right_click.mcfunction
+++ b/modules/bs.interaction/data/bs.interaction/test/on_right_click.mcfunction
@@ -1,4 +1,17 @@
-# @batch bs.interaction
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
# @dummy
## === SETUP ===
diff --git a/modules/bs.interaction/module.json b/modules/bs.interaction/module.json
new file mode 100644
index 0000000000..ee0b781643
--- /dev/null
+++ b/modules/bs.interaction/module.json
@@ -0,0 +1,17 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.interaction",
+ "load": "."
+ },
+ "meta": {
+ "name": "Interaction",
+ "slug": "bookshelf-interaction",
+ "description": "A low-level API to create GUI based on Interaction entity by binding events to it.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/interaction.html",
+ "tags": ["default"],
+ "weak_dependencies": [
+ "bs.log"
+ ]
+ }
+}
diff --git a/modules/bs.link/README.md b/modules/bs.link/README.md
new file mode 100644
index 0000000000..738537ca3c
--- /dev/null
+++ b/modules/bs.link/README.md
@@ -0,0 +1,14 @@
+# 🔗 Bookshelf Link
+
+This datapack enables the creation of coherent entity structures by linking their positions and rotations.
+
+> “Invisible threads are the strongest ties.”
+>
+> -- Friedrich Nietzsche
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/link.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.link/data/bs.link/function/__load__.mcfunction b/modules/bs.link/data/bs.link/function/__load__.mcfunction
new file mode 100644
index 0000000000..73f0ed9140
--- /dev/null
+++ b/modules/bs.link/data/bs.link/function/__load__.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+
+scoreboard objectives add bs.link.rx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Link relative X","color":"aqua"}]
+scoreboard objectives add bs.link.ry dummy [{"text":"BS ","color":"dark_gray"},{"text":"Link relative Y","color":"aqua"}]
+scoreboard objectives add bs.link.rz dummy [{"text":"BS ","color":"dark_gray"},{"text":"Link relative Z","color":"aqua"}]
+scoreboard objectives add bs.link.lx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Link local X","color":"aqua"}]
+scoreboard objectives add bs.link.ly dummy [{"text":"BS ","color":"dark_gray"},{"text":"Link local Y","color":"aqua"}]
+scoreboard objectives add bs.link.lz dummy [{"text":"BS ","color":"dark_gray"},{"text":"Link local Z","color":"aqua"}]
+scoreboard objectives add bs.link.lv dummy [{"text":"BS ","color":"dark_gray"},{"text":"Link local V","color":"aqua"}]
+scoreboard objectives add bs.link.lh dummy [{"text":"BS ","color":"dark_gray"},{"text":"Link local H","color":"aqua"}]
+scoreboard objectives add bs.link.to dummy [{"text":"BS ","color":"dark_gray"},{"text":"Linked to","color":"aqua"}]
+
+scoreboard players set 10 bs.const 10
diff --git a/modules/bs.link/data/bs.link/function/__unload__.mcfunction b/modules/bs.link/data/bs.link/function/__unload__.mcfunction
new file mode 100644
index 0000000000..519cb1005e
--- /dev/null
+++ b/modules/bs.link/data/bs.link/function/__unload__.mcfunction
@@ -0,0 +1,30 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard objectives remove bs.const
+scoreboard objectives remove bs.ctx
+
+scoreboard objectives remove bs.link.rx
+scoreboard objectives remove bs.link.ry
+scoreboard objectives remove bs.link.rz
+
+scoreboard objectives remove bs.link.lx
+scoreboard objectives remove bs.link.ly
+scoreboard objectives remove bs.link.lz
+
+scoreboard objectives remove bs.link.lv
+scoreboard objectives remove bs.link.lh
+
+scoreboard objectives remove bs.link.to
diff --git a/modules/bs.link/data/bs.link/function/as_children.mcfunction b/modules/bs.link/data/bs.link/function/as_children.mcfunction
new file mode 100644
index 0000000000..34d116ad57
--- /dev/null
+++ b/modules/bs.link/data/bs.link/function/as_children.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute unless predicate bs.id:has_suid run return fail
+
+scoreboard players operation $link.to bs.in = @s bs.id
+$execute as @e[predicate=bs.link:link_equal] run $(run)
diff --git a/modules/bs.link/data/bs.link/function/as_parent.mcfunction b/modules/bs.link/data/bs.link/function/as_parent.mcfunction
new file mode 100644
index 0000000000..0b9a00db72
--- /dev/null
+++ b/modules/bs.link/data/bs.link/function/as_parent.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute unless predicate bs.link:has_link run return fail
+
+scoreboard players operation $id.suid bs.in = @s bs.link.to
+$execute as @n[predicate=bs.id:suid_equal,sort=arbitrary] run $(run)
diff --git a/modules/bs.link/data/bs.link/function/at_children.mcfunction b/modules/bs.link/data/bs.link/function/at_children.mcfunction
new file mode 100644
index 0000000000..6201cbb8e2
--- /dev/null
+++ b/modules/bs.link/data/bs.link/function/at_children.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute unless predicate bs.id:has_suid run return fail
+
+scoreboard players operation $link.to bs.in = @s bs.id
+$execute at @e[predicate=bs.link:link_equal] run $(run)
diff --git a/modules/bs.link/data/bs.link/function/at_parent.mcfunction b/modules/bs.link/data/bs.link/function/at_parent.mcfunction
new file mode 100644
index 0000000000..452a2ba08f
--- /dev/null
+++ b/modules/bs.link/data/bs.link/function/at_parent.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute unless predicate bs.link:has_link run return fail
+
+scoreboard players operation $id.suid bs.in = @s bs.link.to
+$execute at @n[predicate=bs.id:suid_equal,sort=arbitrary] run $(run)
diff --git a/modules/bs.link/data/bs.link/function/behaviors/apply.mcfunction b/modules/bs.link/data/bs.link/function/behaviors/apply.mcfunction
new file mode 100644
index 0000000000..3943f9f92c
--- /dev/null
+++ b/modules/bs.link/data/bs.link/function/behaviors/apply.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.position:set_pos_and_rot {scale:0.001}
diff --git a/datapacks/Bookshelf/data/bs.link/function/behaviors/imitate_pos_x.mcfunction b/modules/bs.link/data/bs.link/function/behaviors/imitate_pos_x.mcfunction
similarity index 85%
rename from datapacks/Bookshelf/data/bs.link/function/behaviors/imitate_pos_x.mcfunction
rename to modules/bs.link/data/bs.link/function/behaviors/imitate_pos_x.mcfunction
index 8c9400d0fd..28c9cb4093 100644
--- a/datapacks/Bookshelf/data/bs.link/function/behaviors/imitate_pos_x.mcfunction
+++ b/modules/bs.link/data/bs.link/function/behaviors/imitate_pos_x.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors
# ------------------------------------------------------------------------------------------------------------
execute store result score @s bs.pos.x run scoreboard players operation #x bs.ctx += @s bs.link.rx
diff --git a/datapacks/Bookshelf/data/bs.link/function/behaviors/imitate_pos_y.mcfunction b/modules/bs.link/data/bs.link/function/behaviors/imitate_pos_y.mcfunction
similarity index 85%
rename from datapacks/Bookshelf/data/bs.link/function/behaviors/imitate_pos_y.mcfunction
rename to modules/bs.link/data/bs.link/function/behaviors/imitate_pos_y.mcfunction
index 9935bae329..163243fa8b 100644
--- a/datapacks/Bookshelf/data/bs.link/function/behaviors/imitate_pos_y.mcfunction
+++ b/modules/bs.link/data/bs.link/function/behaviors/imitate_pos_y.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors
# ------------------------------------------------------------------------------------------------------------
execute store result score @s bs.pos.y run scoreboard players operation #y bs.ctx += @s bs.link.ry
diff --git a/datapacks/Bookshelf/data/bs.link/function/behaviors/imitate_pos_z.mcfunction b/modules/bs.link/data/bs.link/function/behaviors/imitate_pos_z.mcfunction
similarity index 85%
rename from datapacks/Bookshelf/data/bs.link/function/behaviors/imitate_pos_z.mcfunction
rename to modules/bs.link/data/bs.link/function/behaviors/imitate_pos_z.mcfunction
index 046f5cf4bb..71e3da08c8 100644
--- a/datapacks/Bookshelf/data/bs.link/function/behaviors/imitate_pos_z.mcfunction
+++ b/modules/bs.link/data/bs.link/function/behaviors/imitate_pos_z.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors
# ------------------------------------------------------------------------------------------------------------
execute store result score @s bs.pos.z run scoreboard players operation #z bs.ctx += @s bs.link.rz
diff --git a/datapacks/Bookshelf/data/bs.link/function/behaviors/imitate_rot_h.mcfunction b/modules/bs.link/data/bs.link/function/behaviors/imitate_rot_h.mcfunction
similarity index 85%
rename from datapacks/Bookshelf/data/bs.link/function/behaviors/imitate_rot_h.mcfunction
rename to modules/bs.link/data/bs.link/function/behaviors/imitate_rot_h.mcfunction
index a37c0a2a05..4133997299 100644
--- a/datapacks/Bookshelf/data/bs.link/function/behaviors/imitate_rot_h.mcfunction
+++ b/modules/bs.link/data/bs.link/function/behaviors/imitate_rot_h.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors
# ------------------------------------------------------------------------------------------------------------
execute store result score @s bs.rot.h run scoreboard players operation #h bs.ctx += @s bs.link.lh
diff --git a/datapacks/Bookshelf/data/bs.link/function/behaviors/imitate_rot_v.mcfunction b/modules/bs.link/data/bs.link/function/behaviors/imitate_rot_v.mcfunction
similarity index 85%
rename from datapacks/Bookshelf/data/bs.link/function/behaviors/imitate_rot_v.mcfunction
rename to modules/bs.link/data/bs.link/function/behaviors/imitate_rot_v.mcfunction
index 19fa5f085b..0b57fdce06 100644
--- a/datapacks/Bookshelf/data/bs.link/function/behaviors/imitate_rot_v.mcfunction
+++ b/modules/bs.link/data/bs.link/function/behaviors/imitate_rot_v.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors
# ------------------------------------------------------------------------------------------------------------
execute store result score @s bs.rot.v run scoreboard players operation #v bs.ctx += @s bs.link.lv
diff --git a/datapacks/Bookshelf/data/bs.link/function/behaviors/reverse_pos_x.mcfunction b/modules/bs.link/data/bs.link/function/behaviors/reverse_pos_x.mcfunction
similarity index 88%
rename from datapacks/Bookshelf/data/bs.link/function/behaviors/reverse_pos_x.mcfunction
rename to modules/bs.link/data/bs.link/function/behaviors/reverse_pos_x.mcfunction
index cbf6013daf..cf188cd664 100644
--- a/datapacks/Bookshelf/data/bs.link/function/behaviors/reverse_pos_x.mcfunction
+++ b/modules/bs.link/data/bs.link/function/behaviors/reverse_pos_x.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors
# ------------------------------------------------------------------------------------------------------------
scoreboard players operation @s bs.pos.x -= #x bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.link/function/behaviors/reverse_pos_y.mcfunction b/modules/bs.link/data/bs.link/function/behaviors/reverse_pos_y.mcfunction
similarity index 88%
rename from datapacks/Bookshelf/data/bs.link/function/behaviors/reverse_pos_y.mcfunction
rename to modules/bs.link/data/bs.link/function/behaviors/reverse_pos_y.mcfunction
index 7542198827..4753b33fcf 100644
--- a/datapacks/Bookshelf/data/bs.link/function/behaviors/reverse_pos_y.mcfunction
+++ b/modules/bs.link/data/bs.link/function/behaviors/reverse_pos_y.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors
# ------------------------------------------------------------------------------------------------------------
scoreboard players operation @s bs.pos.y -= #y bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.link/function/behaviors/reverse_pos_z.mcfunction b/modules/bs.link/data/bs.link/function/behaviors/reverse_pos_z.mcfunction
similarity index 88%
rename from datapacks/Bookshelf/data/bs.link/function/behaviors/reverse_pos_z.mcfunction
rename to modules/bs.link/data/bs.link/function/behaviors/reverse_pos_z.mcfunction
index 5209bc930a..25149d89bd 100644
--- a/datapacks/Bookshelf/data/bs.link/function/behaviors/reverse_pos_z.mcfunction
+++ b/modules/bs.link/data/bs.link/function/behaviors/reverse_pos_z.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors
# ------------------------------------------------------------------------------------------------------------
scoreboard players operation @s bs.pos.z -= #z bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.link/function/behaviors/reverse_rot_h.mcfunction b/modules/bs.link/data/bs.link/function/behaviors/reverse_rot_h.mcfunction
similarity index 88%
rename from datapacks/Bookshelf/data/bs.link/function/behaviors/reverse_rot_h.mcfunction
rename to modules/bs.link/data/bs.link/function/behaviors/reverse_rot_h.mcfunction
index 783ac0f29d..0d8570101b 100644
--- a/datapacks/Bookshelf/data/bs.link/function/behaviors/reverse_rot_h.mcfunction
+++ b/modules/bs.link/data/bs.link/function/behaviors/reverse_rot_h.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors
# ------------------------------------------------------------------------------------------------------------
scoreboard players operation @s bs.rot.h -= #h bs.ctx
diff --git a/datapacks/Bookshelf/data/bs.link/function/behaviors/reverse_rot_v.mcfunction b/modules/bs.link/data/bs.link/function/behaviors/reverse_rot_v.mcfunction
similarity index 84%
rename from datapacks/Bookshelf/data/bs.link/function/behaviors/reverse_rot_v.mcfunction
rename to modules/bs.link/data/bs.link/function/behaviors/reverse_rot_v.mcfunction
index 0353f87707..d7ac0908be 100644
--- a/datapacks/Bookshelf/data/bs.link/function/behaviors/reverse_rot_v.mcfunction
+++ b/modules/bs.link/data/bs.link/function/behaviors/reverse_rot_v.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,9 +11,7 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors
-# -------------------------------------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------------------------------------
scoreboard players operation @s bs.rot.v -= #v bs.ctx
scoreboard players operation @s bs.rot.v -= @s bs.link.lv
diff --git a/modules/bs.link/data/bs.link/function/behaviors/setup.mcfunction b/modules/bs.link/data/bs.link/function/behaviors/setup.mcfunction
new file mode 100644
index 0000000000..f5076ab5f5
--- /dev/null
+++ b/modules/bs.link/data/bs.link/function/behaviors/setup.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation $id.suid bs.in = @s bs.link.to
+execute at @n[predicate=bs.id:suid_equal,sort=arbitrary] run function #bs.position:get_pos_and_rot {scale:1000}
+
+scoreboard players operation #x bs.ctx = @s bs.pos.x
+scoreboard players operation #y bs.ctx = @s bs.pos.y
+scoreboard players operation #z bs.ctx = @s bs.pos.z
+scoreboard players operation #h bs.ctx = @s bs.rot.h
+scoreboard players operation #v bs.ctx = @s bs.rot.v
+
+execute store result score @s bs.pos.x run data get entity @s Pos[0] 1000
+execute store result score @s bs.pos.y run data get entity @s Pos[1] 1000
+execute store result score @s bs.pos.z run data get entity @s Pos[2] 1000
+execute store result score @s bs.rot.h run data get entity @s Rotation[0] 1000
+execute store result score @s bs.rot.v run data get entity @s Rotation[1] 1000
diff --git a/modules/bs.link/data/bs.link/function/create_link_ata.mcfunction b/modules/bs.link/data/bs.link/function/create_link_ata.mcfunction
new file mode 100644
index 0000000000..fe5f1c330c
--- /dev/null
+++ b/modules/bs.link/data/bs.link/function/create_link_ata.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+tag @s add bs.link.this
+execute as @n[tag=!bs.link.this] unless predicate bs.id:has_suid run function #bs.id:give_suid
+scoreboard players operation @s bs.link.to = @n[tag=!bs.link.this] bs.id
+tag @s remove bs.link.this
+function #bs.link:update_link
diff --git a/modules/bs.link/data/bs.link/function/keep_local_pos/apply.mcfunction b/modules/bs.link/data/bs.link/function/keep_local_pos/apply.mcfunction
new file mode 100644
index 0000000000..8296659b7c
--- /dev/null
+++ b/modules/bs.link/data/bs.link/function/keep_local_pos/apply.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$tp @s ^$(x) ^$(y) ^$(z)
diff --git a/modules/bs.link/data/bs.link/function/keep_local_pos/keep_local_pos.mcfunction b/modules/bs.link/data/bs.link/function/keep_local_pos/keep_local_pos.mcfunction
new file mode 100644
index 0000000000..00867be938
--- /dev/null
+++ b/modules/bs.link/data/bs.link/function/keep_local_pos/keep_local_pos.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result storage bs:ctx x double 0.001 run scoreboard players get @s bs.link.lx
+execute store result storage bs:ctx y double 0.001 run scoreboard players get @s bs.link.ly
+execute store result storage bs:ctx z double 0.001 run scoreboard players get @s bs.link.lz
+
+scoreboard players operation $id.suid bs.in = @s bs.link.to
+execute at @n[predicate=bs.id:suid_equal,sort=arbitrary] run function bs.link:keep_local_pos/apply with storage bs:ctx
diff --git a/modules/bs.link/data/bs.link/function/mirror_point_ata/apply.mcfunction b/modules/bs.link/data/bs.link/function/mirror_point_ata/apply.mcfunction
new file mode 100644
index 0000000000..ee4a0338ce
--- /dev/null
+++ b/modules/bs.link/data/bs.link/function/mirror_point_ata/apply.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$tp @s ^ ^ ^$(z) ~$(x) $(y)
diff --git a/datapacks/Bookshelf/data/bs.link/function/mirror_point_ata/as_origin.mcfunction b/modules/bs.link/data/bs.link/function/mirror_point_ata/as_origin.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.link/function/mirror_point_ata/as_origin.mcfunction
rename to modules/bs.link/data/bs.link/function/mirror_point_ata/as_origin.mcfunction
index 6ec1ba8698..7b15bc352f 100644
--- a/datapacks/Bookshelf/data/bs.link/function/mirror_point_ata/as_origin.mcfunction
+++ b/modules/bs.link/data/bs.link/function/mirror_point_ata/as_origin.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.link/data/bs.link/function/mirror_point_ata/mirror_point_ata.mcfunction b/modules/bs.link/data/bs.link/function/mirror_point_ata/mirror_point_ata.mcfunction
new file mode 100644
index 0000000000..6b23be0910
--- /dev/null
+++ b/modules/bs.link/data/bs.link/function/mirror_point_ata/mirror_point_ata.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation $id.suid bs.in = @s bs.link.to
+execute as @n[predicate=bs.id:suid_equal,sort=arbitrary] run function bs.link:mirror_point_ata/as_origin
+execute facing entity @n[predicate=bs.id:suid_equal,sort=arbitrary] feet run function bs.link:mirror_point_ata/apply with storage bs:ctx
diff --git a/modules/bs.link/data/bs.link/function/remove_link.mcfunction b/modules/bs.link/data/bs.link/function/remove_link.mcfunction
new file mode 100644
index 0000000000..18974aec2c
--- /dev/null
+++ b/modules/bs.link/data/bs.link/function/remove_link.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players reset @s bs.link.to
+scoreboard players reset @s bs.link.rx
+scoreboard players reset @s bs.link.ry
+scoreboard players reset @s bs.link.rz
+scoreboard players reset @s bs.link.lx
+scoreboard players reset @s bs.link.ly
+scoreboard players reset @s bs.link.lz
+scoreboard players reset @s bs.link.lh
+scoreboard players reset @s bs.link.lv
+
+scoreboard players operation $link.to bs.in = @s bs.id
+execute if predicate bs.id:has_suid as @e[predicate=bs.link:link_equal] run function #bs.link:remove_link
diff --git a/modules/bs.link/data/bs.link/function/update_link/at_parent.mcfunction b/modules/bs.link/data/bs.link/function/update_link/at_parent.mcfunction
new file mode 100644
index 0000000000..8c5e541522
--- /dev/null
+++ b/modules/bs.link/data/bs.link/function/update_link/at_parent.mcfunction
@@ -0,0 +1,30 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.position:get_relative_ata {scale:1000}
+scoreboard players operation @s bs.link.rx = @s bs.pos.x
+scoreboard players operation @s bs.link.ry = @s bs.pos.y
+scoreboard players operation @s bs.link.rz = @s bs.pos.z
+
+function #bs.position:canonical_to_local
+scoreboard players operation @s bs.link.lx = @s bs.pos.x
+scoreboard players operation @s bs.link.ly = @s bs.pos.y
+scoreboard players operation @s bs.link.lz = @s bs.pos.z
+
+execute store result score @s bs.link.lh run data get entity @s Rotation[0] 1000
+execute store result score @s bs.link.lv run data get entity @s Rotation[1] 1000
+function #bs.position:get_rot {scale:1000}
+scoreboard players operation @s bs.link.lh -= @s bs.rot.h
+scoreboard players operation @s bs.link.lv -= @s bs.rot.v
diff --git a/modules/bs.link/data/bs.link/function/update_link/update_link.mcfunction b/modules/bs.link/data/bs.link/function/update_link/update_link.mcfunction
new file mode 100644
index 0000000000..c3e40a0862
--- /dev/null
+++ b/modules/bs.link/data/bs.link/function/update_link/update_link.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation $id.suid bs.in = @s bs.link.to
+execute at @n[predicate=bs.id:suid_equal,sort=arbitrary] run function bs.link:update_link/at_parent
diff --git a/modules/bs.link/data/bs.link/predicate/has_link.json b/modules/bs.link/data/bs.link/predicate/has_link.json
new file mode 100644
index 0000000000..4f285f8d7d
--- /dev/null
+++ b/modules/bs.link/data/bs.link/predicate/has_link.json
@@ -0,0 +1,22 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#has-link",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/11/07",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2023/11/07",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "condition": "minecraft:entity_scores",
+ "entity": "this",
+ "scores": {
+ "bs.link.to": {}
+ }
+}
diff --git a/modules/bs.link/data/bs.link/predicate/link_equal.json b/modules/bs.link/data/bs.link/predicate/link_equal.json
new file mode 100644
index 0000000000..c4eaf5fa76
--- /dev/null
+++ b/modules/bs.link/data/bs.link/predicate/link_equal.json
@@ -0,0 +1,39 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#link-equal",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ }
+ },
+ "condition": "minecraft:entity_scores",
+ "entity": "this",
+ "scores": {
+ "bs.link.to": {
+ "min": {
+ "type": "minecraft:score",
+ "target": {
+ "type": "minecraft:fixed",
+ "name": "$link.to"
+ },
+ "score": "bs.in"
+ },
+ "max": {
+ "type": "minecraft:score",
+ "target": {
+ "type": "minecraft:fixed",
+ "name": "$link.to"
+ },
+ "score": "bs.in"
+ }
+ }
+ }
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/as_children.json b/modules/bs.link/data/bs.link/tags/function/as_children.json
new file mode 100644
index 0000000000..503acc3a92
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/as_children.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#relationships",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ }
+ },
+ "values": [
+ "bs.link:as_children"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/as_parent.json b/modules/bs.link/data/bs.link/tags/function/as_parent.json
new file mode 100644
index 0000000000..a3264613ea
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/as_parent.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#relationships",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ }
+ },
+ "values": [
+ "bs.link:as_parent"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/at_children.json b/modules/bs.link/data/bs.link/tags/function/at_children.json
new file mode 100644
index 0000000000..59e1ffd1c7
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/at_children.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#relationships",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ }
+ },
+ "values": [
+ "bs.link:at_children"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/at_parent.json b/modules/bs.link/data/bs.link/tags/function/at_parent.json
new file mode 100644
index 0000000000..4dec8f94b1
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/at_parent.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#relationships",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ }
+ },
+ "values": [
+ "bs.link:at_parent"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/behaviors/apply.json b/modules/bs.link/data/bs.link/tags/function/behaviors/apply.json
new file mode 100644
index 0000000000..4076a732ee
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/behaviors/apply.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#custom-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.link:behaviors/apply"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/behaviors/imitate_pos_x.json b/modules/bs.link/data/bs.link/tags/function/behaviors/imitate_pos_x.json
new file mode 100644
index 0000000000..67bc5ae02d
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/behaviors/imitate_pos_x.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#custom-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.link:behaviors/imitate_pos_x"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/behaviors/imitate_pos_y.json b/modules/bs.link/data/bs.link/tags/function/behaviors/imitate_pos_y.json
new file mode 100644
index 0000000000..6614e56710
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/behaviors/imitate_pos_y.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#custom-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.link:behaviors/imitate_pos_y"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/behaviors/imitate_pos_z.json b/modules/bs.link/data/bs.link/tags/function/behaviors/imitate_pos_z.json
new file mode 100644
index 0000000000..a5bf4713e2
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/behaviors/imitate_pos_z.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#custom-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.link:behaviors/imitate_pos_z"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/behaviors/imitate_rot_h.json b/modules/bs.link/data/bs.link/tags/function/behaviors/imitate_rot_h.json
new file mode 100644
index 0000000000..9c4c21ea0a
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/behaviors/imitate_rot_h.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#custom-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.link:behaviors/imitate_rot_h"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/behaviors/imitate_rot_v.json b/modules/bs.link/data/bs.link/tags/function/behaviors/imitate_rot_v.json
new file mode 100644
index 0000000000..debfda15b3
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/behaviors/imitate_rot_v.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#custom-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.link:behaviors/imitate_rot_v"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/behaviors/reverse_pos_x.json b/modules/bs.link/data/bs.link/tags/function/behaviors/reverse_pos_x.json
new file mode 100644
index 0000000000..4395ff1879
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/behaviors/reverse_pos_x.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#custom-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.link:behaviors/reverse_pos_x"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/behaviors/reverse_pos_y.json b/modules/bs.link/data/bs.link/tags/function/behaviors/reverse_pos_y.json
new file mode 100644
index 0000000000..57637e9094
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/behaviors/reverse_pos_y.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#custom-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.link:behaviors/reverse_pos_y"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/behaviors/reverse_pos_z.json b/modules/bs.link/data/bs.link/tags/function/behaviors/reverse_pos_z.json
new file mode 100644
index 0000000000..a70eeb804a
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/behaviors/reverse_pos_z.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#custom-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.link:behaviors/reverse_pos_z"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/behaviors/reverse_rot_h.json b/modules/bs.link/data/bs.link/tags/function/behaviors/reverse_rot_h.json
new file mode 100644
index 0000000000..6f7fe2792c
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/behaviors/reverse_rot_h.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#custom-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.link:behaviors/reverse_rot_h"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/behaviors/reverse_rot_v.json b/modules/bs.link/data/bs.link/tags/function/behaviors/reverse_rot_v.json
new file mode 100644
index 0000000000..89f6933299
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/behaviors/reverse_rot_v.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#custom-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.link:behaviors/reverse_rot_v"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/behaviors/setup.json b/modules/bs.link/data/bs.link/tags/function/behaviors/setup.json
new file mode 100644
index 0000000000..6ba446ee9e
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/behaviors/setup.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#custom-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.link:behaviors/setup"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/create_link_ata.json b/modules/bs.link/data/bs.link/tags/function/create_link_ata.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.link/tags/function/create_link_ata.json
rename to modules/bs.link/data/bs.link/tags/function/create_link_ata.json
index 0c266563a6..c84db02987 100644
--- a/datapacks/Bookshelf/data/bs.link/tags/function/create_link_ata.json
+++ b/modules/bs.link/data/bs.link/tags/function/create_link_ata.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#create-link",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#create-link",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/imitate_pos.json b/modules/bs.link/data/bs.link/tags/function/imitate_pos.json
similarity index 81%
rename from datapacks/Bookshelf/data/bs.link/tags/function/imitate_pos.json
rename to modules/bs.link/data/bs.link/tags/function/imitate_pos.json
index 824481d44a..efb5734336 100644
--- a/datapacks/Bookshelf/data/bs.link/tags/function/imitate_pos.json
+++ b/modules/bs.link/data/bs.link/tags/function/imitate_pos.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#imitate-behaviors",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/imitate_pos_and_rot.json b/modules/bs.link/data/bs.link/tags/function/imitate_pos_and_rot.json
similarity index 84%
rename from datapacks/Bookshelf/data/bs.link/tags/function/imitate_pos_and_rot.json
rename to modules/bs.link/data/bs.link/tags/function/imitate_pos_and_rot.json
index 688f416b69..e7bc123da8 100644
--- a/datapacks/Bookshelf/data/bs.link/tags/function/imitate_pos_and_rot.json
+++ b/modules/bs.link/data/bs.link/tags/function/imitate_pos_and_rot.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#imitate-behaviors",
"authors": [
"Aksiome",
"Leirof"
diff --git a/modules/bs.link/data/bs.link/tags/function/imitate_pos_x.json b/modules/bs.link/data/bs.link/tags/function/imitate_pos_x.json
new file mode 100644
index 0000000000..2d1e3ddd73
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/imitate_pos_x.json
@@ -0,0 +1,23 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#imitate-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "#bs.link:behaviors/setup",
+ "#bs.link:behaviors/imitate_pos_x",
+ "#bs.link:behaviors/apply"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/imitate_pos_y.json b/modules/bs.link/data/bs.link/tags/function/imitate_pos_y.json
new file mode 100644
index 0000000000..5bdbadf2d9
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/imitate_pos_y.json
@@ -0,0 +1,23 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#imitate-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "#bs.link:behaviors/setup",
+ "#bs.link:behaviors/imitate_pos_y",
+ "#bs.link:behaviors/apply"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/imitate_pos_z.json b/modules/bs.link/data/bs.link/tags/function/imitate_pos_z.json
new file mode 100644
index 0000000000..d32d9dd593
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/imitate_pos_z.json
@@ -0,0 +1,23 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#imitate-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "#bs.link:behaviors/setup",
+ "#bs.link:behaviors/imitate_pos_z",
+ "#bs.link:behaviors/apply"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/imitate_rot.json b/modules/bs.link/data/bs.link/tags/function/imitate_rot.json
similarity index 80%
rename from datapacks/Bookshelf/data/bs.link/tags/function/imitate_rot.json
rename to modules/bs.link/data/bs.link/tags/function/imitate_rot.json
index 2db007db2e..a74671e687 100644
--- a/datapacks/Bookshelf/data/bs.link/tags/function/imitate_rot.json
+++ b/modules/bs.link/data/bs.link/tags/function/imitate_rot.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#imitate-behaviors",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#imitate-behaviors",
"authors": [
"Aksiome",
"Leirof"
diff --git a/modules/bs.link/data/bs.link/tags/function/imitate_rot_h.json b/modules/bs.link/data/bs.link/tags/function/imitate_rot_h.json
new file mode 100644
index 0000000000..0c4729af65
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/imitate_rot_h.json
@@ -0,0 +1,23 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#imitate-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "#bs.link:behaviors/setup",
+ "#bs.link:behaviors/imitate_rot_h",
+ "#bs.link:behaviors/apply"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/imitate_rot_v.json b/modules/bs.link/data/bs.link/tags/function/imitate_rot_v.json
new file mode 100644
index 0000000000..638dd15bff
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/imitate_rot_v.json
@@ -0,0 +1,23 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#imitate-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "#bs.link:behaviors/setup",
+ "#bs.link:behaviors/imitate_rot_v",
+ "#bs.link:behaviors/apply"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/keep_local_pos.json b/modules/bs.link/data/bs.link/tags/function/keep_local_pos.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.link/tags/function/keep_local_pos.json
rename to modules/bs.link/data/bs.link/tags/function/keep_local_pos.json
index 6a566f47bd..9a9463da8d 100644
--- a/datapacks/Bookshelf/data/bs.link/tags/function/keep_local_pos.json
+++ b/modules/bs.link/data/bs.link/tags/function/keep_local_pos.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#keep-local-position",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#keep-local-position",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/mirror_point_ata.json b/modules/bs.link/data/bs.link/tags/function/mirror_point_ata.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.link/tags/function/mirror_point_ata.json
rename to modules/bs.link/data/bs.link/tags/function/mirror_point_ata.json
index 6e0fbc7899..bd051b0601 100644
--- a/datapacks/Bookshelf/data/bs.link/tags/function/mirror_point_ata.json
+++ b/modules/bs.link/data/bs.link/tags/function/mirror_point_ata.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#mirror-point",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#mirror-point",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/mirror_x_plane.json b/modules/bs.link/data/bs.link/tags/function/mirror_x_plane.json
similarity index 84%
rename from datapacks/Bookshelf/data/bs.link/tags/function/mirror_x_plane.json
rename to modules/bs.link/data/bs.link/tags/function/mirror_x_plane.json
index cdd06a41d4..95b86f5fa5 100644
--- a/datapacks/Bookshelf/data/bs.link/tags/function/mirror_x_plane.json
+++ b/modules/bs.link/data/bs.link/tags/function/mirror_x_plane.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#mirror-plane",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#mirror-plane",
"authors": [
"Aksiome"
],
diff --git a/modules/bs.link/data/bs.link/tags/function/mirror_z_plane.json b/modules/bs.link/data/bs.link/tags/function/mirror_z_plane.json
new file mode 100644
index 0000000000..329c02ae70
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/mirror_z_plane.json
@@ -0,0 +1,26 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#mirror-plane",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/09/10",
+ "minecraft_version": "1.20.1"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.1"
+ }
+ },
+ "values": [
+ "#bs.link:behaviors/setup",
+ "#bs.link:behaviors/imitate_pos_x",
+ "#bs.link:behaviors/imitate_pos_y",
+ "#bs.link:behaviors/reverse_pos_z",
+ "#bs.link:behaviors/reverse_rot_h",
+ "#bs.link:behaviors/imitate_rot_v",
+ "#bs.link:behaviors/apply"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/remove_link.json b/modules/bs.link/data/bs.link/tags/function/remove_link.json
new file mode 100644
index 0000000000..cd2242bf44
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/remove_link.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#remove-link",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/09/07",
+ "minecraft_version": "1.21"
+ }
+ },
+ "values": [
+ "bs.link:remove_link"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/reverse_pos.json b/modules/bs.link/data/bs.link/tags/function/reverse_pos.json
similarity index 81%
rename from datapacks/Bookshelf/data/bs.link/tags/function/reverse_pos.json
rename to modules/bs.link/data/bs.link/tags/function/reverse_pos.json
index f1f0f7289c..0cb8ea8a24 100644
--- a/datapacks/Bookshelf/data/bs.link/tags/function/reverse_pos.json
+++ b/modules/bs.link/data/bs.link/tags/function/reverse_pos.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#reverse-behaviors",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/reverse_pos_and_rot.json b/modules/bs.link/data/bs.link/tags/function/reverse_pos_and_rot.json
similarity index 84%
rename from datapacks/Bookshelf/data/bs.link/tags/function/reverse_pos_and_rot.json
rename to modules/bs.link/data/bs.link/tags/function/reverse_pos_and_rot.json
index 5d68d7b001..cb98807f53 100644
--- a/datapacks/Bookshelf/data/bs.link/tags/function/reverse_pos_and_rot.json
+++ b/modules/bs.link/data/bs.link/tags/function/reverse_pos_and_rot.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#reverse-behaviors",
"authors": [
"Aksiome",
"Leirof"
diff --git a/modules/bs.link/data/bs.link/tags/function/reverse_pos_x.json b/modules/bs.link/data/bs.link/tags/function/reverse_pos_x.json
new file mode 100644
index 0000000000..a32eb181d4
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/reverse_pos_x.json
@@ -0,0 +1,23 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#reverse-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "#bs.link:behaviors/setup",
+ "#bs.link:behaviors/reverse_pos_x",
+ "#bs.link:behaviors/apply"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/reverse_pos_y.json b/modules/bs.link/data/bs.link/tags/function/reverse_pos_y.json
new file mode 100644
index 0000000000..3c7b9bcf90
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/reverse_pos_y.json
@@ -0,0 +1,23 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#reverse-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "#bs.link:behaviors/setup",
+ "#bs.link:behaviors/reverse_pos_y",
+ "#bs.link:behaviors/apply"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/reverse_pos_z.json b/modules/bs.link/data/bs.link/tags/function/reverse_pos_z.json
new file mode 100644
index 0000000000..d02e15608f
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/reverse_pos_z.json
@@ -0,0 +1,23 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#reverse-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "#bs.link:behaviors/setup",
+ "#bs.link:behaviors/reverse_pos_z",
+ "#bs.link:behaviors/apply"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/reverse_rot.json b/modules/bs.link/data/bs.link/tags/function/reverse_rot.json
similarity index 80%
rename from datapacks/Bookshelf/data/bs.link/tags/function/reverse_rot.json
rename to modules/bs.link/data/bs.link/tags/function/reverse_rot.json
index b0f0f870fd..9d5589ac82 100644
--- a/datapacks/Bookshelf/data/bs.link/tags/function/reverse_rot.json
+++ b/modules/bs.link/data/bs.link/tags/function/reverse_rot.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#reverse-behaviors",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#reverse-behaviors",
"authors": [
"Aksiome",
"Leirof"
diff --git a/modules/bs.link/data/bs.link/tags/function/reverse_rot_h.json b/modules/bs.link/data/bs.link/tags/function/reverse_rot_h.json
new file mode 100644
index 0000000000..44bb0c25c4
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/reverse_rot_h.json
@@ -0,0 +1,23 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#reverse-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "#bs.link:behaviors/setup",
+ "#bs.link:behaviors/reverse_rot_h",
+ "#bs.link:behaviors/apply"
+ ]
+}
diff --git a/modules/bs.link/data/bs.link/tags/function/reverse_rot_v.json b/modules/bs.link/data/bs.link/tags/function/reverse_rot_v.json
new file mode 100644
index 0000000000..72eaaeaa31
--- /dev/null
+++ b/modules/bs.link/data/bs.link/tags/function/reverse_rot_v.json
@@ -0,0 +1,23 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#reverse-behaviors",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/06/29",
+ "minecraft_version": "1.13"
+ },
+ "updated": {
+ "date": "2023/09/11",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "#bs.link:behaviors/setup",
+ "#bs.link:behaviors/reverse_rot_v",
+ "#bs.link:behaviors/apply"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.link/tags/function/update_link.json b/modules/bs.link/data/bs.link/tags/function/update_link.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.link/tags/function/update_link.json
rename to modules/bs.link/data/bs.link/tags/function/update_link.json
index e51d596b9d..6889a056fe 100644
--- a/datapacks/Bookshelf/data/bs.link/tags/function/update_link.json
+++ b/modules/bs.link/data/bs.link/tags/function/update_link.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/link.html#update-link",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html#update-link",
"authors": [
"Aksiome",
"Leirof"
diff --git a/modules/bs.link/data/bs.link/test/as_children.mcfunction b/modules/bs.link/data/bs.link/test/as_children.mcfunction
new file mode 100644
index 0000000000..8b456c9da6
--- /dev/null
+++ b/modules/bs.link/data/bs.link/test/as_children.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:armor_stand ~ ~ ~ {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
+summon minecraft:armor_stand ~ ~1 ~ {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
+
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:as_children {run:"tag @s add bs.packtest.check"}
+assert entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,tag=bs.packtest.check]
diff --git a/modules/bs.link/data/bs.link/test/as_parent.mcfunction b/modules/bs.link/data/bs.link/test/as_parent.mcfunction
new file mode 100644
index 0000000000..99e724c84e
--- /dev/null
+++ b/modules/bs.link/data/bs.link/test/as_parent.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:armor_stand ~ ~ ~ {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
+summon minecraft:armor_stand ~ ~1 ~ {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
+
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] run function #bs.link:as_parent {run:"tag @s add bs.packtest.check"}
+assert entity @e[type=minecraft:armor_stand,tag=bs.packtest.1,tag=bs.packtest.check]
diff --git a/modules/bs.link/data/bs.link/test/at_children.mcfunction b/modules/bs.link/data/bs.link/test/at_children.mcfunction
new file mode 100644
index 0000000000..883c611089
--- /dev/null
+++ b/modules/bs.link/data/bs.link/test/at_children.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:armor_stand ~ ~ ~ {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
+summon minecraft:armor_stand ~ ~1 ~ {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
+
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:at_children {run:"tag @n add bs.packtest.check"}
+assert entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,tag=bs.packtest.check]
diff --git a/modules/bs.link/data/bs.link/test/at_parent.mcfunction b/modules/bs.link/data/bs.link/test/at_parent.mcfunction
new file mode 100644
index 0000000000..137f0f995e
--- /dev/null
+++ b/modules/bs.link/data/bs.link/test/at_parent.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:armor_stand ~ ~ ~ {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
+summon minecraft:armor_stand ~ ~1 ~ {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
+
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] run function #bs.link:at_parent {run:"tag @n add bs.packtest.check"}
+assert entity @e[type=minecraft:armor_stand,tag=bs.packtest.1,tag=bs.packtest.check]
diff --git a/modules/bs.link/data/bs.link/test/create_link_ata.mcfunction b/modules/bs.link/data/bs.link/test/create_link_ata.mcfunction
new file mode 100644
index 0000000000..129bc8cae0
--- /dev/null
+++ b/modules/bs.link/data/bs.link/test/create_link_ata.mcfunction
@@ -0,0 +1,30 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:armor_stand 0.0 0.0 0.0 {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
+summon minecraft:armor_stand 0.5 0.2 1.0 {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
+
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
+
+assert entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,predicate=bs.link:has_link]
+assert score @e[type=minecraft:armor_stand,tag=bs.packtest.1,limit=1] bs.id = @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.to
+assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.rx matches 499..501
+assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.ry matches 199..201
+assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.rz matches 999..1001
+assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.lx matches 499..501
+assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.ly matches 199..201
+assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.lz matches 999..1001
+
+kill @e[type=minecraft:armor_stand,tag=bs.packtest]
diff --git a/datapacks/Bookshelf/data/bs.link/test/imitate_pos_and_rot.mcfunction b/modules/bs.link/data/bs.link/test/imitate_pos_and_rot.mcfunction
similarity index 77%
rename from datapacks/Bookshelf/data/bs.link/test/imitate_pos_and_rot.mcfunction
rename to modules/bs.link/data/bs.link/test/imitate_pos_and_rot.mcfunction
index 32c59e20f2..be84442865 100644
--- a/datapacks/Bookshelf/data/bs.link/test/imitate_pos_and_rot.mcfunction
+++ b/modules/bs.link/data/bs.link/test/imitate_pos_and_rot.mcfunction
@@ -1,5 +1,17 @@
-# Imitate position and rotation
-# @batch bs.link
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
summon minecraft:armor_stand 0.0 0.0 0.0 {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
summon minecraft:armor_stand 0.0 0.0 0.0 {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
diff --git a/modules/bs.link/data/bs.link/test/keep_local_pos.mcfunction b/modules/bs.link/data/bs.link/test/keep_local_pos.mcfunction
new file mode 100644
index 0000000000..2532db8879
--- /dev/null
+++ b/modules/bs.link/data/bs.link/test/keep_local_pos.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:armor_stand 0.0 0.0 0.0 {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
+summon minecraft:armor_stand 0.0 0.0 1.0 {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
+
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
+tp @e[type=minecraft:armor_stand,tag=bs.packtest.1] 0.0 0.0 0.0 52 -12
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] run function #bs.link:keep_local_pos
+
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.1] at @s positioned ^ ^ ^1 run assert entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,distance=..0.002]
+
+kill @e[type=minecraft:armor_stand,tag=bs.packtest]
diff --git a/modules/bs.link/data/bs.link/test/mirror_point_ata.mcfunction b/modules/bs.link/data/bs.link/test/mirror_point_ata.mcfunction
new file mode 100644
index 0000000000..57b258fd5b
--- /dev/null
+++ b/modules/bs.link/data/bs.link/test/mirror_point_ata.mcfunction
@@ -0,0 +1,34 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:armor_stand 0.0 0.0 0.0 {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b,Rotation:[75f,12f]}
+summon minecraft:armor_stand 0.0 0.0 0.0 {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b,Rotation:[0f,0f]}
+
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] positioned .5 .5 .5 run function #bs.link:mirror_point_ata
+
+execute store result score #x bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Pos[0] 1000
+execute store result score #y bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Pos[1] 1000
+execute store result score #z bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Pos[2] 1000
+execute store result score #h bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Rotation[0] 1000
+execute store result score #v bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Rotation[1] 1000
+
+kill @e[type=minecraft:armor_stand,tag=bs.packtest]
+
+assert score #x bs.ctx matches 999..1001
+assert score #y bs.ctx matches 999..1001
+assert score #z bs.ctx matches 999..1001
+assert score #h bs.ctx matches -105001..-104999
+assert score #v bs.ctx matches -12001..-11999
diff --git a/modules/bs.link/data/bs.link/test/remove_link.mcfunction b/modules/bs.link/data/bs.link/test/remove_link.mcfunction
new file mode 100644
index 0000000000..e0c1ddb826
--- /dev/null
+++ b/modules/bs.link/data/bs.link/test/remove_link.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:armor_stand ~ ~ ~ {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
+summon minecraft:armor_stand ~ ~1 ~ {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
+
+# from parent
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:remove_link
+assert not entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,predicate=bs.link:has_link]
+
+# from child
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] run function #bs.link:remove_link
+assert not entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,predicate=bs.link:has_link]
diff --git a/modules/bs.link/data/bs.link/test/reverse_pos_and_rot.mcfunction b/modules/bs.link/data/bs.link/test/reverse_pos_and_rot.mcfunction
new file mode 100644
index 0000000000..755d18b17b
--- /dev/null
+++ b/modules/bs.link/data/bs.link/test/reverse_pos_and_rot.mcfunction
@@ -0,0 +1,36 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:armor_stand 0.0 0.0 1.0 {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
+summon minecraft:armor_stand 0.0 0.0 0.0 {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
+
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] at @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.link:create_link_ata
+
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.1] at @s run tp @s ~1 ~1 ~1 ~42 ~42
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] run function #bs.link:reverse_pos_and_rot
+
+execute store result score #x bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Pos[0] 1000
+execute store result score #y bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Pos[1] 1000
+execute store result score #z bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Pos[2] 1000
+execute store result score #h bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Rotation[0] 1000
+execute store result score #v bs.ctx run data get entity @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] Rotation[1] 1000
+
+kill @e[type=minecraft:armor_stand,tag=bs.packtest]
+
+assert score #x bs.ctx matches -1001..-999
+assert score #y bs.ctx matches -1001..-999
+assert score #z bs.ctx matches -1001..-999
+assert score #h bs.ctx matches -42001..-41999
+assert score #v bs.ctx matches -42001..-41999
diff --git a/modules/bs.link/data/bs.link/test/update_link.mcfunction b/modules/bs.link/data/bs.link/test/update_link.mcfunction
new file mode 100644
index 0000000000..7e53e10754
--- /dev/null
+++ b/modules/bs.link/data/bs.link/test/update_link.mcfunction
@@ -0,0 +1,30 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:armor_stand 0.0 0.0 0.0 {Tags:["bs.packtest","bs.packtest.1"],NoGravity:1b}
+summon minecraft:armor_stand 0.5 0.2 1.0 {Tags:["bs.packtest","bs.packtest.2"],NoGravity:1b}
+
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.1] run function #bs.id:give_suid
+scoreboard players operation @e[type=minecraft:armor_stand,tag=bs.packtest.2] bs.link.to = @e[type=minecraft:armor_stand,tag=bs.packtest.1] bs.id
+execute as @e[type=minecraft:armor_stand,tag=bs.packtest.2] run function #bs.link:update_link
+
+assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.rx matches 499..501
+assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.ry matches 199..201
+assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.rz matches 999..1001
+assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.lx matches 499..501
+assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.ly matches 199..201
+assert score @e[type=minecraft:armor_stand,tag=bs.packtest.2,limit=1] bs.link.lz matches 999..1001
+
+kill @e[type=minecraft:armor_stand,tag=bs.packtest]
diff --git a/modules/bs.link/module.json b/modules/bs.link/module.json
new file mode 100644
index 0000000000..2ad92efeb0
--- /dev/null
+++ b/modules/bs.link/module.json
@@ -0,0 +1,18 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.link",
+ "load": "."
+ },
+ "meta": {
+ "name": "Link",
+ "slug": "bookshelf-link",
+ "description": "Construct coherent entity structures by linking entities’ positions and rotations.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/link.html",
+ "tags": ["default"],
+ "dependencies": [
+ "bs.id",
+ "bs.position"
+ ]
+ }
+}
diff --git a/modules/bs.log/README.md b/modules/bs.log/README.md
new file mode 100644
index 0000000000..682da6492a
--- /dev/null
+++ b/modules/bs.log/README.md
@@ -0,0 +1,10 @@
+# 📄 Bookshelf Log
+
+This datapack provides tools to log messages to the chat with different severity levels.
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/log.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.log/data/bs.log/function/__load__.mcfunction b/modules/bs.log/data/bs.log/function/__load__.mcfunction
new file mode 100644
index 0000000000..c974b7e1c1
--- /dev/null
+++ b/modules/bs.log/data/bs.log/function/__load__.mcfunction
@@ -0,0 +1,43 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+forceload add -30000000 1600
+execute unless entity B5-0-0-0-2 run summon minecraft:text_display -30000000 0 1600 {UUID:[I;181,0,0,2],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],alignment:"center",view_range:0f,alignment:"center"}
+setblock -30000000 0 1605 minecraft:repeating_command_block[facing=up]{auto:1b,Command:"help me",TrackOutput:1b}
+
+schedule function bs.log:__tick__ 1t
+
+scoreboard objectives add bs.in dummy [{"text":"BS ","color":"dark_gray"},{"text":"Input","color":"aqua"}]
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
+
+execute unless score #log.gametime bs.data matches -2147483648..2147483647 store result score #log.gametime bs.data run time query gametime
+
+data modify storage bs:const log.time_hms set value '[{"nbt": "log.hours", "storage": "bs:in"}, {"text": ":"}, {"nbt": "log.minutes", "storage": "bs:in"}, {"text": ":"}, {"nbt": "log.seconds", "storage": "bs:in"}]'
+data modify storage bs:const log.time_hmst set value '[{"nbt": "log.time_hms", "storage": "bs:const", "interpret": true}, {"text": "."}, {"nbt": "log.ticks", "storage": "bs:in"}, "t"]'
+
+data modify storage bs:const log.messages[{default: true}].format set value { \
+ debug: '["",{"text":"🧪 ","color":"#BA76D6","extra":["[",{"storage":"bs:in","nbt":"log.namespace"},"] ",{"storage":"bs:in","nbt":"log.tag","color":"gray"}],"hoverEvent":{"action":"show_text","contents":["",{"text":"🧪 [DEBUG]\\n","color":"#BA76D6"},{"text":"Timestamp: ","color":"gray"},{"storage":"bs:const","nbt":"log.time_hmst","interpret":true},"\\n",{"text":"Function: ","color":"gray"},{"nbt":"log.path","storage":"bs:in"}]}},{"text":" > ","color":"gray"},{"storage":"bs:in","nbt":"log.message","interpret":true}]', \
+ info: '["",{"text":"ℹ ","color":"#43A8EC","extra":["[",{"storage":"bs:in","nbt":"log.namespace"},"] ",{"storage":"bs:in","nbt":"log.tag","color":"gray"}],"hoverEvent":{"action":"show_text","contents":["",{"text":"ℹ [INFO]\\n","color":"#43A8EC"},{"text":"Timestamp: ","color":"gray"},{"storage":"bs:const","nbt":"log.time_hmst","interpret":true},"\\n",{"text":"Function: ","color":"gray"},{"nbt":"log.path","storage":"bs:in"}]}},{"text":" > ","color":"gray"},{"storage":"bs:in","nbt":"log.message","interpret":true}]', \
+ warn: '["",{"text":"⚠ ","color":"#F3B512","extra":["[",{"storage":"bs:in","nbt":"log.namespace"},"] ",{"storage":"bs:in","nbt":"log.tag","color":"gray"}],"hoverEvent":{"action":"show_text","contents":["",{"text":"⚠ [WARN]\\n","color":"#F3B512"},{"text":"Timestamp: ","color":"gray"},{"storage":"bs:const","nbt":"log.time_hmst","interpret":true},"\\n",{"text":"Function: ","color":"gray"},{"nbt":"log.path","storage":"bs:in"}]}},{"text":" > ","color":"gray"},{"storage":"bs:in","nbt":"log.message","interpret":true}]', \
+ error: '["",{"text":"❌ ","color":"#E84635","extra":["[",{"storage":"bs:in","nbt":"log.namespace"},"] ",{"storage":"bs:in","nbt":"log.tag","color":"gray"}],"hoverEvent":{"action":"show_text","contents":["",{"text":"❌ [ERROR]\\n","color":"#E84635"},{"text":"Timestamp: ","color":"gray"},{"storage":"bs:const","nbt":"log.time_hmst","interpret":true},"\\n",{"text":"Function: ","color":"gray"},{"nbt":"log.path","storage":"bs:in"}]}},{"text":" > ","color":"gray"},{"storage":"bs:in","nbt":"log.message","interpret":true}]', \
+}
+
+data modify storage bs:const log.messages[{namespaces: ["bs"]}].format set value { \
+ debug: '["",{"text":"🧪 ","color":"#BA76D6","extra":["[",{"storage":"bs:in","nbt":"log.namespace"},"] ",{"storage":"bs:in","nbt":"log.tag","color":"gray"}],"hoverEvent":{"action":"show_text","contents":["",{"text":"🧪 [DEBUG] \\n","color":"#BA76D6"},{"text":"Timestamp: ","color":"gray"},{"storage":"bs:const","nbt":"log.time_hmst","interpret":true},"\\n",{"text":"Function: ","color":"gray"},{"nbt":"log.path","storage":"bs:in"}]}},{"text":" > ","color":"gray"},{"storage":"bs:in","nbt":"log.message","interpret":true}]', \
+ info: '["",{"text":"ℹ ","color":"#43A8EC","extra":["[",{"storage":"bs:in","nbt":"log.namespace"},"] ",{"storage":"bs:in","nbt":"log.tag","color":"gray"}],"hoverEvent":{"action":"show_text","contents":["",{"text":"ℹ [INFO] \\n","color":"#43A8EC"},{"text":"Timestamp: ","color":"gray"},{"storage":"bs:const","nbt":"log.time_hmst","interpret":true},"\\n",{"text":"Function: ","color":"gray"},{"nbt":"log.path","storage":"bs:in"}]}},{"text":" > ","color":"gray"},{"storage":"bs:in","nbt":"log.message","interpret":true}]', \
+ warn: '["",{"text":"⚠ ","color":"#F3B512","extra":["[",{"storage":"bs:in","nbt":"log.namespace"},"] ",{"storage":"bs:in","nbt":"log.tag","color":"gray"}],"hoverEvent":{"action":"show_text","contents":["",{"text":"⚠ [WARN] \\n","color":"#F3B512"},{"text":"Timestamp: ","color":"gray"},{"storage":"bs:const","nbt":"log.time_hmst","interpret":true},"\\n",{"text":"Function: ","color":"gray"},{"nbt":"log.path","storage":"bs:in"}]}},{"text":" > ","color":"gray"},{"storage":"bs:in","nbt":"log.message","interpret":true}]', \
+ error: '["",{"text":"❌ ","color":"#E84635","extra":["[",{"storage":"bs:in","nbt":"log.namespace"},"] ",{"storage":"bs:in","nbt":"log.tag","color":"gray"}],"hoverEvent":{"action":"show_text","contents":["",{"text":"❌ [ERROR] \\n","color":"#E84635"},{"text":"Timestamp: ","color":"gray"},{"storage":"bs:const","nbt":"log.time_hmst","interpret":true},"\\n",{"text":"Function: ","color":"gray"},{"nbt":"log.path","storage":"bs:in"}]}},{"text":" > ","color":"gray"},{"storage":"bs:in","nbt":"log.message","interpret":true}]', \
+}
diff --git a/datapacks/Bookshelf Dev/data/bs.log/function/__tick__.mcfunction b/modules/bs.log/data/bs.log/function/__tick__.mcfunction
similarity index 88%
rename from datapacks/Bookshelf Dev/data/bs.log/function/__tick__.mcfunction
rename to modules/bs.log/data/bs.log/function/__tick__.mcfunction
index 43db4d38cb..64af6024f3 100644
--- a/datapacks/Bookshelf Dev/data/bs.log/function/__tick__.mcfunction
+++ b/modules/bs.log/data/bs.log/function/__tick__.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,9 +11,8 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/log.html
# ------------------------------------------------------------------------------------------------------------
+schedule function bs.log:__tick__ 1t
execute store success score #s bs.ctx run data modify storage bs:data log.time set string block -30000000 0 1605 LastOutput 10 18
execute if score #s bs.ctx matches 1 store result score #log.gametime bs.data run time query gametime
diff --git a/modules/bs.log/data/bs.log/function/__unload__.mcfunction b/modules/bs.log/data/bs.log/function/__unload__.mcfunction
new file mode 100644
index 0000000000..6f7c814dce
--- /dev/null
+++ b/modules/bs.log/data/bs.log/function/__unload__.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+kill B5-0-0-0-2
+setblock -30000000 0 1605 minecraft:air
+forceload remove -30000000 1600
+
+scoreboard objectives remove bs.in
+scoreboard objectives remove bs.ctx
+scoreboard objectives remove bs.data
+
+data remove storage bs:in log
+data remove storage bs:data log
+data remove storage bs:const log
diff --git a/modules/bs.log/data/bs.log/function/history/clear.mcfunction b/modules/bs.log/data/bs.log/function/history/clear.mcfunction
new file mode 100644
index 0000000000..0bf0ed1cdc
--- /dev/null
+++ b/modules/bs.log/data/bs.log/function/history/clear.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data remove storage bs:data log.history[$(with)]
diff --git a/datapacks/Bookshelf Dev/data/bs.log/function/history/record.mcfunction b/modules/bs.log/data/bs.log/function/history/record.mcfunction
similarity index 91%
rename from datapacks/Bookshelf Dev/data/bs.log/function/history/record.mcfunction
rename to modules/bs.log/data/bs.log/function/history/record.mcfunction
index 6aeee57d8f..f3342bbc73 100644
--- a/datapacks/Bookshelf Dev/data/bs.log/function/history/record.mcfunction
+++ b/modules/bs.log/data/bs.log/function/history/record.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/log.html
# ------------------------------------------------------------------------------------------------------------
data modify storage bs:data log.history append value {}
diff --git a/modules/bs.log/data/bs.log/function/history/show.mcfunction b/modules/bs.log/data/bs.log/function/history/show.mcfunction
new file mode 100644
index 0000000000..4308dcf340
--- /dev/null
+++ b/modules/bs.log/data/bs.log/function/history/show.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data log.messages set value []
+$data modify storage bs:data log.messages append from storage bs:data log.history[$(with)].message
+execute if data storage bs:data log.messages[0] run tellraw @s {"storage": "bs:data", "nbt": "log.messages[]", "separator": "\n", "interpret": true}
+execute unless data storage bs:data log.messages[0] run tellraw @s {"text": "No log entries to show…","color":"gray"}
diff --git a/datapacks/Bookshelf Dev/data/bs.log/function/severity/debug.mcfunction b/modules/bs.log/data/bs.log/function/severity/debug.mcfunction
similarity index 92%
rename from datapacks/Bookshelf Dev/data/bs.log/function/severity/debug.mcfunction
rename to modules/bs.log/data/bs.log/function/severity/debug.mcfunction
index bc6b924f8b..a1c8c9cc2c 100644
--- a/datapacks/Bookshelf Dev/data/bs.log/function/severity/debug.mcfunction
+++ b/modules/bs.log/data/bs.log/function/severity/debug.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#debug
# ------------------------------------------------------------------------------------------------------------
$data modify storage bs:in log merge value {severity: "debug", namespace: "$(namespace)", tag: "$(tag)", path: "$(path)", message: '$(message)'}
diff --git a/modules/bs.log/data/bs.log/function/severity/error.mcfunction b/modules/bs.log/data/bs.log/function/severity/error.mcfunction
new file mode 100644
index 0000000000..7994f985df
--- /dev/null
+++ b/modules/bs.log/data/bs.log/function/severity/error.mcfunction
@@ -0,0 +1,42 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:in log merge value {severity: "error", namespace: "$(namespace)", tag: "$(tag)", path: "$(path)", message: '$(message)'}
+
+data modify storage bs:data log.message set from storage bs:const log.messages[{default: true}].format.error
+$data modify storage bs:data log.message set from storage bs:const log.messages[{namespaces: ["$(namespace)"]}].format.error
+
+$execute as @a unless entity @s[ \
+ tag=!$(namespace).log.$(tag).debug, \
+ tag=!$(namespace).log.$(tag).info, \
+ tag=!$(namespace).log.$(tag).warn, \
+ tag=!$(namespace).log.$(tag).error, \
+ tag=!$(namespace).log._.debug, \
+ tag=!$(namespace).log._.info, \
+ tag=!$(namespace).log._.warn, \
+ tag=!$(namespace).log._.error, \
+ tag=!$(namespace).log._._, \
+ tag=!$(namespace).log.$(tag)._, \
+ tag=!_.log.$(tag).debug, \
+ tag=!_.log.$(tag).info, \
+ tag=!_.log.$(tag).warn, \
+ tag=!_.log.$(tag).error, \
+ tag=!_.log._.debug, \
+ tag=!_.log._.info, \
+ tag=!_.log._.warn, \
+ tag=!_.log._.error, \
+ tag=!_.log.$(tag)._, \
+ tag=!_.log._._ \
+] run tellraw @s {"storage": "bs:data", "nbt": "log.message", "interpret": true}
diff --git a/datapacks/Bookshelf Dev/data/bs.log/function/severity/info.mcfunction b/modules/bs.log/data/bs.log/function/severity/info.mcfunction
similarity index 92%
rename from datapacks/Bookshelf Dev/data/bs.log/function/severity/info.mcfunction
rename to modules/bs.log/data/bs.log/function/severity/info.mcfunction
index d10385c391..fb197418fe 100644
--- a/datapacks/Bookshelf Dev/data/bs.log/function/severity/info.mcfunction
+++ b/modules/bs.log/data/bs.log/function/severity/info.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#info
# ------------------------------------------------------------------------------------------------------------
$data modify storage bs:in log merge value {severity: "info", namespace: "$(namespace)", tag: "$(tag)", path: "$(path)", message: '$(message)'}
diff --git a/datapacks/Bookshelf Dev/data/bs.log/function/severity/warn.mcfunction b/modules/bs.log/data/bs.log/function/severity/warn.mcfunction
similarity index 93%
rename from datapacks/Bookshelf Dev/data/bs.log/function/severity/warn.mcfunction
rename to modules/bs.log/data/bs.log/function/severity/warn.mcfunction
index 844d37e89a..a779aacfed 100644
--- a/datapacks/Bookshelf Dev/data/bs.log/function/severity/warn.mcfunction
+++ b/modules/bs.log/data/bs.log/function/severity/warn.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#warn
# ------------------------------------------------------------------------------------------------------------
$data modify storage bs:in log merge value {severity: "warn", namespace: "$(namespace)", tag: "$(tag)", path: "$(path)", message: '$(message)'}
diff --git a/modules/bs.log/data/bs.log/function/time/get.mcfunction b/modules/bs.log/data/bs.log/function/time/get.mcfunction
new file mode 100644
index 0000000000..d73ae2acc9
--- /dev/null
+++ b/modules/bs.log/data/bs.log/function/time/get.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:in log.hours set string storage bs:data log.time 0 2
+data modify storage bs:in log.minutes set string storage bs:data log.time 3 5
+data modify storage bs:in log.seconds set string storage bs:data log.time 6 8
+
+execute store result storage bs:in log.gametime int 1 store result score #t bs.ctx run time query gametime
+execute store result storage bs:in log.ticks int .99999999999 run scoreboard players operation #t bs.ctx -= #log.gametime bs.data
+execute if score #t bs.ctx matches ..10 run function bs.log:time/ticks/format with storage bs:in log
+execute if score #t bs.ctx matches 11.. run function bs.log:time/ticks/stringify with storage bs:in log
diff --git a/modules/bs.log/data/bs.log/function/time/ticks/format.mcfunction b/modules/bs.log/data/bs.log/function/time/ticks/format.mcfunction
new file mode 100644
index 0000000000..4797a7f4bd
--- /dev/null
+++ b/modules/bs.log/data/bs.log/function/time/ticks/format.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:in log.ticks set value "0$(ticks)"
diff --git a/datapacks/Bookshelf Dev/data/bs.log/function/time/ticks/stringify.mcfunction b/modules/bs.log/data/bs.log/function/time/ticks/stringify.mcfunction
similarity index 96%
rename from datapacks/Bookshelf Dev/data/bs.log/function/time/ticks/stringify.mcfunction
rename to modules/bs.log/data/bs.log/function/time/ticks/stringify.mcfunction
index 10a79ced17..1e1fd690b0 100644
--- a/datapacks/Bookshelf Dev/data/bs.log/function/time/ticks/stringify.mcfunction
+++ b/modules/bs.log/data/bs.log/function/time/ticks/stringify.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf Dev/data/bs.log/tags/function/clear_history.json b/modules/bs.log/data/bs.log/tags/function/clear_history.json
similarity index 76%
rename from datapacks/Bookshelf Dev/data/bs.log/tags/function/clear_history.json
rename to modules/bs.log/data/bs.log/tags/function/clear_history.json
index 2d2e68127f..17328e2459 100644
--- a/datapacks/Bookshelf Dev/data/bs.log/tags/function/clear_history.json
+++ b/modules/bs.log/data/bs.log/tags/function/clear_history.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#history",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/log.html#history",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf Dev/data/bs.log/tags/function/debug.json b/modules/bs.log/data/bs.log/tags/function/debug.json
similarity index 81%
rename from datapacks/Bookshelf Dev/data/bs.log/tags/function/debug.json
rename to modules/bs.log/data/bs.log/tags/function/debug.json
index ef84cadb60..42f63fd705 100644
--- a/datapacks/Bookshelf Dev/data/bs.log/tags/function/debug.json
+++ b/modules/bs.log/data/bs.log/tags/function/debug.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#debug",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/log.html#debug",
"authors": [
"theogiraudet"
],
diff --git a/datapacks/Bookshelf Dev/data/bs.log/tags/function/error.json b/modules/bs.log/data/bs.log/tags/function/error.json
similarity index 81%
rename from datapacks/Bookshelf Dev/data/bs.log/tags/function/error.json
rename to modules/bs.log/data/bs.log/tags/function/error.json
index 14d287ae7e..165eda47fa 100644
--- a/datapacks/Bookshelf Dev/data/bs.log/tags/function/error.json
+++ b/modules/bs.log/data/bs.log/tags/function/error.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#error",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/log.html#error",
"authors": [
"theogiraudet"
],
diff --git a/datapacks/Bookshelf Dev/data/bs.log/tags/function/history.json b/modules/bs.log/data/bs.log/tags/function/history.json
similarity index 76%
rename from datapacks/Bookshelf Dev/data/bs.log/tags/function/history.json
rename to modules/bs.log/data/bs.log/tags/function/history.json
index 2377d12e5e..a37926878c 100644
--- a/datapacks/Bookshelf Dev/data/bs.log/tags/function/history.json
+++ b/modules/bs.log/data/bs.log/tags/function/history.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#history",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/log.html#history",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf Dev/data/bs.log/tags/function/info.json b/modules/bs.log/data/bs.log/tags/function/info.json
similarity index 81%
rename from datapacks/Bookshelf Dev/data/bs.log/tags/function/info.json
rename to modules/bs.log/data/bs.log/tags/function/info.json
index 01be57a44d..4804f4c4c4 100644
--- a/datapacks/Bookshelf Dev/data/bs.log/tags/function/info.json
+++ b/modules/bs.log/data/bs.log/tags/function/info.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#info",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/log.html#info",
"authors": [
"theogiraudet"
],
diff --git a/datapacks/Bookshelf Dev/data/bs.log/tags/function/warn.json b/modules/bs.log/data/bs.log/tags/function/warn.json
similarity index 81%
rename from datapacks/Bookshelf Dev/data/bs.log/tags/function/warn.json
rename to modules/bs.log/data/bs.log/tags/function/warn.json
index 656ae3ee0b..e943316543 100644
--- a/datapacks/Bookshelf Dev/data/bs.log/tags/function/warn.json
+++ b/modules/bs.log/data/bs.log/tags/function/warn.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/log.html#warn",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/log.html#warn",
"authors": [
"theogiraudet"
],
diff --git a/modules/bs.log/data/bs.log/test/debug/hidden.mcfunction b/modules/bs.log/data/bs.log/test/debug/hidden.mcfunction
new file mode 100644
index 0000000000..5b3f3177d6
--- /dev/null
+++ b/modules/bs.log/data/bs.log/test/debug/hidden.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+function #bs.log:debug { namespace: "bs.foo", path: "bs.foo:bar", feature: "bar", message: '"Hidden debug log message"' }
+assert not chat "Hidden debug log message"
diff --git a/modules/bs.log/data/bs.log/test/debug/visible.mcfunction b/modules/bs.log/data/bs.log/test/debug/visible.mcfunction
new file mode 100644
index 0000000000..9dbeded16b
--- /dev/null
+++ b/modules/bs.log/data/bs.log/test/debug/visible.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+tag @s add bs.foo.log.bar.debug
+function #bs.log:debug { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Debug tag debug log message"' }
+assert chat "Debug tag debug log message"
+tag @s remove bs.foo.log.bar.debug
diff --git a/modules/bs.log/data/bs.log/test/debug/wildcards.mcfunction b/modules/bs.log/data/bs.log/test/debug/wildcards.mcfunction
new file mode 100644
index 0000000000..6063c5319f
--- /dev/null
+++ b/modules/bs.log/data/bs.log/test/debug/wildcards.mcfunction
@@ -0,0 +1,35 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+tag @s add bs.foo.log.bar._
+function #bs.log:debug { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Level wildcard debug log message"' }
+assert chat "Level wildcard debug log message"
+tag @s remove bs.foo.log.bar._
+
+tag @s add bs.foo.log._.debug
+function #bs.log:debug { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Tag wildcard debug log message"' }
+assert chat "Tag wildcard debug log message"
+tag @s remove bs.foo.log._.debug
+
+tag @s add bs.foo.log._._
+function #bs.log:debug { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Tag and level wildcards debug log message"' }
+assert chat "Tag and level wildcards debug log message"
+tag @s remove bs.foo.log._._
+
+tag @s add _.log._._
+function #bs.log:debug { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"All wildcards debug log message"' }
+assert chat "All wildcards debug log message"
+tag @s remove _.log._._
diff --git a/modules/bs.log/data/bs.log/test/error/hidden.mcfunction b/modules/bs.log/data/bs.log/test/error/hidden.mcfunction
new file mode 100644
index 0000000000..be03c973a5
--- /dev/null
+++ b/modules/bs.log/data/bs.log/test/error/hidden.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Hidden error log message"' }
+assert not chat "Hidden error log message"
diff --git a/modules/bs.log/data/bs.log/test/error/visible.mcfunction b/modules/bs.log/data/bs.log/test/error/visible.mcfunction
new file mode 100644
index 0000000000..d7e87786a9
--- /dev/null
+++ b/modules/bs.log/data/bs.log/test/error/visible.mcfunction
@@ -0,0 +1,35 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+tag @s add bs.foo.log.bar.debug
+function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Debug tag error log message"' }
+assert chat "Debug tag error log message"
+tag @s remove bs.foo.log.bar.debug
+
+tag @s add bs.foo.log.bar.info
+function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Info tag error log message"' }
+assert chat "Info tag error log message"
+tag @s remove bs.foo.log.bar.info
+
+tag @s add bs.foo.log.bar.warn
+function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Warn tag error log message"' }
+assert chat "Warn tag error log message"
+tag @s remove bs.foo.log.bar.warn
+
+tag @s add bs.foo.log.bar.error
+function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Error tag error log message"' }
+assert chat "Error tag error log message"
+tag @s remove bs.foo.log.bar.error
diff --git a/modules/bs.log/data/bs.log/test/error/wildcards.mcfunction b/modules/bs.log/data/bs.log/test/error/wildcards.mcfunction
new file mode 100644
index 0000000000..2b76bf68de
--- /dev/null
+++ b/modules/bs.log/data/bs.log/test/error/wildcards.mcfunction
@@ -0,0 +1,35 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+tag @s add bs.foo.log.bar._
+function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Level wildcard error log message"' }
+assert chat "Level wildcard error log message"
+tag @s remove bs.foo.log.bar._
+
+tag @s add bs.foo.log._.error
+function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Tag wildcard error log message"' }
+assert chat "Tag wildcard error log message"
+tag @s remove bs.foo.log._.error
+
+tag @s add bs.foo.log._._
+function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Tag and level wildcards error log message"' }
+assert chat "Tag and level wildcards error log message"
+tag @s remove bs.foo.log._._
+
+tag @s add _.log._._
+function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"All wildcards error log message"' }
+assert chat "All wildcards error log message"
+tag @s remove _.log._._
diff --git a/modules/bs.log/data/bs.log/test/history/clear.mcfunction b/modules/bs.log/data/bs.log/test/history/clear.mcfunction
new file mode 100644
index 0000000000..901fefd327
--- /dev/null
+++ b/modules/bs.log/data/bs.log/test/history/clear.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "history", message: '"History warn log message"' }
+function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "history", message: '"History error log message"' }
+
+function #bs.log:clear_history {with:{severity:"error"}}
+
+assert data storage bs:data log.history[{severity:"warn"}]
+assert not data storage bs:data log.history[{severity:"error"}]
diff --git a/modules/bs.log/data/bs.log/test/history/show.mcfunction b/modules/bs.log/data/bs.log/test/history/show.mcfunction
new file mode 100644
index 0000000000..78c44eed0e
--- /dev/null
+++ b/modules/bs.log/data/bs.log/test/history/show.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+await entity B5-0-0-0-2
+
+function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "history", message: '"History warn log message"' }
+function #bs.log:error { namespace: "bs.foo", path: "bs.foo:bar", tag: "history", message: '"History error log message"' }
+assert not chat "History warn log message"
+assert not chat "History error log message"
+
+function #bs.log:history {with:{tag:"history",severity:"error"}}
+assert not chat "History warn log message"
+assert chat "History error log message"
diff --git a/modules/bs.log/data/bs.log/test/info/hidden.mcfunction b/modules/bs.log/data/bs.log/test/info/hidden.mcfunction
new file mode 100644
index 0000000000..4fe605b17c
--- /dev/null
+++ b/modules/bs.log/data/bs.log/test/info/hidden.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+function #bs.log:info { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Hidden info log message"' }
+assert not chat "Hidden info log message"
diff --git a/modules/bs.log/data/bs.log/test/info/visible.mcfunction b/modules/bs.log/data/bs.log/test/info/visible.mcfunction
new file mode 100644
index 0000000000..d1c8e4fc72
--- /dev/null
+++ b/modules/bs.log/data/bs.log/test/info/visible.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+tag @s add bs.foo.log.bar.debug
+function #bs.log:info { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Debug tag info log message"' }
+assert chat "Debug tag info log message"
+tag @s remove bs.foo.log.bar.debug
+
+tag @s add bs.foo.log.bar.info
+function #bs.log:info { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Info tag info log message"' }
+assert chat "Info tag info log message"
+tag @s remove bs.foo.log.bar.info
diff --git a/modules/bs.log/data/bs.log/test/info/wildcards.mcfunction b/modules/bs.log/data/bs.log/test/info/wildcards.mcfunction
new file mode 100644
index 0000000000..0edda27cf4
--- /dev/null
+++ b/modules/bs.log/data/bs.log/test/info/wildcards.mcfunction
@@ -0,0 +1,35 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+tag @s add bs.foo.log.bar._
+function #bs.log:info { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Level wildcard info log message"' }
+assert chat "Level wildcard info log message"
+tag @s remove bs.foo.log.bar._
+
+tag @s add bs.foo.log._.info
+function #bs.log:info { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Tag wildcard info log message"' }
+assert chat "Tag wildcard info log message"
+tag @s remove bs.foo.log._.info
+
+tag @s add bs.foo.log._._
+function #bs.log:info { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Tag and level wildcards info log message"' }
+assert chat "Tag and level wildcards info log message"
+tag @s remove bs.foo.log._._
+
+tag @s add _.log._._
+function #bs.log:info { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"All wildcards info log message"' }
+assert chat "All wildcards info log message"
+tag @s remove _.log._._
diff --git a/modules/bs.log/data/bs.log/test/warn/hidden.mcfunction b/modules/bs.log/data/bs.log/test/warn/hidden.mcfunction
new file mode 100644
index 0000000000..805300c2d2
--- /dev/null
+++ b/modules/bs.log/data/bs.log/test/warn/hidden.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Hidden warn log message"' }
+assert not chat "Hidden warn log message"
diff --git a/modules/bs.log/data/bs.log/test/warn/visible.mcfunction b/modules/bs.log/data/bs.log/test/warn/visible.mcfunction
new file mode 100644
index 0000000000..161657ac1d
--- /dev/null
+++ b/modules/bs.log/data/bs.log/test/warn/visible.mcfunction
@@ -0,0 +1,30 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+tag @s add bs.foo.log.bar.debug
+function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Debug tag warn log message"' }
+assert chat "Debug tag warn log message"
+tag @s remove bs.foo.log.bar.debug
+
+tag @s add bs.foo.log.bar.info
+function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Info tag warn log message"' }
+assert chat "Info tag warn log message"
+tag @s remove bs.foo.log.bar.info
+
+tag @s add bs.foo.log.bar.warn
+function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Warn tag warn log message"' }
+assert chat "Warn tag warn log message"
+tag @s remove bs.foo.log.bar.warn
diff --git a/modules/bs.log/data/bs.log/test/warn/wildcards.mcfunction b/modules/bs.log/data/bs.log/test/warn/wildcards.mcfunction
new file mode 100644
index 0000000000..05516fff8a
--- /dev/null
+++ b/modules/bs.log/data/bs.log/test/warn/wildcards.mcfunction
@@ -0,0 +1,35 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+tag @s add bs.foo.log.bar._
+function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Level wildcard warn log message"' }
+assert chat "Level wildcard warn log message"
+tag @s remove bs.foo.log.bar._
+
+tag @s add bs.foo.log._.warn
+function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Tag wildcard warn log message"' }
+assert chat "Tag wildcard warn log message"
+tag @s remove bs.foo.log._.warn
+
+tag @s add bs.foo.log._._
+function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"Tag and level wildcards warn log message"' }
+assert chat "Tag and level wildcards warn log message"
+tag @s remove bs.foo.log._._
+
+tag @s add _.log._._
+function #bs.log:warn { namespace: "bs.foo", path: "bs.foo:bar", tag: "bar", message: '"All wildcards warn log message"' }
+assert chat "All wildcards warn log message"
+tag @s remove _.log._._
diff --git a/modules/bs.log/module.json b/modules/bs.log/module.json
new file mode 100644
index 0000000000..d34f4c0d3c
--- /dev/null
+++ b/modules/bs.log/module.json
@@ -0,0 +1,14 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.log",
+ "load": "."
+ },
+ "meta": {
+ "name": "Log",
+ "slug": "bookshelf-log",
+ "description": "Log messages in the chat with varying levels of severity.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/log.html",
+ "tags": ["dev"]
+ }
+}
diff --git a/modules/bs.math/README.md b/modules/bs.math/README.md
new file mode 100644
index 0000000000..10ead6a6c5
--- /dev/null
+++ b/modules/bs.math/README.md
@@ -0,0 +1,14 @@
+# 🧮 Bookshelf Math
+
+This datapack brings the beautiful world of mathematics to Minecraft, offering a variety of mathematical functions and operations.
+
+> “Mathematics has very subtle inventions that can be of great service, both to satisfy the curious and to facilitate all arts and reduce the labor of men.”
+>
+> -- René Descartes
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/math.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.math/data/bs.math/function/__load__.mcfunction b/modules/bs.math/data/bs.math/function/__load__.mcfunction
new file mode 100644
index 0000000000..2189711084
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/__load__.mcfunction
@@ -0,0 +1,42 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+forceload add -30000000 1600
+execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
+
+scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
+scoreboard objectives add bs.in dummy [{"text":"BS ","color":"dark_gray"},{"text":"Input","color":"aqua"}]
+
+scoreboard players set -100000 bs.const -100000
+scoreboard players set -4 bs.const -4
+scoreboard players set -2 bs.const -2
+scoreboard players set -1 bs.const -1
+scoreboard players set 2 bs.const 2
+scoreboard players set 10 bs.const 10
+scoreboard players set 100 bs.const 100
+scoreboard players set 559 bs.const 559
+scoreboard players set 1000 bs.const 1000
+scoreboard players set 10000 bs.const 10000
+scoreboard players set 16384 bs.const 16384
+scoreboard players set 32768 bs.const 32768
+scoreboard players set 36000 bs.const 36000
+scoreboard players set 79249 bs.const 79249
+scoreboard players set 100000 bs.const 100000
+scoreboard players set 10000000 bs.const 10000000
+scoreboard players set 16777216 bs.const 16777216
+
+data modify storage bs:const math.ldexp set value [3.503246160812043E-46,7.006492321624085E-46,1.401298464324817E-45,2.802596928649634E-45,5.605193857299268E-45,1.1210387714598537E-44,2.2420775429197073E-44,4.484155085839415E-44,8.96831017167883E-44,1.793662034335766E-43,3.587324068671532E-43,7.174648137343064E-43,1.4349296274686127E-42,2.8698592549372254E-42,5.739718509874451E-42,1.1479437019748901E-41,2.2958874039497803E-41,4.591774807899561E-41,9.183549615799121E-41,1.8367099231598242E-40,3.6734198463196485E-40,7.346839692639297E-40,1.4693679385278594E-39,2.938735877055719E-39,5.877471754111438E-39,1.1754943508222875E-38,2.350988701644575E-38,4.70197740328915E-38,9.4039548065783E-38,1.88079096131566E-37,3.76158192263132E-37,7.52316384526264E-37,1.504632769052528E-36,3.009265538105056E-36,6.018531076210112E-36,1.2037062152420224E-35,2.407412430484045E-35,4.81482486096809E-35,9.62964972193618E-35,1.925929944387236E-34,3.851859888774472E-34,7.703719777548943E-34,1.5407439555097887E-33,3.0814879110195774E-33,6.162975822039155E-33,1.232595164407831E-32,2.465190328815662E-32,4.930380657631324E-32,9.860761315262648E-32,1.9721522630525295E-31,3.944304526105059E-31,7.888609052210118E-31,1.5777218104420236E-30,3.1554436208840472E-30,6.310887241768095E-30,1.262177448353619E-29,2.524354896707238E-29,5.048709793414476E-29,1.0097419586828951E-28,2.0194839173657902E-28,4.0389678347315804E-28,8.077935669463161E-28,1.6155871338926322E-27,3.2311742677852644E-27,6.462348535570529E-27,1.2924697071141057E-26,2.5849394142282115E-26,5.169878828456423E-26,1.0339757656912846E-25,2.0679515313825692E-25,4.1359030627651384E-25,8.271806125530277E-25,1.6543612251060553E-24,3.308722450212111E-24,6.617444900424222E-24,1.3234889800848443E-23,2.6469779601696886E-23,5.293955920339377E-23,1.0587911840678754E-22,2.117582368135751E-22,4.235164736271502E-22,8.470329472543003E-22,1.6940658945086007E-21,3.3881317890172014E-21,6.776263578034403E-21,1.3552527156068805E-20,2.710505431213761E-20,5.421010862427522E-20,1.0842021724855044E-19,2.168404344971009E-19,4.336808689942018E-19,8.673617379884035E-19,1.734723475976807E-18,3.469446951953614E-18,6.938893903907228E-18,1.3877787807814457E-17,2.7755575615628914E-17,5.551115123125783E-17,1.1102230246251565E-16,2.220446049250313E-16,4.440892098500626E-16,8.881784197001252E-16,1.7763568394002505E-15,3.552713678800501E-15,7.105427357601002E-15,1.4210854715202004E-14,2.842170943040401E-14,5.684341886080802E-14,1.1368683772161603E-13,2.2737367544323206E-13,4.547473508864641E-13,9.094947017729282E-13,1.8189894035458565E-12,3.637978807091713E-12,7.275957614183426E-12,1.4551915228366852E-11,2.9103830456733704E-11,5.820766091346741E-11,1.1641532182693481E-10,2.3283064365386963E-10,4.656612873077393E-10,9.313225746154785E-10,1.862645149230957E-09,3.725290298461914E-09,7.450580596923828E-09,1.4901161193847656E-08,2.9802322387695312E-08,5.960464477539063E-08,1.1920928955078125E-07,2.384185791015625E-07,4.76837158203125E-07,9.5367431640625E-07,1.9073486328125E-06,3.814697265625E-06,7.62939453125E-06,1.52587890625E-05,3.0517578125E-05,6.103515625E-05,0.0001220703125,0.000244140625,0.00048828125,0.0009765625,0.001953125,0.00390625,0.0078125,0.015625,0.03125,0.0625,0.125,0.25,0.5,1.0,2.0,4.0,8.0,16.0,32.0,64.0,128.0,256.0,512.0,1024.0,2048.0,4096.0,8192.0,16384.0,32768.0,65536.0,131072.0,262144.0,524288.0,1048576.0,2097152.0,4194304.0,8388608.0,16777216.0,33554432.0,67108864.0,134217728.0,268435456.0,536870912.0,1073741824.0,2147483648.0,4294967296.0,8589934592.0,17179869184.0,34359738368.0,68719476736.0,137438953472.0,274877906944.0,549755813888.0,1099511627776.0,2199023255552.0,4398046511104.0,8796093022208.0,17592186044416.0,35184372088832.0,70368744177664.0,140737488355328.0,281474976710656.0,562949953421312.0,1125899906842624.0,2251799813685248.0,4503599627370496.0,9007199254740992.0,1.8014398509481984E16,3.602879701896397E16,7.205759403792794E16,1.4411518807585587E17,2.8823037615171174E17,5.764607523034235E17,1.152921504606847E18,2.305843009213694E18,4.611686018427388E18,9.223372036854776E18,1.8446744073709552E19,3.6893488147419103E19,7.378697629483821E19,1.4757395258967641E20,2.9514790517935283E20,5.902958103587057E20,1.1805916207174113E21,2.3611832414348226E21,4.722366482869645E21,9.44473296573929E21,1.888946593147858E22,3.777893186295716E22,7.555786372591432E22,1.5111572745182865E23,3.022314549036573E23,6.044629098073146E23,1.2089258196146292E24,2.4178516392292583E24,4.835703278458517E24,9.671406556917033E24,1.9342813113834067E25,3.8685626227668134E25,7.737125245533627E25,1.5474250491067253E26,3.094850098213451E26,6.189700196426902E26,1.2379400392853803E27,2.4758800785707605E27,4.951760157141521E27,9.903520314283042E27,1.9807040628566084E28,3.961408125713217E28,7.922816251426434E28,1.5845632502852868E29,3.1691265005705735E29,6.338253001141147E29,1.2676506002282294E30,2.535301200456459E30,5.070602400912918E30]
diff --git a/modules/bs.math/data/bs.math/function/__unload__.mcfunction b/modules/bs.math/data/bs.math/function/__unload__.mcfunction
new file mode 100644
index 0000000000..35815cf798
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/__unload__.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+kill B5-0-0-0-1
+forceload remove -30000000 1600
+
+scoreboard objectives remove bs.const
+scoreboard objectives remove bs.ctx
+scoreboard objectives remove bs.out
+scoreboard objectives remove bs.in
+
+data remove storage bs:in math
+data remove storage bs:out math
+data remove storage bs:const math
diff --git a/modules/bs.math/data/bs.math/function/acos.mcfunction b/modules/bs.math/data/bs.math/function/acos.mcfunction
new file mode 100644
index 0000000000..4dfdbff3d6
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/acos.mcfunction
@@ -0,0 +1,44 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Note: This algorithm is taken from the Handbook of Mathematical Functions (M. Abramowitz and I.A. Stegun, Ed.)
+
+scoreboard players operation #x bs.ctx = $math.acos.x bs.in
+execute if score $math.acos.x bs.in matches ..-1 run scoreboard players operation #x bs.ctx *= -1 bs.const
+
+scoreboard players set $math.acos bs.out 107311
+scoreboard players operation $math.acos bs.out *= #x bs.ctx
+scoreboard players operation $math.acos bs.out /= 1000 bs.const
+scoreboard players remove $math.acos bs.out 425484
+scoreboard players operation $math.acos bs.out *= #x bs.ctx
+scoreboard players operation $math.acos bs.out /= 1000 bs.const
+scoreboard players add $math.acos bs.out 1215325
+scoreboard players operation $math.acos bs.out *= #x bs.ctx
+scoreboard players operation $math.acos bs.out /= 1000 bs.const
+scoreboard players remove $math.acos bs.out 9000000
+scoreboard players operation $math.acos bs.out /= 100 bs.const
+
+scoreboard players operation $math.isqrt.x bs.in >< #x bs.ctx
+scoreboard players operation $math.isqrt.x bs.in *= -100000 bs.const
+scoreboard players add $math.isqrt.x bs.in 100000000
+function #bs.math:isqrt
+scoreboard players operation $math.isqrt.x bs.in >< #x bs.ctx
+scoreboard players operation $math.acos bs.out *= $math.isqrt bs.out
+scoreboard players operation $math.acos bs.out /= 100000 bs.const
+
+execute if score $math.acos.x bs.in matches 0.. run scoreboard players operation $math.acos bs.out *= -1 bs.const
+execute if score $math.acos.x bs.in matches ..-1 run scoreboard players add $math.acos bs.out 18000
+
+return run scoreboard players get $math.acos bs.out
diff --git a/modules/bs.math/data/bs.math/function/asin.mcfunction b/modules/bs.math/data/bs.math/function/asin.mcfunction
new file mode 100644
index 0000000000..11c1ded3d6
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/asin.mcfunction
@@ -0,0 +1,44 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Note: This algorithm is taken from the Handbook of Mathematical Functions (M. Abramowitz and I.A. Stegun, Ed.)
+
+scoreboard players operation #x bs.ctx = $math.asin.x bs.in
+execute if score $math.asin.x bs.in matches ..-1 run scoreboard players operation #x bs.ctx *= -1 bs.const
+
+scoreboard players set $math.asin bs.out 107311
+scoreboard players operation $math.asin bs.out *= #x bs.ctx
+scoreboard players operation $math.asin bs.out /= 1000 bs.const
+scoreboard players remove $math.asin bs.out 425484
+scoreboard players operation $math.asin bs.out *= #x bs.ctx
+scoreboard players operation $math.asin bs.out /= 1000 bs.const
+scoreboard players add $math.asin bs.out 1215325
+scoreboard players operation $math.asin bs.out *= #x bs.ctx
+scoreboard players operation $math.asin bs.out /= 1000 bs.const
+scoreboard players remove $math.asin bs.out 9000000
+scoreboard players operation $math.asin bs.out /= 100 bs.const
+
+scoreboard players operation $math.isqrt.x bs.in >< #x bs.ctx
+scoreboard players operation $math.isqrt.x bs.in *= -100000 bs.const
+scoreboard players add $math.isqrt.x bs.in 100000000
+function #bs.math:isqrt
+scoreboard players operation $math.isqrt.x bs.in >< #x bs.ctx
+scoreboard players operation $math.asin bs.out *= $math.isqrt bs.out
+scoreboard players operation $math.asin bs.out /= 100000 bs.const
+
+scoreboard players add $math.asin bs.out 9000
+execute if score $math.asin.x bs.in matches ..-1 run scoreboard players operation $math.asin bs.out *= -1 bs.const
+
+return run scoreboard players get $math.asin bs.out
diff --git a/modules/bs.math/data/bs.math/function/atan/atan.mcfunction b/modules/bs.math/data/bs.math/function/atan/atan.mcfunction
new file mode 100644
index 0000000000..d0d87cf311
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/atan/atan.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+return run execute in minecraft:overworld as B5-0-0-0-1 run function bs.math:atan/run
diff --git a/modules/bs.math/data/bs.math/function/atan/run.mcfunction b/modules/bs.math/data/bs.math/function/atan/run.mcfunction
new file mode 100644
index 0000000000..7662f662f4
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/atan/run.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result entity @s Pos[0] double 0.001 run scoreboard players get $math.atan.x bs.in
+data modify entity @s Pos[2] set value 1.0
+execute positioned 0.0 0.0 0.0 facing entity @s feet rotated ~ 0.0 run tp @s -30000000 0 1600 ~ ~
+execute store result score $math.atan bs.out run data get entity @s Rotation[0] -100
+execute if score $math.atan bs.out matches ..-18000 run scoreboard players add $math.atan bs.out 36000
+execute if score $math.atan bs.out matches 18001.. run scoreboard players remove $math.atan bs.out 36000
+return run scoreboard players get $math.atan bs.out
diff --git a/modules/bs.math/data/bs.math/function/atan2/atan2.mcfunction b/modules/bs.math/data/bs.math/function/atan2/atan2.mcfunction
new file mode 100644
index 0000000000..4f53655a95
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/atan2/atan2.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+return run execute in minecraft:overworld as B5-0-0-0-1 run function bs.math:atan2/run
diff --git a/modules/bs.math/data/bs.math/function/atan2/run.mcfunction b/modules/bs.math/data/bs.math/function/atan2/run.mcfunction
new file mode 100644
index 0000000000..4af18e9b59
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/atan2/run.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result entity @s Pos[0] double 0.001 run scoreboard players get $math.atan2.y bs.in
+execute store result entity @s Pos[2] double 0.001 run scoreboard players get $math.atan2.x bs.in
+execute positioned 0.0 0.0 0.0 facing entity @s feet rotated ~ 0.0 run tp @s -30000000 0 1600 ~ ~
+execute store result score $math.atan2 bs.out run data get entity @s Rotation[0] -100
+execute if score $math.atan2 bs.out matches ..-18000 run scoreboard players add $math.atan2 bs.out 36000
+execute if score $math.atan2 bs.out matches 18001.. run scoreboard players remove $math.atan2 bs.out 36000
+return run scoreboard players get $math.atan2 bs.out
diff --git a/modules/bs.math/data/bs.math/function/combine/combine.mcfunction b/modules/bs.math/data/bs.math/function/combine/combine.mcfunction
new file mode 100644
index 0000000000..1b280fb518
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/combine/combine.mcfunction
@@ -0,0 +1,32 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Note: the larger bs.in must be smaller than 46342
+
+# keep n, k > 0 & n <= k
+execute store result score #n bs.ctx run scoreboard players set #k bs.ctx 0
+execute if score $math.combine.n bs.in matches 0.. run scoreboard players operation #n bs.ctx = $math.combine.n bs.in
+execute if score $math.combine.k bs.in matches 0.. run scoreboard players operation #k bs.ctx = $math.combine.k bs.in
+execute if score #n bs.ctx > #k bs.ctx run scoreboard players operation #n bs.ctx >< #k bs.ctx
+
+# get smaller n
+scoreboard players operation #t bs.ctx = #k bs.ctx
+scoreboard players operation #t bs.ctx -= #n bs.ctx
+scoreboard players operation #n bs.ctx < #t bs.ctx
+
+# break if n is special
+execute if score #n bs.ctx matches 0 run return run scoreboard players set $math.combine bs.out 1
+execute if score #n bs.ctx matches 1 run return run scoreboard players operation $math.combine bs.out = #k bs.ctx
+execute if score #n bs.ctx matches 2.. run return run function bs.math:combine/recurse/init
diff --git a/modules/bs.math/data/bs.math/function/combine/recurse/init.mcfunction b/modules/bs.math/data/bs.math/function/combine/recurse/init.mcfunction
new file mode 100644
index 0000000000..70f21255f9
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/combine/recurse/init.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# ((k-n+1)(k-n+2)...(k-2)(k-1)k) / (1*2*3*...*(n-1)*n)
+scoreboard players operation #k bs.ctx -= #n bs.ctx
+scoreboard players set #i bs.ctx 0
+execute store result score #m bs.ctx run scoreboard players set $math.combine bs.out 1
+function bs.math:combine/recurse/next
+return run scoreboard players get $math.combine bs.out
diff --git a/modules/bs.math/data/bs.math/function/combine/recurse/next.mcfunction b/modules/bs.math/data/bs.math/function/combine/recurse/next.mcfunction
new file mode 100644
index 0000000000..fe5e05bd67
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/combine/recurse/next.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players add #k bs.ctx 1
+scoreboard players add #i bs.ctx 1
+
+scoreboard players operation $math.combine bs.out /= #i bs.ctx
+scoreboard players operation $math.combine bs.out *= #k bs.ctx
+
+scoreboard players operation #m bs.ctx %= #i bs.ctx
+scoreboard players operation #m bs.ctx *= #k bs.ctx
+scoreboard players operation #m bs.ctx /= #i bs.ctx
+execute store result score #m bs.ctx run scoreboard players operation $math.combine bs.out += #m bs.ctx
+
+execute if score #i bs.ctx < #n bs.ctx run function bs.math:combine/recurse/next
diff --git a/modules/bs.math/data/bs.math/function/cos.mcfunction b/modules/bs.math/data/bs.math/function/cos.mcfunction
new file mode 100644
index 0000000000..9eee9f21d2
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/cos.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Normalize angle
+scoreboard players operation $math.cos bs.out = $math.cos.x bs.in
+execute store result score #x bs.ctx run scoreboard players operation $math.cos bs.out %= 36000 bs.const
+execute if score #x bs.ctx matches 9000..27000 run scoreboard players remove $math.cos bs.out 18000
+execute if score #x bs.ctx matches 27001.. run scoreboard players remove $math.cos bs.out 36000
+
+# Compute Bhāskara cosine approximation
+execute store result score #y bs.ctx run scoreboard players operation $math.cos bs.out *= $math.cos bs.out
+scoreboard players operation $math.cos bs.out *= -4 bs.const
+scoreboard players add $math.cos bs.out 324000000
+scoreboard players add #y bs.ctx 324000000
+scoreboard players operation #y bs.ctx /= 1000 bs.const
+execute if score #x bs.ctx matches 9000..27000 run scoreboard players operation #y bs.ctx *= -1 bs.const
+return run scoreboard players operation $math.cos bs.out /= #y bs.ctx
diff --git a/modules/bs.math/data/bs.math/function/divide.mcfunction b/modules/bs.math/data/bs.math/function/divide.mcfunction
new file mode 100644
index 0000000000..b4dcf4f74a
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/divide.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #x bs.ctx run scoreboard players operation $math.divide bs.out = $math.divide.x bs.in
+scoreboard players operation $math.divide bs.out /= $math.divide.y bs.in
+execute store result score #y bs.ctx run scoreboard players operation #x bs.ctx %= $math.divide.y bs.in
+scoreboard players operation #y bs.ctx -= $math.divide.y bs.in
+scoreboard players operation #y bs.ctx *= -1 bs.const
+execute if score #y bs.ctx < #x bs.ctx run scoreboard players add $math.divide bs.out 1
+return run scoreboard players get $math.divide bs.out
diff --git a/modules/bs.math/data/bs.math/function/exp.mcfunction b/modules/bs.math/data/bs.math/function/exp.mcfunction
new file mode 100644
index 0000000000..9290b29fc4
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/exp.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #e bs.ctx store result score #x bs.ctx run data get storage bs:in math.exp.x 24204406.323122970759868621826171875
+function bs.math:exp2/run
+data modify storage bs:out math.exp set from storage bs:ctx x
diff --git a/modules/bs.math/data/bs.math/function/exp2/exp2.mcfunction b/modules/bs.math/data/bs.math/function/exp2/exp2.mcfunction
new file mode 100644
index 0000000000..42d4e0a135
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/exp2/exp2.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #e bs.ctx store result score #x bs.ctx run data get storage bs:in math.exp2.x 16777216
+function bs.math:exp2/run
+data modify storage bs:out math.exp2 set from storage bs:ctx x
diff --git a/modules/bs.math/data/bs.math/function/exp2/fract.mcfunction b/modules/bs.math/data/bs.math/function/exp2/fract.mcfunction
new file mode 100644
index 0000000000..d65d51c9a2
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/exp2/fract.mcfunction
@@ -0,0 +1,35 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# polynomial used to approximate exp2(x):
+
+# c0: 1.87757667737929755981396429120877655805088579654694e-3
+# c1: 8.9893400854928091903150999542049248702824115753174e-3
+# c2: 5.5826318057013192552862079764963709749281406402588e-2
+# c3: 0.240153617043478234682751804029976483434438705444336
+# c4: 0.69315307320016572578680325023015029728412628173828
+# c5: 0.99999992506352930465851613917038775980472564697266
+
+$execute store result storage bs:ctx x float $(x) run scoreboard players set #x bs.ctx 31500
+execute store result score #x bs.ctx run data get storage bs:ctx x
+$execute store result storage bs:ctx x float $(x) run scoreboard players add #x bs.ctx 150816
+execute store result score #x bs.ctx run data get storage bs:ctx x
+$execute store result storage bs:ctx x float $(x) run scoreboard players add #x bs.ctx 936610
+execute store result score #x bs.ctx run data get storage bs:ctx x
+$execute store result storage bs:ctx x float $(x) run scoreboard players add #x bs.ctx 4029109
+execute store result score #x bs.ctx run data get storage bs:ctx x
+$execute store result storage bs:ctx x float $(x) run scoreboard players add #x bs.ctx 11629179
+execute store result score #x bs.ctx run data get storage bs:ctx x
+execute store result storage bs:ctx x float .000000059604644775390625 run scoreboard players add #x bs.ctx 16777215
diff --git a/modules/bs.math/data/bs.math/function/exp2/run.mcfunction b/modules/bs.math/data/bs.math/function/exp2/run.mcfunction
new file mode 100644
index 0000000000..df48d401bb
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/exp2/run.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# exp2(x) = exp2(i) * exp2(f)
+scoreboard players operation #e bs.ctx /= 16777216 bs.const
+execute store result storage bs:ctx x float .000000059604644775390625 run scoreboard players operation #x bs.ctx %= 16777216 bs.const
+execute unless score #x bs.ctx matches 0 run function bs.math:exp2/fract with storage bs:ctx
+execute if score #x bs.ctx matches 0 run data modify storage bs:ctx x set value 1.0
+function bs.math:ldexp/run with storage bs:ctx
diff --git a/modules/bs.math/data/bs.math/function/factorial/factorial.mcfunction b/modules/bs.math/data/bs.math/function/factorial/factorial.mcfunction
new file mode 100644
index 0000000000..9470c6a9e7
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/factorial/factorial.mcfunction
@@ -0,0 +1,34 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Note: Warning, this function does not work properly if the input is greater than 12 (because the result is greater than 2^31, the limit value of scoreboards)
+
+execute if score $math.factorial.n bs.in matches 0 run return run scoreboard players set $math.factorial bs.out 1
+execute if score $math.factorial.n bs.in matches 1 run return run scoreboard players set $math.factorial bs.out 1
+execute if score $math.factorial.n bs.in matches 2 run return run scoreboard players set $math.factorial bs.out 2
+execute if score $math.factorial.n bs.in matches 3 run return run scoreboard players set $math.factorial bs.out 6
+execute if score $math.factorial.n bs.in matches 4 run return run scoreboard players set $math.factorial bs.out 24
+execute if score $math.factorial.n bs.in matches 5 run return run scoreboard players set $math.factorial bs.out 120
+execute if score $math.factorial.n bs.in matches 6 run return run scoreboard players set $math.factorial bs.out 720
+execute if score $math.factorial.n bs.in matches 7 run return run scoreboard players set $math.factorial bs.out 5040
+execute if score $math.factorial.n bs.in matches 8 run return run scoreboard players set $math.factorial bs.out 40320
+execute if score $math.factorial.n bs.in matches 9 run return run scoreboard players set $math.factorial bs.out 362880
+execute if score $math.factorial.n bs.in matches 10 run return run scoreboard players set $math.factorial bs.out 3628800
+execute if score $math.factorial.n bs.in matches 11 run return run scoreboard players set $math.factorial bs.out 39916800
+execute if score $math.factorial.n bs.in matches 12 run return run scoreboard players set $math.factorial bs.out 479001600
+
+execute store result score #i bs.ctx run scoreboard players operation $math.factorial bs.out = $math.factorial.n bs.in
+function bs.math:factorial/loop
+return run scoreboard players get $math.factorial bs.out
diff --git a/modules/bs.math/data/bs.math/function/factorial/loop.mcfunction b/modules/bs.math/data/bs.math/function/factorial/loop.mcfunction
new file mode 100644
index 0000000000..1a0a4d4257
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/factorial/loop.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players remove #i bs.ctx 1
+scoreboard players operation $math.factorial bs.out *= #i bs.ctx
+execute if score #i bs.ctx matches 3.. run function bs.math:factorial/loop
diff --git a/datapacks/Bookshelf/data/bs.math/function/frexp/e_neg.mcfunction b/modules/bs.math/data/bs.math/function/frexp/e_neg.mcfunction
similarity index 99%
rename from datapacks/Bookshelf/data/bs.math/function/frexp/e_neg.mcfunction
rename to modules/bs.math/data/bs.math/function/frexp/e_neg.mcfunction
index 771840f880..f8cca7cacd 100644
--- a/datapacks/Bookshelf/data/bs.math/function/frexp/e_neg.mcfunction
+++ b/modules/bs.math/data/bs.math/function/frexp/e_neg.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/chunk.mcfunction b/modules/bs.math/data/bs.math/function/frexp/e_pos/chunk.mcfunction
similarity index 99%
rename from datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/chunk.mcfunction
rename to modules/bs.math/data/bs.math/function/frexp/e_pos/chunk.mcfunction
index 6d32b5ceaa..dc775b0a87 100644
--- a/datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/chunk.mcfunction
+++ b/modules/bs.math/data/bs.math/function/frexp/e_pos/chunk.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.math/data/bs.math/function/frexp/e_pos/range_1.mcfunction b/modules/bs.math/data/bs.math/function/frexp/e_pos/range_1.mcfunction
new file mode 100644
index 0000000000..b82c0674e3
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/frexp/e_pos/range_1.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #x bs.ctx run data get storage bs:ctx x .000000000000000000000000000012621774483536188886587657044524579674771302961744368076324462890625
+execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 120
+execute store result score #x bs.ctx run data get storage bs:ctx x .0000000000000000000000000032311742677852643549664402033982923967414535582065582275390625
+execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 112
+execute store result score #x bs.ctx run data get storage bs:ctx x .00000000000000000000000082718061255302767487140869206996285356581211090087890625
+execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 104
+execute store result score #x bs.ctx run data get storage bs:ctx x .000000000000000000000211758236813575084767080625169910490512847900390625
+execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 96
diff --git a/modules/bs.math/data/bs.math/function/frexp/e_pos/range_2.mcfunction b/modules/bs.math/data/bs.math/function/frexp/e_pos/range_2.mcfunction
new file mode 100644
index 0000000000..e5a4db6cea
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/frexp/e_pos/range_2.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #x bs.ctx run data get storage bs:ctx x .0000000000000000000542101086242752217003726400434970855712890625
+execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 88
+execute store result score #x bs.ctx run data get storage bs:ctx x .00000000000000001387778780781445675529539585113525390625
+execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 80
+execute store result score #x bs.ctx run data get storage bs:ctx x .000000000000003552713678800500929355621337890625
+execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 72
+execute store result score #x bs.ctx run data get storage bs:ctx x .0000000000009094947017729282379150390625
+execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 64
diff --git a/modules/bs.math/data/bs.math/function/frexp/e_pos/range_3.mcfunction b/modules/bs.math/data/bs.math/function/frexp/e_pos/range_3.mcfunction
new file mode 100644
index 0000000000..938939ae12
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/frexp/e_pos/range_3.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #x bs.ctx run data get storage bs:ctx x .00000000023283064365386962890625
+execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 56
+execute store result score #x bs.ctx run data get storage bs:ctx x .000000059604644775390625
+execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 48
+execute store result score #x bs.ctx run data get storage bs:ctx x .0000152587890625
+execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 40
+execute store result score #x bs.ctx run data get storage bs:ctx x .00390625
+execute unless score #x bs.ctx matches -8388607..8388607 run return run scoreboard players set #e bs.ctx 32
diff --git a/datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/range_4.mcfunction b/modules/bs.math/data/bs.math/function/frexp/e_pos/range_4.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/range_4.mcfunction
rename to modules/bs.math/data/bs.math/function/frexp/e_pos/range_4.mcfunction
index 986b2ca74e..df691f9d67 100644
--- a/datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/range_4.mcfunction
+++ b/modules/bs.math/data/bs.math/function/frexp/e_pos/range_4.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/split.mcfunction b/modules/bs.math/data/bs.math/function/frexp/e_pos/split.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/split.mcfunction
rename to modules/bs.math/data/bs.math/function/frexp/e_pos/split.mcfunction
index db51913415..eef781b723 100644
--- a/datapacks/Bookshelf/data/bs.math/function/frexp/e_pos/split.mcfunction
+++ b/modules/bs.math/data/bs.math/function/frexp/e_pos/split.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.math/data/bs.math/function/frexp/frexp.mcfunction b/modules/bs.math/data/bs.math/function/frexp/frexp.mcfunction
new file mode 100644
index 0000000000..ca8248beb1
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/frexp/frexp.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx x set from storage bs:in math.frexp.x
+function bs.math:frexp/run
+execute store result storage bs:out math.frexp.e int 1 run scoreboard players get #e bs.ctx
+data modify storage bs:out math.frexp.x set from storage bs:ctx x
diff --git a/modules/bs.math/data/bs.math/function/frexp/run.mcfunction b/modules/bs.math/data/bs.math/function/frexp/run.mcfunction
new file mode 100644
index 0000000000..502f8ee084
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/frexp/run.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #f bs.ctx run data get storage bs:ctx x
+execute unless score #f bs.ctx matches 0 run function bs.math:frexp/e_pos/split
+execute unless score #f bs.ctx matches 0 run function bs.math:frexp/e_pos/chunk
+execute if score #f bs.ctx matches 0 run function bs.math:frexp/e_neg
diff --git a/modules/bs.math/data/bs.math/function/gcd/gcd.mcfunction b/modules/bs.math/data/bs.math/function/gcd/gcd.mcfunction
new file mode 100644
index 0000000000..97435f3cae
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/gcd/gcd.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation $math.gcd bs.out = $math.gcd.a bs.in
+scoreboard players operation #t bs.ctx = $math.gcd.b bs.in
+function bs.math:gcd/loop
+return run scoreboard players get $math.gcd bs.out
diff --git a/modules/bs.math/data/bs.math/function/gcd/loop.mcfunction b/modules/bs.math/data/bs.math/function/gcd/loop.mcfunction
new file mode 100644
index 0000000000..cb6dfe51a0
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/gcd/loop.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation $math.gcd bs.out %= #t bs.ctx
+scoreboard players operation $math.gcd bs.out >< #t bs.ctx
+execute unless score #t bs.ctx matches 0 run function bs.math:gcd/loop
diff --git a/modules/bs.math/data/bs.math/function/ipow.mcfunction b/modules/bs.math/data/bs.math/function/ipow.mcfunction
new file mode 100644
index 0000000000..ffeba1e9b9
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/ipow.mcfunction
@@ -0,0 +1,34 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $math.ipow bs.out 1
+execute if score $math.ipow.y bs.in matches 1.. store result score #j bs.ctx run scoreboard players operation #i bs.ctx = $math.ipow.x bs.in
+execute if score $math.ipow.y bs.in matches 2.. store result score #k bs.ctx run scoreboard players operation #j bs.ctx *= #j bs.ctx
+execute if score $math.ipow.y bs.in matches 4.. store result score #l bs.ctx run scoreboard players operation #k bs.ctx *= #k bs.ctx
+execute if score $math.ipow.y bs.in matches 8.. store result score #m bs.ctx run scoreboard players operation #l bs.ctx *= #l bs.ctx
+execute if score $math.ipow.y bs.in matches 16.. run scoreboard players operation #m bs.ctx *= #m bs.ctx
+
+scoreboard players operation #y bs.ctx = $math.ipow.y bs.in
+execute if score #y bs.ctx matches 16.. run scoreboard players operation $math.ipow bs.out *= #m bs.ctx
+execute if score #y bs.ctx matches 16.. run scoreboard players remove #y bs.ctx 16
+execute if score #y bs.ctx matches 8.. run scoreboard players operation $math.ipow bs.out *= #l bs.ctx
+execute if score #y bs.ctx matches 8.. run scoreboard players remove #y bs.ctx 8
+execute if score #y bs.ctx matches 4.. run scoreboard players operation $math.ipow bs.out *= #k bs.ctx
+execute if score #y bs.ctx matches 4.. run scoreboard players remove #y bs.ctx 4
+execute if score #y bs.ctx matches 2.. run scoreboard players operation $math.ipow bs.out *= #j bs.ctx
+execute if score #y bs.ctx matches 2.. run scoreboard players remove #y bs.ctx 2
+execute if score #y bs.ctx matches 1.. run scoreboard players operation $math.ipow bs.out *= #i bs.ctx
+
+return run scoreboard players get $math.ipow bs.out
diff --git a/modules/bs.math/data/bs.math/function/isqrt.mcfunction b/modules/bs.math/data/bs.math/function/isqrt.mcfunction
new file mode 100644
index 0000000000..cbea45dce1
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/isqrt.mcfunction
@@ -0,0 +1,37 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Note: Thanks to the Minecraft Commands' discord server for the help provided (https://discord.gg/QAFXFtZ)
+
+execute store result score #s bs.ctx store result score #t bs.ctx store result score #u bs.ctx store result score #v bs.ctx run scoreboard players operation $math.isqrt bs.out = $math.isqrt.x bs.in
+
+execute if score $math.isqrt.x bs.in matches 0..1515359 run scoreboard players operation $math.isqrt bs.out /= 559 bs.const
+execute if score $math.isqrt.x bs.in matches 0..1515359 run scoreboard players add $math.isqrt bs.out 15
+execute if score $math.isqrt.x bs.in matches 1515360.. run scoreboard players operation $math.isqrt bs.out /= 32768 bs.const
+execute if score $math.isqrt.x bs.in matches 1515360.. run scoreboard players add $math.isqrt bs.out 2456
+
+scoreboard players operation #s bs.ctx /= $math.isqrt bs.out
+scoreboard players operation $math.isqrt bs.out += #s bs.ctx
+scoreboard players operation $math.isqrt bs.out /= 2 bs.const
+scoreboard players operation #t bs.ctx /= $math.isqrt bs.out
+scoreboard players operation $math.isqrt bs.out += #t bs.ctx
+scoreboard players operation $math.isqrt bs.out /= 2 bs.const
+scoreboard players operation #u bs.ctx /= $math.isqrt bs.out
+scoreboard players operation $math.isqrt bs.out += #u bs.ctx
+scoreboard players operation $math.isqrt bs.out /= 2 bs.const
+
+scoreboard players operation #v bs.ctx /= $math.isqrt bs.out
+execute if score $math.isqrt bs.out > #v bs.ctx run scoreboard players remove $math.isqrt bs.out 1
+return run scoreboard players get $math.isqrt bs.out
diff --git a/modules/bs.math/data/bs.math/function/ldexp/ldexp.mcfunction b/modules/bs.math/data/bs.math/function/ldexp/ldexp.mcfunction
new file mode 100644
index 0000000000..2e117acda3
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/ldexp/ldexp.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx x set from storage bs:in math.ldexp.x
+execute store result score #e bs.ctx run data get storage bs:in math.ldexp.e
+function bs.math:ldexp/run
+data modify storage bs:out math.ldexp set from storage bs:ctx x
diff --git a/modules/bs.math/data/bs.math/function/ldexp/mul.mcfunction b/modules/bs.math/data/bs.math/function/ldexp/mul.mcfunction
new file mode 100644
index 0000000000..a09de9cc68
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/ldexp/mul.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:ctx x float $(y) run data get storage bs:ctx x 16777216
diff --git a/modules/bs.math/data/bs.math/function/ldexp/run.mcfunction b/modules/bs.math/data/bs.math/function/ldexp/run.mcfunction
new file mode 100644
index 0000000000..647e5b14d6
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/ldexp/run.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result storage bs:ctx y int 1 run scoreboard players add #e bs.ctx 127
+function bs.math:ldexp/table with storage bs:ctx
+function bs.math:ldexp/mul with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.math/function/ldexp/table.mcfunction b/modules/bs.math/data/bs.math/function/ldexp/table.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.math/function/ldexp/table.mcfunction
rename to modules/bs.math/data/bs.math/function/ldexp/table.mcfunction
index 4f54ce85ca..bb07134255 100644
--- a/datapacks/Bookshelf/data/bs.math/function/ldexp/table.mcfunction
+++ b/modules/bs.math/data/bs.math/function/ldexp/table.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.math/data/bs.math/function/log.mcfunction b/modules/bs.math/data/bs.math/function/log.mcfunction
new file mode 100644
index 0000000000..48809a12f5
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/log.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx x set from storage bs:in math.log.x
+function bs.math:log2/run
+execute store result storage bs:out math.log float .000000059604644775390625 run data get storage bs:ctx x 11629079.96804520301520824432373046875
diff --git a/modules/bs.math/data/bs.math/function/log10.mcfunction b/modules/bs.math/data/bs.math/function/log10.mcfunction
new file mode 100644
index 0000000000..9396e77808
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/log10.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx x set from storage bs:in math.log10.x
+function bs.math:log2/run
+execute store result storage bs:out math.log10 float .000000059604644775390625 run data get storage bs:ctx x 5050445.259733675979077816009521484375
diff --git a/modules/bs.math/data/bs.math/function/log2/fract.mcfunction b/modules/bs.math/data/bs.math/function/log2/fract.mcfunction
new file mode 100644
index 0000000000..8de153bc03
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/log2/fract.mcfunction
@@ -0,0 +1,44 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# polynomial used to approximate log2(x):
+
+# c0: -1.71360049568838679334703556378372013568878173828125
+# c1: 12.140772751442813870426107314415276050567626953125
+# c2: -38.14350757032898542320253909565508365631103515625
+# c3: 69.9190874943370630489880568347871303558349609375
+# c4: -82.8110616548526223823500913567841053009033203125
+# c5: 66.436833597743998325313441455364227294921875
+# c6: -37.1792086028527819507871754467487335205078125
+# c7: 15.723860485552176413648339803330600261688232421875
+# c8: -4.3731760053578137004137715848628431558609008789062
+
+$execute store result storage bs:ctx x float $(x) run scoreboard players set #x bs.ctx -28749446
+execute store result score #x bs.ctx run data get storage bs:ctx x
+$execute store result storage bs:ctx x float $(x) run scoreboard players add #x bs.ctx 203688367
+execute store result score #x bs.ctx run data get storage bs:ctx x
+$execute store result storage bs:ctx x float $(x) run scoreboard players remove #x bs.ctx 639941865
+execute store result score #x bs.ctx run data get storage bs:ctx x
+$execute store result storage bs:ctx x float $(x) run scoreboard players add #x bs.ctx 1173047633
+execute store result score #x bs.ctx run data get storage bs:ctx x
+$execute store result storage bs:ctx x float $(x) run scoreboard players remove #x bs.ctx 1389339069
+execute store result score #x bs.ctx run data get storage bs:ctx x
+$execute store result storage bs:ctx x float $(x) run scoreboard players add #x bs.ctx 1114625108
+execute store result score #x bs.ctx run data get storage bs:ctx x
+$execute store result storage bs:ctx x float $(x) run scoreboard players remove #x bs.ctx 623763613
+execute store result score #x bs.ctx run data get storage bs:ctx x
+$execute store result storage bs:ctx x float $(x) run scoreboard players add #x bs.ctx 263802604
+execute store result score #x bs.ctx run data get storage bs:ctx x
+scoreboard players remove #x bs.ctx 73369718
diff --git a/modules/bs.math/data/bs.math/function/log2/log2.mcfunction b/modules/bs.math/data/bs.math/function/log2/log2.mcfunction
new file mode 100644
index 0000000000..ea4373afcc
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/log2/log2.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx x set from storage bs:in math.log2.x
+function bs.math:log2/run
+data modify storage bs:out math.log2 set from storage bs:ctx x
diff --git a/modules/bs.math/data/bs.math/function/log2/run.mcfunction b/modules/bs.math/data/bs.math/function/log2/run.mcfunction
new file mode 100644
index 0000000000..08e2a835a9
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/log2/run.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# decompose x into a normalized fraction and an integral power of two [log2(x) = log2(frexp.x) + frexp.e]
+function bs.math:frexp/run
+function bs.math:log2/fract with storage bs:ctx
+scoreboard players operation #e bs.ctx *= 16777216 bs.const
+execute store result storage bs:ctx x float .000000059604644775390625 run scoreboard players operation #x bs.ctx += #e bs.ctx
diff --git a/modules/bs.math/data/bs.math/function/loga/loga.mcfunction b/modules/bs.math/data/bs.math/function/loga/loga.mcfunction
new file mode 100644
index 0000000000..8b45c86878
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/loga/loga.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx x set from storage bs:in math.loga.a
+function bs.math:log2/run
+
+scoreboard players set #a bs.ctx 2000000000
+execute store result score #b bs.ctx run data get storage bs:ctx x 20000
+execute store result storage bs:ctx y double 1 run scoreboard players operation #a bs.ctx /= #b bs.ctx
+
+data modify storage bs:ctx x set from storage bs:in math.loga.x
+function bs.math:log2/run
+function bs.math:loga/mul with storage bs:ctx
diff --git a/modules/bs.math/data/bs.math/function/loga/mul.mcfunction b/modules/bs.math/data/bs.math/function/loga/mul.mcfunction
new file mode 100644
index 0000000000..63196b48af
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/loga/mul.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:out math.loga float .00001 run data get storage bs:ctx x $(y)
diff --git a/modules/bs.math/data/bs.math/function/pow/mul.mcfunction b/modules/bs.math/data/bs.math/function/pow/mul.mcfunction
new file mode 100644
index 0000000000..3db33a2686
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/pow/mul.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:ctx x float $(y) run scoreboard players operation #x bs.ctx += #e bs.ctx
diff --git a/modules/bs.math/data/bs.math/function/pow/pow.mcfunction b/modules/bs.math/data/bs.math/function/pow/pow.mcfunction
new file mode 100644
index 0000000000..2d91bc675f
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/pow/pow.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# pow(x,y) = exp2(y * log2(x))
+data modify storage bs:ctx x set from storage bs:in math.pow.x
+data modify storage bs:ctx y set from storage bs:in math.pow.y
+
+function bs.math:frexp/run
+function bs.math:log2/fract with storage bs:ctx
+scoreboard players operation #e bs.ctx *= 16777216 bs.const
+function bs.math:pow/mul with storage bs:ctx
+
+execute store result score #e bs.ctx store result score #x bs.ctx run data get storage bs:ctx x
+function bs.math:exp2/run
+data modify storage bs:out math.pow set from storage bs:ctx x
diff --git a/modules/bs.math/data/bs.math/function/sin.mcfunction b/modules/bs.math/data/bs.math/function/sin.mcfunction
new file mode 100644
index 0000000000..59cea032da
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/sin.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Normalize angle
+scoreboard players operation $math.sin bs.out = $math.sin.x bs.in
+execute store result score #x bs.ctx run scoreboard players operation $math.sin bs.out %= 36000 bs.const
+execute if score #x bs.ctx matches ..18000 run scoreboard players remove $math.sin bs.out 9000
+execute if score #x bs.ctx matches 18001.. run scoreboard players remove $math.sin bs.out 27000
+
+# Compute Bhāskara sinine approximation
+execute store result score #y bs.ctx run scoreboard players operation $math.sin bs.out *= $math.sin bs.out
+scoreboard players operation $math.sin bs.out *= -4 bs.const
+scoreboard players add $math.sin bs.out 324000000
+scoreboard players add #y bs.ctx 324000000
+scoreboard players operation #y bs.ctx /= 1000 bs.const
+execute if score #x bs.ctx matches 18000.. run scoreboard players operation #y bs.ctx *= -1 bs.const
+return run scoreboard players operation $math.sin bs.out /= #y bs.ctx
diff --git a/modules/bs.math/data/bs.math/function/sincos/run.mcfunction b/modules/bs.math/data/bs.math/function/sincos/run.mcfunction
new file mode 100644
index 0000000000..cee0bb3499
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/sincos/run.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result entity @s Rotation[0] float -0.01 run scoreboard players get $math.sincos.x bs.in
+execute at @s positioned 0.0 0.0 0.0 rotated ~ 0.0 run tp @s ^ ^ ^10.0
+execute store result score $math.sincos.cos bs.out run data get entity @s Pos[2] 100
+execute store result score $math.sincos.sin bs.out run data get entity @s Pos[0] 100
+tp @s -30000000 0 1600
diff --git a/modules/bs.math/data/bs.math/function/sincos/sincos.mcfunction b/modules/bs.math/data/bs.math/function/sincos/sincos.mcfunction
new file mode 100644
index 0000000000..fd921a9d88
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/sincos/sincos.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute in minecraft:overworld as B5-0-0-0-1 run function bs.math:sincos/run
diff --git a/modules/bs.math/data/bs.math/function/sqrt.mcfunction b/modules/bs.math/data/bs.math/function/sqrt.mcfunction
new file mode 100644
index 0000000000..0c132ed17d
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/sqrt.mcfunction
@@ -0,0 +1,46 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx x set from storage bs:in math.sqrt.x
+function bs.math:frexp/run
+
+# secant approximation (x / 79249 + 19750 => 2 iters)
+execute store result score #x bs.ctx store result score #y bs.ctx store result score #i bs.ctx store result score #j bs.ctx run data get storage bs:ctx x 1073741824
+scoreboard players operation #x bs.ctx /= 79249 bs.const
+scoreboard players add #x bs.ctx 19750
+scoreboard players operation #i bs.ctx /= #x bs.ctx
+scoreboard players operation #x bs.ctx += #i bs.ctx
+scoreboard players operation #x bs.ctx /= 2 bs.const
+scoreboard players operation #j bs.ctx /= #x bs.ctx
+scoreboard players operation #x bs.ctx += #j bs.ctx
+execute store result score #i bs.ctx store result score #j bs.ctx run scoreboard players operation #x bs.ctx /= 2 bs.const
+
+# secant approximation (x - isqrt(x)^2) / (isqrt(x) * 2 + 1)
+scoreboard players operation #i bs.ctx *= 2 bs.const
+scoreboard players add #i bs.ctx 1
+scoreboard players operation #j bs.ctx *= #j bs.ctx
+scoreboard players operation #y bs.ctx -= #j bs.ctx
+scoreboard players operation #y bs.ctx *= 32768 bs.const
+scoreboard players operation #y bs.ctx /= #i bs.ctx
+scoreboard players operation #x bs.ctx *= 32768 bs.const
+
+scoreboard players operation #t bs.ctx = #e bs.ctx
+scoreboard players operation #t bs.ctx %= 2 bs.const
+scoreboard players operation #e bs.ctx += #t bs.ctx
+scoreboard players operation #e bs.ctx /= 2 bs.const
+execute if score #t bs.ctx matches 0 store result storage bs:ctx x float .000000000931322574615478515625 run scoreboard players operation #x bs.ctx += #y bs.ctx
+execute if score #t bs.ctx matches 1 store result storage bs:ctx x float .00000000065854450798271929168823261686546190196711592079736874438822269439697265625 run scoreboard players operation #x bs.ctx += #y bs.ctx
+function bs.math:ldexp/run
+data modify storage bs:out math.sqrt set from storage bs:ctx x
diff --git a/modules/bs.math/data/bs.math/function/tan/run.mcfunction b/modules/bs.math/data/bs.math/function/tan/run.mcfunction
new file mode 100644
index 0000000000..e95f749a34
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/tan/run.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result entity @s Rotation[0] float -0.01 run scoreboard players get $math.tan.x bs.in
+execute at @s positioned 0.0 0.0 0.0 rotated ~ 0.0 run tp @s ^ ^ ^10.0
+execute store result score $math.tan bs.out run data get entity @s Pos[0] 100
+execute store result score #t bs.ctx run data get entity @s Pos[2] 100
+tp @s -30000000 0 1600
+scoreboard players operation $math.tan bs.out *= 1000 bs.const
+return run scoreboard players operation $math.tan bs.out /= #t bs.ctx
diff --git a/modules/bs.math/data/bs.math/function/tan/tan.mcfunction b/modules/bs.math/data/bs.math/function/tan/tan.mcfunction
new file mode 100644
index 0000000000..ac8ab5801b
--- /dev/null
+++ b/modules/bs.math/data/bs.math/function/tan/tan.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+return run execute in minecraft:overworld as B5-0-0-0-1 run function bs.math:tan/run
diff --git a/modules/bs.math/data/bs.math/tags/function/acos.json b/modules/bs.math/data/bs.math/tags/function/acos.json
new file mode 100644
index 0000000000..c84f4e0d87
--- /dev/null
+++ b/modules/bs.math/data/bs.math/tags/function/acos.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#inverse-trigonometry",
+ "authors": [
+ "Aksiome",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2017/09/04",
+ "minecraft_version": "1.12.1"
+ },
+ "updated": {
+ "date": "2023/09/05",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "values": [
+ "bs.math:acos"
+ ]
+}
diff --git a/modules/bs.math/data/bs.math/tags/function/asin.json b/modules/bs.math/data/bs.math/tags/function/asin.json
new file mode 100644
index 0000000000..269bacb933
--- /dev/null
+++ b/modules/bs.math/data/bs.math/tags/function/asin.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#inverse-trigonometry",
+ "authors": [
+ "Aksiome",
+ "KubbyDev"
+ ],
+ "created": {
+ "date": "2017/08/24",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2023/09/05",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "values": [
+ "bs.math:asin"
+ ]
+}
diff --git a/modules/bs.math/data/bs.math/tags/function/atan.json b/modules/bs.math/data/bs.math/tags/function/atan.json
new file mode 100644
index 0000000000..396be49444
--- /dev/null
+++ b/modules/bs.math/data/bs.math/tags/function/atan.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#inverse-trigonometry",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2018/10/01",
+ "minecraft_version": "1.13.2"
+ },
+ "updated": {
+ "date": "2023/09/05",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "values": [
+ "bs.math:atan/atan"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/atan2.json b/modules/bs.math/data/bs.math/tags/function/atan2.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.math/tags/function/atan2.json
rename to modules/bs.math/data/bs.math/tags/function/atan2.json
index 1fd4399e0f..068c973edf 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/atan2.json
+++ b/modules/bs.math/data/bs.math/tags/function/atan2.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#inverse-trigonometry",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#inverse-trigonometry",
"authors": [
"Aksiome",
"KubbyDev"
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/combine.json b/modules/bs.math/data/bs.math/tags/function/combine.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.math/tags/function/combine.json
rename to modules/bs.math/data/bs.math/tags/function/combine.json
index 0d4757c846..64cc5c28fc 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/combine.json
+++ b/modules/bs.math/data/bs.math/tags/function/combine.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#combine",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#combine",
"authors": [
"Ethanout"
],
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/cos.json b/modules/bs.math/data/bs.math/tags/function/cos.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.math/tags/function/cos.json
rename to modules/bs.math/data/bs.math/tags/function/cos.json
index b38523a5da..33a429d48d 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/cos.json
+++ b/modules/bs.math/data/bs.math/tags/function/cos.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#trigonometry",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#trigonometry",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/divide.json b/modules/bs.math/data/bs.math/tags/function/divide.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.math/tags/function/divide.json
rename to modules/bs.math/data/bs.math/tags/function/divide.json
index e809ee4187..5e3b3f1b7e 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/divide.json
+++ b/modules/bs.math/data/bs.math/tags/function/divide.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#rounded-division",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#rounded-division",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/exp.json b/modules/bs.math/data/bs.math/tags/function/exp.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.math/tags/function/exp.json
rename to modules/bs.math/data/bs.math/tags/function/exp.json
index beade4e3b2..089c8e0ad6 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/exp.json
+++ b/modules/bs.math/data/bs.math/tags/function/exp.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#exponential",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#exponential",
"authors": [
"Aksiome",
"KubbyDev"
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/exp2.json b/modules/bs.math/data/bs.math/tags/function/exp2.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.math/tags/function/exp2.json
rename to modules/bs.math/data/bs.math/tags/function/exp2.json
index fec386c93b..fa8c4bf634 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/exp2.json
+++ b/modules/bs.math/data/bs.math/tags/function/exp2.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#exponential",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#exponential",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/factorial.json b/modules/bs.math/data/bs.math/tags/function/factorial.json
similarity index 80%
rename from datapacks/Bookshelf/data/bs.math/tags/function/factorial.json
rename to modules/bs.math/data/bs.math/tags/function/factorial.json
index 0e147c9e59..1d90de0623 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/factorial.json
+++ b/modules/bs.math/data/bs.math/tags/function/factorial.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#factorial",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#factorial",
"authors": [
"Aksiome",
"KubbyDev",
diff --git a/modules/bs.math/data/bs.math/tags/function/frexp.json b/modules/bs.math/data/bs.math/tags/function/frexp.json
new file mode 100644
index 0000000000..8c2c34d7a4
--- /dev/null
+++ b/modules/bs.math/data/bs.math/tags/function/frexp.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#float-manipulation",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/09/02",
+ "minecraft_version": "23w33a"
+ },
+ "updated": {
+ "date": "2024/01/31",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.math:frexp/frexp"
+ ]
+}
diff --git a/modules/bs.math/data/bs.math/tags/function/gcd.json b/modules/bs.math/data/bs.math/tags/function/gcd.json
new file mode 100644
index 0000000000..3d5efff7c3
--- /dev/null
+++ b/modules/bs.math/data/bs.math/tags/function/gcd.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#greatest-common-denominator",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/10/28",
+ "minecraft_version": "1.12.2"
+ },
+ "updated": {
+ "date": "2023/08/03",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "values": [
+ "bs.math:gcd/gcd"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/ipow.json b/modules/bs.math/data/bs.math/tags/function/ipow.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.math/tags/function/ipow.json
rename to modules/bs.math/data/bs.math/tags/function/ipow.json
index f8a1be4d3f..59a5f602ea 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/ipow.json
+++ b/modules/bs.math/data/bs.math/tags/function/ipow.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#power",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#power",
"authors": [
"Aksiome",
"KubbyDev"
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/isqrt.json b/modules/bs.math/data/bs.math/tags/function/isqrt.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.math/tags/function/isqrt.json
rename to modules/bs.math/data/bs.math/tags/function/isqrt.json
index 73cd96f7ca..85d46766de 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/isqrt.json
+++ b/modules/bs.math/data/bs.math/tags/function/isqrt.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#square-root",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#square-root",
"authors": [
"Triton365",
"Ethanout",
diff --git a/modules/bs.math/data/bs.math/tags/function/ldexp.json b/modules/bs.math/data/bs.math/tags/function/ldexp.json
new file mode 100644
index 0000000000..38fa6f92f9
--- /dev/null
+++ b/modules/bs.math/data/bs.math/tags/function/ldexp.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#float-manipulation",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/01/28",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/01/28",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.math:ldexp/ldexp"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/log.json b/modules/bs.math/data/bs.math/tags/function/log.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.math/tags/function/log.json
rename to modules/bs.math/data/bs.math/tags/function/log.json
index e3bac26dc0..c20c74f29c 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/log.json
+++ b/modules/bs.math/data/bs.math/tags/function/log.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#logarithm",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#logarithm",
"authors": [
"Aksiome",
"KubbyDev"
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/log10.json b/modules/bs.math/data/bs.math/tags/function/log10.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.math/tags/function/log10.json
rename to modules/bs.math/data/bs.math/tags/function/log10.json
index 54c6db3bb9..a1409e3c41 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/log10.json
+++ b/modules/bs.math/data/bs.math/tags/function/log10.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#logarithm",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#logarithm",
"authors": [
"Aksiome",
"KubbyDev"
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/log2.json b/modules/bs.math/data/bs.math/tags/function/log2.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.math/tags/function/log2.json
rename to modules/bs.math/data/bs.math/tags/function/log2.json
index 3b00826b2d..5f3011032e 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/log2.json
+++ b/modules/bs.math/data/bs.math/tags/function/log2.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#logarithm",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#logarithm",
"authors": [
"Aksiome",
"KubbyDev"
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/loga.json b/modules/bs.math/data/bs.math/tags/function/loga.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.math/tags/function/loga.json
rename to modules/bs.math/data/bs.math/tags/function/loga.json
index 608f2beb73..25b973e335 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/loga.json
+++ b/modules/bs.math/data/bs.math/tags/function/loga.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#logarithm",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#logarithm",
"authors": [
"Aksiome",
"KubbyDev"
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/pow.json b/modules/bs.math/data/bs.math/tags/function/pow.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.math/tags/function/pow.json
rename to modules/bs.math/data/bs.math/tags/function/pow.json
index e35676232f..39e78b5262 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/pow.json
+++ b/modules/bs.math/data/bs.math/tags/function/pow.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#pow",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#pow",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/sin.json b/modules/bs.math/data/bs.math/tags/function/sin.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.math/tags/function/sin.json
rename to modules/bs.math/data/bs.math/tags/function/sin.json
index c3e4f771c1..33035fe34d 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/sin.json
+++ b/modules/bs.math/data/bs.math/tags/function/sin.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#trigonometry",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#trigonometry",
"authors": [
"Leirof"
],
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/sincos.json b/modules/bs.math/data/bs.math/tags/function/sincos.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.math/tags/function/sincos.json
rename to modules/bs.math/data/bs.math/tags/function/sincos.json
index 89bf997fb2..b6ea5c05ff 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/sincos.json
+++ b/modules/bs.math/data/bs.math/tags/function/sincos.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#trigonometry",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#trigonometry",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/sqrt.json b/modules/bs.math/data/bs.math/tags/function/sqrt.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.math/tags/function/sqrt.json
rename to modules/bs.math/data/bs.math/tags/function/sqrt.json
index 793980205d..84caf13470 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/sqrt.json
+++ b/modules/bs.math/data/bs.math/tags/function/sqrt.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#square-root",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#square-root",
"authors": [
"Aksiome",
"Ethanout",
diff --git a/datapacks/Bookshelf/data/bs.math/tags/function/tan.json b/modules/bs.math/data/bs.math/tags/function/tan.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.math/tags/function/tan.json
rename to modules/bs.math/data/bs.math/tags/function/tan.json
index ee64e8f350..21227c4b14 100644
--- a/datapacks/Bookshelf/data/bs.math/tags/function/tan.json
+++ b/modules/bs.math/data/bs.math/tags/function/tan.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/math.html#trigonometry",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html#trigonometry",
"authors": [
"Aksiome",
"KubbyDev"
diff --git a/modules/bs.math/data/bs.math/test/acos.mcfunction b/modules/bs.math/data/bs.math/test/acos.mcfunction
new file mode 100644
index 0000000000..ddb17dfab8
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/acos.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $math.acos.x bs.in 420
+function #bs.math:acos
+assert score $math.acos bs.out matches 6515..6517
+
+scoreboard players set $math.acos.x bs.in -826
+function #bs.math:acos
+assert score $math.acos bs.out matches 14568..14570
diff --git a/modules/bs.math/data/bs.math/test/asin.mcfunction b/modules/bs.math/data/bs.math/test/asin.mcfunction
new file mode 100644
index 0000000000..5d79d6baf8
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/asin.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $math.asin.x bs.in 420
+function #bs.math:asin
+assert score $math.asin bs.out matches 2482..2484
+
+scoreboard players set $math.asin.x bs.in -826
+function #bs.math:asin
+assert score $math.asin bs.out matches -5570..-5568
diff --git a/modules/bs.math/data/bs.math/test/atan.mcfunction b/modules/bs.math/data/bs.math/test/atan.mcfunction
new file mode 100644
index 0000000000..d29820db2e
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/atan.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $math.atan.x bs.in 420
+function #bs.math:atan
+assert score $math.atan bs.out matches 2277..2279
+
+scoreboard players set $math.atan.x bs.in -826
+function #bs.math:atan
+assert score $math.atan bs.out matches -3956..-3954
diff --git a/modules/bs.math/data/bs.math/test/atan2.mcfunction b/modules/bs.math/data/bs.math/test/atan2.mcfunction
new file mode 100644
index 0000000000..62edaf9fde
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/atan2.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $math.atan2.y bs.in 420
+scoreboard players set $math.atan2.x bs.in -700
+function #bs.math:atan2
+assert score $math.atan2 bs.out matches 14902..14904
+
+scoreboard players set $math.atan2.y bs.in -826
+scoreboard players set $math.atan2.x bs.in 200
+function #bs.math:atan2
+assert score $math.atan2 bs.out matches -7639..-7637
diff --git a/modules/bs.math/data/bs.math/test/combine.mcfunction b/modules/bs.math/data/bs.math/test/combine.mcfunction
new file mode 100644
index 0000000000..0ff24066c4
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/combine.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $math.combine.n bs.in 42
+scoreboard players set $math.combine.k bs.in 7
+function #bs.math:combine
+assert score $math.combine bs.out matches 26978328
+
+scoreboard players set $math.combine.n bs.in 128
+scoreboard players set $math.combine.k bs.in 3
+function #bs.math:combine
+assert score $math.combine bs.out matches 341376
+
+scoreboard players set $math.combine.n bs.in 42
+scoreboard players set $math.combine.k bs.in 9
+function #bs.math:combine
+assert score $math.combine bs.out matches 445891810
diff --git a/modules/bs.math/data/bs.math/test/cos.mcfunction b/modules/bs.math/data/bs.math/test/cos.mcfunction
new file mode 100644
index 0000000000..eb46613106
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/cos.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $math.cos.x bs.in 6442
+function #bs.math:cos
+assert score $math.cos bs.out matches 430..432
+
+scoreboard players set $math.cos.x bs.in -21513
+function #bs.math:cos
+assert score $math.cos bs.out matches -818..-816
diff --git a/modules/bs.math/data/bs.math/test/divide.mcfunction b/modules/bs.math/data/bs.math/test/divide.mcfunction
new file mode 100644
index 0000000000..fee5429abb
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/divide.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $math.divide.x bs.in 9
+scoreboard players set $math.divide.y bs.in 5
+function #bs.math:divide
+assert score $math.divide bs.out matches 2
+
+scoreboard players set $math.divide.x bs.in 11
+scoreboard players set $math.divide.y bs.in 5
+function #bs.math:divide
+assert score $math.divide bs.out matches 2
diff --git a/modules/bs.math/data/bs.math/test/exp.mcfunction b/modules/bs.math/data/bs.math/test/exp.mcfunction
new file mode 100644
index 0000000000..b63b0a9d3f
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/exp.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:in math.exp.x set value 3.0
+function #bs.math:exp
+execute store result score #r bs.ctx run data get storage bs:out math.exp 10000
+assert score #r bs.ctx matches 200854..200856
+
+data modify storage bs:in math.exp.x set value 7.25
+function #bs.math:exp
+execute store result score #r bs.ctx run data get storage bs:out math.exp 10000
+assert score #r bs.ctx matches 14081047..14081049
diff --git a/modules/bs.math/data/bs.math/test/exp2.mcfunction b/modules/bs.math/data/bs.math/test/exp2.mcfunction
new file mode 100644
index 0000000000..f558721a62
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/exp2.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:in math.exp2.x set value 3.0
+function #bs.math:exp2
+execute store result score #r bs.ctx run data get storage bs:out math.exp2 10000
+assert score #r bs.ctx matches 80000..80000
+
+data modify storage bs:in math.exp2.x set value 7.25
+function #bs.math:exp2
+execute store result score #r bs.ctx run data get storage bs:out math.exp2 10000
+assert score #r bs.ctx matches 1522184..1522186
diff --git a/modules/bs.math/data/bs.math/test/factorial.mcfunction b/modules/bs.math/data/bs.math/test/factorial.mcfunction
new file mode 100644
index 0000000000..402a69a0c9
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/factorial.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $math.factorial.n bs.in 3
+function #bs.math:factorial
+assert score $math.factorial bs.out matches 6
+
+scoreboard players set $math.factorial.n bs.in 11
+function #bs.math:factorial
+assert score $math.factorial bs.out matches 39916800
diff --git a/modules/bs.math/data/bs.math/test/frexp.mcfunction b/modules/bs.math/data/bs.math/test/frexp.mcfunction
new file mode 100644
index 0000000000..1e39de14b1
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/frexp.mcfunction
@@ -0,0 +1,28 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:in math.frexp.x set value 5.8
+function #bs.math:frexp
+execute store result score #e bs.ctx run data get storage bs:out math.frexp.e
+execute store result score #x bs.ctx run data get storage bs:out math.frexp.x 1000
+assert score #e bs.ctx matches 3
+assert score #x bs.ctx matches 725
+
+data modify storage bs:in math.frexp.x set value 18238123421.42
+function #bs.math:frexp
+execute store result score #e bs.ctx run data get storage bs:out math.frexp.e
+execute store result score #x bs.ctx run data get storage bs:out math.frexp.x 100000000
+assert score #e bs.ctx matches 35
+assert score #x bs.ctx matches 53079924..53079926
diff --git a/modules/bs.math/data/bs.math/test/gcd.mcfunction b/modules/bs.math/data/bs.math/test/gcd.mcfunction
new file mode 100644
index 0000000000..5f2479bf4c
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/gcd.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $math.gcd.a bs.in 16
+scoreboard players set $math.gcd.b bs.in 12
+function #bs.math:gcd
+assert score $math.gcd bs.out matches 4
+
+scoreboard players set $math.gcd.a bs.in 56616
+scoreboard players set $math.gcd.b bs.in 1568
+function #bs.math:gcd
+assert score $math.gcd bs.out matches 56
diff --git a/modules/bs.math/data/bs.math/test/ipow.mcfunction b/modules/bs.math/data/bs.math/test/ipow.mcfunction
new file mode 100644
index 0000000000..7f7ae84240
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/ipow.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $math.ipow.x bs.in 12
+scoreboard players set $math.ipow.y bs.in 7
+function #bs.math:ipow
+assert score $math.ipow bs.out matches 35831808
+
+scoreboard players set $math.ipow.x bs.in 42
+scoreboard players set $math.ipow.y bs.in 3
+function #bs.math:ipow
+assert score $math.ipow bs.out matches 74088
diff --git a/modules/bs.math/data/bs.math/test/isqrt.mcfunction b/modules/bs.math/data/bs.math/test/isqrt.mcfunction
new file mode 100644
index 0000000000..000dbd9e4c
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/isqrt.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $math.isqrt.x bs.in 49
+function #bs.math:isqrt
+assert score $math.isqrt bs.out matches 7
+
+scoreboard players set $math.isqrt.x bs.in 48
+function #bs.math:isqrt
+assert score $math.isqrt bs.out matches 6
diff --git a/modules/bs.math/data/bs.math/test/ldexp.mcfunction b/modules/bs.math/data/bs.math/test/ldexp.mcfunction
new file mode 100644
index 0000000000..30cec6e44c
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/ldexp.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:in math.ldexp set value {x:.652,e:-3}
+function #bs.math:ldexp
+execute store result score #r bs.ctx run data get storage bs:out math.ldexp 10000
+assert score #r bs.ctx matches 814..816
+
+data modify storage bs:in math.ldexp set value {x:-.725,e:3}
+function #bs.math:ldexp
+execute store result score #r bs.ctx run data get storage bs:out math.ldexp
+assert score #r bs.ctx matches -6
+
+data modify storage bs:in math.ldexp set value {x:.85,e:11}
+function #bs.math:ldexp
+execute store result score #r bs.ctx run data get storage bs:out math.ldexp 10000
+assert score #r bs.ctx matches 17407999..17408001
diff --git a/modules/bs.math/data/bs.math/test/log.mcfunction b/modules/bs.math/data/bs.math/test/log.mcfunction
new file mode 100644
index 0000000000..ec96f21759
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/log.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:in math.log.x set value 28.0
+function #bs.math:log
+execute store result score #r bs.ctx run data get storage bs:out math.log 100000
+assert score #r bs.ctx matches 333219..333221
+
+data modify storage bs:in math.log.x set value 123456789.0
+function #bs.math:log
+execute store result score #r bs.ctx run data get storage bs:out math.log 100000
+assert score #r bs.ctx matches 1863139..1863141
+
+data modify storage bs:in math.log.x set value 1234.4321
+function #bs.math:log
+execute store result score #r bs.ctx run data get storage bs:out math.log 100000
+assert score #r bs.ctx matches 711835..711837
diff --git a/modules/bs.math/data/bs.math/test/log10.mcfunction b/modules/bs.math/data/bs.math/test/log10.mcfunction
new file mode 100644
index 0000000000..7c5d9d81bf
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/log10.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:in math.log10.x set value 28.0
+function #bs.math:log10
+execute store result score #r bs.ctx run data get storage bs:out math.log10 100000
+assert score #r bs.ctx matches 144714..144716
+
+data modify storage bs:in math.log10.x set value 123456789.0
+function #bs.math:log10
+execute store result score #r bs.ctx run data get storage bs:out math.log10 100000
+assert score #r bs.ctx matches 809150..809152
+
+data modify storage bs:in math.log10.x set value 1234.4321
+function #bs.math:log10
+execute store result score #r bs.ctx run data get storage bs:out math.log10 100000
+assert score #r bs.ctx matches 309145..309147
diff --git a/modules/bs.math/data/bs.math/test/log2.mcfunction b/modules/bs.math/data/bs.math/test/log2.mcfunction
new file mode 100644
index 0000000000..f47ca3164f
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/log2.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:in math.log2.x set value 28.0
+function #bs.math:log2
+execute store result score #r bs.ctx run data get storage bs:out math.log2 100000
+assert score #r bs.ctx matches 480734..480736
+
+data modify storage bs:in math.log2.x set value 123456789.0
+function #bs.math:log2
+execute store result score #r bs.ctx run data get storage bs:out math.log2 100000
+assert score #r bs.ctx matches 2687942..2687944
+
+data modify storage bs:in math.log2.x set value 1234.4321
+function #bs.math:log2
+execute store result score #r bs.ctx run data get storage bs:out math.log2 100000
+assert score #r bs.ctx matches 1026962..1026964
diff --git a/modules/bs.math/data/bs.math/test/loga.mcfunction b/modules/bs.math/data/bs.math/test/loga.mcfunction
new file mode 100644
index 0000000000..ae40e2bcfe
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/loga.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:in math.loga set value {x:28.0,a:5}
+function #bs.math:loga
+execute store result score #r bs.ctx run data get storage bs:out math.loga 10000
+assert score #r bs.ctx matches 20703..20705
+
+data modify storage bs:in math.loga set value {x:123456789.0,a:3}
+function #bs.math:loga
+execute store result score #r bs.ctx run data get storage bs:out math.loga 10000
+assert score #r bs.ctx matches 169589..169591
+
+data modify storage bs:in math.loga set value {x:1234.4321,a:9}
+function #bs.math:loga
+execute store result score #r bs.ctx run data get storage bs:out math.loga 10000
+assert score #r bs.ctx matches 32396..32398
diff --git a/modules/bs.math/data/bs.math/test/pow.mcfunction b/modules/bs.math/data/bs.math/test/pow.mcfunction
new file mode 100644
index 0000000000..3b9017173f
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/pow.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:in math.pow set value {x:3.5,y:5}
+function #bs.math:pow
+execute store result score #r bs.ctx run data get storage bs:out math.pow 1000
+assert score #r bs.ctx matches 525217..525219
+
+data modify storage bs:in math.pow set value {x:18.125,y:2.5}
+function #bs.math:pow
+execute store result score #r bs.ctx run data get storage bs:out math.pow 1000
+assert score #r bs.ctx matches 1398603..1398605
+
+data modify storage bs:in math.pow set value {x:49,y:.5}
+function #bs.math:pow
+execute store result score #r bs.ctx run data get storage bs:out math.pow 1000
+assert score #r bs.ctx matches 6999..7001
diff --git a/modules/bs.math/data/bs.math/test/sin.mcfunction b/modules/bs.math/data/bs.math/test/sin.mcfunction
new file mode 100644
index 0000000000..0fd9086aec
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/sin.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $math.sin.x bs.in 6442
+function #bs.math:sin
+assert score $math.sin bs.out matches 900..902
+
+scoreboard players set $math.sin.x bs.in -21513
+function #bs.math:sin
+assert score $math.sin bs.out matches 574..576
diff --git a/modules/bs.math/data/bs.math/test/sincos.mcfunction b/modules/bs.math/data/bs.math/test/sincos.mcfunction
new file mode 100644
index 0000000000..5f466a228e
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/sincos.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $math.sincos.x bs.in 6442
+function #bs.math:sincos
+assert score $math.sincos.cos bs.out matches 430..432
+assert score $math.sincos.sin bs.out matches 900..902
+
+scoreboard players set $math.sincos.x bs.in -21513
+function #bs.math:sincos
+assert score $math.sincos.cos bs.out matches -818..-816
+assert score $math.sincos.sin bs.out matches 574..576
diff --git a/modules/bs.math/data/bs.math/test/sqrt.mcfunction b/modules/bs.math/data/bs.math/test/sqrt.mcfunction
new file mode 100644
index 0000000000..c0303eef3c
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/sqrt.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:in math.sqrt.x set value 1234.56789
+function #bs.math:sqrt
+execute store result score #r bs.ctx run data get storage bs:out math.sqrt 100000
+assert score #r bs.ctx matches 3513640..3513642
+
+data modify storage bs:in math.sqrt.x set value 98765.56789
+function #bs.math:sqrt
+execute store result score #r bs.ctx run data get storage bs:out math.sqrt 100000
+assert score #r bs.ctx matches 31426988..31426990
diff --git a/modules/bs.math/data/bs.math/test/tan.mcfunction b/modules/bs.math/data/bs.math/test/tan.mcfunction
new file mode 100644
index 0000000000..bba354a2a7
--- /dev/null
+++ b/modules/bs.math/data/bs.math/test/tan.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $math.tan.x bs.in 4250
+function #bs.math:tan
+assert score $math.tan bs.out matches 915..917
+
+scoreboard players set $math.tan.x bs.in -21513
+function #bs.math:tan
+assert score $math.tan bs.out matches -704..-702
diff --git a/modules/bs.math/module.json b/modules/bs.math/module.json
new file mode 100644
index 0000000000..0ef3dc76a6
--- /dev/null
+++ b/modules/bs.math/module.json
@@ -0,0 +1,14 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.math",
+ "load": "."
+ },
+ "meta": {
+ "name": "Math",
+ "slug": "bookshelf-math",
+ "description": "The beatifull world of mathematics… in Minecraft!",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/math.html",
+ "tags": ["default"]
+ }
+}
diff --git a/modules/bs.move/README.md b/modules/bs.move/README.md
new file mode 100644
index 0000000000..033735fdcb
--- /dev/null
+++ b/modules/bs.move/README.md
@@ -0,0 +1,14 @@
+# 🏃 Bookshelf Move
+
+This datapack gives you precise control over entity movement, allowing you to make them move exactly the way you want.
+
+> “There is nothing permanent except change.”
+>
+> -- Heraclitus
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/move.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.move/data/bs.move/function/__load__.mcfunction b/modules/bs.move/data/bs.move/function/__load__.mcfunction
new file mode 100644
index 0000000000..30932614ea
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/__load__.mcfunction
@@ -0,0 +1,36 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+forceload add -30000000 1600
+execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
+
+scoreboard objectives add bs.in dummy [{"text":"BS ","color":"dark_gray"},{"text":"Input","color":"aqua"}]
+scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
+scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+scoreboard objectives add bs.vel.x dummy [{"text":"BS ","color":"dark_gray"},{"text":"Velocity X","color":"aqua"}]
+scoreboard objectives add bs.vel.y dummy [{"text":"BS ","color":"dark_gray"},{"text":"Velocity Y","color":"aqua"}]
+scoreboard objectives add bs.vel.z dummy [{"text":"BS ","color":"dark_gray"},{"text":"Velocity Z","color":"aqua"}]
+
+scoreboard players set -10000000 bs.const -10000000
+scoreboard players set -10000 bs.const -10000
+scoreboard players set -1000 bs.const -1000
+scoreboard players set -2 bs.const -2
+scoreboard players set -1 bs.const -1
+scoreboard players set 2 bs.const 2
+scoreboard players set 500 bs.const 500
+scoreboard players set 1000 bs.const 1000
+scoreboard players set 10000 bs.const 10000
+scoreboard players set 10000000 bs.const 10000000
diff --git a/modules/bs.move/data/bs.move/function/__unload__.mcfunction b/modules/bs.move/data/bs.move/function/__unload__.mcfunction
new file mode 100644
index 0000000000..0a206e3f66
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/__unload__.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+kill B5-0-0-0-1
+forceload remove -30000000 1600
+
+scoreboard objectives remove bs.in
+scoreboard objectives remove bs.data
+scoreboard objectives remove bs.const
+scoreboard objectives remove bs.ctx
+scoreboard objectives remove bs.vel.x
+scoreboard objectives remove bs.vel.y
+scoreboard objectives remove bs.vel.z
+
+data remove storage bs:data move
diff --git a/modules/bs.move/data/bs.move/function/collision/check/block/any.mcfunction b/modules/bs.move/data/bs.move/function/collision/check/block/any.mcfunction
new file mode 100644
index 0000000000..5f8c72eea6
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/check/block/any.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute unless block ~ ~ ~ #bs.hitbox:is_composite run return run function bs.move:collision/check/block/cube
+
+function #bs.hitbox:get_block
+execute store result score #move.ox bs.data run data get storage bs:out hitbox.offset.x 10000000
+execute store result score #move.oz bs.data run data get storage bs:out hitbox.offset.z 10000000
+scoreboard players operation #move.ox bs.data += #move.x bs.data
+scoreboard players operation #move.oz bs.data += #move.z bs.data
+function bs.move:collision/check/block/shape
diff --git a/modules/bs.move/data/bs.move/function/collision/check/block/cube.mcfunction b/modules/bs.move/data/bs.move/function/collision/check/block/cube.mcfunction
new file mode 100644
index 0000000000..fd8745ee5e
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/check/block/cube.mcfunction
@@ -0,0 +1,54 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# get cube hitbox coordinates
+execute store result score #i bs.ctx run scoreboard players operation #x bs.ctx = #move.x bs.data
+execute store result score #j bs.ctx run scoreboard players operation #y bs.ctx = #move.y bs.data
+execute store result score #k bs.ctx run scoreboard players operation #z bs.ctx = #move.z bs.data
+scoreboard players add #i bs.ctx 10000000
+scoreboard players add #j bs.ctx 10000000
+scoreboard players add #k bs.ctx 10000000
+
+# add the moving entity size to the hitbox
+scoreboard players operation #x bs.ctx -= #move.w bs.data
+scoreboard players operation #y bs.ctx -= #move.h bs.data
+scoreboard players operation #z bs.ctx -= #move.w bs.data
+scoreboard players operation #i bs.ctx += #move.w bs.data
+scoreboard players operation #k bs.ctx += #move.w bs.data
+
+# when step is negative, points are negative so we get the absolute value
+scoreboard players operation #x bs.ctx /= #move.vx bs.data
+scoreboard players operation #i bs.ctx /= #move.vx bs.data
+scoreboard players operation #y bs.ctx /= #move.vy bs.data
+scoreboard players operation #j bs.ctx /= #move.vy bs.data
+scoreboard players operation #z bs.ctx /= #move.vz bs.data
+scoreboard players operation #k bs.ctx /= #move.vz bs.data
+
+# when step is negative we need to reverse near and far points
+execute if score #move.vx bs.data matches ..-1 run scoreboard players operation #x bs.ctx >< #i bs.ctx
+execute if score #move.vy bs.data matches ..-1 run scoreboard players operation #y bs.ctx >< #j bs.ctx
+execute if score #move.vz bs.data matches ..-1 run scoreboard players operation #z bs.ctx >< #k bs.ctx
+
+# compute near and far points for AABB collision
+scoreboard players operation #x bs.ctx > #y bs.ctx
+scoreboard players operation #x bs.ctx > #z bs.ctx
+scoreboard players operation #i bs.ctx < #j bs.ctx
+scoreboard players operation #i bs.ctx < #k bs.ctx
+
+# if min_x <= max_x, ray is intersecting with AABB, if max_x < 0, ray is intersecting AABB, but the whole AABB is behind
+execute if score #i bs.ctx matches 0.. \
+ if score #x bs.ctx <= #i bs.ctx \
+ if score #move.ctime bs.data > #x bs.ctx \
+ run function bs.move:collision/collide
diff --git a/modules/bs.move/data/bs.move/function/collision/check/block/shape.mcfunction b/modules/bs.move/data/bs.move/function/collision/check/block/shape.mcfunction
new file mode 100644
index 0000000000..b58c144643
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/check/block/shape.mcfunction
@@ -0,0 +1,65 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# get hitbox coordinates
+execute store result score #x bs.ctx run data get storage bs:out hitbox.shape[-1][0] 625000
+execute store result score #y bs.ctx run data get storage bs:out hitbox.shape[-1][1] 625000
+execute store result score #z bs.ctx run data get storage bs:out hitbox.shape[-1][2] 625000
+execute store result score #i bs.ctx run data get storage bs:out hitbox.shape[-1][3] 625000
+execute store result score #j bs.ctx run data get storage bs:out hitbox.shape[-1][4] 625000
+execute store result score #k bs.ctx run data get storage bs:out hitbox.shape[-1][5] 625000
+data remove storage bs:out hitbox.shape[-1]
+
+# add the relative coordinates to the hitbox
+scoreboard players operation #x bs.ctx += #move.ox bs.data
+scoreboard players operation #y bs.ctx += #move.y bs.data
+scoreboard players operation #z bs.ctx += #move.oz bs.data
+scoreboard players operation #i bs.ctx += #move.ox bs.data
+scoreboard players operation #j bs.ctx += #move.y bs.data
+scoreboard players operation #k bs.ctx += #move.oz bs.data
+
+# add the moving entity size to the hitbox
+scoreboard players operation #x bs.ctx -= #move.w bs.data
+scoreboard players operation #y bs.ctx -= #move.h bs.data
+scoreboard players operation #z bs.ctx -= #move.w bs.data
+scoreboard players operation #i bs.ctx += #move.w bs.data
+scoreboard players operation #k bs.ctx += #move.w bs.data
+
+# when step is negative, points are negative so we get the absolute value
+scoreboard players operation #x bs.ctx /= #move.vx bs.data
+scoreboard players operation #i bs.ctx /= #move.vx bs.data
+scoreboard players operation #y bs.ctx /= #move.vy bs.data
+scoreboard players operation #j bs.ctx /= #move.vy bs.data
+scoreboard players operation #z bs.ctx /= #move.vz bs.data
+scoreboard players operation #k bs.ctx /= #move.vz bs.data
+
+# when step is negative we need to reverse near and far points
+execute if score #move.vx bs.data matches ..-1 run scoreboard players operation #x bs.ctx >< #i bs.ctx
+execute if score #move.vy bs.data matches ..-1 run scoreboard players operation #y bs.ctx >< #j bs.ctx
+execute if score #move.vz bs.data matches ..-1 run scoreboard players operation #z bs.ctx >< #k bs.ctx
+
+# compute near and far points for AABB collision
+scoreboard players operation #x bs.ctx > #y bs.ctx
+scoreboard players operation #x bs.ctx > #z bs.ctx
+scoreboard players operation #i bs.ctx < #j bs.ctx
+scoreboard players operation #i bs.ctx < #k bs.ctx
+
+# if min_x <= max_x, ray is intersecting with AABB, if max_x < 0, ray is intersecting AABB, but the whole AABB is behind
+execute if score #i bs.ctx matches 0.. \
+ if score #x bs.ctx <= #i bs.ctx \
+ if score #move.ctime bs.data > #x bs.ctx \
+ run function bs.move:collision/collide
+
+execute if data storage bs:out hitbox.shape[0] run function bs.move:collision/check/block/shape
diff --git a/modules/bs.move/data/bs.move/function/collision/check/entity/any.mcfunction b/modules/bs.move/data/bs.move/function/collision/check/entity/any.mcfunction
new file mode 100644
index 0000000000..e691299d16
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/check/entity/any.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.hitbox:get_entity
+execute if entity @s[type=!#bs.hitbox:is_shaped] run return run function bs.move:collision/check/entity/size
+function bs.move:collision/check/entity/shape
diff --git a/modules/bs.move/data/bs.move/function/collision/check/entity/shape.mcfunction b/modules/bs.move/data/bs.move/function/collision/check/entity/shape.mcfunction
new file mode 100644
index 0000000000..bc054765dc
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/check/entity/shape.mcfunction
@@ -0,0 +1,65 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# get hitbox coordinates
+execute store result score #x bs.ctx run data get storage bs:out hitbox.shape[-1][0] 625000
+execute store result score #y bs.ctx run data get storage bs:out hitbox.shape[-1][1] 625000
+execute store result score #z bs.ctx run data get storage bs:out hitbox.shape[-1][2] 625000
+execute store result score #i bs.ctx run data get storage bs:out hitbox.shape[-1][3] 625000
+execute store result score #j bs.ctx run data get storage bs:out hitbox.shape[-1][4] 625000
+execute store result score #k bs.ctx run data get storage bs:out hitbox.shape[-1][5] 625000
+data remove storage bs:out hitbox.shape[-1]
+
+# add the relative coordinates to the hitbox
+scoreboard players operation #x bs.ctx += #move.x bs.data
+scoreboard players operation #y bs.ctx += #move.y bs.data
+scoreboard players operation #z bs.ctx += #move.z bs.data
+scoreboard players operation #i bs.ctx += #move.x bs.data
+scoreboard players operation #j bs.ctx += #move.y bs.data
+scoreboard players operation #k bs.ctx += #move.z bs.data
+
+# add the moving entity size to the hitbox
+scoreboard players operation #x bs.ctx -= #move.w bs.data
+scoreboard players operation #y bs.ctx -= #move.h bs.data
+scoreboard players operation #z bs.ctx -= #move.w bs.data
+scoreboard players operation #i bs.ctx += #move.w bs.data
+scoreboard players operation #k bs.ctx += #move.w bs.data
+
+# when step is negative, points are negative so we get the absolute value
+scoreboard players operation #x bs.ctx /= #move.vx bs.data
+scoreboard players operation #i bs.ctx /= #move.vx bs.data
+scoreboard players operation #y bs.ctx /= #move.vy bs.data
+scoreboard players operation #j bs.ctx /= #move.vy bs.data
+scoreboard players operation #z bs.ctx /= #move.vz bs.data
+scoreboard players operation #k bs.ctx /= #move.vz bs.data
+
+# when step is negative we need to reverse near and far points
+execute if score #move.vx bs.data matches ..-1 run scoreboard players operation #x bs.ctx >< #i bs.ctx
+execute if score #move.vy bs.data matches ..-1 run scoreboard players operation #y bs.ctx >< #j bs.ctx
+execute if score #move.vz bs.data matches ..-1 run scoreboard players operation #z bs.ctx >< #k bs.ctx
+
+# compute near and far points for AABB collision
+scoreboard players operation #x bs.ctx > #y bs.ctx
+scoreboard players operation #x bs.ctx > #z bs.ctx
+scoreboard players operation #i bs.ctx < #j bs.ctx
+scoreboard players operation #i bs.ctx < #k bs.ctx
+
+# if min_x <= max_x, ray is intersecting with AABB, if max_x < 0, ray is intersecting AABB, but the whole AABB is behind
+execute if score #i bs.ctx matches 0.. \
+ if score #x bs.ctx <= #i bs.ctx \
+ if score #move.ctime bs.data > #x bs.ctx \
+ run function bs.move:collision/collide
+
+execute if data storage bs:out hitbox.shape[0] run function bs.move:collision/check/entity/shape
diff --git a/modules/bs.move/data/bs.move/function/collision/check/entity/size.mcfunction b/modules/bs.move/data/bs.move/function/collision/check/entity/size.mcfunction
new file mode 100644
index 0000000000..7fc7d8340d
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/check/entity/size.mcfunction
@@ -0,0 +1,64 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+tag @s add bs.move.omit
+
+# get the entity relative coordinates
+execute in minecraft:overworld positioned as @s as B5-0-0-0-1 run function bs.move:collision/utils/get_relative_entity_pos with storage bs:data move
+execute store result score #x bs.ctx run data get storage bs:ctx _[0] 10000000
+execute store result score #y bs.ctx run data get storage bs:ctx _[1] 10000000
+execute store result score #z bs.ctx run data get storage bs:ctx _[2] 10000000
+execute store result score #i bs.ctx run scoreboard players operation #x bs.ctx += #move.sx bs.data
+execute store result score #j bs.ctx run scoreboard players operation #y bs.ctx += #move.sy bs.data
+execute store result score #k bs.ctx run scoreboard players operation #z bs.ctx += #move.sz bs.data
+
+# compute the hitbox using the sizes of the collided entity and the moving entity
+execute store result score #h bs.ctx run data get storage bs:out hitbox.height 10000
+execute store result score #w bs.ctx run data get storage bs:out hitbox.width 5000
+execute store result score #s bs.ctx run data get storage bs:out hitbox.scale 1000
+scoreboard players operation #h bs.ctx *= #s bs.ctx
+scoreboard players operation #w bs.ctx *= #s bs.ctx
+scoreboard players operation #w bs.ctx += #move.w bs.data
+scoreboard players operation #x bs.ctx -= #w bs.ctx
+scoreboard players operation #y bs.ctx -= #move.h bs.data
+scoreboard players operation #z bs.ctx -= #w bs.ctx
+scoreboard players operation #i bs.ctx += #w bs.ctx
+scoreboard players operation #j bs.ctx += #h bs.ctx
+scoreboard players operation #k bs.ctx += #w bs.ctx
+
+# when step is negative, points are negative so we get the absolute value
+scoreboard players operation #x bs.ctx /= #move.vx bs.data
+scoreboard players operation #i bs.ctx /= #move.vx bs.data
+scoreboard players operation #y bs.ctx /= #move.vy bs.data
+scoreboard players operation #j bs.ctx /= #move.vy bs.data
+scoreboard players operation #z bs.ctx /= #move.vz bs.data
+scoreboard players operation #k bs.ctx /= #move.vz bs.data
+
+# when step is negative we need to reverse near and far points
+execute if score #move.vx bs.data matches ..-1 run scoreboard players operation #x bs.ctx >< #i bs.ctx
+execute if score #move.vy bs.data matches ..-1 run scoreboard players operation #y bs.ctx >< #j bs.ctx
+execute if score #move.vz bs.data matches ..-1 run scoreboard players operation #z bs.ctx >< #k bs.ctx
+
+# compute near and far points for AABB collision
+scoreboard players operation #x bs.ctx > #y bs.ctx
+scoreboard players operation #x bs.ctx > #z bs.ctx
+scoreboard players operation #i bs.ctx < #j bs.ctx
+scoreboard players operation #i bs.ctx < #k bs.ctx
+
+# if min_x <= max_x, ray is intersecting with AABB, if max_x < 0, ray is intersecting AABB, but the whole AABB is behind
+execute if score #i bs.ctx matches 0.. \
+ if score #x bs.ctx <= #i bs.ctx \
+ if score #move.ctime bs.data > #x bs.ctx \
+ run function bs.move:collision/collide
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/collide.mcfunction b/modules/bs.move/data/bs.move/function/collision/collide.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.move/function/collision/collide.mcfunction
rename to modules/bs.move/data/bs.move/function/collision/collide.mcfunction
index 86c00e46c9..309136f3e9 100644
--- a/datapacks/Bookshelf/data/bs.move/function/collision/collide.mcfunction
+++ b/modules/bs.move/data/bs.move/function/collision/collide.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.move/data/bs.move/function/collision/handle.mcfunction b/modules/bs.move/data/bs.move/function/collision/handle.mcfunction
new file mode 100644
index 0000000000..f60e82c40c
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/handle.mcfunction
@@ -0,0 +1,57 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# get starting position and velocity vector
+data modify storage bs:ctx _ set from entity @s Pos
+execute store result score #move.y bs.data run data get storage bs:ctx _[1] 10000
+execute store result storage bs:data move.x int -1 run data get storage bs:ctx _[0]
+execute store result storage bs:data move.y int -1 run data get storage bs:ctx _[1]
+execute store result storage bs:data move.z int -1 run data get storage bs:ctx _[2]
+execute summon minecraft:marker run function bs.move:collision/utils/get_relative_pos with storage bs:data move
+execute store result score #move.vx bs.data store result score #move.rx bs.data store result score #move.sx bs.data run data get storage bs:ctx _[0] -10000000
+execute store result score #move.vy bs.data store result score #move.ry bs.data store result score #move.sy bs.data run data get storage bs:ctx _[1] -10000000
+execute store result score #move.vz bs.data store result score #move.rz bs.data store result score #move.sz bs.data run data get storage bs:ctx _[2] -10000000
+execute in minecraft:overworld positioned as @s as B5-0-0-0-1 run function bs.move:collision/utils/get_relative_entity_pos with storage bs:data move
+execute store result score #move.nx bs.data run data get storage bs:ctx _[0] -10000000
+execute store result score #move.ny bs.data run data get storage bs:ctx _[1] -10000000
+execute store result score #move.nz bs.data run data get storage bs:ctx _[2] -10000000
+execute store result score #move.nx bs.data run scoreboard players operation #move.vx bs.data -= #move.nx bs.data
+execute store result score #move.ny bs.data run scoreboard players operation #move.vy bs.data -= #move.ny bs.data
+execute store result score #move.nz bs.data run scoreboard players operation #move.vz bs.data -= #move.nz bs.data
+scoreboard players operation #move.rx bs.data %= -10000000 bs.const
+scoreboard players operation #move.ry bs.data %= -10000000 bs.const
+scoreboard players operation #move.rz bs.data %= -10000000 bs.const
+scoreboard players operation #move.vx bs.data /= 10000 bs.const
+scoreboard players operation #move.vy bs.data /= 10000 bs.const
+scoreboard players operation #move.vz bs.data /= 10000 bs.const
+
+# compute a bounding box that encompasses all passengers
+tag @e[tag=bs.move.omit] remove bs.move.omit
+scoreboard players set #move.h bs.data 0
+scoreboard players set #move.w bs.data 0
+function bs.move:collision/utils/get_bounding_box
+
+# check for collisions and resolve them
+scoreboard players set #move.ctime bs.data 10000
+data modify storage bs:data move merge value {sx:"xp",sy:"yp",sz:"zp"}
+execute if score #move.vx bs.data matches ..-1 run data modify storage bs:data move.sx set value "xn"
+execute if score #move.vy bs.data matches ..-1 run data modify storage bs:data move.sy set value "yn"
+execute if score #move.vz bs.data matches ..-1 run data modify storage bs:data move.sz set value "zn"
+execute store result score #move.b bs.data unless data storage bs:data move{blocks:0b}
+execute store result score #move.e bs.data unless data storage bs:data move{entities:0b}
+execute if score #move.e bs.data matches 1 if data storage bs:data move{entities:1b} run data modify storage bs:data move.entities set value "!bs.move.omit"
+execute run function bs.move:collision/recurse/setup/init with storage bs:data move
+execute if score #move.ctime bs.data matches ..-1 run scoreboard players set #move.ctime bs.data 0
+$execute if score #move.ctime bs.data matches 0..9999 run function bs.move:collision/resolvers/any {resolver:$(resolver)}
diff --git a/modules/bs.move/data/bs.move/function/collision/recurse/setup/init.mcfunction b/modules/bs.move/data/bs.move/function/collision/recurse/setup/init.mcfunction
new file mode 100644
index 0000000000..9d5fe5df32
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/recurse/setup/init.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$function bs.move:collision/recurse/setup/$(sx) with storage bs:data move
diff --git a/modules/bs.move/data/bs.move/function/collision/recurse/setup/xn.mcfunction b/modules/bs.move/data/bs.move/function/collision/recurse/setup/xn.mcfunction
new file mode 100644
index 0000000000..782eb38c56
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/recurse/setup/xn.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation #move.nx bs.data -= #move.w bs.data
+scoreboard players remove #move.nx bs.data 10000000
+
+$function bs.move:collision/recurse/setup/$(sy) with storage bs:data move
diff --git a/modules/bs.move/data/bs.move/function/collision/recurse/setup/xp.mcfunction b/modules/bs.move/data/bs.move/function/collision/recurse/setup/xp.mcfunction
new file mode 100644
index 0000000000..879b7a1721
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/recurse/setup/xp.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation #move.nx bs.data += #move.w bs.data
+
+$function bs.move:collision/recurse/setup/$(sy) with storage bs:data move
diff --git a/modules/bs.move/data/bs.move/function/collision/recurse/setup/yn.mcfunction b/modules/bs.move/data/bs.move/function/collision/recurse/setup/yn.mcfunction
new file mode 100644
index 0000000000..73b3d48533
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/recurse/setup/yn.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players remove #move.ny bs.data 10000000
+
+$function bs.move:collision/recurse/setup/$(sz) with storage bs:data move
diff --git a/modules/bs.move/data/bs.move/function/collision/recurse/setup/yp.mcfunction b/modules/bs.move/data/bs.move/function/collision/recurse/setup/yp.mcfunction
new file mode 100644
index 0000000000..6630c294fc
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/recurse/setup/yp.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation #move.ny bs.data += #move.h bs.data
+
+$function bs.move:collision/recurse/setup/$(sz) with storage bs:data move
diff --git a/modules/bs.move/data/bs.move/function/collision/recurse/setup/zn.mcfunction b/modules/bs.move/data/bs.move/function/collision/recurse/setup/zn.mcfunction
new file mode 100644
index 0000000000..220a8d330f
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/recurse/setup/zn.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation #move.nz bs.data -= #move.w bs.data
+scoreboard players remove #move.nz bs.data 10000000
+
+scoreboard players operation #move.x bs.data = #move.rx bs.data
+$function bs.move:collision/recurse/$(sx) with storage bs:data move
diff --git a/modules/bs.move/data/bs.move/function/collision/recurse/setup/zp.mcfunction b/modules/bs.move/data/bs.move/function/collision/recurse/setup/zp.mcfunction
new file mode 100644
index 0000000000..325fea8e3b
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/recurse/setup/zp.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation #move.nz bs.data += #move.w bs.data
+
+scoreboard players operation #move.x bs.data = #move.rx bs.data
+$execute align xyz run function bs.move:collision/recurse/$(sx) with storage bs:data move
diff --git a/modules/bs.move/data/bs.move/function/collision/recurse/xn.mcfunction b/modules/bs.move/data/bs.move/function/collision/recurse/xn.mcfunction
new file mode 100644
index 0000000000..411f94aa15
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/recurse/xn.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation #move.y bs.data = #move.ry bs.data
+$function bs.move:collision/recurse/$(sy) with storage bs:data move
+
+scoreboard players remove #move.x bs.data 10000000
+execute if score #move.x bs.data >= #move.nx bs.data positioned ~-1 ~ ~ run function bs.move:collision/recurse/xn with storage bs:data move
diff --git a/modules/bs.move/data/bs.move/function/collision/recurse/xp.mcfunction b/modules/bs.move/data/bs.move/function/collision/recurse/xp.mcfunction
new file mode 100644
index 0000000000..00520b3d08
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/recurse/xp.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation #move.y bs.data = #move.ry bs.data
+$function bs.move:collision/recurse/$(sy) with storage bs:data move
+
+scoreboard players add #move.x bs.data 10000000
+execute if score #move.x bs.data <= #move.nx bs.data positioned ~1 ~ ~ run function bs.move:collision/recurse/xp with storage bs:data move
diff --git a/modules/bs.move/data/bs.move/function/collision/recurse/yn.mcfunction b/modules/bs.move/data/bs.move/function/collision/recurse/yn.mcfunction
new file mode 100644
index 0000000000..07cf4a6a59
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/recurse/yn.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation #move.z bs.data = #move.rz bs.data
+$function bs.move:collision/recurse/$(sz) with storage bs:data move
+
+scoreboard players remove #move.y bs.data 10000000
+execute if score #move.y bs.data >= #move.ny bs.data positioned ~ ~-1 ~ run function bs.move:collision/recurse/yn with storage bs:data move
diff --git a/modules/bs.move/data/bs.move/function/collision/recurse/yp.mcfunction b/modules/bs.move/data/bs.move/function/collision/recurse/yp.mcfunction
new file mode 100644
index 0000000000..3f26132f29
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/recurse/yp.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation #move.z bs.data = #move.rz bs.data
+$function bs.move:collision/recurse/$(sz) with storage bs:data move
+
+scoreboard players add #move.y bs.data 10000000
+execute if score #move.y bs.data <= #move.ny bs.data positioned ~ ~1 ~ run function bs.move:collision/recurse/yp with storage bs:data move
diff --git a/modules/bs.move/data/bs.move/function/collision/recurse/zn.mcfunction b/modules/bs.move/data/bs.move/function/collision/recurse/zn.mcfunction
new file mode 100644
index 0000000000..78e7b8767e
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/recurse/zn.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute if score #move.b bs.data matches 1 unless block ~ ~ ~ $(ignored_blocks) run function bs.move:collision/check/block/any
+$execute if score #move.e bs.data matches 1 as @e[type=!$(ignored_entities),tag=$(entities),tag=!bs.move.omit,dx=0] run function bs.move:collision/check/entity/any
+
+scoreboard players remove #move.z bs.data 10000000
+execute if score #move.z bs.data >= #move.nz bs.data positioned ~ ~ ~-1 run function bs.move:collision/recurse/zn with storage bs:data move
diff --git a/modules/bs.move/data/bs.move/function/collision/recurse/zp.mcfunction b/modules/bs.move/data/bs.move/function/collision/recurse/zp.mcfunction
new file mode 100644
index 0000000000..376fb7a0b5
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/recurse/zp.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute if score #move.b bs.data matches 1 unless block ~ ~ ~ $(ignored_blocks) run function bs.move:collision/check/block/any
+$execute if score #move.e bs.data matches 1 as @e[type=!$(ignored_entities),tag=$(entities),tag=!bs.move.omit,dx=0] run function bs.move:collision/check/entity/any
+
+scoreboard players add #move.z bs.data 10000000
+execute if score #move.z bs.data <= #move.nz bs.data positioned ~ ~ ~1 run function bs.move:collision/recurse/zp with storage bs:data move
diff --git a/modules/bs.move/data/bs.move/function/collision/resolvers/any.mcfunction b/modules/bs.move/data/bs.move/function/collision/resolvers/any.mcfunction
new file mode 100644
index 0000000000..223d7ce0a4
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/resolvers/any.mcfunction
@@ -0,0 +1,28 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players remove #move.ctime bs.data 10000
+scoreboard players operation #move.ctime bs.data *= -1 bs.const
+execute store result score $move.vel_remaining.x bs.data run scoreboard players operation #move.vx bs.data *= #move.ctime bs.data
+execute store result score $move.vel_remaining.y bs.data run scoreboard players operation #move.vy bs.data *= #move.ctime bs.data
+execute store result score $move.vel_remaining.z bs.data run scoreboard players operation #move.vz bs.data *= #move.ctime bs.data
+execute if score #move.vx bs.data matches 0.. store result storage bs:ctx x double -.0000001 run scoreboard players add #move.vx bs.data 1
+execute if score #move.vy bs.data matches 0.. store result storage bs:ctx y double -.0000001 run scoreboard players add #move.vy bs.data 1
+execute if score #move.vz bs.data matches 0.. store result storage bs:ctx z double -.0000001 run scoreboard players add #move.vz bs.data 1
+execute if score #move.vx bs.data matches ..-1 store result storage bs:ctx x double -.0000001 run scoreboard players remove #move.vx bs.data 1
+execute if score #move.vy bs.data matches ..-1 store result storage bs:ctx y double -.0000001 run scoreboard players remove #move.vy bs.data 1
+execute if score #move.vz bs.data matches ..-1 store result storage bs:ctx z double -.0000001 run scoreboard players remove #move.vz bs.data 1
+execute at @s run function bs.move:collision/utils/tp_relative with storage bs:ctx
+$function bs.move:collision/resolvers/$(resolver) with storage bs:data move
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/behaviors/bounce.mcfunction b/modules/bs.move/data/bs.move/function/collision/resolvers/behaviors/bounce.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.move/function/collision/resolvers/behaviors/bounce.mcfunction
rename to modules/bs.move/data/bs.move/function/collision/resolvers/behaviors/bounce.mcfunction
index ecd6b39238..9eef702fac 100644
--- a/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/behaviors/bounce.mcfunction
+++ b/modules/bs.move/data/bs.move/function/collision/resolvers/behaviors/bounce.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/behaviors/damped_bounce.mcfunction b/modules/bs.move/data/bs.move/function/collision/resolvers/behaviors/damped_bounce.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.move/function/collision/resolvers/behaviors/damped_bounce.mcfunction
rename to modules/bs.move/data/bs.move/function/collision/resolvers/behaviors/damped_bounce.mcfunction
index 4327bde5e8..7b70041ec5 100644
--- a/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/behaviors/damped_bounce.mcfunction
+++ b/modules/bs.move/data/bs.move/function/collision/resolvers/behaviors/damped_bounce.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/behaviors/slide.mcfunction b/modules/bs.move/data/bs.move/function/collision/resolvers/behaviors/slide.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.move/function/collision/resolvers/behaviors/slide.mcfunction
rename to modules/bs.move/data/bs.move/function/collision/resolvers/behaviors/slide.mcfunction
index 835dd8e069..cd98040ba8 100644
--- a/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/behaviors/slide.mcfunction
+++ b/modules/bs.move/data/bs.move/function/collision/resolvers/behaviors/slide.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/behaviors/stick.mcfunction b/modules/bs.move/data/bs.move/function/collision/resolvers/behaviors/stick.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.move/function/collision/resolvers/behaviors/stick.mcfunction
rename to modules/bs.move/data/bs.move/function/collision/resolvers/behaviors/stick.mcfunction
index acd82f1d73..3d1f8dc519 100644
--- a/datapacks/Bookshelf/data/bs.move/function/collision/resolvers/behaviors/stick.mcfunction
+++ b/modules/bs.move/data/bs.move/function/collision/resolvers/behaviors/stick.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.move/data/bs.move/function/collision/resolvers/canonical.mcfunction b/modules/bs.move/data/bs.move/function/collision/resolvers/canonical.mcfunction
new file mode 100644
index 0000000000..6eac946800
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/resolvers/canonical.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# resolve collision using the on_collision callback
+$function $(on_collision)
+execute store result storage bs:ctx x double .0000001 run scoreboard players get $move.vel_remaining.x bs.data
+execute store result storage bs:ctx y double .0000001 run scoreboard players get $move.vel_remaining.y bs.data
+execute store result storage bs:ctx z double .0000001 run scoreboard players get $move.vel_remaining.z bs.data
+execute unless data storage bs:ctx {x:0d,y:0d,z:0d} at @s run function bs.move:teleport/canonical/run with storage bs:ctx
diff --git a/modules/bs.move/data/bs.move/function/collision/resolvers/local.mcfunction b/modules/bs.move/data/bs.move/function/collision/resolvers/local.mcfunction
new file mode 100644
index 0000000000..073333a366
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/resolvers/local.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# resolve collision using the on_collision callback (ensure the velocity vector is in canonical space for simpler transformation)
+execute rotated as @s run function #bs.move:local_to_canonical
+$function $(on_collision)
+execute store result storage bs:ctx x double .0000001 run scoreboard players get $move.vel_remaining.x bs.data
+execute store result storage bs:ctx y double .0000001 run scoreboard players get $move.vel_remaining.y bs.data
+execute store result storage bs:ctx z double .0000001 run scoreboard players get $move.vel_remaining.z bs.data
+execute unless data storage bs:ctx {x:0d,y:0d,z:0d} at @s run function bs.move:teleport/canonical/run with storage bs:ctx
+execute rotated as @s run function #bs.move:canonical_to_local
diff --git a/modules/bs.move/data/bs.move/function/collision/resolvers/run.mcfunction b/modules/bs.move/data/bs.move/function/collision/resolvers/run.mcfunction
new file mode 100644
index 0000000000..cdd8ec6d8c
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/resolvers/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$function $(on_collision)
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/utils/get_bounding_box.mcfunction b/modules/bs.move/data/bs.move/function/collision/utils/get_bounding_box.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.move/function/collision/utils/get_bounding_box.mcfunction
rename to modules/bs.move/data/bs.move/function/collision/utils/get_bounding_box.mcfunction
index 4c825f0cf3..7579bc78e4 100644
--- a/datapacks/Bookshelf/data/bs.move/function/collision/utils/get_bounding_box.mcfunction
+++ b/modules/bs.move/data/bs.move/function/collision/utils/get_bounding_box.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/utils/get_relative_entity_pos.mcfunction b/modules/bs.move/data/bs.move/function/collision/utils/get_relative_entity_pos.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.move/function/collision/utils/get_relative_entity_pos.mcfunction
rename to modules/bs.move/data/bs.move/function/collision/utils/get_relative_entity_pos.mcfunction
index 13fa35393f..c415213280 100644
--- a/datapacks/Bookshelf/data/bs.move/function/collision/utils/get_relative_entity_pos.mcfunction
+++ b/modules/bs.move/data/bs.move/function/collision/utils/get_relative_entity_pos.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.move/data/bs.move/function/collision/utils/get_relative_pos.mcfunction b/modules/bs.move/data/bs.move/function/collision/utils/get_relative_pos.mcfunction
new file mode 100644
index 0000000000..fa5be0fee7
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/collision/utils/get_relative_pos.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$tp @s ~$(x) ~$(y) ~$(z)
+data modify storage bs:ctx _ set from entity @s Pos
+kill @s
diff --git a/datapacks/Bookshelf/data/bs.move/function/collision/utils/tp_relative.mcfunction b/modules/bs.move/data/bs.move/function/collision/utils/tp_relative.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.move/function/collision/utils/tp_relative.mcfunction
rename to modules/bs.move/data/bs.move/function/collision/utils/tp_relative.mcfunction
index 6409a1e85e..86275991e9 100644
--- a/datapacks/Bookshelf/data/bs.move/function/collision/utils/tp_relative.mcfunction
+++ b/modules/bs.move/data/bs.move/function/collision/utils/tp_relative.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.move/data/bs.move/function/convert/canonical_to_local/canonical_to_local.mcfunction b/modules/bs.move/data/bs.move/function/convert/canonical_to_local/canonical_to_local.mcfunction
new file mode 100644
index 0000000000..56cc86293a
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/convert/canonical_to_local/canonical_to_local.mcfunction
@@ -0,0 +1,49 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# sincos(h: Phi) & sincos(v: Theta)
+execute in minecraft:overworld as B5-0-0-0-1 run function bs.move:convert/canonical_to_local/sincos
+
+# X' = Z * sin(h) + X * cos(h)
+scoreboard players operation #x bs.ctx = @s bs.vel.z
+scoreboard players operation #x bs.ctx *= #j bs.ctx
+scoreboard players operation #t bs.ctx = @s bs.vel.x
+scoreboard players operation #t bs.ctx *= #i bs.ctx
+scoreboard players operation #x bs.ctx += #t bs.ctx
+scoreboard players operation #x bs.ctx /= 1000 bs.const
+
+# Y' = (z * cos(h) - x * sin(h)) * sin(v) + y * cos(v)
+scoreboard players operation #y bs.ctx = @s bs.vel.z
+scoreboard players operation #y bs.ctx *= #i bs.ctx
+scoreboard players operation #t bs.ctx = @s bs.vel.x
+scoreboard players operation #t bs.ctx *= #j bs.ctx
+scoreboard players operation #y bs.ctx -= #t bs.ctx
+execute store result score #z bs.ctx run scoreboard players operation #y bs.ctx /= 1000 bs.const
+scoreboard players operation #y bs.ctx *= #l bs.ctx
+scoreboard players operation #t bs.ctx = @s bs.vel.y
+scoreboard players operation #t bs.ctx *= #k bs.ctx
+scoreboard players operation #y bs.ctx += #t bs.ctx
+scoreboard players operation #y bs.ctx /= 1000 bs.const
+
+# Z' = (z * cos(h) - x * sin(h)) * cos(v) - y * sin(v)
+scoreboard players operation #z bs.ctx *= #k bs.ctx
+scoreboard players operation #t bs.ctx = @s bs.vel.y
+scoreboard players operation #t bs.ctx *= #l bs.ctx
+scoreboard players operation #z bs.ctx -= #t bs.ctx
+scoreboard players operation #z bs.ctx /= 1000 bs.const
+
+scoreboard players operation @s bs.vel.x = #x bs.ctx
+scoreboard players operation @s bs.vel.y = #y bs.ctx
+scoreboard players operation @s bs.vel.z = #z bs.ctx
diff --git a/modules/bs.move/data/bs.move/function/convert/canonical_to_local/sincos.mcfunction b/modules/bs.move/data/bs.move/function/convert/canonical_to_local/sincos.mcfunction
new file mode 100644
index 0000000000..2d09cef2b9
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/convert/canonical_to_local/sincos.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute positioned 0.0 0.0 0.0 rotated ~ 0.0 run tp @s ^ ^ ^10.0
+execute store result score #i bs.ctx run data get entity @s Pos[2] 100
+execute store result score #j bs.ctx run data get entity @s Pos[0] -100
+execute positioned 0.0 0.0 0.0 rotated 0.0 ~ run tp @s ^ ^ ^10.0
+execute store result score #k bs.ctx run data get entity @s Pos[2] 100
+execute store result score #l bs.ctx run data get entity @s Pos[1] -100
+tp @s -30000000 0 1600
diff --git a/modules/bs.move/data/bs.move/function/convert/local_to_canonical/compute.mcfunction b/modules/bs.move/data/bs.move/function/convert/local_to_canonical/compute.mcfunction
new file mode 100644
index 0000000000..94753fb3ac
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/convert/local_to_canonical/compute.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute positioned 0.0 0.0 0.0 run tp @s ^$(x) ^$(y) ^$(z)
+data modify storage bs:ctx _ set from entity @s Pos
+tp @s -30000000 0 1600
diff --git a/modules/bs.move/data/bs.move/function/convert/local_to_canonical/local_to_canonical.mcfunction b/modules/bs.move/data/bs.move/function/convert/local_to_canonical/local_to_canonical.mcfunction
new file mode 100644
index 0000000000..7f31b187dd
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/convert/local_to_canonical/local_to_canonical.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result storage bs:ctx x int 1 run scoreboard players get @s bs.vel.x
+execute store result storage bs:ctx y int 1 run scoreboard players get @s bs.vel.y
+execute store result storage bs:ctx z int 1 run scoreboard players get @s bs.vel.z
+
+execute in minecraft:overworld as B5-0-0-0-1 run function bs.move:convert/local_to_canonical/compute with storage bs:ctx
+
+execute store result score @s bs.vel.x run data get storage bs:ctx _[0]
+execute store result score @s bs.vel.y run data get storage bs:ctx _[1]
+execute store result score @s bs.vel.z run data get storage bs:ctx _[2]
diff --git a/modules/bs.move/data/bs.move/function/set_motion.mcfunction b/modules/bs.move/data/bs.move/function/set_motion.mcfunction
new file mode 100644
index 0000000000..925e36d351
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/set_motion.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result entity @s Motion[0] double $(scale) run scoreboard players get @s bs.vel.x
+$execute store result entity @s Motion[1] double $(scale) run scoreboard players get @s bs.vel.y
+$execute store result entity @s Motion[2] double $(scale) run scoreboard players get @s bs.vel.z
diff --git a/datapacks/Bookshelf/data/bs.move/function/teleport/canonical/apply_vel.mcfunction b/modules/bs.move/data/bs.move/function/teleport/canonical/apply_vel.mcfunction
similarity index 89%
rename from datapacks/Bookshelf/data/bs.move/function/teleport/canonical/apply_vel.mcfunction
rename to modules/bs.move/data/bs.move/function/teleport/canonical/apply_vel.mcfunction
index 296b9626b7..4c5869751d 100644
--- a/datapacks/Bookshelf/data/bs.move/function/teleport/canonical/apply_vel.mcfunction
+++ b/modules/bs.move/data/bs.move/function/teleport/canonical/apply_vel.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#apply-velocity
# ------------------------------------------------------------------------------------------------------------
execute if entity @s[predicate=!bs.move:has_vel] run return 0
diff --git a/modules/bs.move/data/bs.move/function/teleport/canonical/run.mcfunction b/modules/bs.move/data/bs.move/function/teleport/canonical/run.mcfunction
new file mode 100644
index 0000000000..90063e592d
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/teleport/canonical/run.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$tp @s ~$(x) ~$(y) ~$(z)
+
+execute unless data storage bs:data move{blocks:0b,entities:0b} run function bs.move:collision/handle {resolver:"canonical"}
diff --git a/datapacks/Bookshelf/data/bs.move/function/teleport/local/apply_local_vel.mcfunction b/modules/bs.move/data/bs.move/function/teleport/local/apply_local_vel.mcfunction
similarity index 89%
rename from datapacks/Bookshelf/data/bs.move/function/teleport/local/apply_local_vel.mcfunction
rename to modules/bs.move/data/bs.move/function/teleport/local/apply_local_vel.mcfunction
index 5c36cb290e..f435437375 100644
--- a/datapacks/Bookshelf/data/bs.move/function/teleport/local/apply_local_vel.mcfunction
+++ b/modules/bs.move/data/bs.move/function/teleport/local/apply_local_vel.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#apply-velocity
# ------------------------------------------------------------------------------------------------------------
execute if entity @s[predicate=!bs.move:has_vel] run return 0
diff --git a/modules/bs.move/data/bs.move/function/teleport/local/run.mcfunction b/modules/bs.move/data/bs.move/function/teleport/local/run.mcfunction
new file mode 100644
index 0000000000..a43da2ed8e
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/teleport/local/run.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$tp @s ^$(x) ^$(y) ^$(z)
+
+execute unless data storage bs:data move{blocks:0b,entities:0b} run function bs.move:collision/handle {resolver:"local"}
diff --git a/modules/bs.move/data/bs.move/function/teleport/with.mcfunction b/modules/bs.move/data/bs.move/function/teleport/with.mcfunction
new file mode 100644
index 0000000000..04aae6af27
--- /dev/null
+++ b/modules/bs.move/data/bs.move/function/teleport/with.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data move set value { \
+ blocks: true, \
+ entities: false, \
+ on_collision: "#bs.move:on_collision/bounce", \
+ ignored_blocks: "#bs.hitbox:intangible", \
+ ignored_entities: "#bs.hitbox:intangible", \
+}
+$data modify storage bs:data move merge value $(with)
diff --git a/datapacks/Bookshelf/data/bs.move/predicate/has_vel.json b/modules/bs.move/data/bs.move/predicate/has_vel.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.move/predicate/has_vel.json
rename to modules/bs.move/data/bs.move/predicate/has_vel.json
diff --git a/datapacks/Bookshelf/data/bs.move/tags/block/can_pass_through.json b/modules/bs.move/data/bs.move/tags/block/can_pass_through.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.move/tags/block/can_pass_through.json
rename to modules/bs.move/data/bs.move/tags/block/can_pass_through.json
diff --git a/datapacks/Bookshelf/data/bs.move/tags/function/apply_local_vel.json b/modules/bs.move/data/bs.move/tags/function/apply_local_vel.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.move/tags/function/apply_local_vel.json
rename to modules/bs.move/data/bs.move/tags/function/apply_local_vel.json
index 7091526bae..73294863b9 100644
--- a/datapacks/Bookshelf/data/bs.move/tags/function/apply_local_vel.json
+++ b/modules/bs.move/data/bs.move/tags/function/apply_local_vel.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#apply-velocity",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/move.html#apply-velocity",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.move/tags/function/apply_vel.json b/modules/bs.move/data/bs.move/tags/function/apply_vel.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.move/tags/function/apply_vel.json
rename to modules/bs.move/data/bs.move/tags/function/apply_vel.json
index da0512d0b4..2f6953efaa 100644
--- a/datapacks/Bookshelf/data/bs.move/tags/function/apply_vel.json
+++ b/modules/bs.move/data/bs.move/tags/function/apply_vel.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#apply-velocity",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/move.html#apply-velocity",
"authors": [
"Aksiome",
"Leirof"
diff --git a/modules/bs.move/data/bs.move/tags/function/canonical_to_local.json b/modules/bs.move/data/bs.move/tags/function/canonical_to_local.json
new file mode 100644
index 0000000000..c67867dc97
--- /dev/null
+++ b/modules/bs.move/data/bs.move/tags/function/canonical_to_local.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/move.html#canonical-to-local",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/12/25",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.move:convert/canonical_to_local/canonical_to_local"
+ ]
+}
diff --git a/modules/bs.move/data/bs.move/tags/function/local_to_canonical.json b/modules/bs.move/data/bs.move/tags/function/local_to_canonical.json
new file mode 100644
index 0000000000..e76f5b1df8
--- /dev/null
+++ b/modules/bs.move/data/bs.move/tags/function/local_to_canonical.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/move.html#local-to-canonical",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/12/25",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/04/19",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.move:convert/local_to_canonical/local_to_canonical"
+ ]
+}
diff --git a/modules/bs.move/data/bs.move/tags/function/on_collision/bounce.json b/modules/bs.move/data/bs.move/tags/function/on_collision/bounce.json
new file mode 100644
index 0000000000..2f6059f213
--- /dev/null
+++ b/modules/bs.move/data/bs.move/tags/function/on_collision/bounce.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/move.html#custom-collisions",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/12/25",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/11/04",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ "values": [
+ "bs.move:collision/resolvers/behaviors/bounce"
+ ]
+}
diff --git a/modules/bs.move/data/bs.move/tags/function/on_collision/damped_bounce.json b/modules/bs.move/data/bs.move/tags/function/on_collision/damped_bounce.json
new file mode 100644
index 0000000000..13920996c2
--- /dev/null
+++ b/modules/bs.move/data/bs.move/tags/function/on_collision/damped_bounce.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/move.html#custom-collisions",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/12/25",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/11/04",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ "values": [
+ "bs.move:collision/resolvers/behaviors/damped_bounce"
+ ]
+}
diff --git a/modules/bs.move/data/bs.move/tags/function/on_collision/slide.json b/modules/bs.move/data/bs.move/tags/function/on_collision/slide.json
new file mode 100644
index 0000000000..53c5c3a35f
--- /dev/null
+++ b/modules/bs.move/data/bs.move/tags/function/on_collision/slide.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/move.html#custom-collisions",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/12/25",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/11/04",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ "values": [
+ "bs.move:collision/resolvers/behaviors/slide"
+ ]
+}
diff --git a/modules/bs.move/data/bs.move/tags/function/on_collision/stick.json b/modules/bs.move/data/bs.move/tags/function/on_collision/stick.json
new file mode 100644
index 0000000000..8900fa4e92
--- /dev/null
+++ b/modules/bs.move/data/bs.move/tags/function/on_collision/stick.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": false,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/move.html#custom-collisions",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/12/25",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/11/04",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ "values": [
+ "bs.move:collision/resolvers/behaviors/stick"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.move/tags/function/set_motion.json b/modules/bs.move/data/bs.move/tags/function/set_motion.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.move/tags/function/set_motion.json
rename to modules/bs.move/data/bs.move/tags/function/set_motion.json
index 1ec05dbe37..ee23e5c009 100644
--- a/datapacks/Bookshelf/data/bs.move/tags/function/set_motion.json
+++ b/modules/bs.move/data/bs.move/tags/function/set_motion.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/move.html#set-motion",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/move.html#set-motion",
"authors": [
"Aksiome",
"Leirof"
diff --git a/modules/bs.move/data/bs.move/test/collision/with_block.mcfunction b/modules/bs.move/data/bs.move/test/collision/with_block.mcfunction
new file mode 100644
index 0000000000..94ca89963f
--- /dev/null
+++ b/modules/bs.move/data/bs.move/test/collision/with_block.mcfunction
@@ -0,0 +1,33 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+fill -1 -1 -1 1 1 1 air
+setblock 0 0 0 minecraft:bookshelf
+tp @s -.5 0.0 1.5 0.0 0.0
+
+scoreboard players set @s bs.vel.x 1000
+scoreboard players set @s bs.vel.y 0
+scoreboard players set @s bs.vel.z -1000
+
+function #bs.move:apply_vel {scale:0.001,with:{blocks:true,entities:false,on_collision:"#bs.move:on_collision/stick"}}
+
+execute store result score #packtest.x bs.data run data get entity @s Pos[0] 1000
+execute store result score #packtest.z bs.data run data get entity @s Pos[2] 1000
+
+dummy @s leave
+
+assert score #packtest.x bs.data matches -301..-299
+assert score #packtest.z bs.data matches 1299..1301
diff --git a/modules/bs.move/data/bs.move/test/collision/with_entity.mcfunction b/modules/bs.move/data/bs.move/test/collision/with_entity.mcfunction
new file mode 100644
index 0000000000..9f70a3f253
--- /dev/null
+++ b/modules/bs.move/data/bs.move/test/collision/with_entity.mcfunction
@@ -0,0 +1,33 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+summon minecraft:armor_stand .5 0 .5 {Tags:["bs.packtest"]}
+tp @s -.5 0.0 1.5 0.0 0.0
+
+scoreboard players set @s bs.vel.x 1000
+scoreboard players set @s bs.vel.y 0
+scoreboard players set @s bs.vel.z -1000
+
+function #bs.move:apply_vel {scale:0.001,with:{blocks:false,entities:true,on_collision:"#bs.move:on_collision/stick"}}
+
+execute store result score #packtest.x bs.data run data get entity @s Pos[0] 1000
+execute store result score #packtest.z bs.data run data get entity @s Pos[2] 1000
+
+dummy @s leave
+kill @e[type=minecraft:armor_stand,tag=bs.packtest]
+
+assert score #packtest.x bs.data matches -51..-49
+assert score #packtest.z bs.data matches 1049..1051
diff --git a/modules/bs.move/data/bs.move/test/convert/canonical_to_local.mcfunction b/modules/bs.move/data/bs.move/test/convert/canonical_to_local.mcfunction
new file mode 100644
index 0000000000..96dc9382f9
--- /dev/null
+++ b/modules/bs.move/data/bs.move/test/convert/canonical_to_local.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+scoreboard players set @s bs.vel.x 577
+scoreboard players set @s bs.vel.y 577
+scoreboard players set @s bs.vel.z 577
+
+execute rotated -45 -35.265 run function #bs.move:canonical_to_local
+
+assert score @s bs.vel.x matches -1..1
+assert score @s bs.vel.y matches -1..1
+assert score @s bs.vel.z matches 999..1001
diff --git a/modules/bs.move/data/bs.move/test/convert/local_to_canonical.mcfunction b/modules/bs.move/data/bs.move/test/convert/local_to_canonical.mcfunction
new file mode 100644
index 0000000000..5fe75b9a07
--- /dev/null
+++ b/modules/bs.move/data/bs.move/test/convert/local_to_canonical.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+scoreboard players set @s bs.vel.x 0
+scoreboard players set @s bs.vel.y 0
+scoreboard players set @s bs.vel.z 1000
+
+execute rotated -45 -35.265 run function #bs.move:local_to_canonical
+
+assert score @s bs.vel.x matches 576..578
+assert score @s bs.vel.y matches 576..578
+assert score @s bs.vel.z matches 576..578
diff --git a/modules/bs.move/data/bs.move/test/set_motion.mcfunction b/modules/bs.move/data/bs.move/test/set_motion.mcfunction
new file mode 100644
index 0000000000..be46baaf82
--- /dev/null
+++ b/modules/bs.move/data/bs.move/test/set_motion.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:pig ~ ~ ~ {Tags:["bs.packtest"]}
+scoreboard players set @e[type=minecraft:pig,tag=bs.packtest] bs.vel.x 250
+scoreboard players set @e[type=minecraft:pig,tag=bs.packtest] bs.vel.y 50
+scoreboard players set @e[type=minecraft:pig,tag=bs.packtest] bs.vel.z 0
+execute as @e[type=minecraft:pig,tag=bs.packtest] run function #bs.move:set_motion {scale:0.001}
+assert data entity @n[type=minecraft:pig,tag=bs.packtest] {Motion:[0.25d,0.05d,0.0d]}
diff --git a/modules/bs.move/data/bs.move/test/teleport/canonical.mcfunction b/modules/bs.move/data/bs.move/test/teleport/canonical.mcfunction
new file mode 100644
index 0000000000..21c958098e
--- /dev/null
+++ b/modules/bs.move/data/bs.move/test/teleport/canonical.mcfunction
@@ -0,0 +1,43 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+tp @s 0.0 0.0 0.0 0.0 0.0
+
+execute store result score #packtest.x_min bs.data store result score #packtest.x_max bs.data store result score @s bs.vel.x run random value -1000..1000
+execute store result score #packtest.y_min bs.data store result score #packtest.y_max bs.data store result score @s bs.vel.y run random value -1000..1000
+execute store result score #packtest.z_min bs.data store result score #packtest.z_max bs.data store result score @s bs.vel.z run random value -1000..1000
+
+function #bs.move:apply_vel {scale:0.001,with:{blocks:0b,entities:0b}}
+
+execute store result score #packtest.x bs.data run data get entity @s Pos[0] 1000
+execute store result score #packtest.y bs.data run data get entity @s Pos[1] 1000
+execute store result score #packtest.z bs.data run data get entity @s Pos[2] 1000
+
+dummy @s leave
+
+scoreboard players remove #packtest.x_min bs.data 2
+scoreboard players remove #packtest.y_min bs.data 2
+scoreboard players remove #packtest.z_min bs.data 2
+scoreboard players add #packtest.x_max bs.data 2
+scoreboard players add #packtest.y_max bs.data 2
+scoreboard players add #packtest.z_max bs.data 2
+
+assert score #packtest.x_min bs.data < #packtest.x bs.data
+assert score #packtest.y_min bs.data < #packtest.y bs.data
+assert score #packtest.z_min bs.data < #packtest.z bs.data
+assert score #packtest.x_max bs.data > #packtest.x bs.data
+assert score #packtest.y_max bs.data > #packtest.y bs.data
+assert score #packtest.z_max bs.data > #packtest.z bs.data
diff --git a/modules/bs.move/data/bs.move/test/teleport/local.mcfunction b/modules/bs.move/data/bs.move/test/teleport/local.mcfunction
new file mode 100644
index 0000000000..9fb97db458
--- /dev/null
+++ b/modules/bs.move/data/bs.move/test/teleport/local.mcfunction
@@ -0,0 +1,43 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+tp @s 0.0 0.0 0.0 90.0 0.0
+
+execute store result score #packtest.x_min bs.data store result score #packtest.x_max bs.data store result score @s bs.vel.x run random value -1000..1000
+execute store result score #packtest.y_min bs.data store result score #packtest.y_max bs.data store result score @s bs.vel.y run random value -1000..1000
+execute store result score #packtest.z_min bs.data store result score #packtest.z_max bs.data store result score @s bs.vel.z run random value -1000..1000
+
+function #bs.move:apply_local_vel {scale:0.001,with:{blocks:0b,entities:0b}}
+
+execute store result score #packtest.x bs.data run data get entity @s Pos[2] 1000
+execute store result score #packtest.y bs.data run data get entity @s Pos[1] 1000
+execute store result score #packtest.z bs.data run data get entity @s Pos[0] -1000
+
+dummy @s leave
+
+scoreboard players remove #packtest.x_min bs.data 2
+scoreboard players remove #packtest.y_min bs.data 2
+scoreboard players remove #packtest.z_min bs.data 2
+scoreboard players add #packtest.x_max bs.data 2
+scoreboard players add #packtest.y_max bs.data 2
+scoreboard players add #packtest.z_max bs.data 2
+
+assert score #packtest.x_min bs.data < #packtest.x bs.data
+assert score #packtest.y_min bs.data < #packtest.y bs.data
+assert score #packtest.z_min bs.data < #packtest.z bs.data
+assert score #packtest.x_max bs.data > #packtest.x bs.data
+assert score #packtest.y_max bs.data > #packtest.y bs.data
+assert score #packtest.z_max bs.data > #packtest.z bs.data
diff --git a/modules/bs.move/module.json b/modules/bs.move/module.json
new file mode 100644
index 0000000000..5e0693dd09
--- /dev/null
+++ b/modules/bs.move/module.json
@@ -0,0 +1,17 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.move",
+ "load": "."
+ },
+ "meta": {
+ "name": "Move",
+ "slug": "bookshelf-move",
+ "description": "Make your entity move exactly the way you want them to!",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/move.html",
+ "tags": ["default"],
+ "dependencies": [
+ "bs.hitbox"
+ ]
+ }
+}
diff --git a/modules/bs.position/README.md b/modules/bs.position/README.md
new file mode 100644
index 0000000000..50905b8b3c
--- /dev/null
+++ b/modules/bs.position/README.md
@@ -0,0 +1,14 @@
+# 🧭 Bookshelf Position
+
+This datapack allows you to manage entity positions and rotations using scores.
+
+> “The excitement lies in the exploration of the world around us.”
+>
+> -- Jim Peebles
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/position.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.position/data/bs.position/function/__load__.mcfunction b/modules/bs.position/data/bs.position/function/__load__.mcfunction
new file mode 100644
index 0000000000..af72f3fa0b
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/__load__.mcfunction
@@ -0,0 +1,32 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+forceload add -30000000 1600
+execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
+execute unless entity B5-0-0-0-2 run summon minecraft:text_display -30000000 0 1600 {UUID:[I;181,0,0,2],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],view_range:0f,alignment:"center"}
+
+scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
+
+scoreboard objectives add bs.pos.x dummy [{"text":"BS ","color":"dark_gray"},{"text":"Position X","color":"aqua"}]
+scoreboard objectives add bs.pos.y dummy [{"text":"BS ","color":"dark_gray"},{"text":"Position Y","color":"aqua"}]
+scoreboard objectives add bs.pos.z dummy [{"text":"BS ","color":"dark_gray"},{"text":"Position Z","color":"aqua"}]
+scoreboard objectives add bs.rot.h dummy [{"text":"BS ","color":"dark_gray"},{"text":"Rotation H","color":"aqua"}]
+scoreboard objectives add bs.rot.v dummy [{"text":"BS ","color":"dark_gray"},{"text":"Rotation V","color":"aqua"}]
+
+scoreboard players set 180 bs.const 180
+scoreboard players set 360 bs.const 360
+scoreboard players set 1000 bs.const 1000
diff --git a/modules/bs.position/data/bs.position/function/__unload__.mcfunction b/modules/bs.position/data/bs.position/function/__unload__.mcfunction
new file mode 100644
index 0000000000..e92fda84a9
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/__unload__.mcfunction
@@ -0,0 +1,28 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+kill B5-0-0-0-1
+kill B5-0-0-0-2
+forceload remove -30000000 1600
+
+scoreboard objectives remove bs.const
+scoreboard objectives remove bs.ctx
+scoreboard objectives remove bs.out
+
+scoreboard objectives remove bs.pos.x
+scoreboard objectives remove bs.pos.y
+scoreboard objectives remove bs.pos.z
+scoreboard objectives remove bs.rot.h
+scoreboard objectives remove bs.rot.v
diff --git a/modules/bs.position/data/bs.position/function/add/position/all/all.mcfunction b/modules/bs.position/data/bs.position/function/add/position/all/all.mcfunction
new file mode 100644
index 0000000000..d9ab827a98
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/add/position/all/all.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:ctx x double $(scale) run scoreboard players get @s bs.pos.x
+$execute store result storage bs:ctx y double $(scale) run scoreboard players get @s bs.pos.y
+$execute store result storage bs:ctx z double $(scale) run scoreboard players get @s bs.pos.z
+execute at @s run function bs.position:add/position/all/run with storage bs:ctx
diff --git a/modules/bs.position/data/bs.position/function/add/position/all/run.mcfunction b/modules/bs.position/data/bs.position/function/add/position/all/run.mcfunction
new file mode 100644
index 0000000000..86275991e9
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/add/position/all/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$tp @s ~$(x) ~$(y) ~$(z)
diff --git a/modules/bs.position/data/bs.position/function/add/position/x/run.mcfunction b/modules/bs.position/data/bs.position/function/add/position/x/run.mcfunction
new file mode 100644
index 0000000000..042e819ad5
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/add/position/x/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$tp @s ~$(x) ~ ~
diff --git a/modules/bs.position/data/bs.position/function/add/position/x/x.mcfunction b/modules/bs.position/data/bs.position/function/add/position/x/x.mcfunction
new file mode 100644
index 0000000000..fd11e75486
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/add/position/x/x.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:ctx x double $(scale) run scoreboard players get @s bs.pos.x
+execute at @s run function bs.position:add/position/x/run with storage bs:ctx
diff --git a/modules/bs.position/data/bs.position/function/add/position/y/run.mcfunction b/modules/bs.position/data/bs.position/function/add/position/y/run.mcfunction
new file mode 100644
index 0000000000..f0c1504aa8
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/add/position/y/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$tp @s ~ ~$(y) ~
diff --git a/modules/bs.position/data/bs.position/function/add/position/y/y.mcfunction b/modules/bs.position/data/bs.position/function/add/position/y/y.mcfunction
new file mode 100644
index 0000000000..a1cb253767
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/add/position/y/y.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:ctx y double $(scale) run scoreboard players get @s bs.pos.y
+execute at @s run function bs.position:add/position/y/run with storage bs:ctx
diff --git a/modules/bs.position/data/bs.position/function/add/position/z/run.mcfunction b/modules/bs.position/data/bs.position/function/add/position/z/run.mcfunction
new file mode 100644
index 0000000000..a8c09ee166
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/add/position/z/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$tp @s ~ ~ ~$(z)
diff --git a/modules/bs.position/data/bs.position/function/add/position/z/z.mcfunction b/modules/bs.position/data/bs.position/function/add/position/z/z.mcfunction
new file mode 100644
index 0000000000..c9972b8ccd
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/add/position/z/z.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:ctx z double $(scale) run scoreboard players get @s bs.pos.z
+execute at @s run function bs.position:add/position/z/run with storage bs:ctx
diff --git a/modules/bs.position/data/bs.position/function/add/rotation/all/all.mcfunction b/modules/bs.position/data/bs.position/function/add/rotation/all/all.mcfunction
new file mode 100644
index 0000000000..862c79e447
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/add/rotation/all/all.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:ctx x double $(scale) run scoreboard players get @s bs.rot.h
+$execute store result storage bs:ctx y double $(scale) run scoreboard players get @s bs.rot.v
+execute at @s run function bs.position:add/rotation/all/run with storage bs:ctx
diff --git a/modules/bs.position/data/bs.position/function/add/rotation/all/run.mcfunction b/modules/bs.position/data/bs.position/function/add/rotation/all/run.mcfunction
new file mode 100644
index 0000000000..ca74532e5f
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/add/rotation/all/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$rotate @s ~$(x) ~$(y)
diff --git a/modules/bs.position/data/bs.position/function/add/rotation/h/h.mcfunction b/modules/bs.position/data/bs.position/function/add/rotation/h/h.mcfunction
new file mode 100644
index 0000000000..5d7c30d31e
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/add/rotation/h/h.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:ctx x double $(scale) run scoreboard players get @s bs.rot.h
+execute at @s run function bs.position:add/rotation/h/run with storage bs:ctx
diff --git a/modules/bs.position/data/bs.position/function/add/rotation/h/run.mcfunction b/modules/bs.position/data/bs.position/function/add/rotation/h/run.mcfunction
new file mode 100644
index 0000000000..ef046294f3
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/add/rotation/h/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$rotate @s ~$(x) ~
diff --git a/modules/bs.position/data/bs.position/function/add/rotation/v/run.mcfunction b/modules/bs.position/data/bs.position/function/add/rotation/v/run.mcfunction
new file mode 100644
index 0000000000..726c805521
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/add/rotation/v/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$rotate @s ~ ~$(y)
diff --git a/modules/bs.position/data/bs.position/function/add/rotation/v/v.mcfunction b/modules/bs.position/data/bs.position/function/add/rotation/v/v.mcfunction
new file mode 100644
index 0000000000..6fc894d39c
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/add/rotation/v/v.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:ctx y double $(scale) run scoreboard players get @s bs.rot.v
+execute at @s run function bs.position:add/rotation/v/run with storage bs:ctx
diff --git a/modules/bs.position/data/bs.position/function/convert/canonical_to_local/canonical_to_local.mcfunction b/modules/bs.position/data/bs.position/function/convert/canonical_to_local/canonical_to_local.mcfunction
new file mode 100644
index 0000000000..3d0881b629
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/convert/canonical_to_local/canonical_to_local.mcfunction
@@ -0,0 +1,49 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# sincos(h: Phi) & sincos(v: Theta)
+execute in minecraft:overworld as B5-0-0-0-1 run function bs.position:convert/canonical_to_local/sincos
+
+# X' = Z * sin(h) + X * cos(h)
+scoreboard players operation #x bs.ctx = @s bs.pos.z
+scoreboard players operation #x bs.ctx *= #j bs.ctx
+scoreboard players operation #t bs.ctx = @s bs.pos.x
+scoreboard players operation #t bs.ctx *= #i bs.ctx
+scoreboard players operation #x bs.ctx += #t bs.ctx
+scoreboard players operation #x bs.ctx /= 1000 bs.const
+
+# Y' = (z * cos(h) - x * sin(h)) * sin(v) + y * cos(v)
+scoreboard players operation #y bs.ctx = @s bs.pos.z
+scoreboard players operation #y bs.ctx *= #i bs.ctx
+scoreboard players operation #t bs.ctx = @s bs.pos.x
+scoreboard players operation #t bs.ctx *= #j bs.ctx
+scoreboard players operation #y bs.ctx -= #t bs.ctx
+execute store result score #z bs.ctx run scoreboard players operation #y bs.ctx /= 1000 bs.const
+scoreboard players operation #y bs.ctx *= #l bs.ctx
+scoreboard players operation #t bs.ctx = @s bs.pos.y
+scoreboard players operation #t bs.ctx *= #k bs.ctx
+scoreboard players operation #y bs.ctx += #t bs.ctx
+scoreboard players operation #y bs.ctx /= 1000 bs.const
+
+# Z' = (z * cos(h) - x * sin(h)) * cos(v) - y * sin(v)
+scoreboard players operation #z bs.ctx *= #k bs.ctx
+scoreboard players operation #t bs.ctx = @s bs.pos.y
+scoreboard players operation #t bs.ctx *= #l bs.ctx
+scoreboard players operation #z bs.ctx -= #t bs.ctx
+scoreboard players operation #z bs.ctx /= 1000 bs.const
+
+scoreboard players operation @s bs.pos.x = #x bs.ctx
+scoreboard players operation @s bs.pos.y = #y bs.ctx
+scoreboard players operation @s bs.pos.z = #z bs.ctx
diff --git a/modules/bs.position/data/bs.position/function/convert/canonical_to_local/sincos.mcfunction b/modules/bs.position/data/bs.position/function/convert/canonical_to_local/sincos.mcfunction
new file mode 100644
index 0000000000..2d09cef2b9
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/convert/canonical_to_local/sincos.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute positioned 0.0 0.0 0.0 rotated ~ 0.0 run tp @s ^ ^ ^10.0
+execute store result score #i bs.ctx run data get entity @s Pos[2] 100
+execute store result score #j bs.ctx run data get entity @s Pos[0] -100
+execute positioned 0.0 0.0 0.0 rotated 0.0 ~ run tp @s ^ ^ ^10.0
+execute store result score #k bs.ctx run data get entity @s Pos[2] 100
+execute store result score #l bs.ctx run data get entity @s Pos[1] -100
+tp @s -30000000 0 1600
diff --git a/modules/bs.position/data/bs.position/function/convert/local_to_canonical/compute.mcfunction b/modules/bs.position/data/bs.position/function/convert/local_to_canonical/compute.mcfunction
new file mode 100644
index 0000000000..94753fb3ac
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/convert/local_to_canonical/compute.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute positioned 0.0 0.0 0.0 run tp @s ^$(x) ^$(y) ^$(z)
+data modify storage bs:ctx _ set from entity @s Pos
+tp @s -30000000 0 1600
diff --git a/modules/bs.position/data/bs.position/function/convert/local_to_canonical/local_to_canonical.mcfunction b/modules/bs.position/data/bs.position/function/convert/local_to_canonical/local_to_canonical.mcfunction
new file mode 100644
index 0000000000..f928dba4c8
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/convert/local_to_canonical/local_to_canonical.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result storage bs:ctx x int 1 run scoreboard players get @s bs.pos.x
+execute store result storage bs:ctx y int 1 run scoreboard players get @s bs.pos.y
+execute store result storage bs:ctx z int 1 run scoreboard players get @s bs.pos.z
+
+execute in minecraft:overworld as B5-0-0-0-1 run function bs.position:convert/local_to_canonical/compute with storage bs:ctx
+
+execute store result score @s bs.pos.x run data get storage bs:ctx _[0]
+execute store result score @s bs.pos.y run data get storage bs:ctx _[1]
+execute store result score @s bs.pos.z run data get storage bs:ctx _[2]
diff --git a/modules/bs.position/data/bs.position/function/get/distance/compute.mcfunction b/modules/bs.position/data/bs.position/function/get/distance/compute.mcfunction
new file mode 100644
index 0000000000..109c552bb8
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/get/distance/compute.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# compute Euclidean distance: sqrt(x^2+y^2+z^2)
+# Thanks to Triton365 for sharing this trick on the Minecraft Commands discord
+$data modify entity @s transformation set value [$(x)f,0f,0f,0f,$(y)f,0f,0f,0f,$(z)f,0f,0f,0f,0f,0f,0f,1f]
+return run data get entity @s transformation.scale[0]
diff --git a/modules/bs.position/data/bs.position/function/get/distance/distance_ata.mcfunction b/modules/bs.position/data/bs.position/function/get/distance/distance_ata.mcfunction
new file mode 100644
index 0000000000..5cdbbfd8c0
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/get/distance/distance_ata.mcfunction
@@ -0,0 +1,28 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute summon minecraft:marker run function bs.position:get/position/ctx
+$execute store result score #x bs.ctx run data get storage bs:ctx _[0] $(scale)
+$execute store result score #y bs.ctx run data get storage bs:ctx _[1] $(scale)
+$execute store result score #z bs.ctx run data get storage bs:ctx _[2] $(scale)
+$execute store result score #u bs.ctx run data get entity @s Pos[0] $(scale)
+$execute store result score #v bs.ctx run data get entity @s Pos[1] $(scale)
+$execute store result score #w bs.ctx run data get entity @s Pos[2] $(scale)
+
+execute store result storage bs:ctx x int 1 run scoreboard players operation #x bs.ctx -= #u bs.ctx
+execute store result storage bs:ctx y int 1 run scoreboard players operation #y bs.ctx -= #v bs.ctx
+execute store result storage bs:ctx z int 1 run scoreboard players operation #z bs.ctx -= #w bs.ctx
+
+execute store result score $position.get_distance_ata bs.out as B5-0-0-0-2 run return run function bs.position:get/distance/compute with storage bs:ctx
diff --git a/modules/bs.position/data/bs.position/function/get/distance/distance_squared_ata.mcfunction b/modules/bs.position/data/bs.position/function/get/distance/distance_squared_ata.mcfunction
new file mode 100644
index 0000000000..fc5e10a052
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/get/distance/distance_squared_ata.mcfunction
@@ -0,0 +1,32 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute summon minecraft:marker run function bs.position:get/position/ctx
+$execute store result score #x bs.ctx run data get storage bs:ctx _[0] $(scale)
+$execute store result score #y bs.ctx run data get storage bs:ctx _[1] $(scale)
+$execute store result score #z bs.ctx run data get storage bs:ctx _[2] $(scale)
+$execute store result score #u bs.ctx run data get entity @s Pos[0] $(scale)
+$execute store result score #v bs.ctx run data get entity @s Pos[1] $(scale)
+$execute store result score #w bs.ctx run data get entity @s Pos[2] $(scale)
+
+scoreboard players operation #x bs.ctx -= #u bs.ctx
+scoreboard players operation #y bs.ctx -= #v bs.ctx
+scoreboard players operation #z bs.ctx -= #w bs.ctx
+scoreboard players operation #x bs.ctx *= #x bs.ctx
+scoreboard players operation #y bs.ctx *= #y bs.ctx
+scoreboard players operation #z bs.ctx *= #z bs.ctx
+
+scoreboard players operation #x bs.ctx += #y bs.ctx
+execute store result score $position.get_distance_squared_ata bs.out run return run scoreboard players operation #x bs.ctx += #z bs.ctx
diff --git a/modules/bs.position/data/bs.position/function/get/position/all.mcfunction b/modules/bs.position/data/bs.position/function/get/position/all.mcfunction
new file mode 100644
index 0000000000..eec4baa2a7
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/get/position/all.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute summon minecraft:marker run function bs.position:get/position/ctx
+$execute store result score @s bs.pos.x run data get storage bs:ctx _[0] $(scale)
+$execute store result score @s bs.pos.y run data get storage bs:ctx _[1] $(scale)
+$execute store result score @s bs.pos.z run data get storage bs:ctx _[2] $(scale)
diff --git a/modules/bs.position/data/bs.position/function/get/position/ctx.mcfunction b/modules/bs.position/data/bs.position/function/get/position/ctx.mcfunction
new file mode 100644
index 0000000000..84fc557f18
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/get/position/ctx.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx _ set from entity @s Pos
+kill @s
diff --git a/modules/bs.position/data/bs.position/function/get/position/x.mcfunction b/modules/bs.position/data/bs.position/function/get/position/x.mcfunction
new file mode 100644
index 0000000000..22cacaef50
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/get/position/x.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute summon minecraft:marker run function bs.position:get/position/ctx
+$execute store result score @s bs.pos.x run data get storage bs:ctx _[0] $(scale)
diff --git a/modules/bs.position/data/bs.position/function/get/position/y.mcfunction b/modules/bs.position/data/bs.position/function/get/position/y.mcfunction
new file mode 100644
index 0000000000..89746c2710
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/get/position/y.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute summon minecraft:marker run function bs.position:get/position/ctx
+$execute store result score @s bs.pos.y run data get storage bs:ctx _[1] $(scale)
diff --git a/modules/bs.position/data/bs.position/function/get/position/z.mcfunction b/modules/bs.position/data/bs.position/function/get/position/z.mcfunction
new file mode 100644
index 0000000000..ffc198bcce
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/get/position/z.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute summon minecraft:marker run function bs.position:get/position/ctx
+$execute store result score @s bs.pos.z run data get storage bs:ctx _[2] $(scale)
diff --git a/modules/bs.position/data/bs.position/function/get/relative/relative_ata.mcfunction b/modules/bs.position/data/bs.position/function/get/relative/relative_ata.mcfunction
new file mode 100644
index 0000000000..bcc60a6414
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/get/relative/relative_ata.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute summon minecraft:marker run function bs.position:get/position/ctx
+$execute store result score #x bs.ctx run data get storage bs:ctx _[0] $(scale)
+$execute store result score #y bs.ctx run data get storage bs:ctx _[1] $(scale)
+$execute store result score #z bs.ctx run data get storage bs:ctx _[2] $(scale)
+
+$execute store result score @s bs.pos.x run data get entity @s Pos[0] $(scale)
+$execute store result score @s bs.pos.y run data get entity @s Pos[1] $(scale)
+$execute store result score @s bs.pos.z run data get entity @s Pos[2] $(scale)
+scoreboard players operation @s bs.pos.x -= #x bs.ctx
+scoreboard players operation @s bs.pos.y -= #y bs.ctx
+scoreboard players operation @s bs.pos.z -= #z bs.ctx
diff --git a/modules/bs.position/data/bs.position/function/get/relative/relative_from_dir/ctx.mcfunction b/modules/bs.position/data/bs.position/function/get/relative/relative_from_dir/ctx.mcfunction
new file mode 100644
index 0000000000..3c6a99ab4f
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/get/relative/relative_from_dir/ctx.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute positioned 0.0 0.0 0.0 run tp @s ^ ^ ^1
+data modify storage bs:ctx _ set from entity @s Pos
+tp @s -30000000 0 1600
diff --git a/modules/bs.position/data/bs.position/function/get/relative/relative_from_dir/relative_from_dir.mcfunction b/modules/bs.position/data/bs.position/function/get/relative/relative_from_dir/relative_from_dir.mcfunction
new file mode 100644
index 0000000000..32b4ed93bf
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/get/relative/relative_from_dir/relative_from_dir.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute in minecraft:overworld as B5-0-0-0-1 run function bs.position:get/relative/relative_from_dir/ctx
+$execute store result score @s bs.pos.x run data get storage bs:ctx _[0] $(scale)
+$execute store result score @s bs.pos.y run data get storage bs:ctx _[1] $(scale)
+$execute store result score @s bs.pos.z run data get storage bs:ctx _[2] $(scale)
diff --git a/modules/bs.position/data/bs.position/function/get/rotation/all.mcfunction b/modules/bs.position/data/bs.position/function/get/rotation/all.mcfunction
new file mode 100644
index 0000000000..a3286eeb48
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/get/rotation/all.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute in minecraft:overworld run tp B5-0-0-0-1 -30000000 0 1600 ~ ~
+$execute store result score @s bs.rot.h run data get entity B5-0-0-0-1 Rotation[0] $(scale)
+$execute store result score @s bs.rot.v run data get entity B5-0-0-0-1 Rotation[1] $(scale)
diff --git a/modules/bs.position/data/bs.position/function/get/rotation/h.mcfunction b/modules/bs.position/data/bs.position/function/get/rotation/h.mcfunction
new file mode 100644
index 0000000000..9aa4be180b
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/get/rotation/h.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute in minecraft:overworld run tp B5-0-0-0-1 -30000000 0 1600 ~ ~
+$execute store result score @s bs.rot.h run data get entity B5-0-0-0-1 Rotation[0] $(scale)
diff --git a/modules/bs.position/data/bs.position/function/get/rotation/v.mcfunction b/modules/bs.position/data/bs.position/function/get/rotation/v.mcfunction
new file mode 100644
index 0000000000..6ce9e50851
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/get/rotation/v.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute in minecraft:overworld run tp B5-0-0-0-1 -30000000 0 1600 ~ ~
+$execute store result score @s bs.rot.v run data get entity B5-0-0-0-1 Rotation[1] $(scale)
diff --git a/modules/bs.position/data/bs.position/function/set/position/all/all.mcfunction b/modules/bs.position/data/bs.position/function/set/position/all/all.mcfunction
new file mode 100644
index 0000000000..01190774d8
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/set/position/all/all.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:ctx x double $(scale) run scoreboard players get @s bs.pos.x
+$execute store result storage bs:ctx y double $(scale) run scoreboard players get @s bs.pos.y
+$execute store result storage bs:ctx z double $(scale) run scoreboard players get @s bs.pos.z
+execute positioned 0.0 0.0 0.0 run function bs.position:set/position/all/run with storage bs:ctx
diff --git a/modules/bs.position/data/bs.position/function/set/position/all/run.mcfunction b/modules/bs.position/data/bs.position/function/set/position/all/run.mcfunction
new file mode 100644
index 0000000000..86275991e9
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/set/position/all/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$tp @s ~$(x) ~$(y) ~$(z)
diff --git a/modules/bs.position/data/bs.position/function/set/position/x/run.mcfunction b/modules/bs.position/data/bs.position/function/set/position/x/run.mcfunction
new file mode 100644
index 0000000000..042e819ad5
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/set/position/x/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$tp @s ~$(x) ~ ~
diff --git a/modules/bs.position/data/bs.position/function/set/position/x/x.mcfunction b/modules/bs.position/data/bs.position/function/set/position/x/x.mcfunction
new file mode 100644
index 0000000000..0a06b328b0
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/set/position/x/x.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:ctx x double $(scale) run scoreboard players get @s bs.pos.x
+execute at @s positioned 0.0 ~ ~ run function bs.position:set/position/x/run with storage bs:ctx
diff --git a/modules/bs.position/data/bs.position/function/set/position/y/run.mcfunction b/modules/bs.position/data/bs.position/function/set/position/y/run.mcfunction
new file mode 100644
index 0000000000..f0c1504aa8
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/set/position/y/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$tp @s ~ ~$(y) ~
diff --git a/modules/bs.position/data/bs.position/function/set/position/y/y.mcfunction b/modules/bs.position/data/bs.position/function/set/position/y/y.mcfunction
new file mode 100644
index 0000000000..eaa49a85e8
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/set/position/y/y.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:ctx y double $(scale) run scoreboard players get @s bs.pos.y
+execute at @s positioned ~ 0.0 ~ run function bs.position:set/position/y/run with storage bs:ctx
diff --git a/modules/bs.position/data/bs.position/function/set/position/z/run.mcfunction b/modules/bs.position/data/bs.position/function/set/position/z/run.mcfunction
new file mode 100644
index 0000000000..a8c09ee166
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/set/position/z/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$tp @s ~ ~ ~$(z)
diff --git a/modules/bs.position/data/bs.position/function/set/position/z/z.mcfunction b/modules/bs.position/data/bs.position/function/set/position/z/z.mcfunction
new file mode 100644
index 0000000000..bce07084d4
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/set/position/z/z.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:ctx z double $(scale) run scoreboard players get @s bs.pos.z
+execute at @s positioned ~ ~ 0.0 run function bs.position:set/position/z/run with storage bs:ctx
diff --git a/modules/bs.position/data/bs.position/function/set/rotation/all/all.mcfunction b/modules/bs.position/data/bs.position/function/set/rotation/all/all.mcfunction
new file mode 100644
index 0000000000..8a508d7a82
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/set/rotation/all/all.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:ctx x double $(scale) run scoreboard players get @s bs.rot.h
+$execute store result storage bs:ctx y double $(scale) run scoreboard players get @s bs.rot.v
+function bs.position:set/rotation/all/run with storage bs:ctx
diff --git a/modules/bs.position/data/bs.position/function/set/rotation/all/run.mcfunction b/modules/bs.position/data/bs.position/function/set/rotation/all/run.mcfunction
new file mode 100644
index 0000000000..c664e04c46
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/set/rotation/all/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$rotate @s $(x) $(y)
diff --git a/modules/bs.position/data/bs.position/function/set/rotation/h/h.mcfunction b/modules/bs.position/data/bs.position/function/set/rotation/h/h.mcfunction
new file mode 100644
index 0000000000..63a523db92
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/set/rotation/h/h.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:ctx x double $(scale) run scoreboard players get @s bs.rot.h
+function bs.position:set/rotation/h/run with storage bs:ctx
diff --git a/modules/bs.position/data/bs.position/function/set/rotation/h/run.mcfunction b/modules/bs.position/data/bs.position/function/set/rotation/h/run.mcfunction
new file mode 100644
index 0000000000..475a572e5e
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/set/rotation/h/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$rotate @s $(x) ~
diff --git a/modules/bs.position/data/bs.position/function/set/rotation/v/run.mcfunction b/modules/bs.position/data/bs.position/function/set/rotation/v/run.mcfunction
new file mode 100644
index 0000000000..d06c798d13
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/set/rotation/v/run.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$rotate @s ~ $(y)
diff --git a/modules/bs.position/data/bs.position/function/set/rotation/v/v.mcfunction b/modules/bs.position/data/bs.position/function/set/rotation/v/v.mcfunction
new file mode 100644
index 0000000000..fb7bd6223a
--- /dev/null
+++ b/modules/bs.position/data/bs.position/function/set/rotation/v/v.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result storage bs:ctx y double $(scale) run scoreboard players get @s bs.rot.v
+function bs.position:set/rotation/v/run with storage bs:ctx
diff --git a/modules/bs.position/data/bs.position/tags/function/add_pos.json b/modules/bs.position/data/bs.position/tags/function/add_pos.json
new file mode 100644
index 0000000000..c54588025d
--- /dev/null
+++ b/modules/bs.position/data/bs.position/tags/function/add_pos.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#add-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2024/01/22",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.position:add/position/all/all"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/add_pos_and_rot.json b/modules/bs.position/data/bs.position/tags/function/add_pos_and_rot.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.position/tags/function/add_pos_and_rot.json
rename to modules/bs.position/data/bs.position/tags/function/add_pos_and_rot.json
index cecedfe197..c5f94cd17f 100644
--- a/datapacks/Bookshelf/data/bs.position/tags/function/add_pos_and_rot.json
+++ b/modules/bs.position/data/bs.position/tags/function/add_pos_and_rot.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#add-position-and-rotation",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#add-position-and-rotation",
"authors": [
"Aksiome",
"Leirof"
diff --git a/modules/bs.position/data/bs.position/tags/function/add_pos_x.json b/modules/bs.position/data/bs.position/tags/function/add_pos_x.json
new file mode 100644
index 0000000000..259e5eb95c
--- /dev/null
+++ b/modules/bs.position/data/bs.position/tags/function/add_pos_x.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#add-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2024/01/22",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.position:add/position/x/x"
+ ]
+}
diff --git a/modules/bs.position/data/bs.position/tags/function/add_pos_y.json b/modules/bs.position/data/bs.position/tags/function/add_pos_y.json
new file mode 100644
index 0000000000..8c50729dc4
--- /dev/null
+++ b/modules/bs.position/data/bs.position/tags/function/add_pos_y.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#add-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2024/01/22",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.position:add/position/y/y"
+ ]
+}
diff --git a/modules/bs.position/data/bs.position/tags/function/add_pos_z.json b/modules/bs.position/data/bs.position/tags/function/add_pos_z.json
new file mode 100644
index 0000000000..33e8a285cb
--- /dev/null
+++ b/modules/bs.position/data/bs.position/tags/function/add_pos_z.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#add-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2024/01/22",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.position:add/position/z/z"
+ ]
+}
diff --git a/modules/bs.position/data/bs.position/tags/function/add_rot.json b/modules/bs.position/data/bs.position/tags/function/add_rot.json
new file mode 100644
index 0000000000..fe8ca71c81
--- /dev/null
+++ b/modules/bs.position/data/bs.position/tags/function/add_rot.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#add-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2024/01/22",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.position:add/rotation/all/all"
+ ]
+}
diff --git a/modules/bs.position/data/bs.position/tags/function/add_rot_h.json b/modules/bs.position/data/bs.position/tags/function/add_rot_h.json
new file mode 100644
index 0000000000..2873063832
--- /dev/null
+++ b/modules/bs.position/data/bs.position/tags/function/add_rot_h.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#add-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2024/01/22",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.position:add/rotation/h/h"
+ ]
+}
diff --git a/modules/bs.position/data/bs.position/tags/function/add_rot_v.json b/modules/bs.position/data/bs.position/tags/function/add_rot_v.json
new file mode 100644
index 0000000000..2ebc74589f
--- /dev/null
+++ b/modules/bs.position/data/bs.position/tags/function/add_rot_v.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#add-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2024/01/22",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.position:add/rotation/v/v"
+ ]
+}
diff --git a/modules/bs.position/data/bs.position/tags/function/canonical_to_local.json b/modules/bs.position/data/bs.position/tags/function/canonical_to_local.json
new file mode 100644
index 0000000000..1d7d1d7c43
--- /dev/null
+++ b/modules/bs.position/data/bs.position/tags/function/canonical_to_local.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#canonical-to-local",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/10/20",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.position:convert/canonical_to_local/canonical_to_local"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/get_distance_ata.json b/modules/bs.position/data/bs.position/tags/function/get_distance_ata.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.position/tags/function/get_distance_ata.json
rename to modules/bs.position/data/bs.position/tags/function/get_distance_ata.json
index 815e697f90..e771b6458a 100644
--- a/datapacks/Bookshelf/data/bs.position/tags/function/get_distance_ata.json
+++ b/modules/bs.position/data/bs.position/tags/function/get_distance_ata.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-distance",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-distance",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/get_distance_squared_ata.json b/modules/bs.position/data/bs.position/tags/function/get_distance_squared_ata.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.position/tags/function/get_distance_squared_ata.json
rename to modules/bs.position/data/bs.position/tags/function/get_distance_squared_ata.json
index 37209352f8..a4ef6e9185 100644
--- a/datapacks/Bookshelf/data/bs.position/tags/function/get_distance_squared_ata.json
+++ b/modules/bs.position/data/bs.position/tags/function/get_distance_squared_ata.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-distance",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-distance",
"authors": [
"Aksiome",
"Leirof"
diff --git a/modules/bs.position/data/bs.position/tags/function/get_pos.json b/modules/bs.position/data/bs.position/tags/function/get_pos.json
new file mode 100644
index 0000000000..91204d9ee5
--- /dev/null
+++ b/modules/bs.position/data/bs.position/tags/function/get_pos.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.position:get/position/all"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/get_pos_and_rot.json b/modules/bs.position/data/bs.position/tags/function/get_pos_and_rot.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.position/tags/function/get_pos_and_rot.json
rename to modules/bs.position/data/bs.position/tags/function/get_pos_and_rot.json
index 1161cbd2c0..3480133fc0 100644
--- a/datapacks/Bookshelf/data/bs.position/tags/function/get_pos_and_rot.json
+++ b/modules/bs.position/data/bs.position/tags/function/get_pos_and_rot.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/master/modules/position.html#get-position-and-rotation",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-position-and-rotation",
"authors": [
"Aksiome",
"Leirof"
diff --git a/modules/bs.position/data/bs.position/tags/function/get_pos_x.json b/modules/bs.position/data/bs.position/tags/function/get_pos_x.json
new file mode 100644
index 0000000000..2356ee94e8
--- /dev/null
+++ b/modules/bs.position/data/bs.position/tags/function/get_pos_x.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.position:get/position/x"
+ ]
+}
diff --git a/modules/bs.position/data/bs.position/tags/function/get_pos_y.json b/modules/bs.position/data/bs.position/tags/function/get_pos_y.json
new file mode 100644
index 0000000000..50b4cbd20e
--- /dev/null
+++ b/modules/bs.position/data/bs.position/tags/function/get_pos_y.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.position:get/position/y"
+ ]
+}
diff --git a/modules/bs.position/data/bs.position/tags/function/get_pos_z.json b/modules/bs.position/data/bs.position/tags/function/get_pos_z.json
new file mode 100644
index 0000000000..84ca7b89cc
--- /dev/null
+++ b/modules/bs.position/data/bs.position/tags/function/get_pos_z.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.position:get/position/z"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/get_relative_ata.json b/modules/bs.position/data/bs.position/tags/function/get_relative_ata.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.position/tags/function/get_relative_ata.json
rename to modules/bs.position/data/bs.position/tags/function/get_relative_ata.json
index d8df22a67b..bb9d607729 100644
--- a/datapacks/Bookshelf/data/bs.position/tags/function/get_relative_ata.json
+++ b/modules/bs.position/data/bs.position/tags/function/get_relative_ata.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-relative",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-relative",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/get_relative_from_dir.json b/modules/bs.position/data/bs.position/tags/function/get_relative_from_dir.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.position/tags/function/get_relative_from_dir.json
rename to modules/bs.position/data/bs.position/tags/function/get_relative_from_dir.json
index c4346dbe3e..2c93d84afa 100644
--- a/datapacks/Bookshelf/data/bs.position/tags/function/get_relative_from_dir.json
+++ b/modules/bs.position/data/bs.position/tags/function/get_relative_from_dir.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-relative",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-relative",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/get_rot.json b/modules/bs.position/data/bs.position/tags/function/get_rot.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.position/tags/function/get_rot.json
rename to modules/bs.position/data/bs.position/tags/function/get_rot.json
index 5c3cc31cf0..6b96d1bd08 100644
--- a/datapacks/Bookshelf/data/bs.position/tags/function/get_rot.json
+++ b/modules/bs.position/data/bs.position/tags/function/get_rot.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-rotation",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-rotation",
"authors": [
"Aksiome",
"Leirof",
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/get_rot_h.json b/modules/bs.position/data/bs.position/tags/function/get_rot_h.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.position/tags/function/get_rot_h.json
rename to modules/bs.position/data/bs.position/tags/function/get_rot_h.json
index 2aa913544f..17a4c2283b 100644
--- a/datapacks/Bookshelf/data/bs.position/tags/function/get_rot_h.json
+++ b/modules/bs.position/data/bs.position/tags/function/get_rot_h.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-rotation",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-rotation",
"authors": [
"Aksiome",
"Leirof",
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/get_rot_v.json b/modules/bs.position/data/bs.position/tags/function/get_rot_v.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.position/tags/function/get_rot_v.json
rename to modules/bs.position/data/bs.position/tags/function/get_rot_v.json
index 7779a13064..665053fa71 100644
--- a/datapacks/Bookshelf/data/bs.position/tags/function/get_rot_v.json
+++ b/modules/bs.position/data/bs.position/tags/function/get_rot_v.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#get-rotation",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#get-rotation",
"authors": [
"Aksiome",
"Leirof",
diff --git a/modules/bs.position/data/bs.position/tags/function/local_to_canonical.json b/modules/bs.position/data/bs.position/tags/function/local_to_canonical.json
new file mode 100644
index 0000000000..09e80d8da4
--- /dev/null
+++ b/modules/bs.position/data/bs.position/tags/function/local_to_canonical.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#local-to-canonical",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/12/25",
+ "minecraft_version": "1.20.4"
+ },
+ "updated": {
+ "date": "2024/04/12",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.position:convert/local_to_canonical/local_to_canonical"
+ ]
+}
diff --git a/modules/bs.position/data/bs.position/tags/function/set_pos.json b/modules/bs.position/data/bs.position/tags/function/set_pos.json
new file mode 100644
index 0000000000..6b3258ebe1
--- /dev/null
+++ b/modules/bs.position/data/bs.position/tags/function/set_pos.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#set-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.position:set/position/all/all"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/set_pos_and_rot.json b/modules/bs.position/data/bs.position/tags/function/set_pos_and_rot.json
similarity index 79%
rename from datapacks/Bookshelf/data/bs.position/tags/function/set_pos_and_rot.json
rename to modules/bs.position/data/bs.position/tags/function/set_pos_and_rot.json
index 1984750e25..23042f950c 100644
--- a/datapacks/Bookshelf/data/bs.position/tags/function/set_pos_and_rot.json
+++ b/modules/bs.position/data/bs.position/tags/function/set_pos_and_rot.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html",
"authors": [
"Aksiome",
"Leirof"
diff --git a/modules/bs.position/data/bs.position/tags/function/set_pos_x.json b/modules/bs.position/data/bs.position/tags/function/set_pos_x.json
new file mode 100644
index 0000000000..6dbfc00ded
--- /dev/null
+++ b/modules/bs.position/data/bs.position/tags/function/set_pos_x.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#set-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.position:set/position/x/x"
+ ]
+}
diff --git a/modules/bs.position/data/bs.position/tags/function/set_pos_y.json b/modules/bs.position/data/bs.position/tags/function/set_pos_y.json
new file mode 100644
index 0000000000..324b564f00
--- /dev/null
+++ b/modules/bs.position/data/bs.position/tags/function/set_pos_y.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#set-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.position:set/position/y/y"
+ ]
+}
diff --git a/modules/bs.position/data/bs.position/tags/function/set_pos_z.json b/modules/bs.position/data/bs.position/tags/function/set_pos_z.json
new file mode 100644
index 0000000000..c2634cc01c
--- /dev/null
+++ b/modules/bs.position/data/bs.position/tags/function/set_pos_z.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#set-position-and-rotation",
+ "authors": [
+ "Aksiome",
+ "Leirof"
+ ],
+ "created": {
+ "date": "2017/05/14",
+ "minecraft_version": "1.12"
+ },
+ "updated": {
+ "date": "2024/02/27",
+ "minecraft_version": "1.20.4"
+ }
+ },
+ "values": [
+ "bs.position:set/position/z/z"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/set_rot.json b/modules/bs.position/data/bs.position/tags/function/set_rot.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.position/tags/function/set_rot.json
rename to modules/bs.position/data/bs.position/tags/function/set_rot.json
index 71ce4abef8..7baa850354 100644
--- a/datapacks/Bookshelf/data/bs.position/tags/function/set_rot.json
+++ b/modules/bs.position/data/bs.position/tags/function/set_rot.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#set-rotation",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#set-rotation",
"authors": [
"Aksiome",
"Leirof",
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/set_rot_h.json b/modules/bs.position/data/bs.position/tags/function/set_rot_h.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.position/tags/function/set_rot_h.json
rename to modules/bs.position/data/bs.position/tags/function/set_rot_h.json
index e1fa8c98a5..2df0cd8d21 100644
--- a/datapacks/Bookshelf/data/bs.position/tags/function/set_rot_h.json
+++ b/modules/bs.position/data/bs.position/tags/function/set_rot_h.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#set-rotation",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#set-rotation",
"authors": [
"Aksiome",
"Leirof",
diff --git a/datapacks/Bookshelf/data/bs.position/tags/function/set_rot_v.json b/modules/bs.position/data/bs.position/tags/function/set_rot_v.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.position/tags/function/set_rot_v.json
rename to modules/bs.position/data/bs.position/tags/function/set_rot_v.json
index 6353fe3999..dad62ba845 100644
--- a/datapacks/Bookshelf/data/bs.position/tags/function/set_rot_v.json
+++ b/modules/bs.position/data/bs.position/tags/function/set_rot_v.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/position.html#set-rotation",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html#set-rotation",
"authors": [
"Aksiome",
"Leirof",
diff --git a/modules/bs.position/data/bs.position/test/add/pos.mcfunction b/modules/bs.position/data/bs.position/test/add/pos.mcfunction
new file mode 100644
index 0000000000..8e0418a0a4
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/add/pos.mcfunction
@@ -0,0 +1,34 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+tp @s 0.0 0.0 0.0 0.0 0.0
+
+execute store result score @s bs.pos.x run random value -10000..10000
+execute store result score @s bs.pos.y run random value -10000..10000
+execute store result score @s bs.pos.z run random value -10000..10000
+function #bs.position:add_pos {scale:.001}
+
+execute store result score #x bs.ctx run data get entity @s Pos[0] 1000
+execute store result score #y bs.ctx run data get entity @s Pos[1] 1000
+execute store result score #z bs.ctx run data get entity @s Pos[2] 1000
+
+scoreboard players operation #x bs.ctx -= @s bs.pos.x
+scoreboard players operation #y bs.ctx -= @s bs.pos.y
+scoreboard players operation #z bs.ctx -= @s bs.pos.z
+
+assert score #x bs.ctx matches -2..2
+assert score #y bs.ctx matches -2..2
+assert score #z bs.ctx matches -2..2
diff --git a/modules/bs.position/data/bs.position/test/add/pos_and_rot.mcfunction b/modules/bs.position/data/bs.position/test/add/pos_and_rot.mcfunction
new file mode 100644
index 0000000000..137ff24a49
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/add/pos_and_rot.mcfunction
@@ -0,0 +1,43 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:marker 0.0 0.0 0.0 {Tags:["bs.packtest"],Rotation:[0.0,0.0]}
+
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.pos.x run random value -10000..10000
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.pos.y run random value -10000..10000
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.pos.z run random value -10000..10000
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h run random value -10000..10000
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v run random value -10000..10000
+execute as @n[type=minecraft:marker,tag=bs.packtest] run function #bs.position:add_pos_and_rot {scale:.001}
+
+execute store result score #x bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Pos[0] 1000
+execute store result score #y bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Pos[1] 1000
+execute store result score #z bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Pos[2] 1000
+execute store result score #h bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[0] 1000
+execute store result score #v bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[1] 1000
+
+scoreboard players operation #x bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.pos.x
+scoreboard players operation #y bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.pos.y
+scoreboard players operation #z bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.pos.z
+scoreboard players operation #h bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h
+scoreboard players operation #v bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v
+
+kill @n[type=minecraft:marker,tag=bs.packtest]
+
+assert score #x bs.ctx matches -2..2
+assert score #y bs.ctx matches -2..2
+assert score #z bs.ctx matches -2..2
+assert score #h bs.ctx matches -2..2
+assert score #v bs.ctx matches -2..2
diff --git a/modules/bs.position/data/bs.position/test/add/pos_x.mcfunction b/modules/bs.position/data/bs.position/test/add/pos_x.mcfunction
new file mode 100644
index 0000000000..ad0ddafbdc
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/add/pos_x.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+tp @s 0.0 0.0 0.0 0.0 0.0
+
+execute store result score @s bs.pos.x run random value -10000..10000
+function #bs.position:add_pos_x {scale:.001}
+execute store result score #x bs.ctx run data get entity @s Pos[0] 1000
+scoreboard players operation #x bs.ctx -= @s bs.pos.x
+
+assert score #x bs.ctx matches -2..2
diff --git a/modules/bs.position/data/bs.position/test/add/pos_y.mcfunction b/modules/bs.position/data/bs.position/test/add/pos_y.mcfunction
new file mode 100644
index 0000000000..db1afc0ee6
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/add/pos_y.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+tp @s 0.0 0.0 0.0 0.0 0.0
+
+execute store result score @s bs.pos.y run random value -10000..10000
+function #bs.position:add_pos_y {scale:.001}
+execute store result score #y bs.ctx run data get entity @s Pos[1] 1000
+scoreboard players operation #y bs.ctx -= @s bs.pos.y
+
+assert score #y bs.ctx matches -2..2
diff --git a/modules/bs.position/data/bs.position/test/add/pos_z.mcfunction b/modules/bs.position/data/bs.position/test/add/pos_z.mcfunction
new file mode 100644
index 0000000000..c46316bdfe
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/add/pos_z.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+tp @s 0.0 0.0 0.0 0.0 0.0
+
+execute store result score @s bs.pos.z run random value -10000..10000
+function #bs.position:add_pos_z {scale:.001}
+execute store result score #z bs.ctx run data get entity @s Pos[2] 1000
+scoreboard players operation #z bs.ctx -= @s bs.pos.z
+
+assert score #z bs.ctx matches -2..2
diff --git a/modules/bs.position/data/bs.position/test/add/rot.mcfunction b/modules/bs.position/data/bs.position/test/add/rot.mcfunction
new file mode 100644
index 0000000000..7343fcaedc
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/add/rot.mcfunction
@@ -0,0 +1,31 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:marker ~ ~ ~ {Tags:["bs.packtest"],Rotation:[0.0,0.0]}
+
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h run random value -10000..10000
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v run random value -10000..10000
+execute as @n[type=minecraft:marker,tag=bs.packtest] run function #bs.position:add_rot {scale:.001}
+
+execute store result score #h bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[0] 1000
+execute store result score #v bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[1] 1000
+
+scoreboard players operation #h bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h
+scoreboard players operation #v bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v
+
+kill @n[type=minecraft:marker,tag=bs.packtest]
+
+assert score #h bs.ctx matches -2..2
+assert score #v bs.ctx matches -2..2
diff --git a/modules/bs.position/data/bs.position/test/add/rot_h.mcfunction b/modules/bs.position/data/bs.position/test/add/rot_h.mcfunction
new file mode 100644
index 0000000000..e5272c7633
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/add/rot_h.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:marker ~ ~ ~ {Tags:["bs.packtest"],Rotation:[0.0,0.0]}
+
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h run random value -10000..10000
+execute as @n[type=minecraft:marker,tag=bs.packtest] run function #bs.position:add_rot_h {scale:.001}
+execute store result score #h bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[0] 1000
+scoreboard players operation #h bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h
+
+kill @n[type=minecraft:marker,tag=bs.packtest]
+
+assert score #h bs.ctx matches -2..2
diff --git a/modules/bs.position/data/bs.position/test/add/rot_v.mcfunction b/modules/bs.position/data/bs.position/test/add/rot_v.mcfunction
new file mode 100644
index 0000000000..a821539ef1
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/add/rot_v.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:marker ~ ~ ~ {Tags:["bs.packtest"],Rotation:[0.0,0.0]}
+
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v run random value -10000..10000
+execute as @n[type=minecraft:marker,tag=bs.packtest] run function #bs.position:add_rot_v {scale:.001}
+execute store result score #v bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[1] 1000
+scoreboard players operation #v bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v
+
+kill @n[type=minecraft:marker,tag=bs.packtest]
+
+assert score #v bs.ctx matches -2..2
diff --git a/modules/bs.position/data/bs.position/test/convert/canonical_to_local.mcfunction b/modules/bs.position/data/bs.position/test/convert/canonical_to_local.mcfunction
new file mode 100644
index 0000000000..226fc29fae
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/convert/canonical_to_local.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+scoreboard players set @s bs.pos.x 577
+scoreboard players set @s bs.pos.y 577
+scoreboard players set @s bs.pos.z 577
+
+execute rotated -45 -35.265 run function #bs.position:canonical_to_local
+
+assert score @s bs.pos.x matches -1..1
+assert score @s bs.pos.y matches -1..1
+assert score @s bs.pos.z matches 999..1001
diff --git a/modules/bs.position/data/bs.position/test/convert/local_to_canonical.mcfunction b/modules/bs.position/data/bs.position/test/convert/local_to_canonical.mcfunction
new file mode 100644
index 0000000000..89137690eb
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/convert/local_to_canonical.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+scoreboard players set @s bs.pos.x 0
+scoreboard players set @s bs.pos.y 0
+scoreboard players set @s bs.pos.z 1000
+
+execute rotated -45 -35.265 run function #bs.position:local_to_canonical
+
+assert score @s bs.pos.x matches 576..578
+assert score @s bs.pos.y matches 576..578
+assert score @s bs.pos.z matches 576..578
diff --git a/modules/bs.position/data/bs.position/test/get/distance_ata.mcfunction b/modules/bs.position/data/bs.position/test/get/distance_ata.mcfunction
new file mode 100644
index 0000000000..7e4cbad2ae
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/get/distance_ata.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute at @s positioned ^ ^ ^7.5 store result score #r bs.ctx run function #bs.position:get_distance_ata {scale:10}
+assert score #r bs.ctx matches 74..76
diff --git a/modules/bs.position/data/bs.position/test/get/distance_squared_ata.mcfunction b/modules/bs.position/data/bs.position/test/get/distance_squared_ata.mcfunction
new file mode 100644
index 0000000000..ede5503157
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/get/distance_squared_ata.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute at @s positioned ^ ^ ^7.5 store result score #r bs.ctx run function #bs.position:get_distance_squared_ata {scale:10}
+assert score #r bs.ctx matches 5624..5626
diff --git a/modules/bs.position/data/bs.position/test/get/pos.mcfunction b/modules/bs.position/data/bs.position/test/get/pos.mcfunction
new file mode 100644
index 0000000000..b67dced2c6
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/get/pos.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute at @s positioned ~1 ~1 ~1 run function #bs.position:get_pos {scale:10}
+
+execute store result score #x bs.ctx run data get entity @s Pos[0] 10
+execute store result score #y bs.ctx run data get entity @s Pos[1] 10
+execute store result score #z bs.ctx run data get entity @s Pos[2] 10
+
+scoreboard players operation #x bs.ctx -= @s bs.pos.x
+scoreboard players operation #y bs.ctx -= @s bs.pos.y
+scoreboard players operation #z bs.ctx -= @s bs.pos.z
+
+assert score #x bs.ctx matches -11..-9
+assert score #y bs.ctx matches -11..-9
+assert score #z bs.ctx matches -11..-9
diff --git a/modules/bs.position/data/bs.position/test/get/pos_and_rot.mcfunction b/modules/bs.position/data/bs.position/test/get/pos_and_rot.mcfunction
new file mode 100644
index 0000000000..29bdc8e8ca
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/get/pos_and_rot.mcfunction
@@ -0,0 +1,35 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute at @s positioned ~1 ~1 ~1 rotated ~1 ~1 run function #bs.position:get_pos_and_rot {scale:10}
+
+execute store result score #x bs.ctx run data get entity @s Pos[0] 10
+execute store result score #y bs.ctx run data get entity @s Pos[1] 10
+execute store result score #z bs.ctx run data get entity @s Pos[2] 10
+execute store result score #h bs.ctx run data get entity @s Rotation[0] 10
+execute store result score #v bs.ctx run data get entity @s Rotation[1] 10
+
+scoreboard players operation #x bs.ctx -= @s bs.pos.x
+scoreboard players operation #y bs.ctx -= @s bs.pos.y
+scoreboard players operation #z bs.ctx -= @s bs.pos.z
+scoreboard players operation #h bs.ctx -= @s bs.rot.h
+scoreboard players operation #v bs.ctx -= @s bs.rot.v
+
+assert score #x bs.ctx matches -11..-9
+assert score #y bs.ctx matches -11..-9
+assert score #z bs.ctx matches -11..-9
+assert score #h bs.ctx matches -11..-9
+assert score #v bs.ctx matches -11..-9
diff --git a/modules/bs.position/data/bs.position/test/get/pos_x.mcfunction b/modules/bs.position/data/bs.position/test/get/pos_x.mcfunction
new file mode 100644
index 0000000000..d790e0a397
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/get/pos_x.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute at @s positioned ~1 ~1 ~1 run function #bs.position:get_pos_x {scale:10}
+
+execute store result score #x bs.ctx run data get entity @s Pos[0] 10
+scoreboard players operation #x bs.ctx -= @s bs.pos.x
+
+assert score #x bs.ctx matches -11..-9
diff --git a/modules/bs.position/data/bs.position/test/get/pos_y.mcfunction b/modules/bs.position/data/bs.position/test/get/pos_y.mcfunction
new file mode 100644
index 0000000000..c8065c0417
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/get/pos_y.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute at @s positioned ~1 ~1 ~1 run function #bs.position:get_pos_y {scale:10}
+
+execute store result score #y bs.ctx run data get entity @s Pos[1] 10
+scoreboard players operation #y bs.ctx -= @s bs.pos.y
+
+assert score #y bs.ctx matches -11..-9
diff --git a/modules/bs.position/data/bs.position/test/get/pos_z.mcfunction b/modules/bs.position/data/bs.position/test/get/pos_z.mcfunction
new file mode 100644
index 0000000000..9bb0b0bdc0
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/get/pos_z.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute at @s positioned ~1 ~1 ~1 run function #bs.position:get_pos_z {scale:10}
+
+execute store result score #z bs.ctx run data get entity @s Pos[2] 10
+scoreboard players operation #z bs.ctx -= @s bs.pos.z
+
+assert score #z bs.ctx matches -11..-9
diff --git a/modules/bs.position/data/bs.position/test/get/relative_ata.mcfunction b/modules/bs.position/data/bs.position/test/get/relative_ata.mcfunction
new file mode 100644
index 0000000000..52b0d2bad5
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/get/relative_ata.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute at @s positioned ~-2.7 ~-5.2 ~-3.4 run function #bs.position:get_relative_ata {scale:10}
+
+assert score @s bs.pos.x matches 27
+assert score @s bs.pos.y matches 52
+assert score @s bs.pos.z matches 34
diff --git a/modules/bs.position/data/bs.position/test/get/relative_from_dir.mcfunction b/modules/bs.position/data/bs.position/test/get/relative_from_dir.mcfunction
new file mode 100644
index 0000000000..38e496fb94
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/get/relative_from_dir.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute at @s rotated 35 -18 run function #bs.position:get_relative_from_dir {scale:1000}
+
+assert score @s bs.pos.x matches -546..-544
+assert score @s bs.pos.y matches 307..309
+assert score @s bs.pos.z matches 778..780
diff --git a/modules/bs.position/data/bs.position/test/get/rot.mcfunction b/modules/bs.position/data/bs.position/test/get/rot.mcfunction
new file mode 100644
index 0000000000..fe0c8a3440
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/get/rot.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute at @s rotated ~1 ~1 run function #bs.position:get_rot {scale:10}
+
+execute store result score #h bs.ctx run data get entity @s Rotation[0] 10
+execute store result score #v bs.ctx run data get entity @s Rotation[1] 10
+
+scoreboard players operation #h bs.ctx -= @s bs.rot.h
+scoreboard players operation #v bs.ctx -= @s bs.rot.v
+
+assert score #h bs.ctx matches -11..-9
+assert score #v bs.ctx matches -11..-9
diff --git a/modules/bs.position/data/bs.position/test/get/rot_h.mcfunction b/modules/bs.position/data/bs.position/test/get/rot_h.mcfunction
new file mode 100644
index 0000000000..ecfd4cd9bb
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/get/rot_h.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute at @s rotated ~1 ~1 run function #bs.position:get_rot_h {scale:10}
+
+execute store result score #h bs.ctx run data get entity @s Rotation[0] 10
+scoreboard players operation #h bs.ctx -= @s bs.rot.h
+
+assert score #h bs.ctx matches -11..-9
diff --git a/modules/bs.position/data/bs.position/test/get/rot_v.mcfunction b/modules/bs.position/data/bs.position/test/get/rot_v.mcfunction
new file mode 100644
index 0000000000..ca81e7ca41
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/get/rot_v.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute at @s rotated ~1 ~1 run function #bs.position:get_rot_v {scale:10}
+
+execute store result score #v bs.ctx run data get entity @s Rotation[1] 10
+scoreboard players operation #v bs.ctx -= @s bs.rot.v
+
+assert score #v bs.ctx matches -11..-9
diff --git a/modules/bs.position/data/bs.position/test/set/pos.mcfunction b/modules/bs.position/data/bs.position/test/set/pos.mcfunction
new file mode 100644
index 0000000000..4c50de32df
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/set/pos.mcfunction
@@ -0,0 +1,32 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute store result score @s bs.pos.x run random value -10000..10000
+execute store result score @s bs.pos.y run random value -10000..10000
+execute store result score @s bs.pos.z run random value -10000..10000
+function #bs.position:set_pos {scale:.001}
+
+execute store result score #x bs.ctx run data get entity @s Pos[0] 1000
+execute store result score #y bs.ctx run data get entity @s Pos[1] 1000
+execute store result score #z bs.ctx run data get entity @s Pos[2] 1000
+
+scoreboard players operation #x bs.ctx -= @s bs.pos.x
+scoreboard players operation #y bs.ctx -= @s bs.pos.y
+scoreboard players operation #z bs.ctx -= @s bs.pos.z
+
+assert score #x bs.ctx matches -2..2
+assert score #y bs.ctx matches -2..2
+assert score #z bs.ctx matches -2..2
diff --git a/modules/bs.position/data/bs.position/test/set/pos_and_rot.mcfunction b/modules/bs.position/data/bs.position/test/set/pos_and_rot.mcfunction
new file mode 100644
index 0000000000..c70e5558f7
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/set/pos_and_rot.mcfunction
@@ -0,0 +1,43 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:marker ~ ~ ~ {Tags:["bs.packtest"]}
+
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.pos.x run random value -10000..10000
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.pos.y run random value -10000..10000
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.pos.z run random value -10000..10000
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h run random value -10000..10000
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v run random value -10000..10000
+execute as @n[type=minecraft:marker,tag=bs.packtest] run function #bs.position:set_pos_and_rot {scale:.001}
+
+execute store result score #x bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Pos[0] 1000
+execute store result score #y bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Pos[1] 1000
+execute store result score #z bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Pos[2] 1000
+execute store result score #h bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[0] 1000
+execute store result score #v bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[1] 1000
+
+scoreboard players operation #x bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.pos.x
+scoreboard players operation #y bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.pos.y
+scoreboard players operation #z bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.pos.z
+scoreboard players operation #h bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h
+scoreboard players operation #v bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v
+
+kill @n[type=minecraft:marker,tag=bs.packtest]
+
+assert score #x bs.ctx matches -2..2
+assert score #y bs.ctx matches -2..2
+assert score #z bs.ctx matches -2..2
+assert score #h bs.ctx matches -2..2
+assert score #v bs.ctx matches -2..2
diff --git a/modules/bs.position/data/bs.position/test/set/pos_x.mcfunction b/modules/bs.position/data/bs.position/test/set/pos_x.mcfunction
new file mode 100644
index 0000000000..833c8ccaa9
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/set/pos_x.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute store result score @s bs.pos.x run random value -10000..10000
+function #bs.position:set_pos_x {scale:.001}
+execute store result score #x bs.ctx run data get entity @s Pos[0] 1000
+scoreboard players operation #x bs.ctx -= @s bs.pos.x
+
+assert score #x bs.ctx matches -2..2
diff --git a/modules/bs.position/data/bs.position/test/set/pos_y.mcfunction b/modules/bs.position/data/bs.position/test/set/pos_y.mcfunction
new file mode 100644
index 0000000000..fe10c4d7b5
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/set/pos_y.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute store result score @s bs.pos.y run random value -10000..10000
+function #bs.position:set_pos_y {scale:.001}
+execute store result score #y bs.ctx run data get entity @s Pos[1] 1000
+scoreboard players operation #y bs.ctx -= @s bs.pos.y
+
+assert score #y bs.ctx matches -2..2
diff --git a/modules/bs.position/data/bs.position/test/set/pos_z.mcfunction b/modules/bs.position/data/bs.position/test/set/pos_z.mcfunction
new file mode 100644
index 0000000000..f1d9c28b7b
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/set/pos_z.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute store result score @s bs.pos.z run random value -10000..10000
+function #bs.position:set_pos_z {scale:.001}
+execute store result score #z bs.ctx run data get entity @s Pos[2] 1000
+scoreboard players operation #z bs.ctx -= @s bs.pos.z
+
+assert score #z bs.ctx matches -2..2
diff --git a/modules/bs.position/data/bs.position/test/set/rot.mcfunction b/modules/bs.position/data/bs.position/test/set/rot.mcfunction
new file mode 100644
index 0000000000..2634d30f52
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/set/rot.mcfunction
@@ -0,0 +1,31 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:marker ~ ~ ~ {Tags:["bs.packtest"]}
+
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h run random value -10000..10000
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v run random value -10000..10000
+execute as @n[type=minecraft:marker,tag=bs.packtest] run function #bs.position:set_rot {scale:.001}
+
+execute store result score #h bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[0] 1000
+execute store result score #v bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[1] 1000
+
+scoreboard players operation #h bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h
+scoreboard players operation #v bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v
+
+kill @n[type=minecraft:marker,tag=bs.packtest]
+
+assert score #h bs.ctx matches -2..2
+assert score #v bs.ctx matches -2..2
diff --git a/modules/bs.position/data/bs.position/test/set/rot_h.mcfunction b/modules/bs.position/data/bs.position/test/set/rot_h.mcfunction
new file mode 100644
index 0000000000..a92dc38424
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/set/rot_h.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:marker ~ ~ ~ {Tags:["bs.packtest"]}
+
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h run random value -10000..10000
+execute as @n[type=minecraft:marker,tag=bs.packtest] run function #bs.position:set_rot_h {scale:.001}
+execute store result score #h bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[0] 1000
+scoreboard players operation #h bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.h
+
+kill @n[type=minecraft:marker,tag=bs.packtest]
+
+assert score #h bs.ctx matches -2..2
diff --git a/modules/bs.position/data/bs.position/test/set/rot_v.mcfunction b/modules/bs.position/data/bs.position/test/set/rot_v.mcfunction
new file mode 100644
index 0000000000..9d3fae4d46
--- /dev/null
+++ b/modules/bs.position/data/bs.position/test/set/rot_v.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:marker ~ ~ ~ {Tags:["bs.packtest"]}
+
+execute store result score @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v run random value -10000..10000
+execute as @n[type=minecraft:marker,tag=bs.packtest] run function #bs.position:set_rot_v {scale:.001}
+execute store result score #v bs.ctx run data get entity @n[type=minecraft:marker,tag=bs.packtest] Rotation[1] 1000
+scoreboard players operation #v bs.ctx -= @n[type=minecraft:marker,tag=bs.packtest] bs.rot.v
+
+kill @n[type=minecraft:marker,tag=bs.packtest]
+
+assert score #v bs.ctx matches -2..2
diff --git a/modules/bs.position/module.json b/modules/bs.position/module.json
new file mode 100644
index 0000000000..07a2bfe8aa
--- /dev/null
+++ b/modules/bs.position/module.json
@@ -0,0 +1,14 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.position",
+ "load": "."
+ },
+ "meta": {
+ "name": "Position",
+ "slug": "bookshelf-position",
+ "description": "Manage entity positions and rotations using scores.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/position.html",
+ "tags": ["default"]
+ }
+}
diff --git a/modules/bs.random/README.md b/modules/bs.random/README.md
new file mode 100644
index 0000000000..090f339144
--- /dev/null
+++ b/modules/bs.random/README.md
@@ -0,0 +1,14 @@
+# 🎲 Bookshelf Random
+
+This datapack provides a variety of random functions, including different distributions and noise patterns.
+
+> “Creativity is the ability to introduce order into the randomness of nature.”
+>
+> -- Eric Hoffer
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/random.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.random/data/bs.random/function/__load__.mcfunction b/modules/bs.random/data/bs.random/function/__load__.mcfunction
new file mode 100644
index 0000000000..92035008a1
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/__load__.mcfunction
@@ -0,0 +1,48 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+forceload add -30000000 1600
+setblock -30000000 0 1606 minecraft:decorated_pot
+
+scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
+scoreboard objectives add bs.in dummy [{"text":"BS ","color":"dark_gray"},{"text":"Input","color":"aqua"}]
+
+scoreboard players set -1000 bs.const -1000
+scoreboard players set 2 bs.const 2
+scoreboard players set 8 bs.const 8
+scoreboard players set 10 bs.const 10
+scoreboard players set 12 bs.const 12
+scoreboard players set 13 bs.const 13
+scoreboard players set 14 bs.const 14
+scoreboard players set 24 bs.const 24
+scoreboard players set 78 bs.const 78
+scoreboard players set 100 bs.const 100
+scoreboard players set 1000 bs.const 1000
+scoreboard players set 10000 bs.const 10000
+scoreboard players set 65536 bs.const 65536
+scoreboard players set 26645 bs.const 26645
+scoreboard players set 29447 bs.const 29447
+scoreboard players set 32544 bs.const 32544
+scoreboard players set 35967 bs.const 35967
+scoreboard players set 39750 bs.const 39750
+scoreboard players set 43930 bs.const 43930
+scoreboard players set 48550 bs.const 48550
+scoreboard players set 53656 bs.const 53656
+scoreboard players set 59299 bs.const 59299
+scoreboard players set 1000000000 bs.const 1000000000
+
+execute unless data storage bs:const log.messages[{namespaces: ["bs.random"]}] run data modify storage bs:const log.messages[{namespaces: ["bs"]}].namespaces append value "bs.random"
diff --git a/modules/bs.random/data/bs.random/function/__unload__.mcfunction b/modules/bs.random/data/bs.random/function/__unload__.mcfunction
new file mode 100644
index 0000000000..c61cc046bc
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/__unload__.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock -30000000 0 1606 minecraft:air
+forceload remove -30000000 1600
+
+scoreboard objectives remove bs.const
+scoreboard objectives remove bs.ctx
+scoreboard objectives remove bs.out
+scoreboard objectives remove bs.in
+
+data remove storage bs:in random
+data remove storage bs:out random
diff --git a/modules/bs.random/data/bs.random/function/choice/choice.mcfunction b/modules/bs.random/data/bs.random/function/choice/choice.mcfunction
new file mode 100644
index 0000000000..edf0a9a914
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/choice/choice.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #l bs.ctx if data storage bs:in random.choice.options[]
+execute store result score #i bs.ctx run random value 0..1000
+scoreboard players remove #l bs.ctx 1
+execute store result storage bs:ctx y int .001 run scoreboard players operation #i bs.ctx *= #l bs.ctx
+function bs.random:choice/get with storage bs:ctx
+return run data get storage bs:ctx y
diff --git a/modules/bs.random/data/bs.random/function/choice/get.mcfunction b/modules/bs.random/data/bs.random/function/choice/get.mcfunction
new file mode 100644
index 0000000000..b77492f6ee
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/choice/get.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:out random.choice set from storage bs:in random.choice.options[$(y)]
diff --git a/modules/bs.random/data/bs.random/function/distributions/binomial/binomial.mcfunction b/modules/bs.random/data/bs.random/function/distributions/binomial/binomial.mcfunction
new file mode 100644
index 0000000000..06f200882b
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/distributions/binomial/binomial.mcfunction
@@ -0,0 +1,37 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Modified from https://github.com/Aeldrion/Minecraft-Random
+$data modify storage bs:ctx _ set value {n:$(trials),p:$(probability)}
+execute store result score #n bs.ctx run data get storage bs:ctx _.n
+execute store result score #p bs.ctx run data get storage bs:ctx _.p 1000000000
+
+execute unless score #n bs.ctx matches 1..1000 run function #bs.log:error { \
+ namespace:"bs.random", \
+ tag:"binomial", \
+ message:'"Trials must be between 1 and 1000."', \
+ path:"bs.random:distributions/binomial/binomial", \
+}
+
+execute unless score #p bs.ctx matches 0..1000000000 run function #bs.log:error { \
+ namespace:"bs.random", \
+ tag:"binomial", \
+ message:'"Probability must be between 0 and 1."', \
+ path:"bs.random:distributions/binomial/binomial", \
+}
+
+scoreboard players set $random.binomial bs.out 0
+execute if score #n bs.ctx matches 1..1000 if score #p bs.ctx matches 1..1000000000 run function bs.random:distributions/binomial/loop
+return run scoreboard players get $random.binomial bs.out
diff --git a/modules/bs.random/data/bs.random/function/distributions/binomial/loop.mcfunction b/modules/bs.random/data/bs.random/function/distributions/binomial/loop.mcfunction
new file mode 100644
index 0000000000..61c8f35364
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/distributions/binomial/loop.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Modified from https://github.com/Aeldrion/Minecraft-Random
+execute if predicate {"condition":"minecraft:value_check","value":{"min":1,"max":1000000000},"range":{"min":1,"max":{"type":"minecraft:score","score":"bs.ctx","target":{"type":"minecraft:fixed","name":"#p"}}}} run scoreboard players add $random.binomial bs.out 1
+scoreboard players remove #n bs.ctx 1
+execute if score #n bs.ctx matches 1.. run function bs.random:distributions/binomial/loop
diff --git a/modules/bs.random/data/bs.random/function/distributions/geometric/geometric.mcfunction b/modules/bs.random/data/bs.random/function/distributions/geometric/geometric.mcfunction
new file mode 100644
index 0000000000..f4a9693beb
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/distributions/geometric/geometric.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Modified from https://github.com/Aeldrion/Minecraft-Random
+$data modify storage bs:ctx _ set value $(probability)
+execute store result score #p bs.ctx run data get storage bs:ctx _ 1000000000
+
+execute unless score #p bs.ctx matches 0..1000000000 run function #bs.log:error { \
+ namespace:"bs.random", \
+ tag:"geometric", \
+ message:'"Probability must be between 0 and 1."', \
+ path:"bs.random:distributions/geometric/geometric", \
+}
+
+scoreboard players set $random.geometric bs.out 0
+function bs.random:distributions/geometric/loop
+return run scoreboard players get $random.geometric bs.out
diff --git a/modules/bs.random/data/bs.random/function/distributions/geometric/loop.mcfunction b/modules/bs.random/data/bs.random/function/distributions/geometric/loop.mcfunction
new file mode 100644
index 0000000000..f8cb2b2b04
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/distributions/geometric/loop.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Modified from https://github.com/Aeldrion/Minecraft-Random
+scoreboard players add $random.geometric bs.out 1
+execute unless predicate {"condition":"minecraft:value_check","value":{"min":1,"max":1000000000},"range":{"min":1,"max":{"type":"minecraft:score","score":"bs.ctx","target":{"type":"minecraft:fixed","name":"#p"}}}} unless score $random.geometric bs.out matches 1000 run function bs.random:distributions/geometric/loop
diff --git a/modules/bs.random/data/bs.random/function/distributions/poisson/loop.mcfunction b/modules/bs.random/data/bs.random/function/distributions/poisson/loop.mcfunction
new file mode 100644
index 0000000000..a479b365ea
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/distributions/poisson/loop.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Modified from https://github.com/Aeldrion/Minecraft-Random
+scoreboard players add #k bs.ctx 1
+
+execute store result score #m bs.ctx run random value 0..65536
+scoreboard players operation #p bs.ctx /= 65536 bs.const
+scoreboard players operation #p bs.ctx *= #m bs.ctx
+
+execute if score #p bs.ctx > #e bs.ctx run function bs.random:distributions/poisson/loop
diff --git a/modules/bs.random/data/bs.random/function/distributions/poisson/poisson.mcfunction b/modules/bs.random/data/bs.random/function/distributions/poisson/poisson.mcfunction
new file mode 100644
index 0000000000..6e26192b5b
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/distributions/poisson/poisson.mcfunction
@@ -0,0 +1,64 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Modified from https://github.com/Aeldrion/Minecraft-Random
+
+# Save expected value as two scores
+$data modify storage bs:ctx _ set value $(lambda)
+execute store result score #i bs.ctx run data get storage bs:ctx _
+execute store result score #d bs.ctx run data get storage bs:ctx _ 10
+execute unless score #d bs.ctx matches 0..100 run function #bs.log:error { \
+ namespace:"bs.random", \
+ tag:"poisson", \
+ message:'"Lambda must be between 0 and 10."', \
+ path:"bs.random:distributions/poisson/poisson", \
+}
+scoreboard players operation #d bs.ctx %= 10 bs.const
+
+# Make sure expected value is valid
+execute if score #i bs.ctx matches ..-1 run scoreboard players set #i bs.ctx 0
+execute if score #i bs.ctx matches 11.. run scoreboard players set #i bs.ctx 10
+execute if score #i bs.ctx matches 0 if score #d bs.ctx matches 0 run scoreboard players set #d bs.ctx 1
+
+# Evaluate exp(-l). The result is a number between 0 and 1 (but not 0), we save it with a scale of 2147483648
+execute if score #i bs.ctx matches 0 run scoreboard players set #e bs.ctx 32768
+execute if score #i bs.ctx matches 1 run scoreboard players set #e bs.ctx 12054
+execute if score #i bs.ctx matches 2 run scoreboard players set #e bs.ctx 4434
+execute if score #i bs.ctx matches 3 run scoreboard players set #e bs.ctx 1631
+execute if score #i bs.ctx matches 4 run scoreboard players set #e bs.ctx 600
+execute if score #i bs.ctx matches 5 run scoreboard players set #e bs.ctx 221
+execute if score #i bs.ctx matches 6 run scoreboard players set #e bs.ctx 81
+execute if score #i bs.ctx matches 7 run scoreboard players set #e bs.ctx 30
+execute if score #i bs.ctx matches 8 run scoreboard players set #e bs.ctx 11
+execute if score #i bs.ctx matches 9 run scoreboard players set #e bs.ctx 4
+execute if score #i bs.ctx matches 10 run scoreboard players set #e bs.ctx 2
+
+# e * exp(0)*65536, e * exp(-0.1)*65536, e * exp(-0.2)*65536, ..., e * exp(-0.9)*65536,
+execute if score #d bs.ctx matches 0 run scoreboard players operation #e bs.ctx *= 65536 bs.const
+execute if score #d bs.ctx matches 1 run scoreboard players operation #e bs.ctx *= 59299 bs.const
+execute if score #d bs.ctx matches 2 run scoreboard players operation #e bs.ctx *= 53656 bs.const
+execute if score #d bs.ctx matches 3 run scoreboard players operation #e bs.ctx *= 48550 bs.const
+execute if score #d bs.ctx matches 4 run scoreboard players operation #e bs.ctx *= 43930 bs.const
+execute if score #d bs.ctx matches 5 run scoreboard players operation #e bs.ctx *= 39750 bs.const
+execute if score #d bs.ctx matches 6 run scoreboard players operation #e bs.ctx *= 35967 bs.const
+execute if score #d bs.ctx matches 7 run scoreboard players operation #e bs.ctx *= 32544 bs.const
+execute if score #d bs.ctx matches 8 run scoreboard players operation #e bs.ctx *= 29447 bs.const
+execute if score #d bs.ctx matches 9 run scoreboard players operation #e bs.ctx *= 26645 bs.const
+
+# Draw random number using Knuth's method
+scoreboard players set #p bs.ctx 2147483647
+scoreboard players set #k bs.ctx -1
+function bs.random:distributions/poisson/loop
+return run scoreboard players operation $random.poisson bs.out = #k bs.ctx
diff --git a/modules/bs.random/data/bs.random/function/distributions/uniform.mcfunction b/modules/bs.random/data/bs.random/function/distributions/uniform.mcfunction
new file mode 100644
index 0000000000..7d56b21466
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/distributions/uniform.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result score $random.uniform bs.out run return run random value $(min)..$(max)
diff --git a/modules/bs.random/data/bs.random/function/noise/fractal_noise_2d/fractal_noise_2d.mcfunction b/modules/bs.random/data/bs.random/function/noise/fractal_noise_2d/fractal_noise_2d.mcfunction
new file mode 100644
index 0000000000..9efd097d17
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/noise/fractal_noise_2d/fractal_noise_2d.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set #m bs.ctx 0
+scoreboard players set #a bs.ctx 1000
+scoreboard players set #f bs.ctx 1000
+scoreboard players set $random.fractal_noise_2d bs.out 0
+
+scoreboard players operation #o bs.ctx = $random.fractal_noise_2d.octaves bs.in
+scoreboard players operation $random.simplex_noise_2d.seed bs.in = $random.fractal_noise_2d.seed bs.in
+
+execute if score #o bs.ctx matches 1.. run function bs.random:noise/fractal_noise_2d/loop
+return run scoreboard players operation $random.fractal_noise_2d bs.out /= #m bs.ctx
diff --git a/modules/bs.random/data/bs.random/function/noise/fractal_noise_2d/loop.mcfunction b/modules/bs.random/data/bs.random/function/noise/fractal_noise_2d/loop.mcfunction
new file mode 100644
index 0000000000..47c74024ed
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/noise/fractal_noise_2d/loop.mcfunction
@@ -0,0 +1,38 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Generate noise at the current frequency
+scoreboard players operation $random.simplex_noise_2d.x bs.in = $random.fractal_noise_2d.x bs.in
+scoreboard players operation $random.simplex_noise_2d.y bs.in = $random.fractal_noise_2d.y bs.in
+scoreboard players operation $random.simplex_noise_2d.x bs.in *= #f bs.ctx
+scoreboard players operation $random.simplex_noise_2d.y bs.in *= #f bs.ctx
+scoreboard players operation $random.simplex_noise_2d.x bs.in /= 1000 bs.const
+scoreboard players operation $random.simplex_noise_2d.y bs.in /= 1000 bs.const
+function bs.random:noise/simplex_noise_2d/simplex_noise_2d
+
+scoreboard players operation $random.simplex_noise_2d bs.out *= #a bs.ctx
+scoreboard players operation $random.fractal_noise_2d bs.out += $random.simplex_noise_2d bs.out
+
+# Update maximum possible amplitude for normalization
+scoreboard players operation #m bs.ctx += #a bs.ctx
+
+# Update amplitude and frequency for the next octave
+scoreboard players operation #a bs.ctx *= $random.fractal_noise_2d.persistence bs.in
+scoreboard players operation #a bs.ctx /= 1000 bs.const
+scoreboard players operation #f bs.ctx *= $random.fractal_noise_2d.lacunarity bs.in
+scoreboard players operation #f bs.ctx /= 1000 bs.const
+
+scoreboard players remove #o bs.ctx 1
+execute if score #o bs.ctx matches 1.. run function bs.random:noise/fractal_noise_2d/loop
diff --git a/modules/bs.random/data/bs.random/function/noise/fractal_noise_mat_2d/fractal_noise_mat_2d.mcfunction b/modules/bs.random/data/bs.random/function/noise/fractal_noise_mat_2d/fractal_noise_mat_2d.mcfunction
new file mode 100644
index 0000000000..e23843b9d3
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/noise/fractal_noise_mat_2d/fractal_noise_mat_2d.mcfunction
@@ -0,0 +1,34 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx _ set value {octaves:4,persistence:.5,lacunarity:2.0,size:16,scale:1}
+$scoreboard players set #w bs.ctx $(width)
+$scoreboard players set #h bs.ctx $(height)
+$data modify storage bs:ctx _ merge value $(with)
+execute store result storage bs:ctx _.scale double .000001 run data get storage bs:ctx _.scale 1000
+
+execute store result score $random.fractal_noise_2d.octaves bs.in run data get storage bs:ctx _.octaves
+execute store result score $random.fractal_noise_2d.persistence bs.in run data get storage bs:ctx _.persistence 1000
+execute store result score $random.fractal_noise_2d.lacunarity bs.in run data get storage bs:ctx _.lacunarity 1000
+execute if data storage bs:ctx _.seed store result score $random.fractal_noise_2d.seed bs.in run data get storage bs:ctx _.seed
+execute unless data storage bs:ctx _.seed store result score $random.fractal_noise_2d.seed bs.in run random value 1.. bs.random:fractal_noise_mat_2d
+
+scoreboard players set #k bs.ctx 1000
+execute store result score #c bs.ctx run data get storage bs:ctx _.size
+scoreboard players operation #k bs.ctx /= #c bs.ctx
+
+execute store result score $random.fractal_noise_2d.y bs.in run scoreboard players set #y bs.ctx 0
+data modify storage bs:out random.fractal_noise_mat_2d set value []
+execute if score #h bs.ctx matches 1.. if score #w bs.ctx matches 1.. run function bs.random:noise/fractal_noise_mat_2d/yloop
diff --git a/modules/bs.random/data/bs.random/function/noise/fractal_noise_mat_2d/xloop.mcfunction b/modules/bs.random/data/bs.random/function/noise/fractal_noise_mat_2d/xloop.mcfunction
new file mode 100644
index 0000000000..e53e119051
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/noise/fractal_noise_mat_2d/xloop.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:out random.fractal_noise_mat_2d[-1] append value 0f
+$execute store result storage bs:out random.fractal_noise_mat_2d[-1][-1] float $(scale) run function #bs.random:fractal_noise_2d
+
+execute store result score $random.fractal_noise_2d.x bs.in run scoreboard players add #x bs.ctx 1
+scoreboard players operation $random.fractal_noise_2d.x bs.in *= #k bs.ctx
+execute if score #x bs.ctx < #w bs.ctx run function bs.random:noise/fractal_noise_mat_2d/xloop with storage bs:ctx _
diff --git a/modules/bs.random/data/bs.random/function/noise/fractal_noise_mat_2d/yloop.mcfunction b/modules/bs.random/data/bs.random/function/noise/fractal_noise_mat_2d/yloop.mcfunction
new file mode 100644
index 0000000000..0f4526a0d9
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/noise/fractal_noise_mat_2d/yloop.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score $random.fractal_noise_2d.x bs.in run scoreboard players set #x bs.ctx 0
+data modify storage bs:out random.fractal_noise_mat_2d append value []
+function bs.random:noise/fractal_noise_mat_2d/xloop with storage bs:ctx _
+
+execute store result score $random.fractal_noise_2d.y bs.in run scoreboard players add #y bs.ctx 1
+scoreboard players operation $random.fractal_noise_2d.y bs.in *= #k bs.ctx
+execute if score #y bs.ctx < #h bs.ctx run function bs.random:noise/fractal_noise_mat_2d/yloop
diff --git a/datapacks/Bookshelf/data/bs.random/function/noise/simplex_noise_2d/gradient.mcfunction b/modules/bs.random/data/bs.random/function/noise/simplex_noise_2d/gradient.mcfunction
similarity index 94%
rename from datapacks/Bookshelf/data/bs.random/function/noise/simplex_noise_2d/gradient.mcfunction
rename to modules/bs.random/data/bs.random/function/noise/simplex_noise_2d/gradient.mcfunction
index 37c307782e..645fac140e 100644
--- a/datapacks/Bookshelf/data/bs.random/function/noise/simplex_noise_2d/gradient.mcfunction
+++ b/modules/bs.random/data/bs.random/function/noise/simplex_noise_2d/gradient.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise-algorithms
# ------------------------------------------------------------------------------------------------------------
execute if score #t bs.ctx matches ..0 run return run scoreboard players set #n bs.ctx 0
diff --git a/modules/bs.random/data/bs.random/function/noise/simplex_noise_2d/simplex_noise_2d.mcfunction b/modules/bs.random/data/bs.random/function/noise/simplex_noise_2d/simplex_noise_2d.mcfunction
new file mode 100644
index 0000000000..76686db2c9
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/noise/simplex_noise_2d/simplex_noise_2d.mcfunction
@@ -0,0 +1,84 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation #c bs.ctx = $random.simplex_noise_2d.x bs.in
+scoreboard players operation #d bs.ctx = $random.simplex_noise_2d.y bs.in
+scoreboard players operation #c bs.ctx %= 1000000000 bs.const
+
+# Skew the input space to determine which simplex cell we're in
+execute store result score #i bs.ctx store result score #s bs.ctx run scoreboard players add #c bs.ctx 1000
+execute store result score #j bs.ctx run scoreboard players operation #d bs.ctx %= 1000000000 bs.const
+execute store result storage bs:ctx y int 1 run scoreboard players operation #s bs.ctx += #d bs.ctx
+execute store result score #s bs.ctx run data get storage bs:ctx y .36602540378
+
+scoreboard players operation #i bs.ctx += #s bs.ctx
+execute store result score #u bs.ctx store result score #t bs.ctx run scoreboard players operation #i bs.ctx /= 1000 bs.const
+scoreboard players operation #j bs.ctx += #s bs.ctx
+execute store result score #v bs.ctx run scoreboard players operation #j bs.ctx /= 1000 bs.const
+execute store result storage bs:ctx y int 1 run scoreboard players operation #t bs.ctx += #j bs.ctx
+execute store result score #t bs.ctx run data get storage bs:ctx y 211.3248654
+
+scoreboard players operation #u bs.ctx *= -1000 bs.const
+scoreboard players operation #v bs.ctx *= -1000 bs.const
+scoreboard players operation #u bs.ctx += #t bs.ctx
+scoreboard players operation #v bs.ctx += #t bs.ctx
+execute store result score #t bs.ctx run scoreboard players operation #u bs.ctx += #c bs.ctx
+execute store result score #d bs.ctx run scoreboard players operation #v bs.ctx += #d bs.ctx
+
+# Determine which simplex cell we are in
+execute store success score #c bs.ctx if score #u bs.ctx > #v bs.ctx
+
+# Calculate the contribution from the first corner
+scoreboard players operation #t bs.ctx *= #t bs.ctx
+scoreboard players operation #d bs.ctx *= #d bs.ctx
+scoreboard players operation #t bs.ctx += #d bs.ctx
+scoreboard players remove #t bs.ctx 500000
+scoreboard players operation #t bs.ctx /= -1000 bs.const
+scoreboard players set #n bs.ctx 0
+execute if score #t bs.ctx matches 1.. run function bs.random:noise/simplex_noise_2d/gradient
+scoreboard players operation $random.simplex_noise_2d bs.out = #n bs.ctx
+
+# Calculate the contribution from the second corner
+execute store result score #t bs.ctx run scoreboard players remove #u bs.ctx 578
+execute store result score #d bs.ctx run scoreboard players remove #v bs.ctx 578
+scoreboard players operation #t bs.ctx *= #t bs.ctx
+scoreboard players operation #d bs.ctx *= #d bs.ctx
+scoreboard players operation #t bs.ctx += #d bs.ctx
+scoreboard players remove #t bs.ctx 500000
+scoreboard players operation #t bs.ctx /= -1000 bs.const
+scoreboard players add #i bs.ctx 1
+scoreboard players add #j bs.ctx 1
+scoreboard players set #n bs.ctx 0
+execute if score #t bs.ctx matches 1.. run function bs.random:noise/simplex_noise_2d/gradient
+scoreboard players operation $random.simplex_noise_2d bs.out += #n bs.ctx
+
+# Calculate the contribution from the third corner
+execute if score #c bs.ctx matches 1 run scoreboard players remove #u bs.ctx 1000
+execute if score #c bs.ctx matches 0 run scoreboard players remove #v bs.ctx 1000
+execute store result score #t bs.ctx run scoreboard players add #u bs.ctx 789
+execute store result score #d bs.ctx run scoreboard players add #v bs.ctx 789
+scoreboard players operation #t bs.ctx *= #t bs.ctx
+scoreboard players operation #d bs.ctx *= #d bs.ctx
+scoreboard players operation #t bs.ctx += #d bs.ctx
+scoreboard players remove #t bs.ctx 500000
+scoreboard players operation #t bs.ctx /= -1000 bs.const
+execute if score #c bs.ctx matches 0 run scoreboard players remove #i bs.ctx 1
+execute if score #c bs.ctx matches 1 run scoreboard players remove #j bs.ctx 1
+scoreboard players set #n bs.ctx 0
+execute if score #t bs.ctx matches 1.. run function bs.random:noise/simplex_noise_2d/gradient
+scoreboard players operation $random.simplex_noise_2d bs.out += #n bs.ctx
+
+# Scale the result to cover the range [-1000, 1000]
+return run scoreboard players operation $random.simplex_noise_2d bs.out /= 14 bs.const
diff --git a/modules/bs.random/data/bs.random/function/noise/simplex_noise_mat_2d/simplex_noise_mat_2d.mcfunction b/modules/bs.random/data/bs.random/function/noise/simplex_noise_mat_2d/simplex_noise_mat_2d.mcfunction
new file mode 100644
index 0000000000..a4c76dcfb3
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/noise/simplex_noise_mat_2d/simplex_noise_mat_2d.mcfunction
@@ -0,0 +1,31 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx _ set value {size:16,scale:1}
+$scoreboard players set #w bs.ctx $(width)
+$scoreboard players set #h bs.ctx $(height)
+$data modify storage bs:ctx _ merge value $(with)
+execute store result storage bs:ctx _.scale double .000001 run data get storage bs:ctx _.scale 1000
+
+execute if data storage bs:ctx _.seed store result score $random.simplex_noise_2d.seed bs.in run data get storage bs:ctx _.seed
+execute unless data storage bs:ctx _.seed store result score $random.simplex_noise_2d.seed bs.in run random value 1.. bs.random:simplex_noise_mat_2d
+
+scoreboard players set #k bs.ctx 1000
+execute store result score #c bs.ctx run data get storage bs:ctx _.size
+scoreboard players operation #k bs.ctx /= #c bs.ctx
+
+execute store result score $random.simplex_noise_2d.y bs.in run scoreboard players set #y bs.ctx 0
+data modify storage bs:out random.simplex_noise_mat_2d set value []
+execute if score #h bs.ctx matches 1.. if score #w bs.ctx matches 1.. run function bs.random:noise/simplex_noise_mat_2d/yloop
diff --git a/modules/bs.random/data/bs.random/function/noise/simplex_noise_mat_2d/xloop.mcfunction b/modules/bs.random/data/bs.random/function/noise/simplex_noise_mat_2d/xloop.mcfunction
new file mode 100644
index 0000000000..ad38f811bc
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/noise/simplex_noise_mat_2d/xloop.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:out random.simplex_noise_mat_2d[-1] append value 0f
+$execute store result storage bs:out random.simplex_noise_mat_2d[-1][-1] float $(scale) run function #bs.random:simplex_noise_2d
+
+execute store result score $random.simplex_noise_2d.x bs.in run scoreboard players add #x bs.ctx 1
+scoreboard players operation $random.simplex_noise_2d.x bs.in *= #k bs.ctx
+execute if score #x bs.ctx < #w bs.ctx run function bs.random:noise/simplex_noise_mat_2d/xloop with storage bs:ctx _
diff --git a/modules/bs.random/data/bs.random/function/noise/simplex_noise_mat_2d/yloop.mcfunction b/modules/bs.random/data/bs.random/function/noise/simplex_noise_mat_2d/yloop.mcfunction
new file mode 100644
index 0000000000..9385d8925f
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/noise/simplex_noise_mat_2d/yloop.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score $random.simplex_noise_2d.x bs.in run scoreboard players set #x bs.ctx 0
+data modify storage bs:out random.simplex_noise_mat_2d append value []
+function bs.random:noise/simplex_noise_mat_2d/xloop with storage bs:ctx _
+
+execute store result score $random.simplex_noise_2d.y bs.in run scoreboard players add #y bs.ctx 1
+scoreboard players operation $random.simplex_noise_2d.y bs.in *= #k bs.ctx
+execute if score #y bs.ctx < #h bs.ctx run function bs.random:noise/simplex_noise_mat_2d/yloop
diff --git a/modules/bs.random/data/bs.random/function/noise/white_noise_mat_1d/loop.mcfunction b/modules/bs.random/data/bs.random/function/noise/white_noise_mat_1d/loop.mcfunction
new file mode 100644
index 0000000000..f715a15217
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/noise/white_noise_mat_1d/loop.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players remove #i bs.ctx 1
+data modify storage bs:out random.white_noise_mat_1d append value 0f
+$execute store result storage bs:out random.white_noise_mat_1d[-1] float $(scale) run random value 1..1000
+execute if score #i bs.ctx matches 1.. run function bs.random:noise/white_noise_mat_1d/loop with storage bs:ctx _
diff --git a/modules/bs.random/data/bs.random/function/noise/white_noise_mat_1d/white_noise_mat_1d.mcfunction b/modules/bs.random/data/bs.random/function/noise/white_noise_mat_1d/white_noise_mat_1d.mcfunction
new file mode 100644
index 0000000000..a8d1e02938
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/noise/white_noise_mat_1d/white_noise_mat_1d.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx _ set value {scale:1}
+$scoreboard players set #i bs.ctx $(length)
+$data modify storage bs:ctx _ merge value $(with)
+execute store result storage bs:ctx _.scale double .000001 run data get storage bs:ctx _.scale 1000
+
+data modify storage bs:out random.white_noise_mat_1d set value []
+execute if score #i bs.ctx matches 1.. run function bs.random:noise/white_noise_mat_1d/loop with storage bs:ctx _
diff --git a/modules/bs.random/data/bs.random/function/noise/white_noise_mat_2d/white_noise_mat_2d.mcfunction b/modules/bs.random/data/bs.random/function/noise/white_noise_mat_2d/white_noise_mat_2d.mcfunction
new file mode 100644
index 0000000000..afd7cb7a3c
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/noise/white_noise_mat_2d/white_noise_mat_2d.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx _ set value {scale:1}
+$scoreboard players set #w bs.ctx $(width)
+$scoreboard players set #h bs.ctx $(height)
+$data modify storage bs:ctx _ merge value $(with)
+execute store result storage bs:ctx _.scale double .000001 run data get storage bs:ctx _.scale 1000
+
+scoreboard players set #y bs.ctx 0
+data modify storage bs:out random.white_noise_mat_2d set value []
+execute if score #h bs.ctx matches 1.. if score #w bs.ctx matches 1.. run function bs.random:noise/white_noise_mat_2d/yloop
diff --git a/modules/bs.random/data/bs.random/function/noise/white_noise_mat_2d/xloop.mcfunction b/modules/bs.random/data/bs.random/function/noise/white_noise_mat_2d/xloop.mcfunction
new file mode 100644
index 0000000000..512d84e3e3
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/noise/white_noise_mat_2d/xloop.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:out random.white_noise_mat_2d[-1] append value 0f
+$execute store result storage bs:out random.white_noise_mat_2d[-1][-1] float $(scale) run random value 1..1000
+scoreboard players add #x bs.ctx 1
+execute if score #x bs.ctx < #w bs.ctx run function bs.random:noise/white_noise_mat_2d/xloop with storage bs:ctx _
diff --git a/modules/bs.random/data/bs.random/function/noise/white_noise_mat_2d/yloop.mcfunction b/modules/bs.random/data/bs.random/function/noise/white_noise_mat_2d/yloop.mcfunction
new file mode 100644
index 0000000000..2ad6caaa07
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/noise/white_noise_mat_2d/yloop.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set #x bs.ctx 0
+data modify storage bs:out random.white_noise_mat_2d append value []
+function bs.random:noise/white_noise_mat_2d/xloop with storage bs:ctx _
+
+scoreboard players add #y bs.ctx 1
+execute if score #y bs.ctx < #h bs.ctx run function bs.random:noise/white_noise_mat_2d/yloop
diff --git a/modules/bs.random/data/bs.random/function/weighted_choice/loop.mcfunction b/modules/bs.random/data/bs.random/function/weighted_choice/loop.mcfunction
new file mode 100644
index 0000000000..6bf1aef193
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/weighted_choice/loop.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx _.pools[0].entries append value {type:"item",name:"cod",weight:1,functions:[{function:"set_custom_data",tag:{}}]}
+data modify storage bs:ctx _.pools[0].entries[-1].weight set from storage bs:ctx _.weights[0]
+data modify storage bs:ctx _.pools[0].entries[-1].functions[0].tag.v set from storage bs:ctx _.options[0]
+execute store result storage bs:ctx _.pools[0].entries[-1].functions[0].tag.i int 1 run scoreboard players add #i bs.ctx 1
+data remove storage bs:ctx _.options[0]
+data remove storage bs:ctx _.weights[0]
+execute if data storage bs:ctx _.options[-1] run function bs.random:weighted_choice/loop
diff --git a/modules/bs.random/data/bs.random/function/weighted_choice/run.mcfunction b/modules/bs.random/data/bs.random/function/weighted_choice/run.mcfunction
new file mode 100644
index 0000000000..551b8f060e
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/weighted_choice/run.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$loot replace block -30000000 0 1606 container.0 loot $(_)
+data modify storage bs:ctx _ set from block -30000000 0 1606 item.components."minecraft:custom_data"
+data modify storage bs:out random.weighted_choice set from storage bs:ctx _.v
+return run data get storage bs:ctx _.i
diff --git a/modules/bs.random/data/bs.random/function/weighted_choice/weighted_choice.mcfunction b/modules/bs.random/data/bs.random/function/weighted_choice/weighted_choice.mcfunction
new file mode 100644
index 0000000000..da72a5d007
--- /dev/null
+++ b/modules/bs.random/data/bs.random/function/weighted_choice/weighted_choice.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set #i bs.ctx -1
+data modify storage bs:ctx _ set value {pools:[{rolls:1,entries:[]}]}
+data modify storage bs:ctx _.options set from storage bs:in random.weighted_choice.options
+data modify storage bs:ctx _.weights set from storage bs:in random.weighted_choice.weights
+execute if data storage bs:ctx _.options[-1] run function bs.random:weighted_choice/loop
+return run function bs.random:weighted_choice/run with storage bs:ctx
diff --git a/datapacks/Bookshelf/data/bs.random/tags/function/binomial.json b/modules/bs.random/data/bs.random/tags/function/binomial.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.random/tags/function/binomial.json
rename to modules/bs.random/data/bs.random/tags/function/binomial.json
index 22b39bdefb..e4d416c4e8 100644
--- a/datapacks/Bookshelf/data/bs.random/tags/function/binomial.json
+++ b/modules/bs.random/data/bs.random/tags/function/binomial.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#random-distributions",
"authors": [
"SBtree"
],
diff --git a/modules/bs.random/data/bs.random/tags/function/choice.json b/modules/bs.random/data/bs.random/tags/function/choice.json
new file mode 100644
index 0000000000..ab03f4ccb7
--- /dev/null
+++ b/modules/bs.random/data/bs.random/tags/function/choice.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#random-choice",
+ "authors": [
+ "SBtree"
+ ],
+ "created": {
+ "date": "2024/06/17",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/08/05",
+ "minecraft_version": "1.21"
+ }
+ },
+ "values": [
+ "bs.random:choice/choice"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.random/tags/function/fractal_noise_2d.json b/modules/bs.random/data/bs.random/tags/function/fractal_noise_2d.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.random/tags/function/fractal_noise_2d.json
rename to modules/bs.random/data/bs.random/tags/function/fractal_noise_2d.json
index b411f65d01..a618457eb8 100644
--- a/datapacks/Bookshelf/data/bs.random/tags/function/fractal_noise_2d.json
+++ b/modules/bs.random/data/bs.random/tags/function/fractal_noise_2d.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#noise",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.random/tags/function/fractal_noise_mat_2d.json b/modules/bs.random/data/bs.random/tags/function/fractal_noise_mat_2d.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.random/tags/function/fractal_noise_mat_2d.json
rename to modules/bs.random/data/bs.random/tags/function/fractal_noise_mat_2d.json
index 9ed53fd0f1..8fe856fb77 100644
--- a/datapacks/Bookshelf/data/bs.random/tags/function/fractal_noise_mat_2d.json
+++ b/modules/bs.random/data/bs.random/tags/function/fractal_noise_mat_2d.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#noise",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.random/tags/function/geometric.json b/modules/bs.random/data/bs.random/tags/function/geometric.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.random/tags/function/geometric.json
rename to modules/bs.random/data/bs.random/tags/function/geometric.json
index 6c1693fa51..5fea7ff025 100644
--- a/datapacks/Bookshelf/data/bs.random/tags/function/geometric.json
+++ b/modules/bs.random/data/bs.random/tags/function/geometric.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#random-distributions",
"authors": [
"SBtree"
],
diff --git a/datapacks/Bookshelf/data/bs.random/tags/function/poisson.json b/modules/bs.random/data/bs.random/tags/function/poisson.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.random/tags/function/poisson.json
rename to modules/bs.random/data/bs.random/tags/function/poisson.json
index bc65a3aa22..23357d629d 100644
--- a/datapacks/Bookshelf/data/bs.random/tags/function/poisson.json
+++ b/modules/bs.random/data/bs.random/tags/function/poisson.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-distributions",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#random-distributions",
"authors": [
"SBtree"
],
diff --git a/datapacks/Bookshelf/data/bs.random/tags/function/simplex_noise_2d.json b/modules/bs.random/data/bs.random/tags/function/simplex_noise_2d.json
similarity index 79%
rename from datapacks/Bookshelf/data/bs.random/tags/function/simplex_noise_2d.json
rename to modules/bs.random/data/bs.random/tags/function/simplex_noise_2d.json
index 3756c6a813..9a8ac2e12e 100644
--- a/datapacks/Bookshelf/data/bs.random/tags/function/simplex_noise_2d.json
+++ b/modules/bs.random/data/bs.random/tags/function/simplex_noise_2d.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#noise",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.random/tags/function/simplex_noise_mat_2d.json b/modules/bs.random/data/bs.random/tags/function/simplex_noise_mat_2d.json
similarity index 80%
rename from datapacks/Bookshelf/data/bs.random/tags/function/simplex_noise_mat_2d.json
rename to modules/bs.random/data/bs.random/tags/function/simplex_noise_mat_2d.json
index 1536a00b0e..25db06f9fa 100644
--- a/datapacks/Bookshelf/data/bs.random/tags/function/simplex_noise_mat_2d.json
+++ b/modules/bs.random/data/bs.random/tags/function/simplex_noise_mat_2d.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#noise",
"authors": [
"Aksiome"
],
diff --git a/modules/bs.random/data/bs.random/tags/function/uniform.json b/modules/bs.random/data/bs.random/tags/function/uniform.json
new file mode 100644
index 0000000000..a227af08ac
--- /dev/null
+++ b/modules/bs.random/data/bs.random/tags/function/uniform.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#random-distributions",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2024/06/24",
+ "minecraft_version": "1.21"
+ },
+ "updated": {
+ "date": "2024/06/24",
+ "minecraft_version": "1.21"
+ }
+ },
+ "values": [
+ "bs.random:distributions/uniform"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.random/tags/function/weighted_choice.json b/modules/bs.random/data/bs.random/tags/function/weighted_choice.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.random/tags/function/weighted_choice.json
rename to modules/bs.random/data/bs.random/tags/function/weighted_choice.json
index f5d831009f..762f4603ca 100644
--- a/datapacks/Bookshelf/data/bs.random/tags/function/weighted_choice.json
+++ b/modules/bs.random/data/bs.random/tags/function/weighted_choice.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#random-choice",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#random-choice",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.random/tags/function/white_noise_mat_1d.json b/modules/bs.random/data/bs.random/tags/function/white_noise_mat_1d.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.random/tags/function/white_noise_mat_1d.json
rename to modules/bs.random/data/bs.random/tags/function/white_noise_mat_1d.json
index 87517d30b2..af0215d0f8 100644
--- a/datapacks/Bookshelf/data/bs.random/tags/function/white_noise_mat_1d.json
+++ b/modules/bs.random/data/bs.random/tags/function/white_noise_mat_1d.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#noise",
"authors": [
"Aksiome",
"SBtree"
diff --git a/datapacks/Bookshelf/data/bs.random/tags/function/white_noise_mat_2d.json b/modules/bs.random/data/bs.random/tags/function/white_noise_mat_2d.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.random/tags/function/white_noise_mat_2d.json
rename to modules/bs.random/data/bs.random/tags/function/white_noise_mat_2d.json
index 994841b11f..bb6066df10 100644
--- a/datapacks/Bookshelf/data/bs.random/tags/function/white_noise_mat_2d.json
+++ b/modules/bs.random/data/bs.random/tags/function/white_noise_mat_2d.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/random.html#noise",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html#noise",
"authors": [
"Aksiome",
"SBtree"
diff --git a/modules/bs.random/data/bs.random/test/choice.mcfunction b/modules/bs.random/data/bs.random/test/choice.mcfunction
new file mode 100644
index 0000000000..7c777a16cc
--- /dev/null
+++ b/modules/bs.random/data/bs.random/test/choice.mcfunction
@@ -0,0 +1,32 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# return a value that match the index
+data modify storage bs:in random.choice.options set value [0,1,2,3,4]
+execute store result score #i bs.ctx run function #bs.random:choice
+execute if score #i bs.ctx matches 0 run assert data storage bs:out random{choice:0}
+execute if score #i bs.ctx matches 1 run assert data storage bs:out random{choice:1}
+execute if score #i bs.ctx matches 2 run assert data storage bs:out random{choice:2}
+execute if score #i bs.ctx matches 3 run assert data storage bs:out random{choice:3}
+execute if score #i bs.ctx matches 4 run assert data storage bs:out random{choice:4}
+
+# it does not return the same index each time (using a large dataset)
+data modify storage bs:in random.choice.options set value [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50]
+execute store result score #0 bs.ctx run function #bs.random:choice
+execute store result score #1 bs.ctx run function #bs.random:choice
+execute store result score #2 bs.ctx run function #bs.random:choice
+execute store result score #3 bs.ctx run function #bs.random:choice
+execute store result score #4 bs.ctx run function #bs.random:choice
+execute if score #0 bs.ctx = #1 bs.ctx if score #1 bs.ctx = #2 bs.ctx if score #2 bs.ctx = #3 bs.ctx if score #3 bs.ctx = #4 bs.ctx run fail "Choice must return a random index each time"
diff --git a/modules/bs.random/data/bs.random/test/distributions/binomial.mcfunction b/modules/bs.random/data/bs.random/test/distributions/binomial.mcfunction
new file mode 100644
index 0000000000..8d19feef76
--- /dev/null
+++ b/modules/bs.random/data/bs.random/test/distributions/binomial.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# if probabilty is 1, should stop at last trial
+function #bs.random:binomial {trials:5,probability:1}
+assert score $random.binomial bs.out matches 5
+
+# if probability is 0, should not stop and no trial should succeed
+function #bs.random:binomial {trials:5,probability:0}
+assert score $random.binomial bs.out matches 0
diff --git a/modules/bs.random/data/bs.random/test/distributions/geometric.mcfunction b/modules/bs.random/data/bs.random/test/distributions/geometric.mcfunction
new file mode 100644
index 0000000000..1063b17436
--- /dev/null
+++ b/modules/bs.random/data/bs.random/test/distributions/geometric.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# if probabilty is 1, should stop at first trial
+function #bs.random:geometric {probability:1}
+assert score $random.geometric bs.out matches 1
+
+# if probability is 0, should not stop and should reach the bound (1000)
+function #bs.random:geometric {probability:0}
+assert score $random.geometric bs.out matches 1000
diff --git a/modules/bs.random/data/bs.random/test/distributions/poisson.mcfunction b/modules/bs.random/data/bs.random/test/distributions/poisson.mcfunction
new file mode 100644
index 0000000000..b5d988d951
--- /dev/null
+++ b/modules/bs.random/data/bs.random/test/distributions/poisson.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #0 bs.ctx run function #bs.random:poisson {lambda:1}
+execute store result score #1 bs.ctx run function #bs.random:poisson {lambda:3}
+execute store result score #2 bs.ctx run function #bs.random:poisson {lambda:5}
+execute store result score #3 bs.ctx run function #bs.random:poisson {lambda:7}
+execute store result score #4 bs.ctx run function #bs.random:poisson {lambda:9}
+execute if score #0 bs.ctx = #1 bs.ctx if score #1 bs.ctx = #2 bs.ctx if score #2 bs.ctx = #3 bs.ctx if score #3 bs.ctx = #4 bs.ctx run fail "The poisson distribution should not always return the same value"
diff --git a/modules/bs.random/data/bs.random/test/distributions/uniform.mcfunction b/modules/bs.random/data/bs.random/test/distributions/uniform.mcfunction
new file mode 100644
index 0000000000..8ccd8e2e98
--- /dev/null
+++ b/modules/bs.random/data/bs.random/test/distributions/uniform.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score #0 bs.ctx run function #bs.random:uniform {min:-10000000,max:10000000}
+execute store result score #1 bs.ctx run function #bs.random:uniform {min:-10000000,max:10000000}
+execute store result score #2 bs.ctx run function #bs.random:uniform {min:-10000000,max:10000000}
+execute store result score #3 bs.ctx run function #bs.random:uniform {min:-10000000,max:10000000}
+execute store result score #4 bs.ctx run function #bs.random:uniform {min:-10000000,max:10000000}
+execute if score #0 bs.ctx = #1 bs.ctx if score #1 bs.ctx = #2 bs.ctx if score #2 bs.ctx = #3 bs.ctx if score #3 bs.ctx = #4 bs.ctx run fail "The uniform distribution should not always return the same value"
diff --git a/modules/bs.random/data/bs.random/test/noise/fractal_noise_2d.mcfunction b/modules/bs.random/data/bs.random/test/noise/fractal_noise_2d.mcfunction
new file mode 100644
index 0000000000..979bdec8a7
--- /dev/null
+++ b/modules/bs.random/data/bs.random/test/noise/fractal_noise_2d.mcfunction
@@ -0,0 +1,50 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $random.fractal_noise_2d.x bs.in 28656
+scoreboard players set $random.fractal_noise_2d.y bs.in 1203
+scoreboard players set $random.fractal_noise_2d.seed bs.in 5865932
+scoreboard players set $random.fractal_noise_2d.octaves bs.in 4
+scoreboard players set $random.fractal_noise_2d.persistence bs.in 500
+scoreboard players set $random.fractal_noise_2d.lacunarity bs.in 2000
+function #bs.random:fractal_noise_2d
+assert score $random.fractal_noise_2d bs.out matches 89
+
+scoreboard players set $random.fractal_noise_2d.x bs.in 15589
+scoreboard players set $random.fractal_noise_2d.y bs.in 812
+scoreboard players set $random.fractal_noise_2d.seed bs.in 57678
+scoreboard players set $random.fractal_noise_2d.octaves bs.in 2
+scoreboard players set $random.fractal_noise_2d.persistence bs.in 700
+scoreboard players set $random.fractal_noise_2d.lacunarity bs.in 1500
+function #bs.random:fractal_noise_2d
+assert score $random.fractal_noise_2d bs.out matches 264
+
+scoreboard players set $random.fractal_noise_2d.x bs.in 420
+scoreboard players set $random.fractal_noise_2d.y bs.in 5123
+scoreboard players set $random.fractal_noise_2d.seed bs.in 1
+scoreboard players set $random.fractal_noise_2d.octaves bs.in 6
+scoreboard players set $random.fractal_noise_2d.persistence bs.in 200
+scoreboard players set $random.fractal_noise_2d.lacunarity bs.in 2500
+function #bs.random:fractal_noise_2d
+assert score $random.fractal_noise_2d bs.out matches -406
+
+scoreboard players set $random.fractal_noise_2d.x bs.in 1000
+scoreboard players set $random.fractal_noise_2d.y bs.in 1000
+scoreboard players set $random.fractal_noise_2d.seed bs.in 123456789
+scoreboard players set $random.fractal_noise_2d.octaves bs.in 5
+scoreboard players set $random.fractal_noise_2d.persistence bs.in 600
+scoreboard players set $random.fractal_noise_2d.lacunarity bs.in 1900
+function #bs.random:fractal_noise_2d
+assert score $random.fractal_noise_2d bs.out matches -133
diff --git a/modules/bs.random/data/bs.random/test/noise/fractal_noise_mat_2d.mcfunction b/modules/bs.random/data/bs.random/test/noise/fractal_noise_mat_2d.mcfunction
new file mode 100644
index 0000000000..b312f53a7d
--- /dev/null
+++ b/modules/bs.random/data/bs.random/test/noise/fractal_noise_mat_2d.mcfunction
@@ -0,0 +1,30 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.random:fractal_noise_mat_2d {width:0,height:8,with:{}}
+execute store result score #n bs.ctx if data storage bs:out random.fractal_noise_mat_2d[]
+assert score #n bs.ctx matches 0
+
+function #bs.random:fractal_noise_mat_2d {width:8,height:0,with:{}}
+execute store result score #n bs.ctx if data storage bs:out random.fractal_noise_mat_2d[]
+assert score #n bs.ctx matches 0
+
+function #bs.random:fractal_noise_mat_2d {width:3,height:2,with:{}}
+execute store result score #n bs.ctx if data storage bs:out random.fractal_noise_mat_2d[]
+assert score #n bs.ctx matches 2
+execute store result score #n bs.ctx if data storage bs:out random.fractal_noise_mat_2d[0][]
+assert score #n bs.ctx matches 3
+execute store result score #n bs.ctx if data storage bs:out random.fractal_noise_mat_2d[1][]
+assert score #n bs.ctx matches 3
diff --git a/modules/bs.random/data/bs.random/test/noise/simplex_noise_2d.mcfunction b/modules/bs.random/data/bs.random/test/noise/simplex_noise_2d.mcfunction
new file mode 100644
index 0000000000..8e77d71bd1
--- /dev/null
+++ b/modules/bs.random/data/bs.random/test/noise/simplex_noise_2d.mcfunction
@@ -0,0 +1,38 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $random.simplex_noise_2d.x bs.in 28656
+scoreboard players set $random.simplex_noise_2d.y bs.in 1203
+scoreboard players set $random.simplex_noise_2d.seed bs.in 5865932
+function #bs.random:simplex_noise_2d
+assert score $random.simplex_noise_2d bs.out matches 170
+
+scoreboard players set $random.simplex_noise_2d.x bs.in 15589
+scoreboard players set $random.simplex_noise_2d.y bs.in 812
+scoreboard players set $random.simplex_noise_2d.seed bs.in 57678
+function #bs.random:simplex_noise_2d
+assert score $random.simplex_noise_2d bs.out matches 279
+
+scoreboard players set $random.simplex_noise_2d.x bs.in 420
+scoreboard players set $random.simplex_noise_2d.y bs.in 5123
+scoreboard players set $random.simplex_noise_2d.seed bs.in 1
+function #bs.random:simplex_noise_2d
+assert score $random.simplex_noise_2d bs.out matches -612
+
+scoreboard players set $random.simplex_noise_2d.x bs.in 1000
+scoreboard players set $random.simplex_noise_2d.y bs.in 1000
+scoreboard players set $random.simplex_noise_2d.seed bs.in 123456789
+function #bs.random:simplex_noise_2d
+assert score $random.simplex_noise_2d bs.out matches -473
diff --git a/modules/bs.random/data/bs.random/test/noise/simplex_noise_mat_2d.mcfunction b/modules/bs.random/data/bs.random/test/noise/simplex_noise_mat_2d.mcfunction
new file mode 100644
index 0000000000..df7839b36a
--- /dev/null
+++ b/modules/bs.random/data/bs.random/test/noise/simplex_noise_mat_2d.mcfunction
@@ -0,0 +1,30 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.random:simplex_noise_mat_2d {width:0,height:8,with:{}}
+execute store result score #n bs.ctx if data storage bs:out random.simplex_noise_mat_2d[]
+assert score #n bs.ctx matches 0
+
+function #bs.random:simplex_noise_mat_2d {width:8,height:0,with:{}}
+execute store result score #n bs.ctx if data storage bs:out random.simplex_noise_mat_2d[]
+assert score #n bs.ctx matches 0
+
+function #bs.random:simplex_noise_mat_2d {width:3,height:2,with:{}}
+execute store result score #n bs.ctx if data storage bs:out random.simplex_noise_mat_2d[]
+assert score #n bs.ctx matches 2
+execute store result score #n bs.ctx if data storage bs:out random.simplex_noise_mat_2d[0][]
+assert score #n bs.ctx matches 3
+execute store result score #n bs.ctx if data storage bs:out random.simplex_noise_mat_2d[1][]
+assert score #n bs.ctx matches 3
diff --git a/modules/bs.random/data/bs.random/test/noise/white_noise_mat_1d.mcfunction b/modules/bs.random/data/bs.random/test/noise/white_noise_mat_1d.mcfunction
new file mode 100644
index 0000000000..b1ea7efccb
--- /dev/null
+++ b/modules/bs.random/data/bs.random/test/noise/white_noise_mat_1d.mcfunction
@@ -0,0 +1,30 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.random:white_noise_mat_1d {length:0,with:{}}
+execute store result score #n bs.ctx if data storage bs:out random.white_noise_mat_1d[]
+assert score #n bs.ctx matches 0
+
+function #bs.random:white_noise_mat_1d {length:5,with:{}}
+execute store result score #n bs.ctx if data storage bs:out random.white_noise_mat_1d[]
+assert score #n bs.ctx matches 5
+
+execute store result score #0 bs.ctx run data get storage bs:out random.white_noise_mat_1d[0] 1000
+execute store result score #1 bs.ctx run data get storage bs:out random.white_noise_mat_1d[1] 1000
+execute store result score #2 bs.ctx run data get storage bs:out random.white_noise_mat_1d[2] 1000
+execute store result score #3 bs.ctx run data get storage bs:out random.white_noise_mat_1d[3] 1000
+execute store result score #4 bs.ctx run data get storage bs:out random.white_noise_mat_1d[4] 1000
+execute store result score #5 bs.ctx run data get storage bs:out random.white_noise_mat_1d[5] 1000
+execute if score #0 bs.ctx = #1 bs.ctx if score #1 bs.ctx = #2 bs.ctx if score #2 bs.ctx = #3 bs.ctx if score #3 bs.ctx = #4 bs.ctx if score #4 bs.ctx = #5 bs.ctx run fail "White noise should not always return the same value"
diff --git a/modules/bs.random/data/bs.random/test/noise/white_noise_mat_2d.mcfunction b/modules/bs.random/data/bs.random/test/noise/white_noise_mat_2d.mcfunction
new file mode 100644
index 0000000000..217eaec833
--- /dev/null
+++ b/modules/bs.random/data/bs.random/test/noise/white_noise_mat_2d.mcfunction
@@ -0,0 +1,38 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.random:white_noise_mat_2d {width:0,height:8,with:{}}
+execute store result score #n bs.ctx if data storage bs:out random.white_noise_mat_2d[]
+assert score #n bs.ctx matches 0
+
+function #bs.random:white_noise_mat_2d {width:8,height:0,with:{}}
+execute store result score #n bs.ctx if data storage bs:out random.white_noise_mat_2d[]
+assert score #n bs.ctx matches 0
+
+function #bs.random:white_noise_mat_2d {width:3,height:2,with:{}}
+execute store result score #n bs.ctx if data storage bs:out random.white_noise_mat_2d[]
+assert score #n bs.ctx matches 2
+execute store result score #n bs.ctx if data storage bs:out random.white_noise_mat_2d[0][]
+assert score #n bs.ctx matches 3
+execute store result score #n bs.ctx if data storage bs:out random.white_noise_mat_2d[1][]
+assert score #n bs.ctx matches 3
+
+execute store result score #0 bs.ctx run data get storage bs:out random.white_noise_mat_2d[0][0] 1000
+execute store result score #1 bs.ctx run data get storage bs:out random.white_noise_mat_2d[0][1] 1000
+execute store result score #2 bs.ctx run data get storage bs:out random.white_noise_mat_2d[0][2] 1000
+execute store result score #3 bs.ctx run data get storage bs:out random.white_noise_mat_2d[1][0] 1000
+execute store result score #4 bs.ctx run data get storage bs:out random.white_noise_mat_2d[1][1] 1000
+execute store result score #5 bs.ctx run data get storage bs:out random.white_noise_mat_2d[1][2] 1000
+execute if score #0 bs.ctx = #1 bs.ctx if score #1 bs.ctx = #2 bs.ctx if score #2 bs.ctx = #3 bs.ctx if score #3 bs.ctx = #4 bs.ctx if score #4 bs.ctx = #5 bs.ctx run fail "White noise should not always return the same value"
diff --git a/modules/bs.random/data/bs.random/test/weighted_choice.mcfunction b/modules/bs.random/data/bs.random/test/weighted_choice.mcfunction
new file mode 100644
index 0000000000..2121b03b4e
--- /dev/null
+++ b/modules/bs.random/data/bs.random/test/weighted_choice.mcfunction
@@ -0,0 +1,30 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# return a value that match the index
+data modify storage bs:in random.weighted_choice.options set value [0,1,2,3,4]
+execute store result score #i bs.ctx run function #bs.random:weighted_choice
+execute if score #i bs.ctx matches 0 run assert data storage bs:out random{weighted_choice:0}
+execute if score #i bs.ctx matches 1 run assert data storage bs:out random{weighted_choice:1}
+execute if score #i bs.ctx matches 2 run assert data storage bs:out random{weighted_choice:2}
+execute if score #i bs.ctx matches 3 run assert data storage bs:out random{weighted_choice:3}
+execute if score #i bs.ctx matches 4 run assert data storage bs:out random{weighted_choice:4}
+
+# the weight has an impact on the returned value
+data modify storage bs:in random.weighted_choice.options set value [0,42,0,0,0,0]
+data modify storage bs:in random.weighted_choice.weights set value [0,1,0,0,0,0]
+execute store result score #i bs.ctx run function #bs.random:weighted_choice
+assert data storage bs:out random{weighted_choice:42}
+assert score #i bs.ctx matches 1
diff --git a/modules/bs.random/module.json b/modules/bs.random/module.json
new file mode 100644
index 0000000000..c62ea5a207
--- /dev/null
+++ b/modules/bs.random/module.json
@@ -0,0 +1,14 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.random",
+ "load": "."
+ },
+ "meta": {
+ "name": "Random",
+ "slug": "bookshelf-random",
+ "description": "Contains many random functions for different distributions.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/random.html",
+ "tags": ["default"]
+ }
+}
diff --git a/modules/bs.raycast/README.md b/modules/bs.raycast/README.md
new file mode 100644
index 0000000000..b94bfc97ac
--- /dev/null
+++ b/modules/bs.raycast/README.md
@@ -0,0 +1,14 @@
+# 🔦 Bookshelf Raycast
+
+This datapack allows you to cast rays and check for collisions with blocks or entities.
+
+> “Reality only reveals itself when it is illuminated by a ray of poetry.”
+>
+> -- Georges Braque
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/raycast.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.raycast/data/bs.raycast/function/__load__.mcfunction b/modules/bs.raycast/data/bs.raycast/function/__load__.mcfunction
new file mode 100644
index 0000000000..f9edfe3b7a
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/__load__.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+forceload add -30000000 1600
+execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
+
+scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
diff --git a/modules/bs.raycast/data/bs.raycast/function/__unload__.mcfunction b/modules/bs.raycast/data/bs.raycast/function/__unload__.mcfunction
new file mode 100644
index 0000000000..3c2e3814e5
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/__unload__.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+kill B5-0-0-0-1
+forceload remove -30000000 1600
+
+scoreboard objectives remove bs.data
+
+data remove storage bs:data raycast
+data remove storage bs:out raycast
diff --git a/modules/bs.raycast/data/bs.raycast/function/check/block/any.mcfunction b/modules/bs.raycast/data/bs.raycast/function/check/block/any.mcfunction
new file mode 100644
index 0000000000..dfb1061faf
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/check/block/any.mcfunction
@@ -0,0 +1,30 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute unless block ~ ~ ~ #bs.hitbox:is_composite run return run function bs.raycast:collide/cube
+
+function #bs.hitbox:get_block
+execute store result score #raycast.ox bs.data run data get storage bs:out hitbox.offset.x 10000000
+execute store result score #raycast.oz bs.data run data get storage bs:out hitbox.offset.z 10000000
+
+execute if score #raycast.ux bs.data matches 0.. run scoreboard players operation #raycast.lx bs.data -= #raycast.dx bs.data
+execute if score #raycast.uy bs.data matches 0.. run scoreboard players operation #raycast.ly bs.data -= #raycast.dy bs.data
+execute if score #raycast.uz bs.data matches 0.. run scoreboard players operation #raycast.lz bs.data -= #raycast.dz bs.data
+function bs.raycast:check/block/shape
+execute if score #raycast.ux bs.data matches 0.. run scoreboard players operation #raycast.lx bs.data += #raycast.dx bs.data
+execute if score #raycast.uy bs.data matches 0.. run scoreboard players operation #raycast.ly bs.data += #raycast.dy bs.data
+execute if score #raycast.uz bs.data matches 0.. run scoreboard players operation #raycast.lz bs.data += #raycast.dz bs.data
+
+execute unless score #raycast.distance bs.data matches 2147483647 run function bs.raycast:collide/block
diff --git a/modules/bs.raycast/data/bs.raycast/function/check/block/shape.mcfunction b/modules/bs.raycast/data/bs.raycast/function/check/block/shape.mcfunction
new file mode 100644
index 0000000000..0baa0da81a
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/check/block/shape.mcfunction
@@ -0,0 +1,63 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# get hitbox coordinates
+execute store result score #x bs.ctx run data get storage bs:out hitbox.shape[-1][0] 625000
+execute store result score #y bs.ctx run data get storage bs:out hitbox.shape[-1][1] 625000
+execute store result score #z bs.ctx run data get storage bs:out hitbox.shape[-1][2] 625000
+execute store result score #i bs.ctx run data get storage bs:out hitbox.shape[-1][3] 625000
+execute store result score #j bs.ctx run data get storage bs:out hitbox.shape[-1][4] 625000
+execute store result score #k bs.ctx run data get storage bs:out hitbox.shape[-1][5] 625000
+data remove storage bs:out hitbox.shape[-1]
+
+# offset coordinates if needed
+scoreboard players operation #x bs.ctx += #raycast.ox bs.data
+scoreboard players operation #i bs.ctx += #raycast.ox bs.data
+scoreboard players operation #z bs.ctx += #raycast.oz bs.data
+scoreboard players operation #k bs.ctx += #raycast.oz bs.data
+
+# when step is negative, ray is one step further and hitbox coordinates should be negative
+scoreboard players operation #x bs.ctx /= #raycast.ux bs.data
+scoreboard players operation #i bs.ctx /= #raycast.ux bs.data
+scoreboard players operation #y bs.ctx /= #raycast.uy bs.data
+scoreboard players operation #j bs.ctx /= #raycast.uy bs.data
+scoreboard players operation #z bs.ctx /= #raycast.uz bs.data
+scoreboard players operation #k bs.ctx /= #raycast.uz bs.data
+
+# when step is negative we need to reverse near and far points
+execute if score #raycast.ux bs.data matches ..-1 run scoreboard players operation #x bs.ctx >< #i bs.ctx
+execute if score #raycast.uy bs.data matches ..-1 run scoreboard players operation #y bs.ctx >< #j bs.ctx
+execute if score #raycast.uz bs.data matches ..-1 run scoreboard players operation #z bs.ctx >< #k bs.ctx
+
+# compute near and far points for AABB collision
+execute store result score #raycast.tmin bs.data run scoreboard players operation #x bs.ctx += #raycast.lx bs.data
+execute store result score #raycast.tmax bs.data run scoreboard players operation #i bs.ctx += #raycast.lx bs.data
+scoreboard players operation #y bs.ctx += #raycast.ly bs.data
+scoreboard players operation #j bs.ctx += #raycast.ly bs.data
+scoreboard players operation #z bs.ctx += #raycast.lz bs.data
+scoreboard players operation #k bs.ctx += #raycast.lz bs.data
+scoreboard players operation #raycast.tmin bs.data > #y bs.ctx
+scoreboard players operation #raycast.tmin bs.data > #z bs.ctx
+scoreboard players operation #raycast.tmax bs.data < #j bs.ctx
+scoreboard players operation #raycast.tmax bs.data < #k bs.ctx
+
+# if tmin <= tmax, ray is intersecting with AABB, if tmax < 0, ray is intersecting AABB, but the whole AABB is behind
+execute if score #raycast.tmax bs.data matches 0.. \
+ if score #raycast.tmin bs.data <= #raycast.tmax bs.data \
+ if score #raycast.tmin bs.data < #raycast.distance bs.data \
+ if score #raycast.tmin bs.data <= #raycast.max_distance bs.data \
+ run function bs.raycast:collide/shape
+
+execute if data storage bs:out hitbox.shape[-1] run function bs.raycast:check/block/shape
diff --git a/modules/bs.raycast/data/bs.raycast/function/check/entity/any.mcfunction b/modules/bs.raycast/data/bs.raycast/function/check/entity/any.mcfunction
new file mode 100644
index 0000000000..c4996961fd
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/check/entity/any.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.hitbox:get_entity
+execute if entity @s[type=!#bs.hitbox:is_shaped] run return run function bs.raycast:check/entity/size
+
+execute if score #raycast.ux bs.data matches 0.. run scoreboard players operation #raycast.lx bs.data -= #raycast.dx bs.data
+execute if score #raycast.uy bs.data matches 0.. run scoreboard players operation #raycast.ly bs.data -= #raycast.dy bs.data
+execute if score #raycast.uz bs.data matches 0.. run scoreboard players operation #raycast.lz bs.data -= #raycast.dz bs.data
+function bs.raycast:check/entity/shape
+execute if score #raycast.ux bs.data matches 0.. run scoreboard players operation #raycast.lx bs.data += #raycast.dx bs.data
+execute if score #raycast.uy bs.data matches 0.. run scoreboard players operation #raycast.ly bs.data += #raycast.dy bs.data
+execute if score #raycast.uz bs.data matches 0.. run scoreboard players operation #raycast.lz bs.data += #raycast.dz bs.data
+
+execute unless score #raycast.distance bs.data matches 2147483647 run function bs.raycast:collide/entity
diff --git a/modules/bs.raycast/data/bs.raycast/function/check/entity/shape.mcfunction b/modules/bs.raycast/data/bs.raycast/function/check/entity/shape.mcfunction
new file mode 100644
index 0000000000..16e99fd2e0
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/check/entity/shape.mcfunction
@@ -0,0 +1,57 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# get hitbox coordinates
+execute store result score #x bs.ctx run data get storage bs:out hitbox.shape[-1][0] 625000
+execute store result score #y bs.ctx run data get storage bs:out hitbox.shape[-1][1] 625000
+execute store result score #z bs.ctx run data get storage bs:out hitbox.shape[-1][2] 625000
+execute store result score #i bs.ctx run data get storage bs:out hitbox.shape[-1][3] 625000
+execute store result score #j bs.ctx run data get storage bs:out hitbox.shape[-1][4] 625000
+execute store result score #k bs.ctx run data get storage bs:out hitbox.shape[-1][5] 625000
+data remove storage bs:out hitbox.shape[-1]
+
+# when step is negative, ray is one step further and hitbox coordinates should be negative
+scoreboard players operation #x bs.ctx /= #raycast.ux bs.data
+scoreboard players operation #i bs.ctx /= #raycast.ux bs.data
+scoreboard players operation #y bs.ctx /= #raycast.uy bs.data
+scoreboard players operation #j bs.ctx /= #raycast.uy bs.data
+scoreboard players operation #z bs.ctx /= #raycast.uz bs.data
+scoreboard players operation #k bs.ctx /= #raycast.uz bs.data
+
+# when step is negative we need to reverse near and far points
+execute if score #raycast.ux bs.data matches ..-1 run scoreboard players operation #x bs.ctx >< #i bs.ctx
+execute if score #raycast.uy bs.data matches ..-1 run scoreboard players operation #y bs.ctx >< #j bs.ctx
+execute if score #raycast.uz bs.data matches ..-1 run scoreboard players operation #z bs.ctx >< #k bs.ctx
+
+# compute near and far points for AABB collision
+execute store result score #raycast.tmin bs.data run scoreboard players operation #x bs.ctx += #raycast.lx bs.data
+execute store result score #raycast.tmax bs.data run scoreboard players operation #i bs.ctx += #raycast.lx bs.data
+scoreboard players operation #y bs.ctx += #raycast.ly bs.data
+scoreboard players operation #j bs.ctx += #raycast.ly bs.data
+scoreboard players operation #z bs.ctx += #raycast.lz bs.data
+scoreboard players operation #k bs.ctx += #raycast.lz bs.data
+scoreboard players operation #raycast.tmin bs.data > #y bs.ctx
+scoreboard players operation #raycast.tmin bs.data > #z bs.ctx
+scoreboard players operation #raycast.tmax bs.data < #j bs.ctx
+scoreboard players operation #raycast.tmax bs.data < #k bs.ctx
+
+# if tmin <= tmax, ray is intersecting with AABB, if tmax < 0, ray is intersecting AABB, but the whole AABB is behind
+execute if score #raycast.tmax bs.data matches 0.. \
+ if score #raycast.tmin bs.data <= #raycast.tmax bs.data \
+ if score #raycast.tmin bs.data < #raycast.distance bs.data \
+ if score #raycast.tmin bs.data <= #raycast.max_distance bs.data \
+ run function bs.raycast:collide/shape
+
+execute if data storage bs:out hitbox.shape[-1] run function bs.raycast:check/entity/shape
diff --git a/modules/bs.raycast/data/bs.raycast/function/check/entity/size.mcfunction b/modules/bs.raycast/data/bs.raycast/function/check/entity/size.mcfunction
new file mode 100644
index 0000000000..b2d1c91d0b
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/check/entity/size.mcfunction
@@ -0,0 +1,65 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+tag @s add bs.raycast.omit
+
+# get the entity relative coordinates
+execute in minecraft:overworld positioned as @s as B5-0-0-0-1 run function bs.raycast:compute/entity_rpos with storage bs:data raycast
+execute store result score #x bs.ctx run data get storage bs:ctx _[0] 10000000
+execute store result score #y bs.ctx run data get storage bs:ctx _[1] 10000000
+execute store result score #z bs.ctx run data get storage bs:ctx _[2] 10000000
+execute store result score #i bs.ctx run scoreboard players operation #x bs.ctx += #raycast.x bs.data
+execute store result score #j bs.ctx run scoreboard players operation #y bs.ctx += #raycast.y bs.data
+execute store result score #k bs.ctx run scoreboard players operation #z bs.ctx += #raycast.z bs.data
+
+# compute hitbox coordinates (using width and height)
+execute store result score #raycast.h bs.data run data get storage bs:out hitbox.height 10000
+execute store result score #raycast.w bs.data run data get storage bs:out hitbox.width 5000
+execute store result score #raycast.s bs.data run data get storage bs:out hitbox.scale 1000
+scoreboard players operation #raycast.h bs.data *= #raycast.s bs.data
+scoreboard players operation #raycast.w bs.data *= #raycast.s bs.data
+scoreboard players operation #x bs.ctx -= #raycast.w bs.data
+scoreboard players operation #z bs.ctx -= #raycast.w bs.data
+scoreboard players operation #i bs.ctx += #raycast.w bs.data
+scoreboard players operation #j bs.ctx += #raycast.h bs.data
+scoreboard players operation #k bs.ctx += #raycast.w bs.data
+
+# when step is negative, points are negative so we get the absolute value
+scoreboard players operation #x bs.ctx /= #raycast.ux bs.data
+scoreboard players operation #i bs.ctx /= #raycast.ux bs.data
+scoreboard players operation #y bs.ctx /= #raycast.uy bs.data
+scoreboard players operation #j bs.ctx /= #raycast.uy bs.data
+scoreboard players operation #z bs.ctx /= #raycast.uz bs.data
+scoreboard players operation #k bs.ctx /= #raycast.uz bs.data
+
+# when step is negative we need to reverse near and far points
+execute if score #raycast.ux bs.data matches ..-1 run scoreboard players operation #x bs.ctx >< #i bs.ctx
+execute if score #raycast.uy bs.data matches ..-1 run scoreboard players operation #y bs.ctx >< #j bs.ctx
+execute if score #raycast.uz bs.data matches ..-1 run scoreboard players operation #z bs.ctx >< #k bs.ctx
+
+# compute near and far points for AABB collision
+scoreboard players operation #raycast.tmin bs.data = #x bs.ctx
+scoreboard players operation #raycast.tmax bs.data = #i bs.ctx
+scoreboard players operation #raycast.tmin bs.data > #y bs.ctx
+scoreboard players operation #raycast.tmin bs.data > #z bs.ctx
+scoreboard players operation #raycast.tmax bs.data < #j bs.ctx
+scoreboard players operation #raycast.tmax bs.data < #k bs.ctx
+
+# if tmin <= tmax, ray is intersecting with AABB, if tmax < 0, ray is intersecting AABB, but the whole AABB is behind
+execute if score #raycast.tmax bs.data matches 0.. \
+ if score #raycast.tmin bs.data <= #raycast.tmax bs.data \
+ if score #raycast.tmin bs.data < #raycast.distance bs.data \
+ if score #raycast.tmin bs.data <= #raycast.max_distance bs.data \
+ run function bs.raycast:collide/size
diff --git a/modules/bs.raycast/data/bs.raycast/function/collide/block.mcfunction b/modules/bs.raycast/data/bs.raycast/function/collide/block.mcfunction
new file mode 100644
index 0000000000..a18148be43
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/collide/block.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# compute output data and run callbacks
+tp @s ~ ~ ~
+data modify storage bs:out raycast.targeted_block set from entity @s Pos
+execute store result storage bs:out raycast.distance double .001 run scoreboard players get #raycast.distance bs.data
+execute if data storage bs:data raycast.on_targeted_block at @s run function bs.raycast:react/targeted_block with storage bs:data raycast
+execute summon minecraft:marker run function bs.raycast:compute/hit_point with storage bs:out raycast
+
+# stop the recursion if piercing is 0
+execute unless score #raycast.piercing bs.data matches 0 run scoreboard players set #raycast.distance bs.data 2147483647
+execute if score #raycast.piercing bs.data matches 0 run scoreboard players set #raycast.max_distance bs.data -2147483648
+scoreboard players remove #raycast.piercing bs.data 1
diff --git a/modules/bs.raycast/data/bs.raycast/function/collide/cube.mcfunction b/modules/bs.raycast/data/bs.raycast/function/collide/cube.mcfunction
new file mode 100644
index 0000000000..ec1ef4a017
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/collide/cube.mcfunction
@@ -0,0 +1,33 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# compute the travelled distance
+scoreboard players operation #raycast.lx bs.data -= #raycast.dx bs.data
+scoreboard players operation #raycast.ly bs.data -= #raycast.dy bs.data
+execute store result score #raycast.distance bs.data run scoreboard players operation #raycast.lz bs.data -= #raycast.dz bs.data
+scoreboard players operation #raycast.distance bs.data > #raycast.lx bs.data
+scoreboard players operation #raycast.distance bs.data > #raycast.ly bs.data
+
+# get the normal of the surface that was hit
+data modify storage bs:out raycast.hit_normal set value [0,0,0]
+execute if score #raycast.distance bs.data = #raycast.lx bs.data store result storage bs:out raycast.hit_normal[0] int -1 run data get storage bs:data raycast.sx
+execute if score #raycast.distance bs.data = #raycast.ly bs.data store result storage bs:out raycast.hit_normal[1] int -1 run data get storage bs:data raycast.sy
+execute if score #raycast.distance bs.data = #raycast.lz bs.data store result storage bs:out raycast.hit_normal[2] int -1 run data get storage bs:data raycast.sz
+
+scoreboard players operation #raycast.lx bs.data += #raycast.dx bs.data
+scoreboard players operation #raycast.ly bs.data += #raycast.dy bs.data
+scoreboard players operation #raycast.lz bs.data += #raycast.dz bs.data
+
+function bs.raycast:collide/block
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/collide/entity.mcfunction b/modules/bs.raycast/data/bs.raycast/function/collide/entity.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.raycast/function/collide/entity.mcfunction
rename to modules/bs.raycast/data/bs.raycast/function/collide/entity.mcfunction
index cc4da35c53..ba7b174a38 100644
--- a/datapacks/Bookshelf/data/bs.raycast/function/collide/entity.mcfunction
+++ b/modules/bs.raycast/data/bs.raycast/function/collide/entity.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.raycast/data/bs.raycast/function/collide/shape.mcfunction b/modules/bs.raycast/data/bs.raycast/function/collide/shape.mcfunction
new file mode 100644
index 0000000000..3d3048d2a2
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/collide/shape.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# get the travelled distance
+scoreboard players operation #raycast.distance bs.data = #raycast.tmin bs.data
+
+# get the normal of the surface that was hit
+data modify storage bs:out raycast.hit_normal set value [0,0,0]
+execute if score #raycast.distance bs.data = #x bs.ctx store result storage bs:out raycast.hit_normal[0] int -1 run data get storage bs:data raycast.sx
+execute if score #raycast.distance bs.data = #y bs.ctx store result storage bs:out raycast.hit_normal[1] int -1 run data get storage bs:data raycast.sy
+execute if score #raycast.distance bs.data = #z bs.ctx store result storage bs:out raycast.hit_normal[2] int -1 run data get storage bs:data raycast.sz
diff --git a/modules/bs.raycast/data/bs.raycast/function/collide/size.mcfunction b/modules/bs.raycast/data/bs.raycast/function/collide/size.mcfunction
new file mode 100644
index 0000000000..d32259708c
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/collide/size.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# stop the recursion then get the travelled distance
+scoreboard players operation #raycast.distance bs.data = #raycast.tmin bs.data
+
+# get the normal of the surface that was hit
+data modify storage bs:out raycast.hit_normal set value [0,0,0]
+execute if score #raycast.distance bs.data = #x bs.ctx store result storage bs:out raycast.hit_normal[0] int -1 run data get storage bs:data raycast.sx
+execute if score #raycast.distance bs.data = #y bs.ctx store result storage bs:out raycast.hit_normal[1] int -1 run data get storage bs:data raycast.sy
+execute if score #raycast.distance bs.data = #z bs.ctx store result storage bs:out raycast.hit_normal[2] int -1 run data get storage bs:data raycast.sz
+
+function bs.raycast:collide/entity
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/compute/entity_rpos.mcfunction b/modules/bs.raycast/data/bs.raycast/function/compute/entity_rpos.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.raycast/function/compute/entity_rpos.mcfunction
rename to modules/bs.raycast/data/bs.raycast/function/compute/entity_rpos.mcfunction
index 13fa35393f..c415213280 100644
--- a/datapacks/Bookshelf/data/bs.raycast/function/compute/entity_rpos.mcfunction
+++ b/modules/bs.raycast/data/bs.raycast/function/compute/entity_rpos.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.raycast/data/bs.raycast/function/compute/hit_point.mcfunction b/modules/bs.raycast/data/bs.raycast/function/compute/hit_point.mcfunction
new file mode 100644
index 0000000000..559e0a3342
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/compute/hit_point.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify entity @s Pos set from storage bs:data raycast.pos
+$execute positioned as @s run tp @s ^ ^ ^$(distance)
+data modify storage bs:out raycast.hit_point set from entity @s Pos
+execute if data storage bs:data raycast.on_hit_point at @s run function bs.raycast:react/hit_point with storage bs:data raycast
+kill @s
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/compute/init_rpos.mcfunction b/modules/bs.raycast/data/bs.raycast/function/compute/init_rpos.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.raycast/function/compute/init_rpos.mcfunction
rename to modules/bs.raycast/data/bs.raycast/function/compute/init_rpos.mcfunction
index 6e9748423a..2f0bb2af2e 100644
--- a/datapacks/Bookshelf/data/bs.raycast/function/compute/init_rpos.mcfunction
+++ b/modules/bs.raycast/data/bs.raycast/function/compute/init_rpos.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.raycast/data/bs.raycast/function/react/hit_point.mcfunction b/modules/bs.raycast/data/bs.raycast/function/react/hit_point.mcfunction
new file mode 100644
index 0000000000..a1541cf2ee
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/react/hit_point.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$$(on_hit_point)
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/react/targeted_block.mcfunction b/modules/bs.raycast/data/bs.raycast/function/react/targeted_block.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.raycast/function/react/targeted_block.mcfunction
rename to modules/bs.raycast/data/bs.raycast/function/react/targeted_block.mcfunction
index 4c6714caf0..49b1268443 100644
--- a/datapacks/Bookshelf/data/bs.raycast/function/react/targeted_block.mcfunction
+++ b/modules/bs.raycast/data/bs.raycast/function/react/targeted_block.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.raycast/function/react/targeted_entity.mcfunction b/modules/bs.raycast/data/bs.raycast/function/react/targeted_entity.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.raycast/function/react/targeted_entity.mcfunction
rename to modules/bs.raycast/data/bs.raycast/function/react/targeted_entity.mcfunction
index c77b33dc80..339153265a 100644
--- a/datapacks/Bookshelf/data/bs.raycast/function/react/targeted_entity.mcfunction
+++ b/modules/bs.raycast/data/bs.raycast/function/react/targeted_entity.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.raycast/data/bs.raycast/function/recurse/init.mcfunction b/modules/bs.raycast/data/bs.raycast/function/recurse/init.mcfunction
new file mode 100644
index 0000000000..25ec30ba9e
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/recurse/init.mcfunction
@@ -0,0 +1,54 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data raycast.pos set from entity @s Pos
+execute store result storage bs:data raycast.x int -1 run data get storage bs:data raycast.pos[0]
+execute store result storage bs:data raycast.y int -1 run data get storage bs:data raycast.pos[1]
+execute store result storage bs:data raycast.z int -1 run data get storage bs:data raycast.pos[2]
+
+# get the unit vector [ux,uz,uz]
+execute positioned 0.0 0.0 0.0 positioned ^ ^ ^10 run tp @s ~ ~ ~
+data modify storage bs:ctx _ set from entity @s Pos
+execute store result score #raycast.ux bs.data run data get storage bs:ctx _[0] 1000
+execute store result score #raycast.uy bs.data run data get storage bs:ctx _[1] 1000
+execute store result score #raycast.uz bs.data run data get storage bs:ctx _[2] 1000
+
+# compute the delta [dx,dy,dz] (distance to advance to the next grid intersection)
+data modify storage bs:data raycast merge value {sx:1,sy:1,sz:1}
+execute store result score #raycast.dx bs.data store result score #raycast.dy bs.data run scoreboard players set #raycast.dz bs.data 10000000
+execute if score #raycast.ux bs.data matches ..-1 store result storage bs:data raycast.sx int .0000001 run scoreboard players set #raycast.dx bs.data -10000000
+execute if score #raycast.uy bs.data matches ..-1 store result storage bs:data raycast.sy int .0000001 run scoreboard players set #raycast.dy bs.data -10000000
+execute if score #raycast.uz bs.data matches ..-1 store result storage bs:data raycast.sz int .0000001 run scoreboard players set #raycast.dz bs.data -10000000
+scoreboard players operation #raycast.dx bs.data /= #raycast.ux bs.data
+scoreboard players operation #raycast.dy bs.data /= #raycast.uy bs.data
+scoreboard players operation #raycast.dz bs.data /= #raycast.uz bs.data
+
+# compute the length [lx,ly,lz] (distance from the origin to the next grid intersection)
+function bs.raycast:compute/init_rpos with storage bs:data raycast
+execute store result score #raycast.x bs.data store result score #raycast.lx bs.data run data get storage bs:ctx _[0] -10000000
+execute store result score #raycast.y bs.data store result score #raycast.ly bs.data run data get storage bs:ctx _[1] -10000000
+execute store result score #raycast.z bs.data store result score #raycast.lz bs.data run data get storage bs:ctx _[2] -10000000
+execute if score #raycast.ux bs.data matches 0.. run scoreboard players add #raycast.lx bs.data 10000000
+execute if score #raycast.uy bs.data matches 0.. run scoreboard players add #raycast.ly bs.data 10000000
+execute if score #raycast.uz bs.data matches 0.. run scoreboard players add #raycast.lz bs.data 10000000
+scoreboard players operation #raycast.lx bs.data /= #raycast.ux bs.data
+scoreboard players operation #raycast.ly bs.data /= #raycast.uy bs.data
+scoreboard players operation #raycast.lz bs.data /= #raycast.uz bs.data
+
+# run the recursion loop
+execute if data storage bs:data raycast{entities:1b} run data modify storage bs:data raycast.entities set value "!bs.raycast.omit"
+execute align xyz run function bs.raycast:recurse/next with storage bs:data raycast
+
+kill @s
diff --git a/modules/bs.raycast/data/bs.raycast/function/recurse/next.mcfunction b/modules/bs.raycast/data/bs.raycast/function/recurse/next.mcfunction
new file mode 100644
index 0000000000..563114febf
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/recurse/next.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# check block and entity collision (debug: particle minecraft:block_marker{block_state:"barrier"} ~.5 ~.5 ~.5 0 0 0 0 1)
+$execute unless data storage bs:data raycast{blocks:0b} unless block ~ ~ ~ $(ignored_blocks) run function bs.raycast:check/block/any
+$execute unless data storage bs:data raycast{entities:0b} as @e[type=!$(ignored_entities),tag=$(entities),tag=!bs.raycast.omit,dx=0] run function bs.raycast:check/entity/any
+
+# advance on the grid by the shortest length
+execute if score #raycast.lx bs.data <= #raycast.ly bs.data if score #raycast.lx bs.data <= #raycast.lz bs.data if score #raycast.lx bs.data <= #raycast.max_distance bs.data run return run function bs.raycast:recurse/x with storage bs:data raycast
+execute if score #raycast.ly bs.data <= #raycast.lz bs.data if score #raycast.ly bs.data <= #raycast.max_distance bs.data run return run function bs.raycast:recurse/y with storage bs:data raycast
+execute if score #raycast.lz bs.data <= #raycast.max_distance bs.data run return run function bs.raycast:recurse/z with storage bs:data raycast
diff --git a/modules/bs.raycast/data/bs.raycast/function/recurse/x.mcfunction b/modules/bs.raycast/data/bs.raycast/function/recurse/x.mcfunction
new file mode 100644
index 0000000000..672aa6f1d2
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/recurse/x.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# increment length by delta on x then move to the next block on the grid
+scoreboard players operation #raycast.lx bs.data += #raycast.dx bs.data
+$execute positioned ~$(sx) ~ ~ run return run function bs.raycast:recurse/next with storage bs:data raycast
diff --git a/modules/bs.raycast/data/bs.raycast/function/recurse/y.mcfunction b/modules/bs.raycast/data/bs.raycast/function/recurse/y.mcfunction
new file mode 100644
index 0000000000..d50d141c67
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/recurse/y.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# increment length by delta on y then move to the next block on the grid
+scoreboard players operation #raycast.ly bs.data += #raycast.dy bs.data
+$execute positioned ~ ~$(sy) ~ run return run function bs.raycast:recurse/next with storage bs:data raycast
diff --git a/modules/bs.raycast/data/bs.raycast/function/recurse/z.mcfunction b/modules/bs.raycast/data/bs.raycast/function/recurse/z.mcfunction
new file mode 100644
index 0000000000..3b0f9d273b
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/recurse/z.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# increment length by delta on z then move to the next block on the grid
+scoreboard players operation #raycast.lz bs.data += #raycast.dz bs.data
+$execute positioned ~ ~ ~$(sz) run return run function bs.raycast:recurse/next with storage bs:data raycast
diff --git a/modules/bs.raycast/data/bs.raycast/function/run.mcfunction b/modules/bs.raycast/data/bs.raycast/function/run.mcfunction
new file mode 100644
index 0000000000..16bf623c30
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/run.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+tag @s add bs.raycast.omit
+scoreboard players set #raycast.distance bs.data 2147483647
+execute store result score #raycast.piercing bs.data run data get storage bs:data raycast.piercing
+execute store result score #raycast.max_distance bs.data run data get storage bs:data raycast.max_distance 1000
+data modify storage bs:out raycast set value {distance:0d,hit_normal:[0,0,0]}
+execute summon minecraft:marker run function bs.raycast:recurse/init
+tag @e[tag=bs.raycast.omit] remove bs.raycast.omit
+return run execute unless score #raycast.distance bs.data matches 2147483647
diff --git a/modules/bs.raycast/data/bs.raycast/function/with.mcfunction b/modules/bs.raycast/data/bs.raycast/function/with.mcfunction
new file mode 100644
index 0000000000..cedbccfe48
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/function/with.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data raycast set value { \
+ blocks: true, \
+ entities: false, \
+ max_distance: 16.0, \
+ ignored_blocks: "#bs.hitbox:intangible", \
+ ignored_entities: "#bs.hitbox:intangible", \
+}
+$data modify storage bs:data raycast merge value $(with)
diff --git a/modules/bs.raycast/data/bs.raycast/tags/function/run.json b/modules/bs.raycast/data/bs.raycast/tags/function/run.json
new file mode 100644
index 0000000000..ab0bf96841
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/tags/function/run.json
@@ -0,0 +1,21 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/raycast.html#run-the-raycast",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/10/09",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2024/10/24",
+ "minecraft_version": "1.21.3"
+ }
+ },
+ "values": [
+ "bs.raycast:with",
+ "bs.raycast:run"
+ ]
+}
diff --git a/modules/bs.raycast/data/bs.raycast/test/block/check_shape.mcfunction b/modules/bs.raycast/data/bs.raycast/test/block/check_shape.mcfunction
new file mode 100644
index 0000000000..26be266189
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/test/block/check_shape.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
+setblock ~ ~ ~ minecraft:oak_stairs[facing=east]
+execute positioned ~1.5 ~ ~.5 facing ~-.5 ~.52 ~ run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
+execute positioned ~-.5 ~ ~.5 facing ~.5 ~.52 ~ run function #bs.raycast:run {with:{}}
+execute if data storage bs:out raycast.targeted_block run fail "Should not detect a targeted block"
+
+setblock ~ ~ ~ minecraft:oak_stairs[facing=west]
+execute positioned ~-.5 ~ ~.5 facing ~.5 ~.52 ~ run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
+execute positioned ~1.5 ~ ~.5 facing ~-.5 ~.52 ~ run function #bs.raycast:run {with:{}}
+execute if data storage bs:out raycast.targeted_block run fail "Should not detect a targeted block"
diff --git a/modules/bs.raycast/data/bs.raycast/test/block/ignored_blocks.mcfunction b/modules/bs.raycast/data/bs.raycast/test/block/ignored_blocks.mcfunction
new file mode 100644
index 0000000000..67d5737a0d
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/test/block/ignored_blocks.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~ ~ ~1 minecraft:light
+execute positioned ~.5 ~ ~ run function #bs.raycast:run {with:{ignored_blocks:"minecraft:air"}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/modules/bs.raycast/data/bs.raycast/test/block/max_distance.mcfunction b/modules/bs.raycast/data/bs.raycast/test/block/max_distance.mcfunction
new file mode 100644
index 0000000000..fd08d3952a
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/test/block/max_distance.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~ ~ ~1 minecraft:bookshelf
+execute positioned ~.5 ~ ~ run function #bs.raycast:run {with:{max_distance:1}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
+execute positioned ~.5 ~ ~ run function #bs.raycast:run {with:{max_distance:.9}}
+execute if data storage bs:out raycast.targeted_block run fail "Should not detect a targeted block"
diff --git a/modules/bs.raycast/data/bs.raycast/test/block/recurse_nnn.mcfunction b/modules/bs.raycast/data/bs.raycast/test/block/recurse_nnn.mcfunction
new file mode 100644
index 0000000000..5805ac7ce4
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/test/block/recurse_nnn.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~-1 ~ ~-1 minecraft:bookshelf
+execute positioned ~.5 ~1 ~.5 facing ~-.51 ~-1.01 ~-1.49 run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
+execute positioned ~.5 ~1 ~.5 facing ~-1.49 ~-1.01 ~-.51 run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/modules/bs.raycast/data/bs.raycast/test/block/recurse_nnp.mcfunction b/modules/bs.raycast/data/bs.raycast/test/block/recurse_nnp.mcfunction
new file mode 100644
index 0000000000..01de45d9da
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/test/block/recurse_nnp.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~-1 ~ ~1 minecraft:bookshelf
+execute positioned ~.5 ~1 ~.5 facing ~-.51 ~-1.01 ~1.49 run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
+execute positioned ~.5 ~1 ~.5 facing ~-1.49 ~-1.01 ~.51 run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/modules/bs.raycast/data/bs.raycast/test/block/recurse_npn.mcfunction b/modules/bs.raycast/data/bs.raycast/test/block/recurse_npn.mcfunction
new file mode 100644
index 0000000000..fe2fd1ee81
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/test/block/recurse_npn.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~-1 ~ ~-1 minecraft:bookshelf
+execute positioned ~.5 ~ ~.5 facing ~-.51 ~.99 ~-1.49 run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
+execute positioned ~.5 ~ ~.5 facing ~-1.49 ~.99 ~-.51 run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/modules/bs.raycast/data/bs.raycast/test/block/recurse_npp.mcfunction b/modules/bs.raycast/data/bs.raycast/test/block/recurse_npp.mcfunction
new file mode 100644
index 0000000000..2316327dfc
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/test/block/recurse_npp.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~-1 ~ ~1 minecraft:bookshelf
+execute positioned ~.5 ~ ~.5 facing ~-.51 ~.99 ~1.49 run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
+execute positioned ~.5 ~ ~.5 facing ~-1.49 ~.99 ~.51 run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/modules/bs.raycast/data/bs.raycast/test/block/recurse_pnp.mcfunction b/modules/bs.raycast/data/bs.raycast/test/block/recurse_pnp.mcfunction
new file mode 100644
index 0000000000..ab4445ff85
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/test/block/recurse_pnp.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~1 ~ ~1 minecraft:bookshelf
+execute positioned ~.5 ~1 ~.5 facing ~.51 ~-1.01 ~1.49 run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
+execute positioned ~.5 ~1 ~.5 facing ~1.49 ~-1.01 ~.51 run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/modules/bs.raycast/data/bs.raycast/test/block/recurse_ppn.mcfunction b/modules/bs.raycast/data/bs.raycast/test/block/recurse_ppn.mcfunction
new file mode 100644
index 0000000000..923d1af9d1
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/test/block/recurse_ppn.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~1 ~ ~-1 minecraft:bookshelf
+execute positioned ~.5 ~ ~.5 facing ~.51 ~.99 ~-1.49 run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
+execute positioned ~.5 ~ ~.5 facing ~1.49 ~.99 ~-.51 run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/modules/bs.raycast/data/bs.raycast/test/block/recurse_ppp.mcfunction b/modules/bs.raycast/data/bs.raycast/test/block/recurse_ppp.mcfunction
new file mode 100644
index 0000000000..8e7c43f506
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/test/block/recurse_ppp.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~1 ~ ~1 minecraft:bookshelf
+execute positioned ~.5 ~ ~.5 facing ~.51 ~.99 ~1.49 run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
+execute positioned ~.5 ~ ~.5 facing ~1.49 ~.99 ~.51 run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/modules/bs.raycast/data/bs.raycast/test/block/recuse_pnn.mcfunction b/modules/bs.raycast/data/bs.raycast/test/block/recuse_pnn.mcfunction
new file mode 100644
index 0000000000..696cbbcc9e
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/test/block/recuse_pnn.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock ~1 ~ ~-1 minecraft:bookshelf
+execute positioned ~.5 ~1 ~.5 facing ~.51 ~-1.01 ~-1.49 run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
+execute positioned ~.5 ~1 ~.5 facing ~1.49 ~-1.01 ~-.51 run function #bs.raycast:run {with:{}}
+execute unless data storage bs:out raycast.targeted_block run fail "Failed to detect a targeted block"
diff --git a/modules/bs.raycast/data/bs.raycast/test/entity/check_shape.mcfunction b/modules/bs.raycast/data/bs.raycast/test/entity/check_shape.mcfunction
new file mode 100644
index 0000000000..e1a1742bee
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/test/entity/check_shape.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:item_frame ~ ~ ~ {Facing:0}
+execute positioned ~.5 ~.5 ~.5 facing ~ ~1 ~ run function #bs.raycast:run {with:{blocks:false,entities:true}}
+execute unless data storage bs:out raycast.targeted_entity run fail "Failed to detect a targeted entity"
+
+summon minecraft:item_frame ~ ~ ~ {Facing:1}
+execute positioned ~.5 ~.5 ~.5 facing ~ ~-1 ~ run function #bs.raycast:run {with:{blocks:false,entities:true}}
+execute unless data storage bs:out raycast.targeted_entity run fail "Failed to detect a targeted entity"
diff --git a/modules/bs.raycast/data/bs.raycast/test/entity/check_size.mcfunction b/modules/bs.raycast/data/bs.raycast/test/entity/check_size.mcfunction
new file mode 100644
index 0000000000..4e8d1aa08a
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/test/entity/check_size.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:armor_stand ~.5 ~ ~.5
+execute positioned ~1.5 ~1 ~.5 facing ~-.76 ~ ~.24 run function #bs.raycast:run {with:{blocks:false,entities:true}}
+execute unless data storage bs:out raycast.targeted_entity run fail "Failed to detect a targeted entity"
+execute positioned ~-.5 ~1 ~.5 facing ~.76 ~ ~-.24 run function #bs.raycast:run {with:{blocks:false,entities:true}}
+execute unless data storage bs:out raycast.targeted_entity run fail "Failed to detect a targeted entity"
diff --git a/modules/bs.raycast/data/bs.raycast/test/entity/ignored_entities.mcfunction b/modules/bs.raycast/data/bs.raycast/test/entity/ignored_entities.mcfunction
new file mode 100644
index 0000000000..37cc989831
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/test/entity/ignored_entities.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:armor_stand ~.5 ~ ~.5
+execute positioned ~.5 ~ ~-.5 run function #bs.raycast:run {with:{blocks:false,entities:true,ignored_entities:"minecraft:armor_stand"}}
+execute if data storage bs:out raycast.targeted_entity run fail "Should not detect a targeted entity"
diff --git a/modules/bs.raycast/data/bs.raycast/test/entity/max_distance.mcfunction b/modules/bs.raycast/data/bs.raycast/test/entity/max_distance.mcfunction
new file mode 100644
index 0000000000..5bdffbfca0
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/test/entity/max_distance.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:interaction ~.5 ~ ~1.5 {width:1f,height:1f}
+execute positioned ~.5 ~ ~ run function #bs.raycast:run {with:{blocks:false,entities:true,max_distance:1}}
+execute unless data storage bs:out raycast.targeted_entity run fail "Failed to detect a targeted entity"
+execute positioned ~.5 ~ ~ run function #bs.raycast:run {with:{blocks:false,entities:true,max_distance:.9}}
+execute if data storage bs:out raycast.targeted_entity run fail "Should not detect a targeted entity"
diff --git a/modules/bs.raycast/data/bs.raycast/test/entity/tagged_entities.mcfunction b/modules/bs.raycast/data/bs.raycast/test/entity/tagged_entities.mcfunction
new file mode 100644
index 0000000000..32854b3ae8
--- /dev/null
+++ b/modules/bs.raycast/data/bs.raycast/test/entity/tagged_entities.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+summon minecraft:armor_stand ~.5 ~ ~.5
+summon minecraft:armor_stand ~.5 ~ ~1.5 {UUID:[I;-1170214687,114379287,-1715952819,-561845151],Tags:["bs.packtest"]}
+execute positioned ~.5 ~ ~-.5 run function #bs.raycast:run {with:{blocks:false,entities:"bs.packtest"}}
+assert data storage bs:out raycast{targeted_entity:[I;-1170214687,114379287,-1715952819,-561845151]}
diff --git a/modules/bs.raycast/module.json b/modules/bs.raycast/module.json
new file mode 100644
index 0000000000..c8d0cf27e7
--- /dev/null
+++ b/modules/bs.raycast/module.json
@@ -0,0 +1,17 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.raycast",
+ "load": "."
+ },
+ "meta": {
+ "name": "Raycast",
+ "slug": "bookshelf-raycast",
+ "description": "Cast rays and see if they collide with blocks or entities.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/raycast.html",
+ "tags": ["default"],
+ "dependencies": [
+ "bs.hitbox"
+ ]
+ }
+}
diff --git a/modules/bs.schedule/README.md b/modules/bs.schedule/README.md
new file mode 100644
index 0000000000..ce1757b3a0
--- /dev/null
+++ b/modules/bs.schedule/README.md
@@ -0,0 +1,10 @@
+# ⏲️ Bookshelf Schedule
+
+This datapack enhances command scheduling, offering more flexibility than vanilla Minecraft. It allows you to cancel commands and retain execution context, such as entity and location.
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/schedule.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.schedule/data/bs.schedule/function/__load__.mcfunction b/modules/bs.schedule/data/bs.schedule/function/__load__.mcfunction
new file mode 100644
index 0000000000..2485d91749
--- /dev/null
+++ b/modules/bs.schedule/data/bs.schedule/function/__load__.mcfunction
@@ -0,0 +1,34 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+forceload add -30000000 1600
+execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
+
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
+scoreboard objectives add bs.schedule.id dummy [{"text":"BS ","color":"dark_gray"},{"text":"Schedule ID","color":"aqua"}]
+
+data modify storage bs:const schedule.units set value [ \
+ {name:"t",scale:1}, \
+ {name:"tick",scale:1}, \
+ {name:"s",scale:20}, \
+ {name:"second",scale:20}, \
+ {name:"m",scale:1200}, \
+ {name:"minute",scale:1200}, \
+ {name:"hour",scale:72000}, \
+ {name:"h",scale:72000}, \
+]
+
+execute unless data storage bs:const log.messages[{namespaces: ["bs.schedule"]}] run data modify storage bs:const log.messages[{namespaces: ["bs"]}].namespaces append value "bs.schedule"
diff --git a/modules/bs.schedule/data/bs.schedule/function/__unload__.mcfunction b/modules/bs.schedule/data/bs.schedule/function/__unload__.mcfunction
new file mode 100644
index 0000000000..fbd4eee9a5
--- /dev/null
+++ b/modules/bs.schedule/data/bs.schedule/function/__unload__.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+kill B5-0-0-0-1
+forceload remove -30000000 1600
+
+scoreboard objectives remove bs.ctx
+scoreboard objectives remove bs.data
+scoreboard objectives remove bs.schedule.id
+
+data remove storage bs:data schedule
+data remove storage bs:const schedule
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/cancel/cancel_all.mcfunction b/modules/bs.schedule/data/bs.schedule/function/cancel/cancel_all.mcfunction
similarity index 88%
rename from datapacks/Bookshelf/data/bs.schedule/function/cancel/cancel_all.mcfunction
rename to modules/bs.schedule/data/bs.schedule/function/cancel/cancel_all.mcfunction
index d728582d41..e3952fd7e3 100644
--- a/datapacks/Bookshelf/data/bs.schedule/function/cancel/cancel_all.mcfunction
+++ b/modules/bs.schedule/data/bs.schedule/function/cancel/cancel_all.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html#cancel
# ------------------------------------------------------------------------------------------------------------
$execute store result score #i bs.ctx run data remove storage bs:data schedule.queue[$(with)]
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/cancel/cancel_one.mcfunction b/modules/bs.schedule/data/bs.schedule/function/cancel/cancel_one.mcfunction
similarity index 89%
rename from datapacks/Bookshelf/data/bs.schedule/function/cancel/cancel_one.mcfunction
rename to modules/bs.schedule/data/bs.schedule/function/cancel/cancel_one.mcfunction
index ae31cbb0b6..332b76b839 100644
--- a/datapacks/Bookshelf/data/bs.schedule/function/cancel/cancel_one.mcfunction
+++ b/modules/bs.schedule/data/bs.schedule/function/cancel/cancel_one.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html#cancel
# ------------------------------------------------------------------------------------------------------------
# Find the last element of the queue with the given data.
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/cancel/remove_one.mcfunction b/modules/bs.schedule/data/bs.schedule/function/cancel/remove_one.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.schedule/function/cancel/remove_one.mcfunction
rename to modules/bs.schedule/data/bs.schedule/function/cancel/remove_one.mcfunction
index 13a271e480..b6ff8f9354 100644
--- a/datapacks/Bookshelf/data/bs.schedule/function/cancel/remove_one.mcfunction
+++ b/modules/bs.schedule/data/bs.schedule/function/cancel/remove_one.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.schedule/data/bs.schedule/function/clear.mcfunction b/modules/bs.schedule/data/bs.schedule/function/clear.mcfunction
new file mode 100644
index 0000000000..d7cd45fbc5
--- /dev/null
+++ b/modules/bs.schedule/data/bs.schedule/function/clear.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set #schedule.suid bs.data 0
+data modify storage bs:data schedule.queue set value []
+schedule clear bs.schedule:execute/callback
diff --git a/modules/bs.schedule/data/bs.schedule/function/execute/callback.mcfunction b/modules/bs.schedule/data/bs.schedule/function/execute/callback.mcfunction
new file mode 100644
index 0000000000..ef7654c78f
--- /dev/null
+++ b/modules/bs.schedule/data/bs.schedule/function/execute/callback.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data schedule.slice set value []
+execute store result storage bs:ctx y int 1 run time query gametime
+function bs.schedule:execute/slice with storage bs:ctx
+
+execute if data storage bs:data schedule.slice[-1] as B5-0-0-0-1 run function bs.schedule:execute/loop
diff --git a/modules/bs.schedule/data/bs.schedule/function/execute/loop.mcfunction b/modules/bs.schedule/data/bs.schedule/function/execute/loop.mcfunction
new file mode 100644
index 0000000000..61ada99e54
--- /dev/null
+++ b/modules/bs.schedule/data/bs.schedule/function/execute/loop.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify entity @s {} merge from storage bs:data schedule.slice[-1]
+execute if data storage bs:data schedule.slice[-1].esid run function bs.schedule:execute/run/with_entity with storage bs:data schedule.slice[-1]
+execute unless data storage bs:data schedule.slice[-1].esid run function bs.schedule:execute/run/without_entity with storage bs:data schedule.slice[-1]
+
+data remove storage bs:data schedule.slice[-1]
+execute if data storage bs:data schedule.slice[-1] run return run function bs.schedule:execute/loop
+tp @s -30000000 0 1600
diff --git a/modules/bs.schedule/data/bs.schedule/function/execute/run/with_entity.mcfunction b/modules/bs.schedule/data/bs.schedule/function/execute/run/with_entity.mcfunction
new file mode 100644
index 0000000000..6bf7571a1a
--- /dev/null
+++ b/modules/bs.schedule/data/bs.schedule/function/execute/run/with_entity.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute at @s in $(dimension) as @e[predicate=bs.schedule:target] run $(command)
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/execute/run/without_entity.mcfunction b/modules/bs.schedule/data/bs.schedule/function/execute/run/without_entity.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.schedule/function/execute/run/without_entity.mcfunction
rename to modules/bs.schedule/data/bs.schedule/function/execute/run/without_entity.mcfunction
index 33ced37088..12610f9791 100644
--- a/datapacks/Bookshelf/data/bs.schedule/function/execute/run/without_entity.mcfunction
+++ b/modules/bs.schedule/data/bs.schedule/function/execute/run/without_entity.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/execute/slice.mcfunction b/modules/bs.schedule/data/bs.schedule/function/execute/slice.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.schedule/function/execute/slice.mcfunction
rename to modules/bs.schedule/data/bs.schedule/function/execute/slice.mcfunction
index b550524c28..7a1f8f4d32 100644
--- a/datapacks/Bookshelf/data/bs.schedule/function/execute/slice.mcfunction
+++ b/modules/bs.schedule/data/bs.schedule/function/execute/slice.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.schedule/data/bs.schedule/function/schedule/callback.mcfunction b/modules/bs.schedule/data/bs.schedule/function/schedule/callback.mcfunction
new file mode 100644
index 0000000000..2b7a69fc27
--- /dev/null
+++ b/modules/bs.schedule/data/bs.schedule/function/schedule/callback.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$return run schedule function bs.schedule:execute/callback $(time)t append
diff --git a/modules/bs.schedule/data/bs.schedule/function/schedule/context/get_custom_dimension.mcfunction b/modules/bs.schedule/data/bs.schedule/function/schedule/context/get_custom_dimension.mcfunction
new file mode 100644
index 0000000000..f8c39d39c3
--- /dev/null
+++ b/modules/bs.schedule/data/bs.schedule/function/schedule/context/get_custom_dimension.mcfunction
@@ -0,0 +1,17 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx _.dimension set from entity @s Brain.memories.minecraft:home.value.dimension
+kill @s
diff --git a/modules/bs.schedule/data/bs.schedule/function/schedule/context/get_dimension.mcfunction b/modules/bs.schedule/data/bs.schedule/function/schedule/context/get_dimension.mcfunction
new file mode 100644
index 0000000000..ff971c74c6
--- /dev/null
+++ b/modules/bs.schedule/data/bs.schedule/function/schedule/context/get_dimension.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute if dimension minecraft:overworld run return run data modify storage bs:ctx _.dimension set value "minecraft:overworld"
+execute if dimension minecraft:the_nether run return run data modify storage bs:ctx _.dimension set value "minecraft:the_nether"
+execute if dimension minecraft:the_end run return run data modify storage bs:ctx _.dimension set value "minecraft:the_end"
+
+execute positioned -30000000 0 1600 summon piglin_brute run function bs.schedule:schedule/context/get_custom_dimension
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/schedule/context/get_position.mcfunction b/modules/bs.schedule/data/bs.schedule/function/schedule/context/get_position.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.schedule/function/schedule/context/get_position.mcfunction
rename to modules/bs.schedule/data/bs.schedule/function/schedule/context/get_position.mcfunction
index d3742a07ba..a513f8ebb2 100644
--- a/datapacks/Bookshelf/data/bs.schedule/function/schedule/context/get_position.mcfunction
+++ b/modules/bs.schedule/data/bs.schedule/function/schedule/context/get_position.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.schedule/function/schedule/schedule.mcfunction b/modules/bs.schedule/data/bs.schedule/function/schedule/schedule.mcfunction
similarity index 94%
rename from datapacks/Bookshelf/data/bs.schedule/function/schedule/schedule.mcfunction
rename to modules/bs.schedule/data/bs.schedule/function/schedule/schedule.mcfunction
index b47ced2cc1..f5be78b923 100644
--- a/datapacks/Bookshelf/data/bs.schedule/function/schedule/schedule.mcfunction
+++ b/modules/bs.schedule/data/bs.schedule/function/schedule/schedule.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html#schedule
# ------------------------------------------------------------------------------------------------------------
data modify storage bs:ctx _ set value {time:1,unit:"tick"}
diff --git a/modules/bs.schedule/data/bs.schedule/function/schedule/unit/handle.mcfunction b/modules/bs.schedule/data/bs.schedule/function/schedule/unit/handle.mcfunction
new file mode 100644
index 0000000000..7fe172f346
--- /dev/null
+++ b/modules/bs.schedule/data/bs.schedule/function/schedule/unit/handle.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store success score #s bs.ctx run function bs.schedule:schedule/unit/normalize with storage bs:const schedule.units[{name:'$(unit)'}]
diff --git a/modules/bs.schedule/data/bs.schedule/function/schedule/unit/normalize.mcfunction b/modules/bs.schedule/data/bs.schedule/function/schedule/unit/normalize.mcfunction
new file mode 100644
index 0000000000..921f2638de
--- /dev/null
+++ b/modules/bs.schedule/data/bs.schedule/function/schedule/unit/normalize.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$return run execute store result storage bs:ctx _.time int $(scale) run data get storage bs:ctx _.time
diff --git a/datapacks/Bookshelf/data/bs.schedule/predicate/target.json b/modules/bs.schedule/data/bs.schedule/predicate/target.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.schedule/predicate/target.json
rename to modules/bs.schedule/data/bs.schedule/predicate/target.json
diff --git a/datapacks/Bookshelf/data/bs.schedule/tags/function/cancel_all.json b/modules/bs.schedule/data/bs.schedule/tags/function/cancel_all.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.schedule/tags/function/cancel_all.json
rename to modules/bs.schedule/data/bs.schedule/tags/function/cancel_all.json
index f3a5a01ce8..f2a435593c 100644
--- a/datapacks/Bookshelf/data/bs.schedule/tags/function/cancel_all.json
+++ b/modules/bs.schedule/data/bs.schedule/tags/function/cancel_all.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html#cancel",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/schedule.html#cancel",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/datapacks/Bookshelf/data/bs.schedule/tags/function/cancel_one.json b/modules/bs.schedule/data/bs.schedule/tags/function/cancel_one.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.schedule/tags/function/cancel_one.json
rename to modules/bs.schedule/data/bs.schedule/tags/function/cancel_one.json
index 1746e83264..b1deb2459c 100644
--- a/datapacks/Bookshelf/data/bs.schedule/tags/function/cancel_one.json
+++ b/modules/bs.schedule/data/bs.schedule/tags/function/cancel_one.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html#cancel",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/schedule.html#cancel",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/datapacks/Bookshelf/data/bs.schedule/tags/function/clear.json b/modules/bs.schedule/data/bs.schedule/tags/function/clear.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.schedule/tags/function/clear.json
rename to modules/bs.schedule/data/bs.schedule/tags/function/clear.json
index b9588c9c5d..790bffc5d8 100644
--- a/datapacks/Bookshelf/data/bs.schedule/tags/function/clear.json
+++ b/modules/bs.schedule/data/bs.schedule/tags/function/clear.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html#clear",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/schedule.html#clear",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/datapacks/Bookshelf/data/bs.schedule/tags/function/schedule.json b/modules/bs.schedule/data/bs.schedule/tags/function/schedule.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.schedule/tags/function/schedule.json
rename to modules/bs.schedule/data/bs.schedule/tags/function/schedule.json
index ddaec73bcc..01007eeb43 100644
--- a/datapacks/Bookshelf/data/bs.schedule/tags/function/schedule.json
+++ b/modules/bs.schedule/data/bs.schedule/tags/function/schedule.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/schedule.html#schedule",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/schedule.html#schedule",
"authors": [
"Aksiome",
"theogiraudet"
diff --git a/modules/bs.schedule/data/bs.schedule/test/cancel/all.mcfunction b/modules/bs.schedule/data/bs.schedule/test/cancel/all.mcfunction
new file mode 100644
index 0000000000..3df5d66e66
--- /dev/null
+++ b/modules/bs.schedule/data/bs.schedule/test/cancel/all.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set #packtest.schedule.ca bs.data 0
+function #bs.schedule:schedule {with:{command:"scoreboard players add #packtest.schedule.ca bs.data 1",time:1}}
+function #bs.schedule:schedule {with:{command:"scoreboard players add #packtest.schedule.ca bs.data 1",time:1,id:{cancel:"all"}}}
+function #bs.schedule:schedule {with:{command:"scoreboard players add #packtest.schedule.ca bs.data 1",time:1,id:{cancel:"all"}}}
+function #bs.schedule:cancel_all {with:{id:{cancel:"all"}}}
+
+await delay 1t
+assert score #packtest.schedule.ca bs.data matches 1
diff --git a/modules/bs.schedule/data/bs.schedule/test/cancel/one.mcfunction b/modules/bs.schedule/data/bs.schedule/test/cancel/one.mcfunction
new file mode 100644
index 0000000000..6c22bd0bb3
--- /dev/null
+++ b/modules/bs.schedule/data/bs.schedule/test/cancel/one.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set #packtest.schedule.co bs.data 0
+function #bs.schedule:schedule {with:{command:"scoreboard players add #packtest.schedule.co bs.data 1",time:1}}
+function #bs.schedule:schedule {with:{command:"scoreboard players add #packtest.schedule.co bs.data 1",time:1,id:{cancel:"one"}}}
+function #bs.schedule:schedule {with:{command:"scoreboard players add #packtest.schedule.co bs.data 1",time:1,id:{cancel:"one"}}}
+function #bs.schedule:cancel_one {with:{id:{cancel:"one"}}}
+
+await delay 1t
+assert score #packtest.schedule.co bs.data matches 2
diff --git a/modules/bs.schedule/data/bs.schedule/test/schedule/context.mcfunction b/modules/bs.schedule/data/bs.schedule/test/schedule/context.mcfunction
new file mode 100644
index 0000000000..b762d2862f
--- /dev/null
+++ b/modules/bs.schedule/data/bs.schedule/test/schedule/context.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+setblock ~ ~1 ~ minecraft:bookshelf
+function #bs.schedule:schedule {with:{command:"execute if block ~ ~1 ~ minecraft:bookshelf run scoreboard players set @s bs.data 1",time:1}}
+await delay 1t
+assert score @s bs.data matches 1
+
+execute in minecraft:the_nether run function #bs.schedule:schedule {with:{command:"execute if dimension minecraft:the_nether run scoreboard players set @s bs.data 2",time:1}}
+await delay 1t
+assert score @s bs.data matches 2
diff --git a/modules/bs.schedule/data/bs.schedule/test/schedule/stack.mcfunction b/modules/bs.schedule/data/bs.schedule/test/schedule/stack.mcfunction
new file mode 100644
index 0000000000..60e1ffaf93
--- /dev/null
+++ b/modules/bs.schedule/data/bs.schedule/test/schedule/stack.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+function #bs.schedule:schedule {with:{command:"scoreboard players add #packtest.schedule.stack bs.data 1",time:1}}
+function #bs.schedule:schedule {with:{command:"scoreboard players add #packtest.schedule.stack bs.data 1",time:1}}
+await delay 1t
+assert score #packtest.schedule.stack bs.data matches 2
diff --git a/modules/bs.schedule/data/bs.schedule/test/units/error.mcfunction b/modules/bs.schedule/data/bs.schedule/test/units/error.mcfunction
new file mode 100644
index 0000000000..80d298e540
--- /dev/null
+++ b/modules/bs.schedule/data/bs.schedule/test/units/error.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+tag @s add bs.schedule.log.schedule._
+function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"¯|_(ツ)_|¯"}}
+assert chat "(?i).*unit.*¯\\|_\\(ツ\\)_\\|¯"
diff --git a/modules/bs.schedule/data/bs.schedule/test/units/success.mcfunction b/modules/bs.schedule/data/bs.schedule/test/units/success.mcfunction
new file mode 100644
index 0000000000..0d914e2911
--- /dev/null
+++ b/modules/bs.schedule/data/bs.schedule/test/units/success.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"t"}}
+function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"tick"}}
+function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"s"}}
+function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"second"}}
+function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"m"}}
+function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"minute"}}
+function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"h"}}
+function #bs.schedule:schedule {with:{command:"say _",time:1,unit:"hour"}}
+assert not chat "(?i).*error.*"
diff --git a/modules/bs.schedule/module.json b/modules/bs.schedule/module.json
new file mode 100644
index 0000000000..d50310b0b4
--- /dev/null
+++ b/modules/bs.schedule/module.json
@@ -0,0 +1,17 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.schedule",
+ "load": "."
+ },
+ "meta": {
+ "name": "Schedule",
+ "slug": "bookshelf-schedule",
+ "description": "Enhance command scheduling. Cancel commands and maintain execution context (entity & location).",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/schedule.html",
+ "tags": ["default"],
+ "weak_dependencies": [
+ "bs.log"
+ ]
+ }
+}
diff --git a/modules/bs.sidebar/README.md b/modules/bs.sidebar/README.md
new file mode 100644
index 0000000000..778c9c0525
--- /dev/null
+++ b/modules/bs.sidebar/README.md
@@ -0,0 +1,10 @@
+# 📰 Bookshelf Sidebar
+
+This datapack enables you to create a dynamic and visually appealing sidebar using the scoreboard.
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/sidebar.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.sidebar/data/bs.sidebar/function/__load__.mcfunction b/modules/bs.sidebar/data/bs.sidebar/function/__load__.mcfunction
new file mode 100644
index 0000000000..60b5bd6503
--- /dev/null
+++ b/modules/bs.sidebar/data/bs.sidebar/function/__load__.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+forceload add -30000000 1600
+execute unless entity B5-0-0-0-2 run summon minecraft:text_display -30000000 0 1600 {UUID:[I;181,0,0,2],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],view_range:0f,alignment:"center"}
+
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+execute unless data storage bs:const log.messages[{namespaces: ["bs.sidebar"]}] run data modify storage bs:const log.messages[{namespaces: ["bs"]}].namespaces append value "bs.sidebar"
diff --git a/modules/bs.sidebar/data/bs.sidebar/function/__unload__.mcfunction b/modules/bs.sidebar/data/bs.sidebar/function/__unload__.mcfunction
new file mode 100644
index 0000000000..ff1998f0d2
--- /dev/null
+++ b/modules/bs.sidebar/data/bs.sidebar/function/__unload__.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+kill B5-0-0-0-2
+forceload remove -30000000 1600
+
+scoreboard objectives remove bs.ctx
+
+data remove storage bs:data sidebar
diff --git a/datapacks/Bookshelf/data/bs.sidebar/function/create/check/name.mcfunction b/modules/bs.sidebar/data/bs.sidebar/function/create/check/name.mcfunction
similarity index 89%
rename from datapacks/Bookshelf/data/bs.sidebar/function/create/check/name.mcfunction
rename to modules/bs.sidebar/data/bs.sidebar/function/create/check/name.mcfunction
index 6efd7aa627..e2da442795 100644
--- a/datapacks/Bookshelf/data/bs.sidebar/function/create/check/name.mcfunction
+++ b/modules/bs.sidebar/data/bs.sidebar/function/create/check/name.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -13,6 +13,6 @@
# For more details, refer to the MPL v2.0.
# ------------------------------------------------------------------------------------------------------------
-# guard check, if the function compile the name is valid
+# guard check, if the function returns 1, the name is valid
return 1
$tellraw @s [$(name)]
diff --git a/datapacks/Bookshelf/data/bs.sidebar/function/create/check/objective.mcfunction b/modules/bs.sidebar/data/bs.sidebar/function/create/check/objective.mcfunction
similarity index 89%
rename from datapacks/Bookshelf/data/bs.sidebar/function/create/check/objective.mcfunction
rename to modules/bs.sidebar/data/bs.sidebar/function/create/check/objective.mcfunction
index 9bbb7acd46..50bec6d6d7 100644
--- a/datapacks/Bookshelf/data/bs.sidebar/function/create/check/objective.mcfunction
+++ b/modules/bs.sidebar/data/bs.sidebar/function/create/check/objective.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -13,6 +13,6 @@
# For more details, refer to the MPL v2.0.
# ------------------------------------------------------------------------------------------------------------
-# guard check, if the function compile the objective is valid
+# guard check, if the function returns 1, the objective is valid
return 1
$scoreboard objectives add $(id) dummy
diff --git a/datapacks/Bookshelf/data/bs.sidebar/function/create/create.mcfunction b/modules/bs.sidebar/data/bs.sidebar/function/create/create.mcfunction
similarity index 95%
rename from datapacks/Bookshelf/data/bs.sidebar/function/create/create.mcfunction
rename to modules/bs.sidebar/data/bs.sidebar/function/create/create.mcfunction
index fec7984667..e11a516b29 100644
--- a/datapacks/Bookshelf/data/bs.sidebar/function/create/create.mcfunction
+++ b/modules/bs.sidebar/data/bs.sidebar/function/create/create.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/sidebar.html#create
# ------------------------------------------------------------------------------------------------------------
$data modify storage bs:ctx _ set value {id:'$(objective)',name:'$(display_name)',contents:$(contents)}
diff --git a/datapacks/Bookshelf/data/bs.sidebar/function/create/recurse/abort.mcfunction b/modules/bs.sidebar/data/bs.sidebar/function/create/recurse/abort.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.sidebar/function/create/recurse/abort.mcfunction
rename to modules/bs.sidebar/data/bs.sidebar/function/create/recurse/abort.mcfunction
index d5519f4f9d..caef678114 100644
--- a/datapacks/Bookshelf/data/bs.sidebar/function/create/recurse/abort.mcfunction
+++ b/modules/bs.sidebar/data/bs.sidebar/function/create/recurse/abort.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.sidebar/data/bs.sidebar/function/create/recurse/next.mcfunction b/modules/bs.sidebar/data/bs.sidebar/function/create/recurse/next.mcfunction
new file mode 100644
index 0000000000..ffcd11abd3
--- /dev/null
+++ b/modules/bs.sidebar/data/bs.sidebar/function/create/recurse/next.mcfunction
@@ -0,0 +1,41 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$scoreboard players set $$(line) $(id) -$(line)
+$scoreboard players display name $$(line) $(id) $(left)
+$scoreboard players display numberformat $$(line) $(id) fixed $(right)
+
+$execute if score #l bs.ctx matches 1 run data modify storage bs:data sidebar[{id:'$(id)'}].dyn append value {cmd:'scoreboard players display name $$(line) $(id)',text:'$(dynleft)'}
+$execute if score #r bs.ctx matches 1 run data modify storage bs:data sidebar[{id:'$(id)'}].dyn append value {cmd:'scoreboard players display numberformat $$(line) $(id) fixed',text:'$(dynright)'}
+execute store result storage bs:ctx _.line int 1 run scoreboard players add #i bs.ctx 1
+
+data remove storage bs:ctx _.contents[0]
+execute unless data storage bs:ctx _.contents[0] run return 1
+
+data modify storage bs:ctx _.dynleft set from storage bs:ctx _.contents[0]
+data modify storage bs:ctx _.dynleft set from storage bs:ctx _.contents[0][0]
+data modify entity @s CustomName set from storage bs:ctx _.dynleft
+data modify entity @s text set from storage bs:ctx _.dynleft
+data modify storage bs:ctx _.left set from entity @s CustomName
+execute store success score #l bs.ctx run data modify storage bs:ctx _.left set from entity @s text
+
+data modify storage bs:ctx _.dynright set value '""'
+data modify storage bs:ctx _.dynright set from storage bs:ctx _.contents[0][1]
+data modify entity @s CustomName set from storage bs:ctx _.dynright
+data modify entity @s text set from storage bs:ctx _.dynright
+data modify storage bs:ctx _.right set from entity @s CustomName
+execute store success score #r bs.ctx run data modify storage bs:ctx _.right set from entity @s text
+
+function bs.sidebar:create/recurse/next with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.sidebar/function/create/recurse/start.mcfunction b/modules/bs.sidebar/data/bs.sidebar/function/create/recurse/start.mcfunction
similarity index 98%
rename from datapacks/Bookshelf/data/bs.sidebar/function/create/recurse/start.mcfunction
rename to modules/bs.sidebar/data/bs.sidebar/function/create/recurse/start.mcfunction
index 6a0f311158..51b5d3ad0c 100644
--- a/datapacks/Bookshelf/data/bs.sidebar/function/create/recurse/start.mcfunction
+++ b/modules/bs.sidebar/data/bs.sidebar/function/create/recurse/start.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.sidebar/data/bs.sidebar/function/refresh/loop.mcfunction b/modules/bs.sidebar/data/bs.sidebar/function/refresh/loop.mcfunction
new file mode 100644
index 0000000000..8d6c7eea42
--- /dev/null
+++ b/modules/bs.sidebar/data/bs.sidebar/function/refresh/loop.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$$(cmd) $(text)
+
+data remove storage bs:ctx _.dyn[0]
+execute unless data storage bs:ctx _.dyn[0] run return 1
+
+data modify storage bs:ctx _.cmd set from storage bs:ctx _.dyn[0].cmd
+data modify entity B5-0-0-0-2 text set from storage bs:ctx _.dyn[0].text
+data modify storage bs:ctx _.text set from entity B5-0-0-0-2 text
+
+return run function bs.sidebar:refresh/loop with storage bs:ctx _
diff --git a/datapacks/Bookshelf/data/bs.sidebar/function/refresh/refresh.mcfunction b/modules/bs.sidebar/data/bs.sidebar/function/refresh/refresh.mcfunction
similarity index 89%
rename from datapacks/Bookshelf/data/bs.sidebar/function/refresh/refresh.mcfunction
rename to modules/bs.sidebar/data/bs.sidebar/function/refresh/refresh.mcfunction
index 701a6d43cf..0c888cb66c 100644
--- a/datapacks/Bookshelf/data/bs.sidebar/function/refresh/refresh.mcfunction
+++ b/modules/bs.sidebar/data/bs.sidebar/function/refresh/refresh.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/sidebar.html#refresh
# ------------------------------------------------------------------------------------------------------------
$data modify storage bs:ctx _ set from storage bs:data sidebar[{id:'$(objective)'}]
diff --git a/datapacks/Bookshelf/data/bs.sidebar/tags/function/create.json b/modules/bs.sidebar/data/bs.sidebar/tags/function/create.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.sidebar/tags/function/create.json
rename to modules/bs.sidebar/data/bs.sidebar/tags/function/create.json
index afdee73437..c7eea40348 100644
--- a/datapacks/Bookshelf/data/bs.sidebar/tags/function/create.json
+++ b/modules/bs.sidebar/data/bs.sidebar/tags/function/create.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/sidebar.html#create",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/sidebar.html#create",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.sidebar/tags/function/refresh.json b/modules/bs.sidebar/data/bs.sidebar/tags/function/refresh.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.sidebar/tags/function/refresh.json
rename to modules/bs.sidebar/data/bs.sidebar/tags/function/refresh.json
index bf75bd968b..bd07459f7e 100644
--- a/datapacks/Bookshelf/data/bs.sidebar/tags/function/refresh.json
+++ b/modules/bs.sidebar/data/bs.sidebar/tags/function/refresh.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/sidebar.html#refresh",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/sidebar.html#refresh",
"authors": [
"Aksiome"
],
diff --git a/modules/bs.sidebar/module.json b/modules/bs.sidebar/module.json
new file mode 100644
index 0000000000..61dc119acc
--- /dev/null
+++ b/modules/bs.sidebar/module.json
@@ -0,0 +1,17 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.sidebar",
+ "load": "."
+ },
+ "meta": {
+ "name": "Sidebar",
+ "slug": "bookshelf-sidebar",
+ "description": "Create a visually appealing and dynamic sidebar using the scoreboard.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/sidebar.html",
+ "tags": ["default"],
+ "weak_dependencies": [
+ "bs.log"
+ ]
+ }
+}
diff --git a/modules/bs.time/README.md b/modules/bs.time/README.md
new file mode 100644
index 0000000000..b47c6c7fcb
--- /dev/null
+++ b/modules/bs.time/README.md
@@ -0,0 +1,10 @@
+# ⌚ Bookshelf Time
+
+This datapack allows you to easily retrieve system time information in Minecraft.
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/time.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.time/data/bs.time/function/__load__.mcfunction b/modules/bs.time/data/bs.time/function/__load__.mcfunction
new file mode 100644
index 0000000000..35671ff175
--- /dev/null
+++ b/modules/bs.time/data/bs.time/function/__load__.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+forceload add -30000000 1600
+setblock -30000000 0 1605 minecraft:repeating_command_block[facing=up]{auto:1b,Command:"help me",TrackOutput:1}
+
+scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
diff --git a/modules/bs.time/data/bs.time/function/__unload__.mcfunction b/modules/bs.time/data/bs.time/function/__unload__.mcfunction
new file mode 100644
index 0000000000..680a0b0b35
--- /dev/null
+++ b/modules/bs.time/data/bs.time/function/__unload__.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+setblock -30000000 0 1605 minecraft:air
+forceload remove -30000000 1600
+
+data remove storage bs:data time
+scoreboard objectives remove bs.out
diff --git a/modules/bs.time/data/bs.time/function/get/cast.mcfunction b/modules/bs.time/data/bs.time/function/get/cast.mcfunction
new file mode 100644
index 0000000000..fcebf0cb51
--- /dev/null
+++ b/modules/bs.time/data/bs.time/function/get/cast.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$scoreboard players set $time.hours bs.out $(hours)
+$scoreboard players set $time.minutes bs.out $(minutes)
+$scoreboard players set $time.seconds bs.out $(seconds)
diff --git a/modules/bs.time/data/bs.time/function/get/get.mcfunction b/modules/bs.time/data/bs.time/function/get/get.mcfunction
new file mode 100644
index 0000000000..15a74cbeff
--- /dev/null
+++ b/modules/bs.time/data/bs.time/function/get/get.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data time.full set string block -30000000 0 1605 LastOutput 10 18
+data modify storage bs:data time.hours set string storage bs:data time.full 0 2
+data modify storage bs:data time.minutes set string storage bs:data time.full 3 5
+data modify storage bs:data time.seconds set string storage bs:data time.full 6 8
+
+function bs.time:get/cast with storage bs:data time
diff --git a/modules/bs.time/data/bs.time/tags/function/get.json b/modules/bs.time/data/bs.time/tags/function/get.json
new file mode 100644
index 0000000000..f92f77a669
--- /dev/null
+++ b/modules/bs.time/data/bs.time/tags/function/get.json
@@ -0,0 +1,24 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/time.html#system-time",
+ "authors": [
+ "Aksiome"
+ ],
+ "contributors": [
+ "Awhikax",
+ "RedCoal"
+ ],
+ "created": {
+ "date": "2021/10/30",
+ "minecraft_version": "1.17.1"
+ },
+ "updated": {
+ "date": "2023/08/30",
+ "minecraft_version": "23w33a"
+ }
+ },
+ "values": [
+ "bs.time:get/get"
+ ]
+}
diff --git a/modules/bs.time/data/bs.time/test/format.mcfunction b/modules/bs.time/data/bs.time/test/format.mcfunction
new file mode 100644
index 0000000000..a49bc9ddb8
--- /dev/null
+++ b/modules/bs.time/data/bs.time/test/format.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players set $time.hours bs.out -1
+scoreboard players set $time.minutes bs.out -1
+scoreboard players set $time.seconds bs.out -1
+
+function #bs.time:get
+
+assert score $time.hours bs.out matches 0..
+assert score $time.minutes bs.out matches 0..
+assert score $time.seconds bs.out matches 0..
diff --git a/modules/bs.time/module.json b/modules/bs.time/module.json
new file mode 100644
index 0000000000..59da8bc0b1
--- /dev/null
+++ b/modules/bs.time/module.json
@@ -0,0 +1,14 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.time",
+ "load": "."
+ },
+ "meta": {
+ "name": "Time",
+ "slug": "bookshelf-time",
+ "description": "Get information about the system time effortlessly.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/time.html",
+ "tags": ["default"]
+ }
+}
diff --git a/modules/bs.tree/README.md b/modules/bs.tree/README.md
new file mode 100644
index 0000000000..58ce954ea4
--- /dev/null
+++ b/modules/bs.tree/README.md
@@ -0,0 +1,10 @@
+# 🌳 Bookshelf Tree
+
+This datapack provides tree structures, offering a variety of pre-built tree designs for easy integration into your world.
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/tree.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.tree/data/bs.tree/function/__load__.mcfunction b/modules/bs.tree/data/bs.tree/function/__load__.mcfunction
new file mode 100644
index 0000000000..fe9b8c0c4f
--- /dev/null
+++ b/modules/bs.tree/data/bs.tree/function/__load__.mcfunction
@@ -0,0 +1,14 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
diff --git a/modules/bs.tree/data/bs.tree/function/__unload__.mcfunction b/modules/bs.tree/data/bs.tree/function/__unload__.mcfunction
new file mode 100644
index 0000000000..fe9b8c0c4f
--- /dev/null
+++ b/modules/bs.tree/data/bs.tree/function/__unload__.mcfunction
@@ -0,0 +1,14 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/birch_1.nbt b/modules/bs.tree/data/bs.tree/structure/birch_1.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/birch_1.nbt
rename to modules/bs.tree/data/bs.tree/structure/birch_1.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/birch_2.nbt b/modules/bs.tree/data/bs.tree/structure/birch_2.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/birch_2.nbt
rename to modules/bs.tree/data/bs.tree/structure/birch_2.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/birch_3.nbt b/modules/bs.tree/data/bs.tree/structure/birch_3.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/birch_3.nbt
rename to modules/bs.tree/data/bs.tree/structure/birch_3.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/birch_4.nbt b/modules/bs.tree/data/bs.tree/structure/birch_4.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/birch_4.nbt
rename to modules/bs.tree/data/bs.tree/structure/birch_4.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/birch_5.nbt b/modules/bs.tree/data/bs.tree/structure/birch_5.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/birch_5.nbt
rename to modules/bs.tree/data/bs.tree/structure/birch_5.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/cypress_1.nbt b/modules/bs.tree/data/bs.tree/structure/cypress_1.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/cypress_1.nbt
rename to modules/bs.tree/data/bs.tree/structure/cypress_1.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/cypress_2.nbt b/modules/bs.tree/data/bs.tree/structure/cypress_2.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/cypress_2.nbt
rename to modules/bs.tree/data/bs.tree/structure/cypress_2.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/cypress_3.nbt b/modules/bs.tree/data/bs.tree/structure/cypress_3.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/cypress_3.nbt
rename to modules/bs.tree/data/bs.tree/structure/cypress_3.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/cypress_4.nbt b/modules/bs.tree/data/bs.tree/structure/cypress_4.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/cypress_4.nbt
rename to modules/bs.tree/data/bs.tree/structure/cypress_4.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/cypress_5.nbt b/modules/bs.tree/data/bs.tree/structure/cypress_5.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/cypress_5.nbt
rename to modules/bs.tree/data/bs.tree/structure/cypress_5.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/dark_oak_1.nbt b/modules/bs.tree/data/bs.tree/structure/dark_oak_1.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/dark_oak_1.nbt
rename to modules/bs.tree/data/bs.tree/structure/dark_oak_1.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/dark_oak_2.nbt b/modules/bs.tree/data/bs.tree/structure/dark_oak_2.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/dark_oak_2.nbt
rename to modules/bs.tree/data/bs.tree/structure/dark_oak_2.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/dark_oak_3.nbt b/modules/bs.tree/data/bs.tree/structure/dark_oak_3.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/dark_oak_3.nbt
rename to modules/bs.tree/data/bs.tree/structure/dark_oak_3.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/dark_oak_4.nbt b/modules/bs.tree/data/bs.tree/structure/dark_oak_4.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/dark_oak_4.nbt
rename to modules/bs.tree/data/bs.tree/structure/dark_oak_4.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/dark_oak_5.nbt b/modules/bs.tree/data/bs.tree/structure/dark_oak_5.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/dark_oak_5.nbt
rename to modules/bs.tree/data/bs.tree/structure/dark_oak_5.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/dead_spruce_1.nbt b/modules/bs.tree/data/bs.tree/structure/dead_spruce_1.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/dead_spruce_1.nbt
rename to modules/bs.tree/data/bs.tree/structure/dead_spruce_1.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/dead_spruce_2.nbt b/modules/bs.tree/data/bs.tree/structure/dead_spruce_2.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/dead_spruce_2.nbt
rename to modules/bs.tree/data/bs.tree/structure/dead_spruce_2.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/dead_spruce_3.nbt b/modules/bs.tree/data/bs.tree/structure/dead_spruce_3.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/dead_spruce_3.nbt
rename to modules/bs.tree/data/bs.tree/structure/dead_spruce_3.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/dead_spruce_4.nbt b/modules/bs.tree/data/bs.tree/structure/dead_spruce_4.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/dead_spruce_4.nbt
rename to modules/bs.tree/data/bs.tree/structure/dead_spruce_4.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/dead_spruce_5.nbt b/modules/bs.tree/data/bs.tree/structure/dead_spruce_5.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/dead_spruce_5.nbt
rename to modules/bs.tree/data/bs.tree/structure/dead_spruce_5.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/exotic_1.nbt b/modules/bs.tree/data/bs.tree/structure/exotic_1.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/exotic_1.nbt
rename to modules/bs.tree/data/bs.tree/structure/exotic_1.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/exotic_2.nbt b/modules/bs.tree/data/bs.tree/structure/exotic_2.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/exotic_2.nbt
rename to modules/bs.tree/data/bs.tree/structure/exotic_2.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/exotic_3.nbt b/modules/bs.tree/data/bs.tree/structure/exotic_3.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/exotic_3.nbt
rename to modules/bs.tree/data/bs.tree/structure/exotic_3.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/exotic_4.nbt b/modules/bs.tree/data/bs.tree/structure/exotic_4.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/exotic_4.nbt
rename to modules/bs.tree/data/bs.tree/structure/exotic_4.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/exotic_5.nbt b/modules/bs.tree/data/bs.tree/structure/exotic_5.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/exotic_5.nbt
rename to modules/bs.tree/data/bs.tree/structure/exotic_5.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/fir_1.nbt b/modules/bs.tree/data/bs.tree/structure/fir_1.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/fir_1.nbt
rename to modules/bs.tree/data/bs.tree/structure/fir_1.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/fir_2.nbt b/modules/bs.tree/data/bs.tree/structure/fir_2.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/fir_2.nbt
rename to modules/bs.tree/data/bs.tree/structure/fir_2.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/fir_3.nbt b/modules/bs.tree/data/bs.tree/structure/fir_3.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/fir_3.nbt
rename to modules/bs.tree/data/bs.tree/structure/fir_3.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/fir_4.nbt b/modules/bs.tree/data/bs.tree/structure/fir_4.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/fir_4.nbt
rename to modules/bs.tree/data/bs.tree/structure/fir_4.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/fir_5.nbt b/modules/bs.tree/data/bs.tree/structure/fir_5.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/fir_5.nbt
rename to modules/bs.tree/data/bs.tree/structure/fir_5.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/jungle_1.nbt b/modules/bs.tree/data/bs.tree/structure/jungle_1.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/jungle_1.nbt
rename to modules/bs.tree/data/bs.tree/structure/jungle_1.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/jungle_2.nbt b/modules/bs.tree/data/bs.tree/structure/jungle_2.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/jungle_2.nbt
rename to modules/bs.tree/data/bs.tree/structure/jungle_2.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/jungle_3.nbt b/modules/bs.tree/data/bs.tree/structure/jungle_3.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/jungle_3.nbt
rename to modules/bs.tree/data/bs.tree/structure/jungle_3.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/jungle_4.nbt b/modules/bs.tree/data/bs.tree/structure/jungle_4.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/jungle_4.nbt
rename to modules/bs.tree/data/bs.tree/structure/jungle_4.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/jungle_5.nbt b/modules/bs.tree/data/bs.tree/structure/jungle_5.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/jungle_5.nbt
rename to modules/bs.tree/data/bs.tree/structure/jungle_5.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/mushroom_1.nbt b/modules/bs.tree/data/bs.tree/structure/mushroom_1.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/mushroom_1.nbt
rename to modules/bs.tree/data/bs.tree/structure/mushroom_1.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/mushroom_2.nbt b/modules/bs.tree/data/bs.tree/structure/mushroom_2.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/mushroom_2.nbt
rename to modules/bs.tree/data/bs.tree/structure/mushroom_2.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/mushroom_3.nbt b/modules/bs.tree/data/bs.tree/structure/mushroom_3.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/mushroom_3.nbt
rename to modules/bs.tree/data/bs.tree/structure/mushroom_3.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/mushroom_4.nbt b/modules/bs.tree/data/bs.tree/structure/mushroom_4.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/mushroom_4.nbt
rename to modules/bs.tree/data/bs.tree/structure/mushroom_4.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/mushroom_5.nbt b/modules/bs.tree/data/bs.tree/structure/mushroom_5.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/mushroom_5.nbt
rename to modules/bs.tree/data/bs.tree/structure/mushroom_5.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/oak_1.nbt b/modules/bs.tree/data/bs.tree/structure/oak_1.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/oak_1.nbt
rename to modules/bs.tree/data/bs.tree/structure/oak_1.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/oak_2.nbt b/modules/bs.tree/data/bs.tree/structure/oak_2.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/oak_2.nbt
rename to modules/bs.tree/data/bs.tree/structure/oak_2.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/oak_3.nbt b/modules/bs.tree/data/bs.tree/structure/oak_3.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/oak_3.nbt
rename to modules/bs.tree/data/bs.tree/structure/oak_3.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/oak_4.nbt b/modules/bs.tree/data/bs.tree/structure/oak_4.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/oak_4.nbt
rename to modules/bs.tree/data/bs.tree/structure/oak_4.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/oak_5.nbt b/modules/bs.tree/data/bs.tree/structure/oak_5.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/oak_5.nbt
rename to modules/bs.tree/data/bs.tree/structure/oak_5.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/palm_1.nbt b/modules/bs.tree/data/bs.tree/structure/palm_1.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/palm_1.nbt
rename to modules/bs.tree/data/bs.tree/structure/palm_1.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/palm_2.nbt b/modules/bs.tree/data/bs.tree/structure/palm_2.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/palm_2.nbt
rename to modules/bs.tree/data/bs.tree/structure/palm_2.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/palm_3.nbt b/modules/bs.tree/data/bs.tree/structure/palm_3.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/palm_3.nbt
rename to modules/bs.tree/data/bs.tree/structure/palm_3.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/palm_4.nbt b/modules/bs.tree/data/bs.tree/structure/palm_4.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/palm_4.nbt
rename to modules/bs.tree/data/bs.tree/structure/palm_4.nbt
diff --git a/datapacks/Bookshelf/data/bs.tree/structure/palm_5.nbt b/modules/bs.tree/data/bs.tree/structure/palm_5.nbt
similarity index 100%
rename from datapacks/Bookshelf/data/bs.tree/structure/palm_5.nbt
rename to modules/bs.tree/data/bs.tree/structure/palm_5.nbt
diff --git a/modules/bs.tree/module.json b/modules/bs.tree/module.json
new file mode 100644
index 0000000000..de4c8dec65
--- /dev/null
+++ b/modules/bs.tree/module.json
@@ -0,0 +1,14 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.tree",
+ "load": "."
+ },
+ "meta": {
+ "name": "Tree",
+ "slug": "bookshelf-tree",
+ "description": "Simplicity meets utility in this bank of trees.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/tree.html",
+ "tags": ["default"]
+ }
+}
diff --git a/modules/bs.vector/README.md b/modules/bs.vector/README.md
new file mode 100644
index 0000000000..c6f0e4bc67
--- /dev/null
+++ b/modules/bs.vector/README.md
@@ -0,0 +1,14 @@
+# ➡️ Bookshelf Vector
+
+This datapack provides tools to manipulate vectors, enabling efficient management of motion, forces, and physics calculations.
+
+> “With vectors, physics has found a magnificent language.”
+>
+> -- Richard Feynman
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/vector.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.vector/data/bs.vector/function/__load__.mcfunction b/modules/bs.vector/data/bs.vector/function/__load__.mcfunction
new file mode 100644
index 0000000000..3028732a18
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/__load__.mcfunction
@@ -0,0 +1,28 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+forceload add -30000000 1600
+execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
+execute unless entity B5-0-0-0-2 run summon minecraft:text_display -30000000 0 1600 {UUID:[I;181,0,0,2],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"],view_range:0f,alignment:"center"}
+
+scoreboard objectives add bs.in dummy [{"text":"BS ","color":"dark_gray"},{"text":"Input","color":"aqua"}]
+scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
+scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+
+scoreboard players set -1 bs.const -1
+scoreboard players set 2 bs.const 2
+scoreboard players set 100 bs.const 100
+scoreboard players set 1000 bs.const 1000
diff --git a/modules/bs.vector/data/bs.vector/function/__unload__.mcfunction b/modules/bs.vector/data/bs.vector/function/__unload__.mcfunction
new file mode 100644
index 0000000000..96b55e7728
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/__unload__.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+kill B5-0-0-0-1
+kill B5-0-0-0-2
+forceload remove -30000000 1600
+
+scoreboard objectives remove bs.in
+scoreboard objectives remove bs.out
+scoreboard objectives remove bs.const
+scoreboard objectives remove bs.ctx
diff --git a/modules/bs.vector/data/bs.vector/function/abs_max.mcfunction b/modules/bs.vector/data/bs.vector/function/abs_max.mcfunction
new file mode 100644
index 0000000000..f296b0f5ec
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/abs_max.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation $vector.abs_max bs.out = $vector.abs_max.0 bs.in
+execute if predicate {"condition":"minecraft:inverted","term":{"condition":"minecraft:any_of","terms":[{"condition":"minecraft:value_check","value":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_max.1"},"score":"bs.in"},"range":{"min":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_max"},"score":"bs.out","scale":-1},"max":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_max"},"score":"bs.out"}}},{"condition":"minecraft:value_check","value":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_max.1"},"score":"bs.in"},"range":{"min":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_max"},"score":"bs.out"},"max":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_max"},"score":"bs.out","scale":-1}}}]}} \
+ run scoreboard players operation $vector.abs_max bs.out = $vector.abs_max.1 bs.in
+execute if predicate {"condition":"minecraft:inverted","term":{"condition":"minecraft:any_of","terms":[{"condition":"minecraft:value_check","value":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_max.2"},"score":"bs.in"},"range":{"min":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_max"},"score":"bs.out","scale":-1},"max":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_max"},"score":"bs.out"}}},{"condition":"minecraft:value_check","value":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_max.2"},"score":"bs.in"},"range":{"min":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_max"},"score":"bs.out"},"max":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_max"},"score":"bs.out","scale":-1}}}]}} \
+ run scoreboard players operation $vector.abs_max bs.out = $vector.abs_max.2 bs.in
+return run scoreboard players get $vector.abs_max bs.out
diff --git a/modules/bs.vector/data/bs.vector/function/abs_min.mcfunction b/modules/bs.vector/data/bs.vector/function/abs_min.mcfunction
new file mode 100644
index 0000000000..182cace4eb
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/abs_min.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard players operation $vector.abs_min bs.out = $vector.abs_min.0 bs.in
+execute if predicate {"condition":"minecraft:any_of","terms":[{"condition":"minecraft:value_check","value":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_min.1"},"score":"bs.in"},"range":{"min":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_min"},"score":"bs.out","scale":-1},"max":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_min"},"score":"bs.out"}}},{"condition":"minecraft:value_check","value":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_min.1"},"score":"bs.in"},"range":{"min":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_min"},"score":"bs.out"},"max":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_min"},"score":"bs.out","scale":-1}}}]} \
+ run scoreboard players operation $vector.abs_min bs.out = $vector.abs_min.1 bs.in
+execute if predicate {"condition":"minecraft:any_of","terms":[{"condition":"minecraft:value_check","value":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_min.2"},"score":"bs.in"},"range":{"min":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_min"},"score":"bs.out","scale":-1},"max":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_min"},"score":"bs.out"}}},{"condition":"minecraft:value_check","value":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_min.2"},"score":"bs.in"},"range":{"min":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_min"},"score":"bs.out"},"max":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.abs_min"},"score":"bs.out","scale":-1}}}]} \
+ run scoreboard players operation $vector.abs_min bs.out = $vector.abs_min.2 bs.in
+return run scoreboard players get $vector.abs_min bs.out
diff --git a/modules/bs.vector/data/bs.vector/function/convert/basis_rot_3d/basis_rot_3d.mcfunction b/modules/bs.vector/data/bs.vector/function/convert/basis_rot_3d/basis_rot_3d.mcfunction
new file mode 100644
index 0000000000..e0a705d223
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/convert/basis_rot_3d/basis_rot_3d.mcfunction
@@ -0,0 +1,49 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$scoreboard players set #s bs.ctx $(scaling)
+scoreboard players set #t bs.ctx 1000000000
+execute store result storage bs:ctx y double .000000001 run scoreboard players operation #t bs.ctx /= #s bs.ctx
+
+# sincos(h: Phi) & sincos(v: Theta)
+execute in minecraft:overworld as B5-0-0-0-1 run function bs.vector:convert/basis_rot_3d/sincos with storage bs:ctx
+
+# X' = Z * sin(h) + X * cos(h)
+scoreboard players operation $vector.basis_rot_3d.0 bs.out = $vector.basis_rot_3d.pos.2 bs.in
+scoreboard players operation $vector.basis_rot_3d.0 bs.out *= #j bs.ctx
+scoreboard players operation #t bs.ctx = $vector.basis_rot_3d.pos.0 bs.in
+scoreboard players operation #t bs.ctx *= #i bs.ctx
+scoreboard players operation $vector.basis_rot_3d.0 bs.out += #t bs.ctx
+scoreboard players operation $vector.basis_rot_3d.0 bs.out /= 1000 bs.const
+
+# Y' = (z * cos(h) - x * sin(h)) * sin(v) + y * cos(v)
+scoreboard players operation $vector.basis_rot_3d.1 bs.out = $vector.basis_rot_3d.pos.2 bs.in
+scoreboard players operation $vector.basis_rot_3d.1 bs.out *= #i bs.ctx
+scoreboard players operation #t bs.ctx = $vector.basis_rot_3d.pos.0 bs.in
+scoreboard players operation #t bs.ctx *= #j bs.ctx
+scoreboard players operation $vector.basis_rot_3d.1 bs.out -= #t bs.ctx
+execute store result score $vector.basis_rot_3d.2 bs.out run scoreboard players operation $vector.basis_rot_3d.1 bs.out /= 1000 bs.const
+scoreboard players operation $vector.basis_rot_3d.1 bs.out *= #l bs.ctx
+scoreboard players operation #t bs.ctx = $vector.basis_rot_3d.pos.1 bs.in
+scoreboard players operation #t bs.ctx *= #k bs.ctx
+scoreboard players operation $vector.basis_rot_3d.1 bs.out += #t bs.ctx
+scoreboard players operation $vector.basis_rot_3d.1 bs.out /= 1000 bs.const
+
+# Z' = (z * cos(h) - x * sin(h)) * cos(v) - y * sin(v)
+scoreboard players operation $vector.basis_rot_3d.2 bs.out *= #k bs.ctx
+scoreboard players operation #t bs.ctx = $vector.basis_rot_3d.pos.1 bs.in
+scoreboard players operation #t bs.ctx *= #l bs.ctx
+scoreboard players operation $vector.basis_rot_3d.2 bs.out -= #t bs.ctx
+scoreboard players operation $vector.basis_rot_3d.2 bs.out /= 1000 bs.const
diff --git a/modules/bs.vector/data/bs.vector/function/convert/basis_rot_3d/sincos.mcfunction b/modules/bs.vector/data/bs.vector/function/convert/basis_rot_3d/sincos.mcfunction
new file mode 100644
index 0000000000..df29ce2bc6
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/convert/basis_rot_3d/sincos.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result entity @s Rotation[0] float $(y) run scoreboard players get $vector.basis_rot_3d.rot.0 bs.in
+execute at @s positioned 0.0 0.0 0.0 rotated ~ 0.0 run tp @s ^ ^ ^10.0
+execute store result score #i bs.ctx run data get entity @s Pos[2] 100
+execute store result score #j bs.ctx run data get entity @s Pos[0] -100
+$execute store result entity @s Rotation[0] float $(y) run scoreboard players get $vector.basis_rot_3d.rot.1 bs.in
+execute at @s positioned 0.0 0.0 0.0 rotated ~ 0.0 run tp @s ^ ^ ^10.0
+execute store result score #k bs.ctx run data get entity @s Pos[2] 100
+execute store result score #l bs.ctx run data get entity @s Pos[0] -100
+tp @s -30000000 0 1600
diff --git a/modules/bs.vector/data/bs.vector/function/convert/cartesian_to_spherical/cartesian_to_spherical.mcfunction b/modules/bs.vector/data/bs.vector/function/convert/cartesian_to_spherical/cartesian_to_spherical.mcfunction
new file mode 100644
index 0000000000..3e22da77c1
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/convert/cartesian_to_spherical/cartesian_to_spherical.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute in minecraft:overworld as B5-0-0-0-1 run function bs.vector:convert/cartesian_to_spherical/compute
+$execute store result score $vector.cartesian_to_spherical.0 bs.out run data get entity B5-0-0-0-1 Rotation[0] $(scaling)
+$execute store result score $vector.cartesian_to_spherical.1 bs.out run data get entity B5-0-0-0-1 Rotation[1] $(scaling)
+execute store result score $vector.cartesian_to_spherical.2 bs.out as B5-0-0-0-2 run function bs.vector:length/compute with storage bs:ctx
diff --git a/modules/bs.vector/data/bs.vector/function/convert/cartesian_to_spherical/compute.mcfunction b/modules/bs.vector/data/bs.vector/function/convert/cartesian_to_spherical/compute.mcfunction
new file mode 100644
index 0000000000..a8294d30e8
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/convert/cartesian_to_spherical/compute.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result entity @s Pos[0] double 0.001 store result storage bs:ctx x int 1 run scoreboard players get $vector.cartesian_to_spherical.0 bs.in
+execute store result entity @s Pos[1] double 0.001 store result storage bs:ctx y int 1 run scoreboard players get $vector.cartesian_to_spherical.1 bs.in
+execute store result entity @s Pos[2] double 0.001 store result storage bs:ctx z int 1 run scoreboard players get $vector.cartesian_to_spherical.2 bs.in
+execute positioned 0.0 0.0 0.0 facing entity @s feet run tp @s -30000000 0 1600 ~ ~
diff --git a/modules/bs.vector/data/bs.vector/function/convert/spherical_to_cartesian/compute.mcfunction b/modules/bs.vector/data/bs.vector/function/convert/spherical_to_cartesian/compute.mcfunction
new file mode 100644
index 0000000000..abdab01eec
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/convert/spherical_to_cartesian/compute.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result entity @s Rotation[0] float $(y) run scoreboard players get $vector.spherical_to_cartesian.0 bs.in
+$execute store result entity @s Rotation[1] float $(y) run scoreboard players get $vector.spherical_to_cartesian.1 bs.in
+$execute rotated as @s positioned 0.0 0.0 0.0 run tp @s ^ ^ ^$(x)
+data modify storage bs:ctx _ set from entity @s Pos
+tp @s -30000000 0 1600
diff --git a/modules/bs.vector/data/bs.vector/function/convert/spherical_to_cartesian/spherical_to_cartesian.mcfunction b/modules/bs.vector/data/bs.vector/function/convert/spherical_to_cartesian/spherical_to_cartesian.mcfunction
new file mode 100644
index 0000000000..801ad17a8a
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/convert/spherical_to_cartesian/spherical_to_cartesian.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$scoreboard players set #s bs.ctx $(scaling)
+scoreboard players set #t bs.ctx 1000000000
+execute store result storage bs:ctx y double .000000001 run scoreboard players operation #t bs.ctx /= #s bs.ctx
+execute store result storage bs:ctx x int 1 run scoreboard players get $vector.spherical_to_cartesian.2 bs.in
+execute in minecraft:overworld as B5-0-0-0-1 run function bs.vector:convert/spherical_to_cartesian/compute with storage bs:ctx
+execute store result score $vector.spherical_to_cartesian.0 bs.out run data get storage bs:ctx _[0]
+execute store result score $vector.spherical_to_cartesian.1 bs.out run data get storage bs:ctx _[1]
+execute store result score $vector.spherical_to_cartesian.2 bs.out run data get storage bs:ctx _[2]
diff --git a/modules/bs.vector/data/bs.vector/function/cross_product.mcfunction b/modules/bs.vector/data/bs.vector/function/cross_product.mcfunction
new file mode 100644
index 0000000000..5699f795a5
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/cross_product.mcfunction
@@ -0,0 +1,40 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$scoreboard players set #s bs.ctx $(scaling)
+
+# out.0 = u.1 * v.2 - u.2 * v.1
+scoreboard players operation $vector.cross_product.0 bs.out = $vector.cross_product.u.1 bs.in
+scoreboard players operation $vector.cross_product.0 bs.out *= $vector.cross_product.v.2 bs.in
+scoreboard players operation #t bs.ctx = $vector.cross_product.u.2 bs.in
+scoreboard players operation #t bs.ctx *= $vector.cross_product.v.1 bs.in
+scoreboard players operation $vector.cross_product.0 bs.out -= #t bs.ctx
+scoreboard players operation $vector.cross_product.0 bs.out /= #s bs.ctx
+
+# out.1 = u.2 * v.0 - u.0 * v.2
+scoreboard players operation $vector.cross_product.1 bs.out = $vector.cross_product.u.2 bs.in
+scoreboard players operation $vector.cross_product.1 bs.out *= $vector.cross_product.v.0 bs.in
+scoreboard players operation #t bs.ctx = $vector.cross_product.u.0 bs.in
+scoreboard players operation #t bs.ctx *= $vector.cross_product.v.2 bs.in
+scoreboard players operation $vector.cross_product.1 bs.out -= #t bs.ctx
+scoreboard players operation $vector.cross_product.1 bs.out /= #s bs.ctx
+
+# out.2 = u.0 * v.1 - u.1 * v.0
+scoreboard players operation $vector.cross_product.2 bs.out = $vector.cross_product.u.0 bs.in
+scoreboard players operation $vector.cross_product.2 bs.out *= $vector.cross_product.v.1 bs.in
+scoreboard players operation #t bs.ctx = $vector.cross_product.u.1 bs.in
+scoreboard players operation #t bs.ctx *= $vector.cross_product.v.0 bs.in
+scoreboard players operation $vector.cross_product.2 bs.out -= #t bs.ctx
+scoreboard players operation $vector.cross_product.2 bs.out /= #s bs.ctx
diff --git a/modules/bs.vector/data/bs.vector/function/dot_product.mcfunction b/modules/bs.vector/data/bs.vector/function/dot_product.mcfunction
new file mode 100644
index 0000000000..be16a69f82
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/dot_product.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$scoreboard players set #s bs.ctx $(scaling)
+
+scoreboard players operation $vector.dot_product bs.out = $vector.dot_product.u.0 bs.in
+scoreboard players operation $vector.dot_product bs.out *= $vector.dot_product.v.0 bs.in
+scoreboard players operation #t bs.ctx = $vector.dot_product.u.1 bs.in
+scoreboard players operation #t bs.ctx *= $vector.dot_product.v.1 bs.in
+scoreboard players operation $vector.dot_product bs.out += #t bs.ctx
+scoreboard players operation #t bs.ctx = $vector.dot_product.u.2 bs.in
+scoreboard players operation #t bs.ctx *= $vector.dot_product.v.2 bs.in
+scoreboard players operation $vector.dot_product bs.out += #t bs.ctx
+return run scoreboard players operation $vector.dot_product bs.out /= #s bs.ctx
diff --git a/modules/bs.vector/data/bs.vector/function/length/compute.mcfunction b/modules/bs.vector/data/bs.vector/function/length/compute.mcfunction
new file mode 100644
index 0000000000..b26e12cc13
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/length/compute.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Compute Euclidean distance: sqrt(x^2+y^2+z^2)
+# Thanks to Triton365 for sharing this trick on the Minecraft Commands discord
+$data modify entity @s transformation set value [$(x)f,0f,0f,0f,$(y)f,0f,0f,0f,$(z)f,0f,0f,0f,0f,0f,0f,1f]
+return run data get entity @s transformation.scale[0]
diff --git a/modules/bs.vector/data/bs.vector/function/length/length.mcfunction b/modules/bs.vector/data/bs.vector/function/length/length.mcfunction
new file mode 100644
index 0000000000..9229b87361
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/length/length.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result storage bs:ctx x int 1 run scoreboard players get $vector.length.0 bs.in
+execute store result storage bs:ctx y int 1 run scoreboard players get $vector.length.1 bs.in
+execute store result storage bs:ctx z int 1 run scoreboard players get $vector.length.2 bs.in
+
+execute store result score $vector.length bs.out as B5-0-0-0-2 run return run function bs.vector:length/compute with storage bs:ctx
diff --git a/modules/bs.vector/data/bs.vector/function/length_squared.mcfunction b/modules/bs.vector/data/bs.vector/function/length_squared.mcfunction
new file mode 100644
index 0000000000..29d06f4db2
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/length_squared.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$scoreboard players set #s bs.ctx $(scaling)
+
+scoreboard players operation $vector.length_squared bs.out = $vector.length_squared.0 bs.in
+scoreboard players operation $vector.length_squared bs.out *= $vector.length_squared.0 bs.in
+scoreboard players operation #t bs.ctx = $vector.length_squared.1 bs.in
+scoreboard players operation #t bs.ctx *= $vector.length_squared.1 bs.in
+scoreboard players operation $vector.length_squared bs.out += #t bs.ctx
+scoreboard players operation #t bs.ctx = $vector.length_squared.2 bs.in
+scoreboard players operation #t bs.ctx *= $vector.length_squared.2 bs.in
+scoreboard players operation $vector.length_squared bs.out += #t bs.ctx
+return run scoreboard players operation $vector.length_squared bs.out /= #s bs.ctx
diff --git a/modules/bs.vector/data/bs.vector/function/normalize/compute.mcfunction b/modules/bs.vector/data/bs.vector/function/normalize/compute.mcfunction
new file mode 100644
index 0000000000..7c659b2a38
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/normalize/compute.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result entity @s Pos[0] double 0.00000001 run scoreboard players get $vector.normalize.0 bs.in
+execute store result entity @s Pos[1] double 0.00000001 run scoreboard players get $vector.normalize.1 bs.in
+execute store result entity @s Pos[2] double 0.00000001 run scoreboard players get $vector.normalize.2 bs.in
+execute positioned 0.0 0.0 0.0 facing entity @s feet run tp @s ^ ^ ^1
+data modify storage bs:ctx _ set from entity @s Pos
+tp @s -30000000 0 1600 ~ ~
diff --git a/modules/bs.vector/data/bs.vector/function/normalize/normalize.mcfunction b/modules/bs.vector/data/bs.vector/function/normalize/normalize.mcfunction
new file mode 100644
index 0000000000..3209241501
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/normalize/normalize.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute in minecraft:overworld as B5-0-0-0-1 run function bs.vector:normalize/compute
+$execute store result score $vector.normalize.0 bs.out run data get storage bs:ctx _[0] $(scale)
+$execute store result score $vector.normalize.1 bs.out run data get storage bs:ctx _[1] $(scale)
+$execute store result score $vector.normalize.2 bs.out run data get storage bs:ctx _[2] $(scale)
diff --git a/modules/bs.vector/data/bs.vector/function/normalize_max_component.mcfunction b/modules/bs.vector/data/bs.vector/function/normalize_max_component.mcfunction
new file mode 100644
index 0000000000..d73e896b01
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/function/normalize_max_component.mcfunction
@@ -0,0 +1,35 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$scoreboard players set #s bs.ctx $(scale)
+
+scoreboard players operation $vector.normalize_max_component.factor bs.out = $vector.normalize_max_component.0 bs.in
+execute if predicate {"condition":"minecraft:inverted","term":{"condition":"minecraft:any_of","terms":[{"condition":"minecraft:value_check","value":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.normalize_max_component.1"},"score":"bs.in"},"range":{"min":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.normalize_max_component.factor"},"score":"bs.out","scale":-1},"max":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.normalize_max_component.factor"},"score":"bs.out"}}},{"condition":"minecraft:value_check","value":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.normalize_max_component.1"},"score":"bs.in"},"range":{"min":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.normalize_max_component.factor"},"score":"bs.out"},"max":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.normalize_max_component.factor"},"score":"bs.out","scale":-1}}}]}} \
+ run scoreboard players operation $vector.normalize_max_component.factor bs.out = $vector.normalize_max_component.1 bs.in
+execute if predicate {"condition":"minecraft:inverted","term":{"condition":"minecraft:any_of","terms":[{"condition":"minecraft:value_check","value":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.normalize_max_component.2"},"score":"bs.in"},"range":{"min":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.normalize_max_component.factor"},"score":"bs.out","scale":-1},"max":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.normalize_max_component.factor"},"score":"bs.out"}}},{"condition":"minecraft:value_check","value":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.normalize_max_component.2"},"score":"bs.in"},"range":{"min":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.normalize_max_component.factor"},"score":"bs.out"},"max":{"type":"minecraft:score","target":{"type":"minecraft:fixed","name":"$vector.normalize_max_component.factor"},"score":"bs.out","scale":-1}}}]}} \
+ run scoreboard players operation $vector.normalize_max_component.factor bs.out = $vector.normalize_max_component.2 bs.in
+execute if score $vector.normalize_max_component.factor bs.out matches ..-1 run scoreboard players operation $vector.normalize_max_component.factor bs.out *= -1 bs.const
+
+scoreboard players operation $vector.normalize_max_component.0 bs.out = $vector.normalize_max_component.0 bs.in
+scoreboard players operation $vector.normalize_max_component.1 bs.out = $vector.normalize_max_component.1 bs.in
+scoreboard players operation $vector.normalize_max_component.2 bs.out = $vector.normalize_max_component.2 bs.in
+
+scoreboard players operation $vector.normalize_max_component.0 bs.out *= #s bs.ctx
+scoreboard players operation $vector.normalize_max_component.1 bs.out *= #s bs.ctx
+scoreboard players operation $vector.normalize_max_component.2 bs.out *= #s bs.ctx
+
+scoreboard players operation $vector.normalize_max_component.0 bs.out /= $vector.normalize_max_component.factor bs.out
+scoreboard players operation $vector.normalize_max_component.1 bs.out /= $vector.normalize_max_component.factor bs.out
+scoreboard players operation $vector.normalize_max_component.2 bs.out /= $vector.normalize_max_component.factor bs.out
diff --git a/datapacks/Bookshelf/data/bs.vector/function/pos_from_vec.mcfunction b/modules/bs.vector/data/bs.vector/function/pos_from_vec.mcfunction
similarity index 87%
rename from datapacks/Bookshelf/data/bs.vector/function/pos_from_vec.mcfunction
rename to modules/bs.vector/data/bs.vector/function/pos_from_vec.mcfunction
index 475c3e9a71..c797eb91d2 100644
--- a/datapacks/Bookshelf/data/bs.vector/function/pos_from_vec.mcfunction
+++ b/modules/bs.vector/data/bs.vector/function/pos_from_vec.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers
# ------------------------------------------------------------------------------------------------------------
$scoreboard players operation @s bs.pos.x = $(name).0 $(objective)
diff --git a/datapacks/Bookshelf/data/bs.vector/function/rot_from_vec.mcfunction b/modules/bs.vector/data/bs.vector/function/rot_from_vec.mcfunction
similarity index 86%
rename from datapacks/Bookshelf/data/bs.vector/function/rot_from_vec.mcfunction
rename to modules/bs.vector/data/bs.vector/function/rot_from_vec.mcfunction
index 0ef901eae7..c976720f0a 100644
--- a/datapacks/Bookshelf/data/bs.vector/function/rot_from_vec.mcfunction
+++ b/modules/bs.vector/data/bs.vector/function/rot_from_vec.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers
# ------------------------------------------------------------------------------------------------------------
$scoreboard players operation @s bs.rot.h = $(name).0 $(objective)
diff --git a/datapacks/Bookshelf/data/bs.vector/function/vec_from_pos.mcfunction b/modules/bs.vector/data/bs.vector/function/vec_from_pos.mcfunction
similarity index 87%
rename from datapacks/Bookshelf/data/bs.vector/function/vec_from_pos.mcfunction
rename to modules/bs.vector/data/bs.vector/function/vec_from_pos.mcfunction
index 90539408da..c43f228f4d 100644
--- a/datapacks/Bookshelf/data/bs.vector/function/vec_from_pos.mcfunction
+++ b/modules/bs.vector/data/bs.vector/function/vec_from_pos.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers
# ------------------------------------------------------------------------------------------------------------
$scoreboard players operation $(name).0 $(objective) = @s bs.pos.x
diff --git a/datapacks/Bookshelf/data/bs.vector/function/vec_from_rot.mcfunction b/modules/bs.vector/data/bs.vector/function/vec_from_rot.mcfunction
similarity index 87%
rename from datapacks/Bookshelf/data/bs.vector/function/vec_from_rot.mcfunction
rename to modules/bs.vector/data/bs.vector/function/vec_from_rot.mcfunction
index 2168c3f9d6..7326494455 100644
--- a/datapacks/Bookshelf/data/bs.vector/function/vec_from_rot.mcfunction
+++ b/modules/bs.vector/data/bs.vector/function/vec_from_rot.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers
# ------------------------------------------------------------------------------------------------------------
$scoreboard players operation $(name).0 $(objective) = @s bs.rot.h
diff --git a/datapacks/Bookshelf/data/bs.vector/function/vec_from_vel.mcfunction b/modules/bs.vector/data/bs.vector/function/vec_from_vel.mcfunction
similarity index 87%
rename from datapacks/Bookshelf/data/bs.vector/function/vec_from_vel.mcfunction
rename to modules/bs.vector/data/bs.vector/function/vec_from_vel.mcfunction
index 1d5517b993..90bf5365aa 100644
--- a/datapacks/Bookshelf/data/bs.vector/function/vec_from_vel.mcfunction
+++ b/modules/bs.vector/data/bs.vector/function/vec_from_vel.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers
# ------------------------------------------------------------------------------------------------------------
$scoreboard players operation $(name).0 $(objective) = @s bs.vel.x
diff --git a/datapacks/Bookshelf/data/bs.vector/function/vel_from_vec.mcfunction b/modules/bs.vector/data/bs.vector/function/vel_from_vec.mcfunction
similarity index 87%
rename from datapacks/Bookshelf/data/bs.vector/function/vel_from_vec.mcfunction
rename to modules/bs.vector/data/bs.vector/function/vel_from_vec.mcfunction
index a08b8a0297..4c882f2c39 100644
--- a/datapacks/Bookshelf/data/bs.vector/function/vel_from_vec.mcfunction
+++ b/modules/bs.vector/data/bs.vector/function/vel_from_vec.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -11,8 +11,6 @@
# - Any modifications must be documented and disclosed under the same license
#
# For more details, refer to the MPL v2.0.
-#
-# Documentation of the feature: https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers
# ------------------------------------------------------------------------------------------------------------
$scoreboard players operation @s bs.vel.x = $(name).0 $(objective)
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/abs_max.json b/modules/bs.vector/data/bs.vector/tags/function/abs_max.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.vector/tags/function/abs_max.json
rename to modules/bs.vector/data/bs.vector/tags/function/abs_max.json
index a17dd3bc88..a99dad139a 100644
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/abs_max.json
+++ b/modules/bs.vector/data/bs.vector/tags/function/abs_max.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#absolute-max",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#absolute-max",
"authors": [
"Aksiome",
"Leirof"
diff --git a/modules/bs.vector/data/bs.vector/tags/function/abs_min.json b/modules/bs.vector/data/bs.vector/tags/function/abs_min.json
new file mode 100644
index 0000000000..b2b54b452a
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/tags/function/abs_min.json
@@ -0,0 +1,20 @@
+{
+ "__bookshelf__": {
+ "feature": true,
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#absolute-min",
+ "authors": [
+ "Aksiome"
+ ],
+ "created": {
+ "date": "2023/10/17",
+ "minecraft_version": "1.20.2"
+ },
+ "updated": {
+ "date": "2024/05/09",
+ "minecraft_version": "1.20.6"
+ }
+ },
+ "values": [
+ "bs.vector:abs_min"
+ ]
+}
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/basis_rot_3d.json b/modules/bs.vector/data/bs.vector/tags/function/basis_rot_3d.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.vector/tags/function/basis_rot_3d.json
rename to modules/bs.vector/data/bs.vector/tags/function/basis_rot_3d.json
index 801551c8bc..75dc27e740 100644
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/basis_rot_3d.json
+++ b/modules/bs.vector/data/bs.vector/tags/function/basis_rot_3d.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#basis-rotation-3d",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#basis-rotation-3d",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/cartesian_to_spherical.json b/modules/bs.vector/data/bs.vector/tags/function/cartesian_to_spherical.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.vector/tags/function/cartesian_to_spherical.json
rename to modules/bs.vector/data/bs.vector/tags/function/cartesian_to_spherical.json
index 6e995236af..5530522a8d 100644
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/cartesian_to_spherical.json
+++ b/modules/bs.vector/data/bs.vector/tags/function/cartesian_to_spherical.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#cartesian-to-spherical",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#cartesian-to-spherical",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/cross_product.json b/modules/bs.vector/data/bs.vector/tags/function/cross_product.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.vector/tags/function/cross_product.json
rename to modules/bs.vector/data/bs.vector/tags/function/cross_product.json
index 76ef9d6613..7c895160d5 100644
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/cross_product.json
+++ b/modules/bs.vector/data/bs.vector/tags/function/cross_product.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#cross-product",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#cross-product",
"authors": [
"Aksiome",
"Majoras16"
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/dot_product.json b/modules/bs.vector/data/bs.vector/tags/function/dot_product.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.vector/tags/function/dot_product.json
rename to modules/bs.vector/data/bs.vector/tags/function/dot_product.json
index 48686fcde1..63e2eca0e0 100644
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/dot_product.json
+++ b/modules/bs.vector/data/bs.vector/tags/function/dot_product.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#dot-product",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#dot-product",
"authors": [
"Aksiome",
"Majoras16"
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/length.json b/modules/bs.vector/data/bs.vector/tags/function/length.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.vector/tags/function/length.json
rename to modules/bs.vector/data/bs.vector/tags/function/length.json
index 68b1d9dd91..d7c1754eaa 100644
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/length.json
+++ b/modules/bs.vector/data/bs.vector/tags/function/length.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#length",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#length",
"authors": [
"Aksiome",
"Leirof",
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/length_squared.json b/modules/bs.vector/data/bs.vector/tags/function/length_squared.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.vector/tags/function/length_squared.json
rename to modules/bs.vector/data/bs.vector/tags/function/length_squared.json
index ac5732ea68..de3b9e1014 100644
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/length_squared.json
+++ b/modules/bs.vector/data/bs.vector/tags/function/length_squared.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#length",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#length",
"authors": [
"Aksiome",
"Leirof",
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/normalize.json b/modules/bs.vector/data/bs.vector/tags/function/normalize.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.vector/tags/function/normalize.json
rename to modules/bs.vector/data/bs.vector/tags/function/normalize.json
index 49f4cd4694..d8224e9654 100644
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/normalize.json
+++ b/modules/bs.vector/data/bs.vector/tags/function/normalize.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#normalize",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#normalize",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/normalize_max_component.json b/modules/bs.vector/data/bs.vector/tags/function/normalize_max_component.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.vector/tags/function/normalize_max_component.json
rename to modules/bs.vector/data/bs.vector/tags/function/normalize_max_component.json
index 0901ada31d..a861041da8 100644
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/normalize_max_component.json
+++ b/modules/bs.vector/data/bs.vector/tags/function/normalize_max_component.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#length",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#length",
"authors": [
"Aksiome",
"Leirof",
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/pos_from_vec.json b/modules/bs.vector/data/bs.vector/tags/function/pos_from_vec.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.vector/tags/function/pos_from_vec.json
rename to modules/bs.vector/data/bs.vector/tags/function/pos_from_vec.json
index 8faf254f66..a53b542056 100644
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/pos_from_vec.json
+++ b/modules/bs.vector/data/bs.vector/tags/function/pos_from_vec.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#helpers",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/rot_from_vec.json b/modules/bs.vector/data/bs.vector/tags/function/rot_from_vec.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.vector/tags/function/rot_from_vec.json
rename to modules/bs.vector/data/bs.vector/tags/function/rot_from_vec.json
index e58563b8c3..d7769d58bd 100644
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/rot_from_vec.json
+++ b/modules/bs.vector/data/bs.vector/tags/function/rot_from_vec.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#helpers",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/spherical_to_cartesian.json b/modules/bs.vector/data/bs.vector/tags/function/spherical_to_cartesian.json
similarity index 75%
rename from datapacks/Bookshelf/data/bs.vector/tags/function/spherical_to_cartesian.json
rename to modules/bs.vector/data/bs.vector/tags/function/spherical_to_cartesian.json
index 1a6491bb0c..43ac9dd836 100644
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/spherical_to_cartesian.json
+++ b/modules/bs.vector/data/bs.vector/tags/function/spherical_to_cartesian.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#spherical-to-cartesian",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#spherical-to-cartesian",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/vec_from_pos.json b/modules/bs.vector/data/bs.vector/tags/function/vec_from_pos.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.vector/tags/function/vec_from_pos.json
rename to modules/bs.vector/data/bs.vector/tags/function/vec_from_pos.json
index b8d6cdd1c0..3eb7c7c2db 100644
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/vec_from_pos.json
+++ b/modules/bs.vector/data/bs.vector/tags/function/vec_from_pos.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#helpers",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/vec_from_rot.json b/modules/bs.vector/data/bs.vector/tags/function/vec_from_rot.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.vector/tags/function/vec_from_rot.json
rename to modules/bs.vector/data/bs.vector/tags/function/vec_from_rot.json
index 7220091b03..a3197a64b0 100644
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/vec_from_rot.json
+++ b/modules/bs.vector/data/bs.vector/tags/function/vec_from_rot.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#helpers",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/vec_from_vel.json b/modules/bs.vector/data/bs.vector/tags/function/vec_from_vel.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.vector/tags/function/vec_from_vel.json
rename to modules/bs.vector/data/bs.vector/tags/function/vec_from_vel.json
index bcbc983df8..3b355f76a0 100644
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/vec_from_vel.json
+++ b/modules/bs.vector/data/bs.vector/tags/function/vec_from_vel.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#helpers",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.vector/tags/function/vel_from_vec.json b/modules/bs.vector/data/bs.vector/tags/function/vel_from_vec.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.vector/tags/function/vel_from_vec.json
rename to modules/bs.vector/data/bs.vector/tags/function/vel_from_vec.json
index a73208901e..eb3af2d28d 100644
--- a/datapacks/Bookshelf/data/bs.vector/tags/function/vel_from_vec.json
+++ b/modules/bs.vector/data/bs.vector/tags/function/vel_from_vec.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/vector.html#helpers",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html#helpers",
"authors": [
"Aksiome"
],
diff --git a/modules/bs.vector/data/bs.vector/test/abs_max.mcfunction b/modules/bs.vector/data/bs.vector/test/abs_max.mcfunction
new file mode 100644
index 0000000000..c01c6c0938
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/test/abs_max.mcfunction
@@ -0,0 +1,28 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# @batch bs.vector
+
+scoreboard players set $vector.abs_max.0 bs.in 52
+scoreboard players set $vector.abs_max.1 bs.in -48
+scoreboard players set $vector.abs_max.2 bs.in 12
+function #bs.vector:abs_max
+assert score $vector.abs_max bs.out matches 52
+
+scoreboard players set $vector.abs_max.0 bs.in -85
+scoreboard players set $vector.abs_max.1 bs.in 48
+scoreboard players set $vector.abs_max.2 bs.in 72
+function #bs.vector:abs_max
+assert score $vector.abs_max bs.out matches -85
diff --git a/modules/bs.vector/data/bs.vector/test/abs_min.mcfunction b/modules/bs.vector/data/bs.vector/test/abs_min.mcfunction
new file mode 100644
index 0000000000..2f1cb7dd67
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/test/abs_min.mcfunction
@@ -0,0 +1,28 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# @batch bs.vector
+
+scoreboard players set $vector.abs_min.0 bs.in 52
+scoreboard players set $vector.abs_min.1 bs.in -48
+scoreboard players set $vector.abs_min.2 bs.in -12
+function #bs.vector:abs_min
+assert score $vector.abs_min bs.out matches -12
+
+scoreboard players set $vector.abs_min.0 bs.in -85
+scoreboard players set $vector.abs_min.1 bs.in 48
+scoreboard players set $vector.abs_min.2 bs.in 72
+function #bs.vector:abs_min
+assert score $vector.abs_min bs.out matches 48
diff --git a/modules/bs.vector/data/bs.vector/test/basis_rot_3d.mcfunction b/modules/bs.vector/data/bs.vector/test/basis_rot_3d.mcfunction
new file mode 100644
index 0000000000..8f8febe7fc
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/test/basis_rot_3d.mcfunction
@@ -0,0 +1,30 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# @batch bs.vector
+
+await entity B5-0-0-0-1
+
+scoreboard players set $vector.basis_rot_3d.pos.0 bs.in 577
+scoreboard players set $vector.basis_rot_3d.pos.1 bs.in 577
+scoreboard players set $vector.basis_rot_3d.pos.2 bs.in 577
+scoreboard players set $vector.basis_rot_3d.rot.0 bs.in -45000
+scoreboard players set $vector.basis_rot_3d.rot.1 bs.in -35265
+
+function #bs.vector:basis_rot_3d {scaling:1000}
+
+assert score $vector.basis_rot_3d.0 bs.out matches -1..1
+assert score $vector.basis_rot_3d.1 bs.out matches -1..1
+assert score $vector.basis_rot_3d.2 bs.out matches 999..1001
diff --git a/modules/bs.vector/data/bs.vector/test/cartesian_to_spherical.mcfunction b/modules/bs.vector/data/bs.vector/test/cartesian_to_spherical.mcfunction
new file mode 100644
index 0000000000..8a886cbd11
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/test/cartesian_to_spherical.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# @batch bs.vector
+
+await entity B5-0-0-0-1
+await entity B5-0-0-0-2
+
+scoreboard players set $vector.cartesian_to_spherical.0 bs.in 577
+scoreboard players set $vector.cartesian_to_spherical.1 bs.in 577
+scoreboard players set $vector.cartesian_to_spherical.2 bs.in 577
+
+function #bs.vector:cartesian_to_spherical {scaling:1000}
+
+assert score $vector.cartesian_to_spherical.0 bs.out matches -45001..-44999
+assert score $vector.cartesian_to_spherical.1 bs.out matches -35266..-35264
+assert score $vector.cartesian_to_spherical.2 bs.out matches 999..1001
diff --git a/modules/bs.vector/data/bs.vector/test/cross_product.mcfunction b/modules/bs.vector/data/bs.vector/test/cross_product.mcfunction
new file mode 100644
index 0000000000..129e899c7c
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/test/cross_product.mcfunction
@@ -0,0 +1,30 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# @batch bs.vector
+
+scoreboard players set $vector.cross_product.u.0 bs.in 4
+scoreboard players set $vector.cross_product.u.1 bs.in 2
+scoreboard players set $vector.cross_product.u.2 bs.in 5
+
+scoreboard players set $vector.cross_product.v.0 bs.in 1
+scoreboard players set $vector.cross_product.v.1 bs.in 3
+scoreboard players set $vector.cross_product.v.2 bs.in 9
+
+function #bs.vector:cross_product {scaling:1}
+
+assert score $vector.cross_product.0 bs.out matches 3
+assert score $vector.cross_product.1 bs.out matches -31
+assert score $vector.cross_product.2 bs.out matches 10
diff --git a/modules/bs.vector/data/bs.vector/test/dot_product.mcfunction b/modules/bs.vector/data/bs.vector/test/dot_product.mcfunction
new file mode 100644
index 0000000000..65ca0dda32
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/test/dot_product.mcfunction
@@ -0,0 +1,28 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# @batch bs.vector
+
+scoreboard players set $vector.dot_product.u.0 bs.in 24
+scoreboard players set $vector.dot_product.u.1 bs.in 35
+scoreboard players set $vector.dot_product.u.2 bs.in 42
+
+scoreboard players set $vector.dot_product.v.0 bs.in 35
+scoreboard players set $vector.dot_product.v.1 bs.in 42
+scoreboard players set $vector.dot_product.v.2 bs.in 45
+
+function #bs.vector:dot_product {scaling:10}
+
+assert score $vector.dot_product bs.out matches 420
diff --git a/modules/bs.vector/data/bs.vector/test/length.mcfunction b/modules/bs.vector/data/bs.vector/test/length.mcfunction
new file mode 100644
index 0000000000..5807cf2d15
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/test/length.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# @batch bs.vector
+
+await entity B5-0-0-0-2
+
+scoreboard players set $vector.length.0 bs.in 37216
+scoreboard players set $vector.length.1 bs.in 3383
+scoreboard players set $vector.length.2 bs.in 19172
+
+function #bs.vector:length
+
+assert score $vector.length bs.out matches 42000
diff --git a/modules/bs.vector/data/bs.vector/test/length_squared.mcfunction b/modules/bs.vector/data/bs.vector/test/length_squared.mcfunction
new file mode 100644
index 0000000000..1eec6f1900
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/test/length_squared.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# @batch bs.vector
+
+scoreboard players set $vector.length_squared.0 bs.in 4000
+scoreboard players set $vector.length_squared.1 bs.in 5000
+scoreboard players set $vector.length_squared.2 bs.in 1000
+
+function #bs.vector:length_squared {scaling:1000}
+
+assert score $vector.length_squared bs.out matches 42000
diff --git a/modules/bs.vector/data/bs.vector/test/normalize.mcfunction b/modules/bs.vector/data/bs.vector/test/normalize.mcfunction
new file mode 100644
index 0000000000..365242cbf1
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/test/normalize.mcfunction
@@ -0,0 +1,28 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# @batch bs.vector
+
+await entity B5-0-0-0-1
+
+scoreboard players set $vector.normalize.0 bs.in 37216
+scoreboard players set $vector.normalize.1 bs.in 3383
+scoreboard players set $vector.normalize.2 bs.in 19172
+
+function #bs.vector:normalize {scale:1000}
+
+assert score $vector.normalize.0 bs.out matches 885..887
+assert score $vector.normalize.1 bs.out matches 79..81
+assert score $vector.normalize.2 bs.out matches 455..457
diff --git a/modules/bs.vector/data/bs.vector/test/normalize_max_component.mcfunction b/modules/bs.vector/data/bs.vector/test/normalize_max_component.mcfunction
new file mode 100644
index 0000000000..60d172f822
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/test/normalize_max_component.mcfunction
@@ -0,0 +1,26 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# @batch bs.vector
+
+scoreboard players set $vector.normalize_max_component.0 bs.in 37216
+scoreboard players set $vector.normalize_max_component.1 bs.in 3383
+scoreboard players set $vector.normalize_max_component.2 bs.in 19172
+
+function #bs.vector:normalize_max_component {scale:1000}
+
+assert score $vector.normalize_max_component.0 bs.out matches 1000
+assert score $vector.normalize_max_component.1 bs.out matches 89..91
+assert score $vector.normalize_max_component.2 bs.out matches 514..516
diff --git a/modules/bs.vector/data/bs.vector/test/spherical_to_cartesian.mcfunction b/modules/bs.vector/data/bs.vector/test/spherical_to_cartesian.mcfunction
new file mode 100644
index 0000000000..ea2f76d822
--- /dev/null
+++ b/modules/bs.vector/data/bs.vector/test/spherical_to_cartesian.mcfunction
@@ -0,0 +1,28 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# @batch bs.vector
+
+await entity B5-0-0-0-1
+
+scoreboard players set $vector.spherical_to_cartesian.0 bs.in 15250
+scoreboard players set $vector.spherical_to_cartesian.1 bs.in 42000
+scoreboard players set $vector.spherical_to_cartesian.2 bs.in 8525
+
+function #bs.vector:spherical_to_cartesian {scaling:1000}
+
+assert score $vector.spherical_to_cartesian.0 bs.out matches -1667..-1665
+assert score $vector.spherical_to_cartesian.1 bs.out matches -5704..-5702
+assert score $vector.spherical_to_cartesian.2 bs.out matches 6111..6113
diff --git a/modules/bs.vector/module.json b/modules/bs.vector/module.json
new file mode 100644
index 0000000000..96187b48a1
--- /dev/null
+++ b/modules/bs.vector/module.json
@@ -0,0 +1,14 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.vector",
+ "load": "."
+ },
+ "meta": {
+ "name": "Vector",
+ "slug": "bookshelf-vector",
+ "description": "Vectors are fundamental and incredibly powerful tools to manage motions, forces and… well… do physics!",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/vector.html",
+ "tags": ["default"]
+ }
+}
diff --git a/modules/bs.view/README.md b/modules/bs.view/README.md
new file mode 100644
index 0000000000..7fdf61712c
--- /dev/null
+++ b/modules/bs.view/README.md
@@ -0,0 +1,14 @@
+# 👀 Bookshelf View
+
+This datapack provides tools to execute commands based on what an entity sees.
+
+> “Vision is the act of seeing things as they could be, not as they are.”
+>
+> -- Gretchen Rubin
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/view.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.view/data/bs.view/function/__load__.mcfunction b/modules/bs.view/data/bs.view/function/__load__.mcfunction
new file mode 100644
index 0000000000..03c6be7076
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/__load__.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+forceload add -30000000 1600
+execute unless entity B5-0-0-0-1 run summon minecraft:marker -30000000 0 1600 {UUID:[I;181,0,0,1],Tags:["bs.entity","bs.persistent","smithed.entity","smithed.strict"]}
+
+scoreboard objectives add bs.data dummy [{"text":"BS ","color":"dark_gray"},{"text":"Data","color":"aqua"}]
+
+execute unless data storage bs:in view.can_see_ata run data modify storage bs:in view.can_see_ata set value { \
+ ignored_blocks: "#bs.view:can_see_through", \
+}
+
+execute unless data storage bs:in view.in_view_ata run data modify storage bs:in view.in_view_ata set value { \
+ angle: 120.0, \
+}
diff --git a/modules/bs.view/data/bs.view/function/__unload__.mcfunction b/modules/bs.view/data/bs.view/function/__unload__.mcfunction
new file mode 100644
index 0000000000..88458c2baf
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/__unload__.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+kill B5-0-0-0-1
+forceload remove -30000000 1600
+
+scoreboard objectives remove bs.data
+
+data remove storage bs:in view
+data remove storage bs:data view
diff --git a/modules/bs.view/data/bs.view/function/aimed_block/at_aimed_block.mcfunction b/modules/bs.view/data/bs.view/function/aimed_block/at_aimed_block.mcfunction
new file mode 100644
index 0000000000..90ff172bd4
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/aimed_block/at_aimed_block.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# run the raycast at the entity eyes
+tag @s add bs.view.this
+$data modify storage bs:data raycast.on_targeted_block set value 'execute as @n[tag=bs.view.this,sort=arbitrary] run $(run)'
+execute at @s anchored eyes positioned ^ ^ ^ run function bs.raycast:run
+tag @s remove bs.view.this
diff --git a/modules/bs.view/data/bs.view/function/aimed_block/with.mcfunction b/modules/bs.view/data/bs.view/function/aimed_block/with.mcfunction
new file mode 100644
index 0000000000..cedbccfe48
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/aimed_block/with.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data raycast set value { \
+ blocks: true, \
+ entities: false, \
+ max_distance: 16.0, \
+ ignored_blocks: "#bs.hitbox:intangible", \
+ ignored_entities: "#bs.hitbox:intangible", \
+}
+$data modify storage bs:data raycast merge value $(with)
diff --git a/modules/bs.view/data/bs.view/function/aimed_entity/as_aimed_entity.mcfunction b/modules/bs.view/data/bs.view/function/aimed_entity/as_aimed_entity.mcfunction
new file mode 100644
index 0000000000..52416b55cc
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/aimed_entity/as_aimed_entity.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# run the raycast at the entity eyes
+tag @s add bs.view.this
+$data modify storage bs:data raycast.on_targeted_entity set value 'execute at @n[tag=bs.view.this,sort=arbitrary] run $(run)'
+execute at @s anchored eyes positioned ^ ^ ^ run function bs.raycast:run
+tag @s remove bs.view.this
diff --git a/modules/bs.view/data/bs.view/function/aimed_entity/at_aimed_entity.mcfunction b/modules/bs.view/data/bs.view/function/aimed_entity/at_aimed_entity.mcfunction
new file mode 100644
index 0000000000..8cd72d75f3
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/aimed_entity/at_aimed_entity.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# run the raycast at the entity eyes
+tag @s add bs.view.this
+$data modify storage bs:data raycast.on_targeted_entity set value 'execute as @n[tag=bs.view.this,sort=arbitrary] run $(run)'
+execute at @s anchored eyes positioned ^ ^ ^ run function bs.raycast:run
+tag @s remove bs.view.this
diff --git a/modules/bs.view/data/bs.view/function/aimed_entity/with.mcfunction b/modules/bs.view/data/bs.view/function/aimed_entity/with.mcfunction
new file mode 100644
index 0000000000..4ce584eec8
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/aimed_entity/with.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data raycast set value { \
+ blocks: true, \
+ entities: true, \
+ max_distance: 16.0, \
+ ignored_blocks: "#bs.hitbox:intangible", \
+ ignored_entities: "#bs.hitbox:intangible", \
+}
+$data modify storage bs:data raycast merge value $(with)
diff --git a/modules/bs.view/data/bs.view/function/aimed_point/at_aimed_point.mcfunction b/modules/bs.view/data/bs.view/function/aimed_point/at_aimed_point.mcfunction
new file mode 100644
index 0000000000..3013131d21
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/aimed_point/at_aimed_point.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# run the raycast at the entity eyes
+tag @s add bs.view.this
+$data modify storage bs:data raycast.on_hit_point set value 'execute as @n[tag=bs.view.this,sort=arbitrary] run $(run)'
+execute at @s anchored eyes positioned ^ ^ ^ run function bs.raycast:run
+tag @s remove bs.view.this
diff --git a/modules/bs.view/data/bs.view/function/aimed_point/with.mcfunction b/modules/bs.view/data/bs.view/function/aimed_point/with.mcfunction
new file mode 100644
index 0000000000..4ce584eec8
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/aimed_point/with.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data raycast set value { \
+ blocks: true, \
+ entities: true, \
+ max_distance: 16.0, \
+ ignored_blocks: "#bs.hitbox:intangible", \
+ ignored_entities: "#bs.hitbox:intangible", \
+}
+$data modify storage bs:data raycast merge value $(with)
diff --git a/modules/bs.view/data/bs.view/function/block_placement/at_block_placement.mcfunction b/modules/bs.view/data/bs.view/function/block_placement/at_block_placement.mcfunction
new file mode 100644
index 0000000000..d2b5b97549
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/block_placement/at_block_placement.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# run the raycast at the entity eyes
+tag @s add bs.view.this
+$data modify storage bs:data raycast.on_targeted_block set value 'function bs.view:block_placement/compute {run:\'$(run)\'}'
+execute at @s anchored eyes positioned ^ ^ ^ run function bs.raycast:run
+tag @s remove bs.view.this
diff --git a/modules/bs.view/data/bs.view/function/block_placement/compute.mcfunction b/modules/bs.view/data/bs.view/function/block_placement/compute.mcfunction
new file mode 100644
index 0000000000..c78f321a5d
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/block_placement/compute.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result storage bs:ctx x int 1 run data get storage bs:out raycast.hit_normal[0]
+execute store result storage bs:ctx y int 1 run data get storage bs:out raycast.hit_normal[1]
+execute store result storage bs:ctx z int 1 run data get storage bs:out raycast.hit_normal[2]
+
+function bs.view:block_placement/displace with storage bs:ctx
+$execute at @s as @n[tag=bs.view.this,sort=arbitrary] run $(run)
diff --git a/datapacks/Bookshelf/data/bs.view/function/block_placement/displace.mcfunction b/modules/bs.view/data/bs.view/function/block_placement/displace.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.view/function/block_placement/displace.mcfunction
rename to modules/bs.view/data/bs.view/function/block_placement/displace.mcfunction
index 6409a1e85e..86275991e9 100644
--- a/datapacks/Bookshelf/data/bs.view/function/block_placement/displace.mcfunction
+++ b/modules/bs.view/data/bs.view/function/block_placement/displace.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.view/data/bs.view/function/block_placement/with.mcfunction b/modules/bs.view/data/bs.view/function/block_placement/with.mcfunction
new file mode 100644
index 0000000000..cedbccfe48
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/block_placement/with.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data raycast set value { \
+ blocks: true, \
+ entities: false, \
+ max_distance: 16.0, \
+ ignored_blocks: "#bs.hitbox:intangible", \
+ ignored_entities: "#bs.hitbox:intangible", \
+}
+$data modify storage bs:data raycast merge value $(with)
diff --git a/modules/bs.view/data/bs.view/function/can_see_ata/can_see_ata.mcfunction b/modules/bs.view/data/bs.view/function/can_see_ata/can_see_ata.mcfunction
new file mode 100644
index 0000000000..5d64614065
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/can_see_ata/can_see_ata.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:ctx _ set from entity @s Pos
+data modify storage bs:ctx x set from storage bs:ctx _[0]
+data modify storage bs:ctx y set from storage bs:ctx _[1]
+data modify storage bs:ctx z set from storage bs:ctx _[2]
+execute summon minecraft:marker run function bs.view:can_see_ata/max_distance/get_rpos with storage bs:ctx
+function bs.view:can_see_ata/max_distance/compute with storage bs:ctx
+
+execute facing entity @s eyes run function bs.raycast:run
+return run execute if score #raycast.distance bs.data matches 2147483647
diff --git a/modules/bs.view/data/bs.view/function/can_see_ata/max_distance/compute.mcfunction b/modules/bs.view/data/bs.view/function/can_see_ata/max_distance/compute.mcfunction
new file mode 100644
index 0000000000..24d843b9b9
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/can_see_ata/max_distance/compute.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# Compute Euclidean distance: sqrt(x^2+y^2+z^2)
+# Thanks to Triton365 for sharing this trick on the Minecraft Commands discord
+$data modify entity @s transformation set value [$(x)f,0f,0f,0f,$(y)f,0f,0f,0f,$(z)f,0f,0f,0f,0f,0f,0f,1f]
+data modify storage bs:data raycast.max_distance set from entity @s transformation.scale[0]
diff --git a/datapacks/Bookshelf/data/bs.view/function/can_see_ata/max_distance/get_rpos.mcfunction b/modules/bs.view/data/bs.view/function/can_see_ata/max_distance/get_rpos.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.view/function/can_see_ata/max_distance/get_rpos.mcfunction
rename to modules/bs.view/data/bs.view/function/can_see_ata/max_distance/get_rpos.mcfunction
index 6fd1dc47ad..58fdec7e7a 100644
--- a/datapacks/Bookshelf/data/bs.view/function/can_see_ata/max_distance/get_rpos.mcfunction
+++ b/modules/bs.view/data/bs.view/function/can_see_ata/max_distance/get_rpos.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.view/data/bs.view/function/can_see_ata/with.mcfunction b/modules/bs.view/data/bs.view/function/can_see_ata/with.mcfunction
new file mode 100644
index 0000000000..e97c3fed85
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/can_see_ata/with.mcfunction
@@ -0,0 +1,22 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+data modify storage bs:data raycast set value { \
+ blocks: true, \
+ entities: false, \
+ ignored_blocks: "#bs.view:can_see_through", \
+ ignored_entities: "#bs.hitbox:intangible", \
+}
+$data modify storage bs:data raycast merge value $(with)
diff --git a/datapacks/Bookshelf/data/bs.view/function/in_view_ata/angle.mcfunction b/modules/bs.view/data/bs.view/function/in_view_ata/angle.mcfunction
similarity index 97%
rename from datapacks/Bookshelf/data/bs.view/function/in_view_ata/angle.mcfunction
rename to modules/bs.view/data/bs.view/function/in_view_ata/angle.mcfunction
index 2a8ffcb1b0..6ff1ecb3cf 100644
--- a/datapacks/Bookshelf/data/bs.view/function/in_view_ata/angle.mcfunction
+++ b/modules/bs.view/data/bs.view/function/in_view_ata/angle.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/modules/bs.view/data/bs.view/function/in_view_ata/check.mcfunction b/modules/bs.view/data/bs.view/function/in_view_ata/check.mcfunction
new file mode 100644
index 0000000000..39b0fef40f
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/in_view_ata/check.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$return run execute if entity @s[distance=..$(x)]
diff --git a/modules/bs.view/data/bs.view/function/in_view_ata/in_view_ata.mcfunction b/modules/bs.view/data/bs.view/function/in_view_ata/in_view_ata.mcfunction
new file mode 100644
index 0000000000..5ed2258aef
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/in_view_ata/in_view_ata.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$data modify storage bs:ctx _ set value $(angle)
+execute in minecraft:overworld as B5-0-0-0-1 run function bs.view:in_view_ata/angle
+execute facing entity @s eyes positioned as @s positioned ^ ^ ^1 rotated as @s positioned ^ ^ ^1 run \
+ return run function bs.view:in_view_ata/check with storage bs:ctx
diff --git a/modules/bs.view/data/bs.view/function/looked_entity/as_looked_entity.mcfunction b/modules/bs.view/data/bs.view/function/looked_entity/as_looked_entity.mcfunction
new file mode 100644
index 0000000000..2adbe54523
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/looked_entity/as_looked_entity.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute unless predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.is_lookable\"]}"}}}} run return fail
+execute if entity @n[tag=bs.view.is_lookable,tag=!bs.view.bi,sort=arbitrary] run function bs.view:looked_entity/setup
+tag @n[tag=bs.view.is_lookable,sort=arbitrary,limit=255] add bs.view.selected
+execute if score #view.looked_entity bs.data matches 1.. if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.b0\"]}"}}}} run tag @n[tag=bs.view.selected,tag=!bs.view.b0,sort=arbitrary,limit=255] remove bs.view.selected
+execute if score #view.looked_entity bs.data matches 2.. if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.b1\"]}"}}}} run tag @n[tag=bs.view.selected,tag=!bs.view.b1,sort=arbitrary,limit=255] remove bs.view.selected
+execute if score #view.looked_entity bs.data matches 4.. if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.b2\"]}"}}}} run tag @n[tag=bs.view.selected,tag=!bs.view.b2,sort=arbitrary,limit=255] remove bs.view.selected
+execute if score #view.looked_entity bs.data matches 8.. if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.b3\"]}"}}}} run tag @n[tag=bs.view.selected,tag=!bs.view.b3,sort=arbitrary,limit=255] remove bs.view.selected
+execute if score #view.looked_entity bs.data matches 16.. if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.b4\"]}"}}}} run tag @n[tag=bs.view.selected,tag=!bs.view.b4,sort=arbitrary,limit=255] remove bs.view.selected
+execute if score #view.looked_entity bs.data matches 32.. if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.b5\"]}"}}}} run tag @n[tag=bs.view.selected,tag=!bs.view.b5,sort=arbitrary,limit=255] remove bs.view.selected
+execute if score #view.looked_entity bs.data matches 64.. if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.b6\"]}"}}}} run tag @n[tag=bs.view.selected,tag=!bs.view.b6,sort=arbitrary,limit=255] remove bs.view.selected
+execute if score #view.looked_entity bs.data matches 128.. if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.b7\"]}"}}}} run tag @n[tag=bs.view.selected,tag=!bs.view.b7,sort=arbitrary,limit=255] remove bs.view.selected
+$execute as @n[tag=bs.view.is_lookable,tag=bs.view.selected,sort=arbitrary] run return run $(run)
diff --git a/modules/bs.view/data/bs.view/function/looked_entity/at_looked_entity.mcfunction b/modules/bs.view/data/bs.view/function/looked_entity/at_looked_entity.mcfunction
new file mode 100644
index 0000000000..e125cbe7f2
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/looked_entity/at_looked_entity.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute unless predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.is_lookable\"]}"}}}} run return fail
+execute if entity @n[tag=bs.view.is_lookable,tag=!bs.view.bi,sort=arbitrary] run function bs.view:looked_entity/setup
+tag @n[tag=bs.view.is_lookable,sort=arbitrary,limit=255] add bs.view.selected
+execute if score #view.looked_entity bs.data matches 1.. if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.b0\"]}"}}}} run tag @n[tag=bs.view.selected,tag=!bs.view.b0,sort=arbitrary,limit=255] remove bs.view.selected
+execute if score #view.looked_entity bs.data matches 2.. if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.b1\"]}"}}}} run tag @n[tag=bs.view.selected,tag=!bs.view.b1,sort=arbitrary,limit=255] remove bs.view.selected
+execute if score #view.looked_entity bs.data matches 4.. if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.b2\"]}"}}}} run tag @n[tag=bs.view.selected,tag=!bs.view.b2,sort=arbitrary,limit=255] remove bs.view.selected
+execute if score #view.looked_entity bs.data matches 8.. if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.b3\"]}"}}}} run tag @n[tag=bs.view.selected,tag=!bs.view.b3,sort=arbitrary,limit=255] remove bs.view.selected
+execute if score #view.looked_entity bs.data matches 16.. if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.b4\"]}"}}}} run tag @n[tag=bs.view.selected,tag=!bs.view.b4,sort=arbitrary,limit=255] remove bs.view.selected
+execute if score #view.looked_entity bs.data matches 32.. if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.b5\"]}"}}}} run tag @n[tag=bs.view.selected,tag=!bs.view.b5,sort=arbitrary,limit=255] remove bs.view.selected
+execute if score #view.looked_entity bs.data matches 64.. if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.b6\"]}"}}}} run tag @n[tag=bs.view.selected,tag=!bs.view.b6,sort=arbitrary,limit=255] remove bs.view.selected
+execute if score #view.looked_entity bs.data matches 128.. if predicate {"condition":"minecraft:entity_properties","entity":"this","predicate":{"type_specific":{"type":"player","looking_at":{"nbt":"{Tags:[\"bs.view.b7\"]}"}}}} run tag @n[tag=bs.view.selected,tag=!bs.view.b7,sort=arbitrary,limit=255] remove bs.view.selected
+$execute at @n[tag=bs.view.is_lookable,tag=bs.view.selected,sort=arbitrary] run return run $(run)
diff --git a/modules/bs.view/data/bs.view/function/looked_entity/setup.mcfunction b/modules/bs.view/data/bs.view/function/looked_entity/setup.mcfunction
new file mode 100644
index 0000000000..3795899c85
--- /dev/null
+++ b/modules/bs.view/data/bs.view/function/looked_entity/setup.mcfunction
@@ -0,0 +1,45 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+tag @n[tag=bs.view.b0,sort=arbitrary,limit=255] remove bs.view.b0
+tag @n[tag=bs.view.b1,sort=arbitrary,limit=255] remove bs.view.b1
+tag @n[tag=bs.view.b2,sort=arbitrary,limit=255] remove bs.view.b2
+tag @n[tag=bs.view.b3,sort=arbitrary,limit=255] remove bs.view.b3
+tag @n[tag=bs.view.b4,sort=arbitrary,limit=255] remove bs.view.b4
+tag @n[tag=bs.view.b5,sort=arbitrary,limit=255] remove bs.view.b5
+tag @n[tag=bs.view.b6,sort=arbitrary,limit=255] remove bs.view.b6
+tag @n[tag=bs.view.b7,sort=arbitrary,limit=255] remove bs.view.b7
+tag @n[tag=bs.view.bi,sort=arbitrary,limit=255] remove bs.view.bi
+
+scoreboard players set #view.looked_entity bs.data 0
+execute as @n[tag=bs.view.is_lookable,sort=arbitrary,limit=255] store result score @s bs.data run scoreboard players add #view.looked_entity bs.data 1
+
+tag @n[tag=bs.view.is_lookable,scores={bs.data=128..},sort=arbitrary,limit=255] add bs.view.b7
+scoreboard players remove @n[tag=bs.view.is_lookable,scores={bs.data=128..},sort=arbitrary,limit=255] bs.data 128
+tag @n[tag=bs.view.is_lookable,scores={bs.data=64..},sort=arbitrary,limit=255] add bs.view.b6
+scoreboard players remove @n[tag=bs.view.is_lookable,scores={bs.data=64..},sort=arbitrary,limit=255] bs.data 64
+tag @n[tag=bs.view.is_lookable,scores={bs.data=32..},sort=arbitrary,limit=255] add bs.view.b5
+scoreboard players remove @n[tag=bs.view.is_lookable,scores={bs.data=32..},sort=arbitrary,limit=255] bs.data 32
+tag @n[tag=bs.view.is_lookable,scores={bs.data=16..},sort=arbitrary,limit=255] add bs.view.b4
+scoreboard players remove @n[tag=bs.view.is_lookable,scores={bs.data=16..},sort=arbitrary,limit=255] bs.data 16
+tag @n[tag=bs.view.is_lookable,scores={bs.data=8..},sort=arbitrary,limit=255] add bs.view.b3
+scoreboard players remove @n[tag=bs.view.is_lookable,scores={bs.data=8..},sort=arbitrary,limit=255] bs.data 8
+tag @n[tag=bs.view.is_lookable,scores={bs.data=4..},sort=arbitrary,limit=255] add bs.view.b2
+scoreboard players remove @n[tag=bs.view.is_lookable,scores={bs.data=4..},sort=arbitrary,limit=255] bs.data 4
+tag @n[tag=bs.view.is_lookable,scores={bs.data=2..},sort=arbitrary,limit=255] add bs.view.b1
+scoreboard players remove @n[tag=bs.view.is_lookable,scores={bs.data=2..},sort=arbitrary,limit=255] bs.data 2
+tag @n[tag=bs.view.is_lookable,scores={bs.data=1..},sort=arbitrary,limit=255] add bs.view.b0
+scoreboard players reset @n[tag=bs.view.is_lookable,sort=arbitrary,limit=255] bs.data
+tag @n[tag=bs.view.is_lookable,sort=arbitrary,limit=255] add bs.view.bi
diff --git a/datapacks/Bookshelf/data/bs.view/tags/block/can_see_through.json b/modules/bs.view/data/bs.view/tags/block/can_see_through.json
similarity index 100%
rename from datapacks/Bookshelf/data/bs.view/tags/block/can_see_through.json
rename to modules/bs.view/data/bs.view/tags/block/can_see_through.json
diff --git a/datapacks/Bookshelf/data/bs.view/tags/function/as_aimed_entity.json b/modules/bs.view/data/bs.view/tags/function/as_aimed_entity.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.view/tags/function/as_aimed_entity.json
rename to modules/bs.view/data/bs.view/tags/function/as_aimed_entity.json
index e9cb51bc17..d9ead66b2a 100644
--- a/datapacks/Bookshelf/data/bs.view/tags/function/as_aimed_entity.json
+++ b/modules/bs.view/data/bs.view/tags/function/as_aimed_entity.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#aimed-entity",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#aimed-entity",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.view/tags/function/as_looked_entity.json b/modules/bs.view/data/bs.view/tags/function/as_looked_entity.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.view/tags/function/as_looked_entity.json
rename to modules/bs.view/data/bs.view/tags/function/as_looked_entity.json
index 0bc5594940..5f0e56f8ef 100644
--- a/datapacks/Bookshelf/data/bs.view/tags/function/as_looked_entity.json
+++ b/modules/bs.view/data/bs.view/tags/function/as_looked_entity.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#looked-entity",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#looked-entity",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.view/tags/function/at_aimed_block.json b/modules/bs.view/data/bs.view/tags/function/at_aimed_block.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.view/tags/function/at_aimed_block.json
rename to modules/bs.view/data/bs.view/tags/function/at_aimed_block.json
index 65a4e57eae..ba0e526b6b 100644
--- a/datapacks/Bookshelf/data/bs.view/tags/function/at_aimed_block.json
+++ b/modules/bs.view/data/bs.view/tags/function/at_aimed_block.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#aimed-block",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#aimed-block",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.view/tags/function/at_aimed_entity.json b/modules/bs.view/data/bs.view/tags/function/at_aimed_entity.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.view/tags/function/at_aimed_entity.json
rename to modules/bs.view/data/bs.view/tags/function/at_aimed_entity.json
index e622183dad..928782219f 100644
--- a/datapacks/Bookshelf/data/bs.view/tags/function/at_aimed_entity.json
+++ b/modules/bs.view/data/bs.view/tags/function/at_aimed_entity.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#aimed-entity",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#aimed-entity",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.view/tags/function/at_aimed_point.json b/modules/bs.view/data/bs.view/tags/function/at_aimed_point.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.view/tags/function/at_aimed_point.json
rename to modules/bs.view/data/bs.view/tags/function/at_aimed_point.json
index f5c9ff4f00..3f0a0a0c82 100644
--- a/datapacks/Bookshelf/data/bs.view/tags/function/at_aimed_point.json
+++ b/modules/bs.view/data/bs.view/tags/function/at_aimed_point.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#aimed-point",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#aimed-point",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.view/tags/function/at_block_placement.json b/modules/bs.view/data/bs.view/tags/function/at_block_placement.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.view/tags/function/at_block_placement.json
rename to modules/bs.view/data/bs.view/tags/function/at_block_placement.json
index 0009fd6e1f..dd3ec39781 100644
--- a/datapacks/Bookshelf/data/bs.view/tags/function/at_block_placement.json
+++ b/modules/bs.view/data/bs.view/tags/function/at_block_placement.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#block-placement",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#block-placement",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.view/tags/function/at_looked_entity.json b/modules/bs.view/data/bs.view/tags/function/at_looked_entity.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.view/tags/function/at_looked_entity.json
rename to modules/bs.view/data/bs.view/tags/function/at_looked_entity.json
index 33624b87df..76b196a486 100644
--- a/datapacks/Bookshelf/data/bs.view/tags/function/at_looked_entity.json
+++ b/modules/bs.view/data/bs.view/tags/function/at_looked_entity.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#looked-entity",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#looked-entity",
"authors": [
"Aksiome"
],
diff --git a/datapacks/Bookshelf/data/bs.view/tags/function/can_see_ata.json b/modules/bs.view/data/bs.view/tags/function/can_see_ata.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.view/tags/function/can_see_ata.json
rename to modules/bs.view/data/bs.view/tags/function/can_see_ata.json
index 1b2a5b1c24..d9fa8aa2e8 100644
--- a/datapacks/Bookshelf/data/bs.view/tags/function/can_see_ata.json
+++ b/modules/bs.view/data/bs.view/tags/function/can_see_ata.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#can-see-as-to-at",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#can-see-as-to-at",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.view/tags/function/in_view_ata.json b/modules/bs.view/data/bs.view/tags/function/in_view_ata.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.view/tags/function/in_view_ata.json
rename to modules/bs.view/data/bs.view/tags/function/in_view_ata.json
index 49b7b8ba40..cb73711a1f 100644
--- a/datapacks/Bookshelf/data/bs.view/tags/function/in_view_ata.json
+++ b/modules/bs.view/data/bs.view/tags/function/in_view_ata.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/view.html#in-view-as-to-at",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html#in-view-as-to-at",
"authors": [
"Aksiome",
"Leirof"
diff --git a/modules/bs.view/data/bs.view/test/as_aimed_entity.mcfunction b/modules/bs.view/data/bs.view/test/as_aimed_entity.mcfunction
new file mode 100644
index 0000000000..7e900659ea
--- /dev/null
+++ b/modules/bs.view/data/bs.view/test/as_aimed_entity.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
+summon minecraft:armor_stand ~.5 ~ ~1.5 {Tags:["bs.raycast.is_solid"],NoGravity:1b}
+function #bs.view:as_aimed_entity {run:"tag @s add bs.found",with:{}}
+assert entity @e[type=minecraft:armor_stand,tag=bs.found] inside
diff --git a/modules/bs.view/data/bs.view/test/as_looked_entity.mcfunction b/modules/bs.view/data/bs.view/test/as_looked_entity.mcfunction
new file mode 100644
index 0000000000..95550eccd7
--- /dev/null
+++ b/modules/bs.view/data/bs.view/test/as_looked_entity.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
+summon minecraft:armor_stand ~.5 ~ ~1.5 {Tags:["bs.view.is_lookable"],NoGravity:1b}
+function #bs.view:as_looked_entity {run:"tag @s add bs.found"}
+assert entity @e[type=minecraft:armor_stand,tag=bs.found] inside
diff --git a/modules/bs.view/data/bs.view/test/at_aimed_block.mcfunction b/modules/bs.view/data/bs.view/test/at_aimed_block.mcfunction
new file mode 100644
index 0000000000..79ad2b1a7c
--- /dev/null
+++ b/modules/bs.view/data/bs.view/test/at_aimed_block.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
+setblock ~ ~1 ~1 minecraft:sponge
+function #bs.view:at_aimed_block {run:"setblock ~ ~ ~ minecraft:bookshelf",with:{}}
+assert block ~ ~1 ~1 minecraft:bookshelf
diff --git a/modules/bs.view/data/bs.view/test/at_aimed_entity.mcfunction b/modules/bs.view/data/bs.view/test/at_aimed_entity.mcfunction
new file mode 100644
index 0000000000..0cb77ff17e
--- /dev/null
+++ b/modules/bs.view/data/bs.view/test/at_aimed_entity.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
+summon minecraft:armor_stand ~.5 ~ ~1.5 {Tags:["bs.raycast.is_solid"],NoGravity:1b}
+function #bs.view:at_aimed_entity {run:"tag @e[distance=0] add bs.found",with:{}}
+assert entity @e[type=minecraft:armor_stand,tag=bs.found] inside
diff --git a/modules/bs.view/data/bs.view/test/at_aimed_point.mcfunction b/modules/bs.view/data/bs.view/test/at_aimed_point.mcfunction
new file mode 100644
index 0000000000..cf7c40fb69
--- /dev/null
+++ b/modules/bs.view/data/bs.view/test/at_aimed_point.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
+setblock ~ ~1 ~1 minecraft:bookshelf
+function #bs.view:at_aimed_point {run:"summon minecraft:marker ~ ~ ~",with:{}}
+execute at @s anchored eyes positioned ^ ^ ^.5 run assert entity @e[type=minecraft:marker,distance=..0.1]
diff --git a/modules/bs.view/data/bs.view/test/at_block_placement.mcfunction b/modules/bs.view/data/bs.view/test/at_block_placement.mcfunction
new file mode 100644
index 0000000000..8cd13dad8a
--- /dev/null
+++ b/modules/bs.view/data/bs.view/test/at_block_placement.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
+setblock ~ ~1 ~1 minecraft:sponge
+function #bs.view:at_block_placement {run:"setblock ~ ~ ~ minecraft:bookshelf",with:{}}
+assert block ~ ~1 ~ minecraft:bookshelf
diff --git a/modules/bs.view/data/bs.view/test/at_looked_entity.mcfunction b/modules/bs.view/data/bs.view/test/at_looked_entity.mcfunction
new file mode 100644
index 0000000000..56182fc145
--- /dev/null
+++ b/modules/bs.view/data/bs.view/test/at_looked_entity.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
+summon minecraft:armor_stand ~.5 ~ ~1.5 {Tags:["bs.view.is_lookable"],NoGravity:1b}
+function #bs.view:at_looked_entity {run:"tag @e[distance=0] add bs.found"}
+assert entity @e[type=minecraft:armor_stand,tag=bs.found] inside
diff --git a/modules/bs.view/data/bs.view/test/can_see_ata.mcfunction b/modules/bs.view/data/bs.view/test/can_see_ata.mcfunction
new file mode 100644
index 0000000000..e7b08dece3
--- /dev/null
+++ b/modules/bs.view/data/bs.view/test/can_see_ata.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+fill ~-1 ~ ~-1 ~1 ~1 ~1 minecraft:air
+setblock ~ ~1 ~1 minecraft:bookshelf
+
+execute at @s positioned ~ ~1 ~.5 store result score #success bs.data run function #bs.view:can_see_ata {with:{}}
+execute if score #success bs.data matches 1 run fail "Position must be obstructed when reaching a block"
+
+execute at @s positioned ~ ~1 ~.49 store result score #success bs.data run function #bs.view:can_see_ata {with:{}}
+execute if score #success bs.data matches 0 run fail "Position must be unobstructed before reaching a block"
diff --git a/modules/bs.view/data/bs.view/test/in_view_ata.mcfunction b/modules/bs.view/data/bs.view/test/in_view_ata.mcfunction
new file mode 100644
index 0000000000..ecafbdc6bc
--- /dev/null
+++ b/modules/bs.view/data/bs.view/test/in_view_ata.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+execute at @s anchored eyes positioned ^1 ^ ^1 store result score #success bs.data run function #bs.view:in_view_ata {angle:90}
+execute if score #success bs.data matches 1 run fail "Position must not be within the 90-degree viewing angle"
+
+execute at @s anchored eyes positioned ^.99 ^ ^1 store result score #success bs.data run function #bs.view:in_view_ata {angle:90}
+execute if score #success bs.data matches 0 run fail "Position must be within the 90-degree viewing angle"
diff --git a/modules/bs.view/module.json b/modules/bs.view/module.json
new file mode 100644
index 0000000000..ff78257c83
--- /dev/null
+++ b/modules/bs.view/module.json
@@ -0,0 +1,17 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.view",
+ "load": "."
+ },
+ "meta": {
+ "name": "View",
+ "slug": "bookshelf-view",
+ "description": "Execute commands based on what an entity sees.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/view.html",
+ "tags": ["default"],
+ "dependencies": [
+ "bs.raycast"
+ ]
+ }
+}
diff --git a/modules/bs.xp/README.md b/modules/bs.xp/README.md
new file mode 100644
index 0000000000..5ee1ca1289
--- /dev/null
+++ b/modules/bs.xp/README.md
@@ -0,0 +1,10 @@
+# 🏅 Bookshelf XP
+
+This datapack provides tools to efficiently manage players' experience points and levels.
+
+For more details and usage examples, check out the Bookshelf [documentation](https://docs.mcbookshelf.dev/en/latest/modules/xp.html).
+
+
+## 📖 About Bookshelf
+
+This module is part of the [Bookshelf Project](https://docs.mcbookshelf.dev/en/latest/index.html), a modular library datapack designed to simplify complex systems in Minecraft. Explore the full range of modules and discover how Bookshelf can simplify your Minecraft creations!
diff --git a/modules/bs.xp/data/bs.xp/function/__load__.mcfunction b/modules/bs.xp/data/bs.xp/function/__load__.mcfunction
new file mode 100644
index 0000000000..9d54fa776d
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/__load__.mcfunction
@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard objectives add bs.ctx dummy [{"text":"BS ","color":"dark_gray"},{"text":"Context","color":"aqua"}]
+scoreboard objectives add bs.out dummy [{"text":"BS ","color":"dark_gray"},{"text":"Output","color":"aqua"}]
+scoreboard objectives add bs.const dummy [{"text":"BS ","color":"dark_gray"},{"text":"Constants","color":"aqua"}]
+
+scoreboard players set 2 bs.const 2
+scoreboard players set 5 bs.const 5
+scoreboard players set 6 bs.const 6
+scoreboard players set 9 bs.const 9
+scoreboard players set 81 bs.const 81
+scoreboard players set 100 bs.const 100
+scoreboard players set 325 bs.const 325
+
+# level 111111129 => max_points = 1000000002
+data modify storage bs:const xp.progress set value 1000000000
diff --git a/modules/bs.xp/data/bs.xp/function/__unload__.mcfunction b/modules/bs.xp/data/bs.xp/function/__unload__.mcfunction
new file mode 100644
index 0000000000..15697d1602
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/__unload__.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+scoreboard objectives remove bs.ctx
+scoreboard objectives remove bs.out
+scoreboard objectives remove bs.const
+
+data remove storage bs:in xp
+data remove storage bs:const xp
diff --git a/modules/bs.xp/data/bs.xp/function/add/levels.mcfunction b/modules/bs.xp/data/bs.xp/function/add/levels.mcfunction
new file mode 100644
index 0000000000..9ab92a515f
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/add/levels.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$xp add @s $(levels) levels
diff --git a/modules/bs.xp/data/bs.xp/function/add/points.mcfunction b/modules/bs.xp/data/bs.xp/function/add/points.mcfunction
new file mode 100644
index 0000000000..bdb977a0c2
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/add/points.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$xp add @s $(points) points
diff --git a/modules/bs.xp/data/bs.xp/function/add/progress/apply.mcfunction b/modules/bs.xp/data/bs.xp/function/add/progress/apply.mcfunction
new file mode 100644
index 0000000000..89161cbb11
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/add/progress/apply.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$xp add @s $(x) points
diff --git a/modules/bs.xp/data/bs.xp/function/add/progress/progress.mcfunction b/modules/bs.xp/data/bs.xp/function/add/progress/progress.mcfunction
new file mode 100644
index 0000000000..f808e215d1
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/add/progress/progress.mcfunction
@@ -0,0 +1,25 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# level 111111129 => max_points = 1000000002
+$execute store result storage bs:ctx x int 1 store result score #p bs.ctx run data get storage bs:const xp.progress $(progress)
+execute store result storage bs:ctx y int 1 run xp query @s levels
+xp set @s 111111129 levels
+execute store result score #x bs.ctx run xp query @s points
+scoreboard players operation #p bs.ctx += #x bs.ctx
+execute if score #p bs.ctx matches ..0 run xp set @s 0 points
+execute if score #p bs.ctx matches 1000000000.. run xp set @s 1000000000 points
+execute if score #p bs.ctx matches 1..999999999 run function bs.xp:add/progress/apply with storage bs:ctx
+function bs.xp:utils/restore_levels with storage bs:ctx
diff --git a/modules/bs.xp/data/bs.xp/function/get/max_points/max_points.mcfunction b/modules/bs.xp/data/bs.xp/function/get/max_points/max_points.mcfunction
new file mode 100644
index 0000000000..09626a72d1
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/get/max_points/max_points.mcfunction
@@ -0,0 +1,19 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score $xp.get_max_points bs.out run xp query @s levels
+execute if score $xp.get_max_points bs.out matches 0..15 run return run function bs.xp:get/max_points/range_1
+execute if score $xp.get_max_points bs.out matches 16..30 run return run function bs.xp:get/max_points/range_2
+execute if score $xp.get_max_points bs.out matches 31.. run return run function bs.xp:get/max_points/range_3
diff --git a/modules/bs.xp/data/bs.xp/function/get/max_points/range_1.mcfunction b/modules/bs.xp/data/bs.xp/function/get/max_points/range_1.mcfunction
new file mode 100644
index 0000000000..02312e2f4e
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/get/max_points/range_1.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# 2 × current_level + 7 (for levels 0–15)
+scoreboard players operation $xp.get_max_points bs.out *= 2 bs.const
+return run scoreboard players add $xp.get_max_points bs.out 7
diff --git a/modules/bs.xp/data/bs.xp/function/get/max_points/range_2.mcfunction b/modules/bs.xp/data/bs.xp/function/get/max_points/range_2.mcfunction
new file mode 100644
index 0000000000..5ebceb5694
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/get/max_points/range_2.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# 5 × current_level – 38 (for levels 16–30)
+scoreboard players operation $xp.get_max_points bs.out *= 5 bs.const
+return run scoreboard players remove $xp.get_max_points bs.out 38
diff --git a/modules/bs.xp/data/bs.xp/function/get/max_points/range_3.mcfunction b/modules/bs.xp/data/bs.xp/function/get/max_points/range_3.mcfunction
new file mode 100644
index 0000000000..7e8d794812
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/get/max_points/range_3.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# 9 × current_level – 158 (for levels 31+)
+scoreboard players operation $xp.get_max_points bs.out *= 9 bs.const
+return run scoreboard players remove $xp.get_max_points bs.out 158
diff --git a/modules/bs.xp/data/bs.xp/function/get/progress.mcfunction b/modules/bs.xp/data/bs.xp/function/get/progress.mcfunction
new file mode 100644
index 0000000000..a4e8f1dc7b
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/get/progress.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$execute store result score $xp.get_progress bs.out run return run data get entity @s XpP $(scale)
diff --git a/modules/bs.xp/data/bs.xp/function/get/remaining_points.mcfunction b/modules/bs.xp/data/bs.xp/function/get/remaining_points.mcfunction
new file mode 100644
index 0000000000..f27d752819
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/get/remaining_points.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score $xp.get_remaining_points bs.out run function #bs.xp:get_max_points
+execute store result score #p bs.ctx run xp query @s points
+return run scoreboard players operation $xp.get_remaining_points bs.out -= #p bs.ctx
diff --git a/modules/bs.xp/data/bs.xp/function/get/total_points/range_1.mcfunction b/modules/bs.xp/data/bs.xp/function/get/total_points/range_1.mcfunction
new file mode 100644
index 0000000000..e0e29d162c
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/get/total_points/range_1.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# level^2 + 6 × level (at levels 0–16)
+scoreboard players operation #x bs.ctx *= 6 bs.const
+scoreboard players operation #y bs.ctx *= #y bs.ctx
+scoreboard players operation $xp.get_total_points bs.out += #x bs.ctx
+return run scoreboard players operation $xp.get_total_points bs.out += #y bs.ctx
diff --git a/modules/bs.xp/data/bs.xp/function/get/total_points/range_2.mcfunction b/modules/bs.xp/data/bs.xp/function/get/total_points/range_2.mcfunction
new file mode 100644
index 0000000000..ab89edeb63
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/get/total_points/range_2.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# 2.5 × level^2 – 40.5 × level + 360 (at levels 17–31)
+# => 1/2 × (5 × level^2 - 81 × level) + 360
+scoreboard players operation #x bs.ctx *= 81 bs.const
+scoreboard players operation #y bs.ctx *= #y bs.ctx
+scoreboard players operation #y bs.ctx *= 5 bs.const
+scoreboard players operation #y bs.ctx -= #x bs.ctx
+scoreboard players operation #y bs.ctx /= 2 bs.const
+scoreboard players operation $xp.get_total_points bs.out += #y bs.ctx
+return run scoreboard players add $xp.get_total_points bs.out 360
diff --git a/modules/bs.xp/data/bs.xp/function/get/total_points/range_3.mcfunction b/modules/bs.xp/data/bs.xp/function/get/total_points/range_3.mcfunction
new file mode 100644
index 0000000000..3b8b63a503
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/get/total_points/range_3.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# 4.5 × level^2 – 162.5 × level + 2220 (at levels 32+)
+# => 1/2 × (9 × level^2 - 325 × level) + 2220
+scoreboard players operation #x bs.ctx *= 325 bs.const
+scoreboard players operation #y bs.ctx *= #y bs.ctx
+scoreboard players operation #y bs.ctx *= 9 bs.const
+scoreboard players operation #y bs.ctx -= #x bs.ctx
+scoreboard players operation #y bs.ctx /= 2 bs.const
+scoreboard players operation $xp.get_total_points bs.out += #y bs.ctx
+return run scoreboard players add $xp.get_total_points bs.out 2220
diff --git a/modules/bs.xp/data/bs.xp/function/get/total_points/total_points.mcfunction b/modules/bs.xp/data/bs.xp/function/get/total_points/total_points.mcfunction
new file mode 100644
index 0000000000..f7f0382436
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/get/total_points/total_points.mcfunction
@@ -0,0 +1,20 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+execute store result score $xp.get_total_points bs.out run xp query @s points
+execute store result score #x bs.ctx store result score #y bs.ctx run xp query @s levels
+execute if score #x bs.ctx matches 1..16 run return run function bs.xp:get/total_points/range_1
+execute if score #x bs.ctx matches 17..31 run return run function bs.xp:get/total_points/range_2
+execute if score #x bs.ctx matches 32.. run return run function bs.xp:get/total_points/range_3
diff --git a/modules/bs.xp/data/bs.xp/function/set/levels.mcfunction b/modules/bs.xp/data/bs.xp/function/set/levels.mcfunction
new file mode 100644
index 0000000000..1f69a58643
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/set/levels.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$xp set @s $(levels) levels
diff --git a/modules/bs.xp/data/bs.xp/function/set/points.mcfunction b/modules/bs.xp/data/bs.xp/function/set/points.mcfunction
new file mode 100644
index 0000000000..b3e6313c17
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/set/points.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$xp set @s $(points) points
diff --git a/modules/bs.xp/data/bs.xp/function/set/progress/apply.mcfunction b/modules/bs.xp/data/bs.xp/function/set/progress/apply.mcfunction
new file mode 100644
index 0000000000..63297779d7
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/set/progress/apply.mcfunction
@@ -0,0 +1,16 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+$xp set @s $(x) points
diff --git a/modules/bs.xp/data/bs.xp/function/set/progress/progress.mcfunction b/modules/bs.xp/data/bs.xp/function/set/progress/progress.mcfunction
new file mode 100644
index 0000000000..9fca2787b8
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/set/progress/progress.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+# level 111111129 => max_points = 1000000002
+$execute store result storage bs:ctx x int 1 store result score #p bs.ctx run data get storage bs:const xp.progress $(progress)
+execute store result storage bs:ctx y int 1 run xp query @s levels
+xp set @s 111111129 levels
+execute if score #p bs.ctx matches ..0 run xp set @s 0 points
+execute if score #p bs.ctx matches 1000000000.. run xp set @s 1000000000 points
+execute if score #p bs.ctx matches 1..999999999 run function bs.xp:set/progress/apply with storage bs:ctx
+function bs.xp:utils/restore_levels with storage bs:ctx
diff --git a/modules/bs.xp/data/bs.xp/function/set/total_points.mcfunction b/modules/bs.xp/data/bs.xp/function/set/total_points.mcfunction
new file mode 100644
index 0000000000..9530b6c118
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/function/set/total_points.mcfunction
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+
+xp set @s 0 points
+xp set @s 0 levels
+$xp add @s $(points) points
diff --git a/datapacks/Bookshelf/data/bs.xp/function/utils/restore_levels.mcfunction b/modules/bs.xp/data/bs.xp/function/utils/restore_levels.mcfunction
similarity index 96%
rename from datapacks/Bookshelf/data/bs.xp/function/utils/restore_levels.mcfunction
rename to modules/bs.xp/data/bs.xp/function/utils/restore_levels.mcfunction
index d9a2ad82db..17c825c9ca 100644
--- a/datapacks/Bookshelf/data/bs.xp/function/utils/restore_levels.mcfunction
+++ b/modules/bs.xp/data/bs.xp/function/utils/restore_levels.mcfunction
@@ -1,7 +1,7 @@
# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2024 Gunivers
#
-# This file is part of the Bookshelf project (https://github.com/Gunivers/Bookshelf).
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
#
# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/datapacks/Bookshelf/data/bs.xp/tags/function/add_levels.json b/modules/bs.xp/data/bs.xp/tags/function/add_levels.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.xp/tags/function/add_levels.json
rename to modules/bs.xp/data/bs.xp/tags/function/add_levels.json
index 1524297b09..4862852e01 100644
--- a/datapacks/Bookshelf/data/bs.xp/tags/function/add_levels.json
+++ b/modules/bs.xp/data/bs.xp/tags/function/add_levels.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#add-remove",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#add-remove",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.xp/tags/function/add_points.json b/modules/bs.xp/data/bs.xp/tags/function/add_points.json
similarity index 76%
rename from datapacks/Bookshelf/data/bs.xp/tags/function/add_points.json
rename to modules/bs.xp/data/bs.xp/tags/function/add_points.json
index d2a94b7827..f8a59f8a5b 100644
--- a/datapacks/Bookshelf/data/bs.xp/tags/function/add_points.json
+++ b/modules/bs.xp/data/bs.xp/tags/function/add_points.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#add-remove",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#add-remove",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.xp/tags/function/add_progress.json b/modules/bs.xp/data/bs.xp/tags/function/add_progress.json
similarity index 77%
rename from datapacks/Bookshelf/data/bs.xp/tags/function/add_progress.json
rename to modules/bs.xp/data/bs.xp/tags/function/add_progress.json
index 0636eaec27..daed00d126 100644
--- a/datapacks/Bookshelf/data/bs.xp/tags/function/add_progress.json
+++ b/modules/bs.xp/data/bs.xp/tags/function/add_progress.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#add-remove",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#add-remove",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.xp/tags/function/get_max_points.json b/modules/bs.xp/data/bs.xp/tags/function/get_max_points.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.xp/tags/function/get_max_points.json
rename to modules/bs.xp/data/bs.xp/tags/function/get_max_points.json
index 10c0c65c2c..b11a715dcf 100644
--- a/datapacks/Bookshelf/data/bs.xp/tags/function/get_max_points.json
+++ b/modules/bs.xp/data/bs.xp/tags/function/get_max_points.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#get",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#get",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.xp/tags/function/get_progress.json b/modules/bs.xp/data/bs.xp/tags/function/get_progress.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.xp/tags/function/get_progress.json
rename to modules/bs.xp/data/bs.xp/tags/function/get_progress.json
index 48bb30424a..52a384987d 100644
--- a/datapacks/Bookshelf/data/bs.xp/tags/function/get_progress.json
+++ b/modules/bs.xp/data/bs.xp/tags/function/get_progress.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#get",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#get",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.xp/tags/function/get_remaining_points.json b/modules/bs.xp/data/bs.xp/tags/function/get_remaining_points.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.xp/tags/function/get_remaining_points.json
rename to modules/bs.xp/data/bs.xp/tags/function/get_remaining_points.json
index c12dd119e4..1c4abc99ee 100644
--- a/datapacks/Bookshelf/data/bs.xp/tags/function/get_remaining_points.json
+++ b/modules/bs.xp/data/bs.xp/tags/function/get_remaining_points.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#get",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#get",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.xp/tags/function/get_total_points.json b/modules/bs.xp/data/bs.xp/tags/function/get_total_points.json
similarity index 79%
rename from datapacks/Bookshelf/data/bs.xp/tags/function/get_total_points.json
rename to modules/bs.xp/data/bs.xp/tags/function/get_total_points.json
index ea3e3020dd..1ff2cda3d3 100644
--- a/datapacks/Bookshelf/data/bs.xp/tags/function/get_total_points.json
+++ b/modules/bs.xp/data/bs.xp/tags/function/get_total_points.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#get",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#get",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.xp/tags/function/set_levels.json b/modules/bs.xp/data/bs.xp/tags/function/set_levels.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.xp/tags/function/set_levels.json
rename to modules/bs.xp/data/bs.xp/tags/function/set_levels.json
index e2af7e6096..47dcd2dceb 100644
--- a/datapacks/Bookshelf/data/bs.xp/tags/function/set_levels.json
+++ b/modules/bs.xp/data/bs.xp/tags/function/set_levels.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#set",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#set",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.xp/tags/function/set_points.json b/modules/bs.xp/data/bs.xp/tags/function/set_points.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.xp/tags/function/set_points.json
rename to modules/bs.xp/data/bs.xp/tags/function/set_points.json
index efdd376fbc..02de4b4c09 100644
--- a/datapacks/Bookshelf/data/bs.xp/tags/function/set_points.json
+++ b/modules/bs.xp/data/bs.xp/tags/function/set_points.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#set",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#set",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.xp/tags/function/set_progress.json b/modules/bs.xp/data/bs.xp/tags/function/set_progress.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.xp/tags/function/set_progress.json
rename to modules/bs.xp/data/bs.xp/tags/function/set_progress.json
index 726e1376a0..f1d785a265 100644
--- a/datapacks/Bookshelf/data/bs.xp/tags/function/set_progress.json
+++ b/modules/bs.xp/data/bs.xp/tags/function/set_progress.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#set",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#set",
"authors": [
"Aksiome",
"Leirof"
diff --git a/datapacks/Bookshelf/data/bs.xp/tags/function/set_total_points.json b/modules/bs.xp/data/bs.xp/tags/function/set_total_points.json
similarity index 78%
rename from datapacks/Bookshelf/data/bs.xp/tags/function/set_total_points.json
rename to modules/bs.xp/data/bs.xp/tags/function/set_total_points.json
index 31ba787b2f..a4427d009f 100644
--- a/datapacks/Bookshelf/data/bs.xp/tags/function/set_total_points.json
+++ b/modules/bs.xp/data/bs.xp/tags/function/set_total_points.json
@@ -1,7 +1,7 @@
{
"__bookshelf__": {
"feature": true,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/xp.html#set",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html#set",
"authors": [
"Aksiome",
"Leirof"
diff --git a/modules/bs.xp/data/bs.xp/test/add/levels.mcfunction b/modules/bs.xp/data/bs.xp/test/add/levels.mcfunction
new file mode 100644
index 0000000000..e5898d197c
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/test/add/levels.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+function #bs.xp:add_levels {levels:42}
+assert entity @s[level=42]
+
+function #bs.xp:add_levels {levels:22}
+assert entity @s[level=64]
diff --git a/modules/bs.xp/data/bs.xp/test/add/points.mcfunction b/modules/bs.xp/data/bs.xp/test/add/points.mcfunction
new file mode 100644
index 0000000000..44ee2c7324
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/test/add/points.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+function #bs.xp:add_points {points:1}
+execute store result score #r bs.ctx run xp query @s points
+assert score #r bs.ctx matches 1
+
+function #bs.xp:add_points {points:5}
+execute store result score #r bs.ctx run xp query @s points
+assert score #r bs.ctx matches 6
diff --git a/modules/bs.xp/data/bs.xp/test/add/progress.mcfunction b/modules/bs.xp/data/bs.xp/test/add/progress.mcfunction
new file mode 100644
index 0000000000..b064e088b5
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/test/add/progress.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+function #bs.xp:add_progress {progress:0.1}
+assert data entity @s {XpP:0.1f}
+
+function #bs.xp:add_progress {progress:0.4}
+assert data entity @s {XpP:0.5f}
+
+function #bs.xp:add_progress {progress:1.0}
+assert data entity @s {XpP:1.0f}
diff --git a/modules/bs.xp/data/bs.xp/test/get/max_points.mcfunction b/modules/bs.xp/data/bs.xp/test/get/max_points.mcfunction
new file mode 100644
index 0000000000..df5f29138f
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/test/get/max_points.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+xp set @s 5 levels
+execute store result score #r bs.ctx run function #bs.xp:get_max_points
+assert score #r bs.ctx matches 17
+
+xp set @s 21 levels
+execute store result score #r bs.ctx run function #bs.xp:get_max_points
+assert score #r bs.ctx matches 67
+
+xp set @s 42 levels
+execute store result score #r bs.ctx run function #bs.xp:get_max_points
+assert score #r bs.ctx matches 220
diff --git a/modules/bs.xp/data/bs.xp/test/get/progress.mcfunction b/modules/bs.xp/data/bs.xp/test/get/progress.mcfunction
new file mode 100644
index 0000000000..6c3b9efc5e
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/test/get/progress.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+xp set @s 1 points
+execute store result score #r bs.ctx run function #bs.xp:get_progress {scale:10000}
+assert score #r bs.ctx matches 1428
+
+xp set @s 5 points
+execute store result score #r bs.ctx run function #bs.xp:get_progress {scale:100}
+assert score #r bs.ctx matches 71
diff --git a/modules/bs.xp/data/bs.xp/test/get/remaining_points.mcfunction b/modules/bs.xp/data/bs.xp/test/get/remaining_points.mcfunction
new file mode 100644
index 0000000000..ad0eebecac
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/test/get/remaining_points.mcfunction
@@ -0,0 +1,30 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+xp set @s 5 levels
+xp set @s 5 points
+execute store result score #r bs.ctx run function #bs.xp:get_remaining_points
+assert score #r bs.ctx matches 12
+
+xp set @s 21 levels
+xp set @s 12 points
+execute store result score #r bs.ctx run function #bs.xp:get_remaining_points
+assert score #r bs.ctx matches 55
+
+xp set @s 42 levels
+xp set @s 18 points
+execute store result score #r bs.ctx run function #bs.xp:get_remaining_points
+assert score #r bs.ctx matches 202
diff --git a/modules/bs.xp/data/bs.xp/test/get/total_points.mcfunction b/modules/bs.xp/data/bs.xp/test/get/total_points.mcfunction
new file mode 100644
index 0000000000..25cb9cc296
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/test/get/total_points.mcfunction
@@ -0,0 +1,27 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+xp set @s 42 levels
+execute store result score #r bs.ctx run function #bs.xp:get_total_points
+assert score #r bs.ctx matches 3333
+
+xp add @s -2500 points
+execute store result score #r bs.ctx run function #bs.xp:get_total_points
+assert score #r bs.ctx matches 833
+
+xp add @s -700 points
+execute store result score #r bs.ctx run function #bs.xp:get_total_points
+assert score #r bs.ctx matches 133
diff --git a/modules/bs.xp/data/bs.xp/test/set/levels.mcfunction b/modules/bs.xp/data/bs.xp/test/set/levels.mcfunction
new file mode 100644
index 0000000000..149479810c
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/test/set/levels.mcfunction
@@ -0,0 +1,21 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+function #bs.xp:set_levels {levels:42}
+assert entity @s[level=42]
+
+function #bs.xp:set_levels {levels:22}
+assert entity @s[level=22]
diff --git a/modules/bs.xp/data/bs.xp/test/set/points.mcfunction b/modules/bs.xp/data/bs.xp/test/set/points.mcfunction
new file mode 100644
index 0000000000..5ed32a1ce8
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/test/set/points.mcfunction
@@ -0,0 +1,23 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+function #bs.xp:set_points {points:5}
+execute store result score #r bs.ctx run xp query @s points
+assert score #r bs.ctx matches 5
+
+function #bs.xp:set_points {points:2}
+execute store result score #r bs.ctx run xp query @s points
+assert score #r bs.ctx matches 2
diff --git a/modules/bs.xp/data/bs.xp/test/set/progress.mcfunction b/modules/bs.xp/data/bs.xp/test/set/progress.mcfunction
new file mode 100644
index 0000000000..9e81f6a5d2
--- /dev/null
+++ b/modules/bs.xp/data/bs.xp/test/set/progress.mcfunction
@@ -0,0 +1,24 @@
+# ------------------------------------------------------------------------------------------------------------
+# Copyright (c) 2024 Gunivers
+#
+# This file is part of the Bookshelf project (https://github.com/mcbookshelf/Bookshelf).
+#
+# This source code is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Conditions:
+# - You may use this file in compliance with the MPL v2.0
+# - Any modifications must be documented and disclosed under the same license
+#
+# For more details, refer to the MPL v2.0.
+# ------------------------------------------------------------------------------------------------------------
+# @dummy
+
+function #bs.xp:set_progress {progress:0.5}
+assert data entity @s {XpP:0.5f}
+
+function #bs.xp:set_progress {progress:0.1}
+assert data entity @s {XpP:0.1f}
+
+function #bs.xp:set_progress {progress:2.0}
+assert data entity @s {XpP:1.0f}
diff --git a/modules/bs.xp/module.json b/modules/bs.xp/module.json
new file mode 100644
index 0000000000..38ba98432c
--- /dev/null
+++ b/modules/bs.xp/module.json
@@ -0,0 +1,14 @@
+{
+ "extend": "../config.json",
+ "data_pack": {
+ "name": "bs.xp",
+ "load": "."
+ },
+ "meta": {
+ "name": "XP",
+ "slug": "bookshelf-xp",
+ "description": "Efficiently manage the experience points and levels of players.",
+ "documentation": "https://docs.mcbookshelf.dev/en/latest/modules/xp.html",
+ "tags": ["default"]
+ }
+}
diff --git a/modules/config.json b/modules/config.json
new file mode 100644
index 0000000000..b880d69af8
--- /dev/null
+++ b/modules/config.json
@@ -0,0 +1,16 @@
+{
+ "data_pack": {
+ "description": "Bookshelf - Library designed for mapmakers"
+ },
+ "require": [
+ "core.plugins.setup_pack",
+ "core.plugins.setup_jinja",
+ "core.plugins.setup_tags",
+ "core.plugins.auto_import",
+ "core.plugins.dependencies"
+ ],
+ "pipeline": [
+ "core.plugins.gen_help",
+ "core.plugins.gen_load"
+ ]
+}
diff --git a/pdm.lock b/pdm.lock
new file mode 100644
index 0000000000..cbbb761182
--- /dev/null
+++ b/pdm.lock
@@ -0,0 +1,972 @@
+# This file is @generated by PDM.
+# It is not intended for manual editing.
+
+[metadata]
+groups = ["default", "dev", "docs"]
+strategy = ["inherit_metadata"]
+lock_version = "4.5.0"
+content_hash = "sha256:97fb27e9867e857867d52ba33f155f6167f678dcfc83dac5ec241fb321c10df7"
+
+[[metadata.targets]]
+requires_python = "==3.12.*"
+
+[[package]]
+name = "accessible-pygments"
+version = "0.0.5"
+requires_python = ">=3.9"
+summary = "A collection of accessible pygments styles"
+groups = ["default", "docs"]
+dependencies = [
+ "pygments>=1.5",
+]
+files = [
+ {file = "accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7"},
+ {file = "accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872"},
+]
+
+[[package]]
+name = "alabaster"
+version = "1.0.0"
+requires_python = ">=3.10"
+summary = "A light, configurable Sphinx theme"
+groups = ["default", "docs"]
+files = [
+ {file = "alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b"},
+ {file = "alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e"},
+]
+
+[[package]]
+name = "annotated-types"
+version = "0.7.0"
+requires_python = ">=3.8"
+summary = "Reusable constraint types to use with typing.Annotated"
+groups = ["default"]
+dependencies = [
+ "typing-extensions>=4.0.0; python_version < \"3.9\"",
+]
+files = [
+ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
+ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
+]
+
+[[package]]
+name = "anyio"
+version = "4.7.0"
+requires_python = ">=3.9"
+summary = "High level compatibility layer for multiple asynchronous event loop implementations"
+groups = ["default", "docs"]
+dependencies = [
+ "exceptiongroup>=1.0.2; python_version < \"3.11\"",
+ "idna>=2.8",
+ "sniffio>=1.1",
+ "typing-extensions>=4.5; python_version < \"3.13\"",
+]
+files = [
+ {file = "anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"},
+ {file = "anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48"},
+]
+
+[[package]]
+name = "babel"
+version = "2.16.0"
+requires_python = ">=3.8"
+summary = "Internationalization utilities"
+groups = ["default", "docs"]
+dependencies = [
+ "pytz>=2015.7; python_version < \"3.9\"",
+]
+files = [
+ {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"},
+ {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"},
+]
+
+[[package]]
+name = "beautifulsoup4"
+version = "4.12.3"
+requires_python = ">=3.6.0"
+summary = "Screen-scraping library"
+groups = ["default", "docs"]
+dependencies = [
+ "soupsieve>1.2",
+]
+files = [
+ {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"},
+ {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"},
+]
+
+[[package]]
+name = "beet"
+version = "0.109.2"
+requires_python = "<4.0,>=3.10"
+summary = "The Minecraft pack development kit"
+groups = ["default"]
+dependencies = [
+ "Jinja2<4.0.0,>=3.1.2",
+ "PyYAML<7.0.0,>=6.0.1",
+ "click-help-colors<0.10.0,>=0.9.2",
+ "click<9.0.0,>=8.1.7",
+ "colorama; sys_platform == \"win32\"",
+ "nbtlib<2.0.0,>=1.12.1",
+ "pathspec<0.12.0,>=0.11.2",
+ "pydantic<3.0.0,>=2.5.2",
+ "toml<0.11.0,>=0.10.2",
+ "typing-extensions<5.0.0,>=4.8.0",
+]
+files = [
+ {file = "beet-0.109.2-py3-none-any.whl", hash = "sha256:d3a73f8f064f5ad10d161e6af42fb39728dbba4e8111e33de0278c88a45c5c99"},
+ {file = "beet-0.109.2.tar.gz", hash = "sha256:68fca0e6e17adf86c42859e975671ed4e9013ead3a4365a3976f6f6a3ab84b08"},
+]
+
+[[package]]
+name = "certifi"
+version = "2024.12.14"
+requires_python = ">=3.6"
+summary = "Python package for providing Mozilla's CA Bundle."
+groups = ["default", "docs"]
+files = [
+ {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"},
+ {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"},
+]
+
+[[package]]
+name = "charset-normalizer"
+version = "3.4.1"
+requires_python = ">=3.7"
+summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
+groups = ["default", "docs"]
+files = [
+ {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"},
+ {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"},
+ {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"},
+]
+
+[[package]]
+name = "click"
+version = "8.1.8"
+requires_python = ">=3.7"
+summary = "Composable command line interface toolkit"
+groups = ["default", "docs"]
+dependencies = [
+ "colorama; platform_system == \"Windows\"",
+ "importlib-metadata; python_version < \"3.8\"",
+]
+files = [
+ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
+ {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
+]
+
+[[package]]
+name = "click-help-colors"
+version = "0.9.4"
+summary = "Colorization of help messages in Click"
+groups = ["default"]
+dependencies = [
+ "click<9,>=7.0",
+]
+files = [
+ {file = "click-help-colors-0.9.4.tar.gz", hash = "sha256:f4cabe52cf550299b8888f4f2ee4c5f359ac27e33bcfe4d61db47785a5cc936c"},
+ {file = "click_help_colors-0.9.4-py3-none-any.whl", hash = "sha256:b33c5803eeaeb084393b1ab5899dc5476c7196b87a18713045afe76f840b42db"},
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
+summary = "Cross-platform colored terminal text."
+groups = ["default", "docs"]
+files = [
+ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
+ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
+]
+
+[[package]]
+name = "docutils"
+version = "0.21.2"
+requires_python = ">=3.9"
+summary = "Docutils -- Python Documentation Utilities"
+groups = ["default", "docs"]
+files = [
+ {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"},
+ {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"},
+]
+
+[[package]]
+name = "h11"
+version = "0.14.0"
+requires_python = ">=3.7"
+summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
+groups = ["default", "docs"]
+dependencies = [
+ "typing-extensions; python_version < \"3.8\"",
+]
+files = [
+ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
+ {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
+]
+
+[[package]]
+name = "idna"
+version = "3.10"
+requires_python = ">=3.6"
+summary = "Internationalized Domain Names in Applications (IDNA)"
+groups = ["default", "docs"]
+files = [
+ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
+ {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
+]
+
+[[package]]
+name = "imagesize"
+version = "1.4.1"
+requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+summary = "Getting image size from png/jpeg/jpeg2000/gif file"
+groups = ["default", "docs"]
+files = [
+ {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"},
+ {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"},
+]
+
+[[package]]
+name = "jinja2"
+version = "3.1.5"
+requires_python = ">=3.7"
+summary = "A very fast and expressive template engine."
+groups = ["default", "docs"]
+dependencies = [
+ "MarkupSafe>=2.0",
+]
+files = [
+ {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"},
+ {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"},
+]
+
+[[package]]
+name = "linkify-it-py"
+version = "2.0.3"
+requires_python = ">=3.7"
+summary = "Links recognition library with FULL unicode support."
+groups = ["default", "docs"]
+dependencies = [
+ "uc-micro-py",
+]
+files = [
+ {file = "linkify-it-py-2.0.3.tar.gz", hash = "sha256:68cda27e162e9215c17d786649d1da0021a451bdc436ef9e0fa0ba5234b9b048"},
+ {file = "linkify_it_py-2.0.3-py3-none-any.whl", hash = "sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79"},
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "3.0.0"
+requires_python = ">=3.8"
+summary = "Python port of markdown-it. Markdown parsing, done right!"
+groups = ["default", "docs"]
+dependencies = [
+ "mdurl~=0.1",
+]
+files = [
+ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"},
+ {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"},
+]
+
+[[package]]
+name = "markupsafe"
+version = "3.0.2"
+requires_python = ">=3.9"
+summary = "Safely add untrusted strings to HTML/XML markup."
+groups = ["default", "docs"]
+files = [
+ {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"},
+ {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"},
+]
+
+[[package]]
+name = "mdit-py-plugins"
+version = "0.4.2"
+requires_python = ">=3.8"
+summary = "Collection of plugins for markdown-it-py"
+groups = ["default", "docs"]
+dependencies = [
+ "markdown-it-py<4.0.0,>=1.0.0",
+]
+files = [
+ {file = "mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636"},
+ {file = "mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5"},
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+requires_python = ">=3.7"
+summary = "Markdown URL utilities"
+groups = ["default", "docs"]
+files = [
+ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
+ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
+]
+
+[[package]]
+name = "mypy"
+version = "1.14.0"
+requires_python = ">=3.8"
+summary = "Optional static typing for Python"
+groups = ["dev"]
+dependencies = [
+ "mypy-extensions>=1.0.0",
+ "tomli>=1.1.0; python_version < \"3.11\"",
+ "typing-extensions>=4.6.0",
+]
+files = [
+ {file = "mypy-1.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d5326ab70a6db8e856d59ad4cb72741124950cbbf32e7b70e30166ba7bbf61dd"},
+ {file = "mypy-1.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bf4ec4980bec1e0e24e5075f449d014011527ae0055884c7e3abc6a99cd2c7f1"},
+ {file = "mypy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:390dfb898239c25289495500f12fa73aa7f24a4c6d90ccdc165762462b998d63"},
+ {file = "mypy-1.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7e026d55ddcd76e29e87865c08cbe2d0104e2b3153a523c529de584759379d3d"},
+ {file = "mypy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:585ed36031d0b3ee362e5107ef449a8b5dfd4e9c90ccbe36414ee405ee6b32ba"},
+ {file = "mypy-1.14.0-py3-none-any.whl", hash = "sha256:2238d7f93fc4027ed1efc944507683df3ba406445a2b6c96e79666a045aadfab"},
+ {file = "mypy-1.14.0.tar.gz", hash = "sha256:822dbd184d4a9804df5a7d5335a68cf7662930e70b8c1bc976645d1509f9a9d6"},
+]
+
+[[package]]
+name = "mypy-extensions"
+version = "1.0.0"
+requires_python = ">=3.5"
+summary = "Type system extensions for programs checked with the mypy type checker."
+groups = ["dev"]
+files = [
+ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
+ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
+]
+
+[[package]]
+name = "myst-parser"
+version = "4.0.0"
+requires_python = ">=3.10"
+summary = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser,"
+groups = ["default", "docs"]
+dependencies = [
+ "docutils<0.22,>=0.19",
+ "jinja2",
+ "markdown-it-py~=3.0",
+ "mdit-py-plugins>=0.4.1,~=0.4",
+ "pyyaml",
+ "sphinx<9,>=7",
+]
+files = [
+ {file = "myst_parser-4.0.0-py3-none-any.whl", hash = "sha256:b9317997552424448c6096c2558872fdb6f81d3ecb3a40ce84a7518798f3f28d"},
+ {file = "myst_parser-4.0.0.tar.gz", hash = "sha256:851c9dfb44e36e56d15d05e72f02b80da21a9e0d07cba96baf5e2d476bb91531"},
+]
+
+[[package]]
+name = "nbtlib"
+version = "1.12.1"
+requires_python = ">=3.8,<4.0"
+summary = "A python package to read and edit nbt data"
+groups = ["default"]
+dependencies = [
+ "numpy",
+]
+files = [
+ {file = "nbtlib-1.12.1-py3-none-any.whl", hash = "sha256:55e6811aa4e4bfe9000cbe026f1fe540ebc231c8a3f3558d7819c6c7274001c6"},
+ {file = "nbtlib-1.12.1.tar.gz", hash = "sha256:1642e34ace7131718c21354562a183757613f3554445e6fcf8effb155b6591f5"},
+]
+
+[[package]]
+name = "numpy"
+version = "2.2.1"
+requires_python = ">=3.10"
+summary = "Fundamental package for array computing in Python"
+groups = ["default"]
+files = [
+ {file = "numpy-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:694f9e921a0c8f252980e85bce61ebbd07ed2b7d4fa72d0e4246f2f8aa6642ab"},
+ {file = "numpy-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3683a8d166f2692664262fd4900f207791d005fb088d7fdb973cc8d663626faa"},
+ {file = "numpy-2.2.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:780077d95eafc2ccc3ced969db22377b3864e5b9a0ea5eb347cc93b3ea900315"},
+ {file = "numpy-2.2.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:55ba24ebe208344aa7a00e4482f65742969a039c2acfcb910bc6fcd776eb4355"},
+ {file = "numpy-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b1d07b53b78bf84a96898c1bc139ad7f10fda7423f5fd158fd0f47ec5e01ac7"},
+ {file = "numpy-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5062dc1a4e32a10dc2b8b13cedd58988261416e811c1dc4dbdea4f57eea61b0d"},
+ {file = "numpy-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fce4f615f8ca31b2e61aa0eb5865a21e14f5629515c9151850aa936c02a1ee51"},
+ {file = "numpy-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67d4cda6fa6ffa073b08c8372aa5fa767ceb10c9a0587c707505a6d426f4e046"},
+ {file = "numpy-2.2.1-cp312-cp312-win32.whl", hash = "sha256:32cb94448be47c500d2c7a95f93e2f21a01f1fd05dd2beea1ccd049bb6001cd2"},
+ {file = "numpy-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:ba5511d8f31c033a5fcbda22dd5c813630af98c70b2661f2d2c654ae3cdfcfc8"},
+ {file = "numpy-2.2.1.tar.gz", hash = "sha256:45681fd7128c8ad1c379f0ca0776a8b0c6583d2f69889ddac01559dfe4390918"},
+]
+
+[[package]]
+name = "packaging"
+version = "24.2"
+requires_python = ">=3.8"
+summary = "Core utilities for Python packages"
+groups = ["default", "docs"]
+files = [
+ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
+ {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
+]
+
+[[package]]
+name = "pathspec"
+version = "0.11.2"
+requires_python = ">=3.7"
+summary = "Utility library for gitignore style pattern matching of file paths."
+groups = ["default"]
+files = [
+ {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"},
+ {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"},
+]
+
+[[package]]
+name = "pydantic"
+version = "2.10.4"
+requires_python = ">=3.8"
+summary = "Data validation using Python type hints"
+groups = ["default"]
+dependencies = [
+ "annotated-types>=0.6.0",
+ "pydantic-core==2.27.2",
+ "typing-extensions>=4.12.2",
+]
+files = [
+ {file = "pydantic-2.10.4-py3-none-any.whl", hash = "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d"},
+ {file = "pydantic-2.10.4.tar.gz", hash = "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06"},
+]
+
+[[package]]
+name = "pydantic-core"
+version = "2.27.2"
+requires_python = ">=3.8"
+summary = "Core functionality for Pydantic validation and serialization"
+groups = ["default"]
+dependencies = [
+ "typing-extensions!=4.7.0,>=4.6.0",
+]
+files = [
+ {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"},
+ {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"},
+ {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"},
+]
+
+[[package]]
+name = "pydata-sphinx-theme"
+version = "0.16.1"
+requires_python = ">=3.9"
+summary = "Bootstrap-based Sphinx theme from the PyData community"
+groups = ["default", "docs"]
+dependencies = [
+ "Babel",
+ "accessible-pygments",
+ "beautifulsoup4",
+ "docutils!=0.17.0",
+ "pygments>=2.7",
+ "sphinx>=6.1",
+ "typing-extensions",
+]
+files = [
+ {file = "pydata_sphinx_theme-0.16.1-py3-none-any.whl", hash = "sha256:225331e8ac4b32682c18fcac5a57a6f717c4e632cea5dd0e247b55155faeccde"},
+ {file = "pydata_sphinx_theme-0.16.1.tar.gz", hash = "sha256:a08b7f0b7f70387219dc659bff0893a7554d5eb39b59d3b8ef37b8401b7642d7"},
+]
+
+[[package]]
+name = "pygments"
+version = "2.18.0"
+requires_python = ">=3.8"
+summary = "Pygments is a syntax highlighting package written in Python."
+groups = ["default", "docs"]
+files = [
+ {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"},
+ {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"},
+]
+
+[[package]]
+name = "pyyaml"
+version = "6.0.2"
+requires_python = ">=3.8"
+summary = "YAML parser and emitter for Python"
+groups = ["default", "docs"]
+files = [
+ {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"},
+ {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"},
+ {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"},
+ {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"},
+ {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"},
+ {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"},
+ {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"},
+ {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"},
+ {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"},
+ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"},
+]
+
+[[package]]
+name = "requests"
+version = "2.32.3"
+requires_python = ">=3.8"
+summary = "Python HTTP for Humans."
+groups = ["default", "docs"]
+dependencies = [
+ "certifi>=2017.4.17",
+ "charset-normalizer<4,>=2",
+ "idna<4,>=2.5",
+ "urllib3<3,>=1.21.1",
+]
+files = [
+ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
+ {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
+]
+
+[[package]]
+name = "ruff"
+version = "0.8.4"
+requires_python = ">=3.7"
+summary = "An extremely fast Python linter and code formatter, written in Rust."
+groups = ["dev"]
+files = [
+ {file = "ruff-0.8.4-py3-none-linux_armv6l.whl", hash = "sha256:58072f0c06080276804c6a4e21a9045a706584a958e644353603d36ca1eb8a60"},
+ {file = "ruff-0.8.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ffb60904651c00a1e0b8df594591770018a0f04587f7deeb3838344fe3adabac"},
+ {file = "ruff-0.8.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ddf5d654ac0d44389f6bf05cee4caeefc3132a64b58ea46738111d687352296"},
+ {file = "ruff-0.8.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e248b1f0fa2749edd3350a2a342b67b43a2627434c059a063418e3d375cfe643"},
+ {file = "ruff-0.8.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf197b98ed86e417412ee3b6c893f44c8864f816451441483253d5ff22c0e81e"},
+ {file = "ruff-0.8.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c41319b85faa3aadd4d30cb1cffdd9ac6b89704ff79f7664b853785b48eccdf3"},
+ {file = "ruff-0.8.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9f8402b7c4f96463f135e936d9ab77b65711fcd5d72e5d67597b543bbb43cf3f"},
+ {file = "ruff-0.8.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4e56b3baa9c23d324ead112a4fdf20db9a3f8f29eeabff1355114dd96014604"},
+ {file = "ruff-0.8.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:736272574e97157f7edbbb43b1d046125fce9e7d8d583d5d65d0c9bf2c15addf"},
+ {file = "ruff-0.8.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fe710ab6061592521f902fca7ebcb9fabd27bc7c57c764298b1c1f15fff720"},
+ {file = "ruff-0.8.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:13e9ec6d6b55f6da412d59953d65d66e760d583dd3c1c72bf1f26435b5bfdbae"},
+ {file = "ruff-0.8.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:97d9aefef725348ad77d6db98b726cfdb075a40b936c7984088804dfd38268a7"},
+ {file = "ruff-0.8.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ab78e33325a6f5374e04c2ab924a3367d69a0da36f8c9cb6b894a62017506111"},
+ {file = "ruff-0.8.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8ef06f66f4a05c3ddbc9121a8b0cecccd92c5bf3dd43b5472ffe40b8ca10f0f8"},
+ {file = "ruff-0.8.4-py3-none-win32.whl", hash = "sha256:552fb6d861320958ca5e15f28b20a3d071aa83b93caee33a87b471f99a6c0835"},
+ {file = "ruff-0.8.4-py3-none-win_amd64.whl", hash = "sha256:f21a1143776f8656d7f364bd264a9d60f01b7f52243fbe90e7670c0dfe0cf65d"},
+ {file = "ruff-0.8.4-py3-none-win_arm64.whl", hash = "sha256:9183dd615d8df50defa8b1d9a074053891ba39025cf5ae88e8bcb52edcc4bf08"},
+ {file = "ruff-0.8.4.tar.gz", hash = "sha256:0d5f89f254836799af1615798caa5f80b7f935d7a670fad66c5007928e57ace8"},
+]
+
+[[package]]
+name = "setuptools"
+version = "75.6.0"
+requires_python = ">=3.9"
+summary = "Easily download, build, install, upgrade, and uninstall Python packages"
+groups = ["default", "docs"]
+files = [
+ {file = "setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"},
+ {file = "setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6"},
+]
+
+[[package]]
+name = "sniffio"
+version = "1.3.1"
+requires_python = ">=3.7"
+summary = "Sniff out which async library your code is running under"
+groups = ["default", "docs"]
+files = [
+ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"},
+ {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
+]
+
+[[package]]
+name = "snowballstemmer"
+version = "2.2.0"
+summary = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
+groups = ["default", "docs"]
+files = [
+ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"},
+ {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"},
+]
+
+[[package]]
+name = "soupsieve"
+version = "2.6"
+requires_python = ">=3.8"
+summary = "A modern CSS selector implementation for Beautiful Soup."
+groups = ["default", "docs"]
+files = [
+ {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"},
+ {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"},
+]
+
+[[package]]
+name = "sphinx"
+version = "8.1.3"
+requires_python = ">=3.10"
+summary = "Python documentation generator"
+groups = ["default", "docs"]
+dependencies = [
+ "Jinja2>=3.1",
+ "Pygments>=2.17",
+ "alabaster>=0.7.14",
+ "babel>=2.13",
+ "colorama>=0.4.6; sys_platform == \"win32\"",
+ "docutils<0.22,>=0.20",
+ "imagesize>=1.3",
+ "packaging>=23.0",
+ "requests>=2.30.0",
+ "snowballstemmer>=2.2",
+ "sphinxcontrib-applehelp>=1.0.7",
+ "sphinxcontrib-devhelp>=1.0.6",
+ "sphinxcontrib-htmlhelp>=2.0.6",
+ "sphinxcontrib-jsmath>=1.0.1",
+ "sphinxcontrib-qthelp>=1.0.6",
+ "sphinxcontrib-serializinghtml>=1.1.9",
+ "tomli>=2; python_version < \"3.11\"",
+]
+files = [
+ {file = "sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2"},
+ {file = "sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927"},
+]
+
+[[package]]
+name = "sphinx-autobuild"
+version = "2024.10.3"
+requires_python = ">=3.9"
+summary = "Rebuild Sphinx documentation on changes, with hot reloading in the browser."
+groups = ["default", "docs"]
+dependencies = [
+ "colorama>=0.4.6",
+ "sphinx",
+ "starlette>=0.35",
+ "uvicorn>=0.25",
+ "watchfiles>=0.20",
+ "websockets>=11",
+]
+files = [
+ {file = "sphinx_autobuild-2024.10.3-py3-none-any.whl", hash = "sha256:158e16c36f9d633e613c9aaf81c19b0fc458ca78b112533b20dafcda430d60fa"},
+ {file = "sphinx_autobuild-2024.10.3.tar.gz", hash = "sha256:248150f8f333e825107b6d4b86113ab28fa51750e5f9ae63b59dc339be951fb1"},
+]
+
+[[package]]
+name = "sphinx-copybutton"
+version = "0.5.2"
+requires_python = ">=3.7"
+summary = "Add a copy button to each of your code cells."
+groups = ["default", "docs"]
+dependencies = [
+ "sphinx>=1.8",
+]
+files = [
+ {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"},
+ {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"},
+]
+
+[[package]]
+name = "sphinx-design"
+version = "0.6.1"
+requires_python = ">=3.9"
+summary = "A sphinx extension for designing beautiful, view size responsive web components."
+groups = ["default", "docs"]
+dependencies = [
+ "sphinx<9,>=6",
+]
+files = [
+ {file = "sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c"},
+ {file = "sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632"},
+]
+
+[[package]]
+name = "sphinx-minecraft"
+version = "1.0.1"
+requires_python = "==3.12.*"
+summary = "Add different Minecraft-oriented components to Sphinx."
+groups = ["default", "docs"]
+dependencies = [
+ "sphinx",
+ "sphinx-treeview==1.0.1",
+]
+files = [
+ {file = "sphinx_minecraft-1.0.1-py3-none-any.whl", hash = "sha256:4b139944ae93bce5d65e13c83625543382a8140565b5cbd841e3ae1a6b8a4294"},
+ {file = "sphinx_minecraft-1.0.1.tar.gz", hash = "sha256:e8430b749fecd31d61d9d9eff5e838318e8999ce4b81132cd4994012ad1f025d"},
+]
+
+[[package]]
+name = "sphinx-togglebutton"
+version = "0.3.2"
+summary = "Toggle page content and collapse admonitions in Sphinx."
+groups = ["default", "docs"]
+dependencies = [
+ "docutils",
+ "setuptools",
+ "sphinx",
+ "wheel",
+]
+files = [
+ {file = "sphinx-togglebutton-0.3.2.tar.gz", hash = "sha256:ab0c8b366427b01e4c89802d5d078472c427fa6e9d12d521c34fa0442559dc7a"},
+ {file = "sphinx_togglebutton-0.3.2-py3-none-any.whl", hash = "sha256:9647ba7874b7d1e2d43413d8497153a85edc6ac95a3fea9a75ef9c1e08aaae2b"},
+]
+
+[[package]]
+name = "sphinx-treeview"
+version = "1.0.1"
+requires_python = "==3.12.*"
+summary = "Add support for tree view to Sphinx."
+groups = ["default", "docs"]
+dependencies = [
+ "jinja2",
+ "sphinx",
+]
+files = [
+ {file = "sphinx_treeview-1.0.1-py3-none-any.whl", hash = "sha256:7ee0b2f531fbc9b3926c0934cf1e1263b3316186556f150d3c5e6095ea83ee7d"},
+ {file = "sphinx_treeview-1.0.1.tar.gz", hash = "sha256:78075d015d57d8f7d5b9c08ae309fdea871cf8eeb94a4aa5f8afe53b933d4c8a"},
+]
+
+[[package]]
+name = "sphinxcontrib-applehelp"
+version = "2.0.0"
+requires_python = ">=3.9"
+summary = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books"
+groups = ["default", "docs"]
+files = [
+ {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"},
+ {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"},
+]
+
+[[package]]
+name = "sphinxcontrib-devhelp"
+version = "2.0.0"
+requires_python = ">=3.9"
+summary = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents"
+groups = ["default", "docs"]
+files = [
+ {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"},
+ {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"},
+]
+
+[[package]]
+name = "sphinxcontrib-htmlhelp"
+version = "2.1.0"
+requires_python = ">=3.9"
+summary = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
+groups = ["default", "docs"]
+files = [
+ {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"},
+ {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"},
+]
+
+[[package]]
+name = "sphinxcontrib-jsmath"
+version = "1.0.1"
+requires_python = ">=3.5"
+summary = "A sphinx extension which renders display math in HTML via JavaScript"
+groups = ["default", "docs"]
+files = [
+ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"},
+ {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"},
+]
+
+[[package]]
+name = "sphinxcontrib-qthelp"
+version = "2.0.0"
+requires_python = ">=3.9"
+summary = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents"
+groups = ["default", "docs"]
+files = [
+ {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"},
+ {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"},
+]
+
+[[package]]
+name = "sphinxcontrib-serializinghtml"
+version = "2.0.0"
+requires_python = ">=3.9"
+summary = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)"
+groups = ["default", "docs"]
+files = [
+ {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"},
+ {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"},
+]
+
+[[package]]
+name = "starlette"
+version = "0.43.0"
+requires_python = ">=3.8"
+summary = "The little ASGI library that shines."
+groups = ["default", "docs"]
+dependencies = [
+ "anyio<5,>=3.4.0",
+ "typing-extensions>=3.10.0; python_version < \"3.10\"",
+]
+files = [
+ {file = "starlette-0.43.0-py3-none-any.whl", hash = "sha256:0e0a91f33c57b30820cbe0828f993df67f890f1e4ae48ed8080f24793446450c"},
+ {file = "starlette-0.43.0.tar.gz", hash = "sha256:d4887cfd776f8f925c1b140829da9f4c9b8d0973aa66a7cb2bcc48e9b3a69660"},
+]
+
+[[package]]
+name = "toml"
+version = "0.10.2"
+requires_python = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+summary = "Python Library for Tom's Obvious, Minimal Language"
+groups = ["default"]
+files = [
+ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
+ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
+]
+
+[[package]]
+name = "types-colorama"
+version = "0.4.15.20240311"
+requires_python = ">=3.8"
+summary = "Typing stubs for colorama"
+groups = ["dev"]
+files = [
+ {file = "types-colorama-0.4.15.20240311.tar.gz", hash = "sha256:a28e7f98d17d2b14fb9565d32388e419f4108f557a7d939a66319969b2b99c7a"},
+ {file = "types_colorama-0.4.15.20240311-py3-none-any.whl", hash = "sha256:6391de60ddc0db3f147e31ecb230006a6823e81e380862ffca1e4695c13a0b8e"},
+]
+
+[[package]]
+name = "types-docutils"
+version = "0.21.0.20241128"
+requires_python = ">=3.8"
+summary = "Typing stubs for docutils"
+groups = ["dev"]
+files = [
+ {file = "types_docutils-0.21.0.20241128-py3-none-any.whl", hash = "sha256:e0409204009639e9b0bf4521eeabe58b5e574ce9c0db08421c2ac26c32be0039"},
+ {file = "types_docutils-0.21.0.20241128.tar.gz", hash = "sha256:4dd059805b83ac6ec5a223699195c4e9eeb0446a4f7f2aeff1759a4a7cc17473"},
+]
+
+[[package]]
+name = "types-requests"
+version = "2.32.0.20241016"
+requires_python = ">=3.8"
+summary = "Typing stubs for requests"
+groups = ["dev"]
+dependencies = [
+ "urllib3>=2",
+]
+files = [
+ {file = "types-requests-2.32.0.20241016.tar.gz", hash = "sha256:0d9cad2f27515d0e3e3da7134a1b6f28fb97129d86b867f24d9c726452634d95"},
+ {file = "types_requests-2.32.0.20241016-py3-none-any.whl", hash = "sha256:4195d62d6d3e043a4eaaf08ff8a62184584d2e8684e9d2aa178c7915a7da3747"},
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.12.2"
+requires_python = ">=3.8"
+summary = "Backported and Experimental Type Hints for Python 3.8+"
+groups = ["default", "dev", "docs"]
+files = [
+ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
+ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
+]
+
+[[package]]
+name = "uc-micro-py"
+version = "1.0.3"
+requires_python = ">=3.7"
+summary = "Micro subset of unicode data files for linkify-it-py projects."
+groups = ["default", "docs"]
+files = [
+ {file = "uc-micro-py-1.0.3.tar.gz", hash = "sha256:d321b92cff673ec58027c04015fcaa8bb1e005478643ff4a500882eaab88c48a"},
+ {file = "uc_micro_py-1.0.3-py3-none-any.whl", hash = "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5"},
+]
+
+[[package]]
+name = "urllib3"
+version = "2.3.0"
+requires_python = ">=3.9"
+summary = "HTTP library with thread-safe connection pooling, file post, and more."
+groups = ["default", "dev", "docs"]
+files = [
+ {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"},
+ {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"},
+]
+
+[[package]]
+name = "uvicorn"
+version = "0.34.0"
+requires_python = ">=3.9"
+summary = "The lightning-fast ASGI server."
+groups = ["default", "docs"]
+dependencies = [
+ "click>=7.0",
+ "h11>=0.8",
+ "typing-extensions>=4.0; python_version < \"3.11\"",
+]
+files = [
+ {file = "uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4"},
+ {file = "uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9"},
+]
+
+[[package]]
+name = "watchfiles"
+version = "1.0.3"
+requires_python = ">=3.9"
+summary = "Simple, modern and high performance file watching and code reload in python."
+groups = ["default", "docs"]
+dependencies = [
+ "anyio>=3.0.0",
+]
+files = [
+ {file = "watchfiles-1.0.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:93436ed550e429da007fbafb723e0769f25bae178fbb287a94cb4ccdf42d3af3"},
+ {file = "watchfiles-1.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c18f3502ad0737813c7dad70e3e1cc966cc147fbaeef47a09463bbffe70b0a00"},
+ {file = "watchfiles-1.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a5bc3ca468bb58a2ef50441f953e1f77b9a61bd1b8c347c8223403dc9b4ac9a"},
+ {file = "watchfiles-1.0.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0d1ec043f02ca04bf21b1b32cab155ce90c651aaf5540db8eb8ad7f7e645cba8"},
+ {file = "watchfiles-1.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f58d3bfafecf3d81c15d99fc0ecf4319e80ac712c77cf0ce2661c8cf8bf84066"},
+ {file = "watchfiles-1.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1df924ba82ae9e77340101c28d56cbaff2c991bd6fe8444a545d24075abb0a87"},
+ {file = "watchfiles-1.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:632a52dcaee44792d0965c17bdfe5dc0edad5b86d6a29e53d6ad4bf92dc0ff49"},
+ {file = "watchfiles-1.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bf4b459d94a0387617a1b499f314aa04d8a64b7a0747d15d425b8c8b151da0"},
+ {file = "watchfiles-1.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ca94c85911601b097d53caeeec30201736ad69a93f30d15672b967558df02885"},
+ {file = "watchfiles-1.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:65ab1fb635476f6170b07e8e21db0424de94877e4b76b7feabfe11f9a5fc12b5"},
+ {file = "watchfiles-1.0.3-cp312-cp312-win32.whl", hash = "sha256:49bc1bc26abf4f32e132652f4b3bfeec77d8f8f62f57652703ef127e85a3e38d"},
+ {file = "watchfiles-1.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:48681c86f2cb08348631fed788a116c89c787fdf1e6381c5febafd782f6c3b44"},
+ {file = "watchfiles-1.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:9e080cf917b35b20c889225a13f290f2716748362f6071b859b60b8847a6aa43"},
+ {file = "watchfiles-1.0.3.tar.gz", hash = "sha256:f3ff7da165c99a5412fe5dd2304dd2dbaaaa5da718aad942dcb3a178eaa70c56"},
+]
+
+[[package]]
+name = "websockets"
+version = "14.1"
+requires_python = ">=3.9"
+summary = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
+groups = ["default", "docs"]
+files = [
+ {file = "websockets-14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed907449fe5e021933e46a3e65d651f641975a768d0649fee59f10c2985529ed"},
+ {file = "websockets-14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87e31011b5c14a33b29f17eb48932e63e1dcd3fa31d72209848652310d3d1f0d"},
+ {file = "websockets-14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc6ccf7d54c02ae47a48ddf9414c54d48af9c01076a2e1023e3b486b6e72c707"},
+ {file = "websockets-14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9777564c0a72a1d457f0848977a1cbe15cfa75fa2f67ce267441e465717dcf1a"},
+ {file = "websockets-14.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a655bde548ca98f55b43711b0ceefd2a88a71af6350b0c168aa77562104f3f45"},
+ {file = "websockets-14.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfff83ca578cada2d19e665e9c8368e1598d4e787422a460ec70e531dbdd58"},
+ {file = "websockets-14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6a6c9bcf7cdc0fd41cc7b7944447982e8acfd9f0d560ea6d6845428ed0562058"},
+ {file = "websockets-14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4b6caec8576e760f2c7dd878ba817653144d5f369200b6ddf9771d64385b84d4"},
+ {file = "websockets-14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb6d38971c800ff02e4a6afd791bbe3b923a9a57ca9aeab7314c21c84bf9ff05"},
+ {file = "websockets-14.1-cp312-cp312-win32.whl", hash = "sha256:1d045cbe1358d76b24d5e20e7b1878efe578d9897a25c24e6006eef788c0fdf0"},
+ {file = "websockets-14.1-cp312-cp312-win_amd64.whl", hash = "sha256:90f4c7a069c733d95c308380aae314f2cb45bd8a904fb03eb36d1a4983a4993f"},
+ {file = "websockets-14.1-py3-none-any.whl", hash = "sha256:4d4fc827a20abe6d544a119896f6b78ee13fe81cbfef416f3f2ddf09a03f0e2e"},
+ {file = "websockets-14.1.tar.gz", hash = "sha256:398b10c77d471c0aab20a845e7a60076b6390bfdaac7a6d2edb0d2c59d75e8d8"},
+]
+
+[[package]]
+name = "wheel"
+version = "0.45.1"
+requires_python = ">=3.8"
+summary = "A built-package format for Python"
+groups = ["default", "docs"]
+files = [
+ {file = "wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248"},
+ {file = "wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729"},
+]
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000000..3575d1a913
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,58 @@
+[build-system]
+requires = ["pdm-backend", "pdm-build-locked"]
+build-backend = "pdm.backend"
+
+[project]
+name = "bookshelf"
+version = "1.0.0"
+description = "Scripts for Bookshelf and the Github pipeline."
+authors = [{ name = "Bookshelf Contributors", email = "contact@gunivers.net" }]
+dependencies = [
+ "beet>=0.109.2",
+ "bookshelf[docs]",
+ "click>=8.1.8",
+ "colorama>=0.4.6",
+ "pydantic>=2.9.2",
+ "requests>=2.32.3",
+]
+requires-python = "==3.12.*"
+license = { text = "MPL-2.0" }
+
+[project.optional-dependencies]
+dev = [
+ "mypy>=1.13.0",
+ "ruff>=0.8.3",
+ "types-colorama>=0.4.15.20240311",
+ "types-docutils>=0.21.0.20241128",
+ "types-requests>=2.32.0.20241016",
+]
+docs = [
+ "linkify-it-py>=2.0.3",
+ "myst-parser>=4.0.0",
+ "pydata-sphinx-theme>=0.16.0",
+ "sphinx-autobuild>=2024.10.3",
+ "sphinx-copybutton>=0.5.2",
+ "sphinx-design>=0.6.1",
+ "sphinx-minecraft>=1.0.1",
+ "sphinx-togglebutton>=0.3.2",
+ "sphinx>=8.1.3",
+]
+
+[project.scripts]
+build = "core.cli.modules:build"
+docs = "core.cli.docs:docs"
+meta = "core.cli.meta:meta"
+modules = "core.cli.modules:modules"
+watch = "core.cli.modules:watch"
+
+[tool.mypy]
+files = ["core", "modules"]
+explicit_package_bases = true
+namespace_packages = true
+
+[tool.ruff]
+namespace-packages = ["core"]
+
+[tool.ruff.lint]
+select = ["ALL"]
+ignore = ["D100", "D203", "D213", "INP001", "S603", "UP017"]
diff --git a/region/r.-1.-1.mca b/region/r.-1.-1.mca
deleted file mode 100644
index 7260157a1b..0000000000
Binary files a/region/r.-1.-1.mca and /dev/null differ
diff --git a/region/r.-1.0.mca b/region/r.-1.0.mca
deleted file mode 100644
index 4151363264..0000000000
Binary files a/region/r.-1.0.mca and /dev/null differ
diff --git a/region/r.0.-1.mca b/region/r.0.-1.mca
deleted file mode 100644
index a2f13bcb0a..0000000000
Binary files a/region/r.0.-1.mca and /dev/null differ
diff --git a/region/r.0.0.mca b/region/r.0.0.mca
deleted file mode 100644
index 4fc2b7f22c..0000000000
Binary files a/region/r.0.0.mca and /dev/null differ
diff --git a/scripts/LICENSE b/scripts/LICENSE
deleted file mode 100644
index a612ad9813..0000000000
--- a/scripts/LICENSE
+++ /dev/null
@@ -1,373 +0,0 @@
-Mozilla Public License Version 2.0
-==================================
-
-1. Definitions
---------------
-
-1.1. "Contributor"
- means each individual or legal entity that creates, contributes to
- the creation of, or owns Covered Software.
-
-1.2. "Contributor Version"
- means the combination of the Contributions of others (if any) used
- by a Contributor and that particular Contributor's Contribution.
-
-1.3. "Contribution"
- means Covered Software of a particular Contributor.
-
-1.4. "Covered Software"
- means Source Code Form to which the initial Contributor has attached
- the notice in Exhibit A, the Executable Form of such Source Code
- Form, and Modifications of such Source Code Form, in each case
- including portions thereof.
-
-1.5. "Incompatible With Secondary Licenses"
- means
-
- (a) that the initial Contributor has attached the notice described
- in Exhibit B to the Covered Software; or
-
- (b) that the Covered Software was made available under the terms of
- version 1.1 or earlier of the License, but not also under the
- terms of a Secondary License.
-
-1.6. "Executable Form"
- means any form of the work other than Source Code Form.
-
-1.7. "Larger Work"
- means a work that combines Covered Software with other material, in
- a separate file or files, that is not Covered Software.
-
-1.8. "License"
- means this document.
-
-1.9. "Licensable"
- means having the right to grant, to the maximum extent possible,
- whether at the time of the initial grant or subsequently, any and
- all of the rights conveyed by this License.
-
-1.10. "Modifications"
- means any of the following:
-
- (a) any file in Source Code Form that results from an addition to,
- deletion from, or modification of the contents of Covered
- Software; or
-
- (b) any new file in Source Code Form that contains any Covered
- Software.
-
-1.11. "Patent Claims" of a Contributor
- means any patent claim(s), including without limitation, method,
- process, and apparatus claims, in any patent Licensable by such
- Contributor that would be infringed, but for the grant of the
- License, by the making, using, selling, offering for sale, having
- made, import, or transfer of either its Contributions or its
- Contributor Version.
-
-1.12. "Secondary License"
- means either the GNU General Public License, Version 2.0, the GNU
- Lesser General Public License, Version 2.1, the GNU Affero General
- Public License, Version 3.0, or any later versions of those
- licenses.
-
-1.13. "Source Code Form"
- means the form of the work preferred for making modifications.
-
-1.14. "You" (or "Your")
- means an individual or a legal entity exercising rights under this
- License. For legal entities, "You" includes any entity that
- controls, is controlled by, or is under common control with You. For
- purposes of this definition, "control" means (a) the power, direct
- or indirect, to cause the direction or management of such entity,
- whether by contract or otherwise, or (b) ownership of more than
- fifty percent (50%) of the outstanding shares or beneficial
- ownership of such entity.
-
-2. License Grants and Conditions
---------------------------------
-
-2.1. Grants
-
-Each Contributor hereby grants You a world-wide, royalty-free,
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark)
- Licensable by such Contributor to use, reproduce, make available,
- modify, display, perform, distribute, and otherwise exploit its
- Contributions, either on an unmodified basis, with Modifications, or
- as part of a Larger Work; and
-
-(b) under Patent Claims of such Contributor to make, use, sell, offer
- for sale, have made, import, and otherwise transfer either its
- Contributions or its Contributor Version.
-
-2.2. Effective Date
-
-The licenses granted in Section 2.1 with respect to any Contribution
-become effective for each Contribution on the date the Contributor first
-distributes such Contribution.
-
-2.3. Limitations on Grant Scope
-
-The licenses granted in this Section 2 are the only rights granted under
-this License. No additional rights or licenses will be implied from the
-distribution or licensing of Covered Software under this License.
-Notwithstanding Section 2.1(b) above, no patent license is granted by a
-Contributor:
-
-(a) for any code that a Contributor has removed from Covered Software;
- or
-
-(b) for infringements caused by: (i) Your and any other third party's
- modifications of Covered Software, or (ii) the combination of its
- Contributions with other software (except as part of its Contributor
- Version); or
-
-(c) under Patent Claims infringed by Covered Software in the absence of
- its Contributions.
-
-This License does not grant any rights in the trademarks, service marks,
-or logos of any Contributor (except as may be necessary to comply with
-the notice requirements in Section 3.4).
-
-2.4. Subsequent Licenses
-
-No Contributor makes additional grants as a result of Your choice to
-distribute the Covered Software under a subsequent version of this
-License (see Section 10.2) or under the terms of a Secondary License (if
-permitted under the terms of Section 3.3).
-
-2.5. Representation
-
-Each Contributor represents that the Contributor believes its
-Contributions are its original creation(s) or it has sufficient rights
-to grant the rights to its Contributions conveyed by this License.
-
-2.6. Fair Use
-
-This License is not intended to limit any rights You have under
-applicable copyright doctrines of fair use, fair dealing, or other
-equivalents.
-
-2.7. Conditions
-
-Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-in Section 2.1.
-
-3. Responsibilities
--------------------
-
-3.1. Distribution of Source Form
-
-All distribution of Covered Software in Source Code Form, including any
-Modifications that You create or to which You contribute, must be under
-the terms of this License. You must inform recipients that the Source
-Code Form of the Covered Software is governed by the terms of this
-License, and how they can obtain a copy of this License. You may not
-attempt to alter or restrict the recipients' rights in the Source Code
-Form.
-
-3.2. Distribution of Executable Form
-
-If You distribute Covered Software in Executable Form then:
-
-(a) such Covered Software must also be made available in Source Code
- Form, as described in Section 3.1, and You must inform recipients of
- the Executable Form how they can obtain a copy of such Source Code
- Form by reasonable means in a timely manner, at a charge no more
- than the cost of distribution to the recipient; and
-
-(b) You may distribute such Executable Form under the terms of this
- License, or sublicense it under different terms, provided that the
- license for the Executable Form does not attempt to limit or alter
- the recipients' rights in the Source Code Form under this License.
-
-3.3. Distribution of a Larger Work
-
-You may create and distribute a Larger Work under terms of Your choice,
-provided that You also comply with the requirements of this License for
-the Covered Software. If the Larger Work is a combination of Covered
-Software with a work governed by one or more Secondary Licenses, and the
-Covered Software is not Incompatible With Secondary Licenses, this
-License permits You to additionally distribute such Covered Software
-under the terms of such Secondary License(s), so that the recipient of
-the Larger Work may, at their option, further distribute the Covered
-Software under the terms of either this License or such Secondary
-License(s).
-
-3.4. Notices
-
-You may not remove or alter the substance of any license notices
-(including copyright notices, patent notices, disclaimers of warranty,
-or limitations of liability) contained within the Source Code Form of
-the Covered Software, except that You may alter any license notices to
-the extent required to remedy known factual inaccuracies.
-
-3.5. Application of Additional Terms
-
-You may choose to offer, and to charge a fee for, warranty, support,
-indemnity or liability obligations to one or more recipients of Covered
-Software. However, You may do so only on Your own behalf, and not on
-behalf of any Contributor. You must make it absolutely clear that any
-such warranty, support, indemnity, or liability obligation is offered by
-You alone, and You hereby agree to indemnify every Contributor for any
-liability incurred by such Contributor as a result of warranty, support,
-indemnity or liability terms You offer. You may include additional
-disclaimers of warranty and limitations of liability specific to any
-jurisdiction.
-
-4. Inability to Comply Due to Statute or Regulation
----------------------------------------------------
-
-If it is impossible for You to comply with any of the terms of this
-License with respect to some or all of the Covered Software due to
-statute, judicial order, or regulation then You must: (a) comply with
-the terms of this License to the maximum extent possible; and (b)
-describe the limitations and the code they affect. Such description must
-be placed in a text file included with all distributions of the Covered
-Software under this License. Except to the extent prohibited by statute
-or regulation, such description must be sufficiently detailed for a
-recipient of ordinary skill to be able to understand it.
-
-5. Termination
---------------
-
-5.1. The rights granted under this License will terminate automatically
-if You fail to comply with any of its terms. However, if You become
-compliant, then the rights granted under this License from a particular
-Contributor are reinstated (a) provisionally, unless and until such
-Contributor explicitly and finally terminates Your grants, and (b) on an
-ongoing basis, if such Contributor fails to notify You of the
-non-compliance by some reasonable means prior to 60 days after You have
-come back into compliance. Moreover, Your grants from a particular
-Contributor are reinstated on an ongoing basis if such Contributor
-notifies You of the non-compliance by some reasonable means, this is the
-first time You have received notice of non-compliance with this License
-from such Contributor, and You become compliant prior to 30 days after
-Your receipt of the notice.
-
-5.2. If You initiate litigation against any entity by asserting a patent
-infringement claim (excluding declaratory judgment actions,
-counter-claims, and cross-claims) alleging that a Contributor Version
-directly or indirectly infringes any patent, then the rights granted to
-You by any and all Contributors for the Covered Software under Section
-2.1 of this License shall terminate.
-
-5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-end user license agreements (excluding distributors and resellers) which
-have been validly granted by You or Your distributors under this License
-prior to termination shall survive termination.
-
-************************************************************************
-* *
-* 6. Disclaimer of Warranty *
-* ------------------------- *
-* *
-* Covered Software is provided under this License on an "as is" *
-* basis, without warranty of any kind, either expressed, implied, or *
-* statutory, including, without limitation, warranties that the *
-* Covered Software is free of defects, merchantable, fit for a *
-* particular purpose or non-infringing. The entire risk as to the *
-* quality and performance of the Covered Software is with You. *
-* Should any Covered Software prove defective in any respect, You *
-* (not any Contributor) assume the cost of any necessary servicing, *
-* repair, or correction. This disclaimer of warranty constitutes an *
-* essential part of this License. No use of any Covered Software is *
-* authorized under this License except under this disclaimer. *
-* *
-************************************************************************
-
-************************************************************************
-* *
-* 7. Limitation of Liability *
-* -------------------------- *
-* *
-* Under no circumstances and under no legal theory, whether tort *
-* (including negligence), contract, or otherwise, shall any *
-* Contributor, or anyone who distributes Covered Software as *
-* permitted above, be liable to You for any direct, indirect, *
-* special, incidental, or consequential damages of any character *
-* including, without limitation, damages for lost profits, loss of *
-* goodwill, work stoppage, computer failure or malfunction, or any *
-* and all other commercial damages or losses, even if such party *
-* shall have been informed of the possibility of such damages. This *
-* limitation of liability shall not apply to liability for death or *
-* personal injury resulting from such party's negligence to the *
-* extent applicable law prohibits such limitation. Some *
-* jurisdictions do not allow the exclusion or limitation of *
-* incidental or consequential damages, so this exclusion and *
-* limitation may not apply to You. *
-* *
-************************************************************************
-
-8. Litigation
--------------
-
-Any litigation relating to this License may be brought only in the
-courts of a jurisdiction where the defendant maintains its principal
-place of business and such litigation shall be governed by laws of that
-jurisdiction, without reference to its conflict-of-law provisions.
-Nothing in this Section shall prevent a party's ability to bring
-cross-claims or counter-claims.
-
-9. Miscellaneous
-----------------
-
-This License represents the complete agreement concerning the subject
-matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed only to the extent
-necessary to make it enforceable. Any law or regulation which provides
-that the language of a contract shall be construed against the drafter
-shall not be used to construe this License against a Contributor.
-
-10. Versions of the License
----------------------------
-
-10.1. New Versions
-
-Mozilla Foundation is the license steward. Except as provided in Section
-10.3, no one other than the license steward has the right to modify or
-publish new versions of this License. Each version will be given a
-distinguishing version number.
-
-10.2. Effect of New Versions
-
-You may distribute the Covered Software under the terms of the version
-of the License under which You originally received the Covered Software,
-or under the terms of any subsequent version published by the license
-steward.
-
-10.3. Modified Versions
-
-If you create software not governed by this License, and you want to
-create a new license for such software, you may create and use a
-modified version of this License if you rename the license and remove
-any references to the name of the license steward (except to note that
-such modified license differs from this License).
-
-10.4. Distributing Source Code Form that is Incompatible With Secondary
-Licenses
-
-If You choose to distribute Source Code Form that is Incompatible With
-Secondary Licenses under the terms of this version of the License, the
-notice described in Exhibit B of this License must be attached.
-
-Exhibit A - Source Code Form License Notice
--------------------------------------------
-
- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-If it is not possible or desirable to put the notice in a particular
-file, then You may include the notice in a location (such as a LICENSE
-file in a relevant directory) where a recipient would be likely to look
-for such a notice.
-
-You may add additional accurate notices of copyright ownership.
-
-Exhibit B - "Incompatible With Secondary Licenses" Notice
----------------------------------------------------------
-
- This Source Code Form is "Incompatible With Secondary Licenses", as
- defined by the Mozilla Public License, v. 2.0.
diff --git a/scripts/README.md b/scripts/README.md
deleted file mode 100644
index 505f253abe..0000000000
--- a/scripts/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Bookshelf Scripts
-
-Bookshelf Scripts require Python 3.12 or more.
-
-To be able to execute the scripts:
-
-```
-pip install -e .
-```
diff --git a/scripts/all.ipynb b/scripts/all.ipynb
deleted file mode 100644
index 6cd1ae1915..0000000000
--- a/scripts/all.ipynb
+++ /dev/null
@@ -1,190 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Installation"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "%pip install -e ."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Continuous Integration"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Test Datapacks"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import definitions\n",
- "import packtest\n",
- "\n",
- "packtest.run(definitions.MC_VERSION);"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Check Function Headers"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from checks.function_headers import check\n",
- "from files_provider.files_provider import FilesProvider\n",
- "\n",
- "check(FilesProvider().get_not_upstreamed_files().only_dp_artifacts().only_from_main_datapacks().remove_minecraft_namespaces().get_functions());"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Check Feature Tag"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from checks.feature_tag import check\n",
- "from files_provider.files_provider import FilesProvider\n",
- "\n",
- "check(FilesProvider().get_not_upstreamed_files().only_dp_artifacts().only_from_main_datapacks().remove_minecraft_namespaces().get_features());"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Check Module Metadata File"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from checks.module_metadata_file import check\n",
- "from files_provider.files_provider import FilesProvider\n",
- "\n",
- "check(FilesProvider().get_not_upstreamed_files().only_dp_artifacts().only_from_main_datapacks().remove_minecraft_namespaces().get_modules().get());"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Check Generated Metadata"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from checks.generated_metadata import check\n",
- "from files_provider.files_provider import FilesProvider\n",
- "\n",
- "check(FilesProvider().get_not_upstreamed_files().only_dp_artifacts().only_from_main_datapacks().remove_minecraft_namespaces().get_modules());"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "## Generators"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Features"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import definitions\n",
- "import generators\n",
- "\n",
- "generators.biome.generate(definitions.MC_VERSION)\n",
- "generators.block.generate(definitions.MC_VERSION)\n",
- "generators.hitbox.generate(definitions.MC_VERSION)\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Metadata"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import generators\n",
- "\n",
- "generators.metadata.generate();"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.12.0"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/scripts/pyproject.toml b/scripts/pyproject.toml
deleted file mode 100644
index 1dd35ce9dd..0000000000
--- a/scripts/pyproject.toml
+++ /dev/null
@@ -1,18 +0,0 @@
-[project]
-name = "bookshelf-scripts"
-version = "1.0.0"
-description = "Scripts to generate Bookshelf's files and for Github pipeline."
-authors = [
- { name = "Gunivers", email = "contact@gunivers.net" }
-]
-license = {file = "LICENSE" }
-dependencies = [
- "nbtlib==1.12.1",
- "pyyaml",
- "requests",
- "Jinja2",
- "colored"
-]
-
-[options]
-python_requires = ">=3.12"
diff --git a/scripts/src/checks/__init__.py b/scripts/src/checks/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/scripts/src/checks/feature_tag.py b/scripts/src/checks/feature_tag.py
deleted file mode 100644
index 2392cc0f90..0000000000
--- a/scripts/src/checks/feature_tag.py
+++ /dev/null
@@ -1,135 +0,0 @@
-from files_provider._types import Feature
-from files_provider.files_provider import Artifact
-from function_call_getter._types import (VisitableFeatureSet, VisitableFeature, Visitor)
-from function_call_getter.function_call_getter import FunctionCallGetter
-from functools import partial
-from logger import BaseLogger, new_logger
-import definitions
-import re
-
-
-date = {
- "date": {
- "optional": False,
- "type": "string",
- "syntax": r"^\d{4}/\d{2}/\d{2}$",
- },
- "minecraft_version": {
- "optional": False,
- "type": "string",
- "syntax": "^.*$",
- }
-}
-
-bookshelf_key = {
- "feature": {
- "optional": False,
- "type": "bool",
- "value": True,
- },
- "documentation": {
- "optional": False,
- "type": "string",
- "syntax": fr"^{re.escape(definitions.DOCUMENTATION_URL)}.*$",
- },
- "authors": {
- "optional": False,
- "type": "list",
- "tags": [ "not_empty" ],
- },
- "contributors": {
- "optional": True,
- "type": "list",
- "tags": [ "not_empty" ],
- },
- "created": {
- "optional": False,
- "type": "object",
- "elements": date,
- },
- "updated": {
- "optional": False,
- "type": "object",
- "elements": date,
- }
-}
-
-
-def check(artifact_paths: list[Artifact]) -> bool:
- """
- return True if errors were found
- """
- logger = new_logger()
- logger.step("📄 The following files will be reviewed:")
- logger.print(*[str(path.real_path.relative_to(definitions.ROOT_DIR)) for path in artifact_paths])
-
- getter = FunctionCallGetter()
-
- feature_set: VisitableFeatureSet = getter.build_function_call_tree(artifact_paths)
- logger.step(f"📦 Found {len(feature_set.features)} features:")
- logger.print(*[feature.mc_path for feature in feature_set.features])
-
- logger.step("⏳ Checking their specified metadata…")
-
- visitor = Visitor([VisitableFeature], partial(__callback, logger))
- visitor.visit(feature_set)
-
- return logger.done()
-
-
-def __callback(logger: BaseLogger, feature: VisitableFeature) -> bool:
- check_feature(Feature(feature.real_path, feature.mc_path, feature.content), logger)
- return True
-
-
-def check_feature(feature: Feature, logger: BaseLogger) -> dict:
- metadata = feature._content.get(definitions.FEATURE_TAG_NAMESPACE, None)
- if metadata is not None and metadata.get("feature", False):
- for key, value in bookshelf_key.items():
- __check_key(feature.mc_path, [definitions.FEATURE_TAG_NAMESPACE, key], value, metadata, logger)
- return feature._content.get(definitions.FEATURE_TAG_NAMESPACE)
-
-
-def __check_string(value, path: list[str], pattern: dict, tag_path: str, logger: BaseLogger):
- syntax = pattern.get("syntax", None)
- if syntax is not None and not re.match(syntax, value):
- logger.error(f"Invalid syntax for key '{".".join(path)}' in Bookshelf metadata of feature tag '{tag_path}'.")
-
-
-def __check_list(value, path: list[str], pattern: dict, tag_path: str, logger: BaseLogger):
- if not isinstance(value, list):
- logger.error(f"Key '{".".join(path)}' in Bookshelf metadata of feature tag '{tag_path}' should be a list.")
- elif "not_empty" in pattern.get("tags", []):
- if len(value) == 0:
- logger.error(f"Key '{".".join(path)}' in Bookshelf metadata of feature tag '{tag_path}' should not be empty.")
-
-
-def __check_object(value, path: list[str], pattern: dict, tag_path: str, logger: BaseLogger):
- if not isinstance(value, dict):
- logger.error(f"Key '{".".join(path)}' in Bookshelf metadata of feature tag '{tag_path}' should be an object.")
- else:
- for key, element in pattern.get("elements", {}).items():
- __check_key(tag_path, path + [key], element, value, logger)
-
-
-def __check_bool(value, path: list[str], pattern: dict, tag_path: str, logger: BaseLogger):
- if not isinstance(value, bool):
- logger.error(f"Key '{".".join(path)}' in Bookshelf metadata of feature tag '{tag_path}' should be a boolean.")
- elif value != pattern.get("value", False):
- logger.error(f"Key '{".".join(path)}' in Bookshelf metadata of feature tag '{tag_path}' should be {pattern.get('value', False)}.")
-
-
-def __check_key(tag_path: str, path: list[str], pattern: dict, obj: dict, logger: BaseLogger):
- type = pattern.get("type", None)
- value = obj.get(path[-1], None)
- if value is None and not pattern.get("optional", True):
- logger.error(f"Missing key '{".".join(path)}' in Bookshelf metadata of feature tag '{tag_path}'.")
- elif not pattern.get("optional", True):
- if type == "string":
- __check_string(value, path, pattern, tag_path, logger)
- elif type == "list":
- __check_list(value, path, pattern, tag_path, logger)
- elif type == "object":
- __check_object(value, path, pattern, tag_path, logger)
- elif type == "bool":
- __check_bool(value, path, pattern, tag_path, logger)
diff --git a/scripts/src/checks/function_headers.py b/scripts/src/checks/function_headers.py
deleted file mode 100644
index 166a105fc1..0000000000
--- a/scripts/src/checks/function_headers.py
+++ /dev/null
@@ -1,35 +0,0 @@
-from files_provider._types import Function
-from files_provider.files_provider import Artifact
-from generators.utils import render_template
-from logger import new_logger
-import definitions
-import re
-
-
-def check(artifact_paths: list[Artifact]) -> bool:
- """
- return True if errors were found
- """
- logger = new_logger()
- logger.step("📄 The following files will be reviewed:")
- logger.print(*[str(path.real_path.relative_to(definitions.ROOT_DIR)) for path in artifact_paths])
-
- logger.step("⏳ Checking the header of all the called function…")
-
- header_with_doc = render_template("header.jinja", doc="%REGEX%", is_feature=True)
- header_with_doc = re.escape(header_with_doc).replace("%REGEX%", rf"{re.escape(definitions.DOCUMENTATION_URL)}([-a-zA-Z0-9@:%_\+.~#?&//=]*)")
- header_without_doc = render_template("header.jinja")
- splitted_header_with_doc = header_with_doc.splitlines()
- splitted_header_without_doc = header_without_doc.splitlines()
-
- for artifact in artifact_paths:
- if isinstance(artifact, Function):
- content: list[str] = artifact.get_content()
-
- current_header_with_doc = "\n".join(content[0:len(splitted_header_with_doc)])
- current_header_without_doc = "\n".join(content[0:len(splitted_header_without_doc)])
-
- if current_header_without_doc != header_without_doc and not re.match(header_with_doc, current_header_with_doc):
- logger.error(f"Invalid header in function '{artifact.mc_path}'.")
-
- return logger.done()
diff --git a/scripts/src/checks/generated_metadata.py b/scripts/src/checks/generated_metadata.py
deleted file mode 100644
index 91fc8a223b..0000000000
--- a/scripts/src/checks/generated_metadata.py
+++ /dev/null
@@ -1,45 +0,0 @@
-from files_provider.files_provider import Feature, ModuleManager
-from function_call_getter._types import VisitableFeatureSet
-from function_call_getter.function_call_getter import FunctionCallGetter
-from functools import partial
-from logger import BaseLogger, new_logger
-from metadata.build_metadata import DatapackMetadata, build
-from generators.metadata import adapt_for_manifest, generate_feature_metadata, generate_manifest, generate_module_metadata, sort_metadata
-from pathlib import Path
-import definitions
-
-
-def check(module_manager: ModuleManager) -> bool:
- logger = new_logger()
- logger.step("🧩 The following modules will be analyzed:")
- logger.print(*[str(module.path.relative_to(definitions.ROOT_DIR)) for module in module_manager.get()])
-
- features: list[Feature] = module_manager.get_all_features()
- getter = FunctionCallGetter()
-
- feature_set: VisitableFeatureSet = getter.build_function_call_tree(features)
- logger.step(f"📦 Found {len(feature_set.features)} features:")
- logger.print(*[tag.mc_path for tag in feature_set.features])
-
- logger.step("⏳ Checking their metadata file…")
-
- metadata: list[DatapackMetadata] = build(logger)
- sort_metadata(metadata)
- for datapack in metadata:
- for module in datapack.modules:
- generate_module_metadata(module, partial(__comparing, logger))
- generate_feature_metadata(module.features, module.module_path, partial(__comparing, logger))
- generate_manifest(adapt_for_manifest(metadata), partial(__comparing, logger))
-
- return logger.done()
-
-
-def __comparing(logger: BaseLogger, content: str, path: Path):
- if not path.exists():
- logger.error(f"Metadata file '{path.relative_to(definitions.ROOT_DIR)}' was not generated. Please run the generator and retry after.")
- else:
- with open(path, "r") as file:
- if file.read().strip() != content:
- logger.error(f"Metadata file '{path.relative_to(definitions.ROOT_DIR)}' is outdated. Please run the generator and retry after.")
- else:
- logger.success(f"Metadata file '{path.relative_to(definitions.ROOT_DIR)}' is up-to-date.")
diff --git a/scripts/src/checks/module_metadata_file.py b/scripts/src/checks/module_metadata_file.py
deleted file mode 100644
index 3a1e432418..0000000000
--- a/scripts/src/checks/module_metadata_file.py
+++ /dev/null
@@ -1,114 +0,0 @@
-from files_provider.files_provider import Module
-from logger import BaseLogger, new_logger
-from pathlib import Path
-from typing import Callable
-import definitions
-import json
-import re
-
-
-def check_icon(name: str, path: str, logger: BaseLogger) -> bool:
- icon_path = path / ".metadata" / name
- if not icon_path.exists():
- logger.error(f"Icon '{name}' is missing at path '{path.relative_to(definitions.ROOT_DIR)}'.")
- return False
- return True
-
-
-lines = {
- "name": {
- "syntax": r"^bs\.[a-z0-1-_]+$",
- "optional": False,
- },
- "display_name": {
- "syntax": r"^.*$",
- "optional": False,
- },
- "description": {
- "syntax": r"^.*$",
- "optional": False,
- },
- "icon": {
- "syntax": r"^.*$",
- "validator": check_icon,
- "optional": True,
- "warning_if_missing": True,
- },
- "authors": {
- "optional": True,
- "can_be_empty": False,
- "elements": {
- "syntax": r"^.+$",
- },
- },
- "contributors": {
- "optional": True,
- "can_be_empty": False,
- "elements": {
- "syntax": r"^.+$",
- },
- },
- "documentation": {
- "syntax": fr"{re.escape(definitions.DOCUMENTATION_URL)}.*$",
- "optional": False,
- },
- "weak_dependencies": {
- "elements": {
- "syntax": r"^bs\.[a-z0-1-_]+$",
- },
- "optional": True,
- },
-}
-
-
-def check(modules: list[Module]) -> bool:
- logger = new_logger()
- logger.step("🧩 The following modules will be analyzed:")
- logger.print(*[str(module.path.relative_to(definitions.ROOT_DIR)) for module in modules])
-
- logger.step("⏳ Checking their metadata file…")
- for module in modules:
- logger.print(f"Checking module '{module.path.relative_to(definitions.ROOT_DIR)}'.")
- check_module(module, logger)
-
- return logger.done()
-
-
-def check_module(module: Module, logger: BaseLogger) -> dict:
- metadata_path = module.path / ".metadata" / "module.json"
- path = module.path.relative_to(definitions.ROOT_DIR)
- if not metadata_path.exists():
- logger.error(f"Metadata file not found for module '{path}'.")
- else:
- with open(metadata_path, "r") as f:
- content = json.load(f)
- check_metadata_json(content, module.path, logger)
- if not logger.has_level_errors():
- return content
-
-
-def check_metadata_json(yaml: dict, path: Path, logger: BaseLogger):
- relative_path = path.relative_to(definitions.ROOT_DIR)
- for key, value in lines.items():
- key_value = yaml.get(key, None)
- if not key_value and not value["optional"]:
- logger.error(f"Metadata file for module '{relative_path}' is missing required key '{key}'.")
- elif key_value:
- if not value.get("can_be_empty", False) and len(key_value) == 0:
- logger.error(f"Metadata file for module '{relative_path}' has an empty value for key '{key}'.")
- elif value.get("elements", None):
- for element in key_value:
- __check_metadata_value(key, element, value["elements"]["syntax"], path, value.get("validator", None), logger)
- else:
- __check_metadata_value(key, key_value, value["syntax"], path, value.get("validator", None), logger)
- else:
- if value.get("warning_if_missing", False):
- logger.warning(f"Metadata file for module '{relative_path}' is missing optional key '{key}'. You should consider adding it.")
-
-
-def __check_metadata_value(key: str, value: str, syntax: str, path: str, validator: Callable[[str, str, BaseLogger], bool] | None, logger: BaseLogger):
- if not re.match(syntax, value):
- relative_path = path.relative_to(definitions.ROOT_DIR)
- logger.error(f"Metadata file for module '{relative_path}' has an invalid value for '{key}'. Found '{value}', should match regex '{syntax}'.")
- if validator:
- validator(value, path, logger)
diff --git a/scripts/src/definitions.py b/scripts/src/definitions.py
deleted file mode 100644
index 43bfbef182..0000000000
--- a/scripts/src/definitions.py
+++ /dev/null
@@ -1,16 +0,0 @@
-import yaml
-from pathlib import Path
-
-
-ROOT_DIR: Path = Path(__file__).parent.parent.parent.resolve()
-
-with open(ROOT_DIR / ".env.yml", 'r') as file:
- config = yaml.safe_load(file)
- MC_VERSION = config['mc_version']
- DOCUMENTATION_URL: str = config['documentation_url']
- METADATA_FOLDER: str = config['metadata_folder']
- FEATURE_TAG_NAMESPACE: str = config['feature_tag_namespace']
- BUILD_PATH: Path = ROOT_DIR / config['build_path']
- DATAPACKS_PATH: Path = ROOT_DIR / config['datapacks_path']
- GENERATED_PATH: Path = ROOT_DIR / config['generated_path']
- BOOKSHELF_LIBS: list[str] = config['bookshelf_libs']
diff --git a/scripts/src/files_provider/__init__.py b/scripts/src/files_provider/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/scripts/src/files_provider/_types.py b/scripts/src/files_provider/_types.py
deleted file mode 100644
index 719d36f72f..0000000000
--- a/scripts/src/files_provider/_types.py
+++ /dev/null
@@ -1,98 +0,0 @@
-from abc import ABC, abstractmethod
-from dataclasses import dataclass
-from enum import Enum
-from pathlib import Path
-from typing import Optional
-import json
-import os
-
-
-class Artifact[T](ABC):
- namespace: str
- name: str
- real_path: Path
- mc_path: str
- _content: T
-
- def __init__(self, real_path: Path, mc_path: str) -> None:
- self.real_path = real_path
- self.mc_path = mc_path
- self.namespace = mc_path.split(":")[0]
- self.name = mc_path.split(":")[1]
- self._content = None
-
- @abstractmethod
- def __load__(self) -> T:
- pass
-
- def get_content(self) -> T:
- if not self._content:
- self._content = self.__load__()
- return self._content
-
-
-class Function(Artifact[list[str]]):
-
- def __init__(self, real_path: Path, mc_path: str):
- super().__init__(real_path, mc_path)
-
- def __load__(self) -> list[str]:
- with open(self.real_path, mode='r', encoding='utf-8') as f:
- return f.read().splitlines()
-
-
-class Tag(Artifact[dict]):
-
- def __init__(self, real_path: Path, mc_path: str):
- super().__init__(real_path, mc_path)
-
- def __load__(self) -> dict:
- with open(self.real_path, mode='r', encoding='utf-8') as f:
- return json.load(f)
-
-
-class Feature(Artifact[dict]):
-
- def __init__(self, real_path: Path, mc_path: str, content: dict):
- super().__init__(real_path, mc_path)
- self._content = content
-
- def __load__(self) -> dict:
- return self._content
-
-
-@dataclass
-class DataCategoryValue:
- path_fragment: str
- clazz: type
- extension: str
- mc_path_prefix: str
-
-class DataCategory(Enum):
- FUNCTION = DataCategoryValue("function", Function, ".mcfunction", "#")
- FUN_TAG = DataCategoryValue(os.path.join("tags", "function"), Tag, ".json", "")
-
-
-def build_artifact(real_path: Path) -> Optional[Artifact]:
- from files_provider.utils import parse_real_path
- result = parse_real_path(real_path)
- if result:
- return result[1].value.clazz(real_path, result[0])
- return None
-
-
-@dataclass
-class Module:
- namespace: str
- path: Path
-
- def __hash__(self):
- return hash(self.path)
-
-@dataclass
-class Datapack:
- name: str
- path: Path
-
- def __hash__(self):
- return hash(self.path)
diff --git a/scripts/src/files_provider/files_provider.py b/scripts/src/files_provider/files_provider.py
deleted file mode 100644
index c792280788..0000000000
--- a/scripts/src/files_provider/files_provider.py
+++ /dev/null
@@ -1,163 +0,0 @@
-from dataclasses import dataclass
-from files_provider._types import (
- Artifact,
- DataCategory,
- Datapack,
- Feature,
- Function,
- Module,
- Tag,
- build_artifact,
-)
-from files_provider.utils import get_module_path
-from pathlib import Path
-from typing import Callable
-from typing import cast
-import definitions
-import glob
-import json
-import os
-import subprocess
-
-
-
-class Manager[T]:
-
- _content: list[T]
-
- def map[U](self, function: Callable[[T], U]):
- self._content = list(map(function, self._content))
-
- def filter(self, function: Callable[[T], bool]):
- self._content = list(filter(function, self._content))
-
- def get(self) -> list[T]:
- return self._content
-
-
-@dataclass
-class DatapackManager(Manager[Datapack]):
-
- def __init__(self, datapacks: list[Datapack]):
- self._content = datapacks
-
- def get_modules(self) -> 'ModuleManager':
- modules: list[Module] = list()
- for datapack in self._content:
- modules.extend([
- Module(module.name, Path(module.path))
- for module in os.scandir(datapack.path / 'data')
- if module.is_dir() and module.name != 'minecraft'
- ])
- return ModuleManager(modules)
-
- def get_separated_modules(self) -> list['ModuleManager']:
- modules = self.get_modules().get()
- result: list[ModuleManager] = []
- for module in modules:
- result.append(ModuleManager([module]))
- return result
-
-
-@dataclass
-class ModuleManager(Manager[Module]):
-
- def __init__(self, modules: list[Module]):
- self._content = modules
-
- def get_all_features(self) -> list[Feature]:
- features: list[Feature] = []
- for module in self._content:
- for file in glob.glob(pathname="tags/function/**/*.json", root_dir=module.path, recursive=True):
- artifact = build_artifact(Path(os.path.join(module.path, file)))
- artifact.get_content()
- bookshelf_tag = cast(Tag, artifact)._content.get(definitions.FEATURE_TAG_NAMESPACE, None)
- if isinstance(artifact, Tag) and bookshelf_tag is not None and bookshelf_tag.get('feature', False):
- features.append(Feature(artifact.real_path, artifact.mc_path, artifact._content))
- return features
-
-
-class ArtifactManager(Manager[Artifact]):
-
- def __init__(self, artifacts: list[Artifact]):
- self._content = artifacts
-
- def get_modules(self) -> ModuleManager:
- modules: set[Module] = set()
- for artifact in self._content:
- modules.add(Module(artifact.namespace, get_module_path(artifact.namespace, artifact.real_path)))
- return ModuleManager(modules)
-
- def get_features(self) -> list[Feature]:
- features: list[Feature] = []
- for artifact in self._content:
- if isinstance(artifact, Tag) and cast(Tag, artifact).get_content().get('values', False):
- features.append(artifact)
- return features
-
- def get_functions(self) -> list[Artifact]:
- return list(filter(lambda artifact: isinstance(artifact, Function), self._content))
-
- def remove_minecraft_namespaces(self) -> 'ArtifactManager':
- self.filter(lambda artifact: artifact.namespace != 'minecraft')
- return self
-
- def only_from_main_datapacks(self) -> 'ArtifactManager':
- self.filter(lambda artifact: artifact.real_path.relative_to(definitions.ROOT_DIR).parts[1] in definitions.BOOKSHELF_LIBS)
- return self
-
-
-class FilePathsManager(Manager[Path]):
-
- def __init__(self, files: list[Path]):
- self._content = files
-
- def only_dp_artifacts(self) -> ArtifactManager:
- possible_extensions = [cat.value.extension for cat in DataCategory]
- file_paths: list[Path] = list(filter(lambda file_path: file_path.relative_to(definitions.ROOT_DIR).parts[0] == 'datapacks' and file_path.suffix in possible_extensions, self._content))
- result: list[Artifact] = []
- for file_path in file_paths:
- artifact = build_artifact(file_path)
- if artifact:
- result.append(artifact)
- return ArtifactManager(result)
-
-
-ignore_datapacks = ["Bookshelf Examples", "Bookshelf World"]
-
-class FilesProvider:
-
- def get_not_merged_pr_files(self) -> FilePathsManager:
- workspace = os.getenv('GITHUB_WORKSPACE')
- event = os.getenv('GITHUB_EVENT')
-
- body = json.loads(event)
- baseSHA = body['pull_request']['base']['sha']
- headSHA = body['pull_request']['head']['sha']
-
- gitLogCommand = f"git diff --name-only --diff-filter=d {baseSHA}...{headSHA}"
- result = subprocess.check_output(gitLogCommand, encoding='utf-8', shell=True)
-
- return FilePathsManager([ Path(workspace) / path for path in result.splitlines() ])
-
- def get_not_upstreamed_files(self) -> FilePathsManager:
- headSHA = subprocess.check_output("git rev-parse HEAD", encoding='utf-8', shell=True)
- baseSHA = subprocess.check_output("git rev-parse origin/master", encoding='utf-8', shell=True)
-
- gitLogCommand = f"git diff --name-only --diff-filter=d {baseSHA}...{headSHA}"
- result = subprocess.check_output(gitLogCommand, encoding='utf-8', shell=True)
- return FilePathsManager([ definitions.ROOT_DIR / path for path in result.splitlines() ])
-
- def datapacks(self) -> DatapackManager:
- return DatapackManager([
- Datapack(datapack.name, Path(datapack.path))
- for datapack in os.scandir(definitions.DATAPACKS_PATH)
- if datapack.is_dir() and datapack.name not in ignore_datapacks
- ])
-
- def separated_datapacks(self) -> list[DatapackManager]:
- datapacks = self.datapacks().get()
- result: list[DatapackManager] = []
- for datapack in datapacks:
- result.append(DatapackManager([datapack]))
- return result
diff --git a/scripts/src/files_provider/utils.py b/scripts/src/files_provider/utils.py
deleted file mode 100644
index 6818cfc0c7..0000000000
--- a/scripts/src/files_provider/utils.py
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-import os
-from pathlib import Path
-import sys
-from typing import Optional
-import definitions
-from files_provider.files_provider import DataCategory
-
-
-def get_module_path(namespace: str, path: Path) -> Path:
- """return the path of the module containing the file"""
- return Path(path.as_posix().split(namespace)[0] + namespace)
-
-
-def parse_real_path(path: Path) -> tuple[str, 'DataCategory']:
- """return Minecraft path and the data category (function, function tag, …)"""
- # Get path relative to root of the repository
- relative_path = path.relative_to(definitions.ROOT_DIR)
- # Split path such as fourth element is the namespace and fifth is the remaining path
- splitted_path = str(relative_path).split(os.path.sep, 4)
- namespace = splitted_path[3]
- relative_path = splitted_path[4]
- for category in DataCategory:
- if relative_path.startswith(category.value.path_fragment):
- fragment_path = relative_path.removeprefix(category.value.path_fragment + os.path.sep).removesuffix(category.value.extension)
- return namespace.removeprefix(category.value.mc_path_prefix) + ':' + fragment_path, category
-
-
-def resolve_function_path(path: str) -> Optional[Path]:
- if path.startswith("#"):
- path = path.removeprefix("#")
- category = DataCategory.FUN_TAG
- else:
- category = DataCategory.FUNCTION
- partial_path = path.replace(":", os.path.sep + category.value.path_fragment + os.path.sep)
- for lib in definitions.BOOKSHELF_LIBS:
- path = os.path.join(definitions.DATAPACKS_PATH, lib, "data", partial_path + category.value.extension)
- if os.path.exists(path):
- return Path(path)
- print(f"❌ function '{os.path.abspath(path)}' cannot be resolved", file=sys.stderr)
- raise
-
-
-def extract_tag_values(values: dict) -> list[str]:
- result = []
- for value in values:
- if isinstance(value, dict):
- result.append(value.get('id'))
- else:
- result.append(value)
- return result
diff --git a/scripts/src/function_call_getter/__init__.py b/scripts/src/function_call_getter/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/scripts/src/function_call_getter/_types.py b/scripts/src/function_call_getter/_types.py
deleted file mode 100644
index c2ab0a6000..0000000000
--- a/scripts/src/function_call_getter/_types.py
+++ /dev/null
@@ -1,132 +0,0 @@
-from dataclasses import dataclass
-from pathlib import Path
-from typing import Callable, Type
-from files_provider._types import Function, Artifact, Tag, Feature, build_artifact
-from files_provider.utils import extract_tag_values, resolve_function_path
-
-@dataclass
-class Visitable:
- def __accept__(self, visitor: 'Visitor') -> None:
- pass
-
-@dataclass
-class VisitableFeatureSet(Visitable):
- features: list['VisitableFeature']
-
- def __accept__(self, visitor: 'Visitor') -> None:
- for feature in self.features:
- visitor.visit(feature)
-
-@dataclass
-class VisitableFeature(Visitable):
- name: str
- namespace: str
- mc_path: str
- called_functions: list['VisitableAbstractFunction']
- real_path: Path
- content: dict
- __browsed_functions__: list[Function]
- __unread_functions__: list[Function]
-
- def __init__(self, feature: Feature):
- self.name = feature.name
- self.namespace = feature.namespace
- self.mc_path = feature.mc_path
- self.real_path = feature.real_path
- self.called_functions = []
- self.__browsed_functions__ = []
- self.content = feature._content
- self.__unread_functions__ = [build_artifact(resolve_function_path(fun)) for fun in extract_tag_values(feature._content.get('values', False))]
-
- def __accept__(self, visitor: 'Visitor') -> None:
- for called_function in self.called_functions:
- visitor.visit(called_function)
-
- def __hash__(self):
- return hash(self.mc_path)
-
- def __eq__(self, other: object):
- if not isinstance(other, VisitableFeature):
- return False
- return self.mc_path == other.mc_path
-
-@dataclass
-class VisitableAbstractFunction(Visitable):
- namespace: str
- mc_path: str
- real_path: str
- feature: VisitableFeature
- called_functions: list['VisitableAbstractFunction']
-
- def __init__(self, artifact: Artifact, feature: VisitableFeature):
- self.real_path = artifact.real_path
- self.namespace = artifact.namespace
- self.mc_path = artifact.mc_path
- self.feature = feature
- self.called_functions = []
-
- def __accept__(self, visitor: 'Visitor') -> None:
- for called_function in self.called_functions:
- visitor.visit(called_function)
-
-
-@dataclass
-class VisitableFunction(VisitableAbstractFunction):
-
- content: list[str]
-
- def __init__(self, function: Function, feature: VisitableFeature):
- super().__init__(function, feature)
- self.content = function.get_content()
-
- def __hash__(self):
- return hash(self.real_path)
-
- def __eq__(self, other: object):
- if not isinstance(other, VisitableAbstractFunction):
- return False
- return self.real_path == other.real_path
-
-@dataclass
-class VisitableFunctionTag(VisitableAbstractFunction):
-
- content: dict
-
- def __init__(self, tag: Tag, feature: VisitableFeature):
- super().__init__(tag, feature)
- self.content = tag.get_content()
-
- def __hash__(self):
- return hash(self.real_path)
-
- def __eq__(self, other: object):
- if not isinstance(other, VisitableAbstractFunction):
- return False
- return self.real_path == other.real_path
-
-def build_abstract_function(artifact: Artifact, feature: VisitableFeature) -> VisitableAbstractFunction:
- if isinstance(artifact, Tag):
- return VisitableFunctionTag(artifact, feature)
- else:
- return VisitableFunction(artifact, feature)
-
-class Visitor:
-
- match_types: list[Type[Visitable]] = []
- callback: Callable[[Visitable], None]
-
- def __init__(self, match_types: list[Type[Visitable]] , callback: Callable[[Visitable], bool]):
- """
- :param match_types: List of types on which the callback will be called
- :param callback: Callback function, takes a Visitable and return a boolean. If the return is True, prune the visit
- """
- self.callback = callback
- self.match_types = match_types
-
- def visit(self, visitable: Visitable) -> None:
- prune = False
- for match_type in self.match_types:
- if isinstance(visitable, match_type):
- prune = self.callback(visitable)
- if not prune:
- visitable.__accept__(self)
diff --git a/scripts/src/function_call_getter/function_call_getter.py b/scripts/src/function_call_getter/function_call_getter.py
deleted file mode 100644
index f444023735..0000000000
--- a/scripts/src/function_call_getter/function_call_getter.py
+++ /dev/null
@@ -1,80 +0,0 @@
-import os
-import json
-import re
-from function_call_getter._types import (
- Artifact,
- Feature,
- VisitableAbstractFunction,
- VisitableFeature,
- VisitableFeatureSet,
- VisitableFunction,
- VisitableFunctionTag,
- build_abstract_function,
- build_artifact,
-)
-from files_provider.utils import resolve_function_path
-
-regex = r"(?:^|\brun(?:\s|\\)+\b|\$)function(?:\s|\\)+(#?[a-z0-9-\/:_\.]+)(?:\s|$)"
-
-class FunctionCallGetter:
-
- error = False
- __cache__: VisitableFeatureSet = None
-
- def build_function_call_tree(self, features: list[Feature]) -> VisitableFeatureSet:
- self.error = False
-
- if not self.__cache__:
-
- visitableFeatures: list[VisitableFeature] = []
-
- for feature in features:
- feature = VisitableFeature(feature)
- for fun in feature.__unread_functions__:
- function = build_abstract_function(fun, feature)
- feature.called_functions.append(function)
- self.browse_function_locator(function)
- visitableFeatures.append(feature)
-
- self.__cache__ = VisitableFeatureSet(visitableFeatures)
-
- return self.__cache__
-
-
- def browse_function_locator(self, function: VisitableAbstractFunction):
- if function.mc_path not in function.feature.__browsed_functions__:
- if isinstance(function, VisitableFunctionTag):
- self.browse_function_tag(function)
- else:
- self.browse_function(function)
-
- def browse_function_tag(self, function: VisitableFunctionTag):
- with open(os.path.join(function.real_path), encoding="utf-8") as file:
- content = json.load(file).get('values', False)
- for fun in content:
- artifact: Artifact = build_artifact(resolve_function_path(fun['id'] if isinstance(fun, dict) else fun))
- artifact.get_content()
- self.browse_function_locator(build_abstract_function(artifact, function.feature))
-
-
- def browse_function(self, function: VisitableFunction):
- result: list[VisitableAbstractFunction] = []
- # Inline multi-lines commands
- content = "\n".join(function.content)
- content = content.replace(r"\\\s*" + os.linesep, "")
- function.content = content.splitlines()
- for line in function.content:
- funs: list[str] = re.findall(regex, line)
- for fun in funs:
- # Remove function call with macro variable inside
- if "$" not in fun:
- from files_provider._types import build_artifact
- artifact: Artifact = build_artifact(resolve_function_path(fun))
- artifact.get_content()
- visitable_called_function: VisitableAbstractFunction = build_abstract_function(artifact, function.feature)
- result.append(visitable_called_function)
- function.called_functions = result
- function.feature.__browsed_functions__.append(function.mc_path)
-
- for fun in result:
- self.browse_function_locator(fun)
diff --git a/scripts/src/generators/__init__.py b/scripts/src/generators/__init__.py
deleted file mode 100644
index 6118a29c07..0000000000
--- a/scripts/src/generators/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from . import block
-from . import biome
-from . import hitbox
-from . import metadata
diff --git a/scripts/src/generators/biome.py b/scripts/src/generators/biome.py
deleted file mode 100644
index f5ee983fef..0000000000
--- a/scripts/src/generators/biome.py
+++ /dev/null
@@ -1,65 +0,0 @@
-from collections import defaultdict
-from functools import partial
-from generators.utils import render_json, render_snbt, render_template, write_file, write_nbt
-from logger import BaseLogger, new_logger
-from mcdata.biome import get_biomes
-from pathlib import Path
-from typing import Callable
-import definitions
-import math
-
-
-def generate(mc_version: str, logger: BaseLogger = new_logger()):
- logger.step("🚀 Fetching 'bs.biome' data…")
- biomes = get_biomes(mc_version)
-
- logger.step("⚙️ Generating 'bs.biome' files…")
- generate_biomes_storage(biomes, partial(write_nbt, ".data.contents.const.biome"))
- logger.success("Storage 'command_storage_bs.dat' updated!")
- generate_biomes_table_function(biomes, write_file)
- logger.success("Function 'biomes_table.mcfunction' generated!")
- generate_can_snow_predicate(biomes, write_file)
- logger.success("Predicate 'can_snow.json' generated!")
- generate_biome_tags(biomes, write_file)
- logger.success("Biome tags generated!")
-
- logger.done()
-
-
-def generate_biomes_storage(biomes: list[dict], consumer: Callable[[str, Path], None]):
- file_path = definitions.GENERATED_PATH / "command_storage_bs.dat"
- consumer(render_snbt(biomes), file_path)
-
-
-def generate_biomes_table_function(biomes: list[dict], consumer: Callable[[str, Path], None]):
- file_path = definitions.DATAPACKS_PATH / "Bookshelf/data/bs.biome/function/load/biomes_table.mcfunction"
- consumer(render_template("biome/biomes_table.jinja", biomes=biomes), file_path)
-
-
-def generate_biome_tags(biomes: list[dict], consumer: Callable[[str, Path], None]):
- dir_path = definitions.DATAPACKS_PATH / "Bookshelf/data/bs.biome/tags/worldgen/biome"
- file_path = dir_path / "has_precipitation.json"
- consumer(render_json({ "values": [biome["type"] for biome in biomes if biome["has_precipitation"]] }), file_path)
-
- for b in range(math.floor(math.log2(len(biomes))) + 1):
- file_path = dir_path / f"type/group_{2**b}.json"
- consumer(render_json({ "values": [biome["type"] for i, biome in enumerate(biomes, 1) if (i >> b) & 1] }), file_path)
-
-
-def generate_can_snow_predicate(biomes: list[dict], consumer: Callable[[str, Path], None]):
- file_path = definitions.DATAPACKS_PATH / "Bookshelf/data/bs.biome/predicate/can_snow.json"
- groups = defaultdict(list)
- for biome in [biome for biome in biomes if biome["temperature"] < 0.4]:
- y = int((biome["temperature"] - 0.15) / 0.00125 + 80)
- groups[y if y > 0 else -2147483648].append(biome['type'])
-
- consumer(render_json({
- "condition":"minecraft:any_of",
- "terms": [{
- "condition": "minecraft:location_check",
- "predicate": {
- "position": { "y": { "min": y } },
- "biomes": biomes
- }
- } for y, biomes in dict(sorted(groups.items())).items()]
- }), file_path)
diff --git a/scripts/src/generators/block.py b/scripts/src/generators/block.py
deleted file mode 100644
index c877960232..0000000000
--- a/scripts/src/generators/block.py
+++ /dev/null
@@ -1,155 +0,0 @@
-from functools import partial
-from generators.utils import render_json,render_snbt,render_template,write_file,write_nbt
-from logger import BaseLogger, new_logger
-from mcdata.block import get_blocks
-from pathlib import Path
-from typing import Callable
-import definitions
-
-
-def generate(mc_version: str, logger: BaseLogger = new_logger()):
- logger.step("🚀 Fetching 'bs.block' data…")
- blocks = get_blocks(mc_version)
-
- logger.step("⚙️ Generating 'bs.block' files…")
- generate_blocks_storage(blocks, partial(write_nbt, ".data.contents.const.block"))
- logger.success("Storage 'command_storage_bs.dat' updated!")
- generate_types_table_function(blocks, write_file)
- logger.success("Function 'types_table.mcfunction' generated!")
- generate_items_table_function(blocks, write_file)
- logger.success("Function 'items_table.mcfunction' generated!")
- generate_groups_table_function(blocks, write_file)
- logger.success("Function 'groups_table.mcfunction' generated!")
- generate_has_state_block_tag(blocks, write_file)
- logger.success("Block tag 'has_state.json' generated!")
- generate_loot_tables(blocks, write_file)
- logger.success("Loot tables generated!")
-
- logger.done()
-
-
-def generate_blocks_storage(blocks: list[dict], consumer: Callable[[str, Path], None]):
- consumer(render_snbt({
- "types": format_types_table(blocks),
- "items": format_items_table(blocks),
- "groups": format_groups_table(blocks),
- }), definitions.GENERATED_PATH / "command_storage_bs.dat")
-
-
-def generate_types_table_function(blocks: list[dict], consumer: Callable[[str, Path], None]):
- consumer(render_template(
- "block/types_table.jinja",
- types=format_types_table(blocks)
- ), definitions.DATAPACKS_PATH / "Bookshelf/data/bs.block/function/load/types_table.mcfunction")
-
-
-def generate_items_table_function(blocks: list[dict], consumer: Callable[[str, Path], None]):
- consumer(render_template(
- "block/items_table.jinja",
- items=format_items_table(blocks)
- ), definitions.DATAPACKS_PATH / "Bookshelf/data/bs.block/function/load/items_table.mcfunction")
-
-
-def generate_groups_table_function(blocks: list[dict], consumer: Callable[[str, Path], None]):
- consumer(render_template(
- "block/groups_table.jinja",
- groups=format_groups_table(blocks)
- ), definitions.DATAPACKS_PATH / "Bookshelf/data/bs.block/function/load/groups_table.mcfunction")
-
-
-def generate_has_state_block_tag(blocks: list[dict], consumer: Callable[[str, Path], None]):
- consumer(render_json(
- {"values": [block["type"] for block in blocks if block["group"] > 0]}
- ), definitions.DATAPACKS_PATH / "Bookshelf/data/bs.block/tags/block/has_state.json")
-
-
-def generate_loot_tables(blocks: list[dict], consumer: Callable[[str, Path], None]):
- consumer(render_json(
- format_types_loot_table(blocks),
- indent=None,
- ), definitions.DATAPACKS_PATH / "Bookshelf/data/bs.block/loot_table/get/get.json")
-
- for state in {item["id"]: item for entry in blocks for item in entry["states"]}.values():
- consumer(render_json(
- format_state_loot_table(state),
- indent=None,
- ), definitions.DATAPACKS_PATH / f"Bookshelf/data/bs.block/loot_table/get/{state['id']}.json")
-
-
-def format_types_table(blocks: list[dict]):
- return {block['type']: {
- k: v for k, v in block.items() if k != "states"
- } for block in blocks}
-
-
-def format_items_table(blocks: list[dict]):
- return {block['item']: {
- k: v for k, v in block.items() if k != "states"
- } for block in reversed(blocks)}
-
-
-def format_groups_table(blocks: list[dict]):
- return {
- block["group"]: [{
- "i": state["idx"],
- "n": state["name"],
- "o": [{
- "i": idx,
- "v": value,
- "p": {state["name"]: value},
- "s": {state["idx"]: f"{state["name"]}={value},"},
- } for idx, value in enumerate(state["options"])]
- } for state in block["states"]]
- for block in blocks
- }
-
-
-def format_types_loot_table(blocks: list[dict]):
- class Node:
- def __init__(self, entries: list[dict]):
- mid = len(entries) // 2
- self.keys = [entry["type"][10:] for entry in entries[:mid]]
- self.left = Node(entries[:mid]) if len(entries[:mid]) > 1 else entries[0]
- self.right = Node(entries[mid:]) if len(entries[mid:]) > 1 else entries[1]
-
- def format_node(node: Node):
- left = format_node(node.left) if isinstance(node.left, Node) else format_leaf(node.left)
- right = format_node(node.right) if isinstance(node.right, Node) else format_leaf(node.right)
- left["conditions"] = [{"condition":"location_check","predicate":{"block":{"blocks":node.keys}}}]
- return {"type":"alternatives","children":[left,right]}
-
- def format_leaf(data: dict):
- nbt = f"{{type:'{data['type']}',item:'{data['item']}',group:{data['group']}}}"
- functions = [{"function":"set_custom_data","tag":nbt}]
- return {
- "type": "item",
- "name": "egg",
- "functions": functions,
- } if data['group'] == 0 else {
- "type": "loot_table",
- "value": f"bs.block:get/{data['states'][-1]["id"]}",
- "functions": functions,
- }
-
- return {"pools":[{"rolls":1,"entries":[format_node(Node(blocks))]}]}
-
-
-def format_state_loot_table(state: dict):
- alternatives = []
- for option in state["options"]:
- nbt = f"{{properties:{{{state['name']}:'{option}'}},_:{{{state['idx']}:'{state['name']}={option},'}}}}"
- conditions = [{"condition":"location_check","predicate":{"block":{"state":{f"{state['name']}":f"{option}"}}}}]
- functions = [{"function":"set_custom_data","tag":nbt}]
- alternatives.append({
- "type": "loot_table",
- "value": f"bs.block:get/{state["ref"]}",
- "conditions": conditions,
- "functions": functions,
- } if state["ref"] else {
- "type": "item",
- "name": "egg",
- "conditions": conditions,
- "functions": functions,
- })
-
- return {"pools":[{"rolls":1,"entries":[{"type": "alternatives","children":alternatives}]}]}
diff --git a/scripts/src/generators/hitbox.py b/scripts/src/generators/hitbox.py
deleted file mode 100644
index eff8f3ca7f..0000000000
--- a/scripts/src/generators/hitbox.py
+++ /dev/null
@@ -1,139 +0,0 @@
-from collections import defaultdict
-from datetime import datetime
-from generators.utils import render_json, render_snbt, write_file
-from logger import BaseLogger, new_logger
-from mcdata.hitbox import get_shapes
-from pathlib import Path
-from typing import Callable
-import definitions
-
-
-def generate(mc_version: str, logger: BaseLogger = new_logger()):
- logger.step("🚀 Fetching 'bs.hitbox' data…")
- shapes = get_shapes(mc_version)
-
- logger.step("⚙️ Generating 'bs.hitbox' files…")
- generate_has_offset_block_tag(shapes, write_file)
- logger.success("Block tag 'has_offset.json' generated!")
- generate_is_composite_block_tag(shapes, write_file)
- logger.success("Block tag 'is_composite.json' generated!")
- generate_blocks_loot_tables(shapes, write_file)
- logger.success("Loot tables for blocks generated!")
-
- logger.done()
-
-
-def generate_is_composite_block_tag(shapes: list[dict], consumer: Callable[[str, Path], None]):
- consumer(render_json({
- "__bookshelf__": {
- "feature": True,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#is-composite",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/28",
- "minecraft_version": "1.21"
- },
- "updated": {
- "date": datetime.now().strftime("%Y/%m/%d"),
- "minecraft_version": definitions.MC_VERSION
- }
- },
- "values": list(sorted([block for shape in shapes for block in shape["blocks"]]))
- }), definitions.DATAPACKS_PATH / "Bookshelf/data/bs.hitbox/tags/block/is_composite.json")
-
-
-def generate_has_offset_block_tag(shapes: list[dict], consumer: Callable[[str, Path], None]):
- consumer(render_json({
- "__bookshelf__": {
- "feature": True,
- "documentation": "https://bookshelf.docs.gunivers.net/en/latest/modules/hitbox.html#has-offset",
- "authors": [
- "Aksiome"
- ],
- "created": {
- "date": "2024/09/28",
- "minecraft_version": "1.21"
- },
- "updated": {
- "date": datetime.now().strftime("%Y/%m/%d"),
- "minecraft_version": definitions.MC_VERSION
- }
- },
- "values": list(sorted([
- block for shape in shapes for block in shape["blocks"]
- if all(entry["has_offset"] for entry in shape["shapes"])
- ]))
- }), definitions.DATAPACKS_PATH / "Bookshelf/data/bs.hitbox/tags/block/has_offset.json")
-
-
-def generate_blocks_loot_tables(shapes: list[dict], consumer: Callable[[str, Path], None]):
- consumer(render_json(
- format_blocks_loot_table(shapes),
- indent=None,
- ), definitions.DATAPACKS_PATH / "Bookshelf/data/bs.hitbox/loot_table/get_block/get.json")
-
- for group in shapes:
- if group["group"] > 0:
- consumer(render_json(
- format_block_group_loot_table(group["shapes"]),
- indent=None,
- ), definitions.DATAPACKS_PATH / f"Bookshelf/data/bs.hitbox/loot_table/get_block/{group["group"]}.json")
-
-
-def format_blocks_loot_table(groups: list[dict]):
- class Node:
- def __init__(self, entries: list[dict]):
- mid = len(entries) // 2
- self.keys = [block[10:] for entry in entries[:mid] for block in entry["blocks"]]
- self.left = Node(entries[:mid]) if len(entries[:mid]) > 1 else entries[0]
- self.right = Node(entries[mid:]) if len(entries[mid:]) > 1 else entries[1]
-
- def format_node(node: Node):
- left = format_node(node.left) if isinstance(node.left, Node) else format_leaf(node.left)
- right = format_node(node.right) if isinstance(node.right, Node) else format_leaf(node.right)
- left["conditions"] = [{"condition":"location_check","predicate":{"block":{"blocks":node.keys}}}]
- return {"type":"alternatives","children":[left,right]}
-
- def format_leaf(data: dict):
- return {
- "type": "loot_table",
- "value": f"bs.hitbox:get_block/{data["group"]}"
- } if data["group"] > 0 else {
- "type": "item",
- "name": "egg",
- "functions": [{"function":"set_custom_data","tag":f"{{shape:{render_snbt(data["shapes"][0]["shape"])}}}"}],
- }
-
- return {"pools":[{"rolls":1,"entries":[format_node(Node(groups))]}]}
-
-
-def format_block_group_loot_table(group: list[dict]):
- def format_tree(data: list[dict], properties: list[str]):
- prop = properties[0]
- values = defaultdict(list)
-
- for item in data:
- values[item["properties"].get(prop)].append(item)
-
- entries = []
- for value, entry in values.items():
- node = {
- "type": "alternatives",
- "children": format_tree(entry, properties[1:])
- } if len(properties) > 1 else {
- "type": "item",
- "name": "egg",
- "functions": [{"function":"set_custom_data","tag":f"{{shape:{render_snbt(entry[0]["shape"])}}}"}],
- }
- node["conditions"] = [{"condition":"location_check","predicate":{"block":{"state":{prop:value}}}}]
- entries.append(node)
-
- entries[-1].pop("conditions")
- return entries
-
- props = {name: set(entry["properties"][name] for entry in group) for name in group[0]["properties"]}
- props = [name for name, _ in sorted(props.items(), key=lambda item: len(item[1]))]
-
- return {"pools":[{"rolls":1,"entries":[{"type":"alternatives","children":format_tree(group, props)}]}]}
diff --git a/scripts/src/generators/json_encoders.py b/scripts/src/generators/json_encoders.py
deleted file mode 100644
index 48179cbc6d..0000000000
--- a/scripts/src/generators/json_encoders.py
+++ /dev/null
@@ -1,37 +0,0 @@
-from dataclasses import asdict, is_dataclass
-from json import JSONEncoder
-from metadata.build_metadata import DatapackMetadata, ModuleMetadata
-
-
-class DCJSONEncoder(JSONEncoder):
- def default(self, o):
- if is_dataclass(o):
- return _cleandict(asdict(o))
- if isinstance(o, set):
- return list(o)
- return super().default(o)
-
-
-class ModuleJSONEncoder(DCJSONEncoder):
- def default(self, o):
- if isinstance(o, ModuleMetadata):
- dic = _cleandict(asdict(o))
- dic["features"] = [f.mc_path for f in o.features]
- return dic
- return super().default(o)
-
-
-class ManifestJSONEncoder(DCJSONEncoder):
- def default(self, o):
- if isinstance(o, DatapackMetadata):
- return _cleandict(asdict(o), True)
- return super().default(o)
-
-
-def _cleandict(d, keep_path=False):
- if isinstance(d, dict):
- return {k: _cleandict(v, True) for k, v in d.items() if v is not None and ("path" not in k or (keep_path and k == "module_path"))}
- elif isinstance(d, list):
- return [_cleandict(v, True) for v in d]
- else:
- return d
diff --git a/scripts/src/generators/metadata.py b/scripts/src/generators/metadata.py
deleted file mode 100644
index d17a554065..0000000000
--- a/scripts/src/generators/metadata.py
+++ /dev/null
@@ -1,76 +0,0 @@
-from generators.json_encoders import DCJSONEncoder, ManifestJSONEncoder, ModuleJSONEncoder
-from generators.utils import render_json, write_file
-from logger import BaseLogger, new_logger
-from metadata.build_metadata import DatapackMetadata, FeatureMetadata, ModuleMetadata, build
-from pathlib import Path
-from typing import Callable
-import copy
-import definitions
-
-def generate(logger: BaseLogger = new_logger()):
- logger.step("⏳ Checking metadata files…")
- metadata: list[DatapackMetadata] = build(logger)
- sort_metadata(metadata)
-
- if logger.has_level_errors():
- raise RuntimeError("Malformed metadata file detected. Generation interrupted!")
-
- logger.step("⚙️ Generating metadata files…")
- generate_manifest(adapt_for_manifest(metadata), write_file)
- logger.success("Manifest file generated!")
-
- for datapack in metadata:
- for module in datapack.modules:
- generate_module_metadata(module, write_file)
- generate_feature_metadata(module.features, module.module_path, write_file)
- logger.success("Metadata files generated!")
-
- logger.done()
-
-
-def generate_manifest(metadata: list[DatapackMetadata], consumer: Callable[[str, Path], None]):
- path = definitions.GENERATED_PATH / "manifest.json"
- consumer(render_json({ "datapacks": metadata }, ManifestJSONEncoder), path)
-
-
-def generate_module_metadata(metadata: ModuleMetadata, consumer: Callable[[str, Path], None]):
- path = metadata.module_path / ".metadata" / "generated" / "module.json"
- consumer(render_json(metadata, ModuleJSONEncoder), path)
-
-
-def generate_feature_metadata(metadata: list[FeatureMetadata], module_path: Path, consumer: Callable[[str, Path], None]):
- path = module_path / ".metadata" / "generated" / "features.json"
- consumer(render_json(metadata, DCJSONEncoder), path)
-
-
-def sort_metadata(metadata: list[DatapackMetadata]):
- metadata.sort(key=lambda x: x.name)
- for datapack in metadata:
- datapack.modules.sort(key=lambda x: x.name)
- if datapack.modules:
- for module in datapack.modules:
- module.features.sort(key=lambda x: x.name)
- if module.dependencies:
- module.dependencies.sort()
- if module.weak_dependencies:
- module.weak_dependencies.sort()
- module.authors.sort()
- if module.contributors:
- module.contributors.sort()
- if module.features:
- for feature in module.features:
- if feature.dependencies:
- feature.dependencies.sort()
- if feature.weak_dependencies:
- feature.weak_dependencies.sort()
- feature.authors.sort()
- if feature.contributors:
- feature.contributors.sort()
-
-
-def adapt_for_manifest(metadata: list[DatapackMetadata]):
- copy_metadata = copy.deepcopy(metadata)
- for datapack in copy_metadata:
- for module in datapack.modules:
- module.module_path = module.module_path.relative_to(definitions.ROOT_DIR).as_posix()
- return copy_metadata
diff --git a/scripts/src/generators/utils.py b/scripts/src/generators/utils.py
deleted file mode 100644
index 192778bb9b..0000000000
--- a/scripts/src/generators/utils.py
+++ /dev/null
@@ -1,57 +0,0 @@
-
-from datetime import datetime
-from jinja2 import Environment, FileSystemLoader
-from pathlib import Path
-import json
-import nbtlib
-import os
-import typing
-
-
-def render_json(obj: typing.Any, encoder: type[json.JSONEncoder] = None, indent = 2) -> str:
- return json.dumps(
- obj,
- indent=indent,
- separators=(',', ':') if not indent else None,
- cls=encoder,
- ensure_ascii=False
- )
-
-
-def render_snbt(obj: typing.Any) -> str:
- def quote_key(k: str) -> str:
- return f'"{k}"' if ':' in k else k
- if isinstance(obj, dict):
- return f'{{{",".join([f"{quote_key(str(k))}:{render_snbt(v)}" for k, v in obj.items() if v is not None])}}}'
- if isinstance(obj, list):
- return f'[{",".join([render_snbt(v) for v in obj])}]'
- if isinstance(obj, str):
- return f'"{obj}"'
- if isinstance(obj, bool):
- return "1b" if obj else "0b"
- return str(obj)
-
-
-def render_template(name: str, *args: typing.Any, **kwargs: typing.Any) -> str:
- env = Environment(loader=FileSystemLoader(Path(__file__).parent.parent.parent / "templates"))
- env.globals["now"] = datetime.now
- env.globals["render_snbt"] = render_snbt
- env.globals["render_json"] = render_json
- return env.get_template(name) \
- .render(*args, **kwargs) \
- .replace("\r\n", "\n") \
- .strip()
-
-
-def write_file(content: str, path: Path) -> None:
- os.makedirs(path.parent, exist_ok=True)
- with open(path, 'w', newline='\n') as file:
- file.write(content if content.endswith('\n') else content + '\n')
-
-
-def write_nbt(storage: str, content: str, path: Path) -> None:
- with nbtlib.load(path) as file:
- paths = storage.split(".")
- for path in paths[:-1]:
- file = file[path]
- file[paths[-1]] = nbtlib.parse_nbt(content)
diff --git a/scripts/src/logger/__init__.py b/scripts/src/logger/__init__.py
deleted file mode 100644
index d35d4e5635..0000000000
--- a/scripts/src/logger/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-from logger.base_logger import BaseLogger
-from logger.console_logger import ConsoleLogger
-from logger.github_logger import GithubLogger
-import os
-
-
-def new_logger() -> BaseLogger:
- return GithubLogger() if os.getenv('GITHUB_WORKSPACE') else ConsoleLogger()
diff --git a/scripts/src/logger/base_logger.py b/scripts/src/logger/base_logger.py
deleted file mode 100644
index 2cd67e2a0e..0000000000
--- a/scripts/src/logger/base_logger.py
+++ /dev/null
@@ -1,139 +0,0 @@
-from abc import ABC
-from colored import Style
-
-
-tab_size = 3
-
-class BaseLogger(ABC):
- _context_error: list[int] = [0]
- _level = 0
- _errors = 0
- _warnings = 0
-
- def error(self, *messages: list[str|dict], count: bool = True) -> None:
- """
- Print error messages, in red.
- :param messages: the messages to print
- :param count: if True, increment the error count
- """
- if count:
- self._errors += len(messages)
- self._context_error[-1] += len(messages)
- self._print(*messages)
-
- def warning(self, *messages: list[str|dict], count: bool = True) -> None:
- """
- Print warning messages, in yellow.
- :param messages: the messages to print
- :param count: if True, increment the warning count
- """
- if count:
- self._warnings += len(messages)
- self._print(*messages)
-
- def success(self, *messages: list[str]) -> None:
- """
- Print success messages, in green.
- :param messages: the messages to print
- """
- self._print(*messages)
-
- def print(self, *messages: list[str]) -> None:
- """
- Print messages, in gray.
- :param messages: the messages to print
- """
- self._print(*messages)
-
- def step(self, message: str, manage_indent: bool = True) -> None:
- """
- Print a step message.
- A step automatically increment the indentation for the next logs until the end_step() method is called or a new step is printed.
- :param message: the message to print
- :param manage_indent: if False, do not update the indentation.
- """
- if manage_indent:
- self._unindent()
- self._print(message)
- self._indent()
- else:
- self._print(message)
-
- def end_step(self) -> None:
- """
- End the current step.
- Descrease the indentation.
- """
- self._unindent()
-
- def reset(self) -> None:
- """
- Reset the different counters of the logger as well as the indentation level.
- """
- self._level = 0
- self._errors = 0
- self._warnings = 0
- self._context_error = [0]
-
- def new_error_context(self) -> None:
- """
- Create a new error context.
- An error context has its own error count.
- """
- self._context_error.append(0)
-
- def reduce_error_context(self) -> bool:
- """
- Pop the last error context and add the errors number of this one to the previous error context.
- :return: True if the popped error context has errors.
- """
- result = self._context_error[-1] > 0
- if len(self._context_error) >= 2:
- self._context_error[-2] += self._context_error[-1]
- self._context_error.pop()
- return result
-
- def has_level_errors(self) -> bool:
- """
- :return: True if the current error context has errors.
- """
- return self._context_error[-1] > 0
-
- def done(self) -> bool:
- """
- Print the result of the process with the number of errors and warnings.
- """
- while self._level > 0:
- self.end_step()
-
- match self._errors, self._warnings:
- case 0, 0:
- self._print("✅ Done!")
- case 0, _:
- self._print(f"🔔 Done with {self._warnings} warnings.")
- case _, 0:
- self._print(f"🚨 Done with {self._errors} errors.")
- case _:
- self._print(f"🚨 Done with {self._errors} errors and {self._warnings} warnings.")
- return self._errors > 0
-
- def _indent(self) -> None:
- """
- Increase the indentation.
- """
- self._level += 1
-
- def _unindent(self) -> None:
- """
- Decrease the indentation.
- """
- if self._level > 0:
- self._level -= 1
-
- def _print(self, *messages: list[str]) -> None:
- """
- Print raw messages.
- :param messages: the messages to print
- """
- for msg in messages:
- print(" " * self._level * tab_size + f"{msg}{Style.reset}")
diff --git a/scripts/src/logger/console_logger.py b/scripts/src/logger/console_logger.py
deleted file mode 100644
index 5118689dbb..0000000000
--- a/scripts/src/logger/console_logger.py
+++ /dev/null
@@ -1,24 +0,0 @@
-from colored import Fore, Style
-from logger.base_logger import BaseLogger
-
-
-class ConsoleLogger(BaseLogger):
- def error(self, *messages: list[str|dict], count: bool = True) -> None:
- return super().error(
- *[f"{Fore.red}{Style.bold}{msg.get('title', 'Error')}{Style.reset}{Fore.red}: {msg.get('message')}" for msg in messages if isinstance(msg, dict)],
- *[f"{Fore.red}{msg}" for msg in messages if isinstance(msg, str)],
- count=count,
- )
-
- def warning(self, *messages: list[str|dict], count: bool = True) -> None:
- return super().warning(
- *[f"{Fore.yellow}{Style.bold}{msg.get('title', 'Warning')}{Style.reset}{Fore.yellow}: {msg.get('message')}" for msg in messages if isinstance(msg, dict)],
- *[f"{Fore.yellow}{msg}" for msg in messages if isinstance(msg, str)],
- count=count,
- )
-
- def success(self, *messages: list[str]) -> None:
- return super().success(*[f"{Fore.green}{msg}" for msg in messages])
-
- def print(self, *messages: list[str]) -> None:
- return super().print(*[f"{Fore.dark_gray}{msg}" for msg in messages])
diff --git a/scripts/src/logger/github_logger.py b/scripts/src/logger/github_logger.py
deleted file mode 100644
index 74be371003..0000000000
--- a/scripts/src/logger/github_logger.py
+++ /dev/null
@@ -1,55 +0,0 @@
-from colored import Fore
-from logger.base_logger import BaseLogger
-from pathlib import Path
-import definitions
-import inspect
-
-
-class GithubLogger(BaseLogger):
- def error(self, *messages: list[str|dict], count: bool = True) -> None:
- file, line = get_caller()
- return super().error(
- *[f"::error title={msg.get('title', '')},file={msg.get('file', file)},line={msg.get('line', line)}::{msg.get('message')}" for msg in messages if isinstance(msg, dict)],
- *[f"::error file={file},line={line}::{msg}" for msg in messages if isinstance(msg, str)],
- count=count,
- )
-
- def warning(self, *messages: list[str|dict], count: bool = True) -> None:
- file, line = get_caller()
- return super().warning(
- *[f"::warning title={msg.get('title', '')},file={msg.get('file', file)},line={msg.get('line', line)}::{msg.get('message')}" for msg in messages if isinstance(msg, dict)],
- *[f"::warning file={file},line={line}::{msg}" for msg in messages if isinstance(msg, str)],
- count=count,
- )
-
- def success(self, *messages: list[str|dict]) -> None:
- return super().success(*[f"{Fore.green}{msg}" for msg in messages])
-
- def print(self, *messages: list[str|dict]) -> None:
- return super().print(*[f"{Fore.light_gray}{msg}" for msg in messages])
-
- def step(self, message: str|dict, manage_indent: bool = True) -> None:
- if manage_indent and self._level > 0:
- super().print("::endgroup::")
- return super().step(f"::group::{message}" if manage_indent else message, manage_indent)
-
- def end_step(self) -> None:
- if self._level > 0:
- super().print("::endgroup::")
- return super().end_step()
-
-
-_offset = 3
-
-def get_caller() -> tuple[str, int] | None:
- i = 0
- path = None
- lineno = -1
- for frame in inspect.stack():
- if frame.filename.startswith(str(definitions.ROOT_DIR)):
- i += 1
- path = Path(frame.filename).relative_to(definitions.ROOT_DIR).as_posix()
- lineno = frame.lineno
- if i == _offset:
- break
- return path, lineno
diff --git a/scripts/src/mcdata/__init__.py b/scripts/src/mcdata/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/scripts/src/mcdata/biome.py b/scripts/src/mcdata/biome.py
deleted file mode 100644
index 9191038267..0000000000
--- a/scripts/src/mcdata/biome.py
+++ /dev/null
@@ -1,20 +0,0 @@
-import requests
-
-
-BIOMES_URL = "https://raw.githubusercontent.com/misode/mcmeta/{}-summary/data/worldgen/biome/data.min.json"
-
-
-def get_biomes(mc_version: str) -> list[dict]:
- """
- Fetches biomes data for the given version of minecraft.
- """
- requests.packages.urllib3.util.connection.HAS_IPV6 = False
- response = requests.get(BIOMES_URL.format(mc_version))
- response.raise_for_status()
- biomes = response.json()
-
- return [{
- "type": biome if biome.startswith("minecraft:") else f"minecraft:{biome}",
- "temperature": float(data["temperature"]),
- "has_precipitation": bool(data["has_precipitation"]),
- } for biome, data in biomes.items()]
diff --git a/scripts/src/mcdata/block.py b/scripts/src/mcdata/block.py
deleted file mode 100644
index 0b722bad91..0000000000
--- a/scripts/src/mcdata/block.py
+++ /dev/null
@@ -1,216 +0,0 @@
-from collections import Counter, defaultdict
-from itertools import permutations
-import bisect
-import requests
-import json
-
-
-BLOCKS_URL = "https://raw.githubusercontent.com/misode/mcmeta/{}-summary/blocks/data.min.json"
-ITEMS_URL = "https://raw.githubusercontent.com/misode/mcmeta/{}-registries/item/data.min.json"
-
-BLOCK_TO_ITEM = {
- "minecraft:wall_torch": "minecraft:torch",
- "minecraft:soul_wall_torch": "minecraft:soul_torch",
- "minecraft:redstone_wall_torch": "minecraft:redstone_torch",
- "minecraft:oak_wall_sign": "minecraft:oak_sign",
- "minecraft:spruce_wall_sign": "minecraft:spruce_sign",
- "minecraft:birch_wall_sign": "minecraft:birch_sign",
- "minecraft:jungle_wall_sign": "minecraft:jungle_sign",
- "minecraft:acacia_wall_sign": "minecraft:acacia_sign",
- "minecraft:cherry_wall_sign": "minecraft:cherry_sign",
- "minecraft:dark_oak_wall_sign": "minecraft:dark_oak_sign",
- "minecraft:mangrove_wall_sign": "minecraft:mangrove_sign",
- "minecraft:bamboo_wall_sign": "minecraft:bamboo_sign",
- "minecraft:crimson_wall_sign": "minecraft:crimson_sign",
- "minecraft:warped_wall_sign": "minecraft:warped_sign",
- "minecraft:oak_wall_hanging_sign": "minecraft:oak_hanging_sign",
- "minecraft:spruce_wall_hanging_sign": "minecraft:spruce_hanging_sign",
- "minecraft:birch_wall_hanging_sign": "minecraft:birch_hanging_sign",
- "minecraft:jungle_wall_hanging_sign": "minecraft:jungle_hanging_sign",
- "minecraft:acacia_wall_hanging_sign": "minecraft:acacia_hanging_sign",
- "minecraft:cherry_wall_hanging_sign": "minecraft:cherry_hanging_sign",
- "minecraft:dark_oak_wall_hanging_sign": "minecraft:dark_oak_hanging_sign",
- "minecraft:mangrove_wall_hanging_sign": "minecraft:mangrove_hanging_sign",
- "minecraft:bamboo_wall_hanging_sign": "minecraft:bamboo_hanging_sign",
- "minecraft:crimson_wall_hanging_sign": "minecraft:crimson_hanging_sign",
- "minecraft:warped_wall_hanging_sign": "minecraft:warped_hanging_sign",
- "minecraft:tube_coral_wall_fan": "minecraft:tube_coral_fan",
- "minecraft:brain_coral_wall_fan": "minecraft:brain_coral_fan",
- "minecraft:bubble_coral_wall_fan": "minecraft:bubble_coral_fan",
- "minecraft:fire_coral_wall_fan": "minecraft:fire_coral_fan",
- "minecraft:horn_coral_wall_fan": "minecraft:horn_coral_fan",
- "minecraft:dead_tube_coral_wall_fan": "minecraft:dead_tube_coral_fan",
- "minecraft:dead_brain_coral_wall_fan": "minecraft:dead_brain_coral_fan",
- "minecraft:dead_bubble_coral_wall_fan": "minecraft:dead_bubble_coral_fan",
- "minecraft:dead_fire_coral_wall_fan": "minecraft:dead_fire_coral_fan",
- "minecraft:dead_horn_coral_wall_fan": "minecraft:dead_horn_coral_fan",
- "minecraft:white_wall_banner": "minecraft:white_banner",
- "minecraft:orange_wall_banner": "minecraft:orange_banner",
- "minecraft:magenta_wall_banner": "minecraft:magenta_banner",
- "minecraft:light_blue_wall_banner": "minecraft:light_blue_banner",
- "minecraft:yellow_wall_banner": "minecraft:yellow_banner",
- "minecraft:lime_wall_banner": "minecraft:lime_banner",
- "minecraft:pink_wall_banner": "minecraft:pink_banner",
- "minecraft:gray_wall_banner": "minecraft:gray_banner",
- "minecraft:light_gray_wall_banner": "minecraft:light_gray_banner",
- "minecraft:cyan_wall_banner": "minecraft:cyan_banner",
- "minecraft:purple_wall_banner": "minecraft:purple_banner",
- "minecraft:blue_wall_banner": "minecraft:blue_banner",
- "minecraft:brown_wall_banner": "minecraft:brown_banner",
- "minecraft:green_wall_banner": "minecraft:green_banner",
- "minecraft:red_wall_banner": "minecraft:red_banner",
- "minecraft:black_wall_banner": "minecraft:black_banner",
- "minecraft:player_wall_head": "minecraft:player_head",
- "minecraft:zombie_wall_head": "minecraft:zombie_head",
- "minecraft:creeper_wall_head": "minecraft:creeper_head",
- "minecraft:dragon_wall_head": "minecraft:dragon_head",
- "minecraft:piglin_wall_head": "minecraft:piglin_head",
- "minecraft:skeleton_wall_skull": "minecraft:skeleton_skull",
- "minecraft:wither_skeleton_wall_skull": "minecraft:wither_skeleton_skull",
- "minecraft:redstone_wire": "minecraft:redstone",
- "minecraft:tripwire": "minecraft:string",
- "minecraft:water": "minecraft:water_bucket",
- "minecraft:lava": "minecraft:lava_bucket",
- "minecraft:powder_snow": "minecraft:powder_snow_bucket",
- "minecraft:big_dripleaf_stem": "minecraft:big_dripleaf",
- "minecraft:wheat": "minecraft:wheat_seeds",
- "minecraft:cocoa": "minecraft:cocoa_beans",
- "minecraft:melon_stem": "minecraft:pumpkin_seeds",
- "minecraft:pumpkin_stem": "minecraft:pumpkin_seeds",
- "minecraft:attached_melon_stem": "minecraft:melon_seeds",
- "minecraft:attached_pumpkin_stem": "minecraft:melon_seeds",
- "minecraft:water_cauldron": "minecraft:cauldron",
- "minecraft:lava_cauldron": "minecraft:cauldron",
- "minecraft:powder_snow_cauldron": "minecraft:cauldron",
- "minecraft:carrots": "minecraft:carrot",
- "minecraft:potatoes": "minecraft:potato",
- "minecraft:torchflower_crop": "minecraft:torchflower_seeds",
- "minecraft:pitcher_crop": "minecraft:pitcher_pod",
- "minecraft:beetroots": "minecraft:beetroot_seeds",
- "minecraft:sweet_berry_bush": "minecraft:sweet_berries",
- "minecraft:cave_vines": "minecraft:glow_berries",
- "minecraft:cave_vines_plant": "minecraft:glow_berries",
-}
-
-
-def get_blocks(mc_version: str) -> list[dict]:
- """
- Fetches blocks data for the given version of minecraft.
- """
- requests.packages.urllib3.util.connection.HAS_IPV6 = False
- response = requests.get(BLOCKS_URL.format(mc_version))
- response.raise_for_status()
- blocks = response.json()
-
- response = requests.get(ITEMS_URL.format(mc_version))
- response.raise_for_status()
- items = [item if item.startswith("minecraft:") else f"minecraft:{item}" for item in response.json()]
-
- groups = [{}]
- formatted_blocks = []
-
- for block, data in blocks.items():
- props = {}
- for name, options in data[0].items():
- idx = options.index(data[1][name])
- props[name] = options[idx:] + options[:idx]
-
- if props not in groups:
- groups.append(props)
-
- bisect.insort(formatted_blocks, {
- "type": (block := block if block.startswith("minecraft:") else f"minecraft:{block}"),
- "item": BLOCK_TO_ITEM.get(block, block if block in items else None),
- "group": groups.index(props),
- }, key=lambda x: x["group"])
-
- formatted_groups = format_groups(groups, find_best_permutations(groups))
- return [{**block, "states": formatted_groups[block["group"]] } for block in formatted_blocks]
-
-
-def format_groups(groups, best_permutations):
- next_id = 1
- sequences = {}
- formatted_groups = []
-
- for group, perm in zip(groups, best_permutations):
- ref = None
- sequence = ()
- formatted_group = []
-
- for state in perm:
- sequence += (state,)
- if sequence not in sequences:
- sequences[sequence] = next_id
- next_id += 1
-
- formatted_group.append({
- "id": sequences[sequence],
- "idx": len(sequence) - 1,
- "ref": ref,
- "name": state[0],
- "options": group[state[0]],
- })
- ref = sequences[sequence]
- formatted_groups.append(formatted_group)
-
- return formatted_groups
-
-
-def find_best_permutations(groups: list[dict]):
- counter = Counter()
- hashable_groups = []
- for group in groups:
- states = [(name, tuple(sorted(options))) for name, options in group.items()]
- counter.update(states)
- hashable_groups.append(states)
-
- all_permutations = []
- for states in hashable_groups:
- shared_states = []
- unique_states = []
- for state in states:
- if counter[state] > 1:
- shared_states.append(state)
- else:
- unique_states.append(state)
- all_permutations.append([list(perm) + unique_states for perm in permutations(shared_states)])
-
- best_permutations = []
- while all_permutations:
- best_score = -1
- best_permutation = None
- group_permutations = all_permutations.pop(0)
-
- for perm in group_permutations:
- score = sum(count_common_prefix(perm, best_perm) for best_perm in best_permutations)
- for other_group_permutations in all_permutations:
- score += max(count_common_prefix(perm, other_perm) for other_perm in other_group_permutations)
-
- if score > best_score:
- best_score = score
- best_permutation = perm
-
- best_permutations.append(best_permutation)
-
- return best_permutations
-
-
-def count_common_prefix(a: list, b: list):
- i = 0
- while i < len(a) and i < len(b) and a[i] == b[i]:
- i += 1
- return i
-
-
-SOUNDS_URL = "https://raw.githubusercontent.com/Gunivers/Bookshelf-McData/{}/blocks/sounds.min.json"
-
-
-def get_sounds(mc_version: str) -> list[dict]:
- """
- Fetches block sounds data for the given version of minecraft.
- """
- requests.packages.urllib3.util.connection.HAS_IPV6 = False
- response = requests.get(SOUNDS_URL.format(mc_version))
- response.raise_for_status()
- return response.json()
diff --git a/scripts/src/mcdata/hitbox.py b/scripts/src/mcdata/hitbox.py
deleted file mode 100644
index c51d6f2a34..0000000000
--- a/scripts/src/mcdata/hitbox.py
+++ /dev/null
@@ -1,44 +0,0 @@
-from collections import defaultdict
-import json
-import requests
-
-
-SHAPES_URL = "https://raw.githubusercontent.com/Gunivers/Bookshelf-McData/{}/blocks/shapes.min.json"
-
-
-def get_shapes(mc_version: str) -> list[dict]:
- """
- Fetches block shapes data for the given version of minecraft.
- """
- requests.packages.urllib3.util.connection.HAS_IPV6 = False
- response = requests.get(SHAPES_URL.format(mc_version))
- response.raise_for_status()
- shapes = response.json()
-
- group = defaultdict(list)
- for block, entries in shapes.items():
- if all(item["shape"] in ([[0.0,0.0,0.0,1.0,1.0,1.0]], []) for item in entries):
- continue
-
- for prop in list(entries[0]["properties"].keys()):
- values = {entry["properties"][prop] for entry in entries}
- shapes = {value: [entry["shape"] for entry in entries if entry["properties"][prop] == value] for value in values}
-
- first_shape = next(iter(shapes.values()))
- if all(shape == first_shape for shape in shapes.values()):
- entries = [entry for entry in entries if entry["properties"][prop] == next(iter(values))]
- for entry in entries:
- entry["properties"].pop(prop)
-
- group[json.dumps([{
- "has_offset": entry["has_offset"],
- "properties": entry["properties"],
- "shape": [[value * 16 for value in shape] for shape in entry["shape"]]
- } for entry in entries])].append(block)
-
- i = 0
- return [{
- "group": (i := i + 1) if len(json.loads(shapes)) > 1 else 0,
- "blocks": blocks,
- "shapes": json.loads(shapes)
- } for shapes, blocks in group.items()]
diff --git a/scripts/src/metadata/__init__.py b/scripts/src/metadata/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/scripts/src/metadata/build_metadata.py b/scripts/src/metadata/build_metadata.py
deleted file mode 100644
index fe81f9bed0..0000000000
--- a/scripts/src/metadata/build_metadata.py
+++ /dev/null
@@ -1,139 +0,0 @@
-from checks.feature_tag import check_feature
-from checks.module_metadata_file import check_module
-from dataclasses import dataclass
-from files_provider._types import Datapack
-from files_provider._types import Feature
-from files_provider.files_provider import DatapackManager, FilesProvider, ModuleManager
-from logger import BaseLogger, new_logger
-from metadata.compute_dependencies import Dependencies, ModuleDependencies, compute_dependencies
-from pathlib import Path
-from typing import Tuple
-import json
-
-@dataclass
-class Updated:
- date: str
- version: str
-
-@dataclass
-class FeatureMetadata:
- name: str
- documentation: str
- authors: list[str]
- contributors: list[str] | None
- created: Updated
- updated: Updated
- dependencies: list[str] | None
- weak_dependencies: list[str] | None
- feature_path: Path
- mc_path: str
-
-@dataclass
-class ModuleMetadata:
- name: str
- display_name: str
- description: str
- documentation: str
- authors: list[str]
- contributors: list[str] | None
- icon: str | None
- module_path: Path
- dependencies: list[str] | None
- weak_dependencies: list[str] | None
- features: list[FeatureMetadata]
-
-@dataclass
-class DatapackMetadata:
- name: str
- description: str
- pack_format: int
- modules: list[ModuleMetadata]
-
-
-def build(logger: BaseLogger = new_logger()) -> list[DatapackMetadata]:
- managers = FilesProvider().separated_datapacks()
- datapack_metadata = []
-
- for manager in managers:
- metadata = build_datapack_metadata(manager, logger)
- if metadata:
- datapack_metadata.append(metadata)
-
- return datapack_metadata
-
-
-def build_datapack_metadata(manager: DatapackManager, logger: BaseLogger) -> DatapackMetadata:
- datapack = manager.get()[0]
- logger.new_error_context()
- result = get_mcmeta_infos(datapack, logger)
- if not logger.reduce_error_context():
- format, description = result
- modules = [build_module_metadata(module_manager, logger) for module_manager in manager.get_separated_modules()]
- modules = [module for module in modules if module]
- return DatapackMetadata(datapack.name, description, format, modules)
-
-
-def get_mcmeta_infos(datapack: Datapack, logger: BaseLogger) -> Tuple[int, str]:
- with open(datapack.path / "pack.mcmeta") as file:
- content: dict = json.load(file)
- if content.get("pack", None) is not None:
- if content["pack"].get("pack_format", None) is None:
- logger.error(f"'pack_format' is missing in the pack.mcmeta of '{datapack.name}'")
- elif content["pack"].get("description", None) is None:
- logger.error(f"'description' is missing in the pack.mcmeta of '{datapack.name}'")
- return content["pack"]["pack_format"], content["pack"]["description"]
- logger.error(f"'pack' is missing in the pack.mcmeta of '{datapack.name}'")
-
-
-def build_module_metadata(manager: ModuleManager, logger: BaseLogger) -> ModuleMetadata:
- module = manager.get()[0]
- logger.new_error_context()
- result = check_module(module, logger)
-
- if not logger.reduce_error_context():
- documentation = result.get("documentation", None)
- description = result.get("description", None)
- display_name = result.get("display_name", None)
- authors = result.get("authors", None)
- contributors = result.get("contributors", None)
- icon = result.get("icon", None)
- if icon:
- icon = module.path / '.metadata' / icon
-
- module_dep: ModuleDependencies = compute_dependencies(
- manager,
- set(result.get("dependencies", [])),
- set(result.get("weak_dependencies", [])),
- logger,
- )
- authors = set(authors) if authors else set()
- contributors = set(contributors) if contributors else set()
-
- feature_metadata: list[FeatureMetadata] = []
- for feature in manager.get_all_features():
- met = build_features_metadata(feature, module_dep.features_dependencies.get(feature.mc_path, Dependencies(None, None)), logger)
- if met:
- feature_metadata.append(met)
- authors.update(met.authors)
- if met.contributors:
- contributors.update(met.contributors)
-
- if len(contributors) == 0:
- contributors = None
- else:
- contributors = list(contributors)
-
- authors = list(authors)
- return ModuleMetadata(name=module.namespace, display_name=display_name, description=description, documentation=documentation, icon=icon, contributors=contributors, authors=authors, dependencies=module_dep.dependencies.dependencies, weak_dependencies=module_dep.dependencies.weak_dependencies, features=feature_metadata, module_path=module.path)
-
-
-def build_features_metadata(feature: Feature, dependencies: Dependencies, logger: BaseLogger) -> FeatureMetadata:
- logger.new_error_context()
- result = check_feature(feature, logger)
- if not logger.reduce_error_context():
- documentation = result.get("documentation", None)
- authors = result.get("authors", None)
- contributors = result.get("contributors", None)
- created = Updated(result.get("created", {}).get("date", None), result.get("created", {}).get("minecraft_version", None))
- updated = Updated(result.get("updated", {}).get("date", None), result.get("updated", {}).get("minecraft_version", None))
- return FeatureMetadata(name=feature.name, documentation=documentation, authors=authors, contributors=contributors, created=created, updated=updated, dependencies=dependencies.dependencies, weak_dependencies=dependencies.weak_dependencies, feature_path=feature.real_path, mc_path=feature.mc_path)
diff --git a/scripts/src/metadata/compute_dependencies.py b/scripts/src/metadata/compute_dependencies.py
deleted file mode 100644
index 11f83bb425..0000000000
--- a/scripts/src/metadata/compute_dependencies.py
+++ /dev/null
@@ -1,109 +0,0 @@
-from dataclasses import dataclass
-from files_provider._types import DataCategory
-from files_provider.files_provider import Feature, ModuleManager
-from function_call_getter._types import VisitableFeatureSet, VisitableFunctionTag, Visitor, VisitableFeature
-from function_call_getter.function_call_getter import FunctionCallGetter
-from functools import partial
-from logger import BaseLogger
-from pathlib import Path
-from typing import Tuple
-import definitions
-
-
-@dataclass
-class Dependencies:
- dependencies: list[str]
- weak_dependencies: list[str]
-
-@dataclass
-class ModuleDependencies:
- dependencies: Dependencies
- features_dependencies: dict[str, Dependencies]
-
-
-def compute_dependencies(
- module_manager: ModuleManager,
- module_dependencies: set[str],
- weak_dependencies: set[str],
- logger: BaseLogger
-) -> ModuleDependencies:
- """
- :param module_manager: The module manager to compute the dependencies from. The module manager should contains only one module.
- :return: A tuple containing the module dependencies and the weak dependencies.
- """
- if len(module_manager.get()) == 1:
- features: list[Feature] = module_manager.get_all_features()
- getter = FunctionCallGetter()
- feature_set: VisitableFeatureSet = getter.build_function_call_tree(features)
-
- feature_dependencies: dict[str, FeatureReferences] = {}
- visitor = Visitor([VisitableFunctionTag], partial(__compute_references, feature_dependencies, module_dependencies))
- visitor.visit(feature_set)
-
- # Structure features dependencies
- features_dependencies: dict[str, Dependencies] = {}
- for feature, feature_references in feature_dependencies.items():
- dependencies, weak_dep = __compute_dependencies([dep.namespace for dep in feature_references.dependencies], weak_dependencies, feature, "feature", True, logger)
- features_dependencies[feature] = Dependencies(list(dependencies) if dependencies else None, list(weak_dep) if weak_dependencies else None)
-
- # Structure module dependencies
- dependencies, weak_dependencies = __compute_dependencies(module_dependencies, weak_dependencies, module_manager.get()[0].namespace, "module", False, logger)
- return ModuleDependencies(Dependencies(list(dependencies) if dependencies else None, list(weak_dependencies) if weak_dependencies else None), features_dependencies)
-
-@dataclass
-class FeatureReferences:
- mc_path: str
- dependencies: set[VisitableFunctionTag]
-
- def __hash__(self):
- return hash(self.mc_path)
-
- def __eq__(self, other):
- if not isinstance(other, FeatureReferences):
- return False
- return self.mc_path == other.mc_path
-
-@dataclass
-class ModuleReferences:
- path: Path
- dependencies: set[VisitableFunctionTag]
- features: set[FeatureReferences]
-
-def __compute_dependencies(dependencies: set[str], weak_dependencies: set[str], name: str, type: str, check_non_use: bool, logger: BaseLogger) -> Tuple[set[str], set[str]]:
- if not dependencies:
- return None, None
- if not weak_dependencies:
- return dependencies, None
-
- weak_dependencies = set(weak_dependencies)
- used_weak_dependencies = set()
- deps = set(dependencies)
- for tag in dependencies:
- if tag in weak_dependencies:
- used_weak_dependencies.add(tag)
- deps.remove(tag)
- diff = weak_dependencies - used_weak_dependencies
- if check_non_use and len(diff) > 0:
- logger.warning(f"{type.capitalize()} {name} has weak dependencies that are not used: {",".join(diff)}.")
- weak_dependencies = weak_dependencies
- return deps or None, weak_dependencies or None
-
-
-def __get_feature_references(feature_dependencies: dict[str, ModuleReferences], feature: VisitableFeature, module_path: Path) -> FeatureReferences:
- feature_references = feature_dependencies.get(feature, None)
- if feature_references is None:
- feature_references = FeatureReferences(feature.mc_path, set())
- feature_dependencies[feature.mc_path] = feature_references
- return feature_references
-
-def __compute_references(feature_dependencies: dict[str, FeatureReferences], module_dependencies: set[str], tag: VisitableFunctionTag) -> bool:
- module_path = Path(str(tag.real_path).split(DataCategory.FUN_TAG.value.path_fragment)[0])
-
- bookshelf_tag = tag.content.get(definitions.FEATURE_TAG_NAMESPACE, None)
- if bookshelf_tag is not None and bookshelf_tag.get('feature', False) and tag.feature.namespace != tag.namespace.split(":")[0]:
- # Add to feature dependencies
- feature_references = __get_feature_references(feature_dependencies, tag.feature, module_path)
- feature_references.dependencies.add(tag)
- # Add to module dependencies
- module_dependencies.add(tag.namespace)
- return False
diff --git a/scripts/src/packtest/__init__.py b/scripts/src/packtest/__init__.py
deleted file mode 100644
index db879503cd..0000000000
--- a/scripts/src/packtest/__init__.py
+++ /dev/null
@@ -1,13 +0,0 @@
-from packtest.assets import Assets
-from packtest.runner import Runner
-from pathlib import Path
-import definitions
-import hashlib
-import tempfile
-
-def run(mc_version: str) -> bool:
- assets = Assets(mc_version)
- runner = Runner(assets)
- tempdir = "bs-" + hashlib.sha1(assets.packtest_url.encode('utf-8')).hexdigest()
-
- return runner.run(definitions.DATAPACKS_PATH, Path(tempfile.gettempdir()) / tempdir)
diff --git a/scripts/src/packtest/assets.py b/scripts/src/packtest/assets.py
deleted file mode 100644
index 80aca244e0..0000000000
--- a/scripts/src/packtest/assets.py
+++ /dev/null
@@ -1,50 +0,0 @@
-from logger import BaseLogger
-from pathlib import Path
-import requests
-
-requests.packages.urllib3.util.connection.HAS_IPV6 = False
-
-class Assets:
- """
- Utility for managing assets required to run Minecraft Unit Tests.
- """
-
- def __init__(self, mc_version: str) -> None:
- self.mc_version = mc_version
- self.fabric_server_url = get_fabric_url(mc_version)
- self.fabric_api_url = get_modrinth_url("fabric-api", mc_version)
- self.packtest_url = get_modrinth_url("packtest", mc_version)
-
- def download(self, target: Path, logger: BaseLogger):
- logger.step("🚀 Downloading assets…")
- for url, filepath in [
- (self.fabric_server_url, target / "server.jar"),
- (self.fabric_api_url, target / "mods/fabric-api.jar"),
- (self.packtest_url, target / "mods/packtest.jar"),
- ]:
- if not filepath.exists():
- logger.print(f"Fetch {url}")
- response = requests.get(url)
- response.raise_for_status()
- filepath.parent.mkdir(parents=True, exist_ok=True)
- filepath.write_bytes(response.content)
-
-
-def get_fabric_url(mc_version: str) -> str:
- response = requests.get(f"https://meta.fabricmc.net/v2/versions/loader/{mc_version}")
- response.raise_for_status()
- versions = response.json()
- return f'https://meta.fabricmc.net/v2/versions/loader/{mc_version}/{versions[0]["loader"]["version"]}/1.0.1/server/jar'
-
-
-def get_modrinth_url(project_id: str, mc_version: str) -> str:
- response = requests.get(f"https://api.modrinth.com/v2/project/{project_id}/version")
- response.raise_for_status()
- versions = response.json()
- if versions := [
- version
- for version in versions
- if any(v.startswith(mc_version) for v in version["game_versions"])
- ]:
- return versions[0]["files"][0]["url"]
- raise RuntimeError(f"Could not find a version for {project_id} that matches the MC version: {mc_version}")
diff --git a/scripts/src/packtest/runner.py b/scripts/src/packtest/runner.py
deleted file mode 100644
index e19cb1b425..0000000000
--- a/scripts/src/packtest/runner.py
+++ /dev/null
@@ -1,72 +0,0 @@
-from dataclasses import dataclass
-from logger import BaseLogger, new_logger
-from packtest.assets import Assets
-from pathlib import Path
-import definitions
-import os
-import platform
-import re
-import shutil
-import subprocess
-
-
-@dataclass
-class Runner:
- """
- Utility for setting up and running Minecraft Unit Tests.
- """
- assets: Assets
-
- def run(self, datapacks: Path, target: Path, logger: BaseLogger = new_logger()) -> int:
- self.assets.download(target, logger)
- shutil.rmtree(target / "world/data", ignore_errors=True)
- shutil.rmtree(target / "world/entities", ignore_errors=True)
- shutil.rmtree(target / "world/region", ignore_errors=True)
- create_universal_symlink(datapacks, target / "world/datapacks")
- (target / "allowed_symlinks.txt").write_text(str(datapacks))
-
- logger.step("🧪 Running test server…")
- process = subprocess.Popen(
- "java -Dpacktest.auto -Dpacktest.auto.annotations -Xms4096M -Xmx4096M --add-modules=jdk.incubator.vector -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -jar server.jar nogui",
- encoding='utf-8',
- errors="replace",
- stdout=subprocess.PIPE,
- universal_newlines=True,
- shell=True,
- cwd=target,
- text=True,
- )
-
- log_parsed_stdout(process, logger)
- return process.wait()
-
-
-def create_universal_symlink(src: Path, dst: Path) -> None:
- if not dst.exists():
- dst.parent.mkdir(parents=True, exist_ok=True)
- if platform.system() != 'Windows':
- return os.symlink(src, dst, target_is_directory=True)
- subprocess.check_call(['mklink', '/J', str(dst), str(src)], shell=True)
-
-
-def log_parsed_stdout(process: subprocess.Popen, logger: BaseLogger) -> None:
- for line in iter(process.stdout.readline, ""):
- if match := re.search(r"Running test batch '(?P.*?):0' \((?P.*?) tests\)", line):
- logger.print("Test '{name}' module ({count} tests)".format(**match.groupdict()))
- elif match := re.search(r"::error title=Test (?P.*?) failed on line (?P.*?)!::(?P.*)", line):
- args = match.groupdict()
- logger.error({
- "title": f"Test '{args.get("name")}' failed!",
- "file": resolve_test_path(args.get("name")),
- "line": args.get("line"),
- "message": args.get("message"),
- })
- logger.done()
-
-
-def resolve_test_path(name: str) -> Path|None:
- pos = name.rfind('.', 0, name.find('/'))
- for lib in definitions.BOOKSHELF_LIBS:
- path = definitions.DATAPACKS_PATH / lib / "data" / name[:pos] / "test" / (name[pos+1:] + ".mcfunction")
- if path.exists():
- return path
diff --git a/scripts/templates/biome/biomes_table.jinja b/scripts/templates/biome/biomes_table.jinja
deleted file mode 100644
index 9b4205f0aa..0000000000
--- a/scripts/templates/biome/biomes_table.jinja
+++ /dev/null
@@ -1,4 +0,0 @@
-{% include 'header.jinja' %}
-
-# This file was automatically generated, do not edit it
-data modify storage bs:const biome set value {{ render_snbt(biomes) }}
diff --git a/scripts/templates/block/groups_table.jinja b/scripts/templates/block/groups_table.jinja
deleted file mode 100644
index 090a7f510b..0000000000
--- a/scripts/templates/block/groups_table.jinja
+++ /dev/null
@@ -1,4 +0,0 @@
-{% include 'header.jinja' %}
-
-# This file was automatically generated, do not edit it
-data modify storage bs:const block.groups set value {{ render_snbt(groups) }}
diff --git a/scripts/templates/block/items_table.jinja b/scripts/templates/block/items_table.jinja
deleted file mode 100644
index 3880305bfc..0000000000
--- a/scripts/templates/block/items_table.jinja
+++ /dev/null
@@ -1,4 +0,0 @@
-{% include 'header.jinja' %}
-
-# This file was automatically generated, do not edit it
-data modify storage bs:const block.items set value {{ render_snbt(items) }}
diff --git a/scripts/templates/block/types_table.jinja b/scripts/templates/block/types_table.jinja
deleted file mode 100644
index 1b339b76a0..0000000000
--- a/scripts/templates/block/types_table.jinja
+++ /dev/null
@@ -1,4 +0,0 @@
-{% include 'header.jinja' %}
-
-# This file was automatically generated, do not edit it
-data modify storage bs:const block.types set value {{ render_snbt(types) }}
diff --git a/scripts/workflows/check_feature_tag.py b/scripts/workflows/check_feature_tag.py
deleted file mode 100644
index 82edf273de..0000000000
--- a/scripts/workflows/check_feature_tag.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from checks.feature_tag import check
-from files_provider.files_provider import FilesProvider
-
-features = FilesProvider() \
- .get_not_merged_pr_files() \
- .only_dp_artifacts() \
- .remove_minecraft_namespaces() \
- .only_from_main_datapacks() \
- .get_features()
-
-exit(check(features))
diff --git a/scripts/workflows/check_function_headers.py b/scripts/workflows/check_function_headers.py
deleted file mode 100644
index d1133ac7f3..0000000000
--- a/scripts/workflows/check_function_headers.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from checks.function_headers import check
-from files_provider.files_provider import FilesProvider
-
-functions = FilesProvider() \
- .get_not_merged_pr_files() \
- .only_dp_artifacts() \
- .remove_minecraft_namespaces() \
- .only_from_main_datapacks() \
- .get_functions()
-
-exit(check(functions))
diff --git a/scripts/workflows/check_generated_metadata.py b/scripts/workflows/check_generated_metadata.py
deleted file mode 100644
index 76b96bc7c2..0000000000
--- a/scripts/workflows/check_generated_metadata.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from checks.generated_metadata import check
-from files_provider.files_provider import FilesProvider
-
-manager = FilesProvider() \
- .get_not_merged_pr_files() \
- .only_dp_artifacts() \
- .remove_minecraft_namespaces() \
- .only_from_main_datapacks() \
- .get_modules()
-
-exit(check(manager))
diff --git a/scripts/workflows/check_module_metadata_file.py b/scripts/workflows/check_module_metadata_file.py
deleted file mode 100644
index 132b1e7b86..0000000000
--- a/scripts/workflows/check_module_metadata_file.py
+++ /dev/null
@@ -1,12 +0,0 @@
-from checks.module_metadata_file import check
-from files_provider.files_provider import FilesProvider
-
-modules = FilesProvider() \
- .get_not_merged_pr_files() \
- .only_dp_artifacts() \
- .remove_minecraft_namespaces() \
- .only_from_main_datapacks() \
- .get_modules() \
- .get()
-
-exit(check(modules))
diff --git a/scripts/workflows/distribute_release.py b/scripts/workflows/distribute_release.py
deleted file mode 100644
index 28773f2e0e..0000000000
--- a/scripts/workflows/distribute_release.py
+++ /dev/null
@@ -1,81 +0,0 @@
-import argparse
-import definitions
-import io
-import json
-import zipfile
-from pathlib import Path
-
-DATAPACK_PATTERNS = [
- "**/function/**/*.mcfunction",
- "**/*.mcmeta",
- "**/*.png",
- "**/*.json",
- "**/*.nbt",
-]
-
-def create_datapack_archive(datapack: dict, module_dirs: list[str]) -> io.BytesIO:
- data = io.BytesIO()
- with zipfile.ZipFile(data, mode="w", compression=zipfile.ZIP_DEFLATED) as archive:
- for module in module_dirs + [f"datapacks/{datapack['name']}/data/minecraft"]:
- module = definitions.ROOT_DIR / module
- basename = Path("data") / module.name
-
- for file in [f for p in DATAPACK_PATTERNS for f in module.rglob(p)]:
- if file.is_file():
- archive.write(file, basename / file.relative_to(module))
- archive.write(definitions.ROOT_DIR / f"datapacks/{datapack['name']}/pack.mcmeta", "pack.mcmeta")
- archive.write(definitions.ROOT_DIR / "datapacks/Bookshelf/icon.png", "icon.png")
- data.seek(0)
- return data
-
-
-def create_datapacks_archive(manifest: dict, target: Path, suffix: str = ""):
- for datapack in manifest["datapacks"]:
- print(f"📦 Creating archive for datapack {datapack['name']}")
- data = create_datapack_archive(datapack, [module["module_path"] for module in datapack["modules"]])
- with open(target / f"{datapack['name']}{suffix}.zip".lower().replace(" ", "-"), 'wb') as f:
- f.write(data.getvalue())
-
-
-def create_modules_archive(manifest: dict, target: Path, suffix: str = ""):
- for datapack in manifest["datapacks"]:
- for module in datapack["modules"]:
- print(f"🧩 Creating archive for module {module['name']}")
- data = create_datapack_archive(datapack, get_dependencies(module["name"], manifest))
- with open(target / f"bs.{module['display_name']}{suffix}.zip".lower().replace(" ", "-"), 'wb') as f:
- f.write(data.getvalue())
-
-
-def get_dependencies(module: str, manifest: dict) -> list[str]:
- modules = {m["name"]: {
- "dependencies": m.get("dependencies", []),
- "module_path": m["module_path"],
- } for datapack in manifest["datapacks"] for m in datapack["modules"]}
-
- def gather_dependencies(mod: str) -> list[str]:
- dirs = [modules[mod]["module_path"]]
- for dep in modules[mod]["dependencies"]:
- dirs.extend(gather_dependencies(dep))
- return dirs
-
- return list(set(gather_dependencies(module)))
-
-
-if __name__ == "__main__":
- parser = argparse.ArgumentParser(description="Pack Bookshelf in zip files")
- parser.add_argument("-t", "--target", type=str, help="set the output path")
- parser.add_argument("-v", "--version", type=str, help="specify the lib version in zip filename")
- parser.add_argument("-d", "--datapacks", type=int, default=1, help="whether or not to export datapacks", metavar="EXPORT")
- parser.add_argument("-m", "--modules", type=int, default=1, help="whether or not to export modules", metavar="EXPORT")
- args = parser.parse_args()
-
- target = Path(args.target).absolute() if args.target else definitions.BUILD_PATH
- target.mkdir(parents=True, exist_ok=True)
- suffix = f"-{args.version}" if args.version else ""
-
- with open(definitions.GENERATED_PATH / "manifest.json") as file:
- manifest = json.load(file)
- if args.datapacks:
- create_datapacks_archive(manifest, target, suffix)
- if args.modules:
- create_modules_archive(manifest, target, suffix)
diff --git a/scripts/workflows/test_datapacks.py b/scripts/workflows/test_datapacks.py
deleted file mode 100644
index f0319ef9ae..0000000000
--- a/scripts/workflows/test_datapacks.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from packtest.assets import Assets
-from packtest.runner import Runner
-import definitions
-
-runner = Runner(Assets(definitions.MC_VERSION))
-exit(runner.run(definitions.DATAPACKS_PATH, definitions.ROOT_DIR))